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:
authorThomas Steur <thomas.steur@gmail.com>2016-08-29 07:01:46 +0300
committerThomas Steur <thomas.steur@gmail.com>2016-08-29 07:01:46 +0300
commit4c9d1274408fb57d5e0b53dcda425dc4892c7b00 (patch)
tree78b0f24058d586cdd109de0387d43165e112003e
parent0c9c30b731ccbacf47e154b9f7a590af49e3d799 (diff)
parent4b395d2385e0041973349c7575fc10378b85558e (diff)
Merge branch 'master' into 3.0-m06
Conflicts: .travis.yml bower.json core/Notification/Manager.php core/Updates.php core/Updates/2.16.2-b2.php core/Version.php libs/Zend/Validate/Hostname.php libs/bower_components/jScrollPane/ajax.html libs/bower_components/jScrollPane/anchors.html libs/bower_components/jScrollPane/api.html libs/bower_components/jScrollPane/arrow_hover.html libs/bower_components/jScrollPane/arrow_positions.html libs/bower_components/jScrollPane/arrows.html libs/bower_components/jScrollPane/auto_reinitialise.html libs/bower_components/jScrollPane/basic.html libs/bower_components/jScrollPane/caps.html libs/bower_components/jScrollPane/changelog.html libs/bower_components/jScrollPane/destroy.html libs/bower_components/jScrollPane/drag_size.html libs/bower_components/jScrollPane/dynamic_content.html libs/bower_components/jScrollPane/dynamic_height.html libs/bower_components/jScrollPane/dynamic_width.html libs/bower_components/jScrollPane/events.html libs/bower_components/jScrollPane/faqs.html libs/bower_components/jScrollPane/fixed_width.html libs/bower_components/jScrollPane/focus.html libs/bower_components/jScrollPane/fullpage_scroll.html libs/bower_components/jScrollPane/iframe.html libs/bower_components/jScrollPane/iframe2.html libs/bower_components/jScrollPane/iframe_content1.html libs/bower_components/jScrollPane/iframe_content2.html libs/bower_components/jScrollPane/image.html libs/bower_components/jScrollPane/image2.html libs/bower_components/jScrollPane/index.html libs/bower_components/jScrollPane/invisibles.html libs/bower_components/jScrollPane/known_issues.html libs/bower_components/jScrollPane/less_basic.html libs/bower_components/jScrollPane/mwheel_intent.html libs/bower_components/jScrollPane/override_animate.html libs/bower_components/jScrollPane/runeimp.html libs/bower_components/jScrollPane/runeimp2.html libs/bower_components/jScrollPane/scroll_on_left.html libs/bower_components/jScrollPane/scroll_to.html libs/bower_components/jScrollPane/scroll_to_animate.html libs/bower_components/jScrollPane/settings.html libs/bower_components/jScrollPane/short.html libs/bower_components/jquery/.bower.json libs/bower_components/jquery/LICENSE.txt libs/bower_components/jquery/dist/jquery.js libs/bower_components/jquery/dist/jquery.min.js libs/bower_components/jquery/dist/jquery.min.map libs/bower_components/jquery/sizzle/dist/sizzle.js libs/bower_components/jquery/src/ajax.js libs/bower_components/jquery/src/ajax/jsonp.js libs/bower_components/jquery/src/ajax/load.js libs/bower_components/jquery/src/ajax/parseJSON.js libs/bower_components/jquery/src/ajax/parseXML.js libs/bower_components/jquery/src/ajax/script.js libs/bower_components/jquery/src/ajax/xhr.js libs/bower_components/jquery/src/attributes/attr.js libs/bower_components/jquery/src/attributes/classes.js libs/bower_components/jquery/src/attributes/prop.js libs/bower_components/jquery/src/attributes/support.js libs/bower_components/jquery/src/attributes/val.js libs/bower_components/jquery/src/callbacks.js libs/bower_components/jquery/src/core.js libs/bower_components/jquery/src/core/access.js libs/bower_components/jquery/src/core/init.js libs/bower_components/jquery/src/core/parseHTML.js libs/bower_components/jquery/src/core/ready.js libs/bower_components/jquery/src/css.js libs/bower_components/jquery/src/css/curCSS.js libs/bower_components/jquery/src/css/hiddenVisibleSelectors.js libs/bower_components/jquery/src/css/support.js libs/bower_components/jquery/src/css/var/swap.js libs/bower_components/jquery/src/data.js libs/bower_components/jquery/src/data/accepts.js libs/bower_components/jquery/src/deferred.js libs/bower_components/jquery/src/deprecated.js libs/bower_components/jquery/src/dimensions.js libs/bower_components/jquery/src/effects.js libs/bower_components/jquery/src/effects/Tween.js libs/bower_components/jquery/src/event.js libs/bower_components/jquery/src/event/support.js libs/bower_components/jquery/src/manipulation.js libs/bower_components/jquery/src/manipulation/support.js libs/bower_components/jquery/src/offset.js libs/bower_components/jquery/src/queue.js libs/bower_components/jquery/src/serialize.js libs/bower_components/jquery/src/traversing.js libs/bower_components/jquery/src/traversing/findFilter.js libs/bower_components/jquery/src/var/concat.js libs/bower_components/jquery/src/var/indexOf.js libs/bower_components/jquery/src/var/push.js libs/bower_components/jquery/src/var/slice.js libs/bower_components/jquery/src/wrap.js plugins/API/ProcessedReport.php plugins/AnonymousPiwikUsageMeasurement plugins/CoreConsole/Commands/ManagePlugin.php plugins/CoreHome/javascripts/dataTable.js plugins/CoreHome/javascripts/manifest.json plugins/CoreHome/templates/_topBar.twig plugins/CoreUpdater/templates/updateSuccess.twig plugins/CustomAlerts plugins/CustomDimensions plugins/DevicesDetection/Reports/GetBrowserVersions.php plugins/DevicesDetection/Reports/GetBrowsers.php plugins/ExamplePlugin/Updates/0.0.2.php plugins/Feedback/templates/index.twig plugins/LogViewer plugins/Morpheus/stylesheets/general/_forms.less plugins/Morpheus/templates/layout.twig plugins/Morpheus/templates/user.twig plugins/QueuedTracking plugins/SegmentEditor/stylesheets/segmentation.less plugins/SitesManager/tests/Integration/ApiTest.php tests/PHPUnit/Integration/WidgetsListTest.php tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_sortByProcessedMetric__API.getProcessedReport_day.xml tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_hideColumns___API.getProcessedReport_day.xml tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_showColumns___API.getProcessedReport_day.xml tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html tests/UI/expected-ui-screenshots tests/UI/specs/SegmentSelectorEditor_spec.js
-rw-r--r--.gitignore1
-rw-r--r--.travis.yml31
-rw-r--r--CHANGELOG.md24
-rw-r--r--HIRING.md18
-rw-r--r--PULL_REQUEST_TEMPLATE3
-rw-r--r--README.md50
-rw-r--r--bower.json3
-rw-r--r--composer.json38
-rw-r--r--composer.lock258
-rw-r--r--config/environment/test.php9
-rw-r--r--config/global.ini.php36
-rw-r--r--core/API/ApiRenderer.php7
-rw-r--r--core/API/CORSHandler.php5
-rw-r--r--core/API/DocumentationGenerator.php1
-rw-r--r--core/API/ResponseBuilder.php14
-rw-r--r--core/Application/Kernel/EnvironmentValidator.php98
-rw-r--r--core/Archive.php7
-rw-r--r--core/Archive/DataTableFactory.php2
-rw-r--r--core/ArchiveProcessor/Rules.php8
-rw-r--r--core/AssetManager.php3
-rw-r--r--core/AssetManager/UIAssetFetcher/StylesheetUIAssetFetcher.php8
-rw-r--r--core/CliMulti/Process.php4
-rw-r--r--core/Common.php2
-rw-r--r--core/Config.php3
-rw-r--r--core/Console.php6
-rw-r--r--core/CronArchive.php27
-rw-r--r--core/DataAccess/LogQueryBuilder.php211
-rw-r--r--core/DataAccess/LogQueryBuilder/JoinGenerator.php264
-rw-r--r--core/DataAccess/LogQueryBuilder/JoinTables.php114
-rw-r--r--core/DataAccess/RawLogDao.php35
-rw-r--r--core/DataTable/Filter/ExcludeLowPopulation.php2
-rw-r--r--core/DataTable/Filter/PatternRecursive.php2
-rw-r--r--core/DataTable/Map.php12
-rw-r--r--core/DataTable/Renderer/Csv.php6
-rw-r--r--core/DataTable/Renderer/Rss.php8
-rw-r--r--core/DataTable/Row.php16
-rw-r--r--core/Db.php6
-rw-r--r--core/Db/Adapter.php12
-rw-r--r--core/DbHelper.php15
-rw-r--r--core/DeviceDetectorCache.php2
-rw-r--r--core/Exception/NotYetInstalledException.php13
-rw-r--r--core/Filechecks.php46
-rw-r--r--core/Filesystem.php35
-rw-r--r--core/FrontController.php33
-rw-r--r--core/IP.php2
-rw-r--r--core/LogDeleter.php44
-rw-r--r--core/Metrics/Formatter.php2
-rw-r--r--core/Piwik.php17
-rw-r--r--core/Plugin/Dimension/VisitDimension.php14
-rw-r--r--core/Plugin/LogTablesProvider.php65
-rw-r--r--core/Plugin/Report.php11
-rw-r--r--core/Plugin/Tasks.php4
-rw-r--r--core/Plugin/ViewDataTable.php2
-rw-r--r--core/ProfessionalServices/Advertising.php (renamed from core/PiwikPro/Advertising.php)67
-rw-r--r--core/SettingsPiwik.php2
-rw-r--r--core/Theme.php2
-rw-r--r--core/Tracker/Action.php2
-rw-r--r--core/Tracker/Db/Mysqli.php2
-rw-r--r--core/Tracker/Db/Pdo/Mysql.php2
-rw-r--r--core/Tracker/GoalManager.php16
-rw-r--r--core/Tracker/LogTable.php75
-rw-r--r--core/Tracker/RequestSet.php2
-rw-r--r--core/Tracker/Response.php2
-rw-r--r--core/Tracker/Visit.php5
-rwxr-xr-xcore/Twig.php54
-rw-r--r--core/UpdateCheck/ReleaseChannel.php2
-rw-r--r--core/Updates/2.15.0-b17.php2
-rw-r--r--core/Updates/2.15.0-b20.php2
-rw-r--r--core/Updates/2.15.0-b4.php25
-rw-r--r--core/Updates/2.16.0-rc2.php38
-rw-r--r--core/Updates/2.16.1-b3.php25
-rw-r--r--core/Updates/2.16.2-b2.php33
-rw-r--r--core/Updates/2.16.2-rc2.php34
-rw-r--r--core/Updates/2.16.3-b1.php (renamed from core/Updates/2.3.0-rc2.php)11
-rw-r--r--core/Updates/2.16.3-b2.php28
-rw-r--r--core/Updates/2.4.0-b2.php27
-rw-r--r--core/Url.php4
-rw-r--r--core/View.php9
-rw-r--r--core/View/OneClickDone.php12
-rw-r--r--core/testMinimumPhpVersion.php2
-rw-r--r--js/README.md6
-rw-r--r--js/piwik.js2673
-rw-r--r--js/piwik.min.js71
-rw-r--r--lang/README.md2
-rw-r--r--lang/ar.json106
-rw-r--r--lang/bg.json1
-rw-r--r--lang/cs.json5
-rw-r--r--lang/cy.json31
-rw-r--r--lang/da.json29
-rw-r--r--lang/de.json14
-rw-r--r--lang/el.json5
-rw-r--r--lang/en.json5
-rw-r--r--lang/es.json30
-rw-r--r--lang/et.json20
-rw-r--r--lang/fa.json86
-rw-r--r--lang/fr.json7
-rw-r--r--lang/he.json5
-rw-r--r--lang/id.json1
-rw-r--r--lang/is.json16
-rw-r--r--lang/it.json5
-rw-r--r--lang/ja.json2
-rw-r--r--lang/ka.json30
-rw-r--r--lang/nb.json9
-rw-r--r--lang/nl.json20
-rw-r--r--lang/pt-br.json6
-rw-r--r--lang/ro.json1
-rw-r--r--lang/ru.json2
-rw-r--r--lang/sk.json2
-rw-r--r--lang/sl.json80
-rw-r--r--lang/sq.json148
-rw-r--r--lang/sr.json2
-rw-r--r--lang/sv.json12
-rw-r--r--lang/tr.json58
-rw-r--r--lang/uk.json559
-rw-r--r--lang/vi.json26
-rw-r--r--lang/zh-cn.json2
-rw-r--r--libs/Zend/Validate/Hostname.php5
-rw-r--r--libs/bower_components/jScrollPane/GPL-LICENSE.txt278
-rw-r--r--libs/bower_components/jScrollPane/ajax.html151
-rw-r--r--libs/bower_components/jScrollPane/ajax_content.html73
-rw-r--r--libs/bower_components/jScrollPane/anchors.html140
-rw-r--r--libs/bower_components/jScrollPane/api.html191
-rw-r--r--libs/bower_components/jScrollPane/arrow_hover.html208
-rw-r--r--libs/bower_components/jScrollPane/arrow_positions.html634
-rw-r--r--libs/bower_components/jScrollPane/arrows.html203
-rw-r--r--libs/bower_components/jScrollPane/auto_reinitialise.html98
-rw-r--r--libs/bower_components/jScrollPane/basic.html204
-rw-r--r--libs/bower_components/jScrollPane/caps.html236
-rw-r--r--libs/bower_components/jScrollPane/changelog.html66
-rw-r--r--libs/bower_components/jScrollPane/destroy.html237
-rw-r--r--libs/bower_components/jScrollPane/drag_size.html206
-rw-r--r--libs/bower_components/jScrollPane/dynamic_content.html95
-rw-r--r--libs/bower_components/jScrollPane/dynamic_height.html207
-rw-r--r--libs/bower_components/jScrollPane/dynamic_width.html368
-rw-r--r--libs/bower_components/jScrollPane/events.html324
-rw-r--r--libs/bower_components/jScrollPane/faqs.html52
-rw-r--r--libs/bower_components/jScrollPane/fixed_width.html230
-rw-r--r--libs/bower_components/jScrollPane/focus.html207
-rw-r--r--libs/bower_components/jScrollPane/fullpage_scroll.html259
-rw-r--r--libs/bower_components/jScrollPane/iframe.html79
-rw-r--r--libs/bower_components/jScrollPane/iframe2.html121
-rw-r--r--libs/bower_components/jScrollPane/iframe_content1.html143
-rw-r--r--libs/bower_components/jScrollPane/iframe_content2.html143
-rw-r--r--libs/bower_components/jScrollPane/iframe_content3.html76
-rw-r--r--libs/bower_components/jScrollPane/iframe_content4.html76
-rw-r--r--libs/bower_components/jScrollPane/image.html96
-rw-r--r--libs/bower_components/jScrollPane/image2.html98
-rw-r--r--libs/bower_components/jScrollPane/index.html319
-rw-r--r--libs/bower_components/jScrollPane/invisibles.html523
-rw-r--r--libs/bower_components/jScrollPane/issues/11/after.html45
-rw-r--r--libs/bower_components/jScrollPane/issues/11/before.html45
-rw-r--r--libs/bower_components/jScrollPane/issues/11/brs_main.css301
-rw-r--r--libs/bower_components/jScrollPane/issues/11/index.html53
-rw-r--r--libs/bower_components/jScrollPane/issues/11/jquery.mousewheel.js79
-rw-r--r--libs/bower_components/jScrollPane/issues/11/jscrollpane-2b3.css143
-rw-r--r--libs/bower_components/jScrollPane/issues/11/jscrollpane-2b3.js1063
-rw-r--r--libs/bower_components/jScrollPane/issues/11/native.html42
-rw-r--r--libs/bower_components/jScrollPane/issues/12/after.html80
-rw-r--r--libs/bower_components/jScrollPane/issues/12/after_reinit.html73
-rw-r--r--libs/bower_components/jScrollPane/issues/12/before.html72
-rw-r--r--libs/bower_components/jScrollPane/issues/12/before_reinit.html73
-rw-r--r--libs/bower_components/jScrollPane/issues/12/brs_main.css301
-rw-r--r--libs/bower_components/jScrollPane/issues/12/index.html53
-rw-r--r--libs/bower_components/jScrollPane/issues/12/jquery.mousewheel.js79
-rw-r--r--libs/bower_components/jScrollPane/issues/12/jscrollpane-2b3.css143
-rw-r--r--libs/bower_components/jScrollPane/issues/12/jscrollpane-2b3.js1063
-rw-r--r--libs/bower_components/jScrollPane/issues/12/native.html69
-rw-r--r--libs/bower_components/jScrollPane/issues/12/wrapped.html87
-rw-r--r--libs/bower_components/jScrollPane/issues/7/after.html190
-rw-r--r--libs/bower_components/jScrollPane/issues/7/before.html190
-rw-r--r--libs/bower_components/jScrollPane/issues/7/index.html53
-rw-r--r--libs/bower_components/jScrollPane/issues/7/jscrollpane-2b1.css120
-rw-r--r--libs/bower_components/jScrollPane/issues/7/jscrollpane-2b2.js947
-rw-r--r--libs/bower_components/jScrollPane/issues/7/native.html171
-rw-r--r--libs/bower_components/jScrollPane/known_issues.html62
-rw-r--r--libs/bower_components/jScrollPane/less_basic.html164
-rw-r--r--libs/bower_components/jScrollPane/mwheel_intent.html209
-rw-r--r--libs/bower_components/jScrollPane/override_animate.html215
-rw-r--r--libs/bower_components/jScrollPane/runeimp.html314
-rw-r--r--libs/bower_components/jScrollPane/runeimp2.html320
-rw-r--r--libs/bower_components/jScrollPane/scroll_on_left.html132
-rw-r--r--libs/bower_components/jScrollPane/scroll_to.html188
-rw-r--r--libs/bower_components/jScrollPane/scroll_to_animate.html197
-rw-r--r--libs/bower_components/jScrollPane/settings.html202
-rw-r--r--libs/bower_components/jScrollPane/short.html82
-rwxr-xr-xlibs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_222222_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xlibs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_888888_256x240.pngbin4369 -> 0 bytes
-rwxr-xr-xlibs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_cd0a0a_256x240.pngbin4369 -> 0 bytes
-rw-r--r--libs/bower_components/jScrollPane/themes/lozenge/index.html337
-rw-r--r--libs/bower_components/jScrollPane/themes/lozenge/style/jquery.jscrollpane.lozenge.css78
-rw-r--r--libs/bower_components/jScrollPane/v1.html49
-rw-r--r--libs/bower_components/jquery/src/.jshintrc29
-rw-r--r--libs/bower_components/jquery/src/ajax.js845
-rw-r--r--libs/bower_components/jquery/src/ajax/jsonp.js100
-rw-r--r--libs/bower_components/jquery/src/ajax/load.js83
-rw-r--r--libs/bower_components/jquery/src/ajax/parseJSON.js13
-rw-r--r--libs/bower_components/jquery/src/ajax/parseXML.js27
-rw-r--r--libs/bower_components/jquery/src/ajax/script.js68
-rw-r--r--libs/bower_components/jquery/src/ajax/var/location.js3
-rw-r--r--libs/bower_components/jquery/src/ajax/var/nonce.js5
-rw-r--r--libs/bower_components/jquery/src/ajax/var/rquery.js3
-rw-r--r--libs/bower_components/jquery/src/ajax/xhr.js167
-rw-r--r--libs/bower_components/jquery/src/attributes.js11
-rw-r--r--libs/bower_components/jquery/src/attributes/attr.js142
-rw-r--r--libs/bower_components/jquery/src/attributes/classes.js177
-rw-r--r--libs/bower_components/jquery/src/attributes/prop.js125
-rw-r--r--libs/bower_components/jquery/src/attributes/support.js36
-rw-r--r--libs/bower_components/jquery/src/attributes/val.js177
-rw-r--r--libs/bower_components/jquery/src/callbacks.js232
-rw-r--r--libs/bower_components/jquery/src/core.js494
-rw-r--r--libs/bower_components/jquery/src/core/DOMEval.js14
-rw-r--r--libs/bower_components/jquery/src/core/access.js65
-rw-r--r--libs/bower_components/jquery/src/core/init.js134
-rw-r--r--libs/bower_components/jquery/src/core/parseHTML.js41
-rw-r--r--libs/bower_components/jquery/src/core/ready.js103
-rw-r--r--libs/bower_components/jquery/src/core/support.js18
-rw-r--r--libs/bower_components/jquery/src/core/var/rsingleTag.js5
-rw-r--r--libs/bower_components/jquery/src/css.js515
-rw-r--r--libs/bower_components/jquery/src/css/addGetHookIf.js24
-rw-r--r--libs/bower_components/jquery/src/css/adjustCSS.js65
-rw-r--r--libs/bower_components/jquery/src/css/curCSS.js60
-rw-r--r--libs/bower_components/jquery/src/css/defaultDisplay.js72
-rw-r--r--libs/bower_components/jquery/src/css/hiddenVisibleSelectors.js18
-rw-r--r--libs/bower_components/jquery/src/css/showHide.js48
-rw-r--r--libs/bower_components/jquery/src/css/support.js121
-rw-r--r--libs/bower_components/jquery/src/css/var/cssExpand.js3
-rw-r--r--libs/bower_components/jquery/src/css/var/getStyles.js15
-rw-r--r--libs/bower_components/jquery/src/css/var/isHidden.js16
-rw-r--r--libs/bower_components/jquery/src/css/var/rmargin.js3
-rw-r--r--libs/bower_components/jquery/src/css/var/rnumnonpx.js5
-rw-r--r--libs/bower_components/jquery/src/css/var/swap.js24
-rw-r--r--libs/bower_components/jquery/src/data.js187
-rw-r--r--libs/bower_components/jquery/src/data/Data.js200
-rw-r--r--libs/bower_components/jquery/src/data/accepts.js20
-rw-r--r--libs/bower_components/jquery/src/data/support.js23
-rw-r--r--libs/bower_components/jquery/src/data/var/acceptData.js18
-rw-r--r--libs/bower_components/jquery/src/data/var/dataPriv.js5
-rw-r--r--libs/bower_components/jquery/src/data/var/dataUser.js5
-rw-r--r--libs/bower_components/jquery/src/deferred.js158
-rw-r--r--libs/bower_components/jquery/src/deferred/exceptionHook.js19
-rw-r--r--libs/bower_components/jquery/src/deprecated.js32
-rw-r--r--libs/bower_components/jquery/src/dimensions.js54
-rw-r--r--libs/bower_components/jquery/src/effects.js629
-rw-r--r--libs/bower_components/jquery/src/effects/Tween.js121
-rw-r--r--libs/bower_components/jquery/src/effects/animatedSelector.js13
-rw-r--r--libs/bower_components/jquery/src/effects/support.js58
-rw-r--r--libs/bower_components/jquery/src/event.js710
-rw-r--r--libs/bower_components/jquery/src/event/ajax.js20
-rw-r--r--libs/bower_components/jquery/src/event/alias.js27
-rw-r--r--libs/bower_components/jquery/src/event/focusin.js53
-rw-r--r--libs/bower_components/jquery/src/event/support.js9
-rw-r--r--libs/bower_components/jquery/src/event/trigger.js199
-rw-r--r--libs/bower_components/jquery/src/exports/amd.js24
-rw-r--r--libs/bower_components/jquery/src/exports/global.js26
-rw-r--r--libs/bower_components/jquery/src/intro.js44
-rw-r--r--libs/bower_components/jquery/src/jquery.js37
-rw-r--r--libs/bower_components/jquery/src/manipulation.js481
-rw-r--r--libs/bower_components/jquery/src/manipulation/_evalUrl.js20
-rw-r--r--libs/bower_components/jquery/src/manipulation/buildFragment.js102
-rw-r--r--libs/bower_components/jquery/src/manipulation/createSafeFragment.js20
-rw-r--r--libs/bower_components/jquery/src/manipulation/getAll.js21
-rw-r--r--libs/bower_components/jquery/src/manipulation/setGlobalEval.js20
-rw-r--r--libs/bower_components/jquery/src/manipulation/support.js33
-rw-r--r--libs/bower_components/jquery/src/manipulation/var/nodeNames.js5
-rw-r--r--libs/bower_components/jquery/src/manipulation/var/rcheckableType.js3
-rw-r--r--libs/bower_components/jquery/src/manipulation/var/rleadingWhitespace.js3
-rw-r--r--libs/bower_components/jquery/src/manipulation/var/rscriptType.js3
-rw-r--r--libs/bower_components/jquery/src/manipulation/var/rtagName.js3
-rw-r--r--libs/bower_components/jquery/src/manipulation/wrapMap.js27
-rw-r--r--libs/bower_components/jquery/src/offset.js218
-rw-r--r--libs/bower_components/jquery/src/outro.js2
-rw-r--r--libs/bower_components/jquery/src/queue.js143
-rw-r--r--libs/bower_components/jquery/src/queue/delay.js22
-rw-r--r--libs/bower_components/jquery/src/selector-native.js211
-rw-r--r--libs/bower_components/jquery/src/selector-sizzle.js14
-rw-r--r--libs/bower_components/jquery/src/selector.js1
-rw-r--r--libs/bower_components/jquery/src/serialize.js125
-rw-r--r--libs/bower_components/jquery/src/support.js63
-rw-r--r--libs/bower_components/jquery/src/traversing.js175
-rw-r--r--libs/bower_components/jquery/src/traversing/findFilter.js100
-rw-r--r--libs/bower_components/jquery/src/traversing/var/dir.js20
-rw-r--r--libs/bower_components/jquery/src/traversing/var/rneedsContext.js6
-rw-r--r--libs/bower_components/jquery/src/traversing/var/siblings.js15
-rw-r--r--libs/bower_components/jquery/src/var/arr.js3
-rw-r--r--libs/bower_components/jquery/src/var/class2type.js5
-rw-r--r--libs/bower_components/jquery/src/var/concat.js5
-rw-r--r--libs/bower_components/jquery/src/var/deletedIds.js3
-rw-r--r--libs/bower_components/jquery/src/var/document.js3
-rw-r--r--libs/bower_components/jquery/src/var/documentElement.js5
-rw-r--r--libs/bower_components/jquery/src/var/hasOwn.js5
-rw-r--r--libs/bower_components/jquery/src/var/indexOf.js5
-rw-r--r--libs/bower_components/jquery/src/var/pnum.js3
-rw-r--r--libs/bower_components/jquery/src/var/push.js5
-rw-r--r--libs/bower_components/jquery/src/var/rcssNum.js7
-rw-r--r--libs/bower_components/jquery/src/var/rnotwhite.js3
-rw-r--r--libs/bower_components/jquery/src/var/slice.js5
-rw-r--r--libs/bower_components/jquery/src/var/support.js5
-rw-r--r--libs/bower_components/jquery/src/var/toString.js5
-rw-r--r--libs/bower_components/jquery/src/wrap.js79
-rw-r--r--libs/bower_components/jqueryui-touch-punch/.bower.json19
-rw-r--r--libs/bower_components/jqueryui-touch-punch/README.md41
-rw-r--r--libs/bower_components/jqueryui-touch-punch/bower.json10
-rw-r--r--libs/bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.js180
-rw-r--r--libs/bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.min.js11
-rw-r--r--libs/bower_components/mousetrap/plugins/record/tests/index.html29
-rw-r--r--libs/bower_components/mousetrap/plugins/record/tests/jelly.css18
-rw-r--r--libs/bower_components/mousetrap/plugins/record/tests/jelly.js53
-rw-r--r--misc/cron/archive.php6
-rw-r--r--misc/internal-docs/content-tracking.md8
m---------misc/log-analytics0
-rw-r--r--misc/others/iframeWidget.htm13
-rw-r--r--piwik.js93
-rw-r--r--piwik.php8
-rw-r--r--plugins/API/API.php2
-rw-r--r--plugins/API/Renderer/Console.php7
-rw-r--r--plugins/API/Renderer/Csv.php7
-rw-r--r--plugins/API/Renderer/Html.php7
-rw-r--r--plugins/API/Renderer/Json.php7
-rw-r--r--plugins/API/Renderer/Original.php8
-rw-r--r--plugins/API/Renderer/Php.php7
-rw-r--r--plugins/API/Renderer/Rss.php7
-rw-r--r--plugins/API/Renderer/Xml.php7
-rw-r--r--plugins/API/RowEvolution.php2
-rw-r--r--plugins/API/lang/es.json5
-rw-r--r--plugins/API/lang/is.json9
-rw-r--r--plugins/API/lang/ka.json9
-rw-r--r--plugins/API/lang/sq.json5
-rw-r--r--plugins/API/lang/sv.json4
-rw-r--r--plugins/API/lang/uk.json7
-rw-r--r--plugins/API/lang/vi.json3
-rw-r--r--plugins/Actions/javascripts/actionsDataTable.js4
-rw-r--r--plugins/Actions/lang/ar.json4
-rw-r--r--plugins/Actions/lang/da.json4
-rw-r--r--plugins/Actions/lang/fa.json5
-rw-r--r--plugins/Actions/lang/fr.json1
-rw-r--r--plugins/Actions/lang/sq.json3
-rw-r--r--plugins/Actions/lang/tr.json38
-rw-r--r--plugins/Actions/lang/uk.json67
-rw-r--r--plugins/Actions/lang/vi.json5
-rw-r--r--plugins/Annotations/lang/de.json6
-rw-r--r--plugins/Annotations/lang/tr.json24
-rw-r--r--plugins/Annotations/lang/uk.json22
-rw-r--r--plugins/BulkTracking/tests/Framework/Mock/Tracker/Response.php2
-rw-r--r--plugins/BulkTracking/tests/Unit/ResponseTest.php2
-rw-r--r--plugins/Contents/lang/da.json6
-rw-r--r--plugins/Contents/lang/nl.json15
-rw-r--r--plugins/Contents/lang/sq.json4
-rw-r--r--plugins/Contents/lang/sv.json5
-rw-r--r--plugins/Contents/lang/tr.json14
-rw-r--r--plugins/Contents/lang/uk.json16
-rw-r--r--plugins/CoreAdminHome/lang/ar.json1
-rw-r--r--plugins/CoreAdminHome/lang/da.json11
-rw-r--r--plugins/CoreAdminHome/lang/de.json1
-rw-r--r--plugins/CoreAdminHome/lang/es.json6
-rw-r--r--plugins/CoreAdminHome/lang/fr.json1
-rw-r--r--plugins/CoreAdminHome/lang/it.json16
-rw-r--r--plugins/CoreAdminHome/lang/ka.json2
-rw-r--r--plugins/CoreAdminHome/lang/nl.json7
-rw-r--r--plugins/CoreAdminHome/lang/sv.json3
-rw-r--r--plugins/CoreAdminHome/lang/tr.json10
-rw-r--r--plugins/CoreAdminHome/lang/uk.json99
-rw-r--r--plugins/CoreConsole/Commands/GenerateVisualizationPlugin.php1
-rw-r--r--plugins/CoreConsole/Commands/GitCommit.php2
-rw-r--r--plugins/CoreHome/CoreHome.php1
-rw-r--r--plugins/CoreHome/DataTableRowAction/RowEvolution.php2
-rw-r--r--plugins/CoreHome/Tracker/LogTable/Action.php30
-rw-r--r--plugins/CoreHome/Tracker/LogTable/Conversion.php24
-rw-r--r--plugins/CoreHome/Tracker/LogTable/ConversionItem.php25
-rw-r--r--plugins/CoreHome/Tracker/LogTable/LinkVisitAction.php29
-rw-r--r--plugins/CoreHome/Tracker/LogTable/Visit.php30
-rw-r--r--plugins/CoreHome/images/applogo_128.pngbin0 -> 2089 bytes
-rw-r--r--plugins/CoreHome/images/applogo_144.pngbin0 -> 2354 bytes
-rw-r--r--plugins/CoreHome/images/applogo_192.pngbin0 -> 3006 bytes
-rw-r--r--plugins/CoreHome/images/applogo_256.pngbin0 -> 3991 bytes
-rw-r--r--plugins/CoreHome/images/applogo_32.pngbin0 -> 662 bytes
-rw-r--r--plugins/CoreHome/images/applogo_72.pngbin0 -> 1234 bytes
-rw-r--r--plugins/CoreHome/images/applogo_732.pngbin0 -> 4554 bytes
-rw-r--r--plugins/CoreHome/javascripts/broadcast.js2
-rw-r--r--plugins/CoreHome/javascripts/dataTable.js22
-rw-r--r--plugins/CoreHome/javascripts/dataTable_rowactions.js5
-rw-r--r--plugins/CoreHome/javascripts/manifest.json27
-rw-r--r--plugins/CoreHome/javascripts/notification.js2
-rw-r--r--plugins/CoreHome/lang/ar.json1
-rw-r--r--plugins/CoreHome/lang/cs.json2
-rw-r--r--plugins/CoreHome/lang/da.json9
-rw-r--r--plugins/CoreHome/lang/de.json2
-rw-r--r--plugins/CoreHome/lang/el.json2
-rw-r--r--plugins/CoreHome/lang/en.json2
-rw-r--r--plugins/CoreHome/lang/es.json10
-rw-r--r--plugins/CoreHome/lang/fa.json1
-rw-r--r--plugins/CoreHome/lang/fi.json1
-rw-r--r--plugins/CoreHome/lang/fr.json3
-rw-r--r--plugins/CoreHome/lang/is.json8
-rw-r--r--plugins/CoreHome/lang/it.json6
-rw-r--r--plugins/CoreHome/lang/ja.json1
-rw-r--r--plugins/CoreHome/lang/ka.json8
-rw-r--r--plugins/CoreHome/lang/ko.json1
-rw-r--r--plugins/CoreHome/lang/nb.json4
-rw-r--r--plugins/CoreHome/lang/nl.json9
-rw-r--r--plugins/CoreHome/lang/pl.json1
-rw-r--r--plugins/CoreHome/lang/pt-br.json1
-rw-r--r--plugins/CoreHome/lang/ro.json1
-rw-r--r--plugins/CoreHome/lang/ru.json1
-rw-r--r--plugins/CoreHome/lang/sk.json1
-rw-r--r--plugins/CoreHome/lang/sr.json1
-rw-r--r--plugins/CoreHome/lang/sv.json8
-rw-r--r--plugins/CoreHome/lang/tl.json1
-rw-r--r--plugins/CoreHome/lang/tr.json25
-rw-r--r--plugins/CoreHome/lang/uk.json60
-rw-r--r--plugins/CoreHome/lang/zh-cn.json1
-rw-r--r--plugins/CoreHome/templates/_topBar.twig2
-rw-r--r--plugins/CoreHome/templates/getDefaultIndexView.twig2
-rw-r--r--plugins/CorePluginsAdmin/lang/da.json6
-rw-r--r--plugins/CorePluginsAdmin/lang/it.json2
-rw-r--r--plugins/CorePluginsAdmin/lang/sv.json1
-rw-r--r--plugins/CorePluginsAdmin/lang/uk.json99
-rw-r--r--plugins/CoreUpdater/Commands/Update.php37
-rw-r--r--plugins/CoreUpdater/Test/Mock/UpdaterMock.php2
-rw-r--r--plugins/CoreUpdater/UpdateCommunication.php2
-rw-r--r--plugins/CoreUpdater/lang/cs.json2
-rw-r--r--plugins/CoreUpdater/lang/da.json16
-rw-r--r--plugins/CoreUpdater/lang/de.json2
-rw-r--r--plugins/CoreUpdater/lang/el.json2
-rw-r--r--plugins/CoreUpdater/lang/en.json2
-rw-r--r--plugins/CoreUpdater/lang/es.json7
-rw-r--r--plugins/CoreUpdater/lang/fr.json2
-rw-r--r--plugins/CoreUpdater/lang/it.json2
-rw-r--r--plugins/CoreUpdater/lang/ja.json1
-rw-r--r--plugins/CoreUpdater/lang/nb.json2
-rw-r--r--plugins/CoreUpdater/lang/nl.json1
-rw-r--r--plugins/CoreUpdater/lang/pt-br.json1
-rw-r--r--plugins/CoreUpdater/lang/ru.json1
-rw-r--r--plugins/CoreUpdater/lang/sk.json1
-rw-r--r--plugins/CoreUpdater/lang/sq.json30
-rw-r--r--plugins/CoreUpdater/lang/sr.json1
-rw-r--r--plugins/CoreUpdater/lang/sv.json1
-rw-r--r--plugins/CoreUpdater/lang/tr.json15
-rw-r--r--plugins/CoreUpdater/lang/uk.json37
-rw-r--r--plugins/CoreUpdater/lang/zh-cn.json1
-rw-r--r--plugins/CoreUpdater/lang/zh-tw.json1
-rw-r--r--plugins/CoreUpdater/templates/updateSuccess.twig4
-rw-r--r--plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php6
-rw-r--r--plugins/CoreVisualizations/Visualizations/JqplotGraph/Bar.php6
-rw-r--r--plugins/CoreVisualizations/javascripts/jqplot.js2
-rw-r--r--plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig6
-rw-r--r--plugins/CustomPiwikJs/.gitignore1
-rw-r--r--plugins/CustomPiwikJs/Commands/UpdateTracker.php62
-rw-r--r--plugins/CustomPiwikJs/CustomPiwikJs.php35
-rw-r--r--plugins/CustomPiwikJs/Diagnostic/PiwikJsCheck.php54
-rw-r--r--plugins/CustomPiwikJs/Exception/AccessDeniedException.php15
-rw-r--r--plugins/CustomPiwikJs/File.php75
-rw-r--r--plugins/CustomPiwikJs/Tasks.php23
-rw-r--r--plugins/CustomPiwikJs/TrackerUpdater.php78
-rw-r--r--plugins/CustomPiwikJs/TrackingCode/JsTestPluginTrackerFiles.php27
-rw-r--r--plugins/CustomPiwikJs/TrackingCode/PiwikJsManipulator.php57
-rw-r--r--plugins/CustomPiwikJs/TrackingCode/PluginTrackerFiles.php87
-rw-r--r--plugins/CustomPiwikJs/config/config.php7
-rw-r--r--plugins/CustomPiwikJs/lang/en.json7
-rw-r--r--plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php36
-rw-r--r--plugins/CustomPiwikJs/tests/Integration/FileTest.php125
-rw-r--r--plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php73
-rw-r--r--plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php124
-rw-r--r--plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php121
-rw-r--r--plugins/CustomPiwikJs/tests/System/PiwikJsContentTest.php39
-rw-r--r--plugins/CustomPiwikJs/tests/resources/MyTestTarget2.js16
-rw-r--r--plugins/CustomPiwikJs/tests/resources/test.js2
-rw-r--r--plugins/CustomPiwikJs/tests/resources/testpiwik.js6
-rw-r--r--plugins/CustomPiwikJs/tests/resources/tracker.js4
-rw-r--r--plugins/CustomPiwikJs/tests/resources/tracker.min.js2
-rw-r--r--plugins/CustomVariables/lang/da.json4
-rw-r--r--plugins/CustomVariables/lang/fr.json1
-rw-r--r--plugins/CustomVariables/lang/it.json6
-rw-r--r--plugins/CustomVariables/lang/nl.json7
-rw-r--r--plugins/CustomVariables/lang/sv.json10
-rw-r--r--plugins/CustomVariables/lang/uk.json24
-rw-r--r--plugins/DBStats/Reports/GetIndividualMetricsSummary.php2
-rw-r--r--plugins/DBStats/Reports/GetIndividualReportsSummary.php2
-rw-r--r--plugins/DBStats/lang/sq.json4
-rw-r--r--plugins/DBStats/lang/sv.json1
-rw-r--r--plugins/DBStats/lang/tr.json12
-rw-r--r--plugins/DBStats/lang/uk.json21
-rw-r--r--plugins/Dashboard/Dashboard.php8
-rw-r--r--plugins/Dashboard/lang/da.json1
-rw-r--r--plugins/Dashboard/lang/de.json2
-rw-r--r--plugins/Dashboard/lang/es.json1
-rw-r--r--plugins/Dashboard/lang/sq.json10
-rw-r--r--plugins/Dashboard/lang/tr.json60
-rw-r--r--plugins/Dashboard/lang/uk.json39
-rw-r--r--plugins/DevicePlugins/lang/da.json1
-rw-r--r--plugins/DevicePlugins/lang/fr.json1
-rw-r--r--plugins/DevicePlugins/lang/is.json1
-rw-r--r--plugins/DevicePlugins/lang/ka.json1
-rw-r--r--plugins/DevicePlugins/lang/sq.json2
-rw-r--r--plugins/DevicePlugins/lang/sv.json1
-rw-r--r--plugins/DevicePlugins/lang/uk.json7
-rw-r--r--plugins/DevicesDetection/Reports/GetBrowserVersions.php1
-rw-r--r--plugins/DevicesDetection/Reports/GetBrowsers.php1
-rw-r--r--plugins/DevicesDetection/functions.php2
-rw-r--r--plugins/DevicesDetection/images/browsers/TS.gifbin0 -> 153 bytes
-rw-r--r--plugins/DevicesDetection/lang/ar.json35
-rw-r--r--plugins/DevicesDetection/lang/da.json1
-rw-r--r--plugins/DevicesDetection/lang/tr.json24
-rw-r--r--plugins/DevicesDetection/lang/uk.json44
-rw-r--r--plugins/DevicesDetection/plugin.json8
-rw-r--r--plugins/Diagnostics/Test/Integration/Commands/AnalyzeArchiveTableTest.php6
-rw-r--r--plugins/Diagnostics/lang/fr.json2
-rw-r--r--plugins/Diagnostics/lang/nb.json2
-rw-r--r--plugins/Diagnostics/lang/nl.json6
-rw-r--r--plugins/Diagnostics/lang/sv.json5
-rw-r--r--plugins/Diagnostics/lang/uk.json8
-rw-r--r--plugins/Ecommerce/lang/da.json5
-rw-r--r--plugins/Ecommerce/lang/ru.json1
-rw-r--r--plugins/Ecommerce/lang/sq.json2
-rw-r--r--plugins/Ecommerce/lang/sv.json1
-rw-r--r--plugins/Ecommerce/lang/tr.json8
-rw-r--r--plugins/Ecommerce/lang/uk.json8
-rw-r--r--plugins/Events/lang/ar.json8
-rw-r--r--plugins/Events/lang/da.json1
-rw-r--r--plugins/Events/lang/it.json2
-rw-r--r--plugins/Events/lang/uk.json32
-rw-r--r--plugins/ExamplePlugin/README.md4
-rw-r--r--plugins/ExamplePlugin/Updates/0.0.2.php2
-rw-r--r--plugins/ExamplePlugin/plugin.json14
-rw-r--r--plugins/ExampleTheme/README.md5
-rw-r--r--plugins/ExampleTheme/plugin.json15
-rw-r--r--plugins/ExampleTracker/Columns/ExampleConversionDimension.php2
-rw-r--r--plugins/ExampleTracker/Columns/ExampleVisitDimension.php2
-rw-r--r--plugins/Feedback/lang/cs.json14
-rw-r--r--plugins/Feedback/lang/de.json18
-rw-r--r--plugins/Feedback/lang/el.json18
-rw-r--r--plugins/Feedback/lang/en.json18
-rw-r--r--plugins/Feedback/lang/es.json17
-rw-r--r--plugins/Feedback/lang/fi.json3
-rw-r--r--plugins/Feedback/lang/fr.json21
-rw-r--r--plugins/Feedback/lang/it.json20
-rw-r--r--plugins/Feedback/lang/ja.json9
-rw-r--r--plugins/Feedback/lang/ka.json4
-rw-r--r--plugins/Feedback/lang/ko.json9
-rw-r--r--plugins/Feedback/lang/nb.json5
-rw-r--r--plugins/Feedback/lang/nl.json9
-rw-r--r--plugins/Feedback/lang/pt-br.json9
-rw-r--r--plugins/Feedback/lang/ru.json9
-rw-r--r--plugins/Feedback/lang/sq.json12
-rw-r--r--plugins/Feedback/lang/sr.json9
-rw-r--r--plugins/Feedback/lang/sv.json8
-rw-r--r--plugins/Feedback/templates/index.twig20
-rw-r--r--plugins/Goals/API.php36
-rw-r--r--plugins/Goals/Controller.php2
-rw-r--r--plugins/Goals/Model.php11
-rw-r--r--plugins/Goals/lang/cs.json1
-rw-r--r--plugins/Goals/lang/da.json9
-rw-r--r--plugins/Goals/lang/el.json1
-rw-r--r--plugins/Goals/lang/fr.json1
-rw-r--r--plugins/Goals/lang/is.json2
-rw-r--r--plugins/Goals/lang/it.json7
-rw-r--r--plugins/Goals/lang/ka.json6
-rw-r--r--plugins/Goals/lang/nl.json2
-rw-r--r--plugins/Goals/lang/pt-br.json1
-rw-r--r--plugins/Goals/lang/sq.json1
-rw-r--r--plugins/Goals/lang/sv.json1
-rw-r--r--plugins/Goals/lang/uk.json128
-rw-r--r--plugins/Goals/tests/Integration/APITest.php36
-rw-r--r--plugins/ImageGraph/ImageGraph.php2
-rw-r--r--plugins/ImageGraph/StaticGraph/GridGraph.php2
-rw-r--r--plugins/ImageGraph/lang/sq.json3
-rw-r--r--plugins/ImageGraph/lang/tr.json6
-rw-r--r--plugins/ImageGraph/lang/uk.json6
-rw-r--r--plugins/Insights/lang/da.json1
-rw-r--r--plugins/Insights/lang/nb.json19
-rw-r--r--plugins/Insights/lang/sq.json2
-rw-r--r--plugins/Insights/lang/sv.json1
-rw-r--r--plugins/Insights/lang/uk.json35
-rw-r--r--plugins/Installation/Controller.php14
-rw-r--r--plugins/Installation/FormDatabaseSetup.php22
-rw-r--r--plugins/Installation/FormSuperUser.php22
-rw-r--r--plugins/Installation/Installation.php20
-rw-r--r--plugins/Installation/ServerFilesGenerator.php25
-rw-r--r--plugins/Installation/lang/am.json1
-rw-r--r--plugins/Installation/lang/ar.json4
-rw-r--r--plugins/Installation/lang/be.json1
-rw-r--r--plugins/Installation/lang/bg.json1
-rw-r--r--plugins/Installation/lang/ca.json1
-rw-r--r--plugins/Installation/lang/cs.json8
-rw-r--r--plugins/Installation/lang/da.json14
-rw-r--r--plugins/Installation/lang/de.json11
-rw-r--r--plugins/Installation/lang/el.json11
-rw-r--r--plugins/Installation/lang/en.json11
-rw-r--r--plugins/Installation/lang/es.json10
-rw-r--r--plugins/Installation/lang/et.json1
-rw-r--r--plugins/Installation/lang/eu.json1
-rw-r--r--plugins/Installation/lang/fa.json1
-rw-r--r--plugins/Installation/lang/fi.json2
-rw-r--r--plugins/Installation/lang/fr.json10
-rw-r--r--plugins/Installation/lang/gl.json1
-rw-r--r--plugins/Installation/lang/hi.json1
-rw-r--r--plugins/Installation/lang/hu.json1
-rw-r--r--plugins/Installation/lang/id.json1
-rw-r--r--plugins/Installation/lang/it.json11
-rw-r--r--plugins/Installation/lang/ja.json2
-rw-r--r--plugins/Installation/lang/ka.json9
-rw-r--r--plugins/Installation/lang/ko.json4
-rw-r--r--plugins/Installation/lang/lt.json1
-rw-r--r--plugins/Installation/lang/nb.json11
-rw-r--r--plugins/Installation/lang/nl.json4
-rw-r--r--plugins/Installation/lang/nn.json1
-rw-r--r--plugins/Installation/lang/pl.json1
-rw-r--r--plugins/Installation/lang/pt-br.json7
-rw-r--r--plugins/Installation/lang/pt.json1
-rw-r--r--plugins/Installation/lang/ro.json1
-rw-r--r--plugins/Installation/lang/ru.json4
-rw-r--r--plugins/Installation/lang/sk.json1
-rw-r--r--plugins/Installation/lang/sq.json55
-rw-r--r--plugins/Installation/lang/sr.json2
-rw-r--r--plugins/Installation/lang/sv.json4
-rw-r--r--plugins/Installation/lang/th.json1
-rw-r--r--plugins/Installation/lang/tl.json1
-rw-r--r--plugins/Installation/lang/uk.json3
-rw-r--r--plugins/Installation/lang/vi.json1
-rw-r--r--plugins/Installation/lang/zh-cn.json4
-rw-r--r--plugins/Installation/lang/zh-tw.json1
-rw-r--r--plugins/Installation/templates/finished.twig12
-rw-r--r--plugins/LanguagesManager/Commands/FetchTranslations.php11
-rw-r--r--plugins/LanguagesManager/Commands/Update.php15
-rw-r--r--plugins/LanguagesManager/Model.php2
-rw-r--r--plugins/LanguagesManager/lang/sq.json3
-rw-r--r--plugins/LanguagesManager/lang/uk.json3
-rw-r--r--plugins/Live/Controller.php2
-rw-r--r--plugins/Live/javascripts/live.js9
-rw-r--r--plugins/Live/lang/fr.json4
-rw-r--r--plugins/Live/lang/nl.json4
-rw-r--r--plugins/Live/lang/ru.json10
-rw-r--r--plugins/Live/lang/sv.json5
-rw-r--r--plugins/Live/lang/uk.json48
-rw-r--r--plugins/Live/templates/_actionsList.twig6
-rw-r--r--plugins/Login/lang/cs.json1
-rw-r--r--plugins/Login/lang/de.json1
-rw-r--r--plugins/Login/lang/el.json1
-rw-r--r--plugins/Login/lang/fr.json2
-rw-r--r--plugins/Login/lang/it.json3
-rw-r--r--plugins/Login/lang/nl.json1
-rw-r--r--plugins/Login/lang/pt-br.json1
-rw-r--r--plugins/Login/lang/ru.json2
-rw-r--r--plugins/Login/lang/sq.json10
-rw-r--r--plugins/Login/lang/sv.json2
-rw-r--r--plugins/Login/lang/uk.json27
m---------plugins/LoginHttpAuth0
-rw-r--r--plugins/MobileAppMeasurable/lang/ru.json5
-rw-r--r--plugins/MobileAppMeasurable/lang/sq.json3
-rw-r--r--plugins/MobileAppMeasurable/lang/uk.json7
-rw-r--r--plugins/Morpheus/templates/admin.twig2
-rw-r--r--plugins/Morpheus/templates/ajaxMacros.twig7
-rw-r--r--plugins/Morpheus/templates/javascriptCode.tpl2
-rw-r--r--plugins/Morpheus/templates/layout.twig2
-rw-r--r--plugins/MultiSites/angularjs/dashboard/dashboard.controller.js2
-rw-r--r--plugins/MultiSites/angularjs/dashboard/dashboard.directive.html4
-rw-r--r--plugins/MultiSites/lang/tr.json9
-rw-r--r--plugins/MultiSites/lang/uk.json6
-rw-r--r--plugins/MultiSites/plugin.json8
-rw-r--r--plugins/MultiSites/tests/Integration/MultiSitesTest.php25
-rw-r--r--plugins/Overlay/client/urlnormalizer.js4
-rw-r--r--plugins/Overlay/lang/de.json2
-rw-r--r--plugins/Overlay/lang/it.json2
-rw-r--r--plugins/Overlay/lang/sv.json1
-rw-r--r--plugins/Overlay/lang/uk.json18
-rw-r--r--plugins/Overlay/templates/renderSidebar.twig2
-rw-r--r--plugins/PiwikPro/PiwikPro.php27
-rw-r--r--plugins/PiwikPro/config/test.php13
-rw-r--r--plugins/PiwikPro/lang/en.json6
-rw-r--r--plugins/PiwikPro/plugin.json5
-rw-r--r--plugins/PrivacyManager/DoNotTrackHeaderChecker.php2
-rwxr-xr-xplugins/PrivacyManager/LogDataPurger.php18
-rw-r--r--plugins/PrivacyManager/lang/el.json2
-rw-r--r--plugins/PrivacyManager/lang/it.json6
-rw-r--r--plugins/PrivacyManager/lang/sv.json2
-rw-r--r--plugins/PrivacyManager/lang/uk.json65
-rw-r--r--plugins/PrivacyManager/tests/Integration/DataPurgingTest.php3
-rw-r--r--plugins/ProfessionalServices/ProfessionalServices.php48
-rw-r--r--plugins/ProfessionalServices/Promo.php (renamed from plugins/PiwikPro/Promo.php)14
-rw-r--r--plugins/ProfessionalServices/Widgets.php60
-rw-r--r--plugins/ProfessionalServices/config/test.php13
-rw-r--r--plugins/ProfessionalServices/images/promo.png (renamed from plugins/PiwikPro/images/promo.png)bin2349 -> 2349 bytes
-rw-r--r--plugins/ProfessionalServices/lang/en.json5
-rw-r--r--plugins/ProfessionalServices/plugin.json4
-rw-r--r--plugins/ProfessionalServices/stylesheets/widget.less (renamed from plugins/PiwikPro/stylesheets/widget.less)0
-rw-r--r--plugins/ProfessionalServices/templates/promoServicesWidget.twig (renamed from plugins/PiwikPro/templates/promoPiwikProWidget.twig)2
-rw-r--r--plugins/ProfessionalServices/tests/Framework/Mock/Promo.php (renamed from plugins/PiwikPro/tests/Framework/Mock/Promo.php)4
-rw-r--r--plugins/Provider/lang/sq.json1
-rw-r--r--plugins/Provider/lang/sv.json3
-rw-r--r--plugins/Provider/lang/uk.json5
-rw-r--r--plugins/Referrers/Columns/Base.php5
-rw-r--r--plugins/Referrers/SearchEngine.php49
-rw-r--r--plugins/Referrers/images/searchEngines/search.disconnect.me.pngbin0 -> 505 bytes
-rw-r--r--plugins/Referrers/images/searchEngines/search.lookseek.com.pngbin0 -> 991 bytes
-rw-r--r--plugins/Referrers/images/searchEngines/search.smartshopping.com.pngbin0 -> 576 bytes
-rw-r--r--plugins/Referrers/images/searchEngines/searchlock.com.pngbin0 -> 3295 bytes
-rw-r--r--plugins/Referrers/images/searchEngines/startpage.com.pngbin0 -> 738 bytes
-rw-r--r--plugins/Referrers/images/searchEngines/www.only-search.com.pngbin0 -> 789 bytes
-rw-r--r--plugins/Referrers/lang/it.json8
-rw-r--r--plugins/Referrers/lang/nl.json4
-rw-r--r--plugins/Referrers/lang/uk.json63
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php2
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php2
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php17
-rw-r--r--plugins/Referrers/tests/Unit/SearchEngineTest.php2
-rw-r--r--plugins/Resolution/lang/ar.json1
-rw-r--r--plugins/Resolution/lang/tr.json11
-rw-r--r--plugins/Resolution/lang/uk.json10
-rw-r--r--plugins/SEO/lang/ru.json1
-rw-r--r--plugins/SEO/lang/sl.json2
-rw-r--r--plugins/SEO/lang/sq.json3
-rw-r--r--plugins/SEO/lang/uk.json12
-rw-r--r--plugins/ScheduledReports/ScheduledReports.php5
-rw-r--r--plugins/ScheduledReports/lang/es.json2
-rw-r--r--plugins/ScheduledReports/lang/it.json4
-rw-r--r--plugins/ScheduledReports/lang/sq.json16
-rw-r--r--plugins/ScheduledReports/lang/sv.json3
-rw-r--r--plugins/ScheduledReports/lang/uk.json53
-rw-r--r--plugins/SegmentEditor/SegmentFormatter.php3
-rw-r--r--plugins/SegmentEditor/SegmentQueryDecorator.php4
-rw-r--r--plugins/SegmentEditor/SegmentSelectorControl.php6
-rw-r--r--plugins/SegmentEditor/javascripts/Segmentation.js41
-rw-r--r--plugins/SegmentEditor/lang/cs.json3
-rw-r--r--plugins/SegmentEditor/lang/de.json3
-rw-r--r--plugins/SegmentEditor/lang/el.json3
-rw-r--r--plugins/SegmentEditor/lang/en.json3
-rw-r--r--plugins/SegmentEditor/lang/es.json14
-rw-r--r--plugins/SegmentEditor/lang/fr.json4
-rw-r--r--plugins/SegmentEditor/lang/it.json3
-rw-r--r--plugins/SegmentEditor/lang/nl.json1
-rw-r--r--plugins/SegmentEditor/lang/pt-br.json3
-rw-r--r--plugins/SegmentEditor/lang/ru.json1
-rw-r--r--plugins/SegmentEditor/lang/sv.json8
-rw-r--r--plugins/SegmentEditor/lang/uk.json38
-rw-r--r--plugins/SegmentEditor/stylesheets/segmentation.less11
-rw-r--r--plugins/SegmentEditor/templates/_segmentSelector.twig20
-rw-r--r--plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php5
-rw-r--r--plugins/SitesManager/API.php4
-rw-r--r--plugins/SitesManager/Controller.php4
-rw-r--r--plugins/SitesManager/lang/fr.json1
-rw-r--r--plugins/SitesManager/lang/ka.json4
-rw-r--r--plugins/SitesManager/lang/sq.json17
-rw-r--r--plugins/SitesManager/lang/sv.json5
-rw-r--r--plugins/SitesManager/lang/uk.json118
-rw-r--r--plugins/SitesManager/templates/sites-list/site-fields.html4
-rw-r--r--plugins/SitesManager/tests/Integration/ApiTest.php7
-rw-r--r--plugins/TestRunner/Commands/TestsRun.php2
-rw-r--r--plugins/Transitions/lang/it.json2
-rw-r--r--plugins/Transitions/lang/sv.json1
-rw-r--r--plugins/Transitions/lang/uk.json28
m---------plugins/TreemapVisualization0
-rw-r--r--plugins/UserCountry/images/flags/bu.pngbin336 -> 464 bytes
-rw-r--r--plugins/UserCountry/images/flags/ch.pngbin239 -> 354 bytes
-rw-r--r--plugins/UserCountry/images/flags/gf.pngbin369 -> 390 bytes
-rw-r--r--plugins/UserCountry/images/flags/ls.pngbin500 -> 361 bytes
-rw-r--r--plugins/UserCountry/images/flags/ly.pngbin277 -> 353 bytes
-rw-r--r--plugins/UserCountry/images/flags/mm.pngbin336 -> 464 bytes
-rw-r--r--plugins/UserCountry/images/flags/np.pngbin349 -> 423 bytes
-rw-r--r--plugins/UserCountry/images/flags/tk.pngbin522 -> 379 bytes
-rw-r--r--plugins/UserCountry/lang/nl.json19
-rw-r--r--plugins/UserCountry/lang/sq.json22
-rw-r--r--plugins/UserCountry/lang/uk.json90
-rw-r--r--plugins/UserCountry/tests/Unit/UserCountryTest.php3
-rw-r--r--plugins/UserCountryMap/javascripts/visitor-map.js86
-rw-r--r--plugins/UserCountryMap/lang/ru.json1
-rw-r--r--plugins/UserCountryMap/lang/sq.json4
-rw-r--r--plugins/UserCountryMap/lang/uk.json22
-rw-r--r--plugins/UserId/.gitignore1
-rw-r--r--plugins/UserId/API.php46
-rw-r--r--plugins/UserId/Archiver.php140
-rw-r--r--plugins/UserId/Columns/UserId.php29
-rw-r--r--plugins/UserId/Reports/Base.php19
-rw-r--r--plugins/UserId/Reports/GetUsers.php72
-rw-r--r--plugins/UserId/UserId.php53
-rw-r--r--plugins/UserId/images/visitordetails-hover.pngbin0 -> 1275 bytes
-rw-r--r--plugins/UserId/images/visitordetails.pngbin0 -> 1273 bytes
-rw-r--r--plugins/UserId/javascripts/rowaction.js74
-rw-r--r--plugins/UserId/lang/am.json5
-rw-r--r--plugins/UserId/lang/ar.json5
-rw-r--r--plugins/UserId/lang/be.json5
-rw-r--r--plugins/UserId/lang/bg.json5
-rw-r--r--plugins/UserId/lang/ca.json5
-rw-r--r--plugins/UserId/lang/cs.json7
-rw-r--r--plugins/UserId/lang/da.json5
-rw-r--r--plugins/UserId/lang/de.json7
-rw-r--r--plugins/UserId/lang/el.json7
-rw-r--r--plugins/UserId/lang/en.json7
-rw-r--r--plugins/UserId/lang/es.json5
-rw-r--r--plugins/UserId/lang/et.json5
-rw-r--r--plugins/UserId/lang/eu.json5
-rw-r--r--plugins/UserId/lang/fa.json5
-rw-r--r--plugins/UserId/lang/fi.json5
-rw-r--r--plugins/UserId/lang/fr.json7
-rw-r--r--plugins/UserId/lang/gl.json5
-rw-r--r--plugins/UserId/lang/he.json5
-rw-r--r--plugins/UserId/lang/hi.json5
-rw-r--r--plugins/UserId/lang/hr.json5
-rw-r--r--plugins/UserId/lang/hu.json5
-rw-r--r--plugins/UserId/lang/id.json5
-rw-r--r--plugins/UserId/lang/is.json5
-rw-r--r--plugins/UserId/lang/it.json7
-rw-r--r--plugins/UserId/lang/ja.json5
-rw-r--r--plugins/UserId/lang/ka.json5
-rw-r--r--plugins/UserId/lang/ko.json5
-rw-r--r--plugins/UserId/lang/lt.json5
-rw-r--r--plugins/UserId/lang/lv.json5
-rw-r--r--plugins/UserId/lang/nb.json7
-rw-r--r--plugins/UserId/lang/nl.json7
-rw-r--r--plugins/UserId/lang/nn.json5
-rw-r--r--plugins/UserId/lang/pl.json5
-rw-r--r--plugins/UserId/lang/pt-br.json7
-rw-r--r--plugins/UserId/lang/pt.json5
-rw-r--r--plugins/UserId/lang/ro.json5
-rw-r--r--plugins/UserId/lang/ru.json5
-rw-r--r--plugins/UserId/lang/sk.json5
-rw-r--r--plugins/UserId/lang/sl.json5
-rw-r--r--plugins/UserId/lang/sq.json5
-rw-r--r--plugins/UserId/lang/sr.json5
-rw-r--r--plugins/UserId/lang/sv.json7
-rw-r--r--plugins/UserId/lang/ta.json5
-rw-r--r--plugins/UserId/lang/te.json5
-rw-r--r--plugins/UserId/lang/th.json5
-rw-r--r--plugins/UserId/lang/tl.json5
-rw-r--r--plugins/UserId/lang/tr.json5
-rw-r--r--plugins/UserId/lang/uk.json5
-rw-r--r--plugins/UserId/lang/vi.json7
-rw-r--r--plugins/UserId/lang/zh-cn.json5
-rw-r--r--plugins/UserId/lang/zh-tw.json5
-rw-r--r--plugins/UserId/tests/Fixtures/TrackFewVisitsAndCreateUsers.php58
-rw-r--r--plugins/UserId/tests/System/ApiTest.php154
-rw-r--r--plugins/UserId/tests/System/expected/test___UserId.getUsers_day.xml39
-rw-r--r--plugins/UserId/tests/System/expected/test___UserId.getUsers_range.xml39
-rw-r--r--plugins/UserId/tests/System/expected/test_ascSortOrder__UserId.getUsers_day.xml39
-rw-r--r--plugins/UserId/tests/System/expected/test_ascSortOrder__UserId.getUsers_range.xml39
-rw-r--r--plugins/UserId/tests/System/expected/test_limit__UserId.getUsers_day.xml27
-rw-r--r--plugins/UserId/tests/System/expected/test_limit__UserId.getUsers_range.xml27
-rw-r--r--plugins/UserId/tests/System/expected/test_searchByUserId__UserId.getUsers_day.xml15
-rw-r--r--plugins/UserId/tests/System/expected/test_searchByUserId__UserId.getUsers_range.xml15
-rw-r--r--plugins/UserLanguage/lang/nl.json2
-rw-r--r--plugins/UserLanguage/lang/sq.json3
-rw-r--r--plugins/UserLanguage/lang/uk.json4
-rw-r--r--plugins/UserLanguage/lang/vi.json3
-rw-r--r--plugins/UsersManager/Controller.php2
-rw-r--r--plugins/UsersManager/UsersManager.php7
-rw-r--r--plugins/UsersManager/lang/ar.json1
-rw-r--r--plugins/UsersManager/lang/be.json1
-rw-r--r--plugins/UsersManager/lang/bg.json1
-rw-r--r--plugins/UsersManager/lang/ca.json1
-rw-r--r--plugins/UsersManager/lang/cs.json2
-rw-r--r--plugins/UsersManager/lang/da.json1
-rw-r--r--plugins/UsersManager/lang/de.json4
-rw-r--r--plugins/UsersManager/lang/el.json2
-rw-r--r--plugins/UsersManager/lang/en.json2
-rw-r--r--plugins/UsersManager/lang/es.json9
-rw-r--r--plugins/UsersManager/lang/fa.json2
-rw-r--r--plugins/UsersManager/lang/fi.json1
-rw-r--r--plugins/UsersManager/lang/fr.json6
-rw-r--r--plugins/UsersManager/lang/id.json1
-rw-r--r--plugins/UsersManager/lang/it.json2
-rw-r--r--plugins/UsersManager/lang/ja.json1
-rw-r--r--plugins/UsersManager/lang/ka.json8
-rw-r--r--plugins/UsersManager/lang/ko.json1
-rw-r--r--plugins/UsersManager/lang/lt.json1
-rw-r--r--plugins/UsersManager/lang/lv.json1
-rw-r--r--plugins/UsersManager/lang/nb.json1
-rw-r--r--plugins/UsersManager/lang/nl.json2
-rw-r--r--plugins/UsersManager/lang/pl.json1
-rw-r--r--plugins/UsersManager/lang/pt-br.json1
-rw-r--r--plugins/UsersManager/lang/pt.json1
-rw-r--r--plugins/UsersManager/lang/ro.json1
-rw-r--r--plugins/UsersManager/lang/ru.json1
-rw-r--r--plugins/UsersManager/lang/sl.json1
-rw-r--r--plugins/UsersManager/lang/sq.json13
-rw-r--r--plugins/UsersManager/lang/sr.json1
-rw-r--r--plugins/UsersManager/lang/sv.json5
-rw-r--r--plugins/UsersManager/lang/tl.json1
-rw-r--r--plugins/UsersManager/lang/uk.json97
-rw-r--r--plugins/UsersManager/lang/vi.json9
-rw-r--r--plugins/UsersManager/lang/zh-cn.json1
-rw-r--r--plugins/UsersManager/lang/zh-tw.json1
-rw-r--r--plugins/UsersManager/tests/Integration/UsersManagerTest.php16
-rw-r--r--plugins/UsersManager/tests/System/ApiTest.php2
-rw-r--r--plugins/VisitFrequency/lang/uk.json9
-rw-r--r--plugins/VisitTime/lang/it.json4
-rw-r--r--plugins/VisitTime/lang/uk.json22
-rw-r--r--plugins/VisitorInterest/lang/fr.json2
-rw-r--r--plugins/VisitorInterest/lang/is.json1
-rw-r--r--plugins/VisitorInterest/lang/ka.json1
-rw-r--r--plugins/VisitorInterest/lang/uk.json23
-rw-r--r--plugins/VisitsSummary/lang/sl.json6
-rw-r--r--plugins/VisitsSummary/lang/uk.json25
-rw-r--r--plugins/WebsiteMeasurable/lang/ru.json5
-rw-r--r--plugins/WebsiteMeasurable/lang/uk.json7
-rw-r--r--plugins/Widgetize/lang/sv.json1
-rw-r--r--plugins/Widgetize/lang/tr.json6
-rw-r--r--plugins/Widgetize/lang/uk.json4
-rw-r--r--plugins/Widgetize/tests/System/WidgetTest.php17
-rw-r--r--tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php14
-rw-r--r--tests/PHPUnit/Fixtures/UITestFixture.php1
-rw-r--r--tests/PHPUnit/Framework/Fixture.php10
-rw-r--r--tests/PHPUnit/Framework/Mock/Plugin/LogTablesProvider.php28
-rw-r--r--tests/PHPUnit/Framework/Mock/ProfessionalServices/Advertising.php (renamed from tests/PHPUnit/Framework/Mock/PiwikPro/Advertising.php)6
-rwxr-xr-xtests/PHPUnit/Framework/TestCase/SystemTestCase.php1
-rw-r--r--tests/PHPUnit/Framework/TestRequest/Response.php1
-rw-r--r--tests/PHPUnit/Integration/CronArchiveTest.php2
-rw-r--r--tests/PHPUnit/Integration/EmailValidatorTest.php41
-rw-r--r--tests/PHPUnit/Integration/LogDeleterTest.php32
-rw-r--r--tests/PHPUnit/Integration/ProfessionalSupport/AdvertisingTest.php (renamed from tests/PHPUnit/Integration/PiwikPro/AdvertisingTest.php)67
-rw-r--r--tests/PHPUnit/Integration/ReleaseCheckListTest.php128
-rw-r--r--tests/PHPUnit/Integration/SegmentTest.php18
-rw-r--r--tests/PHPUnit/Integration/Tracker/TrackerCodeGeneratorTest.php8
-rw-r--r--tests/PHPUnit/Integration/WidgetsListTest.php2
-rw-r--r--tests/PHPUnit/System/CustomEventsTest.php21
-rwxr-xr-xtests/PHPUnit/System/EcommerceOrderWithItemsTest.php2
-rw-r--r--tests/PHPUnit/System/EnvironmentValidationTest.php39
-rwxr-xr-xtests/PHPUnit/System/RowEvolutionTest.php4
-rw-r--r--tests/PHPUnit/System/expected/test_AutoSuggestAPITest_browserEngine__API.getSuggestedValuesForSegment.xml1
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml13
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml38
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml13
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml24
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml13
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml20
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml25
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml25
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml17
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml17
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Goals.get_day.xml15
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml194
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml194
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml25
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml25
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml17
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml17
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml25
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml25
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml17
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml17
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__UserId.getUsers_month.xml39
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_sortByProcessedMetric__API.getProcessedReport_day.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserId.getUsers_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_hideColumns___API.getProcessedReport_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_showColumns___API.getProcessedReport_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_day.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_month.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Actions.getPageTitles_firstSite_lastN__API.getProcessedReport_day.xml20
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Referrers.getWebsites_firstSite_lastN__API.getProcessedReport_day.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv3
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html10
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml29
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml678
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__SitesManager.getJavascriptTag.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv3
-rw-r--r--tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html10
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__UserId.getUsers_day.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__UserId.getUsers_week.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit__UserId.getUsers_day.xml2
-rw-r--r--tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php171
-rw-r--r--tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php146
-rw-r--r--tests/PHPUnit/Unit/DataTableTest.php67
-rw-r--r--tests/PHPUnit/Unit/FilesystemTest.php21
-rw-r--r--tests/PHPUnit/Unit/Tracker/ResponseTest.php2
-rw-r--r--tests/PHPUnit/Unit/UrlTest.php37
-rw-r--r--tests/UI/specs/Installation_spec.js16
-rw-r--r--tests/UI/specs/SegmentSelectorEditor_spec.js9
-rw-r--r--tests/angularjs/Gruntfile.js23
-rwxr-xr-xtests/angularjs/karma.conf.js4
-rw-r--r--tests/angularjs/package.json5
-rw-r--r--tests/index.html3
-rw-r--r--tests/javascript/index.php316
-rw-r--r--tests/javascript/piwiktest.js3
-rw-r--r--tests/resources/extractSearchEngineInformationFromUrlTests.yml79
m---------tests/travis0
981 files changed, 11965 insertions, 27647 deletions
diff --git a/.gitignore b/.gitignore
index a1cd27d0cd..8a53c53e11 100644
--- a/.gitignore
+++ b/.gitignore
@@ -61,6 +61,7 @@ php_errors.log
/tests/PHPUnit/proxy/piwik.js
/tests/PHPUnit/proxy/plugins
/tests/PHPUnit/proxy/tests
+/tests/resources/piwik.test.js
/config/*.config.ini.php
/Vagrantfile
/misc/vagrant
diff --git a/.travis.yml b/.travis.yml
index 0be69f5c48..ba201c014c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,7 @@
# do not edit this file manually, instead run the generate:travis-yml console command
-# if you are a Piwik core developer, edit this template file to auto generate the .travis.yml: https://github.com/piwik/piwik/blob/master/plugins/TestRunner/templates/travis.yml.twig
+# if you are a Piwik core developer, to auto generate the .travis.yml:
+# 1) edit this template file: https://github.com/piwik/travis-scripts/blob/master/generator/templates/travis.yml.twig
+# 2) commit the updated submodule in `piwik/tests/travis/`
# when modifying this file, please consider whether your changes should apply to plugin .travis.yml files. if not, check whether the pluginName twig var is empty,
# otherwise your changes will be synced with every plugin that uses an auto generated .travis.yml
@@ -9,8 +11,6 @@
language: php
-group: legacy
-
php:
- 5.6
- 5.5
@@ -42,8 +42,8 @@ env:
- TEST_SUITE=JavascriptTests MYSQL_ADAPTER=PDO_MYSQL
- TEST_SUITE=AngularJSTests MYSQL_ADAPTER=PDO_MYSQL SKIP_COMPOSER_INSTALL=1
# All tests after another
- - TEST_SUITE=AllTests MYSQL_ADAPTER=PDO_MYSQL
- - TEST_SUITE=AllTests MYSQL_ADAPTER=MYSQLI
+ - TEST_SUITE=AllTests MYSQL_ADAPTER=MYSQLI ALLTEST_EXTRA_OPTIONS="--run-first-half-only"
+ - TEST_SUITE=AllTests MYSQL_ADAPTER=MYSQLI ALLTEST_EXTRA_OPTIONS="--run-second-half-only"
- TEST_SUITE=UITests MYSQL_ADAPTER=PDO_MYSQL UITEST_EXTRA_OPTIONS="--run-first-half-only"
- TEST_SUITE=UITests MYSQL_ADAPTER=PDO_MYSQL UITEST_EXTRA_OPTIONS="--run-second-half-only"
global:
@@ -55,9 +55,6 @@ env:
matrix:
fast_finish: true
- allow_failures:
- - php: hhvm
- - php: 7
exclude:
# Run test suites separately only on PHP 5.6 with PDO
- php: 5.5
@@ -122,10 +119,13 @@ install:
- ./tests/travis/configure_git.sh
+ # disable tls for php 5.3 as openssl isn't available
+ - '[[ "$TRAVIS_PHP_VERSION" == 5.3* ]] && composer config -g -- disable-tls true || true'
+
# travis now complains about this failing 9 times out of 10, so removing it
#- travis_retry composer self-update
-
- - '[ "$SKIP_COMPOSER_INSTALL" == "1" ] || travis_retry composer install'
+ - '[ "$SKIP_COMPOSER_INSTALL" == "1" ] || travis_retry composer install'
+
before_script:
@@ -137,13 +137,21 @@ before_script:
# disable opcache to avoid random failures on travis
- echo "opcache.enable=0" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini
+ # make tmpfs and run MySQL on it for reasonnable performance
+ - sudo mkdir /mnt/ramdisk
+ - sudo mount -t tmpfs -o size=1024m tmpfs /mnt/ramdisk
+ - sudo stop mysql
+ - sudo mv /var/lib/mysql /mnt/ramdisk
+ - sudo ln -s /mnt/ramdisk/mysql /var/lib/mysql
+ - sudo start mysql
+
# print out mysql information
- mysql --version
- mysql -e "SELECT VERSION();"
# configure mysql
- mysql -e "SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'" # Travis default
- # try to avoid mysql has gone away errors
+ # try to avoid 'mysql has gone away' errors
- mysql -e "SET GLOBAL wait_timeout = 36000;"
- mysql -e "SET GLOBAL max_allowed_packet = 134209536;"
- mysql -e "SHOW VARIABLES LIKE 'max_allowed_packet';"
@@ -186,7 +194,6 @@ notifications:
slack:
rooms:
- piwik:3HWhNh21qPfDACQXTrJOb0mW
- - piwikpro:7OABSbDrywSTo2nv9lD2svXG
on_success: :change
on_failure: :change
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fc6bbf7b25..5a1eb861c6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,28 @@
# Piwik Platform Changelog
-This is a changelog for Piwik platform developers. All changes for our HTTP API's, Plugins, Themes, etc will be listed here.
+This is the Developer Changelog for Piwik platform developers. All changes in our HTTP API's, Plugins, Themes, SDKs, etc. are listed below.
+
+The Product Changelog at **[piwik.org/changelog](http://piwik.org/changelog)** lets you see more details about any Piwik release, such as the list of new guides and FAQs, security fixes, and links to all closed issues.
+
+## Piwik 2.16.3
+
+### New APIs
+* The Piwik JavaScript tracker has a new method `trackRequest` that allows you to send any tracking parameters to Piwik. For example `_paq.push(['trackRequest', 'te=foo&bar=baz'])`
+
+## Piwik 2.16.2
+
+### New APIs
+ * Multiple JavaScript trackers can now be created easily via `_paq.push(['addTracker', piwikUrl, piwikSiteId])`. All tracking requests will be then sent to all added Piwik trackers. [Learn more.](http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers)
+ * It is possible to get an asynchronously created tracker instance (`addTracker`) via the method `Piwik.getAsyncTracker(optionalPiwikUrl, optionalPiwikSiteId)`. This allows you to get the tracker instance and to send different tracking requests to this Piwik instance and to configure it differently than other tracker instances.
+ * Added a new API method `Goals.getGoal($idSite, $idGoal)` to fetch a single goal.
+
+### Internal change
+ * Piwik is now compatible with PHP7.
+ * `piwik.js`, if you call the method `setDomains` note that that the behavior has slightly changed. The current page domain (hostname) will now be added automatically if none of the given host alias passed as a parameter to `setDomains` contain a path and if no host alias is already given for the current host alias.
+ Say you are on "example.org" and set `hostAlias = ['example.com', 'example.org/test']` then the current "example.org" domain will not be added as there is already a more restrictive hostAlias 'example.org/test' given.
+ We also do not add the current page domain (hostname) automatically if there was any other host specifying any path such as `['example.com', 'example2.com/test']`.
+ In this case we also do not add the current page domain "example.org" automatically as the "path" feature is used. As soon as someone uses the path feature, for Piwik JS Tracker to work correctly in all cases, one needs to specify all hosts manually. [Learn more.](http://developer.piwik.org/guides/tracking-javascript-guide#measuring-domains-andor-sub-domains)
+ * `piwik.js`: after an ecommerce order is tracked using `trackEcommerceOrder`, the items in the cart will now be removed from the JavaScript object. Calling `trackEcommerceCartUpdate` will not remove the items in the cart.
## Piwik 3.0.0
diff --git a/HIRING.md b/HIRING.md
deleted file mode 100644
index 4eaefa80fd..0000000000
--- a/HIRING.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# We are hiring engineers to build an awesome product and platform used by millions of people
-
-Are you ready for a new challenge? Or maybe you know someone who is looking for a change? We have some exciting problems to solve and are looking for senior developers to work with us and our community on our open source Piwik Analytics platform. Piwik is used by more than one million websites all over the world. It is deployed on more than 300.000 servers and some users track more than 1 billion actions per month.
-
-## What is it like to work on Piwik?
-
-We develop this software using modern PHP, MySQL, Redis, AngularJS and more. We provide several kind of APIs and a plugin architecture to allow developers to extend and change Piwik to their needs. However, we would not be Piwik if we stopped at this point! We want to turn Piwik into an even more awesome product and platform.
-You can imagine there is a lot to do and many challenges to face!
-
-While one part is to always make Piwik scale better and to improve UI and UX, we also want to provide simple APIs to make the life of developers as pleasant as possible. We aim to solve things the right way and our thousands of unit, integration, system, JavaScript and screenshot tests help us to innovate and to not be afraid of change. We like clean code and constant improvements.
-
-The Piwik team lives in New Zealand, Europe (Poland, Germany) and in the U.S. We do the vast majority of our collaboration online. Our values include being open, transparent and sharing knowledge. For this we use tools like GitHub and Slack to communicate and Quake servers to take our minds off complex challenges. We are a small, flexible team, so when you come aboard, you will play an integral part in engineering and have a big impact on the product loved by so many people. You’ll help to create a welcoming environment for new contributors and set an example with your development practices and communications skills.
-
-## Apply now, or spread the word!
-
-If you have strong skills in PHP send us an email with your CV and tell us a little about yourself and your experience in engineering complex applications.
-
-[Apply for a job here http://piwik.org/jobs/](http://piwik.org/jobs/) and if you’re maybe not the right candidate, contribute to the project by sharing this blog post and by sending it to your friends!
diff --git a/PULL_REQUEST_TEMPLATE b/PULL_REQUEST_TEMPLATE
new file mode 100644
index 0000000000..b4b881207a
--- /dev/null
+++ b/PULL_REQUEST_TEMPLATE
@@ -0,0 +1,3 @@
+Please issue pull request against the `3.x-dev` branch as the `master` branch currently represents our `2.X` version which is in LTS mode.
+
+Important fixes will be merged into `master` if needed after it was merged to `3.x-dev`.
diff --git a/README.md b/README.md
index 6ef7604077..6e49eebf48 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,14 @@
# Piwik - piwik.org
-[![Latest Stable Version](https://poser.pugx.org/piwik/piwik/v/stable)](https://packagist.org/packages/piwik/piwik)
+[![Latest Stable Version](https://poser.pugx.org/piwik/piwik/v/stable)](https://piwik.org/download/)
[![Latest Unstable Version](https://poser.pugx.org/piwik/piwik/v/unstable)](https://packagist.org/packages/piwik/piwik)
-[![Total Downloads](https://poser.pugx.org/piwik/piwik/downloads)](https://packagist.org/packages/piwik/piwik)
-[![License](https://poser.pugx.org/piwik/piwik/license)](https://packagist.org/packages/piwik/piwik)
+[![License](https://poser.pugx.org/piwik/piwik/license)](http://piwik.org/free-software/)
## Code Status
-[![Build Status](https://travis-ci.org/piwik/piwik.svg?branch=master)](https://travis-ci.org/piwik/piwik)
+[![Build Status](https://travis-ci.org/piwik/piwik.svg?branch=master)](https://travis-ci.org/piwik/piwik/branches)
[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/piwik/piwik.svg)](https://scrutinizer-ci.com/g/piwik/piwik?branch=master)
[![Code Coverage](https://scrutinizer-ci.com/g/piwik/piwik/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/piwik/piwik/?branch=master "Unit tests code coverage. Does not include coverage of integration tests, system tests or UI screenshot tests.")
-[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/piwik/piwik.svg)](http://isitmaintained.com/project/piwik/piwik "Average time to resolve an issue")
[![Percentage of issues still open](http://isitmaintained.com/badge/open/piwik/piwik.svg)](http://isitmaintained.com/project/piwik/piwik "Percentage of issues still open")
[![Dependency Status](https://gemnasium.com/piwik/piwik.svg)](https://gemnasium.com/piwik/piwik)
@@ -35,15 +33,6 @@ Or in short:
Piwik is released under the GPL v3 (or later) license, see [misc/gpl-3.0.txt](misc/gpl-3.0.txt)
-## We’re seeking a talented Software Engineer
-
-Are you looking for a new challenge? We are currently seeking a software engineer or software developer who is passionate about data processing, security, privacy, the open source and free/libre philosophy and usable interface design.
-
-[View Job Description](https://piwik.org/blog/2016/01/piwik-expanding-seeking-talented-software-engineer-new-zealand-poland/) - [Apply online](http://piwik.org/jobs/)
-
-This is for a full time position to work on the open source Piwik platform, either remotely or we can help the right candidate relocate to beautiful New Zealand (Wellington) or Poland (Wroclaw).
-
-We are grateful if you can share the job description with your friends and wider network!
## Requirements
@@ -69,20 +58,38 @@ If you do not have a server, consider our Piwik Hosting partner: http://piwik.or
For the list of all tickets closed in the current and past releases, see http://piwik.org/changelog/. For the list of technical changes in the Piwik platform, see [http://developer.piwik.org/changelog](http://developer.piwik.org/changelog).
-## Participate!
+## Get involved!
We believe in liberating Web Analytics, providing a free platform for simple and advanced analytics. Piwik was built by dozens of people like you,
-and we need your help to make Piwik better… Why not participate in a useful project today?
+and we need your help to make Piwik better… Why not participate in a useful project today? [Learn how you can contribute to Piwik.](https://piwik.org/get-involved)
+
+## Quality Assurance
+
+The Piwik project uses an ever-expanding comprehensive set of thousands of unit tests and hundreds of automated integration tests, system tests, JavaScript tests, and screenshot UI tests, running on a continuous integration server as part of its software quality assurance. [Learn more](https://piwik.org/qa/)
+
+We use [BrowserStack.com](https://www.browserstack.com/) testing tool to help check the Piwik user interface is compatible with many browsers.
-You will find pointers on how you can participate in Piwik at http://piwik.org/get-involved/
+
+## Security
+
+Security is a top priority at Piwik. As potential issues are discovered, we validate, patch and release fixes as quickly as we can. We have a security bug bounty program in place that rewards researchers for finding security issues and disclosing them to us.
+
+[Learn more](https://piwik.org/security/)
+
+## Support for Piwik
+
+For **Free support**, post a message in our community forums: [forum.piwik.org](http://forum.piwik.org/)
+
+For **Professional paid support**, send a message to our network of Piwik professionals: [piwik.org/support](http://piwik.org/contact/)
## Contact
-http://piwik.org
+Website: [piwik.org](https://piwik.org)
+
+About us: [piwik.org/team/](https://piwik.org/team/)
-hello@piwik.org
+Contact us: [piwik.org/contact/](https://piwik.org/contact/)
-About us: http://piwik.org/the-piwik-team/
## More information
@@ -91,8 +98,7 @@ What makes Piwik unique from the competition:
* Real time web analytics reports: in Piwik, reports are by default generated in real time.
For high traffic websites, you can choose the frequency for reports to be processed.
- * You own your web analytics data: since Piwik is installed on your server, the data is stored in your own database and you can get all the statistics
- using the powerful Piwik Analytics API.
+ * You own your web analytics data: since Piwik is installed on your server, the data is stored in your own database and you can get all the statistics using the powerful Piwik Analytics API.
* Piwik is a Free Software which can easily be configured to respect your visitors privacy.
diff --git a/bower.json b/bower.json
index bf88bc001c..20794281b6 100644
--- a/bower.json
+++ b/bower.json
@@ -30,7 +30,8 @@
"jQuery.dotdotdot": "~1.7.2",
"jquery.scrollTo": "~1.4.13",
"chroma-js": "~0.6.0",
- "visibilityjs": "~1.2.1"
+ "visibilityjs": "~1.2.1",
+ "jqueryui-touch-punch": "#master"
},
"license": "GPLv3 or later",
"ignore": [
diff --git a/composer.json b/composer.json
index 4a15908286..be0f9fa4fc 100644
--- a/composer.json
+++ b/composer.json
@@ -18,21 +18,9 @@
"wiki": "https://github.com/piwik/piwik/wiki",
"source": "https://github.com/piwik/piwik"
},
- "autoload": {
- "psr-4": {
- "Piwik\\Plugins\\": "plugins/",
- "Piwik\\": "core/"
- },
- "psr-0": {
- "Zend_": "libs/",
- "HTML_": "libs/",
- "PEAR_": "libs/",
- "Archive_": "libs/"
- }
- },
- "autoload-dev": {
- "psr-4": {
- "Piwik\\Tests\\": "tests/PHPUnit/"
+ "config":{
+ "platform": {
+ "php": "5.3.3"
}
},
"require": {
@@ -44,7 +32,7 @@
"mustangostang/spyc": "~0.5.0",
"piwik/device-detector": "~3.0",
"piwik/decompress": "~1.0",
- "piwik/network": "~0.1.0",
+ "piwik/network": "~0",
"piwik/cache": "~0.2.5",
"piwik/ini": "^1.0.6",
"php-di/php-di": "^5.0.0",
@@ -108,7 +96,21 @@
"Piwik\\Composer\\ScriptHandler::buildXhprof"
]
},
- "config": {
- "disable-tls": true
+ "autoload": {
+ "psr-4": {
+ "Piwik\\Plugins\\": "plugins/",
+ "Piwik\\": "core/"
+ },
+ "psr-0": {
+ "Zend_": "libs/",
+ "HTML_": "libs/",
+ "PEAR_": "libs/",
+ "Archive_": "libs/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Piwik\\Tests\\": "tests/PHPUnit/"
+ }
}
}
diff --git a/composer.lock b/composer.lock
index cc8ce0bd49..a358a04b45 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,8 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "de61be52972a0fe8fe751306c271f4b8",
- "content-hash": "68130b067cdceef8346b47d858b763a3",
+ "hash": "e50915e8a908a57eb8111876fd084910",
+ "content-hash": "e83668fa3120ab4f766c150a82f01d9c",
"packages": [
{
"name": "container-interop/container-interop",
@@ -104,16 +104,16 @@
},
{
"name": "doctrine/cache",
- "version": "v1.4.2",
+ "version": "v1.5.4",
"source": {
"type": "git",
"url": "https://github.com/doctrine/cache.git",
- "reference": "8c434000f420ade76a07c64cbe08ca47e5c101ca"
+ "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/cache/zipball/8c434000f420ade76a07c64cbe08ca47e5c101ca",
- "reference": "8c434000f420ade76a07c64cbe08ca47e5c101ca",
+ "url": "https://api.github.com/repos/doctrine/cache/zipball/47cdc76ceb95cc591d9c79a36dc3794975b5d136",
+ "reference": "47cdc76ceb95cc591d9c79a36dc3794975b5d136",
"shasum": ""
},
"require": {
@@ -134,8 +134,8 @@
}
},
"autoload": {
- "psr-0": {
- "Doctrine\\Common\\Cache\\": "lib/"
+ "psr-4": {
+ "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -170,7 +170,7 @@
"cache",
"caching"
],
- "time": "2015-08-31 12:36:41"
+ "time": "2015-12-19 05:03:47"
},
{
"name": "doctrine/lexer",
@@ -300,20 +300,21 @@
"phpdoc",
"reflection"
],
+ "abandoned": "php-di/phpdoc-reader",
"time": "2014-08-21 08:20:45"
},
{
"name": "monolog/monolog",
- "version": "1.17.2",
+ "version": "1.20.0",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "bee7f0dc9c3e0b69a6039697533dca1e845c8c24"
+ "reference": "55841909e2bcde01b5318c35f2b74f8ecc86e037"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bee7f0dc9c3e0b69a6039697533dca1e845c8c24",
- "reference": "bee7f0dc9c3e0b69a6039697533dca1e845c8c24",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/55841909e2bcde01b5318c35f2b74f8ecc86e037",
+ "reference": "55841909e2bcde01b5318c35f2b74f8ecc86e037",
"shasum": ""
},
"require": {
@@ -328,13 +329,13 @@
"doctrine/couchdb": "~1.0@dev",
"graylog2/gelf-php": "~1.0",
"jakub-onderka/php-parallel-lint": "0.9",
+ "php-amqplib/php-amqplib": "~2.4",
"php-console/php-console": "^3.1.3",
"phpunit/phpunit": "~4.5",
"phpunit/phpunit-mock-objects": "2.3.0",
- "raven/raven": "^0.13",
"ruflin/elastica": ">=0.90 <3.0",
- "swiftmailer/swiftmailer": "~5.3",
- "videlalvaro/php-amqplib": "~2.4"
+ "sentry/sentry": "^0.13",
+ "swiftmailer/swiftmailer": "~5.3"
},
"suggest": {
"aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
@@ -342,16 +343,17 @@
"ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
"ext-mongo": "Allow sending log messages to a MongoDB server",
"graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
"php-console/php-console": "Allow sending log messages to Google Chrome",
- "raven/raven": "Allow sending log messages to a Sentry server",
"rollbar/rollbar": "Allow sending log messages to Rollbar",
"ruflin/elastica": "Allow sending log messages to an Elastic Search server",
- "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib"
+ "sentry/sentry": "Allow sending log messages to a Sentry server"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.16.x-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
@@ -377,7 +379,7 @@
"logging",
"psr-3"
],
- "time": "2015-10-14 12:51:02"
+ "time": "2016-07-02 14:02:10"
},
{
"name": "mustangostang/spyc",
@@ -428,16 +430,16 @@
},
{
"name": "pear/archive_tar",
- "version": "1.4.1",
+ "version": "1.4.2",
"source": {
"type": "git",
"url": "https://github.com/pear/Archive_Tar.git",
- "reference": "fc2937c0e5a2a1c62a378d16394893172f970064"
+ "reference": "bdd47347df76dbaa89227c5e1afd6f6809985b4c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/fc2937c0e5a2a1c62a378d16394893172f970064",
- "reference": "fc2937c0e5a2a1c62a378d16394893172f970064",
+ "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/bdd47347df76dbaa89227c5e1afd6f6809985b4c",
+ "reference": "bdd47347df76dbaa89227c5e1afd6f6809985b4c",
"shasum": ""
},
"require": {
@@ -490,7 +492,7 @@
"archive",
"tar"
],
- "time": "2015-08-05 12:31:03"
+ "time": "2016-02-25 10:30:39"
},
{
"name": "pear/console_getopt",
@@ -640,16 +642,16 @@
},
{
"name": "php-di/invoker",
- "version": "1.2.0",
+ "version": "1.3.3",
"source": {
"type": "git",
"url": "https://github.com/PHP-DI/Invoker.git",
- "reference": "9949fff87fcf14e8f2ccfbe36dac1e5921944c48"
+ "reference": "1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/9949fff87fcf14e8f2ccfbe36dac1e5921944c48",
- "reference": "9949fff87fcf14e8f2ccfbe36dac1e5921944c48",
+ "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7",
+ "reference": "1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7",
"shasum": ""
},
"require": {
@@ -679,7 +681,7 @@
"invoke",
"invoker"
],
- "time": "2015-10-22 19:49:23"
+ "time": "2016-07-14 13:09:58"
},
{
"name": "php-di/php-di",
@@ -740,16 +742,16 @@
},
{
"name": "piwik/cache",
- "version": "0.2.6",
+ "version": "0.2.7",
"source": {
"type": "git",
"url": "https://github.com/piwik/component-cache.git",
- "reference": "b8f2d18069c77726862f67d0199896d13073a831"
+ "reference": "7343e8b32da72f6ed50161c9c3b43ef8f5577cd6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/piwik/component-cache/zipball/b8f2d18069c77726862f67d0199896d13073a831",
- "reference": "b8f2d18069c77726862f67d0199896d13073a831",
+ "url": "https://api.github.com/repos/piwik/component-cache/zipball/7343e8b32da72f6ed50161c9c3b43ef8f5577cd6",
+ "reference": "7343e8b32da72f6ed50161c9c3b43ef8f5577cd6",
"shasum": ""
},
"require": {
@@ -783,20 +785,20 @@
"file",
"redis"
],
- "time": "2015-09-29 16:50:32"
+ "time": "2016-07-20 23:26:18"
},
{
"name": "piwik/decompress",
- "version": "1.1.0",
+ "version": "1.2.0",
"source": {
"type": "git",
"url": "https://github.com/piwik/component-decompress.git",
- "reference": "deca40d71d29d6140aad39db007aea82676b7631"
+ "reference": "aa0a13f0ff44f70c736a72dd19ae1bcf400c6932"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/piwik/component-decompress/zipball/deca40d71d29d6140aad39db007aea82676b7631",
- "reference": "deca40d71d29d6140aad39db007aea82676b7631",
+ "url": "https://api.github.com/repos/piwik/component-decompress/zipball/aa0a13f0ff44f70c736a72dd19ae1bcf400c6932",
+ "reference": "aa0a13f0ff44f70c736a72dd19ae1bcf400c6932",
"shasum": ""
},
"require": {
@@ -819,20 +821,20 @@
"license": [
"LGPL-3.0"
],
- "time": "2015-09-22 10:58:19"
+ "time": "2016-07-19 04:13:01"
},
{
"name": "piwik/device-detector",
- "version": "3.6.1",
+ "version": "3.7.1",
"source": {
"type": "git",
"url": "https://github.com/piwik/device-detector.git",
- "reference": "4f4c2b0ce412fb1b8f679a7c82190783ba697d4c"
+ "reference": "04fddf60bbeb111bad18a9c50dd73f0a314967f2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/piwik/device-detector/zipball/4f4c2b0ce412fb1b8f679a7c82190783ba697d4c",
- "reference": "4f4c2b0ce412fb1b8f679a7c82190783ba697d4c",
+ "url": "https://api.github.com/repos/piwik/device-detector/zipball/04fddf60bbeb111bad18a9c50dd73f0a314967f2",
+ "reference": "04fddf60bbeb111bad18a9c50dd73f0a314967f2",
"shasum": ""
},
"require": {
@@ -870,7 +872,7 @@
"parser",
"useragent"
],
- "time": "2016-03-31 20:28:09"
+ "time": "2016-08-03 07:11:10"
},
{
"name": "piwik/ini",
@@ -907,16 +909,16 @@
},
{
"name": "piwik/network",
- "version": "0.1.0",
+ "version": "0.2.0",
"source": {
"type": "git",
"url": "https://github.com/piwik/component-network.git",
- "reference": "9037fa29509f86767e02ba58a57d4deb1d01a844"
+ "reference": "b270d14d9b4ddc9d63bfee4e85f08899a215ef20"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/piwik/component-network/zipball/9037fa29509f86767e02ba58a57d4deb1d01a844",
- "reference": "9037fa29509f86767e02ba58a57d4deb1d01a844",
+ "url": "https://api.github.com/repos/piwik/component-network/zipball/b270d14d9b4ddc9d63bfee4e85f08899a215ef20",
+ "reference": "b270d14d9b4ddc9d63bfee4e85f08899a215ef20",
"shasum": ""
},
"require": {
@@ -935,20 +937,20 @@
"license": [
"LGPL-3.0"
],
- "time": "2014-10-23 03:30:23"
+ "time": "2016-07-18 04:10:33"
},
{
"name": "piwik/piwik-php-tracker",
- "version": "1.0.2",
+ "version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/piwik/piwik-php-tracker.git",
- "reference": "f026613f8137c014030c96a22491ede5f5f1676b"
+ "reference": "eb4df1e223d4b377d06785c9b5fb3723d16d4465"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/piwik/piwik-php-tracker/zipball/f026613f8137c014030c96a22491ede5f5f1676b",
- "reference": "f026613f8137c014030c96a22491ede5f5f1676b",
+ "url": "https://api.github.com/repos/piwik/piwik-php-tracker/zipball/eb4df1e223d4b377d06785c9b5fb3723d16d4465",
+ "reference": "eb4df1e223d4b377d06785c9b5fb3723d16d4465",
"shasum": ""
},
"type": "library",
@@ -975,20 +977,20 @@
"piwik",
"tracker"
],
- "time": "2016-01-12 21:44:22"
+ "time": "2016-07-13 05:26:45"
},
{
"name": "piwik/referrer-spam-blacklist",
- "version": "1.0.8",
+ "version": "1.0.9",
"source": {
"type": "git",
"url": "https://github.com/piwik/referrer-spam-blacklist.git",
- "reference": "665ad115eb85a94210beecb13c57806ff474364f"
+ "reference": "7cce0bed292d148822ebad0eb9a286b04d27f340"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/piwik/referrer-spam-blacklist/zipball/665ad115eb85a94210beecb13c57806ff474364f",
- "reference": "665ad115eb85a94210beecb13c57806ff474364f",
+ "url": "https://api.github.com/repos/piwik/referrer-spam-blacklist/zipball/7cce0bed292d148822ebad0eb9a286b04d27f340",
+ "reference": "7cce0bed292d148822ebad0eb9a286b04d27f340",
"shasum": ""
},
"type": "library",
@@ -997,20 +999,20 @@
"Public Domain"
],
"description": "Community-contributed list of referrer spammers",
- "time": "2016-03-22 18:43:29"
+ "time": "2016-07-20 19:55:33"
},
{
"name": "piwik/searchengine-and-social-list",
- "version": "1.2.0",
+ "version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/piwik/searchengine-and-social-list.git",
- "reference": "276e03a2f0dfe1559f57d6e2cba9258305ecdba5"
+ "reference": "e5e09544e99cc1568d50f84ac90d1bf27d7444a0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/piwik/searchengine-and-social-list/zipball/276e03a2f0dfe1559f57d6e2cba9258305ecdba5",
- "reference": "276e03a2f0dfe1559f57d6e2cba9258305ecdba5",
+ "url": "https://api.github.com/repos/piwik/searchengine-and-social-list/zipball/e5e09544e99cc1568d50f84ac90d1bf27d7444a0",
+ "reference": "e5e09544e99cc1568d50f84ac90d1bf27d7444a0",
"shasum": ""
},
"type": "library",
@@ -1019,7 +1021,7 @@
"Public Domain"
],
"description": "Search engine and social network definitions used by Piwik",
- "time": "2016-02-17 06:55:15"
+ "time": "2016-07-13 17:20:30"
},
{
"name": "psr/log",
@@ -1061,7 +1063,7 @@
},
{
"name": "symfony/console",
- "version": "v2.6.11",
+ "version": "v2.6.13",
"target-dir": "Symfony/Component/Console",
"source": {
"type": "git",
@@ -1119,7 +1121,7 @@
},
{
"name": "symfony/event-dispatcher",
- "version": "v2.6.11",
+ "version": "v2.6.13",
"target-dir": "Symfony/Component/EventDispatcher",
"source": {
"type": "git",
@@ -1178,7 +1180,7 @@
},
{
"name": "symfony/monolog-bridge",
- "version": "v2.6.11",
+ "version": "v2.6.13",
"target-dir": "Symfony/Bridge/Monolog",
"source": {
"type": "git",
@@ -1341,16 +1343,16 @@
},
{
"name": "twig/twig",
- "version": "v1.22.3",
+ "version": "v1.24.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "ebfc36b7e77b0c1175afe30459cf943010245540"
+ "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/ebfc36b7e77b0c1175afe30459cf943010245540",
- "reference": "ebfc36b7e77b0c1175afe30459cf943010245540",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/3566d311a92aae4deec6e48682dc5a4528c4a512",
+ "reference": "3566d311a92aae4deec6e48682dc5a4528c4a512",
"shasum": ""
},
"require": {
@@ -1363,7 +1365,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.22-dev"
+ "dev-master": "1.24-dev"
}
},
"autoload": {
@@ -1398,7 +1400,7 @@
"keywords": [
"templating"
],
- "time": "2015-10-13 07:07:02"
+ "time": "2016-05-30 09:11:59"
}
],
"packages-dev": [
@@ -1645,6 +1647,7 @@
"rest",
"web service"
],
+ "abandoned": "guzzlehttp/guzzle",
"time": "2015-03-18 18:23:50"
},
{
@@ -1796,30 +1799,32 @@
},
{
"name": "phpspec/prophecy",
- "version": "v1.5.0",
+ "version": "v1.6.1",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7"
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7",
- "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.0.2",
- "phpdocumentor/reflection-docblock": "~2.0",
- "sebastian/comparator": "~1.1"
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "sebastian/recursion-context": "^1.0"
},
"require-dev": {
- "phpspec/phpspec": "~2.0"
+ "phpspec/phpspec": "^2.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4.x-dev"
+ "dev-master": "1.6.x-dev"
}
},
"autoload": {
@@ -1852,7 +1857,7 @@
"spy",
"stub"
],
- "time": "2015-08-13 10:07:40"
+ "time": "2016-06-07 08:13:47"
},
{
"name": "phpunit/php-code-coverage",
@@ -2006,21 +2011,24 @@
},
{
"name": "phpunit/php-timer",
- "version": "1.0.7",
+ "version": "1.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b"
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
- "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
+ "require-dev": {
+ "phpunit/phpunit": "~4|~5"
+ },
"type": "library",
"autoload": {
"classmap": [
@@ -2043,7 +2051,7 @@
"keywords": [
"timer"
],
- "time": "2015-06-21 08:01:12"
+ "time": "2016-05-12 18:03:57"
},
{
"name": "phpunit/php-token-stream",
@@ -2096,16 +2104,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "4.8.16",
+ "version": "4.8.26",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "625f8c345606ed0f3a141dfb88f4116f0e22978e"
+ "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/625f8c345606ed0f3a141dfb88f4116f0e22978e",
- "reference": "625f8c345606ed0f3a141dfb88f4116f0e22978e",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc1d8cd5b5de11625979125c5639347896ac2c74",
+ "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74",
"shasum": ""
},
"require": {
@@ -2119,7 +2127,7 @@
"phpunit/php-code-coverage": "~2.1",
"phpunit/php-file-iterator": "~1.4",
"phpunit/php-text-template": "~1.2",
- "phpunit/php-timer": ">=1.0.6",
+ "phpunit/php-timer": "^1.0.6",
"phpunit/phpunit-mock-objects": "~2.3",
"sebastian/comparator": "~1.1",
"sebastian/diff": "~1.2",
@@ -2164,7 +2172,7 @@
"testing",
"xunit"
],
- "time": "2015-10-23 06:48:33"
+ "time": "2016-05-17 03:09:28"
},
{
"name": "phpunit/phpunit-mock-objects",
@@ -2288,28 +2296,28 @@
},
{
"name": "sebastian/diff",
- "version": "1.3.0",
+ "version": "1.4.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
- "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"require-dev": {
- "phpunit/phpunit": "~4.2"
+ "phpunit/phpunit": "~4.8"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3-dev"
+ "dev-master": "1.4-dev"
}
},
"autoload": {
@@ -2332,24 +2340,24 @@
}
],
"description": "Diff implementation",
- "homepage": "http://www.github.com/sebastianbergmann/diff",
+ "homepage": "https://github.com/sebastianbergmann/diff",
"keywords": [
"diff"
],
- "time": "2015-02-22 15:13:53"
+ "time": "2015-12-08 07:14:41"
},
{
"name": "sebastian/environment",
- "version": "1.3.2",
+ "version": "1.3.7",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44"
+ "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44",
- "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716",
+ "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716",
"shasum": ""
},
"require": {
@@ -2386,20 +2394,20 @@
"environment",
"hhvm"
],
- "time": "2015-08-03 06:14:51"
+ "time": "2016-05-17 03:18:57"
},
{
"name": "sebastian/exporter",
- "version": "1.2.1",
+ "version": "1.2.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "7ae5513327cb536431847bcc0c10edba2701064e"
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e",
- "reference": "7ae5513327cb536431847bcc0c10edba2701064e",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
"shasum": ""
},
"require": {
@@ -2407,12 +2415,13 @@
"sebastian/recursion-context": "~1.0"
},
"require-dev": {
+ "ext-mbstring": "*",
"phpunit/phpunit": "~4.4"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-master": "1.3.x-dev"
}
},
"autoload": {
@@ -2452,7 +2461,7 @@
"export",
"exporter"
],
- "time": "2015-06-21 07:55:53"
+ "time": "2016-06-17 09:04:28"
},
{
"name": "sebastian/global-state",
@@ -2507,16 +2516,16 @@
},
{
"name": "sebastian/recursion-context",
- "version": "1.0.1",
+ "version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "994d4a811bafe801fb06dccbee797863ba2792ba"
+ "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba",
- "reference": "994d4a811bafe801fb06dccbee797863ba2792ba",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
+ "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
"shasum": ""
},
"require": {
@@ -2556,7 +2565,7 @@
],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
- "time": "2015-06-21 08:04:50"
+ "time": "2015-11-11 19:50:13"
},
{
"name": "sebastian/version",
@@ -2595,7 +2604,7 @@
},
{
"name": "symfony/var-dumper",
- "version": "v2.6.11",
+ "version": "v2.6.13",
"target-dir": "Symfony/Component/VarDumper",
"source": {
"type": "git",
@@ -2655,16 +2664,16 @@
},
{
"name": "symfony/yaml",
- "version": "v2.6.11",
+ "version": "v2.6.13",
"target-dir": "Symfony/Component/Yaml",
"source": {
"type": "git",
- "url": "https://github.com/symfony/Yaml.git",
+ "url": "https://github.com/symfony/yaml.git",
"reference": "c044d1744b8e91aaaa0d9bac683ab87ec7cbf359"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/Yaml/zipball/c044d1744b8e91aaaa0d9bac683ab87ec7cbf359",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/c044d1744b8e91aaaa0d9bac683ab87ec7cbf359",
"reference": "c044d1744b8e91aaaa0d9bac683ab87ec7cbf359",
"shasum": ""
},
@@ -2715,5 +2724,8 @@
"platform": {
"php": ">=5.3.3"
},
- "platform-dev": []
+ "platform-dev": [],
+ "platform-overrides": {
+ "php": "5.3.3"
+ }
}
diff --git a/config/environment/test.php b/config/environment/test.php
index 702bebaef0..c2bdb11dea 100644
--- a/config/environment/test.php
+++ b/config/environment/test.php
@@ -41,8 +41,15 @@ return array(
$testUseMockAuth = $c->get('test.vars.testUseMockAuth');
if ($testUseMockAuth) {
$idSitesAdmin = $c->get('test.vars.idSitesAdminAccess');
+ $idSitesView = $c->get('test.vars.idSitesViewAccess');
$access = new FakeAccess();
- if (!empty($idSitesAdmin)) {
+
+ if (!empty($idSitesView)) {
+ FakeAccess::$superUser = false;
+ FakeAccess::$idSitesView = $idSitesView;
+ FakeAccess::$idSitesAdmin = !empty($idSitesAdmin) ? $idSitesAdmin : array();
+ FakeAccess::$identity = 'viewUserLogin';
+ } elseif (!empty($idSitesAdmin)) {
FakeAccess::$superUser = false;
FakeAccess::$idSitesAdmin = $idSitesAdmin;
FakeAccess::$identity = 'adminUserLogin';
diff --git a/config/global.ini.php b/config/global.ini.php
index 9967c31da7..edf9b867a2 100644
--- a/config/global.ini.php
+++ b/config/global.ini.php
@@ -264,7 +264,7 @@ API_datatable_default_limit = 100
; (ie. there will be a new "date" column). For example set to: "rss,tsv,csv"
datatable_export_range_as_day = "rss"
-; This setting is overriden in the UI, under "User Settings".
+; This setting is overridden in the UI, under "User Settings".
; The date and period loaded by Piwik uses the defaults below. Possible values: yesterday, today.
default_day = yesterday
; Possible values: day, week, month, year.
@@ -277,14 +277,14 @@ time_before_today_archive_considered_outdated = 150
; This setting is overriden in the UI, under "General Settings".
; The default value is to allow browsers to trigger the Piwik archiving process.
-; This setting is only used if it hasn't been overriden via the UI yet, or if enable_general_settings_admin=0
+; This setting is only used if it hasn't been overridden via the UI yet, or if enable_general_settings_admin=0
enable_browser_archiving_triggering = 1
; By default, Piwik will force archiving of range periods from browser requests, even if enable_browser_archiving_triggering
-; is set to 0. This can sometimes create too much of a demand on system resources. Setting this option to 0 and setting
-; enable_browser_archiving_triggering to 0 will make sure ranges are not archived on browser request. Since the cron
-; archiver does not archive ranges, you must either disable ranges or make sure the ranges users' want to see will be
-; processed somehow.
+; is set to 0. This can sometimes create too much of a demand on system resources. Setting this option to 0 and
+; disabling browser trigger archiving will make sure ranges are not archived on browser request. Since the cron
+; archiver does not archive any custom date ranges, you must either disable range (using enabled_periods_API and enabled_periods_UI)
+; or make sure the date ranges users' want to see will be processed somehow.
archiving_range_force_on_browser_request = 1
; By default Piwik runs OPTIMIZE TABLE SQL queries to free spaces after deleting some data.
@@ -304,10 +304,12 @@ minimum_mysql_version = 4.1
; PostgreSQL minimum required version
minimum_pgsql_version = 8.3
-; Minimum adviced memory limit in php.ini file (see memory_limit value)
+; Minimum advised memory limit in php.ini file (see memory_limit value)
+; Set to "-1" to always use the configured memory_limit value in php.ini file.
minimum_memory_limit = 128
; Minimum memory limit enforced when archived via ./console core:archive
+; Set to "-1" to always use the configured memory_limit value in php.ini file.
minimum_memory_limit_when_archiving = 768
; Piwik will check that usernames and password have a minimum length, and will check that characters are "allowed"
@@ -390,6 +392,9 @@ datatable_archiving_maximum_rows_referrers = 1000
; maximum number of rows for any of the Referrers subtable (search engines by keyword, keyword by campaign, etc.)
datatable_archiving_maximum_rows_subtable_referrers = 50
+; maximum number of rows for the Users report
+datatable_archiving_maximum_rows_userid_users = 50000
+
; maximum number of rows for the Custom Variables names report
; Note: if the website is Ecommerce enabled, the two values below will be automatically set to 50000
datatable_archiving_maximum_rows_custom_variables = 1000
@@ -513,7 +518,7 @@ overlay_disable_framed_mode = 0
enable_custom_logo_check = 1
; If php is running in a chroot environment, when trying to import CSV files with createTableFromCSVFile(),
-; Mysql will try to load the chrooted path (which is imcomplete). To prevent an error, here you can specify the
+; Mysql will try to load the chrooted path (which is incomplete). To prevent an error, here you can specify the
; absolute path to the chroot environment. eg. '/path/to/piwik/chrooted/'
absolute_chroot_path =
@@ -562,9 +567,8 @@ pivot_by_filter_enable_fetch_by_segment = 0
; on a per-request basis;
pivot_by_filter_default_column_limit = 10
-; If set to 0 it will disable Piwik Pro advertisements in some places. For example in the installation screen, the
-; Piwik Pro Ad widget will be removed etc.
-piwik_pro_ads_enabled = 1
+; If set to 0 it will disable advertisements for providers of Professional Support for Piwik.
+piwik_professional_support_ads_enabled = 1
[Tracker]
@@ -584,7 +588,7 @@ use_third_party_id_cookie = 0
debug = 0
; This option is an alternative to the debug option above. When set to 1, you can debug tracker request by adding
-; a debug=1 query paramater in the URL. All other HTTP requests will not have debug enabled. For security reasons this
+; a debug=1 query parameter in the URL. All other HTTP requests will not have debug enabled. For security reasons this
; option should be only enabled if really needed and only for a short time frame. Otherwise anyone can set debug=1 and
; see the log output as well.
debug_on_demand = 0
@@ -611,7 +615,9 @@ cookie_path =
record_statistics = 1
; length of a visit in seconds. If a visitor comes back on the website visit_standard_length seconds
-; after his last page view, it will be recorded as a new visit
+; after his last page view, it will be recorded as a new visit. In case you are using the Piwik JavaScript tracker to
+; calculate the visit count correctly, make sure to call the method "setSessionCookieTimeout" eg
+; `_paq.push(['setSessionCookieTimeout', timeoutInSeconds=1800])`
visit_standard_length = 1800
; The window to look back for a previous visit by this current visitor. Defaults to visit_standard_length.
@@ -799,7 +805,9 @@ Plugins[] = Resolution
Plugins[] = DevicePlugins
Plugins[] = Heartbeat
Plugins[] = Intl
-Plugins[] = PiwikPro
+Plugins[] = ProfessionalServices
+Plugins[] = UserId
+Plugins[] = CustomPiwikJs
[PluginsInstalled]
PluginsInstalled[] = Diagnostics
diff --git a/core/API/ApiRenderer.php b/core/API/ApiRenderer.php
index 36f84e63c2..fc1c11d736 100644
--- a/core/API/ApiRenderer.php
+++ b/core/API/ApiRenderer.php
@@ -39,7 +39,12 @@ abstract class ApiRenderer
return 'Success:' . $message;
}
- public function renderException($message, \Exception $exception)
+ /**
+ * @param $message
+ * @param Exception|\Throwable $exception
+ * @return mixed
+ */
+ public function renderException($message, $exception)
{
return $message;
}
diff --git a/core/API/CORSHandler.php b/core/API/CORSHandler.php
index 779794dfcc..a22b27bd03 100644
--- a/core/API/CORSHandler.php
+++ b/core/API/CORSHandler.php
@@ -8,6 +8,7 @@
*/
namespace Piwik\API;
+use Piwik\Common;
use Piwik\Url;
class CORSHandler
@@ -26,7 +27,7 @@ class CORSHandler
{
// allow Piwik to serve data to all domains
if (in_array("*", $this->domains)) {
- header('Access-Control-Allow-Origin: *');
+ Common::sendHeader('Access-Control-Allow-Origin: *');
return;
}
@@ -34,7 +35,7 @@ class CORSHandler
if (!empty($_SERVER['HTTP_ORIGIN'])) {
$origin = $_SERVER['HTTP_ORIGIN'];
if (in_array($origin, $this->domains, true)) {
- header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
+ Common::sendHeader('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
}
}
}
diff --git a/core/API/DocumentationGenerator.php b/core/API/DocumentationGenerator.php
index bd62af025a..456e487f00 100644
--- a/core/API/DocumentationGenerator.php
+++ b/core/API/DocumentationGenerator.php
@@ -316,6 +316,7 @@ class DocumentationGenerator
$aParameters['filter_excludelowpop'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests
$aParameters['filter_excludelowpop_value'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests
$aParameters['filter_column_recursive'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests
+ $aParameters['filter_pattern'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests
$aParameters['filter_pattern_recursive'] = false; //@review without adding this, I can not set filter_sort_order in $otherRequestParameters system tests
$aParameters['filter_truncate'] = false;
$aParameters['hideColumns'] = false;
diff --git a/core/API/ResponseBuilder.php b/core/API/ResponseBuilder.php
index 3fe13f9631..bc90598f89 100644
--- a/core/API/ResponseBuilder.php
+++ b/core/API/ResponseBuilder.php
@@ -123,11 +123,11 @@ class ResponseBuilder
/**
* Returns an error $message in the requested $format
*
- * @param Exception $e
+ * @param Exception|\Throwable $e
* @throws Exception
* @return string
*/
- public function getResponseException(Exception $e)
+ public function getResponseException($e)
{
$e = $this->decorateExceptionWithDebugTrace($e);
$message = $this->formatExceptionMessage($e);
@@ -138,10 +138,10 @@ class ResponseBuilder
}
/**
- * @param Exception $e
+ * @param Exception|\Throwable $e
* @return Exception
*/
- private function decorateExceptionWithDebugTrace(Exception $e)
+ private function decorateExceptionWithDebugTrace($e)
{
// If we are in tests, show full backtrace
if (defined('PIWIK_PATH_TEST_TO_ROOT')) {
@@ -157,7 +157,11 @@ class ResponseBuilder
return $e;
}
- private function formatExceptionMessage(Exception $exception)
+ /**
+ * @param Exception|\Throwable $exception
+ * @return string
+ */
+ private function formatExceptionMessage($exception)
{
$message = $exception->getMessage();
if (\Piwik_ShouldPrintBackTraceWithMessage()) {
diff --git a/core/Application/Kernel/EnvironmentValidator.php b/core/Application/Kernel/EnvironmentValidator.php
index 321be28ef1..a94c6f98de 100644
--- a/core/Application/Kernel/EnvironmentValidator.php
+++ b/core/Application/Kernel/EnvironmentValidator.php
@@ -9,7 +9,10 @@
namespace Piwik\Application\Kernel;
use Piwik\Common;
+use Piwik\Exception\NotYetInstalledException;
+use Piwik\Filechecks;
use Piwik\Piwik;
+use Piwik\SettingsPiwik;
use Piwik\SettingsServer;
use Piwik\Translation\Translator;
@@ -37,11 +40,28 @@ class EnvironmentValidator
public function validate()
{
- $inTrackerRequest = SettingsServer::isTrackerApiRequest();
- $inConsole = Common::isPhpCliMode();
-
$this->checkConfigFileExists($this->settingsProvider->getPathGlobal());
- $this->checkConfigFileExists($this->settingsProvider->getPathLocal(), $startInstaller = !$inTrackerRequest && !$inConsole);
+
+ if(SettingsPiwik::isPiwikInstalled()) {
+ $this->checkConfigFileExists($this->settingsProvider->getPathLocal(), $startInstaller = false);
+ return;
+ }
+
+ $startInstaller = true;
+
+ if(SettingsServer::isTrackerApiRequest()) {
+ // if Piwik is not installed yet, the piwik.php should do nothing and not return an error
+ throw new NotYetInstalledException("As Piwik is not installed yet, the Tracking API cannot proceed and will exit without error.");
+ }
+
+ if(Common::isPhpCliMode()) {
+ // in CLI, do not start/redirect to installer, simply output the exception at the top
+ $startInstaller = false;
+ }
+
+ // Start the installation when config file not found
+ $this->checkConfigFileExists($this->settingsProvider->getPathLocal(), $startInstaller);
+
}
/**
@@ -55,25 +75,69 @@ class EnvironmentValidator
return;
}
- $message = $this->translator->translate('General_ExceptionConfigurationFileNotFound', array($path));
- if (Common::isPhpCliMode()) {
- $message .= "\n" . $this->translator->translate('General_ExceptionConfigurationFileNotFound2', array($path, get_current_user()));
- }
+ $message = $this->getSpecificMessageWhetherFileExistsOrNot($path);
$exception = new \Exception($message);
if ($startInstaller) {
- /**
- * Triggered when the configuration file cannot be found or read, which usually
- * means Piwik is not installed yet.
- *
- * This event can be used to start the installation process or to display a custom error message.
- *
- * @param \Exception $exception The exception that was thrown by `Config::getInstance()`.
- */
- Piwik::postEvent('Config.NoConfigurationFile', array($exception), $pending = true);
+ $this->startInstallation($exception);
} else {
throw $exception;
}
}
+
+ /**
+ * @param $exception
+ */
+ private function startInstallation($exception)
+ {
+ /**
+ * Triggered when the configuration file cannot be found or read, which usually
+ * means Piwik is not installed yet.
+ *
+ * This event can be used to start the installation process or to display a custom error message.
+ *
+ * @param \Exception $exception The exception that was thrown by `Config::getInstance()`.
+ */
+ Piwik::postEvent('Config.NoConfigurationFile', array($exception), $pending = true);
+ }
+
+ /**
+ * @param $path
+ * @return string
+ */
+ private function getMessageWhenFileExistsButNotReadable($path)
+ {
+ $format = " \n<b>» %s </b>";
+ if(Common::isPhpCliMode()) {
+ $format = "\n » %s \n";
+ }
+
+ return sprintf($format,
+ $this->translator->translate('General_ExceptionConfigurationFilePleaseCheckReadableByUser',
+ array($path, Filechecks::getUser())));
+ }
+
+ /**
+ * @param $path
+ * @return string
+ */
+ private function getSpecificMessageWhetherFileExistsOrNot($path)
+ {
+ if (!file_exists($path)) {
+ $message = $this->translator->translate('General_ExceptionConfigurationFileNotFound', array($path));
+ if (Common::isPhpCliMode()) {
+ $message .= $this->getMessageWhenFileExistsButNotReadable($path);
+ }
+ } else {
+ $message = $this->translator->translate('General_ExceptionConfigurationFileExistsButNotReadable',
+ array($path));
+ $message .= $this->getMessageWhenFileExistsButNotReadable($path);
+ }
+
+ if (Common::isPhpCliMode()) {
+ $message = "\n" . $message;
+ }
+ return $message;
+ }
}
diff --git a/core/Archive.php b/core/Archive.php
index 8bddda0922..a8b87e439e 100644
--- a/core/Archive.php
+++ b/core/Archive.php
@@ -657,6 +657,11 @@ class Archive
}
$archiveGroups[] = $archiveGroup;
}
+
+ $globalDoneFlag = Rules::getDoneFlagArchiveContainsAllPlugins($this->params->getSegment());
+ if ($globalDoneFlag !== $doneFlag) {
+ $doneFlags[$globalDoneFlag] = true;
+ }
}
$archiveGroups = array_unique($archiveGroups);
@@ -733,6 +738,8 @@ class Archive
foreach ($plugins as $plugin) {
$doneFlag = $this->getDoneStringForPlugin($plugin, $this->params->getIdSites());
$this->initializeArchiveIdCache($doneFlag);
+ $globalDoneFlag = Rules::getDoneFlagArchiveContainsAllPlugins($this->params->getSegment());
+ $this->initializeArchiveIdCache($globalDoneFlag);
}
foreach ($idarchivesByReport as $doneFlag => $idarchivesByDate) {
diff --git a/core/Archive/DataTableFactory.php b/core/Archive/DataTableFactory.php
index 6b150c90b2..0663b32ab5 100644
--- a/core/Archive/DataTableFactory.php
+++ b/core/Archive/DataTableFactory.php
@@ -402,7 +402,7 @@ class DataTableFactory
$this->setSubtables($subtable, $blobRow, $treeLevel + 1);
// we edit the subtable ID so that it matches the newly table created in memory
- // NB: we dont overwrite the datatableid in the case we are displaying the table expanded.
+ // NB: we don't overwrite the datatableid in the case we are displaying the table expanded.
if ($this->addMetadataSubtableId) {
// this will be written back to the column 'idsubdatatable' just before rendering,
// see Renderer/Php.php
diff --git a/core/ArchiveProcessor/Rules.php b/core/ArchiveProcessor/Rules.php
index 7f37b3250c..8e027cda43 100644
--- a/core/ArchiveProcessor/Rules.php
+++ b/core/ArchiveProcessor/Rules.php
@@ -163,6 +163,12 @@ class Rules
return Config::getInstance()->General['time_before_today_archive_considered_outdated'];
}
+ public static function isBrowserArchivingAvailableForSegments()
+ {
+ $generalConfig = Config::getInstance()->General;
+ return !$generalConfig['browser_archiving_disabled_enforce'];
+ }
+
public static function isArchivingDisabledFor(array $idSites, Segment $segment, $periodLabel)
{
$generalConfig = Config::getInstance()->General;
@@ -187,7 +193,7 @@ class Rules
// When there is a segment, we disable archiving when browser_archiving_disabled_enforce applies
if (!$segment->isEmpty()
&& !$isArchivingEnabled
- && $generalConfig['browser_archiving_disabled_enforce']
+ && !self::isBrowserArchivingAvailableForSegments()
&& !SettingsServer::isArchivePhpTriggered() // Only applies when we are not running core:archive command
) {
Log::debug("Archiving is disabled because of config setting browser_archiving_disabled_enforce=1");
diff --git a/core/AssetManager.php b/core/AssetManager.php
index 7abcf51ccc..455c183615 100644
--- a/core/AssetManager.php
+++ b/core/AssetManager.php
@@ -68,12 +68,13 @@ class AssetManager extends Singleton
public function __construct()
{
$this->cacheBuster = UIAssetCacheBuster::getInstance();
- $this->minimalStylesheetFetcher = new StaticUIAssetFetcher(array(), array(), $this->theme);
$theme = Manager::getInstance()->getThemeEnabled();
if (!empty($theme)) {
$this->theme = new Theme();
}
+
+ $this->minimalStylesheetFetcher = new StaticUIAssetFetcher(array(), array(), $this->theme);
}
/**
diff --git a/core/AssetManager/UIAssetFetcher/StylesheetUIAssetFetcher.php b/core/AssetManager/UIAssetFetcher/StylesheetUIAssetFetcher.php
index 0d0d36229f..9edea7a635 100644
--- a/core/AssetManager/UIAssetFetcher/StylesheetUIAssetFetcher.php
+++ b/core/AssetManager/UIAssetFetcher/StylesheetUIAssetFetcher.php
@@ -16,7 +16,11 @@ class StylesheetUIAssetFetcher extends UIAssetFetcher
protected function getPriorityOrder()
{
$theme = $this->getTheme();
- $themeName = $theme->getThemeName();
+ if (empty($theme)) {
+ $themeName = 'Morpheus';
+ } else {
+ $themeName = $theme->getThemeName();
+ }
$order = array(
'plugins/Morpheus/stylesheets/base/bootstrap.css',
@@ -76,7 +80,7 @@ class StylesheetUIAssetFetcher extends UIAssetFetcher
if (!$theme) {
return;
}
- $themeStylesheet = $this->getTheme()->getStylesheet();
+ $themeStylesheet = $theme->getStylesheet();
if ($themeStylesheet) {
$this->fileLocations[] = $themeStylesheet;
diff --git a/core/CliMulti/Process.php b/core/CliMulti/Process.php
index e1d702fdf1..db2d5b2cd0 100644
--- a/core/CliMulti/Process.php
+++ b/core/CliMulti/Process.php
@@ -14,7 +14,7 @@ use Piwik\SettingsServer;
/**
* There are three different states
* - PID file exists with empty content: Process is created but not started
- * - PID file exists with the actual process PID as content: Process is runnning
+ * - PID file exists with the actual process PID as content: Process is running
* - PID file does not exist: Process is marked as finished
*
* Class Process
@@ -235,7 +235,7 @@ class Process
return true;
}
// Testing if /proc is a resource with @fopen fails on systems with open_basedir set.
- // by using stat we not only test the existance of /proc but also confirm it's a 'proc' filesystem
+ // by using stat we not only test the existence of /proc but also confirm it's a 'proc' filesystem
$type = @shell_exec('stat -f -c "%T" /proc 2>/dev/null');
return strpos($type, 'proc') === 0;
}
diff --git a/core/Common.php b/core/Common.php
index 03e05214c7..c332e682f2 100644
--- a/core/Common.php
+++ b/core/Common.php
@@ -1162,7 +1162,7 @@ class Common
if (isset($GLOBALS['PIWIK_TRACKER_DEBUG']) && $GLOBALS['PIWIK_TRACKER_DEBUG']) {
if (!headers_sent()) {
// prevent XSS in tracker debug output
- header('Content-type: text/plain');
+ Common::sendHeader('Content-type: text/plain');
}
if (is_object($info)) {
diff --git a/core/Config.php b/core/Config.php
index adc3ba948d..01fa144a5c 100644
--- a/core/Config.php
+++ b/core/Config.php
@@ -12,6 +12,7 @@ namespace Piwik;
use Exception;
use Piwik\Application\Kernel\GlobalSettingsProvider;
use Piwik\Container\StaticContainer;
+use Piwik\ProfessionalServices\Advertising;
/**
* Singleton that provides read & write access to Piwik's INI configuration.
@@ -158,7 +159,7 @@ class Config
'autocomplete_min_sites' => $general['autocomplete_min_sites'],
'datatable_export_range_as_day' => $general['datatable_export_range_as_day'],
'datatable_row_limits' => $this->getDatatableRowLimits(),
- 'are_ads_enabled' => $general['piwik_pro_ads_enabled']
+ 'are_ads_enabled' => Advertising::isAdsEnabledInConfig($general)
);
}
diff --git a/core/Console.php b/core/Console.php
index 6b0c59297f..e326211ef8 100644
--- a/core/Console.php
+++ b/core/Console.php
@@ -209,12 +209,6 @@ class Console extends Application
$commands = array(
'Piwik\CliMulti\RequestCommand'
);
-
- if (class_exists('Piwik\Plugins\EnterpriseAdmin\EnterpriseAdmin')) {
- $extra = new \Piwik\Plugins\EnterpriseAdmin\EnterpriseAdmin();
- $extra->addConsoleCommands($commands);
- }
-
return $commands;
}
}
diff --git a/core/CronArchive.php b/core/CronArchive.php
index 1ca869fc7e..9d3ce6e006 100644
--- a/core/CronArchive.php
+++ b/core/CronArchive.php
@@ -650,7 +650,7 @@ class CronArchive
*/
$success = $this->processArchiveForPeriods($idSite, $lastTimestampWebsiteProcessedPeriods);
- // Record succesful run of this website's periods archiving
+ // Record successful run of this website's periods archiving
if ($success) {
Option::set($this->lastRunKey($idSite, "periods"), time());
}
@@ -795,7 +795,7 @@ class CronArchive
|| !is_array($daysResponse)
|| count($daysResponse) == 0
) {
- // cancel the succesful run flag
+ // cancel the successful run flag
Option::set($this->lastRunKey($idSite, "day"), 0);
// cancel marking the site as reprocessed
@@ -841,7 +841,7 @@ class CronArchive
$this->visitsToday += $visitsToday;
$this->websitesWithVisitsSinceLastRun++;
- $this->archiveReportsFor($idSite, "day", $this->getApiDateParameter($idSite, "day", $processDaysSince), $archiveSegments = true, $timer);
+ $this->archiveReportsFor($idSite, "day", $this->getApiDateParameter($idSite, "day", $processDaysSince), $archiveSegments = true, $timer, $visitsToday, $visitsLastDays);
return true;
}
@@ -881,14 +881,17 @@ class CronArchive
* @param $date string
* @param $archiveSegments bool Whether to pre-process all custom segments
* @param Timer $periodTimer
+ * @param $visitsToday int Visits for the "day" period of today
+ * @param $visitsLastDays int Visits for the last N days periods
* @return bool True on success, false if some request failed
*/
- private function archiveReportsFor($idSite, $period, $date, $archiveSegments, Timer $periodTimer)
+ private function archiveReportsFor($idSite, $period, $date, $archiveSegments, Timer $periodTimer, $visitsToday = 0, $visitsLastDays = 0)
{
$url = $this->getVisitsRequestUrl($idSite, $period, $date, $segment = false);
$url = $this->makeRequestUrl($url);
- $visitsInLastPeriods = $visitsLastPeriod = 0;
+ $visitsInLastPeriod = $visitsToday;
+ $visitsInLastPeriods = $visitsLastDays;
$success = true;
$urls = array();
@@ -933,11 +936,11 @@ class CronArchive
}
$visitsInLastPeriods = $this->getVisitsFromApiResponse($stats);
- $visitsLastPeriod = $this->getVisitsLastPeriodFromApiResponse($stats);
+ $visitsInLastPeriod = $this->getVisitsLastPeriodFromApiResponse($stats);
}
}
- $this->logArchivedWebsite($idSite, $period, $date, $segmentRequestsCount, $visitsInLastPeriods, $visitsLastPeriod, $periodTimer);
+ $this->logArchivedWebsite($idSite, $period, $date, $segmentRequestsCount, $visitsInLastPeriods, $visitsInLastPeriod, $periodTimer);
return $success;
}
@@ -969,7 +972,13 @@ class CronArchive
{
$message = "Got invalid response from API request: $url. ";
if (empty($response)) {
- $message .= "The response was empty. This usually means a server error. This solution to this error is generally to increase the value of 'memory_limit' in your php.ini file. Please check your Web server Error Log file for more details.";
+ $message .= "The response was empty. This usually means a server error. A solution to this error is generally to increase the value of 'memory_limit' in your php.ini file. ";
+
+ if($this->makeCliMulti()->supportsAsync()) {
+ $message .= " For more information and the error message please check in your PHP CLI error log file. As this core:archive command triggers PHP processes over the CLI, you can find where PHP CLI logs are stored by running this command: php -i | grep error_log";
+ } else {
+ $message .= " For more information and the error message please check your web server's error Log file. As this core:archive command triggers PHP processes over HTTP, you can find the error message in your Piwik's web server error logs. ";
+ }
} else {
$message .= "Response was '$response'";
}
@@ -1092,7 +1101,7 @@ class CronArchive
$listSiteIds = implode(',', $siteIds);
try {
- $this->logger->info('Will invalidate archived reports for ' . $date . ' for following websites ids: ' . $listSiteIds);
+ $this->logger->info('- Will invalidate archived reports for ' . $date . ' for following websites ids: ' . $listSiteIds);
$this->getApiToInvalidateArchivedReport()->invalidateArchivedReports($siteIds, $date);
} catch (Exception $e) {
$this->logger->info('Failed to invalidate archived reports: ' . $e->getMessage());
diff --git a/core/DataAccess/LogQueryBuilder.php b/core/DataAccess/LogQueryBuilder.php
index c65f36bf10..186ed0d96e 100644
--- a/core/DataAccess/LogQueryBuilder.php
+++ b/core/DataAccess/LogQueryBuilder.php
@@ -10,11 +10,23 @@
namespace Piwik\DataAccess;
use Exception;
-use Piwik\Common;
+use Piwik\DataAccess\LogQueryBuilder\JoinGenerator;
+use Piwik\DataAccess\LogQueryBuilder\JoinTables;
+use Piwik\Plugin\LogTablesProvider;
use Piwik\Segment\SegmentExpression;
class LogQueryBuilder
{
+ /**
+ * @var LogTablesProvider
+ */
+ private $logTableProvider;
+
+ public function __construct(LogTablesProvider $logTablesProvider)
+ {
+ $this->logTableProvider = $logTablesProvider;
+ }
+
public function getSelectQueryString(SegmentExpression $segmentExpression, $select, $from, $where, $bind, $groupBy,
$orderBy, $limitAndOffset)
{
@@ -31,9 +43,11 @@ class LogQueryBuilder
$bind = array_merge($bind, $segmentSql['bind']);
}
- $joins = $this->generateJoinsString($from);
- $joinWithSubSelect = $joins['joinWithSubSelect'];
- $from = $joins['sql'];
+ $tables = new JoinTables($this->logTableProvider, $from);
+ $join = new JoinGenerator($tables);
+ $join->generate();
+ $from = $join->getJoinString();
+ $joinWithSubSelect = $join->shouldJoinWithSelect();
// hack for https://github.com/piwik/piwik/issues/9194#issuecomment-164321612
$useSpecialConversionGroupBy = (!empty($segmentSql)
@@ -55,192 +69,15 @@ class LogQueryBuilder
);
}
- private function hasJoinedTableAlreadyManually($tableToFind, $joinToFind, $tables)
+ private function getKnownTables()
{
- foreach ($tables as $index => $table) {
- if (is_array($table)
- && !empty($table['table'])
- && $table['table'] === $tableToFind
- && (!isset($table['tableAlias']) || $table['tableAlias'] === $tableToFind)
- && isset($table['joinOn']) && $table['joinOn'] === $joinToFind) {
- return true;
- }
+ $names = array();
+ foreach ($this->logTableProvider->getAllLogTables() as $logTable) {
+ $names[] = $logTable->getName();
}
-
- return false;
+ return $names;
}
- private function findIndexOfManuallyAddedTable($tableToFind, $tables)
- {
- foreach ($tables as $index => $table) {
- if (is_array($table)
- && !empty($table['table'])
- && $table['table'] === $tableToFind
- && (!isset($table['tableAlias']) || $table['tableAlias'] === $tableToFind)) {
- return $index;
- }
- }
- }
-
- private function hasTableAddedManually($tableToFind, $tables)
- {
- $table = $this->findIndexOfManuallyAddedTable($tableToFind, $tables);
-
- return isset($table);
- }
-
- /**
- * Generate the join sql based on the needed tables
- * @param array $tables tables to join
- * @throws Exception if tables can't be joined
- * @return array
- */
- private function generateJoinsString(&$tables)
- {
- $knownTables = array("log_action", "log_visit", "log_link_visit_action", "log_conversion", "log_conversion_item");
- $visitsAvailable = $linkVisitActionsTableAvailable = $conversionsAvailable = $conversionItemAvailable = $actionsTableAvailable = false;
- $defaultLogActionJoin = "log_link_visit_action.idaction_url = log_action.idaction";
-
- $joinWithSubSelect = false;
- $sql = '';
-
- // make sure the tables are joined in the right order
- // base table first, then action before conversion
- // this way, conversions can be left joined on idvisit
- $actionIndex = array_search("log_link_visit_action", $tables);
- $conversionIndex = array_search("log_conversion", $tables);
- if ($actionIndex > 0 && $conversionIndex > 0 && $actionIndex > $conversionIndex) {
- $tables[$actionIndex] = "log_conversion";
- $tables[$conversionIndex] = "log_link_visit_action";
- }
- // same as above: action before visit
- $actionIndex = array_search("log_link_visit_action", $tables);
- $visitIndex = array_search("log_visit", $tables);
- if ($actionIndex > 0 && $visitIndex > 0 && $actionIndex > $visitIndex) {
- $tables[$actionIndex] = "log_visit";
- $tables[$visitIndex] = "log_link_visit_action";
- }
-
- // we need to add log_link_visit_action dynamically to join eg visit with action
- $linkVisitAction = array_search("log_link_visit_action", $tables);
- $actionIndex = array_search("log_action", $tables);
- if ($linkVisitAction === false && $actionIndex > 0) {
- $tables[] = "log_link_visit_action";
- }
-
- if ($actionIndex > 0
- && $this->hasTableAddedManually('log_action', $tables)
- && !$this->hasJoinedTableAlreadyManually('log_action', $defaultLogActionJoin, $tables)) {
- // we cannot join the same table with same alias twice, therefore we need to combine the join via AND
- $tableIndex = $this->findIndexOfManuallyAddedTable('log_action', $tables);
- $defaultLogActionJoin = '(' . $tables[$tableIndex]['joinOn'] . ' AND ' . $defaultLogActionJoin . ')';
- unset($tables[$tableIndex]);
- }
-
- $linkVisitAction = array_search("log_link_visit_action", $tables);
- $actionIndex = array_search("log_action", $tables);
- if ($linkVisitAction > 0 && $actionIndex > 0 && $linkVisitAction > $actionIndex) {
- $tables[$actionIndex] = "log_link_visit_action";
- $tables[$linkVisitAction] = "log_action";
- }
-
- foreach ($tables as $i => $table) {
- if (is_array($table)) {
- // join condition provided
- $alias = isset($table['tableAlias']) ? $table['tableAlias'] : $table['table'];
- $sql .= "
- LEFT JOIN " . Common::prefixTable($table['table']) . " AS " . $alias
- . " ON " . $table['joinOn'];
- continue;
- }
-
- if (!in_array($table, $knownTables)) {
- throw new Exception("Table '$table' can't be used for segmentation");
- }
-
- $tableSql = Common::prefixTable($table) . " AS $table";
-
- if ($i == 0) {
- // first table
- $sql .= $tableSql;
- } else {
-
- if ($linkVisitActionsTableAvailable && $table === 'log_action') {
- $join = $defaultLogActionJoin;
-
- if ($this->hasJoinedTableAlreadyManually($table, $join, $tables)) {
- $actionsTableAvailable = true;
- continue;
- }
-
- } elseif ($linkVisitActionsTableAvailable && $table == "log_conversion") {
- // have actions, need conversions => join on idvisit
- $join = "log_conversion.idvisit = log_link_visit_action.idvisit";
- } elseif ($linkVisitActionsTableAvailable && $table == "log_visit") {
- // have actions, need visits => join on idvisit
- $join = "log_visit.idvisit = log_link_visit_action.idvisit";
-
- if ($this->hasJoinedTableAlreadyManually($table, $join, $tables)) {
- $visitsAvailable = true;
- continue;
- }
-
- } elseif ($visitsAvailable && $table == "log_link_visit_action") {
- // have visits, need actions => we have to use a more complex join
- // we don't hande this here, we just return joinWithSubSelect=true in this case
- $joinWithSubSelect = true;
- $join = "log_link_visit_action.idvisit = log_visit.idvisit";
-
- if ($this->hasJoinedTableAlreadyManually($table, $join, $tables)) {
- $linkVisitActionsTableAvailable = true;
- continue;
- }
-
- } elseif ($conversionsAvailable && $table == "log_link_visit_action") {
- // have conversions, need actions => join on idvisit
- $join = "log_conversion.idvisit = log_link_visit_action.idvisit";
- } elseif (($visitsAvailable && $table == "log_conversion")
- || ($conversionsAvailable && $table == "log_visit")
- ) {
- // have visits, need conversion (or vice versa) => join on idvisit
- // notice that joining conversions on visits has lower priority than joining it on actions
- $join = "log_conversion.idvisit = log_visit.idvisit";
-
- // if conversions are joined on visits, we need a complex join
- if ($table == "log_conversion") {
- $joinWithSubSelect = true;
- }
- } elseif ($conversionItemAvailable && $table === 'log_visit') {
- $join = "log_conversion_item.idvisit = log_visit.idvisit";
- } elseif ($conversionItemAvailable && $table === 'log_link_visit_action') {
- $join = "log_conversion_item.idvisit = log_link_visit_action.idvisit";
- } elseif ($conversionItemAvailable && $table === 'log_conversion') {
- $join = "log_conversion_item.idvisit = log_conversion.idvisit";
- } else {
- throw new Exception("Table '$table' can't be joined for segmentation");
- }
-
- // the join sql the default way
- $sql .= "
- LEFT JOIN $tableSql ON $join";
- }
-
- // remember which tables are available
- $visitsAvailable = ($visitsAvailable || $table == "log_visit");
- $linkVisitActionsTableAvailable = ($linkVisitActionsTableAvailable || $table == "log_link_visit_action");
- $actionsTableAvailable = ($actionsTableAvailable || $table == "log_action");
- $conversionsAvailable = ($conversionsAvailable || $table == "log_conversion");
- $conversionItemAvailable = ($conversionItemAvailable || $table == "log_conversion_item");
- }
-
- $return = array(
- 'sql' => $sql,
- 'joinWithSubSelect' => $joinWithSubSelect
- );
- return $return;
- }
-
-
/**
* Build a select query where actions have to be joined on visits (or conversions)
* In this case, the query gets wrapped in another query so that grouping by visit is possible
@@ -256,7 +93,7 @@ class LogQueryBuilder
*/
private function buildWrappedSelectQuery($select, $from, $where, $groupBy, $orderBy, $limitAndOffset, $innerGroupBy = null)
{
- $matchTables = "(log_visit|log_conversion_item|log_conversion|log_action)";
+ $matchTables = '(' . implode('|', $this->getKnownTables()) . ')';
preg_match_all("/". $matchTables ."\.[a-z0-9_\*]+/", $select, $matches);
$neededFields = array_unique($matches[0]);
diff --git a/core/DataAccess/LogQueryBuilder/JoinGenerator.php b/core/DataAccess/LogQueryBuilder/JoinGenerator.php
new file mode 100644
index 0000000000..1bd3ab3912
--- /dev/null
+++ b/core/DataAccess/LogQueryBuilder/JoinGenerator.php
@@ -0,0 +1,264 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\DataAccess\LogQueryBuilder;
+
+use Exception;
+use Piwik\Common;
+use Piwik\Tracker\LogTable;
+
+class JoinGenerator
+{
+ /**
+ * @var JoinTables
+ */
+ protected $tables;
+
+ /**
+ * @var bool
+ */
+ private $joinWithSubSelect = false;
+
+ /**
+ * @var string
+ */
+ private $joinString = '';
+
+ /**
+ * @var array
+ */
+ private $nonVisitJoins = array();
+
+ public function __construct(JoinTables $tables)
+ {
+ $this->tables = $tables;
+ $this->addMissingTablesNeededForJoins();
+ }
+
+ private function addMissingTablesNeededForJoins()
+ {
+ foreach ($this->tables as $index => $table) {
+ if (is_array($table)) {
+ continue;
+ }
+
+ $logTable = $this->tables->getLogTable($table);
+
+ if (!$logTable->getColumnToJoinOnIdVisit()) {
+ $tableNameToJoin = $logTable->getLinkTableToBeAbleToJoinOnVisit();
+
+ if ($index > 0 && !$this->tables->hasJoinedTable($tableNameToJoin)) {
+ $this->tables->addTableToJoin($tableNameToJoin);
+ }
+
+ if ($this->tables->hasJoinedTable($tableNameToJoin)) {
+ $this->generateNonVisitJoins($table, $tableNameToJoin, $index);
+ }
+ }
+ }
+ }
+
+ /**
+ * Generate the join sql based on the needed tables
+ * @throws Exception if tables can't be joined
+ * @return array
+ */
+ public function generate()
+ {
+ /** @var LogTable[] $availableLogTables */
+ $availableLogTables = array();
+
+ $this->tables->sort(array($this, 'sortTablesForJoin'));
+
+ foreach ($this->tables as $i => $table) {
+ if (is_array($table)) {
+
+ // join condition provided
+ $alias = isset($table['tableAlias']) ? $table['tableAlias'] : $table['table'];
+ $this->joinString .= " LEFT JOIN " . Common::prefixTable($table['table']) . " AS " . $alias
+ . " ON " . $table['joinOn'];
+ continue;
+ }
+
+ $tableSql = Common::prefixTable($table) . " AS $table";
+
+ $logTable = $this->tables->getLogTable($table);
+
+ if ($i == 0) {
+ // first table
+ $this->joinString .= $tableSql;
+ } else {
+
+ $join = $this->findJoinCriteriasForTables($logTable, $availableLogTables);
+
+ if ($join === null) {
+ $availableLogTables[$table] = $logTable;
+ continue;
+ }
+
+ // the join sql the default way
+ $this->joinString .= " LEFT JOIN $tableSql ON " . $join;
+ }
+
+ $availableLogTables[$table] = $logTable;
+ }
+ }
+
+ public function getJoinString()
+ {
+ return $this->joinString;
+ }
+
+ public function shouldJoinWithSelect()
+ {
+ return $this->joinWithSubSelect;
+ }
+
+ /**
+ * @param LogTable $logTable
+ * @param LogTable[] $availableLogTables
+ * @return string|null returns null in case the table is already joined, or the join string if the table needs
+ * to be joined
+ * @throws Exception if table cannot be joined for segmentation
+ */
+ protected function findJoinCriteriasForTables(LogTable $logTable, $availableLogTables)
+ {
+ $join = null;
+ $alternativeJoin = null;
+ $table = $logTable->getName();
+
+ foreach ($availableLogTables as $availableLogTable) {
+ if ($logTable->getColumnToJoinOnIdVisit() && $availableLogTable->getColumnToJoinOnIdVisit()) {
+
+ $join = sprintf("%s.%s = %s.%s", $table, $logTable->getColumnToJoinOnIdVisit(),
+ $availableLogTable->getName(), $availableLogTable->getColumnToJoinOnIdVisit());
+ $alternativeJoin = sprintf("%s.%s = %s.%s", $availableLogTable->getName(), $availableLogTable->getColumnToJoinOnIdVisit(),
+ $table, $logTable->getColumnToJoinOnIdVisit());
+
+ if ($availableLogTable->shouldJoinWithSubSelect()) {
+ $this->joinWithSubSelect = true;
+ }
+
+ break;
+ }
+
+ if ($logTable->getColumnToJoinOnIdAction() && $availableLogTable->getColumnToJoinOnIdAction()) {
+ if (isset($this->nonVisitJoins[$logTable->getName()][$availableLogTable->getName()])) {
+ $join = $this->nonVisitJoins[$logTable->getName()][$availableLogTable->getName()];
+ }
+
+ break;
+ }
+ }
+
+ if (!isset($join)) {
+ throw new Exception("Table '$table' can't be joined for segmentation");
+ }
+
+ if ($this->tables->hasJoinedTableManually($table, $join)
+ || $this->tables->hasJoinedTableManually($table, $alternativeJoin)) {
+ // already joined, no need to join it again
+ return null;
+ }
+
+ return $join;
+ }
+
+ /**
+ * This code is a bit tricky. We have to execute this right at the beginning before actually iterating over all the
+ * tables and generating the join string as we may have to delete a table from the tables. If we did not delete
+ * this table upfront, we would have maybe already added a joinString for that table, even though it will be later
+ * removed by another table. This means if we wouldn't delete/unset that table upfront, we would need to alter
+ * an already generated join string which would not be really nice code as well.
+ *
+ * Next problem is, because we are deleting a table, we have to remember the "joinOn" string for that table in a
+ * property "nonVisitJoins". Otherwise we would not be able to generate the correct "joinOn" string when actually
+ * iterating over all the tables to generate that string.
+ *
+ * @param $tableName
+ * @param $tableNameToJoin
+ * @param $index
+ */
+ protected function generateNonVisitJoins($tableName, $tableNameToJoin, $index)
+ {
+ $logTable = $this->tables->getLogTable($tableName);
+ $logTableToJoin = $this->tables->getLogTable($tableNameToJoin);
+
+ $nonVisitJoin = sprintf("%s.%s = %s.%s", $logTableToJoin->getName(), $logTableToJoin->getColumnToJoinOnIdAction(),
+ $tableName, $logTable->getColumnToJoinOnIdAction());
+
+ $altNonVisitJoin = sprintf("%s.%s = %s.%s", $tableName, $logTable->getColumnToJoinOnIdAction(),
+ $logTableToJoin->getName(), $logTableToJoin->getColumnToJoinOnIdAction());
+
+ if ($index > 0
+ && $this->tables->hasAddedTableManually($tableName)
+ && !$this->tables->hasJoinedTableManually($tableName, $nonVisitJoin)
+ && !$this->tables->hasJoinedTableManually($tableName, $altNonVisitJoin)) {
+ $tableIndex = $this->tables->findIndexOfManuallyAddedTable($tableName);
+ $nonVisitJoin = '(' . $this->tables[$tableIndex]['joinOn'] . ' AND ' . $nonVisitJoin . ')';
+ unset($this->tables[$tableIndex]);
+ }
+
+ if (!isset($this->nonVisitJoins[$tableName])) {
+ $this->nonVisitJoins[$tableName] = array();
+ }
+
+ if (!isset($this->nonVisitJoins[$tableNameToJoin])) {
+ $this->nonVisitJoins[$tableNameToJoin] = array();
+ }
+
+ $this->nonVisitJoins[$tableName][$tableNameToJoin] = $nonVisitJoin;
+ $this->nonVisitJoins[$tableNameToJoin][$tableName] = $nonVisitJoin;
+ }
+
+ public function sortTablesForJoin($tA, $tB)
+ {
+ $coreSort = array(
+ 'log_link_visit_action' => 0,
+ 'log_action' => 1,
+ 'log_visit' => 2,
+ 'log_conversion' => 3,
+ 'log_conversion_item' => 4
+ );
+
+ if (is_array($tA) && is_array($tB)) {
+ return 0;
+ }
+
+ if (is_array($tA)) {
+ return -1;
+ }
+
+ if (is_array($tB)) {
+ return 1;
+ }
+
+ if (isset($coreSort[$tA])) {
+ $weightA = $coreSort[$tA];
+ } else {
+ $weightA = 999;
+ }
+ if (isset($coreSort[$tB])) {
+ $weightB = $coreSort[$tB];
+ } else {
+ $weightB = 999;
+ }
+
+ if ($weightA === $weightB) {
+ return 0;
+ }
+
+ if ($weightA > $weightB) {
+ return 1;
+ }
+
+ return -1;
+ }
+
+}
diff --git a/core/DataAccess/LogQueryBuilder/JoinTables.php b/core/DataAccess/LogQueryBuilder/JoinTables.php
new file mode 100644
index 0000000000..d840cfba3f
--- /dev/null
+++ b/core/DataAccess/LogQueryBuilder/JoinTables.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\DataAccess\LogQueryBuilder;
+
+use Exception;
+use Piwik\Plugin\LogTablesProvider;
+
+class JoinTables extends \ArrayObject
+{
+ /**
+ * @var LogTablesProvider
+ */
+ private $logTableProvider;
+
+ /**
+ * Tables constructor.
+ * @param LogTablesProvider $logTablesProvider
+ * @param array $tables
+ */
+ public function __construct(LogTablesProvider $logTablesProvider, $tables)
+ {
+ $this->logTableProvider = $logTablesProvider;
+
+ foreach ($tables as $table) {
+ $this->checkTableCanBeUsedForSegmentation($table);
+ }
+
+ $this->exchangeArray(array_values($tables));
+ }
+
+ public function getTables()
+ {
+ return $this->getArrayCopy();
+ }
+
+ public function addTableToJoin($tableName)
+ {
+ $this->checkTableCanBeUsedForSegmentation($tableName);
+ $this->append($tableName);
+ }
+
+ public function hasJoinedTable($tableName)
+ {
+ return in_array($tableName, $this->getTables());
+ }
+
+ public function hasJoinedTableManually($tableToFind, $joinToFind)
+ {
+ foreach ($this as $table) {
+ if (is_array($table)
+ && !empty($table['table'])
+ && $table['table'] === $tableToFind
+ && (!isset($table['tableAlias']) || $table['tableAlias'] === $tableToFind)
+ && isset($table['joinOn']) && $table['joinOn'] === $joinToFind) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function getLogTable($tableName)
+ {
+ return $this->logTableProvider->getLogTable($tableName);
+ }
+
+ public function findIndexOfManuallyAddedTable($tableNameToFind)
+ {
+ foreach ($this as $index => $table) {
+ if (is_array($table)
+ && !empty($table['table'])
+ && $table['table'] === $tableNameToFind
+ && (!isset($table['tableAlias']) || $table['tableAlias'] === $tableNameToFind)) {
+ return $index;
+ }
+ }
+ }
+
+ public function hasAddedTableManually($tableToFind)
+ {
+ $table = $this->findIndexOfManuallyAddedTable($tableToFind);
+
+ return isset($table);
+ }
+
+ public function sort($cmpFunction)
+ {
+ // we do not use $this->uasort as we do not want to maintain keys
+ $tables = $this->getTables();
+
+ // we need to make sure first table always comes first, only sort tables after the first table
+ $firstTable = array_shift($tables);
+ usort($tables, $cmpFunction);
+ array_unshift($tables, $firstTable);
+
+ $this->exchangeArray($tables);
+ }
+
+ private function checkTableCanBeUsedForSegmentation($tableName)
+ {
+ if (!is_array($tableName) && !$this->getLogTable($tableName)) {
+ throw new Exception("Table '$tableName' can't be used for segmentation");
+ }
+ }
+
+
+}
diff --git a/core/DataAccess/RawLogDao.php b/core/DataAccess/RawLogDao.php
index 7310267b44..8095963005 100644
--- a/core/DataAccess/RawLogDao.php
+++ b/core/DataAccess/RawLogDao.php
@@ -114,46 +114,15 @@ class RawLogDao
}
/**
- * Deletes visits with the supplied IDs from log_visit. This method does not cascade, so rows in other tables w/
- * the same visit ID will still exist.
- *
- * @param int[] $idVisits
- * @return int The number of deleted rows.
- */
- public function deleteVisits($idVisits)
- {
- $sql = "DELETE FROM `" . Common::prefixTable('log_visit') . "` WHERE idvisit IN "
- . $this->getInFieldExpressionWithInts($idVisits);
-
- $statement = Db::query($sql);
- return $statement->rowCount();
- }
-
- /**
- * Deletes visit actions for the supplied visit IDs from log_link_visit_action.
- *
- * @param int[] $visitIds
- * @return int The number of deleted rows.
- */
- public function deleteVisitActionsForVisits($visitIds)
- {
- $sql = "DELETE FROM `" . Common::prefixTable('log_link_visit_action') . "` WHERE idvisit IN "
- . $this->getInFieldExpressionWithInts($visitIds);
-
- $statement = Db::query($sql);
- return $statement->rowCount();
- }
-
- /**
* Deletes conversions for the supplied visit IDs from log_conversion. This method does not cascade, so
* conversion items will not be deleted.
*
* @param int[] $visitIds
* @return int The number of deleted rows.
*/
- public function deleteConversions($visitIds)
+ public function deleteFromLogTable($tableName, $visitIds)
{
- $sql = "DELETE FROM `" . Common::prefixTable('log_conversion') . "` WHERE idvisit IN "
+ $sql = "DELETE FROM `" . Common::prefixTable($tableName) . "` WHERE idvisit IN "
. $this->getInFieldExpressionWithInts($visitIds);
$statement = Db::query($sql);
diff --git a/core/DataTable/Filter/ExcludeLowPopulation.php b/core/DataTable/Filter/ExcludeLowPopulation.php
index e6a423ef50..1555cc3279 100644
--- a/core/DataTable/Filter/ExcludeLowPopulation.php
+++ b/core/DataTable/Filter/ExcludeLowPopulation.php
@@ -55,7 +55,7 @@ class ExcludeLowPopulation extends BaseFilter
* `$minimumPercentageThreshold` is used.
* @param bool|float $minimumPercentageThreshold If supplied, column values must be a greater
* percentage of the sum of all column values than
- * this precentage.
+ * this percentage.
*/
public function __construct($table, $columnToFilter, $minimumValue, $minimumPercentageThreshold = false)
{
diff --git a/core/DataTable/Filter/PatternRecursive.php b/core/DataTable/Filter/PatternRecursive.php
index 62a8b26bd9..616c37289e 100644
--- a/core/DataTable/Filter/PatternRecursive.php
+++ b/core/DataTable/Filter/PatternRecursive.php
@@ -56,7 +56,7 @@ class PatternRecursive extends BaseFilter
foreach ($rows as $key => $row) {
// A row is deleted if
- // 1 - its label doesnt contain the pattern
+ // 1 - its label doesn't contain the pattern
// AND 2 - the label is not found in the children
$patternNotFoundInChildren = false;
diff --git a/core/DataTable/Map.php b/core/DataTable/Map.php
index 8f9d259f10..e767d2f49a 100644
--- a/core/DataTable/Map.php
+++ b/core/DataTable/Map.php
@@ -28,7 +28,7 @@ use Piwik\DataTable\Renderer\Console;
class Map implements DataTableInterface
{
/**
- * Array containing the DataTable withing this Set
+ * Array containing the DataTable within this Set
*
* @var DataTable[]
*/
@@ -228,6 +228,16 @@ class Map implements DataTableInterface
}
/**
+ * See {@link DataTable::disableFilter()}.
+ */
+ public function disableFilter($className)
+ {
+ foreach ($this->getDataTables() as $table) {
+ $table->disableFilter($className);
+ }
+ }
+
+ /**
* @ignore
*/
public function disableRecursiveFilters()
diff --git a/core/DataTable/Renderer/Csv.php b/core/DataTable/Renderer/Csv.php
index d7b58783ee..d9b2ea4fd4 100644
--- a/core/DataTable/Renderer/Csv.php
+++ b/core/DataTable/Renderer/Csv.php
@@ -148,7 +148,7 @@ class Csv extends Renderer
// get rid of the columns names
$returned = array_slice($returned, 1);
- // case empty datatable we dont print anything in the CSV export
+ // case empty datatable we don't print anything in the CSV export
// when in xml we would output <result date="2008-01-15" />
if (!empty($returned)) {
foreach ($returned as &$row) {
@@ -306,7 +306,7 @@ class Csv extends Renderer
} elseif (strpos($date, ',') !== false) {
$period = new Range('range', $date);
} else {
- $period = Period\Factory::build($period, Date::factory($date));
+ $period = Period\Factory::build($period, $date);
}
$prettyDate = $period->getLocalizedLongString();
@@ -417,7 +417,7 @@ class Csv extends Renderer
if ($name == 'idsubdatatable_in_db') {
continue;
}
- //if a metadata and a column have the same name make sure they dont overwrite
+ //if a metadata and a column have the same name make sure they don't overwrite
if ($this->translateColumnNames) {
$name = Piwik::translate('General_Metadata') . ': ' . $name;
} else {
diff --git a/core/DataTable/Renderer/Rss.php b/core/DataTable/Renderer/Rss.php
index fd18b44371..3d821150fc 100644
--- a/core/DataTable/Renderer/Rss.php
+++ b/core/DataTable/Renderer/Rss.php
@@ -64,9 +64,13 @@ class Rss extends Renderer
$pudDate = date('r', $timestamp);
- $dateInSiteTimezone = Date::factory($timestamp)->setTimezone($site->getTimezone())->toString('Y-m-d');
+ $dateInSiteTimezone = Date::factory($timestamp);
+ if($site) {
+ $dateInSiteTimezone = $dateInSiteTimezone->setTimezone($site->getTimezone());
+ }
+ $dateInSiteTimezone = $dateInSiteTimezone->toString('Y-m-d');
$thisPiwikUrl = Common::sanitizeInputValue($piwikUrl . "&date=$dateInSiteTimezone");
- $siteName = $site->getName();
+ $siteName = $site ? $site->getName() : '';
$title = $siteName . " on " . $date;
$out .= "\t<item>
diff --git a/core/DataTable/Row.php b/core/DataTable/Row.php
index 3bd3b023d8..4077d6cd43 100644
--- a/core/DataTable/Row.php
+++ b/core/DataTable/Row.php
@@ -462,7 +462,11 @@ class Row extends \ArrayObject
$operation = 'sum';
if (is_array($aggregationOperations) && isset($aggregationOperations[$columnToSumName])) {
- $operation = strtolower($aggregationOperations[$columnToSumName]);
+ if (is_string($aggregationOperations[$columnToSumName])) {
+ $operation = strtolower($aggregationOperations[$columnToSumName]);
+ } elseif (is_callable($aggregationOperations[$columnToSumName])) {
+ $operation = $aggregationOperations[$columnToSumName];
+ }
}
// max_actions is a core metric that is generated in ArchiveProcess_Day. Therefore, it can be
@@ -474,7 +478,7 @@ class Row extends \ArrayObject
throw new Exception("Unknown aggregation operation for column $columnToSumName.");
}
- $newValue = $this->getColumnValuesMerged($operation, $thisColumnValue, $columnToSumValue);
+ $newValue = $this->getColumnValuesMerged($operation, $thisColumnValue, $columnToSumValue, $this, $rowToSum);
$this->setColumn($columnToSumName, $newValue);
}
@@ -486,7 +490,7 @@ class Row extends \ArrayObject
/**
*/
- private function getColumnValuesMerged($operation, $thisColumnValue, $columnToSumValue)
+ private function getColumnValuesMerged($operation, $thisColumnValue, $columnToSumValue, $thisRow, $rowToSum)
{
switch ($operation) {
case 'skip':
@@ -521,6 +525,10 @@ class Row extends \ArrayObject
$newValue = $thisColumnValue;
break;
default:
+ if (is_callable($operation)) {
+ return call_user_func($operation, $thisColumnValue, $columnToSumValue, $thisRow, $rowToSum);
+ }
+
throw new Exception("Unknown operation '$operation'.");
}
return $newValue;
@@ -549,7 +557,7 @@ class Row extends \ArrayObject
continue;
}
- $aggregatedMetadata[$columnn] = $this->getColumnValuesMerged($operation, $thisMetadata, $sumMetadata);
+ $aggregatedMetadata[$columnn] = $this->getColumnValuesMerged($operation, $thisMetadata, $sumMetadata, $this, $rowToSum);
}
}
diff --git a/core/Db.php b/core/Db.php
index a4b114d634..b906790397 100644
--- a/core/Db.php
+++ b/core/Db.php
@@ -57,6 +57,12 @@ class Db
return self::$connection;
}
+ /**
+ * Returns an array with the Database connection information.
+ *
+ * @param array|null $dbConfig
+ * @return array
+ */
public static function getDatabaseConfig($dbConfig = null)
{
$config = Config::getInstance();
diff --git a/core/Db/Adapter.php b/core/Db/Adapter.php
index bea69e1d04..5363d15383 100644
--- a/core/Db/Adapter.php
+++ b/core/Db/Adapter.php
@@ -69,7 +69,7 @@ class Adapter
{
$className = 'Piwik\Db\Adapter\\' . str_replace(' ', '\\', ucwords(str_replace(array('_', '\\'), ' ', strtolower($adapterName))));
if (!class_exists($className)) {
- throw new \Exception("Adapter $adapterName is not valid.");
+ throw new \Exception(sprintf("Adapter '%s' is not valid. Maybe check that your Piwik configuration files in config/*.ini.php are readable by the webserver.", $adapterName));
}
return $className;
}
@@ -119,4 +119,14 @@ class Adapter
return $adapters;
}
+
+ /**
+ * Checks if the available adapters are recommended by Piwik or not.
+ * @param string $adapterName
+ * @return bool
+ */
+ public function isRecommendedAdapter($adapterName)
+ {
+ return strtolower($adapterName) === 'pdo/mysql';
+ }
}
diff --git a/core/DbHelper.php b/core/DbHelper.php
index 25b1f56455..96ba2c5a1d 100644
--- a/core/DbHelper.php
+++ b/core/DbHelper.php
@@ -186,4 +186,19 @@ class DbHelper
ArchiveTableCreator::refreshTableList($forceReload = true);
}
+
+ /**
+ * Returns true if the string is a valid database name for MySQL. MySQL allows + in the database names.
+ * Database names that start with a-Z or 0-9 and contain a-Z, 0-9, underscore(_), dash(-), plus(+), and dot(.) will be accepted.
+ * File names beginning with anything but a-Z or 0-9 will be rejected (including .htaccess for example).
+ * File names containing anything other than above mentioned will also be rejected (file names with spaces won't be accepted).
+ *
+ * @param string $dbname
+ * @return bool
+ */
+ public static function isValidDbname($dbname)
+ {
+ return (0 !== preg_match('/(^[a-zA-Z0-9]+([a-zA-Z_0-9.-\+]*))$/D', $dbname));
+ }
+
}
diff --git a/core/DeviceDetectorCache.php b/core/DeviceDetectorCache.php
index 543769fc54..e2cd998808 100644
--- a/core/DeviceDetectorCache.php
+++ b/core/DeviceDetectorCache.php
@@ -59,7 +59,7 @@ class DeviceDetectorCache implements \DeviceDetector\Cache\Cache
* @param string $id The cache entry ID
* @param array $content The cache content
* @throws \Exception
- * @return bool True if the entry was succesfully stored
+ * @return bool True if the entry was successfully stored
*/
public function save($id, $content, $ttl=0)
{
diff --git a/core/Exception/NotYetInstalledException.php b/core/Exception/NotYetInstalledException.php
new file mode 100644
index 0000000000..ed2c048bfb
--- /dev/null
+++ b/core/Exception/NotYetInstalledException.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Exception;
+
+class NotYetInstalledException extends Exception
+{
+}
diff --git a/core/Filechecks.php b/core/Filechecks.php
index bf3e36f1d7..ee29adad7e 100644
--- a/core/Filechecks.php
+++ b/core/Filechecks.php
@@ -174,7 +174,7 @@ class Filechecks
{
$realpath = Filesystem::realpath(PIWIK_INCLUDE_PATH . '/');
$message = '';
- $message .= "<code>chown -R ". self::getUserAndGroup() ." " . $realpath . "</code><br />";
+ $message .= "<code>" . self::getCommandToChangeOwnerOfPiwikFiles() . "</code><br />";
$message .= "<code>chmod -R 0755 " . $realpath . "</code><br />";
$message .= 'After you execute these commands (or change permissions via your FTP software), refresh the page and you should be able to use the "Automatic Update" feature.';
return $message;
@@ -205,7 +205,7 @@ class Filechecks
return $message;
}
- private static function getUserAndGroup()
+ public static function getUserAndGroup()
{
$user = self::getUser();
if (!function_exists('shell_exec')) {
@@ -220,12 +220,18 @@ class Filechecks
return $user . ':' . $group;
}
- private static function getUser()
+ public static function getUser()
{
- if (!function_exists('shell_exec')) {
- return 'www-data';
+ if (function_exists('shell_exec')) {
+ return trim(shell_exec('whoami'));
}
- return trim(shell_exec('whoami'));
+
+ $currentUser = get_current_user();
+ if(!empty($currentUser)) {
+ return $currentUser;
+ }
+
+ return 'www-data';
}
/**
@@ -237,8 +243,34 @@ class Filechecks
private static function getMakeWritableCommand($realpath)
{
if (SettingsServer::isWindows()) {
- return "<code>cacls $realpath /t /g " . get_current_user() . ":f</code><br />\n";
+ return "<code>cacls $realpath /t /g " . self::getUser() . ":f</code><br />\n";
}
return "<code>chmod -R 0755 $realpath</code><br />";
}
+
+ /**
+ * @return string
+ */
+ public static function getCommandToChangeOwnerOfPiwikFiles()
+ {
+ $realpath = Filesystem::realpath(PIWIK_INCLUDE_PATH . '/');
+ return "chown -R " . self::getUserAndGroup() . " " . $realpath;
+ }
+
+ public static function getOwnerOfPiwikFiles()
+ {
+ $index = Filesystem::realpath(PIWIK_INCLUDE_PATH . '/index.php');
+ $stat = stat($index);
+ if(!$stat) {
+ return '';
+ }
+
+ $group = posix_getgrgid($stat[5]);
+ $group = $group['name'];
+
+ $user = posix_getpwuid($stat[4]);
+ $user = $user['name'];
+
+ return "$user:$group";
+ }
}
diff --git a/core/Filesystem.php b/core/Filesystem.php
index c22a4d0b21..585246a0cd 100644
--- a/core/Filesystem.php
+++ b/core/Filesystem.php
@@ -94,6 +94,8 @@ class Filesystem
// enough! we're not going to make the directory world-writeable
}
}
+
+ self::createIndexFilesToPreventDirectoryListing($path);
}
/**
@@ -443,8 +445,7 @@ class Filesystem
*/
private static function getChmodForPath($path)
{
- $pathIsTmp = StaticContainer::get('path.tmp');
- if (strpos($path, $pathIsTmp) === 0) {
+ if (self::isPathWithinTmpFolder($path)) {
// tmp/* folder
return 0750;
}
@@ -504,4 +505,34 @@ class Filesystem
return true;
}
+
+ /**
+ * @param $path
+ * @return bool
+ */
+ private static function isPathWithinTmpFolder($path)
+ {
+ $pathIsTmp = StaticContainer::get('path.tmp');
+ $isPathWithinTmpFolder = strpos($path, $pathIsTmp) === 0;
+ return $isPathWithinTmpFolder;
+ }
+
+ /**
+ * in tmp/ (sub-)folder(s) we create empty index.htm|php files
+ *
+ * @param $path
+ */
+ private static function createIndexFilesToPreventDirectoryListing($path)
+ {
+ if (!self::isPathWithinTmpFolder($path)) {
+ return;
+ }
+ $filesToCreate = array(
+ $path . '/index.htm',
+ $path . '/index.php'
+ );
+ foreach ($filesToCreate as $file) {
+ @file_put_contents($file, 'Nothing to see here.');
+ }
+ }
}
diff --git a/core/FrontController.php b/core/FrontController.php
index e43e79c25c..79e1bc52cd 100644
--- a/core/FrontController.php
+++ b/core/FrontController.php
@@ -43,14 +43,14 @@ use Piwik\Plugins\CoreAdminHome\CustomLogo;
* $_GET['changeVisitAlpha'] = false;
* $_GET['removeOldVisits'] = false;
* $_GET['showFooterMessage'] = false;
- * $realtimeMap = FrontController::getInstance()->fetchDispatch('UserCountryMap', 'realtimeMap');
+ * $realtimeMap = FrontController::getInstance()->dispatch('UserCountryMap', 'realtimeMap');
*
* $view = new View('@MyPlugin/myPopupWithRealtimeMap.twig');
* $view->realtimeMap = $realtimeMap;
* return $realtimeMap->render();
* }
*
- * For a detailed explanation, see the documentation [here](http://piwik.org/docs/plugins/framework-overview).
+ * For a detailed explanation, see the documentation [here](https://developer.piwik.org/guides/how-piwik-works).
*
* @method static \Piwik\FrontController getInstance()
*/
@@ -71,6 +71,28 @@ class FrontController extends Singleton
private $initialized = false;
/**
+ * @param $lastError
+ * @return mixed|void
+ * @throws AuthenticationFailedException
+ * @throws Exception
+ */
+ private static function generateSafeModeOutput($lastError)
+ {
+ Common::sendResponseCode(500);
+
+ $controller = FrontController::getInstance();
+ try {
+ $controller->init();
+ $message = $controller->dispatch('CorePluginsAdmin', 'safemode', array($lastError));
+ } catch(Exception $e) {
+ // may fail in safe mode (eg. global.ini.php not found)
+ $message = sprintf("Piwik encoutered an error: %s (which lead to: %s)", $lastError['message'], $e->getMessage());
+ }
+
+ return $message;
+ }
+
+ /**
* Executes the requested plugin controller method.
*
* @throws Exception|\Piwik\PluginDeactivatedException in case the plugin doesn't exist, the action doesn't exist,
@@ -179,12 +201,7 @@ class FrontController extends Singleton
{
$lastError = error_get_last();
if (!empty($lastError) && $lastError['type'] == E_ERROR) {
- Common::sendResponseCode(500);
-
- $controller = FrontController::getInstance();
- $controller->init();
- $message = $controller->dispatch('CorePluginsAdmin', 'safemode', array($lastError));
-
+ $message = self::generateSafeModeOutput($lastError);
echo $message;
}
}
diff --git a/core/IP.php b/core/IP.php
index 670c674544..919e548353 100644
--- a/core/IP.php
+++ b/core/IP.php
@@ -38,7 +38,7 @@ use Piwik\Network\IPUtils;
class IP
{
/**
- * Returns the most accurate IP address availble for the current user, in
+ * Returns the most accurate IP address available for the current user, in
* IPv4 format. This could be the proxy client's IP address.
*
* @return string IP address in presentation format.
diff --git a/core/LogDeleter.php b/core/LogDeleter.php
index fc61ec9358..51d2dddef5 100644
--- a/core/LogDeleter.php
+++ b/core/LogDeleter.php
@@ -9,6 +9,7 @@
namespace Piwik;
use Piwik\DataAccess\RawLogDao;
+use Piwik\Plugin\LogTablesProvider;
/**
* Service that deletes log entries. Methods in this class cascade, so deleting visits will delete visit actions,
@@ -21,9 +22,15 @@ class LogDeleter
*/
private $rawLogDao;
- public function __construct(RawLogDao $rawLogDao)
+ /**
+ * @var LogTablesProvider
+ */
+ private $logTablesProvider;
+
+ public function __construct(RawLogDao $rawLogDao, LogTablesProvider $logTablesProvider)
{
$this->rawLogDao = $rawLogDao;
+ $this->logTablesProvider = $logTablesProvider;
}
/**
@@ -35,33 +42,18 @@ class LogDeleter
*/
public function deleteVisits($visitIds)
{
- $this->deleteConversions($visitIds);
- $this->rawLogDao->deleteVisitActionsForVisits($visitIds);
-
- return $this->rawLogDao->deleteVisits($visitIds);
- }
+ $numDeletedVisits = 0;
- /**
- * Deletes conversions by visit ID. This method cascades, so conversion items are also deleted.
- *
- * @param int[] $visitIds The list of visits to delete conversions for.
- * @return int The number rows deleted.
- */
- public function deleteConversions($visitIds)
- {
- $this->deleteConversionItems($visitIds);
- return $this->rawLogDao->deleteConversions($visitIds);
- }
+ foreach ($this->logTablesProvider->getAllLogTables() as $logTable) {
+ if ($logTable->getColumnToJoinOnIdVisit()) {
+ $numVisits = $this->rawLogDao->deleteFromLogTable($logTable->getName(), $visitIds);
+ if ($logTable->getName() === 'log_visit') {
+ $numDeletedVisits = $numVisits;
+ }
+ }
+ }
- /**
- * Deletes conversion items by visit ID.
- *
- * @param int[] $visitIds The list of visits to delete conversions for.
- * @return int The number rows deleted.
- */
- public function deleteConversionItems($visitIds)
- {
- return $this->rawLogDao->deleteConversionItems($visitIds);
+ return $numDeletedVisits;
}
/**
diff --git a/core/Metrics/Formatter.php b/core/Metrics/Formatter.php
index 078edb2339..9ce179d769 100644
--- a/core/Metrics/Formatter.php
+++ b/core/Metrics/Formatter.php
@@ -143,7 +143,7 @@ class Formatter
}
/**
- * Returns a pretty formated monetary value using the currency associated with a site.
+ * Returns a pretty formatted monetary value using the currency associated with a site.
*
* @param int|string $value The monetary value to format.
* @param int $idSite The ID of the site whose currency will be used.
diff --git a/core/Piwik.php b/core/Piwik.php
index 71817cb196..930b64cf03 100644
--- a/core/Piwik.php
+++ b/core/Piwik.php
@@ -77,11 +77,18 @@ class Piwik
{
Common::sendHeader('Content-Type: text/html; charset=utf-8');
- $output = "<style>a{color:red;}</style>\n" .
- "<div style='color:red;font-size:120%'>" .
- "<p><img src='plugins/Morpheus/images/error_medium.png' style='vertical-align:middle; float:left;padding:20px' />" .
+ $message = str_replace("\n", "<br/>", $message);
+
+ $output = "<html><body>".
+ "<style>a{color:red;}</style>\n" .
+ "<div style='color:red;font-size:120%; width:100%;margin: 30px;'>" .
+ " <div style='width: 50px; float: left;'><img src='plugins/Morpheus/images/error_medium.png' /></div>" .
+ " <div style='margin-left: 70px; min-width: 950px;'>" .
$message .
- "</p></div>";
+ " </div>" .
+ " </div>" .
+ "</div>".
+ "</body></html>";
print($output);
exit;
}
@@ -722,7 +729,7 @@ class Piwik
/**
* Returns an internationalized string using a translation token. If a translation
- * cannot be found for the toke, the token is returned.
+ * cannot be found for the token, the token is returned.
*
* @param string $translationId Translation ID, eg, `'General_Date'`.
* @param array|string|int $args `sprintf` arguments to be applied to the internationalized
diff --git a/core/Plugin/Dimension/VisitDimension.php b/core/Plugin/Dimension/VisitDimension.php
index 3f258da481..c59495d2aa 100644
--- a/core/Plugin/Dimension/VisitDimension.php
+++ b/core/Plugin/Dimension/VisitDimension.php
@@ -338,17 +338,17 @@ abstract class VisitDimension extends Dimension
// find circular references
// and remove dependencies whose column cannot be resolved because it is not installed / does not exist / is defined by core
- $depenencies = array();
+ $dependencies = array();
foreach ($dimensions as $dimension) {
- $depenencies[$dimension->getColumnName()] = $dimension->getRequiredVisitFields();
+ $dependencies[$dimension->getColumnName()] = $dimension->getRequiredVisitFields();
}
- foreach ($depenencies as $column => $fields) {
+ foreach ($dependencies as $column => $fields) {
foreach ($fields as $key => $field) {
- if (empty($depenencies[$field]) && !in_array($field, $exists)) {
+ if (empty($dependencies[$field]) && !in_array($field, $exists)) {
// we cannot resolve that dependency as it does not exist
- unset($depenencies[$column][$key]);
- } elseif (!empty($depenencies[$field]) && in_array($column, $depenencies[$field])) {
+ unset($dependencies[$column][$key]);
+ } elseif (!empty($dependencies[$field]) && in_array($column, $dependencies[$field])) {
throw new Exception("Circular reference detected for required field $field in dimension $column");
}
}
@@ -364,7 +364,7 @@ abstract class VisitDimension extends Dimension
break; // to prevent an endless loop
}
foreach ($dimensions as $key => $dimension) {
- $fields = $depenencies[$dimension->getColumnName()];
+ $fields = $dependencies[$dimension->getColumnName()];
if (count(array_intersect($fields, $exists)) === count($fields)) {
$sorted[] = $dimension;
$exists[] = $dimension->getColumnName();
diff --git a/core/Plugin/LogTablesProvider.php b/core/Plugin/LogTablesProvider.php
new file mode 100644
index 0000000000..92afca14c7
--- /dev/null
+++ b/core/Plugin/LogTablesProvider.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugin;
+
+use Piwik\Container\StaticContainer;
+use Piwik\Tracker\LogTable;
+
+class LogTablesProvider {
+
+ /**
+ * @var Manager
+ */
+ private $pluginManager;
+
+ /**
+ * @var LogTable[]
+ */
+ private $tablesCache;
+
+ public function __construct(Manager $pluginManager)
+ {
+ $this->pluginManager = $pluginManager;
+ }
+
+ /**
+ * Get an instance of a specific log table if such a log table exists.
+ *
+ * @param string $tableNameWithoutPrefix eg "log_visit"
+ * @return LogTable|null
+ */
+ public function getLogTable($tableNameWithoutPrefix)
+ {
+ foreach ($this->getAllLogTables() as $table) {
+ if ($table->getName() === $tableNameWithoutPrefix) {
+ return $table;
+ }
+ }
+ }
+
+ /**
+ * Get all log table instances defined by any activated and loaded plugin. The returned tables are not sorted in
+ * any order.
+ * @return LogTable[]
+ */
+ public function getAllLogTables()
+ {
+ if (!isset($this->tablesCache)) {
+ $tables = $this->pluginManager->findMultipleComponents('Tracker', 'Piwik\\Tracker\\LogTable');
+
+ $this->tablesCache = array();
+ foreach ($tables as $table) {
+ $this->tablesCache[] = StaticContainer::get($table);
+ }
+ }
+
+ return $this->tablesCache;
+ }
+
+}
diff --git a/core/Plugin/Report.php b/core/Plugin/Report.php
index ac8b401363..8f0619c998 100644
--- a/core/Plugin/Report.php
+++ b/core/Plugin/Report.php
@@ -135,7 +135,7 @@ class Report
protected $isSubtableReport = false;
/**
- * Some reports may require additonal URL parameters that need to be sent when a report is requested. For instance
+ * Some reports may require additional URL parameters that need to be sent when a report is requested. For instance
* a "goal" report might need a "goalId": `array('idgoal' => 5)`.
* @var null|array
* @api
@@ -503,6 +503,15 @@ class Report
}
/**
+ * Get report documentation.
+ * @return string
+ */
+ public function getDocumentation()
+ {
+ return $this->documentation;
+ }
+
+ /**
* Builts the report metadata for this report. Can be useful in case you want to change the behavior of
* {@link configureReportMetadata()}.
* @return array
diff --git a/core/Plugin/Tasks.php b/core/Plugin/Tasks.php
index 19f9e5bb39..a34206c451 100644
--- a/core/Plugin/Tasks.php
+++ b/core/Plugin/Tasks.php
@@ -14,7 +14,7 @@ use Piwik\Scheduler\Task;
/**
* Base class for all Tasks declarations.
- * Tasks are usually meant as scheduled tasks that are executed regularily by Piwik in the background. For instance
+ * Tasks are usually meant as scheduled tasks that are executed regularly by Piwik in the background. For instance
* once every hour or every day. This could be for instance checking for updates, sending email reports, etc.
* Please don't mix up tasks with console commands which can be executed on the CLI.
*/
@@ -33,7 +33,7 @@ class Tasks
/**
* This method is called to collect all schedule tasks. Register all your tasks here that should be executed
- * regularily such as daily or monthly.
+ * regularly such as daily or monthly.
*/
public function schedule()
{
diff --git a/core/Plugin/ViewDataTable.php b/core/Plugin/ViewDataTable.php
index da3e43363b..cc9e46db43 100644
--- a/core/Plugin/ViewDataTable.php
+++ b/core/Plugin/ViewDataTable.php
@@ -262,7 +262,7 @@ abstract class ViewDataTable implements ViewInterface
$this->config->show_footer_icons = (false == $this->requestConfig->idSubtable);
// the exclude low population threshold value is sometimes obtained by requesting data.
- // to avoid issuing unecessary requests when display properties are determined by metadata,
+ // to avoid issuing unnecessary requests when display properties are determined by metadata,
// we allow it to be a closure.
if (isset($this->requestConfig->filter_excludelowpop_value)
&& $this->requestConfig->filter_excludelowpop_value instanceof \Closure
diff --git a/core/PiwikPro/Advertising.php b/core/ProfessionalServices/Advertising.php
index deea4fa9f3..07e42c46e4 100644
--- a/core/PiwikPro/Advertising.php
+++ b/core/ProfessionalServices/Advertising.php
@@ -5,22 +5,21 @@
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\PiwikPro;
+namespace Piwik\ProfessionalServices;
use Piwik\Plugin;
use Piwik\Config;
/**
- * Piwik PRO Advertising related methods. Lets you for example check whether advertising is enabled, generate
- * links for differnt landing pages etc.
+ * Advertising for providers of Professional Support for Piwik.
+ *
+ * Lets you for example check whether advertising is enabled, generate links for different landing pages etc.
*
- * @api
* @since 2.16.0
*/
class Advertising
{
- const CAMPAIGN_NAME_UPGRADE_TO_PRO = 'Upgrade_to_Pro';
- const CAMPAIGN_NAME_UPGRADE_TO_CLOUD = 'Upgrade_to_Cloud';
+ const CAMPAIGN_NAME_PROFESSIONAL_SERVICES = 'App_ProfessionalServices';
/**
* @var Plugin\Manager
@@ -39,36 +38,27 @@ class Advertising
}
/**
- * Returns true if it is ok to show some Piwik PRO advertising in the Piwik UI.
+ * Returns true if it is ok to show some advertising in the Piwik UI.
* @return bool
*/
- public function arePiwikProAdsEnabled()
+ public function areAdsForProfessionalServicesEnabled()
{
- if ($this->pluginManager->isPluginActivated('EnterpriseAdmin')
- || $this->pluginManager->isPluginActivated('LoginAdmin')
- || $this->pluginManager->isPluginActivated('CloudAdmin')
- || $this->pluginManager->isPluginActivated('WhiteLabel')) {
- return false;
- }
-
- $showAds = $this->config->General['piwik_pro_ads_enabled'];
-
- return !empty($showAds);
+ return $this->isAdsEnabledInConfig($this->config->General);
}
/**
- * Get URL for promoting the Piwik Cloud.
+ * Get URL for promoting Professional Services for Piwik
*
* @param string $campaignMedium
* @param string $campaignContent
* @return string
*/
- public function getPromoUrlForCloud($campaignMedium, $campaignContent = '')
+ public function getPromoUrlForProfessionalServices($campaignMedium, $campaignContent = '')
{
- $url = 'https://piwik.pro/cloud/?';
+ $url = 'https://piwik.org/consulting/?';
$campaign = $this->getCampaignParametersForPromoUrl(
- $name = self::CAMPAIGN_NAME_UPGRADE_TO_CLOUD,
+ $name = self::CAMPAIGN_NAME_PROFESSIONAL_SERVICES,
$campaignMedium,
$campaignContent
);
@@ -77,26 +67,18 @@ class Advertising
}
/**
- * Get URL for promoting Piwik On Premises.
- * @param string $campaignMedium
- * @param string $campaignContent
+ * Get URL for letting people know about upgrade to On premises
+ *
* @return string
*/
- public function getPromoUrlForOnPremises($campaignMedium, $campaignContent = '')
+ public function getPromoUrlForPiwikProUpgrade()
{
- $url = 'https://piwik.pro/c/upgrade/?';
-
- $campaign = $this->getCampaignParametersForPromoUrl(
- $name = self::CAMPAIGN_NAME_UPGRADE_TO_PRO,
- $campaignMedium,
- $campaignContent
- );
-
- return $url . $campaign;
+ return 'https://piwik.org/recommends/piwik-pro-from-app';
}
/**
- * Appends campaign parameters to the given URL for promoting any Piwik PRO service.
+ * Appends campaign parameters to the given URL for promoting any Professional Support for Piwik service.
+ *
* @param string $url
* @param string $campaignName
* @param string $campaignMedium
@@ -121,7 +103,7 @@ class Advertising
}
/**
- * Generates campaign URL parameters that can be used with any promotion link for Piwik PRO.
+ * Generates campaign URL parameters that can be used with promoting Professional Support service.
*
* @param string $campaignName
* @param string $campaignMedium
@@ -138,4 +120,15 @@ class Advertising
return $campaignName;
}
+
+ /**
+ * @param $configGeneralSection
+ * @return bool
+ */
+ public static function isAdsEnabledInConfig($configGeneralSection)
+ {
+ $oldSettingValue = @$configGeneralSection['piwik_pro_ads_enabled'];
+ $newSettingValue = @$configGeneralSection['piwik_professional_support_ads_enabled'];
+ return (bool) ($newSettingValue || $oldSettingValue);
+ }
}
diff --git a/core/SettingsPiwik.php b/core/SettingsPiwik.php
index b0df27b2b6..c0b2d8e177 100644
--- a/core/SettingsPiwik.php
+++ b/core/SettingsPiwik.php
@@ -210,7 +210,7 @@ class SettingsPiwik
$config = Config::getInstance()->getLocalPath();
$exists = file_exists($config);
- // Piwik is installed if the config file is found
+ // Piwik is not installed if the config file is not found
if (!$exists) {
return false;
}
diff --git a/core/Theme.php b/core/Theme.php
index 8965a2687c..ed6261334c 100644
--- a/core/Theme.php
+++ b/core/Theme.php
@@ -105,7 +105,7 @@ class Theme
$source = $src[0];
$pathAsset = $src[2];
- // Basic health check, we dont replace if not starting with plugins/
+ // Basic health check, we don't replace if not starting with plugins/
$posPluginsInPath = strpos($pathAsset, 'plugins');
if ($posPluginsInPath !== 0) {
return $source;
diff --git a/core/Tracker/Action.php b/core/Tracker/Action.php
index b841c210a9..143e53ad57 100644
--- a/core/Tracker/Action.php
+++ b/core/Tracker/Action.php
@@ -283,7 +283,7 @@ abstract class Action
$typeId = array_search($type, $constants);
if (false === $typeId) {
- throw new Exception("Unexpected action type " . $type);
+ return $type;
}
return str_replace('TYPE_', '', $typeId);
diff --git a/core/Tracker/Db/Mysqli.php b/core/Tracker/Db/Mysqli.php
index 2f024103e1..a4e5fcb696 100644
--- a/core/Tracker/Db/Mysqli.php
+++ b/core/Tracker/Db/Mysqli.php
@@ -113,7 +113,7 @@ class Mysqli extends Db
* @param string $query Query
* @param array $parameters Parameters to bind
* @return array
- * @throws Exception|DbException if an exception occured
+ * @throws Exception|DbException if an exception occurred
*/
public function fetchAll($query, $parameters = array())
{
diff --git a/core/Tracker/Db/Pdo/Mysql.php b/core/Tracker/Db/Pdo/Mysql.php
index 7e4f7458db..711f760c44 100644
--- a/core/Tracker/Db/Pdo/Mysql.php
+++ b/core/Tracker/Db/Pdo/Mysql.php
@@ -184,7 +184,7 @@ class Mysql extends Db
* @param string $query Query
* @param array|string $parameters Parameters to bind array('idsite'=> 1)
* @return PDOStatement|bool PDOStatement or false if failed
- * @throws DbException if an exception occured
+ * @throws DbException if an exception occurred
*/
public function query($query, $parameters = array())
{
diff --git a/core/Tracker/GoalManager.php b/core/Tracker/GoalManager.php
index b7a63775b5..3e1312fef3 100644
--- a/core/Tracker/GoalManager.php
+++ b/core/Tracker/GoalManager.php
@@ -130,7 +130,7 @@ class GoalManager
$convertedGoals = array();
foreach ($goals as $goal) {
$convertedUrl = $this->detectGoalMatch($goal, $action);
- if (!empty($convertedUrl)) {
+ if (!is_null($convertedUrl)) {
$convertedGoals[] = array('url' => $convertedUrl) + $goal;
}
}
@@ -143,7 +143,7 @@ class GoalManager
*
* @param array $goal
* @param Action $action
- * @return string|null
+ * @return if a goal is matched, a string of the Action URL is returned, or if no goal was matched it returns null
*/
public function detectGoalMatch($goal, Action $action)
{
@@ -165,26 +165,26 @@ class GoalManager
switch ($attribute) {
case 'title':
// Matching on Page Title
- $url = $action->getActionName();
+ $actionToMatch = $action->getActionName();
break;
case 'event_action':
- $url = $action->getEventAction();
+ $actionToMatch = $action->getEventAction();
break;
case 'event_name':
- $url = $action->getEventName();
+ $actionToMatch = $action->getEventName();
break;
case 'event_category':
- $url = $action->getEventCategory();
+ $actionToMatch = $action->getEventCategory();
break;
// url, external_website, file, manually...
default:
- $url = $action->getActionUrlRaw();
+ $actionToMatch = $action->getActionUrlRaw();
break;
}
$pattern_type = $goal['pattern_type'];
- $match = $this->isUrlMatchingGoal($goal, $pattern_type, $url);
+ $match = $this->isUrlMatchingGoal($goal, $pattern_type, $actionToMatch);
if (!$match) {
return null;
}
diff --git a/core/Tracker/LogTable.php b/core/Tracker/LogTable.php
new file mode 100644
index 0000000000..8e66f43463
--- /dev/null
+++ b/core/Tracker/LogTable.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Tracker;
+
+/**
+ * Base class for LogTables. You need to create a log table eg if you want to be able to create a segment for a custom
+ * log table.
+ */
+abstract class LogTable {
+
+ /**
+ * Get the unprefixed database table name. For example 'log_visit' or 'log_action'.
+ * @return string
+ */
+ abstract public function getName();
+
+ /**
+ * Get the name of the column that can be used to join a visit with another table. This is the name of the column
+ * that represents the "idvisit".
+ * @return string
+ */
+ public function getColumnToJoinOnIdVisit()
+ {
+ return '';
+ }
+
+ /**
+ * Get the name of the column that can be used to join an action with another table. This is the name of the column
+ * that represents the "idaction".
+ *
+ * This could be more generic eg by specifiying "$this->joinableOn = array('action' => 'idaction') and this
+ * would allow to also add more complex structures in the future but not needed for now I'd say. Let's go with
+ * simpler, more clean and expressive solution for now until needed.
+ *
+ * @return string
+ */
+ public function getColumnToJoinOnIdAction()
+ {
+ return '';
+ }
+
+ /**
+ * Defines whether this table should be joined via a subselect. Return true if a complex join is needed. (eg when
+ * having visits and needing actions, or when having visits and needing conversions, or vice versa).
+ * @return bool
+ */
+ public function shouldJoinWithSubSelect()
+ {
+ return false;
+ }
+
+ /**
+ * Returns the name of a log table that allows to join on a visit. Eg if there is a table "action", and it is not
+ * joinable with "visit" table, it can return "log_link_visit_action" to be able to join the action table on visit
+ * via this link table.
+ *
+ * In theory there could be case where it may be needed to join via two tables, so it could be needed at some
+ * point to return an array of tables here. not sure if we should handle this case just yet. Alternatively,
+ * once needed eg in LogQueryBuilder, we should maybe better call instead ->getLinkTableToBeAbleToJoinOnVisit()
+ * again on the returned table until we have found a table that can be joined with visit.
+ *
+ * @return string
+ */
+ public function getLinkTableToBeAbleToJoinOnVisit()
+ {
+ return;
+ }
+
+}
diff --git a/core/Tracker/RequestSet.php b/core/Tracker/RequestSet.php
index 3d3c626e17..f7ac3e3a4f 100644
--- a/core/Tracker/RequestSet.php
+++ b/core/Tracker/RequestSet.php
@@ -145,7 +145,7 @@ class RequestSet
return array_values(array_unique($siteIds));
}
- // TODO maybe move to reponse? or somewhere else? not sure where!
+ // TODO maybe move to response? or somewhere else? not sure where!
public function shouldPerformRedirectToUrl()
{
if (!$this->hasRedirectUrl()) {
diff --git a/core/Tracker/Response.php b/core/Tracker/Response.php
index 2b4a6f3b49..bf8c6f9955 100644
--- a/core/Tracker/Response.php
+++ b/core/Tracker/Response.php
@@ -175,7 +175,7 @@ class Response
return $e->getMessage();
}
- protected function logExceptionToErrorLog(Exception $e)
+ protected function logExceptionToErrorLog($e)
{
error_log(sprintf("Error in Piwik (tracker): %s", str_replace("\n", " ", $this->getMessageFromException($e))));
}
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index f4485f52fb..9de1490424 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -397,6 +397,11 @@ class Visit implements VisitInterface
*/
protected function updateExistingVisit($valuesToUpdate)
{
+ if (empty($valuesToUpdate)) {
+ Common::printDebug('There are no values to be updated for this visit');
+ return;
+ }
+
$idSite = $this->request->getIdSite();
$idVisit = (int)$this->visitProperties->getProperty('idvisit');
diff --git a/core/Twig.php b/core/Twig.php
index 9f17e0b218..5ac84993f1 100755
--- a/core/Twig.php
+++ b/core/Twig.php
@@ -53,7 +53,14 @@ function piwik_fix_lbrace($string)
$replace = array_map(function ($val) { return $val . '&#8291;' . $val; }, $chars);
}
- return str_replace($search, $replace, $string);
+ $replacedString = str_replace($search, $replace, $string);
+
+ // try to replace characters until there are no changes
+ if ($string !== $replacedString) {
+ return piwik_fix_lbrace($replacedString);
+ }
+
+ return $string;
}
function piwik_escape_filter(Twig_Environment $env, $string, $strategy = 'html', $charset = null, $autoescape = false) {
@@ -166,9 +173,6 @@ class Twig
$this->addFilter_percent();
$this->addFilter_percentage();
$this->addFilter_percentEvolution();
- $this->addFilter_piwikProAdLink();
- $this->addFilter_piwikProOnPremisesAdLink();
- $this->addFilter_piwikProCloudAdLink();
$this->addFilter_prettyDate();
$this->addFilter_safeDecodeRaw();
$this->addFilter_number();
@@ -411,47 +415,9 @@ class Twig
$this->twig->addFilter($percentage);
}
- protected function addFilter_piwikProAdLink()
- {
- $ads = $this->getPiwikProAdvertising();
- $piwikProAd = new Twig_SimpleFilter('piwikProCampaignParameters', function ($url, $campaignName, $campaignMedium, $campaignContent = '') use ($ads) {
- $url = $ads->addPromoCampaignParametersToUrl($url, $campaignName, $campaignMedium, $campaignContent);
- return $url;
- });
- $this->twig->addFilter($piwikProAd);
- }
-
- protected function addFilter_piwikProOnPremisesAdLink()
- {
- $twigEnv = $this->getTwigEnvironment();
- $ads = $this->getPiwikProAdvertising();
- $piwikProAd = new Twig_SimpleFilter('piwikProOnPremisesPromoUrl', function ($medium, $content = '') use ($twigEnv, $ads) {
-
- $url = $ads->getPromoUrlForOnPremises($medium, $content);
-
- return twig_escape_filter($twigEnv, $url, 'html_attr');
-
- }, array('is_safe' => array('html_attr')));
- $this->twig->addFilter($piwikProAd);
- }
-
- protected function addFilter_piwikProCloudAdLink()
- {
- $twigEnv = $this->getTwigEnvironment();
- $ads = $this->getPiwikProAdvertising();
- $piwikProAd = new Twig_SimpleFilter('piwikProCloudPromoUrl', function ($medium, $content = '') use ($twigEnv, $ads) {
-
- $url = $ads->getPromoUrlForCloud($medium, $content);
-
- return twig_escape_filter($twigEnv, $url, 'html_attr');
-
- }, array('is_safe' => array('html_attr')));
- $this->twig->addFilter($piwikProAd);
- }
-
- private function getPiwikProAdvertising()
+ private function getProfessionalServicesAdvertising()
{
- return StaticContainer::get('Piwik\PiwikPro\Advertising');
+ return StaticContainer::get('Piwik\ProfessionalServices\Advertising');
}
protected function addFilter_number()
diff --git a/core/UpdateCheck/ReleaseChannel.php b/core/UpdateCheck/ReleaseChannel.php
index 5f2040747e..b398ea22c3 100644
--- a/core/UpdateCheck/ReleaseChannel.php
+++ b/core/UpdateCheck/ReleaseChannel.php
@@ -14,7 +14,7 @@ namespace Piwik\UpdateCheck;
* nightly builds, to manage updates for clients via a central server, to package a special Piwik version for clients
* with custom plugins etc.
*
- * This is not a public API and it may change without any anouncement.
+ * This is not a public API and it may change without any announcement.
*
* @package Piwik\UpdateCheck
*/
diff --git a/core/Updates/2.15.0-b17.php b/core/Updates/2.15.0-b17.php
index 86e3decf20..f9c468a54c 100644
--- a/core/Updates/2.15.0-b17.php
+++ b/core/Updates/2.15.0-b17.php
@@ -21,7 +21,7 @@ class Updates_2_15_0_b17 extends Updates
/**
* Perform the incremental version update.
*
- * This method should preform all updating logic. If you define queries in an overridden `getMigrationQueries()`
+ * This method should perform all updating logic. If you define queries in an overridden `getMigrationQueries()`
* method, you must call {@link Updater::executeMigrationQueries()} here.
*
* See {@link Updates} for an example.
diff --git a/core/Updates/2.15.0-b20.php b/core/Updates/2.15.0-b20.php
index 79b4703f1b..f710175192 100644
--- a/core/Updates/2.15.0-b20.php
+++ b/core/Updates/2.15.0-b20.php
@@ -22,7 +22,7 @@ class Updates_2_15_0_b20 extends Updates
/**
* Perform the incremental version update.
*
- * This method should preform all updating logic. If you define queries in an overridden `getMigrationQueries()`
+ * This method should perform all updating logic. If you define queries in an overridden `getMigrationQueries()`
* method, you must call {@link Updater::executeMigrationQueries()} here.
*
* See {@link Updates} for an example.
diff --git a/core/Updates/2.15.0-b4.php b/core/Updates/2.15.0-b4.php
deleted file mode 100644
index 132c331981..0000000000
--- a/core/Updates/2.15.0-b4.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Updates;
-
-use Piwik\Plugins\Installation\ServerFilesGenerator;
-use Piwik\Updates;
-use Piwik\Updater;
-
-/**
- */
-class Updates_2_15_0_b4 extends Updates
-{
- public function doUpdate(Updater $updater)
- {
- // added .ttf whitelisted file for apache webserver
- ServerFilesGenerator::deleteHtAccessFiles();
- ServerFilesGenerator::createHtAccessFiles();
- }
-}
diff --git a/core/Updates/2.16.0-rc2.php b/core/Updates/2.16.0-rc2.php
deleted file mode 100644
index 618756d52c..0000000000
--- a/core/Updates/2.16.0-rc2.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-namespace Piwik\Updates;
-
-use Piwik\Updater;
-use Piwik\Updates;
-use Piwik\Updater\Migration\Factory as MigrationFactory;
-
-class Updates_2_16_0_rc2 extends Updates
-{
- /**
- * @var MigrationFactory
- */
- private $migration;
-
- public function __construct(MigrationFactory $factory)
- {
- $this->migration = $factory;
- }
-
- public function getMigrations(Updater $updater)
- {
- return array(
- $this->migration->plugin->activate('PiwikPro')
- );
- }
-
- public function doUpdate(Updater $updater)
- {
- $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
- }
-} \ No newline at end of file
diff --git a/core/Updates/2.16.1-b3.php b/core/Updates/2.16.1-b3.php
deleted file mode 100644
index cb46053660..0000000000
--- a/core/Updates/2.16.1-b3.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Updates;
-
-use Piwik\Plugins\Installation\ServerFilesGenerator;
-use Piwik\Updates;
-use Piwik\Updater;
-
-/**
- */
-class Updates_2_16_1_b3 extends Updates
-{
- public function doUpdate(Updater $updater)
- {
- // added .eot whitelisted file for apache webserver
- ServerFilesGenerator::deleteHtAccessFiles();
- ServerFilesGenerator::createHtAccessFiles();
- }
-} \ No newline at end of file
diff --git a/core/Updates/2.16.2-b2.php b/core/Updates/2.16.2-b2.php
new file mode 100644
index 0000000000..bae505e41a
--- /dev/null
+++ b/core/Updates/2.16.2-b2.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Updates;
+
+use Piwik\Updater;
+use Piwik\Updates as PiwikUpdates;
+
+/**
+ * Update for version 2.16.2-b2.
+ */
+class Updates_2_16_2_b2 extends PiwikUpdates
+{
+
+ public function doUpdate(Updater $updater)
+ {
+ $pluginManager = \Piwik\Plugin\Manager::getInstance();
+ $pluginName = 'UserId';
+
+ try {
+ if (!$pluginManager->isPluginActivated($pluginName)) {
+ $pluginManager->activatePlugin($pluginName);
+ }
+ } catch (\Exception $e) {
+ }
+ }
+} \ No newline at end of file
diff --git a/core/Updates/2.16.2-rc2.php b/core/Updates/2.16.2-rc2.php
new file mode 100644
index 0000000000..13817024f9
--- /dev/null
+++ b/core/Updates/2.16.2-rc2.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Updates;
+
+use Piwik\Updater;
+use Piwik\Updates as PiwikUpdates;
+
+/**
+ * Update for version 2.16.2-rc2
+ */
+class Updates_2_16_2_rc2 extends PiwikUpdates
+{
+
+ public function doUpdate(Updater $updater)
+ {
+ try {
+ \Piwik\Plugin\Manager::getInstance()->activatePlugin('ProfessionalServices');
+ } catch (\Exception $e) {
+ }
+
+ try {
+ \Piwik\Plugin\Manager::getInstance()->deactivatePlugin('PiwikPro');
+ self::deletePluginFromConfigFile('PiwikPro');
+ } catch (\Exception $e) {
+ }
+ }
+}
diff --git a/core/Updates/2.3.0-rc2.php b/core/Updates/2.16.3-b1.php
index c24cb2578d..5501588d2c 100644
--- a/core/Updates/2.3.0-rc2.php
+++ b/core/Updates/2.16.3-b1.php
@@ -6,20 +6,17 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
+
namespace Piwik\Updates;
use Piwik\Plugins\Installation\ServerFilesGenerator;
-use Piwik\Updates;
use Piwik\Updater;
+use Piwik\Updates as PiwikUpdates;
-/**
- */
-class Updates_2_3_0_rc2 extends Updates
+class Updates_2_16_3_b1 extends PiwikUpdates
{
public function doUpdate(Updater $updater)
{
- ServerFilesGenerator::deleteHtAccessFiles();
-
- ServerFilesGenerator::createHtAccessFiles();
+ ServerFilesGenerator::createFilesForSecurity();
}
}
diff --git a/core/Updates/2.16.3-b2.php b/core/Updates/2.16.3-b2.php
new file mode 100644
index 0000000000..3a1e75722d
--- /dev/null
+++ b/core/Updates/2.16.3-b2.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Updates;
+
+use Piwik\Updater;
+use Piwik\Updates as PiwikUpdates;
+
+/**
+ * Update for version 2.16.3b2
+ */
+class Updates_2_16_3_b2 extends PiwikUpdates
+{
+
+ public function doUpdate(Updater $updater)
+ {
+ try {
+ \Piwik\Plugin\Manager::getInstance()->activatePlugin('CustomPiwikJs');
+ } catch (\Exception $e) {
+ }
+ }
+}
diff --git a/core/Updates/2.4.0-b2.php b/core/Updates/2.4.0-b2.php
deleted file mode 100644
index 16d09d0379..0000000000
--- a/core/Updates/2.4.0-b2.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Updates;
-
-use Piwik\Plugins\Installation\ServerFilesGenerator;
-use Piwik\Updates;
-use Piwik\Updater;
-
-/**
- */
-class Updates_2_4_0_b2 extends Updates
-{
- public function doUpdate(Updater $updater)
- {
- ServerFilesGenerator::deleteWebConfigFiles();
- ServerFilesGenerator::createWebConfigFiles();
-
- ServerFilesGenerator::deleteHtAccessFiles();
- ServerFilesGenerator::createHtAccessFiles();
- }
-}
diff --git a/core/Url.php b/core/Url.php
index 2a301a9b46..a0d480da33 100644
--- a/core/Url.php
+++ b/core/Url.php
@@ -711,6 +711,10 @@ class Url
*/
protected static function getCurrentSchemeFromRequestHeader()
{
+ if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'http') {
+ return 'http';
+ }
+
if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] === true))
|| (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
) {
diff --git a/core/View.php b/core/View.php
index b57a7f553b..0a2cbabb67 100644
--- a/core/View.php
+++ b/core/View.php
@@ -86,7 +86,7 @@ if (!defined('PIWIK_USER_PATH')) {
* which is outputted in the template, eg, `{{ postEvent('MyPlugin.event') }}`
* - **isPluginLoaded**: Returns true if the supplied plugin is loaded, false if otherwise.
* `{% if isPluginLoaded('Goals') %}...{% endif %}`
- * - **arePiwikProAdsEnabled**: Returns true if it is ok to show some Piwik PRO advertising in the UI (from Piwik 2.16.0)
+ * - **areAdsForProfessionalServicesEnabled**: Returns true if it is ok to show some advertising in the UI for providers of Professional Support for Piwik (from Piwik 2.16.0)
*
* ### Examples
*
@@ -229,8 +229,8 @@ class View implements ViewInterface
$this->disableLink = Common::getRequestVar('disableLink', 0, 'int');
$this->isWidget = Common::getRequestVar('widget', 0, 'int');
- $piwikProAds = StaticContainer::get('Piwik\PiwikPro\Advertising');
- $this->arePiwikProAdsEnabled = $piwikProAds->arePiwikProAdsEnabled();
+ $piwikAds = StaticContainer::get('Piwik\ProfessionalServices\Advertising');
+ $this->areAdsForProfessionalServicesEnabled = $piwikAds->areAdsForProfessionalServicesEnabled();
if (Development::isEnabled()) {
$cacheBuster = rand(0, 10000);
@@ -253,7 +253,8 @@ class View implements ViewInterface
ProxyHttp::overrideCacheControlHeaders('no-store');
Common::sendHeader('Content-Type: ' . $this->contentType);
- // always sending this header, sometimes empty, to ensure that Dashboard embed loads (which could call this header() multiple times, the last one will prevail)
+ // always sending this header, sometimes empty, to ensure that Dashboard embed loads
+ // - when calling sendHeader() multiple times, the last one prevails
Common::sendHeader('X-Frame-Options: ' . (string)$this->xFrameOptions);
return $this->renderTwigTemplate();
diff --git a/core/View/OneClickDone.php b/core/View/OneClickDone.php
index cff974273b..6095efbae9 100644
--- a/core/View/OneClickDone.php
+++ b/core/View/OneClickDone.php
@@ -9,6 +9,8 @@
namespace Piwik\View;
+use Piwik\Common;
+
/**
* Post-update view
*
@@ -57,11 +59,11 @@ class OneClickDone
public function render()
{
// set response headers
- @header('Content-Type: text/html; charset=UTF-8');
- @header('Pragma: ');
- @header('Expires: ');
- @header('Cache-Control: must-revalidate');
- @header('X-Frame-Options: deny');
+ @Common::sendHeader('Content-Type: text/html; charset=UTF-8');
+ @Common::sendHeader('Pragma: ');
+ @Common::sendHeader('Expires: ');
+ @Common::sendHeader('Cache-Control: must-revalidate');
+ @Common::sendHeader('X-Frame-Options: deny');
$error = htmlspecialchars($this->error, ENT_QUOTES, 'UTF-8');
$messages = htmlspecialchars(serialize($this->feedbackMessages), ENT_QUOTES, 'UTF-8');
diff --git a/core/testMinimumPhpVersion.php b/core/testMinimumPhpVersion.php
index 19388d7bb1..a63453ea85 100644
--- a/core/testMinimumPhpVersion.php
+++ b/core/testMinimumPhpVersion.php
@@ -144,7 +144,7 @@ if (!function_exists('Piwik_GetErrorMessagePage')) {
<li><a rel="noreferrer" target="_blank" href="http://piwik.org/faq/">Piwik Frequently Asked Questions</a></li>
<li><a rel="noreferrer" target="_blank" href="http://piwik.org/docs/">Piwik Documentation</a></li>
<li><a rel="noreferrer" target="_blank" href="http://forum.piwik.org/">Piwik Forums</a></li>
- <li><a rel="noreferrer" target="_blank" href="https://piwik.pro/contact/?pk_campaign=App_AnErrorOccured&pk_source=Piwik_App&pk_medium=ProfessionalServicesLink#contact-form">Professional help (Piwik PRO)</a></li>
+ <li><a rel="noreferrer" target="_blank" href="https://piwik.org/support/?pk_campaign=App_AnErrorOccured&pk_source=Piwik_App&pk_medium=ProfessionalServicesLink">Professional help for Piwik</a></li>
</ul>';
}
if ($optionalLinkBack) {
diff --git a/js/README.md b/js/README.md
index 9556dc402e..b3700827eb 100644
--- a/js/README.md
+++ b/js/README.md
@@ -46,11 +46,11 @@ The js/ folder contains:
```bash
$ cd /path/to/piwik/js/
- $ sed '/<DEBUG>/,/<\/DEBUG>/d' < piwik.js | sed 's/eval/replacedEvilString/' | java -jar yuicompressor-2.4.7/build/yuicompressor-2.4.7.jar --type js --line-break 1000 | sed 's/replacedEvilString/eval/' | sed 's/^[/][*]/\/*!/' > piwik-min.js && cp piwik-min.js ../piwik.js
+ $ sed '/<DEBUG>/,/<\/DEBUG>/d' < piwik.js | sed 's/eval/replacedEvilString/' | java -jar yuicompressor-2.4.7/build/yuicompressor-2.4.7.jar --type js --line-break 1000 | sed 's/replacedEvilString/eval/' | sed 's/^[/][*]/\/*!/' > piwik.min.js && cp piwik.min.js ../piwik.js
```
- This will generate the minify /path/to/piwik/js/piwik-min.js and copy it to
- /path/to/piwik/piwik.js
+ This will generate the minify /path/to/piwik/js/piwik.min.js and copy it to
+ /path/to/piwik/piwik.js. Both "js/piwik.min.js" and "piwik.js" need to be committed.
* In a production environment, the tests/javascript folder is not used and can
be removed (if present).
diff --git a/js/piwik.js b/js/piwik.js
index aa3d2f8921..9a135e5edc 100644
--- a/js/piwik.js
+++ b/js/piwik.js
@@ -957,7 +957,7 @@ if (typeof JSON2 !== 'object' && typeof window.JSON === 'object' && window.JSON.
/*global unescape */
/*global ActiveXObject */
/*members Piwik, encodeURIComponent, decodeURIComponent, getElementsByTagName,
- shift, unshift, piwikAsyncInit, frameElement, self, hasFocus,
+ shift, unshift, piwikAsyncInit, piwikPluginAsyncInit, frameElement, self, hasFocus,
createElement, appendChild, characterSet, charset, all,
addEventListener, attachEvent, removeEventListener, detachEvent, disableCookies,
cookie, domain, readyState, documentElement, doScroll, title, text,
@@ -972,9 +972,9 @@ if (typeof JSON2 !== 'object' && typeof window.JSON === 'object' && window.JSON.
onload, src,
min, round, random,
exec,
- res, width, height, devicePixelRatio,
+ res, width, height,
pdf, qt, realp, wma, dir, fla, java, gears, ag,
- hook, getHook, getVisitorId, getVisitorInfo, setUserId, getUserId, setSiteId, getSiteId, setTrackerUrl, getTrackerUrl, appendToTrackingUrl, getRequest, addPlugin,
+ initialized, hook, getHook, getVisitorId, getVisitorInfo, setUserId, getUserId, setSiteId, getSiteId, setTrackerUrl, getTrackerUrl, appendToTrackingUrl, getRequest, addPlugin,
getAttributionInfo, getAttributionCampaignName, getAttributionCampaignKeyword,
getAttributionReferrerTimestamp, getAttributionReferrerUrl,
setCustomData, getCustomData,
@@ -993,7 +993,7 @@ if (typeof JSON2 !== 'object' && typeof window.JSON === 'object' && window.JSON.
doNotTrack, setDoNotTrack, msDoNotTrack, getValuesFromVisitorIdCookie,
addListener, enableLinkTracking, enableJSErrorTracking, setLinkTrackingTimer,
enableHeartBeatTimer, disableHeartBeatTimer, killFrame, redirectFile, setCountPreRendered,
- trackGoal, trackLink, trackPageView, trackSiteSearch, trackEvent,
+ trackGoal, trackLink, trackPageView, trackRequest, trackSiteSearch, trackEvent,
setEcommerceView, addEcommerceItem, trackEcommerceOrder, trackEcommerceCartUpdate,
deleteCookie, deleteCookies, offsetTop, offsetLeft, offsetHeight, offsetWidth, nodeType, defaultView,
innerHTML, scrollLeft, scrollTop, currentStyle, getComputedStyle, querySelectorAll, splice,
@@ -1025,12 +1025,12 @@ if (typeof JSON2 !== 'object' && typeof window.JSON === 'object' && window.JSON.
newVisitor, uuid, createTs, visitCount, currentVisitTs, lastVisitTs, lastEcommerceOrderTs,
"", "\b", "\t", "\n", "\f", "\r", "\"", "\\", apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, lastIndex, length, parse, prototype, push, replace,
- sort, slice, stringify, test, toJSON, toString, valueOf, objectToJSON
+ sort, slice, stringify, test, toJSON, toString, valueOf, objectToJSON, addTracker, removeAllAsyncTrackersButFirst
*/
/*global _paq:true */
/*members push */
/*global Piwik:true */
-/*members addPlugin, getTracker, getAsyncTracker */
+/*members addPlugin, getTracker, getAsyncTracker, getAsyncTrackers, addTracker, trigger, on, off */
/*global Piwik_Overlay_Client */
/*global AnalyticsTracker:true */
/*members initialize */
@@ -1059,6 +1059,8 @@ if (typeof window.Piwik !== 'object') {
/* plugins */
plugins = {},
+ eventHandlers = {},
+
/* alias frequently used globals for added minification */
documentAlias = document,
navigatorAlias = navigator,
@@ -1078,7 +1080,7 @@ if (typeof window.Piwik !== 'object') {
urldecode = unescape,
/* asynchronous tracker */
- asyncTracker,
+ asyncTrackers = [],
/* iterator */
iterator,
@@ -1156,6 +1158,17 @@ if (typeof window.Piwik !== 'object') {
return isEmpty;
}
+ /**
+ * Logs an error in the console.
+ * Note: it does not generate a JavaScript error, so make sure to also generate an error if needed.
+ * @param message
+ */
+ function logConsoleError(message) {
+ if (console !== undefined && console && console.error) {
+ console.error(message);
+ }
+ }
+
/*
* apply wrapper
*
@@ -1165,17 +1178,62 @@ if (typeof window.Piwik !== 'object') {
* [ functionObject, optional_parameters ]
*/
function apply() {
- var i, f, parameterArray;
+ var i, j, f, parameterArray;
for (i = 0; i < arguments.length; i += 1) {
parameterArray = arguments[i];
f = parameterArray.shift();
- if (isString(f)) {
- asyncTracker[f].apply(asyncTracker, parameterArray);
- } else {
- f.apply(asyncTracker, parameterArray);
+ for (j = 0; j < asyncTrackers.length; j++) {
+ if (isString(f)) {
+ var context = asyncTrackers[j];
+ var fParts;
+
+ var isStaticPluginCall = f.indexOf('::') > 0;
+ if (isStaticPluginCall) {
+ fParts = f.split('::');
+ context = fParts[0];
+ f = fParts[1];
+
+ if ('object' === typeof Piwik[context] && 'function' === typeof Piwik[context][f]) {
+ Piwik[context][f].apply(Piwik[context], parameterArray);
+ }
+
+ return;
+ }
+
+ var isPluginTrackerCall = f.indexOf('.') > 0;
+
+ if (isPluginTrackerCall) {
+ fParts = f.split('.');
+ context = context[fParts[0]];
+ f = fParts[1];
+ }
+
+ if (context[f]) {
+ context[f].apply(context, parameterArray);
+ } else {
+ var message = 'The method \'' + f + '\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: http://developer.piwik.org/api-reference/tracking-javascript';
+ logConsoleError(message);
+ if (!isPluginTrackerCall) {
+ throw new TypeError(message);
+ }
+ }
+
+ if (f === 'addTracker') {
+ // addTracker adds an entry to asyncTrackers and would otherwise result in an endless loop
+ break;
+ }
+
+ if (f === 'setTrackerUrl' || f === 'setSiteId') {
+ // these two methods should be only executed on the first tracker
+ break;
+ }
+ } else {
+ f.apply(asyncTrackers[j], parameterArray);
+ }
}
+
}
}
@@ -1202,14 +1260,17 @@ if (typeof window.Piwik !== 'object') {
function executePluginMethod(methodName, callback) {
var result = '',
i,
- pluginMethod;
+ pluginMethod, value;
for (i in plugins) {
if (Object.prototype.hasOwnProperty.call(plugins, i)) {
pluginMethod = plugins[i][methodName];
if (isFunction(pluginMethod)) {
- result += pluginMethod(callback);
+ value = pluginMethod(callback);
+ if (value) {
+ result += value;
+ }
}
}
}
@@ -1632,6 +1693,11 @@ if (typeof window.Piwik !== 'object') {
return -1;
}
+ function stringStartsWith(str, prefix) {
+ str = String(str);
+ return str.lastIndexOf(prefix, 0) === 0;
+ }
+
function stringEndsWith(str, suffix) {
str = String(str);
return str.indexOf(suffix, str.length - suffix.length) !== -1;
@@ -2692,13 +2758,24 @@ if (typeof window.Piwik !== 'object') {
}
function isInsideAnIframe () {
- if (isDefined(windowAlias.frameElement)) {
- return (windowAlias.frameElement && String(windowAlias.frameElement.nodeName).toLowerCase() === 'iframe');
+ var frameElement;
+
+ try {
+ // If the parent window has another origin, then accessing frameElement
+ // throws an Error in IE. see issue #10105.
+ frameElement = windowAlias.frameElement;
+ } catch(e) {
+ // When there was an Error, then we know we are inside an iframe.
+ return true;
+ }
+
+ if (isDefined(frameElement)) {
+ return (frameElement && String(frameElement.nodeName).toLowerCase() === 'iframe') ? true : false;
}
try {
return windowAlias.self !== windowAlias.top;
- } catch (e) {
+ } catch (e2) {
return true;
}
}
@@ -2768,7 +2845,7 @@ if (typeof window.Piwik !== 'object') {
configCustomUrl,
// Document title
- configTitle = documentAlias.title,
+ configTitle = '',
// Extensions to be treated as download links
configDownloadExtensions = ['7z','aac','apk','arc','arj','asf','asx','avi','azw3','bin','csv','deb','dmg','doc','docx','epub','exe','flv','gif','gz','gzip','hqx','ibooks','jar','jpg','jpeg','js','mobi','mp2','mp3','mp4','mpg','mpeg','mov','movie','msi','msp','odb','odf','odg','ods','odt','ogg','ogv','pdf','phps','png','ppt','pptx','qt','qtm','ra','ram','rar','rpm','sea','sit','tar','tbz','tbz2','bz','bz2','tgz','torrent','txt','wav','wma','wmv','wpd','xls','xlsx','xml','z','zip'],
@@ -2820,7 +2897,7 @@ if (typeof window.Piwik !== 'object') {
// Default is user agent defined.
configCookiePath,
- // Cookies are disabled
+ // First-party cookies are disabled
configCookiesDisabled = false,
// Do Not Track
@@ -2910,6 +2987,13 @@ if (typeof window.Piwik !== 'object') {
// Domain hash value
domainHash;
+ // Document title
+ try {
+ configTitle = documentAlias.title;
+ } catch(e) {
+ configTitle = '';
+ }
+
/*
* Set cookie value
*/
@@ -3029,10 +3113,17 @@ if (typeof window.Piwik !== 'object') {
function getPathName(url) {
var parser = document.createElement('a');
if (url.indexOf('//') !== 0 && url.indexOf('http') !== 0) {
+ if (url.indexOf('*') === 0) {
+ url = url.substr(1);
+ }
+ if (url.indexOf('.') === 0) {
+ url = url.substr(1);
+ }
url = 'http://' + url;
}
parser.href = content.toAbsoluteUrl(url);
+
if (parser.pathname) {
return parser.pathname;
}
@@ -3042,7 +3133,15 @@ if (typeof window.Piwik !== 'object') {
function isSitePath (path, pathAlias)
{
- var matchesAnyPath = (!pathAlias || pathAlias === '/' || pathAlias === '/*');
+ if(!stringStartsWith(pathAlias, '/')) {
+ pathAlias = '/' + pathAlias;
+ }
+
+ if(!stringStartsWith(path, '/')) {
+ path = '/' + path;
+ }
+
+ var matchesAnyPath = (pathAlias === '/' || pathAlias === '/*');
if (matchesAnyPath) {
return true;
@@ -3052,10 +3151,6 @@ if (typeof window.Piwik !== 'object') {
return true;
}
- if (!path) {
- return false;
- }
-
pathAlias = String(pathAlias).toLowerCase();
path = String(path).toLowerCase();
@@ -3163,6 +3258,8 @@ if (typeof window.Piwik !== 'object') {
iterator = 0; // To avoid JSLint warning of empty block
if (typeof callback === 'function') { callback(); }
};
+ // make sure to actually load an image so callback gets invoked
+ request = request.replace("send_image=0","send_image=1");
image.src = configTrackerUrl + (configTrackerUrl.indexOf('?') < 0 ? '?' : '&') + request;
}
@@ -3191,7 +3288,7 @@ if (typeof window.Piwik !== 'object') {
if (this.readyState === 4 && !(this.status >= 200 && this.status < 300) && fallbackToGet) {
getImage(request, callback);
} else {
- if (typeof callback === 'function') { callback(); }
+ if (this.readyState === 4 && (typeof callback === 'function')) { callback(); }
}
};
@@ -3859,7 +3956,7 @@ if (typeof window.Piwik !== 'object') {
// custom dimensions
for (i in customDimensions) {
if (Object.prototype.hasOwnProperty.call(customDimensions, i)) {
- var isNotSetYet = (-1 === customDimensionIdsAlreadyHandled.indexOf(i));
+ var isNotSetYet = (-1 === indexOfArray(customDimensionIdsAlreadyHandled, i));
if (isNotSetYet) {
request += '&dimension' + i + '=' + customDimensions[i];
}
@@ -3956,9 +4053,10 @@ if (typeof window.Piwik !== 'object') {
lastEcommerceOrderTs,
now = new Date(),
items = [],
- sku;
+ sku,
+ isEcommerceOrder = String(orderId).length;
- if (String(orderId).length) {
+ if (isEcommerceOrder) {
request += '&ec_id=' + encodeWrapper(orderId);
// Record date of order in the visitor cookie
lastEcommerceOrderTs = Math.round(now.getTime() / 1000);
@@ -4014,6 +4112,10 @@ if (typeof window.Piwik !== 'object') {
}
request = getRequest(request, configCustomData, 'ecommerce', lastEcommerceOrderTs);
sendRequest(request, configTrackerPause);
+
+ if (isEcommerceOrder) {
+ ecommerceItems = {};
+ }
}
function logEcommerceOrder(orderId, grandTotal, subTotal, tax, shipping, discount) {
@@ -4032,10 +4134,10 @@ if (typeof window.Piwik !== 'object') {
/*
* Log the page view / visit
*/
- function logPageView(customTitle, customData) {
+ function logPageView(customTitle, customData, callback) {
var request = getRequest('action_name=' + encodeWrapper(titleFixup(customTitle || configTitle)), customData, 'log');
- sendRequest(request, configTrackerPause);
+ sendRequest(request, configTrackerPause, callback);
}
/*
@@ -4973,8 +5075,7 @@ if (typeof window.Piwik !== 'object') {
java: 'application/x-java-vm',
gears: 'application/x-googlegears',
ag: 'application/x-silverlight'
- },
- devicePixelRatio = windowAlias.devicePixelRatio || 1;
+ };
// detect browser features except IE < 11 (IE 11 user agent is no longer MSIE)
if (!((new RegExp('MSIE')).test(navigatorAlias.userAgent))) {
@@ -5005,8 +5106,8 @@ if (typeof window.Piwik !== 'object') {
browserFeatures.cookie = hasCookies();
}
- var width = parseInt(screenAlias.width, 10) * devicePixelRatio;
- var height = parseInt(screenAlias.height, 10) * devicePixelRatio;
+ var width = parseInt(screenAlias.width, 10);
+ var height = parseInt(screenAlias.height, 10);
browserFeatures.res = parseInt(width, 10) + 'x' + parseInt(height, 10);
}
@@ -5056,1279 +5157,1339 @@ if (typeof window.Piwik !== 'object') {
* Public data and methods
************************************************************/
- return {
+
/*<DEBUG>*/
- /*
- * Test hook accessors
- */
- hook: registeredHooks,
- getHook: function (hookName) {
- return registeredHooks[hookName];
- },
- getQuery: function () {
- return query;
- },
- getContent: function () {
- return content;
- },
+ /*
+ * Test hook accessors
+ */
+ this.hook = registeredHooks;
+ this.getHook = function (hookName) {
+ return registeredHooks[hookName];
+ };
+ this.getQuery = function () {
+ return query;
+ };
+ this.getContent = function () {
+ return content;
+ };
- buildContentImpressionRequest: buildContentImpressionRequest,
- buildContentInteractionRequest: buildContentInteractionRequest,
- buildContentInteractionRequestNode: buildContentInteractionRequestNode,
- buildContentInteractionTrackingRedirectUrl: buildContentInteractionTrackingRedirectUrl,
- getContentImpressionsRequestsFromNodes: getContentImpressionsRequestsFromNodes,
- getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet: getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet,
- trackCallbackOnLoad: trackCallbackOnLoad,
- trackCallbackOnReady: trackCallbackOnReady,
- buildContentImpressionsRequests: buildContentImpressionsRequests,
- wasContentImpressionAlreadyTracked: wasContentImpressionAlreadyTracked,
- appendContentInteractionToRequestIfPossible: getContentInteractionToRequestIfPossible,
- setupInteractionsTracking: setupInteractionsTracking,
- trackContentImpressionClickInteraction: trackContentImpressionClickInteraction,
- internalIsNodeVisible: isVisible,
- isNodeAuthorizedToTriggerInteraction: isNodeAuthorizedToTriggerInteraction,
- replaceHrefIfInternalLink: replaceHrefIfInternalLink,
- getDomains: function () {
- return configHostsAlias;
- },
- getConfigCookiePath: function () {
- return configCookiePath;
- },
- getConfigDownloadExtensions: function () {
- return configDownloadExtensions;
- },
- enableTrackOnlyVisibleContent: function (checkOnScroll, timeIntervalInMs) {
- return enableTrackOnlyVisibleContent(checkOnScroll, timeIntervalInMs, this);
- },
- clearTrackedContentImpressions: function () {
- trackedContentImpressions = [];
- },
- getTrackedContentImpressions: function () {
- return trackedContentImpressions;
- },
- clearEnableTrackOnlyVisibleContent: function () {
- isTrackOnlyVisibleContentEnabled = false;
- },
- disableLinkTracking: function () {
- linkTrackingInstalled = false;
- linkTrackingEnabled = false;
- },
- getConfigVisitorCookieTimeout: function () {
- return configVisitorCookieTimeout;
- },
- getRemainingVisitorCookieTimeout: getRemainingVisitorCookieTimeout,
+ this.buildContentImpressionRequest = buildContentImpressionRequest;
+ this.buildContentInteractionRequest = buildContentInteractionRequest;
+ this.buildContentInteractionRequestNode = buildContentInteractionRequestNode;
+ this.buildContentInteractionTrackingRedirectUrl = buildContentInteractionTrackingRedirectUrl;
+ this.getContentImpressionsRequestsFromNodes = getContentImpressionsRequestsFromNodes;
+ this.getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet = getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet;
+ this.trackCallbackOnLoad = trackCallbackOnLoad;
+ this.trackCallbackOnReady = trackCallbackOnReady;
+ this.buildContentImpressionsRequests = buildContentImpressionsRequests;
+ this.wasContentImpressionAlreadyTracked = wasContentImpressionAlreadyTracked;
+ this.appendContentInteractionToRequestIfPossible = getContentInteractionToRequestIfPossible;
+ this.setupInteractionsTracking = setupInteractionsTracking;
+ this.trackContentImpressionClickInteraction = trackContentImpressionClickInteraction;
+ this.internalIsNodeVisible = isVisible;
+ this.isNodeAuthorizedToTriggerInteraction = isNodeAuthorizedToTriggerInteraction;
+ this.replaceHrefIfInternalLink = replaceHrefIfInternalLink;
+ this.getDomains = function () {
+ return configHostsAlias;
+ };
+ this.getConfigCookiePath = function () {
+ return configCookiePath;
+ };
+ this.getConfigDownloadExtensions = function () {
+ return configDownloadExtensions;
+ };
+ this.enableTrackOnlyVisibleContent = function (checkOnScroll, timeIntervalInMs) {
+ return enableTrackOnlyVisibleContent(checkOnScroll, timeIntervalInMs, this);
+ };
+ this.clearTrackedContentImpressions = function () {
+ trackedContentImpressions = [];
+ };
+ this.getTrackedContentImpressions = function () {
+ return trackedContentImpressions;
+ };
+ this.clearEnableTrackOnlyVisibleContent = function () {
+ isTrackOnlyVisibleContentEnabled = false;
+ };
+ this.disableLinkTracking = function () {
+ linkTrackingInstalled = false;
+ linkTrackingEnabled = false;
+ };
+ this.getConfigVisitorCookieTimeout = function () {
+ return configVisitorCookieTimeout;
+ };
+ this.removeAllAsyncTrackersButFirst = function () {
+ var firstTracker = asyncTrackers[0];
+ asyncTrackers = [firstTracker];
+ };
+ this.getRemainingVisitorCookieTimeout = getRemainingVisitorCookieTimeout;
/*</DEBUG>*/
- /**
- * Get visitor ID (from first party cookie)
- *
- * @return string Visitor ID in hexits (or empty string, if not yet known)
- */
- getVisitorId: function () {
- return getValuesFromVisitorIdCookie().uuid;
- },
-
- /**
- * Get the visitor information (from first party cookie)
- *
- * @return array
- */
- getVisitorInfo: function () {
- // Note: in a new method, we could return also return getValuesFromVisitorIdCookie()
- // which returns named parameters rather than returning integer indexed array
- return loadVisitorIdCookie();
- },
+ /**
+ * Get visitor ID (from first party cookie)
+ *
+ * @return string Visitor ID in hexits (or empty string, if not yet known)
+ */
+ this.getVisitorId = function () {
+ return getValuesFromVisitorIdCookie().uuid;
+ };
- /**
- * Get the Attribution information, which is an array that contains
- * the Referrer used to reach the site as well as the campaign name and keyword
- * It is useful only when used in conjunction with Tracker API function setAttributionInfo()
- * To access specific data point, you should use the other functions getAttributionReferrer* and getAttributionCampaign*
- *
- * @return array Attribution array, Example use:
- * 1) Call JSON2.stringify(piwikTracker.getAttributionInfo())
- * 2) Pass this json encoded string to the Tracking API (php or java client): setAttributionInfo()
- */
- getAttributionInfo: function () {
- return loadReferrerAttributionCookie();
- },
+ /**
+ * Get the visitor information (from first party cookie)
+ *
+ * @return array
+ */
+ this.getVisitorInfo = function () {
+ // Note: in a new method, we could return also return getValuesFromVisitorIdCookie()
+ // which returns named parameters rather than returning integer indexed array
+ return loadVisitorIdCookie();
+ };
- /**
- * Get the Campaign name that was parsed from the landing page URL when the visitor
- * landed on the site originally
- *
- * @return string
- */
- getAttributionCampaignName: function () {
- return loadReferrerAttributionCookie()[0];
- },
+ /**
+ * Get the Attribution information, which is an array that contains
+ * the Referrer used to reach the site as well as the campaign name and keyword
+ * It is useful only when used in conjunction with Tracker API function setAttributionInfo()
+ * To access specific data point, you should use the other functions getAttributionReferrer* and getAttributionCampaign*
+ *
+ * @return array Attribution array, Example use:
+ * 1) Call JSON2.stringify(piwikTracker.getAttributionInfo())
+ * 2) Pass this json encoded string to the Tracking API (php or java client): setAttributionInfo()
+ */
+ this.getAttributionInfo = function () {
+ return loadReferrerAttributionCookie();
+ };
- /**
- * Get the Campaign keyword that was parsed from the landing page URL when the visitor
- * landed on the site originally
- *
- * @return string
- */
- getAttributionCampaignKeyword: function () {
- return loadReferrerAttributionCookie()[1];
- },
+ /**
+ * Get the Campaign name that was parsed from the landing page URL when the visitor
+ * landed on the site originally
+ *
+ * @return string
+ */
+ this.getAttributionCampaignName = function () {
+ return loadReferrerAttributionCookie()[0];
+ };
- /**
- * Get the time at which the referrer (used for Goal Attribution) was detected
- *
- * @return int Timestamp or 0 if no referrer currently set
- */
- getAttributionReferrerTimestamp: function () {
- return loadReferrerAttributionCookie()[2];
- },
+ /**
+ * Get the Campaign keyword that was parsed from the landing page URL when the visitor
+ * landed on the site originally
+ *
+ * @return string
+ */
+ this.getAttributionCampaignKeyword = function () {
+ return loadReferrerAttributionCookie()[1];
+ };
- /**
- * Get the full referrer URL that will be used for Goal Attribution
- *
- * @return string Raw URL, or empty string '' if no referrer currently set
- */
- getAttributionReferrerUrl: function () {
- return loadReferrerAttributionCookie()[3];
- },
+ /**
+ * Get the time at which the referrer (used for Goal Attribution) was detected
+ *
+ * @return int Timestamp or 0 if no referrer currently set
+ */
+ this.getAttributionReferrerTimestamp = function () {
+ return loadReferrerAttributionCookie()[2];
+ };
- /**
- * Specify the Piwik server URL
- *
- * @param string trackerUrl
- */
- setTrackerUrl: function (trackerUrl) {
- configTrackerUrl = trackerUrl;
- },
+ /**
+ * Get the full referrer URL that will be used for Goal Attribution
+ *
+ * @return string Raw URL, or empty string '' if no referrer currently set
+ */
+ this.getAttributionReferrerUrl = function () {
+ return loadReferrerAttributionCookie()[3];
+ };
+ /**
+ * Specify the Piwik server URL
+ *
+ * @param string trackerUrl
+ */
+ this.setTrackerUrl = function (trackerUrl) {
+ configTrackerUrl = trackerUrl;
+ };
- /**
- * Returns the Piwik server URL
- * @returns string
- */
- getTrackerUrl: function () {
- return configTrackerUrl;
- },
+ /**
+ * Returns the Piwik server URL
+ * @returns string
+ */
+ this.getTrackerUrl = function () {
+ return configTrackerUrl;
+ };
+ /**
+ * Adds a new tracker. All sent requests will be also sent to the given siteId and piwikUrl.
+ * If piwikUrl is not set, current url will be used.
+ *
+ * @param null|string piwikUrl If null, will reuse the same tracker URL of the current tracker instance
+ * @param int|string siteId
+ * @return Tracker
+ */
+ this.addTracker = function (piwikUrl, siteId) {
+ if (!siteId) {
+ throw new Error('A siteId must be given to add a new tracker');
+ }
- /**
- * Returns the site ID
- *
- * @returns int
- */
- getSiteId: function() {
- return configTrackerSiteId;
- },
+ if (!isDefined(piwikUrl) || null === piwikUrl) {
+ piwikUrl = this.getTrackerUrl();
+ }
- /**
- * Specify the site ID
- *
- * @param int|string siteId
- */
- setSiteId: function (siteId) {
- setSiteId(siteId);
- },
+ var tracker = new Tracker(piwikUrl, siteId);
- /**
- * Sets a User ID to this user (such as an email address or a username)
- *
- * @param string User ID
- */
- setUserId: function (userId) {
- if(!isDefined(userId) || !userId.length) {
- return;
- }
- configUserId = userId;
- visitorUUID = hash(configUserId).substr(0, 16);
- },
+ asyncTrackers.push(tracker);
- /**
- * Gets the User ID if set.
- *
- * @returns string User ID
- */
- getUserId: function() {
- return configUserId;
- },
+ return tracker;
+ };
- /**
- * Pass custom data to the server
- *
- * Examples:
- * tracker.setCustomData(object);
- * tracker.setCustomData(key, value);
- *
- * @param mixed key_or_obj
- * @param mixed opt_value
- */
- setCustomData: function (key_or_obj, opt_value) {
- if (isObject(key_or_obj)) {
- configCustomData = key_or_obj;
- } else {
- if (!configCustomData) {
- configCustomData = {};
- }
- configCustomData[key_or_obj] = opt_value;
- }
- },
+ /**
+ * Returns the site ID
+ *
+ * @returns int
+ */
+ this.getSiteId = function() {
+ return configTrackerSiteId;
+ };
- /**
- * Get custom data
- *
- * @return mixed
- */
- getCustomData: function () {
- return configCustomData;
- },
+ /**
+ * Specify the site ID
+ *
+ * @param int|string siteId
+ */
+ this.setSiteId = function (siteId) {
+ setSiteId(siteId);
+ };
- /**
- * Configure function with custom request content processing logic.
- * It gets called after request content in form of query parameters string has been prepared and before request content gets sent.
- *
- * Examples:
- * tracker.setCustomRequestProcessing(function(request){
- * var pairs = request.split('&');
- * var result = {};
- * pairs.forEach(function(pair) {
- * pair = pair.split('=');
- * result[pair[0]] = decodeURIComponent(pair[1] || '');
- * });
- * return JSON.stringify(result);
- * });
- *
- * @param function customRequestContentProcessingLogic
- */
- setCustomRequestProcessing: function (customRequestContentProcessingLogic) {
- configCustomRequestContentProcessing = customRequestContentProcessingLogic;
- },
+ /**
+ * Sets a User ID to this user (such as an email address or a username)
+ *
+ * @param string User ID
+ */
+ this.setUserId = function (userId) {
+ if(!isDefined(userId) || !userId.length) {
+ return;
+ }
+ configUserId = userId;
+ visitorUUID = hash(configUserId).substr(0, 16);
+ };
- /**
- * Appends the specified query string to the piwik.php?... Tracking API URL
- *
- * @param string queryString eg. 'lat=140&long=100'
- */
- appendToTrackingUrl: function (queryString) {
- configAppendToTrackingUrl = queryString;
- },
+ /**
+ * Gets the User ID if set.
+ *
+ * @returns string User ID
+ */
+ this.getUserId = function() {
+ return configUserId;
+ };
- /**
- * Returns the query string for the current HTTP Tracking API request.
- * Piwik would prepend the hostname and path to Piwik: http://example.org/piwik/piwik.php?
- * prior to sending the request.
- *
- * @param request eg. "param=value&param2=value2"
- */
- getRequest: function (request) {
- return getRequest(request);
- },
+ /**
+ * Pass custom data to the server
+ *
+ * Examples:
+ * tracker.setCustomData(object);
+ * tracker.setCustomData(key, value);
+ *
+ * @param mixed key_or_obj
+ * @param mixed opt_value
+ */
+ this.setCustomData = function (key_or_obj, opt_value) {
+ if (isObject(key_or_obj)) {
+ configCustomData = key_or_obj;
+ } else {
+ if (!configCustomData) {
+ configCustomData = {};
+ }
+ configCustomData[key_or_obj] = opt_value;
+ }
+ };
- /**
- * Add plugin defined by a name and a callback function.
- * The callback function will be called whenever a tracking request is sent.
- * This can be used to append data to the tracking request, or execute other custom logic.
- *
- * @param string pluginName
- * @param Object pluginObj
- */
- addPlugin: function (pluginName, pluginObj) {
- plugins[pluginName] = pluginObj;
- },
+ /**
+ * Get custom data
+ *
+ * @return mixed
+ */
+ this.getCustomData = function () {
+ return configCustomData;
+ };
- /**
- * Set Custom Dimensions. Any set Custom Dimension will be cleared after a tracked pageview. Make
- * sure to set them again if needed.
- *
- * @param int index A Custom Dimension index
- * @param string value
- */
- setCustomDimension: function (customDimensionId, value) {
- customDimensionId = parseInt(customDimensionId, 10);
- if (customDimensionId > 0) {
- if (!isDefined(value)) {
- value = '';
- }
- if (!isString(value)) {
- value = String(value);
- }
- customDimensions[customDimensionId] = value;
- }
- },
+ /**
+ * Configure function with custom request content processing logic.
+ * It gets called after request content in form of query parameters string has been prepared and before request content gets sent.
+ *
+ * Examples:
+ * tracker.setCustomRequestProcessing(function(request){
+ * var pairs = request.split('&');
+ * var result = {};
+ * pairs.forEach(function(pair) {
+ * pair = pair.split('=');
+ * result[pair[0]] = decodeURIComponent(pair[1] || '');
+ * });
+ * return JSON.stringify(result);
+ * });
+ *
+ * @param function customRequestContentProcessingLogic
+ */
+ this.setCustomRequestProcessing = function (customRequestContentProcessingLogic) {
+ configCustomRequestContentProcessing = customRequestContentProcessingLogic;
+ };
- /**
- * Get a stored value for a specific Custom Dimension index.
- *
- * @param int index A Custom Dimension index
- */
- getCustomDimension: function (customDimensionId) {
- customDimensionId = parseInt(customDimensionId, 10);
- if (customDimensionId > 0 && Object.prototype.hasOwnProperty.call(customDimensions, customDimensionId)) {
- return customDimensions[customDimensionId];
- }
- },
+ /**
+ * Appends the specified query string to the piwik.php?... Tracking API URL
+ *
+ * @param string queryString eg. 'lat=140&long=100'
+ */
+ this.appendToTrackingUrl = function (queryString) {
+ configAppendToTrackingUrl = queryString;
+ };
- /**
- * Delete a custom dimension.
- *
- * @param int index Custom dimension Id
- */
- deleteCustomDimension: function (customDimensionId) {
- customDimensionId = parseInt(customDimensionId, 10);
- if (customDimensionId > 0) {
- delete customDimensions[customDimensionId];
- }
- },
+ /**
+ * Returns the query string for the current HTTP Tracking API request.
+ * Piwik would prepend the hostname and path to Piwik: http://example.org/piwik/piwik.php?
+ * prior to sending the request.
+ *
+ * @param request eg. "param=value&param2=value2"
+ */
+ this.getRequest = function (request) {
+ return getRequest(request);
+ };
- /**
- * Set custom variable within this visit
- *
- * @param int index Custom variable slot ID from 1-5
- * @param string name
- * @param string value
- * @param string scope Scope of Custom Variable:
- * - "visit" will store the name/value in the visit and will persist it in the cookie for the duration of the visit,
- * - "page" will store the name/value in the next page view tracked.
- * - "event" will store the name/value in the next event tracked.
- */
- setCustomVariable: function (index, name, value, scope) {
- var toRecord;
+ /**
+ * Add plugin defined by a name and a callback function.
+ * The callback function will be called whenever a tracking request is sent.
+ * This can be used to append data to the tracking request, or execute other custom logic.
+ *
+ * @param string pluginName
+ * @param Object pluginObj
+ */
+ this.addPlugin = function (pluginName, pluginObj) {
+ plugins[pluginName] = pluginObj;
+ };
- if (!isDefined(scope)) {
- scope = 'visit';
- }
- if (!isDefined(name)) {
- return;
- }
+ /**
+ * Set Custom Dimensions. Set Custom Dimensions will not be cleared after a tracked pageview and will
+ * be sent along all following tracking requests. It is possible to remove/clear a value via `deleteCustomDimension`.
+ *
+ * @param int index A Custom Dimension index
+ * @param string value
+ */
+ this.setCustomDimension = function (customDimensionId, value) {
+ customDimensionId = parseInt(customDimensionId, 10);
+ if (customDimensionId > 0) {
if (!isDefined(value)) {
- value = "";
+ value = '';
}
- if (index > 0) {
- name = !isString(name) ? String(name) : name;
- value = !isString(value) ? String(value) : value;
- toRecord = [name.slice(0, customVariableMaximumLength), value.slice(0, customVariableMaximumLength)];
- // numeric scope is there for GA compatibility
- if (scope === 'visit' || scope === 2) {
- loadCustomVariables();
- customVariables[index] = toRecord;
- } else if (scope === 'page' || scope === 3) {
- customVariablesPage[index] = toRecord;
- } else if (scope === 'event') { /* GA does not have 'event' scope but we do */
- customVariablesEvent[index] = toRecord;
- }
+ if (!isString(value)) {
+ value = String(value);
}
- },
+ customDimensions[customDimensionId] = value;
+ }
+ };
- /**
- * Get custom variable
- *
- * @param int index Custom variable slot ID from 1-5
- * @param string scope Scope of Custom Variable: "visit" or "page" or "event"
- */
- getCustomVariable: function (index, scope) {
- var cvar;
+ /**
+ * Get a stored value for a specific Custom Dimension index.
+ *
+ * @param int index A Custom Dimension index
+ */
+ this.getCustomDimension = function (customDimensionId) {
+ customDimensionId = parseInt(customDimensionId, 10);
+ if (customDimensionId > 0 && Object.prototype.hasOwnProperty.call(customDimensions, customDimensionId)) {
+ return customDimensions[customDimensionId];
+ }
+ };
- if (!isDefined(scope)) {
- scope = "visit";
- }
+ /**
+ * Delete a custom dimension.
+ *
+ * @param int index Custom dimension Id
+ */
+ this.deleteCustomDimension = function (customDimensionId) {
+ customDimensionId = parseInt(customDimensionId, 10);
+ if (customDimensionId > 0) {
+ delete customDimensions[customDimensionId];
+ }
+ };
- if (scope === "page" || scope === 3) {
- cvar = customVariablesPage[index];
- } else if (scope === "event") {
- cvar = customVariablesEvent[index];
- } else if (scope === "visit" || scope === 2) {
+ /**
+ * Set custom variable within this visit
+ *
+ * @param int index Custom variable slot ID from 1-5
+ * @param string name
+ * @param string value
+ * @param string scope Scope of Custom Variable:
+ * - "visit" will store the name/value in the visit and will persist it in the cookie for the duration of the visit,
+ * - "page" will store the name/value in the next page view tracked.
+ * - "event" will store the name/value in the next event tracked.
+ */
+ this.setCustomVariable = function (index, name, value, scope) {
+ var toRecord;
+
+ if (!isDefined(scope)) {
+ scope = 'visit';
+ }
+ if (!isDefined(name)) {
+ return;
+ }
+ if (!isDefined(value)) {
+ value = "";
+ }
+ if (index > 0) {
+ name = !isString(name) ? String(name) : name;
+ value = !isString(value) ? String(value) : value;
+ toRecord = [name.slice(0, customVariableMaximumLength), value.slice(0, customVariableMaximumLength)];
+ // numeric scope is there for GA compatibility
+ if (scope === 'visit' || scope === 2) {
loadCustomVariables();
- cvar = customVariables[index];
+ customVariables[index] = toRecord;
+ } else if (scope === 'page' || scope === 3) {
+ customVariablesPage[index] = toRecord;
+ } else if (scope === 'event') { /* GA does not have 'event' scope but we do */
+ customVariablesEvent[index] = toRecord;
}
+ }
+ };
- if (!isDefined(cvar)
- || (cvar && cvar[0] === '')) {
- return false;
- }
+ /**
+ * Get custom variable
+ *
+ * @param int index Custom variable slot ID from 1-5
+ * @param string scope Scope of Custom Variable: "visit" or "page" or "event"
+ */
+ this.getCustomVariable = function (index, scope) {
+ var cvar;
- return cvar;
- },
+ if (!isDefined(scope)) {
+ scope = "visit";
+ }
- /**
- * Delete custom variable
- *
- * @param int index Custom variable slot ID from 1-5
- * @param string scope
- */
- deleteCustomVariable: function (index, scope) {
- // Only delete if it was there already
- if (this.getCustomVariable(index, scope)) {
- this.setCustomVariable(index, '', '', scope);
- }
- },
+ if (scope === "page" || scope === 3) {
+ cvar = customVariablesPage[index];
+ } else if (scope === "event") {
+ cvar = customVariablesEvent[index];
+ } else if (scope === "visit" || scope === 2) {
+ loadCustomVariables();
+ cvar = customVariables[index];
+ }
- /**
- * When called then the Custom Variables of scope "visit" will be stored (persisted) in a first party cookie
- * for the duration of the visit. This is useful if you want to call getCustomVariable later in the visit.
- *
- * By default, Custom Variables of scope "visit" are not stored on the visitor's computer.
- */
- storeCustomVariablesInCookie: function () {
- configStoreCustomVariablesInCookie = true;
- },
+ if (!isDefined(cvar)
+ || (cvar && cvar[0] === '')) {
+ return false;
+ }
- /**
- * Set delay for link tracking (in milliseconds)
- *
- * @param int delay
- */
- setLinkTrackingTimer: function (delay) {
- configTrackerPause = delay;
- },
+ return cvar;
+ };
- /**
- * Set list of file extensions to be recognized as downloads
- *
- * @param string|array extensions
- */
- setDownloadExtensions: function (extensions) {
- if(isString(extensions)) {
- extensions = extensions.split('|');
- }
- configDownloadExtensions = extensions;
- },
+ /**
+ * Delete custom variable
+ *
+ * @param int index Custom variable slot ID from 1-5
+ * @param string scope
+ */
+ this.deleteCustomVariable = function (index, scope) {
+ // Only delete if it was there already
+ if (this.getCustomVariable(index, scope)) {
+ this.setCustomVariable(index, '', '', scope);
+ }
+ };
- /**
- * Specify additional file extensions to be recognized as downloads
- *
- * @param string|array extensions for example 'custom' or ['custom1','custom2','custom3']
- */
- addDownloadExtensions: function (extensions) {
- var i;
- if(isString(extensions)) {
- extensions = extensions.split('|');
- }
- for (i=0; i < extensions.length; i++) {
- configDownloadExtensions.push(extensions[i]);
- }
- },
+ /**
+ * When called then the Custom Variables of scope "visit" will be stored (persisted) in a first party cookie
+ * for the duration of the visit. This is useful if you want to call getCustomVariable later in the visit.
+ *
+ * By default, Custom Variables of scope "visit" are not stored on the visitor's computer.
+ */
+ this.storeCustomVariablesInCookie = function () {
+ configStoreCustomVariablesInCookie = true;
+ };
- /**
- * Removes specified file extensions from the list of recognized downloads
- *
- * @param string|array extensions for example 'custom' or ['custom1','custom2','custom3']
- */
- removeDownloadExtensions: function (extensions) {
- var i, newExtensions = [];
- if(isString(extensions)) {
- extensions = extensions.split('|');
- }
- for (i=0; i < configDownloadExtensions.length; i++) {
- if (indexOfArray(extensions, configDownloadExtensions[i]) === -1) {
- newExtensions.push(configDownloadExtensions[i]);
- }
+ /**
+ * Set delay for link tracking (in milliseconds)
+ *
+ * @param int delay
+ */
+ this.setLinkTrackingTimer = function (delay) {
+ configTrackerPause = delay;
+ };
+
+ /**
+ * Set list of file extensions to be recognized as downloads
+ *
+ * @param string|array extensions
+ */
+ this.setDownloadExtensions = function (extensions) {
+ if(isString(extensions)) {
+ extensions = extensions.split('|');
+ }
+ configDownloadExtensions = extensions;
+ };
+
+ /**
+ * Specify additional file extensions to be recognized as downloads
+ *
+ * @param string|array extensions for example 'custom' or ['custom1','custom2','custom3']
+ */
+ this.addDownloadExtensions = function (extensions) {
+ var i;
+ if(isString(extensions)) {
+ extensions = extensions.split('|');
+ }
+ for (i=0; i < extensions.length; i++) {
+ configDownloadExtensions.push(extensions[i]);
+ }
+ };
+
+ /**
+ * Removes specified file extensions from the list of recognized downloads
+ *
+ * @param string|array extensions for example 'custom' or ['custom1','custom2','custom3']
+ */
+ this.removeDownloadExtensions = function (extensions) {
+ var i, newExtensions = [];
+ if(isString(extensions)) {
+ extensions = extensions.split('|');
+ }
+ for (i=0; i < configDownloadExtensions.length; i++) {
+ if (indexOfArray(extensions, configDownloadExtensions[i]) === -1) {
+ newExtensions.push(configDownloadExtensions[i]);
}
- configDownloadExtensions = newExtensions;
- },
+ }
+ configDownloadExtensions = newExtensions;
+ };
- /**
- * Set array of domains to be treated as local. Also supports path, eg '.piwik.org/subsite1'. In this
- * case all links that don't go to '*.piwik.org/subsite1/ *' would be treated as outlinks.
- * For example a link to 'piwik.org/' or 'piwik.org/subsite2' both would be treated as outlinks.
- *
- * Also supports page wildcard, eg 'piwik.org/index*'. In this case all links
- * that don't go to piwik.org/index* would be treated as outlinks.
- *
- * @param string|array hostsAlias
- */
- setDomains: function (hostsAlias) {
- configHostsAlias = isString(hostsAlias) ? [hostsAlias] : hostsAlias;
-
- var hasDomainAliasAlready = false, i;
- for (i in configHostsAlias) {
- if (Object.prototype.hasOwnProperty.call(configHostsAlias, i)
- && isSameHost(domainAlias, domainFixup(String(configHostsAlias[i])))) {
- hasDomainAliasAlready = true;
- }
+ /**
+ * Set array of domains to be treated as local. Also supports path, eg '.piwik.org/subsite1'. In this
+ * case all links that don't go to '*.piwik.org/subsite1/ *' would be treated as outlinks.
+ * For example a link to 'piwik.org/' or 'piwik.org/subsite2' both would be treated as outlinks.
+ *
+ * Also supports page wildcard, eg 'piwik.org/index*'. In this case all links
+ * that don't go to piwik.org/index* would be treated as outlinks.
+ *
+ * The current domain will be added automatically if no given host alias contains a path and if no host
+ * alias is already given for the current host alias. Say you are on "example.org" and set
+ * "hostAlias = ['example.com', 'example.org/test']" then the current "example.org" domain will not be
+ * added as there is already a more restrictive hostAlias 'example.org/test' given. We also do not add
+ * it automatically if there was any other host specifying any path like
+ * "['example.com', 'example2.com/test']". In this case we would also not add the current
+ * domain "example.org" automatically as the "path" feature is used. As soon as someone uses the path
+ * feature, for Piwik JS Tracker to work correctly in all cases, one needs to specify all hosts
+ * manually.
+ *
+ * @param string|array hostsAlias
+ */
+ this.setDomains = function (hostsAlias) {
+ configHostsAlias = isString(hostsAlias) ? [hostsAlias] : hostsAlias;
+
+ var hasDomainAliasAlready = false, i = 0, alias;
+ for (i; i < configHostsAlias.length; i++) {
+ alias = String(configHostsAlias[i]);
+
+ if (isSameHost(domainAlias, domainFixup(alias))) {
+ hasDomainAliasAlready = true;
+ break;
}
- if (!hasDomainAliasAlready) {
- /**
- * eg if domainAlias = 'piwik.org' and someone set hostsAlias = ['piwik.org/foo'] then we should
- * not add piwik.org as it would increase the allowed scope.
- */
- configHostsAlias.push(domainAlias);
+ var pathName = getPathName(alias);
+ if (pathName && pathName !== '/' && pathName !== '/*') {
+ hasDomainAliasAlready = true;
+ break;
}
- },
+ }
- /**
- * Set array of classes to be ignored if present in link
- *
- * @param string|array ignoreClasses
- */
- setIgnoreClasses: function (ignoreClasses) {
- configIgnoreClasses = isString(ignoreClasses) ? [ignoreClasses] : ignoreClasses;
- },
+ // The current domain will be added automatically if no given host alias contains a path
+ // and if no host alias is already given for the current host alias.
+ if (!hasDomainAliasAlready) {
+ /**
+ * eg if domainAlias = 'piwik.org' and someone set hostsAlias = ['piwik.org/foo'] then we should
+ * not add piwik.org as it would increase the allowed scope.
+ */
+ configHostsAlias.push(domainAlias);
+ }
+ };
- /**
- * Set request method
- *
- * @param string method GET or POST; default is GET
- */
- setRequestMethod: function (method) {
- configRequestMethod = method || defaultRequestMethod;
- },
+ /**
+ * Set array of classes to be ignored if present in link
+ *
+ * @param string|array ignoreClasses
+ */
+ this.setIgnoreClasses = function (ignoreClasses) {
+ configIgnoreClasses = isString(ignoreClasses) ? [ignoreClasses] : ignoreClasses;
+ };
- /**
- * Set request Content-Type header value, applicable when POST request method is used for submitting tracking events.
- * See XMLHttpRequest Level 2 spec, section 4.7.2 for invalid headers
- * @link http://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html
- *
- * @param string requestContentType; default is 'application/x-www-form-urlencoded; charset=UTF-8'
- */
- setRequestContentType: function (requestContentType) {
- configRequestContentType = requestContentType || defaultRequestContentType;
- },
+ /**
+ * Set request method
+ *
+ * @param string method GET or POST; default is GET
+ */
+ this.setRequestMethod = function (method) {
+ configRequestMethod = method || defaultRequestMethod;
+ };
- /**
- * Override referrer
- *
- * @param string url
- */
- setReferrerUrl: function (url) {
- configReferrerUrl = url;
- },
+ /**
+ * Set request Content-Type header value, applicable when POST request method is used for submitting tracking events.
+ * See XMLHttpRequest Level 2 spec, section 4.7.2 for invalid headers
+ * @link http://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html
+ *
+ * @param string requestContentType; default is 'application/x-www-form-urlencoded; charset=UTF-8'
+ */
+ this.setRequestContentType = function (requestContentType) {
+ configRequestContentType = requestContentType || defaultRequestContentType;
+ };
- /**
- * Override url
- *
- * @param string url
- */
- setCustomUrl: function (url) {
- configCustomUrl = resolveRelativeReference(locationHrefAlias, url);
- },
+ /**
+ * Override referrer
+ *
+ * @param string url
+ */
+ this.setReferrerUrl = function (url) {
+ configReferrerUrl = url;
+ };
- /**
- * Override document.title
- *
- * @param string title
- */
- setDocumentTitle: function (title) {
- configTitle = title;
- },
+ /**
+ * Override url
+ *
+ * @param string url
+ */
+ this.setCustomUrl = function (url) {
+ configCustomUrl = resolveRelativeReference(locationHrefAlias, url);
+ };
- /**
- * Set the URL of the Piwik API. It is used for Page Overlay.
- * This method should only be called when the API URL differs from the tracker URL.
- *
- * @param string apiUrl
- */
- setAPIUrl: function (apiUrl) {
- configApiUrl = apiUrl;
- },
+ /**
+ * Override document.title
+ *
+ * @param string title
+ */
+ this.setDocumentTitle = function (title) {
+ configTitle = title;
+ };
- /**
- * Set array of classes to be treated as downloads
- *
- * @param string|array downloadClasses
- */
- setDownloadClasses: function (downloadClasses) {
- configDownloadClasses = isString(downloadClasses) ? [downloadClasses] : downloadClasses;
- },
+ /**
+ * Set the URL of the Piwik API. It is used for Page Overlay.
+ * This method should only be called when the API URL differs from the tracker URL.
+ *
+ * @param string apiUrl
+ */
+ this.setAPIUrl = function (apiUrl) {
+ configApiUrl = apiUrl;
+ };
- /**
- * Set array of classes to be treated as outlinks
- *
- * @param string|array linkClasses
- */
- setLinkClasses: function (linkClasses) {
- configLinkClasses = isString(linkClasses) ? [linkClasses] : linkClasses;
- },
+ /**
+ * Set array of classes to be treated as downloads
+ *
+ * @param string|array downloadClasses
+ */
+ this.setDownloadClasses = function (downloadClasses) {
+ configDownloadClasses = isString(downloadClasses) ? [downloadClasses] : downloadClasses;
+ };
- /**
- * Set array of campaign name parameters
- *
- * @see http://piwik.org/faq/how-to/#faq_120
- * @param string|array campaignNames
- */
- setCampaignNameKey: function (campaignNames) {
- configCampaignNameParameters = isString(campaignNames) ? [campaignNames] : campaignNames;
- },
+ /**
+ * Set array of classes to be treated as outlinks
+ *
+ * @param string|array linkClasses
+ */
+ this.setLinkClasses = function (linkClasses) {
+ configLinkClasses = isString(linkClasses) ? [linkClasses] : linkClasses;
+ };
- /**
- * Set array of campaign keyword parameters
- *
- * @see http://piwik.org/faq/how-to/#faq_120
- * @param string|array campaignKeywords
- */
- setCampaignKeywordKey: function (campaignKeywords) {
- configCampaignKeywordParameters = isString(campaignKeywords) ? [campaignKeywords] : campaignKeywords;
- },
+ /**
+ * Set array of campaign name parameters
+ *
+ * @see http://piwik.org/faq/how-to/#faq_120
+ * @param string|array campaignNames
+ */
+ this.setCampaignNameKey = function (campaignNames) {
+ configCampaignNameParameters = isString(campaignNames) ? [campaignNames] : campaignNames;
+ };
- /**
- * Strip hash tag (or anchor) from URL
- * Note: this can be done in the Piwik>Settings>Websites on a per-website basis
- *
- * @deprecated
- * @param bool enableFilter
- */
- discardHashTag: function (enableFilter) {
- configDiscardHashTag = enableFilter;
- },
+ /**
+ * Set array of campaign keyword parameters
+ *
+ * @see http://piwik.org/faq/how-to/#faq_120
+ * @param string|array campaignKeywords
+ */
+ this.setCampaignKeywordKey = function (campaignKeywords) {
+ configCampaignKeywordParameters = isString(campaignKeywords) ? [campaignKeywords] : campaignKeywords;
+ };
- /**
- * Set first-party cookie name prefix
- *
- * @param string cookieNamePrefix
- */
- setCookieNamePrefix: function (cookieNamePrefix) {
- configCookieNamePrefix = cookieNamePrefix;
- // Re-init the Custom Variables cookie
- customVariables = getCustomVariablesFromCookie();
- },
+ /**
+ * Strip hash tag (or anchor) from URL
+ * Note: this can be done in the Piwik>Settings>Websites on a per-website basis
+ *
+ * @deprecated
+ * @param bool enableFilter
+ */
+ this.discardHashTag = function (enableFilter) {
+ configDiscardHashTag = enableFilter;
+ };
- /**
- * Set first-party cookie domain
- *
- * @param string domain
- */
- setCookieDomain: function (domain) {
- var domainFixed = domainFixup(domain);
+ /**
+ * Set first-party cookie name prefix
+ *
+ * @param string cookieNamePrefix
+ */
+ this.setCookieNamePrefix = function (cookieNamePrefix) {
+ configCookieNamePrefix = cookieNamePrefix;
+ // Re-init the Custom Variables cookie
+ customVariables = getCustomVariablesFromCookie();
+ };
- if (isPossibleToSetCookieOnDomain(domainFixed)) {
- configCookieDomain = domainFixed;
- updateDomainHash();
- }
- },
+ /**
+ * Set first-party cookie domain
+ *
+ * @param string domain
+ */
+ this.setCookieDomain = function (domain) {
+ var domainFixed = domainFixup(domain);
- /**
- * Set first-party cookie path
- *
- * @param string domain
- */
- setCookiePath: function (path) {
- configCookiePath = path;
+ if (isPossibleToSetCookieOnDomain(domainFixed)) {
+ configCookieDomain = domainFixed;
updateDomainHash();
- },
+ }
+ };
- /**
- * Set visitor cookie timeout (in seconds)
- * Defaults to 13 months (timeout=33955200)
- *
- * @param int timeout
- */
- setVisitorCookieTimeout: function (timeout) {
- configVisitorCookieTimeout = timeout * 1000;
- },
+ /**
+ * Set first-party cookie path
+ *
+ * @param string domain
+ */
+ this.setCookiePath = function (path) {
+ configCookiePath = path;
+ updateDomainHash();
+ };
- /**
- * Set session cookie timeout (in seconds).
- * Defaults to 30 minutes (timeout=1800000)
- *
- * @param int timeout
- */
- setSessionCookieTimeout: function (timeout) {
- configSessionCookieTimeout = timeout * 1000;
- },
+ /**
+ * Set visitor cookie timeout (in seconds)
+ * Defaults to 13 months (timeout=33955200)
+ *
+ * @param int timeout
+ */
+ this.setVisitorCookieTimeout = function (timeout) {
+ configVisitorCookieTimeout = timeout * 1000;
+ };
- /**
- * Set referral cookie timeout (in seconds).
- * Defaults to 6 months (15768000000)
- *
- * @param int timeout
- */
- setReferralCookieTimeout: function (timeout) {
- configReferralCookieTimeout = timeout * 1000;
- },
+ /**
+ * Set session cookie timeout (in seconds).
+ * Defaults to 30 minutes (timeout=1800)
+ *
+ * @param int timeout
+ */
+ this.setSessionCookieTimeout = function (timeout) {
+ configSessionCookieTimeout = timeout * 1000;
+ };
- /**
- * Set conversion attribution to first referrer and campaign
- *
- * @param bool if true, use first referrer (and first campaign)
- * if false, use the last referrer (or campaign)
- */
- setConversionAttributionFirstReferrer: function (enable) {
- configConversionAttributionFirstReferrer = enable;
- },
+ /**
+ * Set referral cookie timeout (in seconds).
+ * Defaults to 6 months (15768000000)
+ *
+ * @param int timeout
+ */
+ this.setReferralCookieTimeout = function (timeout) {
+ configReferralCookieTimeout = timeout * 1000;
+ };
- /**
- * Disables all cookies from being set
- *
- * Existing cookies will be deleted on the next call to track
- */
- disableCookies: function () {
- configCookiesDisabled = true;
- browserFeatures.cookie = '0';
+ /**
+ * Set conversion attribution to first referrer and campaign
+ *
+ * @param bool if true, use first referrer (and first campaign)
+ * if false, use the last referrer (or campaign)
+ */
+ this.setConversionAttributionFirstReferrer = function (enable) {
+ configConversionAttributionFirstReferrer = enable;
+ };
- if (configTrackerSiteId) {
- deleteCookies();
- }
- },
+ /**
+ * Disables all cookies from being set
+ *
+ * Existing cookies will be deleted on the next call to track
+ */
+ this.disableCookies = function () {
+ configCookiesDisabled = true;
+ browserFeatures.cookie = '0';
- /**
- * One off cookies clearing. Useful to call this when you know for sure a new visitor is using the same browser,
- * it maybe helps to "reset" tracking cookies to prevent data reuse for different users.
- */
- deleteCookies: function () {
+ if (configTrackerSiteId) {
deleteCookies();
- },
+ }
+ };
- /**
- * Handle do-not-track requests
- *
- * @param bool enable If true, don't track if user agent sends 'do-not-track' header
- */
- setDoNotTrack: function (enable) {
- var dnt = navigatorAlias.doNotTrack || navigatorAlias.msDoNotTrack;
- configDoNotTrack = enable && (dnt === 'yes' || dnt === '1');
+ /**
+ * One off cookies clearing. Useful to call this when you know for sure a new visitor is using the same browser,
+ * it maybe helps to "reset" tracking cookies to prevent data reuse for different users.
+ */
+ this.deleteCookies = function () {
+ deleteCookies();
+ };
- // do not track also disables cookies and deletes existing cookies
- if (configDoNotTrack) {
- this.disableCookies();
- }
- },
+ /**
+ * Handle do-not-track requests
+ *
+ * @param bool enable If true, don't track if user agent sends 'do-not-track' header
+ */
+ this.setDoNotTrack = function (enable) {
+ var dnt = navigatorAlias.doNotTrack || navigatorAlias.msDoNotTrack;
+ configDoNotTrack = enable && (dnt === 'yes' || dnt === '1');
- /**
- * Add click listener to a specific link element.
- * When clicked, Piwik will log the click automatically.
- *
- * @param DOMElement element
- * @param bool enable If true, use pseudo click-handler (middle click + context menu)
- */
- addListener: function (element, enable) {
- addClickListener(element, enable);
- },
+ // do not track also disables cookies and deletes existing cookies
+ if (configDoNotTrack) {
+ this.disableCookies();
+ }
+ };
- /**
- * Install link tracker
- *
- * The default behaviour is to use actual click events. However, some browsers
- * (e.g., Firefox, Opera, and Konqueror) don't generate click events for the middle mouse button.
- *
- * To capture more "clicks", the pseudo click-handler uses mousedown + mouseup events.
- * This is not industry standard and is vulnerable to false positives (e.g., drag events).
- *
- * There is a Safari/Chrome/Webkit bug that prevents tracking requests from being sent
- * by either click handler. The workaround is to set a target attribute (which can't
- * be "_self", "_top", or "_parent").
- *
- * @see https://bugs.webkit.org/show_bug.cgi?id=54783
- *
- * @param bool enable If "true", use pseudo click-handler (treat middle click and open contextmenu as
- * left click). A right click (or any click that opens the context menu) on a link
- * will be tracked as clicked even if "Open in new tab" is not selected. If
- * "false" (default), nothing will be tracked on open context menu or middle click.
- * The context menu is usually opened to open a link / download in a new tab
- * therefore you can get more accurate results by treat it as a click but it can lead
- * to wrong click numbers.
- */
- enableLinkTracking: function (enable) {
- linkTrackingEnabled = true;
+ /**
+ * Add click listener to a specific link element.
+ * When clicked, Piwik will log the click automatically.
+ *
+ * @param DOMElement element
+ * @param bool enable If true, use pseudo click-handler (middle click + context menu)
+ */
+ this.addListener = function (element, enable) {
+ addClickListener(element, enable);
+ };
- trackCallback(function () {
- trackCallbackOnReady(function () {
- addClickListeners(enable);
- });
+ /**
+ * Install link tracker
+ *
+ * The default behaviour is to use actual click events. However, some browsers
+ * (e.g., Firefox, Opera, and Konqueror) don't generate click events for the middle mouse button.
+ *
+ * To capture more "clicks", the pseudo click-handler uses mousedown + mouseup events.
+ * This is not industry standard and is vulnerable to false positives (e.g., drag events).
+ *
+ * There is a Safari/Chrome/Webkit bug that prevents tracking requests from being sent
+ * by either click handler. The workaround is to set a target attribute (which can't
+ * be "_self", "_top", or "_parent").
+ *
+ * @see https://bugs.webkit.org/show_bug.cgi?id=54783
+ *
+ * @param bool enable If "true", use pseudo click-handler (treat middle click and open contextmenu as
+ * left click). A right click (or any click that opens the context menu) on a link
+ * will be tracked as clicked even if "Open in new tab" is not selected. If
+ * "false" (default), nothing will be tracked on open context menu or middle click.
+ * The context menu is usually opened to open a link / download in a new tab
+ * therefore you can get more accurate results by treat it as a click but it can lead
+ * to wrong click numbers.
+ */
+ this.enableLinkTracking = function (enable) {
+ linkTrackingEnabled = true;
+
+ trackCallback(function () {
+ trackCallbackOnReady(function () {
+ addClickListeners(enable);
});
- },
+ });
+ };
- /**
- * Enable tracking of uncatched JavaScript errors
- *
- * If enabled, uncaught JavaScript Errors will be tracked as an event by defining a
- * window.onerror handler. If a window.onerror handler is already defined we will make
- * sure to call this previously registered error handler after tracking the error.
- *
- * By default we return false in the window.onerror handler to make sure the error still
- * appears in the browser's console etc. Note: Some older browsers might behave differently
- * so it could happen that an actual JavaScript error will be suppressed.
- * If a window.onerror handler was registered we will return the result of this handler.
- *
- * Make sure not to overwrite the window.onerror handler after enabling the JS error
- * tracking as the error tracking won't work otherwise. To capture all JS errors we
- * recommend to include the Piwik JavaScript tracker in the HTML as early as possible.
- * If possible directly in <head></head> before loading any other JavaScript.
- */
- enableJSErrorTracking: function () {
- if (enableJSErrorTracking) {
- return;
- }
+ /**
+ * Enable tracking of uncatched JavaScript errors
+ *
+ * If enabled, uncaught JavaScript Errors will be tracked as an event by defining a
+ * window.onerror handler. If a window.onerror handler is already defined we will make
+ * sure to call this previously registered error handler after tracking the error.
+ *
+ * By default we return false in the window.onerror handler to make sure the error still
+ * appears in the browser's console etc. Note: Some older browsers might behave differently
+ * so it could happen that an actual JavaScript error will be suppressed.
+ * If a window.onerror handler was registered we will return the result of this handler.
+ *
+ * Make sure not to overwrite the window.onerror handler after enabling the JS error
+ * tracking as the error tracking won't work otherwise. To capture all JS errors we
+ * recommend to include the Piwik JavaScript tracker in the HTML as early as possible.
+ * If possible directly in <head></head> before loading any other JavaScript.
+ */
+ this.enableJSErrorTracking = function () {
+ if (enableJSErrorTracking) {
+ return;
+ }
- enableJSErrorTracking = true;
- var onError = windowAlias.onerror;
+ enableJSErrorTracking = true;
+ var onError = windowAlias.onerror;
- windowAlias.onerror = function (message, url, linenumber, column, error) {
- trackCallback(function () {
- var category = 'JavaScript Errors';
+ windowAlias.onerror = function (message, url, linenumber, column, error) {
+ trackCallback(function () {
+ var category = 'JavaScript Errors';
- var action = url + ':' + linenumber;
- if (column) {
- action += ':' + column;
- }
+ var action = url + ':' + linenumber;
+ if (column) {
+ action += ':' + column;
+ }
- logEvent(category, action, message);
- });
+ logEvent(category, action, message);
+ });
- if (onError) {
- return onError(message, url, linenumber, column, error);
- }
+ if (onError) {
+ return onError(message, url, linenumber, column, error);
+ }
- return false;
- };
- },
+ return false;
+ };
+ };
- /**
- * Disable automatic performance tracking
- */
- disablePerformanceTracking: function () {
- configPerformanceTrackingEnabled = false;
- },
+ /**
+ * Disable automatic performance tracking
+ */
+ this.disablePerformanceTracking = function () {
+ configPerformanceTrackingEnabled = false;
+ };
- /**
- * Set the server generation time.
- * If set, the browser's performance.timing API in not used anymore to determine the time.
- *
- * @param int generationTime
- */
- setGenerationTimeMs: function (generationTime) {
- configPerformanceGenerationTime = parseInt(generationTime, 10);
- },
+ /**
+ * Set the server generation time.
+ * If set, the browser's performance.timing API in not used anymore to determine the time.
+ *
+ * @param int generationTime
+ */
+ this.setGenerationTimeMs = function (generationTime) {
+ configPerformanceGenerationTime = parseInt(generationTime, 10);
+ };
- /**
- * Set heartbeat (in seconds)
- *
- * @param int heartBeatDelayInSeconds Defaults to 15. Cannot be lower than 1.
- */
- enableHeartBeatTimer: function (heartBeatDelayInSeconds) {
- heartBeatDelayInSeconds = Math.max(heartBeatDelayInSeconds, 1);
- configHeartBeatDelay = (heartBeatDelayInSeconds || 15) * 1000;
+ /**
+ * Set heartbeat (in seconds)
+ *
+ * @param int heartBeatDelayInSeconds Defaults to 15. Cannot be lower than 1.
+ */
+ this.enableHeartBeatTimer = function (heartBeatDelayInSeconds) {
+ heartBeatDelayInSeconds = Math.max(heartBeatDelayInSeconds, 1);
+ configHeartBeatDelay = (heartBeatDelayInSeconds || 15) * 1000;
- // if a tracking request has already been sent, start the heart beat timeout
- if (lastTrackerRequestTime !== null) {
- setUpHeartBeat();
- }
- },
+ // if a tracking request has already been sent, start the heart beat timeout
+ if (lastTrackerRequestTime !== null) {
+ setUpHeartBeat();
+ }
+ };
/*<DEBUG>*/
- /**
- * Clear heartbeat.
- */
- disableHeartBeatTimer: function () {
- heartBeatDown();
- configHeartBeatDelay = null;
+ /**
+ * Clear heartbeat.
+ */
+ this.disableHeartBeatTimer = function () {
+ heartBeatDown();
+ configHeartBeatDelay = null;
- window.removeEventListener('focus', heartBeatOnFocus);
- window.removeEventListener('blur', heartBeatOnBlur);
- },
+ window.removeEventListener('focus', heartBeatOnFocus);
+ window.removeEventListener('blur', heartBeatOnBlur);
+ };
/*</DEBUG>*/
- /**
- * Frame buster
- */
- killFrame: function () {
- if (windowAlias.location !== windowAlias.top.location) {
- windowAlias.top.location = windowAlias.location;
- }
- },
+ /**
+ * Frame buster
+ */
+ this.killFrame = function () {
+ if (windowAlias.location !== windowAlias.top.location) {
+ windowAlias.top.location = windowAlias.location;
+ }
+ };
- /**
- * Redirect if browsing offline (aka file: buster)
- *
- * @param string url Redirect to this URL
- */
- redirectFile: function (url) {
- if (windowAlias.location.protocol === 'file:') {
- windowAlias.location = url;
- }
- },
+ /**
+ * Redirect if browsing offline (aka file: buster)
+ *
+ * @param string url Redirect to this URL
+ */
+ this.redirectFile = function (url) {
+ if (windowAlias.location.protocol === 'file:') {
+ windowAlias.location = url;
+ }
+ };
- /**
- * Count sites in pre-rendered state
- *
- * @param bool enable If true, track when in pre-rendered state
- */
- setCountPreRendered: function (enable) {
- configCountPreRendered = enable;
- },
+ /**
+ * Count sites in pre-rendered state
+ *
+ * @param bool enable If true, track when in pre-rendered state
+ */
+ this.setCountPreRendered = function (enable) {
+ configCountPreRendered = enable;
+ };
- /**
- * Trigger a goal
- *
- * @param int|string idGoal
- * @param int|float customRevenue
- * @param mixed customData
- */
- trackGoal: function (idGoal, customRevenue, customData) {
+ /**
+ * Trigger a goal
+ *
+ * @param int|string idGoal
+ * @param int|float customRevenue
+ * @param mixed customData
+ */
+ this.trackGoal = function (idGoal, customRevenue, customData) {
+ trackCallback(function () {
+ logGoal(idGoal, customRevenue, customData);
+ });
+ };
+
+ /**
+ * Manually log a click from your own code
+ *
+ * @param string sourceUrl
+ * @param string linkType
+ * @param mixed customData
+ * @param function callback
+ */
+ this.trackLink = function (sourceUrl, linkType, customData, callback) {
+ trackCallback(function () {
+ logLink(sourceUrl, linkType, customData, callback);
+ });
+ };
+
+ /**
+ * Log visit to this page
+ *
+ * @param string customTitle
+ * @param mixed customData
+ * @param function callback
+ */
+ this.trackPageView = function (customTitle, customData, callback) {
+ trackedContentImpressions = [];
+
+ if (isOverlaySession(configTrackerSiteId)) {
trackCallback(function () {
- logGoal(idGoal, customRevenue, customData);
+ injectOverlayScripts(configTrackerUrl, configApiUrl, configTrackerSiteId);
});
- },
-
- /**
- * Manually log a click from your own code
- *
- * @param string sourceUrl
- * @param string linkType
- * @param mixed customData
- * @param function callback
- */
- trackLink: function (sourceUrl, linkType, customData, callback) {
+ } else {
trackCallback(function () {
- logLink(sourceUrl, linkType, customData, callback);
+ logPageView(customTitle, customData, callback);
});
- },
-
- /**
- * Log visit to this page
- *
- * @param string customTitle
- * @param mixed customData
- */
- trackPageView: function (customTitle, customData) {
- trackedContentImpressions = [];
-
- if (isOverlaySession(configTrackerSiteId)) {
- trackCallback(function () {
- injectOverlayScripts(configTrackerUrl, configApiUrl, configTrackerSiteId);
- });
- } else {
- trackCallback(function () {
- logPageView(customTitle, customData);
- });
- }
- },
+ }
+ };
- /**
- * Scans the entire DOM for all content blocks and tracks all impressions once the DOM ready event has
- * been triggered.
- *
- * If you only want to track visible content impressions have a look at `trackVisibleContentImpressions()`.
- * We do not track an impression of the same content block twice if you call this method multiple times
- * unless `trackPageView()` is called meanwhile. This is useful for single page applications.
- */
- trackAllContentImpressions: function () {
- if (isOverlaySession(configTrackerSiteId)) {
- return;
- }
+ /**
+ * Scans the entire DOM for all content blocks and tracks all impressions once the DOM ready event has
+ * been triggered.
+ *
+ * If you only want to track visible content impressions have a look at `trackVisibleContentImpressions()`.
+ * We do not track an impression of the same content block twice if you call this method multiple times
+ * unless `trackPageView()` is called meanwhile. This is useful for single page applications.
+ */
+ this.trackAllContentImpressions = function () {
+ if (isOverlaySession(configTrackerSiteId)) {
+ return;
+ }
- trackCallback(function () {
- trackCallbackOnReady(function () {
- // we have to wait till DOM ready
- var contentNodes = content.findContentNodes();
- var requests = getContentImpressionsRequestsFromNodes(contentNodes);
+ trackCallback(function () {
+ trackCallbackOnReady(function () {
+ // we have to wait till DOM ready
+ var contentNodes = content.findContentNodes();
+ var requests = getContentImpressionsRequestsFromNodes(contentNodes);
- sendBulkRequest(requests, configTrackerPause);
- });
+ sendBulkRequest(requests, configTrackerPause);
});
- },
+ });
+ };
- /**
- * Scans the entire DOM for all content blocks as soon as the page is loaded. It tracks an impression
- * only if a content block is actually visible. Meaning it is not hidden and the content is or was at
- * some point in the viewport.
- *
- * If you want to track all content blocks have a look at `trackAllContentImpressions()`.
- * We do not track an impression of the same content block twice if you call this method multiple times
- * unless `trackPageView()` is called meanwhile. This is useful for single page applications.
- *
- * Once you have called this method you can no longer change `checkOnScroll` or `timeIntervalInMs`.
- *
- * If you do want to only track visible content blocks but not want us to perform any automatic checks
- * as they can slow down your frames per second you can call `trackVisibleContentImpressions()` or
- * `trackContentImpressionsWithinNode()` manually at any time to rescan the entire DOM for newly
- * visible content blocks.
- * o Call `trackVisibleContentImpressions(false, 0)` to initially track only visible content impressions
- * o Call `trackVisibleContentImpressions()` at any time again to rescan the entire DOM for newly visible content blocks or
- * o Call `trackContentImpressionsWithinNode(node)` at any time to rescan only a part of the DOM for newly visible content blocks
- *
- * @param boolean [checkOnScroll=true] Optional, you can disable rescanning the entire DOM automatically
- * after each scroll event by passing the value `false`. If enabled,
- * we check whether a previously hidden content blocks became visible
- * after a scroll and if so track the impression.
- * Note: If a content block is placed within a scrollable element
- * (`overflow: scroll`), we can currently not detect when this block
- * becomes visible.
- * @param integer [timeIntervalInMs=750] Optional, you can define an interval to rescan the entire DOM
- * for new impressions every X milliseconds by passing
- * for instance `timeIntervalInMs=500` (rescan DOM every 500ms).
- * Rescanning the entire DOM and detecting the visible state of content
- * blocks can take a while depending on the browser and amount of content.
- * In case your frames per second goes down you might want to increase
- * this value or disable it by passing the value `0`.
- */
- trackVisibleContentImpressions: function (checkOnSroll, timeIntervalInMs) {
- if (isOverlaySession(configTrackerSiteId)) {
- return;
- }
+ /**
+ * Scans the entire DOM for all content blocks as soon as the page is loaded. It tracks an impression
+ * only if a content block is actually visible. Meaning it is not hidden and the content is or was at
+ * some point in the viewport.
+ *
+ * If you want to track all content blocks have a look at `trackAllContentImpressions()`.
+ * We do not track an impression of the same content block twice if you call this method multiple times
+ * unless `trackPageView()` is called meanwhile. This is useful for single page applications.
+ *
+ * Once you have called this method you can no longer change `checkOnScroll` or `timeIntervalInMs`.
+ *
+ * If you do want to only track visible content blocks but not want us to perform any automatic checks
+ * as they can slow down your frames per second you can call `trackVisibleContentImpressions()` or
+ * `trackContentImpressionsWithinNode()` manually at any time to rescan the entire DOM for newly
+ * visible content blocks.
+ * o Call `trackVisibleContentImpressions(false, 0)` to initially track only visible content impressions
+ * o Call `trackVisibleContentImpressions()` at any time again to rescan the entire DOM for newly visible content blocks or
+ * o Call `trackContentImpressionsWithinNode(node)` at any time to rescan only a part of the DOM for newly visible content blocks
+ *
+ * @param boolean [checkOnScroll=true] Optional, you can disable rescanning the entire DOM automatically
+ * after each scroll event by passing the value `false`. If enabled,
+ * we check whether a previously hidden content blocks became visible
+ * after a scroll and if so track the impression.
+ * Note: If a content block is placed within a scrollable element
+ * (`overflow: scroll`), we can currently not detect when this block
+ * becomes visible.
+ * @param integer [timeIntervalInMs=750] Optional, you can define an interval to rescan the entire DOM
+ * for new impressions every X milliseconds by passing
+ * for instance `timeIntervalInMs=500` (rescan DOM every 500ms).
+ * Rescanning the entire DOM and detecting the visible state of content
+ * blocks can take a while depending on the browser and amount of content.
+ * In case your frames per second goes down you might want to increase
+ * this value or disable it by passing the value `0`.
+ */
+ this.trackVisibleContentImpressions = function (checkOnSroll, timeIntervalInMs) {
+ if (isOverlaySession(configTrackerSiteId)) {
+ return;
+ }
- if (!isDefined(checkOnSroll)) {
- checkOnSroll = true;
- }
+ if (!isDefined(checkOnSroll)) {
+ checkOnSroll = true;
+ }
- if (!isDefined(timeIntervalInMs)) {
- timeIntervalInMs = 750;
- }
+ if (!isDefined(timeIntervalInMs)) {
+ timeIntervalInMs = 750;
+ }
- enableTrackOnlyVisibleContent(checkOnSroll, timeIntervalInMs, this);
+ enableTrackOnlyVisibleContent(checkOnSroll, timeIntervalInMs, this);
- trackCallback(function () {
- trackCallbackOnLoad(function () {
- // we have to wait till CSS parsed and applied
- var contentNodes = content.findContentNodes();
- var requests = getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet(contentNodes);
+ trackCallback(function () {
+ trackCallbackOnLoad(function () {
+ // we have to wait till CSS parsed and applied
+ var contentNodes = content.findContentNodes();
+ var requests = getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet(contentNodes);
- sendBulkRequest(requests, configTrackerPause);
- });
+ sendBulkRequest(requests, configTrackerPause);
});
- },
-
- /**
- * Tracks a content impression using the specified values. You should not call this method too often
- * as each call causes an XHR tracking request and can slow down your site or your server.
- *
- * @param string contentName For instance "Ad Sale".
- * @param string [contentPiece='Unknown'] For instance a path to an image or the text of a text ad.
- * @param string [contentTarget] For instance the URL of a landing page.
- */
- trackContentImpression: function (contentName, contentPiece, contentTarget) {
- if (isOverlaySession(configTrackerSiteId)) {
- return;
- }
+ });
+ };
- if (!contentName) {
- return;
- }
+ /**
+ * Tracks a content impression using the specified values. You should not call this method too often
+ * as each call causes an XHR tracking request and can slow down your site or your server.
+ *
+ * @param string contentName For instance "Ad Sale".
+ * @param string [contentPiece='Unknown'] For instance a path to an image or the text of a text ad.
+ * @param string [contentTarget] For instance the URL of a landing page.
+ */
+ this.trackContentImpression = function (contentName, contentPiece, contentTarget) {
+ if (isOverlaySession(configTrackerSiteId)) {
+ return;
+ }
- contentPiece = contentPiece || 'Unknown';
+ if (!contentName) {
+ return;
+ }
- trackCallback(function () {
- var request = buildContentImpressionRequest(contentName, contentPiece, contentTarget);
- sendRequest(request, configTrackerPause);
- });
- },
+ contentPiece = contentPiece || 'Unknown';
- /**
- * Scans the given DOM node and its children for content blocks and tracks an impression for them if
- * no impression was already tracked for it. If you have called `trackVisibleContentImpressions()`
- * upfront only visible content blocks will be tracked. You can use this method if you, for instance,
- * dynamically add an element using JavaScript to your DOM after we have tracked the initial impressions.
- *
- * @param Element domNode
- */
- trackContentImpressionsWithinNode: function (domNode) {
- if (isOverlaySession(configTrackerSiteId) || !domNode) {
- return;
- }
+ trackCallback(function () {
+ var request = buildContentImpressionRequest(contentName, contentPiece, contentTarget);
+ sendRequest(request, configTrackerPause);
+ });
+ };
- trackCallback(function () {
- if (isTrackOnlyVisibleContentEnabled) {
- trackCallbackOnLoad(function () {
- // we have to wait till CSS parsed and applied
- var contentNodes = content.findContentNodesWithinNode(domNode);
-
- var requests = getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet(contentNodes);
- sendBulkRequest(requests, configTrackerPause);
- });
- } else {
- trackCallbackOnReady(function () {
- // we have to wait till DOM ready
- var contentNodes = content.findContentNodesWithinNode(domNode);
+ /**
+ * Scans the given DOM node and its children for content blocks and tracks an impression for them if
+ * no impression was already tracked for it. If you have called `trackVisibleContentImpressions()`
+ * upfront only visible content blocks will be tracked. You can use this method if you, for instance,
+ * dynamically add an element using JavaScript to your DOM after we have tracked the initial impressions.
+ *
+ * @param Element domNode
+ */
+ this.trackContentImpressionsWithinNode = function (domNode) {
+ if (isOverlaySession(configTrackerSiteId) || !domNode) {
+ return;
+ }
- var requests = getContentImpressionsRequestsFromNodes(contentNodes);
- sendBulkRequest(requests, configTrackerPause);
- });
- }
- });
- },
+ trackCallback(function () {
+ if (isTrackOnlyVisibleContentEnabled) {
+ trackCallbackOnLoad(function () {
+ // we have to wait till CSS parsed and applied
+ var contentNodes = content.findContentNodesWithinNode(domNode);
- /**
- * Tracks a content interaction using the specified values. You should use this method only in conjunction
- * with `trackContentImpression()`. The specified `contentName` and `contentPiece` has to be exactly the
- * same as the ones that were used in `trackContentImpression()`. Otherwise the interaction will not count.
- *
- * @param string contentInteraction The type of interaction that happened. For instance 'click' or 'submit'.
- * @param string contentName The name of the content. For instance "Ad Sale".
- * @param string [contentPiece='Unknown'] The actual content. For instance a path to an image or the text of a text ad.
- * @param string [contentTarget] For instance the URL of a landing page.
- */
- trackContentInteraction: function (contentInteraction, contentName, contentPiece, contentTarget) {
- if (isOverlaySession(configTrackerSiteId)) {
- return;
- }
+ var requests = getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet(contentNodes);
+ sendBulkRequest(requests, configTrackerPause);
+ });
+ } else {
+ trackCallbackOnReady(function () {
+ // we have to wait till DOM ready
+ var contentNodes = content.findContentNodesWithinNode(domNode);
- if (!contentInteraction || !contentName) {
- return;
+ var requests = getContentImpressionsRequestsFromNodes(contentNodes);
+ sendBulkRequest(requests, configTrackerPause);
+ });
}
+ });
+ };
- contentPiece = contentPiece || 'Unknown';
+ /**
+ * Tracks a content interaction using the specified values. You should use this method only in conjunction
+ * with `trackContentImpression()`. The specified `contentName` and `contentPiece` has to be exactly the
+ * same as the ones that were used in `trackContentImpression()`. Otherwise the interaction will not count.
+ *
+ * @param string contentInteraction The type of interaction that happened. For instance 'click' or 'submit'.
+ * @param string contentName The name of the content. For instance "Ad Sale".
+ * @param string [contentPiece='Unknown'] The actual content. For instance a path to an image or the text of a text ad.
+ * @param string [contentTarget] For instance the URL of a landing page.
+ */
+ this.trackContentInteraction = function (contentInteraction, contentName, contentPiece, contentTarget) {
+ if (isOverlaySession(configTrackerSiteId)) {
+ return;
+ }
- trackCallback(function () {
- var request = buildContentInteractionRequest(contentInteraction, contentName, contentPiece, contentTarget);
- sendRequest(request, configTrackerPause);
- });
- },
+ if (!contentInteraction || !contentName) {
+ return;
+ }
- /**
- * Tracks an interaction with the given DOM node / content block.
- *
- * By default we track interactions on click but sometimes you might want to track interactions yourself.
- * For instance you might want to track an interaction manually on a double click or a form submit.
- * Make sure to disable the automatic interaction tracking in this case by specifying either the CSS
- * class `piwikContentIgnoreInteraction` or the attribute `data-content-ignoreinteraction`.
- *
- * @param Element domNode This element itself or any of its parent elements has to be a content block
- * element. Meaning one of those has to have a `piwikTrackContent` CSS class or
- * a `data-track-content` attribute.
- * @param string [contentInteraction='Unknown] The name of the interaction that happened. For instance
- * 'click', 'formSubmit', 'DblClick', ...
- */
- trackContentInteractionNode: function (domNode, contentInteraction) {
- if (isOverlaySession(configTrackerSiteId) || !domNode) {
- return;
- }
+ contentPiece = contentPiece || 'Unknown';
- trackCallback(function () {
- var request = buildContentInteractionRequestNode(domNode, contentInteraction);
- sendRequest(request, configTrackerPause);
- });
- },
+ trackCallback(function () {
+ var request = buildContentInteractionRequest(contentInteraction, contentName, contentPiece, contentTarget);
+ sendRequest(request, configTrackerPause);
+ });
+ };
- /**
- * Useful to debug content tracking. This method will log all detected content blocks to console
- * (if the browser supports the console). It will list the detected name, piece, and target of each
- * content block.
- */
- logAllContentBlocksOnPage: function () {
- var contentNodes = content.findContentNodes();
- var contents = content.collectContent(contentNodes);
+ /**
+ * Tracks an interaction with the given DOM node / content block.
+ *
+ * By default we track interactions on click but sometimes you might want to track interactions yourself.
+ * For instance you might want to track an interaction manually on a double click or a form submit.
+ * Make sure to disable the automatic interaction tracking in this case by specifying either the CSS
+ * class `piwikContentIgnoreInteraction` or the attribute `data-content-ignoreinteraction`.
+ *
+ * @param Element domNode This element itself or any of its parent elements has to be a content block
+ * element. Meaning one of those has to have a `piwikTrackContent` CSS class or
+ * a `data-track-content` attribute.
+ * @param string [contentInteraction='Unknown] The name of the interaction that happened. For instance
+ * 'click', 'formSubmit', 'DblClick', ...
+ */
+ this.trackContentInteractionNode = function (domNode, contentInteraction) {
+ if (isOverlaySession(configTrackerSiteId) || !domNode) {
+ return;
+ }
- if (console !== undefined && console && console.log) {
- console.log(contents);
- }
- },
+ trackCallback(function () {
+ var request = buildContentInteractionRequestNode(domNode, contentInteraction);
+ sendRequest(request, configTrackerPause);
+ });
+ };
- /**
- * Records an event
- *
- * @param string category The Event Category (Videos, Music, Games...)
- * @param string action The Event's Action (Play, Pause, Duration, Add Playlist, Downloaded, Clicked...)
- * @param string name (optional) The Event's object Name (a particular Movie name, or Song name, or File name...)
- * @param float value (optional) The Event's value
- * @param mixed customData
- */
- trackEvent: function (category, action, name, value, customData) {
- trackCallback(function () {
- logEvent(category, action, name, value, customData);
- });
- },
+ /**
+ * Useful to debug content tracking. This method will log all detected content blocks to console
+ * (if the browser supports the console). It will list the detected name, piece, and target of each
+ * content block.
+ */
+ this.logAllContentBlocksOnPage = function () {
+ var contentNodes = content.findContentNodes();
+ var contents = content.collectContent(contentNodes);
- /**
- * Log special pageview: Internal search
- *
- * @param string keyword
- * @param string category
- * @param int resultsCount
- * @param mixed customData
- */
- trackSiteSearch: function (keyword, category, resultsCount, customData) {
- trackCallback(function () {
- logSiteSearch(keyword, category, resultsCount, customData);
- });
- },
+ if (console !== undefined && console && console.log) {
+ console.log(contents);
+ }
+ };
- /**
- * Used to record that the current page view is an item (product) page view, or a Ecommerce Category page view.
- * This must be called before trackPageView() on the product/category page.
- * It will set 3 custom variables of scope "page" with the SKU, Name and Category for this page view.
- * Note: Custom Variables of scope "page" slots 3, 4 and 5 will be used.
- *
- * On a category page, you can set the parameter category, and set the other parameters to empty string or false
- *
- * Tracking Product/Category page views will allow Piwik to report on Product & Categories
- * conversion rates (Conversion rate = Ecommerce orders containing this product or category / Visits to the product or category)
- *
- * @param string sku Item's SKU code being viewed
- * @param string name Item's Name being viewed
- * @param string category Category page being viewed. On an Item's page, this is the item's category
- * @param float price Item's display price, not use in standard Piwik reports, but output in API product reports.
- */
- setEcommerceView: function (sku, name, category, price) {
- if (!isDefined(category) || !category.length) {
- category = "";
- } else if (category instanceof Array) {
- category = JSON2.stringify(category);
- }
+ /**
+ * Records an event
+ *
+ * @param string category The Event Category (Videos, Music, Games...)
+ * @param string action The Event's Action (Play, Pause, Duration, Add Playlist, Downloaded, Clicked...)
+ * @param string name (optional) The Event's object Name (a particular Movie name, or Song name, or File name...)
+ * @param float value (optional) The Event's value
+ * @param mixed customData
+ */
+ this.trackEvent = function (category, action, name, value, customData) {
+ trackCallback(function () {
+ logEvent(category, action, name, value, customData);
+ });
+ };
- customVariablesPage[5] = ['_pkc', category];
+ /**
+ * Log special pageview: Internal search
+ *
+ * @param string keyword
+ * @param string category
+ * @param int resultsCount
+ * @param mixed customData
+ */
+ this.trackSiteSearch = function (keyword, category, resultsCount, customData) {
+ trackCallback(function () {
+ logSiteSearch(keyword, category, resultsCount, customData);
+ });
+ };
- if (isDefined(price) && String(price).length) {
- customVariablesPage[2] = ['_pkp', price];
- }
+ /**
+ * Used to record that the current page view is an item (product) page view, or a Ecommerce Category page view.
+ * This must be called before trackPageView() on the product/category page.
+ * It will set 3 custom variables of scope "page" with the SKU, Name and Category for this page view.
+ * Note: Custom Variables of scope "page" slots 3, 4 and 5 will be used.
+ *
+ * On a category page, you can set the parameter category, and set the other parameters to empty string or false
+ *
+ * Tracking Product/Category page views will allow Piwik to report on Product & Categories
+ * conversion rates (Conversion rate = Ecommerce orders containing this product or category / Visits to the product or category)
+ *
+ * @param string sku Item's SKU code being viewed
+ * @param string name Item's Name being viewed
+ * @param string category Category page being viewed. On an Item's page, this is the item's category
+ * @param float price Item's display price, not use in standard Piwik reports, but output in API product reports.
+ */
+ this.setEcommerceView = function (sku, name, category, price) {
+ if (!isDefined(category) || !category.length) {
+ category = "";
+ } else if (category instanceof Array) {
+ category = JSON2.stringify(category);
+ }
- // On a category page, do not track Product name not defined
- if ((!isDefined(sku) || !sku.length)
- && (!isDefined(name) || !name.length)) {
- return;
- }
+ customVariablesPage[5] = ['_pkc', category];
- if (isDefined(sku) && sku.length) {
- customVariablesPage[3] = ['_pks', sku];
- }
+ if (isDefined(price) && String(price).length) {
+ customVariablesPage[2] = ['_pkp', price];
+ }
- if (!isDefined(name) || !name.length) {
- name = "";
- }
+ // On a category page, do not track Product name not defined
+ if ((!isDefined(sku) || !sku.length)
+ && (!isDefined(name) || !name.length)) {
+ return;
+ }
- customVariablesPage[4] = ['_pkn', name];
- },
+ if (isDefined(sku) && sku.length) {
+ customVariablesPage[3] = ['_pks', sku];
+ }
- /**
- * Adds an item (product) that is in the current Cart or in the Ecommerce order.
- * This function is called for every item (product) in the Cart or the Order.
- * The only required parameter is sku.
- *
- * @param string sku (required) Item's SKU Code. This is the unique identifier for the product.
- * @param string name (optional) Item's name
- * @param string name (optional) Item's category, or array of up to 5 categories
- * @param float price (optional) Item's price. If not specified, will default to 0
- * @param float quantity (optional) Item's quantity. If not specified, will default to 1
- */
- addEcommerceItem: function (sku, name, category, price, quantity) {
- if (sku.length) {
- ecommerceItems[sku] = [ sku, name, category, price, quantity ];
- }
- },
+ if (!isDefined(name) || !name.length) {
+ name = "";
+ }
- /**
- * Tracks an Ecommerce order.
- * If the Ecommerce order contains items (products), you must call first the addEcommerceItem() for each item in the order.
- * All revenues (grandTotal, subTotal, tax, shipping, discount) will be individually summed and reported in Piwik reports.
- * Parameters orderId and grandTotal are required. For others, you can set to false if you don't need to specify them.
- *
- * @param string|int orderId (required) Unique Order ID.
- * This will be used to count this order only once in the event the order page is reloaded several times.
- * orderId must be unique for each transaction, even on different days, or the transaction will not be recorded by Piwik.
- * @param float grandTotal (required) Grand Total revenue of the transaction (including tax, shipping, etc.)
- * @param float subTotal (optional) Sub total amount, typically the sum of items prices for all items in this order (before Tax and Shipping costs are applied)
- * @param float tax (optional) Tax amount for this order
- * @param float shipping (optional) Shipping amount for this order
- * @param float discount (optional) Discounted amount in this order
- */
- trackEcommerceOrder: function (orderId, grandTotal, subTotal, tax, shipping, discount) {
- logEcommerceOrder(orderId, grandTotal, subTotal, tax, shipping, discount);
- },
+ customVariablesPage[4] = ['_pkn', name];
+ };
- /**
- * Tracks a Cart Update (add item, remove item, update item).
- * On every Cart update, you must call addEcommerceItem() for each item (product) in the cart, including the items that haven't been updated since the last cart update.
- * Then you can call this function with the Cart grandTotal (typically the sum of all items' prices)
- *
- * @param float grandTotal (required) Items (products) amount in the Cart
- */
- trackEcommerceCartUpdate: function (grandTotal) {
- logEcommerceCartUpdate(grandTotal);
+ /**
+ * Adds an item (product) that is in the current Cart or in the Ecommerce order.
+ * This function is called for every item (product) in the Cart or the Order.
+ * The only required parameter is sku.
+ * The items are deleted from this JavaScript object when the Ecommerce order is tracked via the method trackEcommerceOrder.
+ *
+ * @param string sku (required) Item's SKU Code. This is the unique identifier for the product.
+ * @param string name (optional) Item's name
+ * @param string name (optional) Item's category, or array of up to 5 categories
+ * @param float price (optional) Item's price. If not specified, will default to 0
+ * @param float quantity (optional) Item's quantity. If not specified, will default to 1
+ */
+ this.addEcommerceItem = function (sku, name, category, price, quantity) {
+ if (sku.length) {
+ ecommerceItems[sku] = [ sku, name, category, price, quantity ];
}
+ };
+
+ /**
+ * Tracks an Ecommerce order.
+ * If the Ecommerce order contains items (products), you must call first the addEcommerceItem() for each item in the order.
+ * All revenues (grandTotal, subTotal, tax, shipping, discount) will be individually summed and reported in Piwik reports.
+ * Parameters orderId and grandTotal are required. For others, you can set to false if you don't need to specify them.
+ * After calling this method, items added to the cart will be removed from this JavaScript object.
+ *
+ * @param string|int orderId (required) Unique Order ID.
+ * This will be used to count this order only once in the event the order page is reloaded several times.
+ * orderId must be unique for each transaction, even on different days, or the transaction will not be recorded by Piwik.
+ * @param float grandTotal (required) Grand Total revenue of the transaction (including tax, shipping, etc.)
+ * @param float subTotal (optional) Sub total amount, typically the sum of items prices for all items in this order (before Tax and Shipping costs are applied)
+ * @param float tax (optional) Tax amount for this order
+ * @param float shipping (optional) Shipping amount for this order
+ * @param float discount (optional) Discounted amount in this order
+ */
+ this.trackEcommerceOrder = function (orderId, grandTotal, subTotal, tax, shipping, discount) {
+ logEcommerceOrder(orderId, grandTotal, subTotal, tax, shipping, discount);
+ };
+ /**
+ * Tracks a Cart Update (add item, remove item, update item).
+ * On every Cart update, you must call addEcommerceItem() for each item (product) in the cart, including the items that haven't been updated since the last cart update.
+ * Then you can call this function with the Cart grandTotal (typically the sum of all items' prices)
+ * Calling this method does not remove from this JavaScript object the items that were added to the cart via addEcommerceItem
+ *
+ * @param float grandTotal (required) Items (products) amount in the Cart
+ */
+ this.trackEcommerceCartUpdate = function (grandTotal) {
+ logEcommerceCartUpdate(grandTotal);
};
- }
- /************************************************************
- * Proxy object
- * - this allows the caller to continue push()'ing to _paq
- * after the Tracker has been initialized and loaded
- ************************************************************/
+ /**
+ * Sends a tracking request with custom request parameters.
+ * Piwik will prepend the hostname and path to Piwik, as well as all other needed tracking request
+ * parameters prior to sending the request. Useful eg if you track custom dimensions via a plugin.
+ *
+ * @param request eg. "param=value&param2=value2"
+ * @param customData
+ * @param callback
+ */
+ this.trackRequest = function (request, customData, callback) {
+ trackCallback(function () {
+ var fullRequest = getRequest(request, customData);
+ sendRequest(fullRequest, configTrackerPause, callback);
+ });
+ };
+
+ Piwik.trigger('TrackerSetup', [this]);
+ }
function TrackerProxy() {
return {
@@ -6362,9 +6523,7 @@ if (typeof window.Piwik !== 'object') {
delete paq[iterator];
if (appliedMethods[methodName] > 1) {
- if (console !== undefined && console && console.error) {
- console.error('The method ' + methodName + ' is registered more than once in "paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers');
- }
+ logConsoleError('The method ' + methodName + ' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers');
}
appliedMethods[methodName]++;
@@ -6380,31 +6539,97 @@ if (typeof window.Piwik !== 'object') {
* Constructor
************************************************************/
- // initialize the Piwik singleton
- addEventListener(windowAlias, 'beforeunload', beforeUnloadHandler, false);
+ var applyFirst = ['addTracker', 'disableCookies', 'setTrackerUrl', 'setAPIUrl', 'setCookiePath', 'setCookieDomain', 'setDomains', 'setUserId', 'setSiteId', 'enableLinkTracking'];
- Date.prototype.getTimeAlias = Date.prototype.getTime;
-
- asyncTracker = new Tracker();
+ function createFirstTracker(piwikUrl, siteId)
+ {
+ var tracker = new Tracker(piwikUrl, siteId);
+ asyncTrackers.push(tracker);
- var applyFirst = ['disableCookies', 'setTrackerUrl', 'setAPIUrl', 'setCookiePath', 'setCookieDomain', 'setDomains', 'setUserId', 'setSiteId', 'enableLinkTracking'];
- _paq = applyMethodsInOrder(_paq, applyFirst);
+ _paq = applyMethodsInOrder(_paq, applyFirst);
- // apply the queue of actions
- for (iterator = 0; iterator < _paq.length; iterator++) {
- if (_paq[iterator]) {
- apply(_paq[iterator]);
+ // apply the queue of actions
+ for (iterator = 0; iterator < _paq.length; iterator++) {
+ if (_paq[iterator]) {
+ apply(_paq[iterator]);
+ }
}
+
+ // replace initialization array with proxy object
+ _paq = new TrackerProxy();
+
+ return tracker;
}
- // replace initialization array with proxy object
- _paq = new TrackerProxy();
+ /************************************************************
+ * Proxy object
+ * - this allows the caller to continue push()'ing to _paq
+ * after the Tracker has been initialized and loaded
+ ************************************************************/
+
+ // initialize the Piwik singleton
+ addEventListener(windowAlias, 'beforeunload', beforeUnloadHandler, false);
+
+ Date.prototype.getTimeAlias = Date.prototype.getTime;
/************************************************************
* Public data and methods
************************************************************/
Piwik = {
+ initialized: false,
+
+ /**
+ * Listen to an event and invoke the handler when a the event is triggered.
+ *
+ * @param string event
+ * @param function handler
+ */
+ on: function (event, handler) {
+ if (!eventHandlers[event]) {
+ eventHandlers[event] = [];
+ }
+
+ eventHandlers[event].push(handler);
+ },
+
+ /**
+ * Remove a handler to no longer listen to the event. Must pass the same handler that was used when
+ * attaching the event via ".on".
+ * @param string event
+ * @param function handler
+ */
+ off: function (event, handler) {
+ if (!eventHandlers[event]) {
+ return;
+ }
+
+ var i = 0;
+ for (i; i < eventHandlers[event].length; i++) {
+ if (eventHandlers[event][i] === handler) {
+ delete eventHandlers[event][i];
+ }
+ }
+ },
+
+ /**
+ * Triggers the given event and passes the parameters to all handlers.
+ *
+ * @param string event
+ * @param Array extraParameters
+ * @param Object context If given the handler will be executed in this context
+ */
+ trigger: function (event, extraParameters, context) {
+ if (!eventHandlers[event]) {
+ return;
+ }
+
+ var i = 0;
+ for (i; i < eventHandlers[event].length; i++) {
+ eventHandlers[event][i].apply(context || windowAlias, extraParameters);
+ }
+ },
+
/**
* Add plugin
*
@@ -6423,22 +6648,82 @@ if (typeof window.Piwik !== 'object') {
* @return Tracker
*/
getTracker: function (piwikUrl, siteId) {
- if(!isDefined(siteId)) {
+ if (!isDefined(siteId)) {
siteId = this.getAsyncTracker().getSiteId();
}
- if(!isDefined(piwikUrl)) {
+ if (!isDefined(piwikUrl)) {
piwikUrl = this.getAsyncTracker().getTrackerUrl();
}
+
return new Tracker(piwikUrl, siteId);
},
/**
- * Get internal asynchronous tracker object
+ * Get all created async trackers
+ *
+ * @return Tracker[]
+ */
+ getAsyncTrackers: function () {
+ return asyncTrackers;
+ },
+
+ /**
+ * Adds a new tracker. All sent requests will be also sent to the given siteId and piwikUrl.
+ * If piwikUrl is not set, current url will be used.
+ *
+ * @param null|string piwikUrl If null, will reuse the same tracker URL of the current tracker instance
+ * @param int|string siteId
+ * @return Tracker
+ */
+ addTracker: function (piwikUrl, siteId) {
+ if (!asyncTrackers.length) {
+ createFirstTracker(piwikUrl, siteId);
+ } else {
+ asyncTrackers[0].addTracker(piwikUrl, siteId);
+ }
+ },
+
+ /**
+ * Get internal asynchronous tracker object.
+ *
+ * If no parameters are given, it returns the internal asynchronous tracker object. If a piwikUrl and idSite
+ * is given, it will try to find an optional
*
+ * @param string piwikUrl
+ * @param int|string siteId
* @return Tracker
*/
- getAsyncTracker: function () {
- return asyncTracker;
+ getAsyncTracker: function (piwikUrl, siteId) {
+
+ var firstTracker;
+ if (asyncTrackers && asyncTrackers[0]) {
+ firstTracker = asyncTrackers[0];
+ }
+
+ if (!siteId && !piwikUrl) {
+ // for BC and by default we just return the initally created tracker
+ return firstTracker;
+ }
+
+ // we look for another tracker created via `addTracker` method
+ if ((!isDefined(siteId) || null === siteId) && firstTracker) {
+ siteId = firstTracker.getSiteId();
+ }
+
+ if ((!isDefined(piwikUrl) || null === piwikUrl) && firstTracker) {
+ piwikUrl = firstTracker.getTrackerUrl();
+ }
+
+ var tracker, i = 0;
+ for (i; i < asyncTrackers.length; i++) {
+ tracker = asyncTrackers[i];
+ if (tracker
+ && String(tracker.getSiteId()) === String(siteId)
+ && tracker.getTrackerUrl() === piwikUrl) {
+
+ return tracker;
+ }
+ }
}
};
@@ -6451,6 +6736,28 @@ if (typeof window.Piwik !== 'object') {
}());
}
+/*!! pluginTrackerHook */
+
+(function () {
+ 'use strict';
+
+ if (window
+ && 'object' === typeof window.piwikPluginAsyncInit
+ && window.piwikPluginAsyncInit.length) {
+ var i = 0;
+ for (i; i < window.piwikPluginAsyncInit.length; i++) {
+ if (typeof window.piwikPluginAsyncInit[i] === 'function') {
+ window.piwikPluginAsyncInit[i]();
+ }
+ }
+ }
+
+ window.Piwik.addTracker();
+
+ window.Piwik.trigger('PiwikInitialized', []);
+ window.Piwik.initialized = true;
+}());
+
if (window && window.piwikAsyncInit) {
window.piwikAsyncInit();
}
diff --git a/js/piwik.min.js b/js/piwik.min.js
new file mode 100644
index 0000000000..002e4cb757
--- /dev/null
+++ b/js/piwik.min.js
@@ -0,0 +1,71 @@
+/*!!
+ * Piwik - free/libre analytics platform
+ *
+ * JavaScript tracking client
+ *
+ * @link http://piwik.org
+ * @source https://github.com/piwik/piwik/blob/master/js/piwik.js
+ * @license http://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
+ * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
+ */
+if(typeof JSON2!=="object"&&typeof window.JSON==="object"&&window.JSON.stringify&&window.JSON.parse){JSON2=window.JSON}else{(function(){var a={};
+/*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
+(function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;
+if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
+}catch(ae){aj=false}}ad=aj}if(ac=="json-parse"){var ag=V.parse;if(typeof ag=="function"){try{if(ag("0")===0&&!ag(false)){ak=ag(ah);var af=ak.a.length==5&&ak.a[0]===1;if(af){try{af=!ag('"\t"')}catch(ae){}if(af){try{af=ag("01")!==1}catch(ae){}}if(af){try{af=ag("1.")!==1}catch(ae){}}}}}catch(ae){af=false}}ad=af}}}return o[ac]=!!ad}if(!o("json")){var U="[object Function]",Q="[object Date]",N="[object Number]",O="[object String]",E="[object Array]",A="[object Boolean]";var F=o("bug-string-char-index");if(!B){var s=J.floor;var Z=[0,31,59,90,120,151,181,212,243,273,304,334];var D=function(ac,ad){return Z[ad]+365*(ac-1970)+s((ac-1969+(ad=+(ad>1)))/4)-s((ac-1901+ad)/100)+s((ac-1601+ad)/400)}}if(!(r=n.hasOwnProperty)){r=function(ae){var ac={},ad;if((ac.__proto__=null,ac.__proto__={toString:1},ac).toString!=u){r=function(ah){var ag=this.__proto__,af=ah in (this.__proto__=null,this);this.__proto__=ag;return af}}else{ad=ac.constructor;r=function(ag){var af=(this.constructor||ad).prototype;return ag in this&&!(ag in af&&this[ag]===af[ag])
+}}ac=null;return r.call(this,ae)}}m=function(ae,ah){var af=0,ac,ad,ag;(ac=function(){this.valueOf=0}).prototype.valueOf=0;ad=new ac();for(ag in ad){if(r.call(ad,ag)){af++}}ac=ad=null;if(!af){ad=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];m=function(aj,an){var am=u.call(aj)==U,al,ak;var ai=!am&&typeof aj.constructor!="function"&&e[typeof aj.hasOwnProperty]&&aj.hasOwnProperty||r;for(al in aj){if(!(am&&al=="prototype")&&ai.call(aj,al)){an(al)}}for(ak=ad.length;al=ad[--ak];ai.call(aj,al)&&an(al)){}}}else{if(af==2){m=function(aj,am){var ai={},al=u.call(aj)==U,ak;for(ak in aj){if(!(al&&ak=="prototype")&&!r.call(ai,ak)&&(ai[ak]=1)&&r.call(aj,ak)){am(ak)}}}}else{m=function(aj,am){var al=u.call(aj)==U,ak,ai;for(ak in aj){if(!(al&&ak=="prototype")&&r.call(aj,ak)&&!(ai=ak==="constructor")){am(ak)}}if(ai||r.call(aj,(ak="constructor"))){am(ak)}}}}return m(ae,ah)};if(!o("json-stringify")){var q={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};
+var I="000000";var t=function(ac,ad){return(I+(ad||0)).slice(-ac)};var z="\\u00";var C=function(ai){var ad='"',ag=0,ah=ai.length,ac=!F||ah>10;var af=ac&&(F?ai.split(""):ai);for(;ag<ah;ag++){var ae=ai.charCodeAt(ag);switch(ae){case 8:case 9:case 10:case 12:case 13:case 34:case 92:ad+=q[ae];break;default:if(ae<32){ad+=z+t(2,ae.toString(16));break}ad+=ac?af[ag]:ai.charAt(ag)}}return ad+'"'};var p=function(ai,aA,ag,al,ax,ac,aj){var at,ae,ap,az,ay,ak,aw,au,aq,an,ar,ad,ah,af,av,ao;try{at=aA[ai]}catch(am){}if(typeof at=="object"&&at){ae=u.call(at);if(ae==Q&&!r.call(at,"toJSON")){if(at>-1/0&&at<1/0){if(D){ay=s(at/86400000);for(ap=s(ay/365.2425)+1970-1;D(ap+1,0)<=ay;ap++){}for(az=s((ay-D(ap,0))/30.42);D(ap,az+1)<=ay;az++){}ay=1+ay-D(ap,az);ak=(at%86400000+86400000)%86400000;aw=s(ak/3600000)%24;au=s(ak/60000)%60;aq=s(ak/1000)%60;an=ak%1000}else{ap=at.getUTCFullYear();az=at.getUTCMonth();ay=at.getUTCDate();aw=at.getUTCHours();au=at.getUTCMinutes();aq=at.getUTCSeconds();an=at.getUTCMilliseconds()}at=(ap<=0||ap>=10000?(ap<0?"-":"+")+t(6,ap<0?-ap:ap):t(4,ap))+"-"+t(2,az+1)+"-"+t(2,ay)+"T"+t(2,aw)+":"+t(2,au)+":"+t(2,aq)+"."+t(3,an)+"Z"
+}else{at=null}}else{if(typeof at.toJSON=="function"&&((ae!=N&&ae!=O&&ae!=E)||r.call(at,"toJSON"))){at=at.toJSON(ai)}}}if(ag){at=ag.call(aA,ai,at)}if(at===null){return"null"}ae=u.call(at);if(ae==A){return""+at}else{if(ae==N){return at>-1/0&&at<1/0?""+at:"null"}else{if(ae==O){return C(""+at)}}}if(typeof at=="object"){for(af=aj.length;af--;){if(aj[af]===at){throw aa()}}aj.push(at);ar=[];av=ac;ac+=ax;if(ae==E){for(ah=0,af=at.length;ah<af;ah++){ad=p(ah,at,ag,al,ax,ac,aj);ar.push(ad===L?"null":ad)}ao=ar.length?(ax?"[\n"+ac+ar.join(",\n"+ac)+"\n"+av+"]":("["+ar.join(",")+"]")):"[]"}else{m(al||at,function(aC){var aB=p(aC,at,ag,al,ax,ac,aj);if(aB!==L){ar.push(C(aC)+":"+(ax?" ":"")+aB)}});ao=ar.length?(ax?"{\n"+ac+ar.join(",\n"+ac)+"\n"+av+"}":("{"+ar.join(",")+"}")):"{}"}aj.pop();return ao}};V.stringify=function(ac,ae,af){var ad,al,aj,ai;if(e[typeof ae]&&ae){if((ai=u.call(ae))==U){al=ae}else{if(ai==E){aj={};for(var ah=0,ag=ae.length,ak;ah<ag;ak=ae[ah++],((ai=u.call(ak)),ai==O||ai==N)&&(aj[ak]=1)){}}}}if(af){if((ai=u.call(af))==N){if((af-=af%1)>0){for(ad="",af>10&&(af=10);
+ad.length<af;ad+=" "){}}}else{if(ai==O){ad=af.length<=10?af:af.slice(0,10)}}}return p("",(ak={},ak[""]=ac,ak),al,aj,ad,"",[])}}if(!o("json-parse")){var M=R.fromCharCode;var l={92:"\\",34:'"',47:"/",98:"\b",116:"\t",110:"\n",102:"\f",114:"\r"};var G,X;var H=function(){G=X=null;throw T()};var y=function(){var ah=X,af=ah.length,ag,ae,ac,ai,ad;while(G<af){ad=ah.charCodeAt(G);switch(ad){case 9:case 10:case 13:case 32:G++;break;case 123:case 125:case 91:case 93:case 58:case 44:ag=F?ah.charAt(G):ah[G];G++;return ag;case 34:for(ag="@",G++;G<af;){ad=ah.charCodeAt(G);if(ad<32){H()}else{if(ad==92){ad=ah.charCodeAt(++G);switch(ad){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:ag+=l[ad];G++;break;case 117:ae=++G;for(ac=G+4;G<ac;G++){ad=ah.charCodeAt(G);if(!(ad>=48&&ad<=57||ad>=97&&ad<=102||ad>=65&&ad<=70)){H()}}ag+=M("0x"+ah.slice(ae,G));break;default:H()}}else{if(ad==34){break}ad=ah.charCodeAt(G);ae=G;while(ad>=32&&ad!=92&&ad!=34){ad=ah.charCodeAt(++G)}ag+=ah.slice(ae,G)}}}if(ah.charCodeAt(G)==34){G++;
+return ag}H();default:ae=G;if(ad==45){ai=true;ad=ah.charCodeAt(++G)}if(ad>=48&&ad<=57){if(ad==48&&((ad=ah.charCodeAt(G+1)),ad>=48&&ad<=57)){H()}ai=false;for(;G<af&&((ad=ah.charCodeAt(G)),ad>=48&&ad<=57);G++){}if(ah.charCodeAt(G)==46){ac=++G;for(;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}ad=ah.charCodeAt(G);if(ad==101||ad==69){ad=ah.charCodeAt(++G);if(ad==43||ad==45){G++}for(ac=G;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}return +ah.slice(ae,G)}if(ai){H()}if(ah.slice(G,G+4)=="true"){G+=4;return true}else{if(ah.slice(G,G+5)=="false"){G+=5;return false}else{if(ah.slice(G,G+4)=="null"){G+=4;return null}}}H()}}return"$"};var W=function(ad){var ac,ae;if(ad=="$"){H()}if(typeof ad=="string"){if((F?ad.charAt(0):ad[0])=="@"){return ad.slice(1)}if(ad=="["){ac=[];for(;;ae||(ae=true)){ad=y();if(ad=="]"){break}if(ae){if(ad==","){ad=y();if(ad=="]"){H()}}else{H()}}if(ad==","){H()}ac.push(W(ad))}return ac}else{if(ad=="{"){ac={};for(;;ae||(ae=true)){ad=y();
+if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON2=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Piwik=(function(){var l,a={},r={},y=document,f=navigator,P=screen,L=window,g=L.performance||L.mozPerformance||L.msPerformance||L.webkitPerformance,n=L.encodeURIComponent,K=L.decodeURIComponent,i=unescape,A=[],x,d;
+function k(ac){try{return K(ac)}catch(ad){return unescape(ac)}}function B(ad){var ac=typeof ad;return ac!=="undefined"}function t(ac){return typeof ac==="function"}function O(ac){return typeof ac==="object"}function q(ac){return typeof ac==="string"||ac instanceof String}function u(ad){if(!ad){return true}var ac;var ae=true;for(ac in ad){if(Object.prototype.hasOwnProperty.call(ad,ac)){ae=false}}return ae}function Y(ac){if(console!==undefined&&console&&console.error){console.error(ac)}}function V(){var ag,af,ai,ac;for(ag=0;ag<arguments.length;ag+=1){ac=arguments[ag];ai=ac.shift();for(af=0;af<A.length;af++){if(q(ai)){var ad=A[af];var ah;var ae=ai.indexOf("::")>0;if(ae){ah=ai.split("::");ad=ah[0];ai=ah[1];if("object"===typeof d[ad]&&"function"===typeof d[ad][ai]){d[ad][ai].apply(d[ad],ac)}return}var aj=ai.indexOf(".")>0;if(aj){ah=ai.split(".");ad=ad[ah[0]];ai=ah[1]}if(ad[ai]){ad[ai].apply(ad,ac)}else{var ak="The method '"+ai+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: http://developer.piwik.org/api-reference/tracking-javascript';
+Y(ak);if(!aj){throw new TypeError(ak)}}if(ai==="addTracker"){break}if(ai==="setTrackerUrl"||ai==="setSiteId"){break}}else{ai.apply(A[af],ac)}}}}function aa(af,ae,ad,ac){if(af.addEventListener){af.addEventListener(ae,ad,ac);return true}if(af.attachEvent){return af.attachEvent("on"+ae,ad)}af["on"+ae]=ad}function S(ad,ah){var ac="",af,ae,ag;for(af in a){if(Object.prototype.hasOwnProperty.call(a,af)){ae=a[af][ad];if(t(ae)){ag=ae(ah);if(ag){ac+=ag}}}}return ac}function W(){var ac;S("unload");if(l){do{ac=new Date()}while(ac.getTimeAlias()<l)}}function j(ae,ad){var ac=y.createElement("script");ac.type="text/javascript";ac.src=ae;if(ac.readyState){ac.onreadystatechange=function(){var af=this.readyState;if(af==="loaded"||af==="complete"){ac.onreadystatechange=null;ad()}}}else{ac.onload=ad}y.getElementsByTagName("head")[0].appendChild(ac)}function C(){var ac="";try{ac=L.top.document.referrer}catch(ae){if(L.parent){try{ac=L.parent.document.referrer}catch(ad){ac=""}}}if(ac===""){ac=y.referrer}return ac
+}function m(ac){var ae=new RegExp("^([a-z]+):"),ad=ae.exec(ac);return ad?ad[1]:null}function c(ac){var ae=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),ad=ae.exec(ac);return ad?ad[1]:ac}function N(ae,ad){var ac="[\\?&#]"+ad+"=([^&#]*)";var ag=new RegExp(ac);var af=ag.exec(ae);return af?K(af[1]):""}function w(ac){return unescape(n(ac))}function Z(ar){var ae=function(ay,ax){return(ay<<ax)|(ay>>>(32-ax))},at=function(aA){var ay="",az,ax;for(az=7;az>=0;az--){ax=(aA>>>(az*4))&15;ay+=ax.toString(16)}return ay},ah,av,au,ad=[],al=1732584193,aj=4023233417,ai=2562383102,ag=271733878,af=3285377520,aq,ap,ao,an,am,aw,ac,ak=[];ar=w(ar);ac=ar.length;for(av=0;av<ac-3;av+=4){au=ar.charCodeAt(av)<<24|ar.charCodeAt(av+1)<<16|ar.charCodeAt(av+2)<<8|ar.charCodeAt(av+3);ak.push(au)}switch(ac&3){case 0:av=2147483648;break;case 1:av=ar.charCodeAt(ac-1)<<24|8388608;break;case 2:av=ar.charCodeAt(ac-2)<<24|ar.charCodeAt(ac-1)<<16|32768;break;case 3:av=ar.charCodeAt(ac-3)<<24|ar.charCodeAt(ac-2)<<16|ar.charCodeAt(ac-1)<<8|128;
+break}ak.push(av);while((ak.length&15)!==14){ak.push(0)}ak.push(ac>>>29);ak.push((ac<<3)&4294967295);for(ah=0;ah<ak.length;ah+=16){for(av=0;av<16;av++){ad[av]=ak[ah+av]}for(av=16;av<=79;av++){ad[av]=ae(ad[av-3]^ad[av-8]^ad[av-14]^ad[av-16],1)}aq=al;ap=aj;ao=ai;an=ag;am=af;for(av=0;av<=19;av++){aw=(ae(aq,5)+((ap&ao)|(~ap&an))+am+ad[av]+1518500249)&4294967295;am=an;an=ao;ao=ae(ap,30);ap=aq;aq=aw}for(av=20;av<=39;av++){aw=(ae(aq,5)+(ap^ao^an)+am+ad[av]+1859775393)&4294967295;am=an;an=ao;ao=ae(ap,30);ap=aq;aq=aw}for(av=40;av<=59;av++){aw=(ae(aq,5)+((ap&ao)|(ap&an)|(ao&an))+am+ad[av]+2400959708)&4294967295;am=an;an=ao;ao=ae(ap,30);ap=aq;aq=aw}for(av=60;av<=79;av++){aw=(ae(aq,5)+(ap^ao^an)+am+ad[av]+3395469782)&4294967295;am=an;an=ao;ao=ae(ap,30);ap=aq;aq=aw}al=(al+aq)&4294967295;aj=(aj+ap)&4294967295;ai=(ai+ao)&4294967295;ag=(ag+an)&4294967295;af=(af+am)&4294967295}aw=at(al)+at(aj)+at(ai)+at(ag)+at(af);return aw.toLowerCase()}function R(ae,ac,ad){if(!ae){ae=""}if(!ac){ac=""}if(ae==="translate.googleusercontent.com"){if(ad===""){ad=ac
+}ac=N(ac,"u");ae=c(ac)}else{if(ae==="cc.bingj.com"||ae==="webcache.googleusercontent.com"||ae.slice(0,5)==="74.6."){ac=y.links[0].href;ae=c(ac)}}return[ae,ac,ad]}function D(ad){var ac=ad.length;if(ad.charAt(--ac)==="."){ad=ad.slice(0,ac)}if(ad.slice(0,2)==="*."){ad=ad.slice(1)}if(ad.indexOf("/")!==-1){ad=ad.substr(0,ad.indexOf("/"))}return ad}function ab(ad){ad=ad&&ad.text?ad.text:ad;if(!q(ad)){var ac=y.getElementsByTagName("title");if(ac&&B(ac[0])){ad=ac[0].text}}return ad}function H(ac){if(!ac){return[]}if(!B(ac.children)&&B(ac.childNodes)){return ac.children}if(B(ac.children)){return ac.children}return[]}function M(ad,ac){if(!ad||!ac){return false}if(ad.contains){return ad.contains(ac)}if(ad===ac){return true}if(ad.compareDocumentPosition){return !!(ad.compareDocumentPosition(ac)&16)}return false}function E(ae,af){if(ae&&ae.indexOf){return ae.indexOf(af)}if(!B(ae)||ae===null){return -1}if(!ae.length){return -1}var ac=ae.length;if(ac===0){return -1}var ad=0;while(ad<ac){if(ae[ad]===af){return ad
+}ad++}return -1}function X(ad,ac){ad=String(ad);return ad.lastIndexOf(ac,0)===0}function J(ad,ac){ad=String(ad);return ad.indexOf(ac,ad.length-ac.length)!==-1}function s(ad,ac){ad=String(ad);return ad.indexOf(ac)!==-1}function e(ad,ac){ad=String(ad);return ad.substr(0,ad.length-ac)}function h(ae){if(!ae){return false}function ac(ag,ah){if(L.getComputedStyle){return y.defaultView.getComputedStyle(ag,null)[ah]}if(ag.currentStyle){return ag.currentStyle[ah]}}function af(ag){ag=ag.parentNode;while(ag){if(ag===y){return true}ag=ag.parentNode}return false}function ad(ai,ao,ag,al,aj,am,ak){var ah=ai.parentNode,an=1;if(!af(ai)){return false}if(9===ah.nodeType){return true}if("0"===ac(ai,"opacity")||"none"===ac(ai,"display")||"hidden"===ac(ai,"visibility")){return false}if(!B(ao)||!B(ag)||!B(al)||!B(aj)||!B(am)||!B(ak)){ao=ai.offsetTop;aj=ai.offsetLeft;al=ao+ai.offsetHeight;ag=aj+ai.offsetWidth;am=ai.offsetWidth;ak=ai.offsetHeight}if(ae===ai&&(0===ak||0===am)&&"hidden"===ac(ai,"overflow")){return false
+}if(ah){if(("hidden"===ac(ah,"overflow")||"scroll"===ac(ah,"overflow"))){if(aj+an>ah.offsetWidth+ah.scrollLeft||aj+am-an<ah.scrollLeft||ao+an>ah.offsetHeight+ah.scrollTop||ao+ak-an<ah.scrollTop){return false}}if(ai.offsetParent===ah){aj+=ah.offsetLeft;ao+=ah.offsetTop}return ad(ah,ao,ag,al,aj,am,ak)}return true}return ad(ae)}var U={htmlCollectionToArray:function(ae){var ac=[],ad;if(!ae||!ae.length){return ac}for(ad=0;ad<ae.length;ad++){ac.push(ae[ad])}return ac},find:function(ac){if(!document.querySelectorAll||!ac){return[]}var ad=document.querySelectorAll(ac);return this.htmlCollectionToArray(ad)},findMultiple:function(ae){if(!ae||!ae.length){return[]}var ad,af;var ac=[];for(ad=0;ad<ae.length;ad++){af=this.find(ae[ad]);ac=ac.concat(af)}ac=this.makeNodesUnique(ac);return ac},findNodesByTagName:function(ad,ac){if(!ad||!ac||!ad.getElementsByTagName){return[]}var ae=ad.getElementsByTagName(ac);return this.htmlCollectionToArray(ae)},makeNodesUnique:function(ac){var ah=[].concat(ac);ac.sort(function(aj,ai){if(aj===ai){return 0
+}var al=E(ah,aj);var ak=E(ah,ai);if(al===ak){return 0}return al>ak?-1:1});if(ac.length<=1){return ac}var ad=0;var af=0;var ag=[];var ae;ae=ac[ad++];while(ae){if(ae===ac[ad]){af=ag.push(ad)}ae=ac[ad++]||null}while(af--){ac.splice(ag[af],1)}return ac},getAttributeValueFromNode:function(ag,ae){if(!this.hasNodeAttribute(ag,ae)){return}if(ag&&ag.getAttribute){return ag.getAttribute(ae)}if(!ag||!ag.attributes){return}var af=(typeof ag.attributes[ae]);if("undefined"===af){return}if(ag.attributes[ae].value){return ag.attributes[ae].value}if(ag.attributes[ae].nodeValue){return ag.attributes[ae].nodeValue}var ad;var ac=ag.attributes;if(!ac){return}for(ad=0;ad<ac.length;ad++){if(ac[ad].nodeName===ae){return ac[ad].nodeValue}}return null},hasNodeAttributeWithValue:function(ad,ac){var ae=this.getAttributeValueFromNode(ad,ac);return !!ae},hasNodeAttribute:function(ae,ac){if(ae&&ae.hasAttribute){return ae.hasAttribute(ac)}if(ae&&ae.attributes){var ad=(typeof ae.attributes[ac]);return"undefined"!==ad}return false
+},hasNodeCssClass:function(ae,ac){if(ae&&ac&&ae.className){var ad=typeof ae.className==="string"?ae.className.split(" "):[];if(-1!==E(ad,ac)){return true}}return false},findNodesHavingAttribute:function(ag,ae,ac){if(!ac){ac=[]}if(!ag||!ae){return ac}var af=H(ag);if(!af||!af.length){return ac}var ad,ah;for(ad=0;ad<af.length;ad++){ah=af[ad];if(this.hasNodeAttribute(ah,ae)){ac.push(ah)}ac=this.findNodesHavingAttribute(ah,ae,ac)}return ac},findFirstNodeHavingAttribute:function(ae,ad){if(!ae||!ad){return}if(this.hasNodeAttribute(ae,ad)){return ae}var ac=this.findNodesHavingAttribute(ae,ad);if(ac&&ac.length){return ac[0]}},findFirstNodeHavingAttributeWithValue:function(af,ae){if(!af||!ae){return}if(this.hasNodeAttributeWithValue(af,ae)){return af}var ac=this.findNodesHavingAttribute(af,ae);if(!ac||!ac.length){return}var ad;for(ad=0;ad<ac.length;ad++){if(this.getAttributeValueFromNode(ac[ad],ae)){return ac[ad]}}},findNodesHavingCssClass:function(ag,af,ac){if(!ac){ac=[]}if(!ag||!af){return ac}if(ag.getElementsByClassName){var ah=ag.getElementsByClassName(af);
+return this.htmlCollectionToArray(ah)}var ae=H(ag);if(!ae||!ae.length){return[]}var ad,ai;for(ad=0;ad<ae.length;ad++){ai=ae[ad];if(this.hasNodeCssClass(ai,af)){ac.push(ai)}ac=this.findNodesHavingCssClass(ai,af,ac)}return ac},findFirstNodeHavingClass:function(ae,ad){if(!ae||!ad){return}if(this.hasNodeCssClass(ae,ad)){return ae}var ac=this.findNodesHavingCssClass(ae,ad);if(ac&&ac.length){return ac[0]}},isLinkElement:function(ad){if(!ad){return false}var ac=String(ad.nodeName).toLowerCase();var af=["a","area"];var ae=E(af,ac);return ae!==-1},setAnyAttribute:function(ad,ac,ae){if(!ad||!ac){return}if(ad.setAttribute){ad.setAttribute(ac,ae)}else{ad[ac]=ae}}};var p={CONTENT_ATTR:"data-track-content",CONTENT_CLASS:"piwikTrackContent",CONTENT_NAME_ATTR:"data-content-name",CONTENT_PIECE_ATTR:"data-content-piece",CONTENT_PIECE_CLASS:"piwikContentPiece",CONTENT_TARGET_ATTR:"data-content-target",CONTENT_TARGET_CLASS:"piwikContentTarget",CONTENT_IGNOREINTERACTION_ATTR:"data-content-ignoreinteraction",CONTENT_IGNOREINTERACTION_CLASS:"piwikContentIgnoreInteraction",location:undefined,findContentNodes:function(){var ad="."+this.CONTENT_CLASS;
+var ac="["+this.CONTENT_ATTR+"]";var ae=U.findMultiple([ad,ac]);return ae},findContentNodesWithinNode:function(af){if(!af){return[]}var ad=U.findNodesHavingCssClass(af,this.CONTENT_CLASS);var ac=U.findNodesHavingAttribute(af,this.CONTENT_ATTR);if(ac&&ac.length){var ae;for(ae=0;ae<ac.length;ae++){ad.push(ac[ae])}}if(U.hasNodeAttribute(af,this.CONTENT_ATTR)){ad.push(af)}else{if(U.hasNodeCssClass(af,this.CONTENT_CLASS)){ad.push(af)}}ad=U.makeNodesUnique(ad);return ad},findParentContentNode:function(ad){if(!ad){return}var ae=ad;var ac=0;while(ae&&ae!==y&&ae.parentNode){if(U.hasNodeAttribute(ae,this.CONTENT_ATTR)){return ae}if(U.hasNodeCssClass(ae,this.CONTENT_CLASS)){return ae}ae=ae.parentNode;if(ac>1000){break}ac++}},findPieceNode:function(ad){var ac;ac=U.findFirstNodeHavingAttribute(ad,this.CONTENT_PIECE_ATTR);if(!ac){ac=U.findFirstNodeHavingClass(ad,this.CONTENT_PIECE_CLASS)}if(ac){return ac}return ad},findTargetNodeNoDefault:function(ac){if(!ac){return}var ad=U.findFirstNodeHavingAttributeWithValue(ac,this.CONTENT_TARGET_ATTR);
+if(ad){return ad}ad=U.findFirstNodeHavingAttribute(ac,this.CONTENT_TARGET_ATTR);if(ad){return ad}ad=U.findFirstNodeHavingClass(ac,this.CONTENT_TARGET_CLASS);if(ad){return ad}},findTargetNode:function(ac){var ad=this.findTargetNodeNoDefault(ac);if(ad){return ad}return ac},findContentName:function(ad){if(!ad){return}var ag=U.findFirstNodeHavingAttributeWithValue(ad,this.CONTENT_NAME_ATTR);if(ag){return U.getAttributeValueFromNode(ag,this.CONTENT_NAME_ATTR)}var ac=this.findContentPiece(ad);if(ac){return this.removeDomainIfIsInLink(ac)}if(U.hasNodeAttributeWithValue(ad,"title")){return U.getAttributeValueFromNode(ad,"title")}var ae=this.findPieceNode(ad);if(U.hasNodeAttributeWithValue(ae,"title")){return U.getAttributeValueFromNode(ae,"title")}var af=this.findTargetNode(ad);if(U.hasNodeAttributeWithValue(af,"title")){return U.getAttributeValueFromNode(af,"title")}},findContentPiece:function(ad){if(!ad){return}var af=U.findFirstNodeHavingAttributeWithValue(ad,this.CONTENT_PIECE_ATTR);if(af){return U.getAttributeValueFromNode(af,this.CONTENT_PIECE_ATTR)
+}var ac=this.findPieceNode(ad);var ae=this.findMediaUrlInNode(ac);if(ae){return this.toAbsoluteUrl(ae)}},findContentTarget:function(ae){if(!ae){return}var af=this.findTargetNode(ae);if(U.hasNodeAttributeWithValue(af,this.CONTENT_TARGET_ATTR)){return U.getAttributeValueFromNode(af,this.CONTENT_TARGET_ATTR)}var ad;if(U.hasNodeAttributeWithValue(af,"href")){ad=U.getAttributeValueFromNode(af,"href");return this.toAbsoluteUrl(ad)}var ac=this.findPieceNode(ae);if(U.hasNodeAttributeWithValue(ac,"href")){ad=U.getAttributeValueFromNode(ac,"href");return this.toAbsoluteUrl(ad)}},isSameDomain:function(ac){if(!ac||!ac.indexOf){return false}if(0===ac.indexOf(this.getLocation().origin)){return true}var ad=ac.indexOf(this.getLocation().host);if(8>=ad&&0<=ad){return true}return false},removeDomainIfIsInLink:function(ae){var ad="^https?://[^/]+";var ac="^.*//[^/]+";if(ae&&ae.search&&-1!==ae.search(new RegExp(ad))&&this.isSameDomain(ae)){ae=ae.replace(new RegExp(ac),"");if(!ae){ae="/"}}return ae},findMediaUrlInNode:function(ag){if(!ag){return
+}var ae=["img","embed","video","audio"];var ac=ag.nodeName.toLowerCase();if(-1!==E(ae,ac)&&U.findFirstNodeHavingAttributeWithValue(ag,"src")){var af=U.findFirstNodeHavingAttributeWithValue(ag,"src");return U.getAttributeValueFromNode(af,"src")}if(ac==="object"&&U.hasNodeAttributeWithValue(ag,"data")){return U.getAttributeValueFromNode(ag,"data")}if(ac==="object"){var ah=U.findNodesByTagName(ag,"param");if(ah&&ah.length){var ad;for(ad=0;ad<ah.length;ad++){if("movie"===U.getAttributeValueFromNode(ah[ad],"name")&&U.hasNodeAttributeWithValue(ah[ad],"value")){return U.getAttributeValueFromNode(ah[ad],"value")}}}var ai=U.findNodesByTagName(ag,"embed");if(ai&&ai.length){return this.findMediaUrlInNode(ai[0])}}},trim:function(ac){if(ac&&String(ac)===ac){return ac.replace(/^\s+|\s+$/g,"")}return ac},isOrWasNodeInViewport:function(ah){if(!ah||!ah.getBoundingClientRect||ah.nodeType!==1){return true}var ag=ah.getBoundingClientRect();var af=y.documentElement||{};var ae=ag.top<0;if(ae&&ah.offsetTop){ae=(ah.offsetTop+ag.height)>0
+}var ad=af.clientWidth;if(L.innerWidth&&ad>L.innerWidth){ad=L.innerWidth}var ac=af.clientHeight;if(L.innerHeight&&ac>L.innerHeight){ac=L.innerHeight}return((ag.bottom>0||ae)&&ag.right>0&&ag.left<ad&&((ag.top<ac)||ae))},isNodeVisible:function(ad){var ac=h(ad);var ae=this.isOrWasNodeInViewport(ad);return ac&&ae},buildInteractionRequestParams:function(ac,ad,ae,af){var ag="";if(ac){ag+="c_i="+n(ac)}if(ad){if(ag){ag+="&"}ag+="c_n="+n(ad)}if(ae){if(ag){ag+="&"}ag+="c_p="+n(ae)}if(af){if(ag){ag+="&"}ag+="c_t="+n(af)}return ag},buildImpressionRequestParams:function(ac,ad,ae){var af="c_n="+n(ac)+"&c_p="+n(ad);if(ae){af+="&c_t="+n(ae)}return af},buildContentBlock:function(ae){if(!ae){return}var ac=this.findContentName(ae);var ad=this.findContentPiece(ae);var af=this.findContentTarget(ae);ac=this.trim(ac);ad=this.trim(ad);af=this.trim(af);return{name:ac||"Unknown",piece:ad||"Unknown",target:af||""}},collectContent:function(af){if(!af||!af.length){return[]}var ae=[];var ac,ad;for(ac=0;ac<af.length;
+ac++){ad=this.buildContentBlock(af[ac]);if(B(ad)){ae.push(ad)}}return ae},setLocation:function(ac){this.location=ac},getLocation:function(){var ac=this.location||L.location;if(!ac.origin){ac.origin=ac.protocol+"//"+ac.hostname+(ac.port?":"+ac.port:"")}return ac},toAbsoluteUrl:function(ad){if((!ad||String(ad)!==ad)&&ad!==""){return ad}if(""===ad){return this.getLocation().href}if(ad.search(/^\/\//)!==-1){return this.getLocation().protocol+ad}if(ad.search(/:\/\//)!==-1){return ad}if(0===ad.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ad}if(0===ad.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ad}if(0===ad.search("^[a-zA-Z]{2,11}:")){return ad}if(ad.search(/^\//)!==-1){return this.getLocation().origin+ad}var ac="(.*/)";var ae=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ac))[0];return ae+ad},isUrlToCurrentDomain:function(ad){var ae=this.toAbsoluteUrl(ad);if(!ae){return false}var ac=this.getLocation().origin;
+if(ac===ae){return true}if(0===String(ae).indexOf(ac)){if(":"===String(ae).substr(ac.length,1)){return false}return true}return false},setHrefAttribute:function(ad,ac){if(!ad||!ac){return}U.setAnyAttribute(ad,"href",ac)},shouldIgnoreInteraction:function(ae){var ad=U.hasNodeAttribute(ae,this.CONTENT_IGNOREINTERACTION_ATTR);var ac=U.hasNodeCssClass(ae,this.CONTENT_IGNOREINTERACTION_CLASS);return ad||ac}};function G(ad,ag){if(ag){return ag}if(s(ad,"?")){var af=ad.indexOf("?");ad=ad.slice(0,af)}if(J(ad,"piwik.php")){ad=e(ad,"piwik.php".length)}else{if(J(ad,".php")){var ac=ad.lastIndexOf("/");var ae=1;ad=ad.slice(0,ac+ae)}}if(J(ad,"/js/")){ad=e(ad,"js/".length)}return ad}function F(ai){var ak="Piwik_Overlay";var ad=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var ae=ad.exec(y.referrer);if(ae){var ag=ae[1];if(ag!==String(ai)){return false}var ah=ae[2],ac=ae[3],af=ae[4];if(!af){af=""}else{if(af.indexOf("&segment=")===0){af=af.substr("&segment=".length)
+}}L.name=ak+"###"+ah+"###"+ac+"###"+af}var aj=L.name.split("###");return aj.length===4&&aj[0]===ak}function Q(ad,aj,af){var ai=L.name.split("###"),ah=ai[1],ac=ai[2],ag=ai[3],ae=G(ad,aj);j(ae+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(ae,af,ah,ac,ag)})}function o(){var ae;try{ae=L.frameElement}catch(ad){return true}if(B(ae)){return(ae&&String(ae.nodeName).toLowerCase()==="iframe")?true:false}try{return L.self!==L.top}catch(ac){return true}}function I(bK,bE){var bA=R(y.domain,L.location.href,C()),cj=D(bA[0]),bk=k(bA[1]),aZ=k(bA[2]),ch=false,bO="GET",cv=bO,aq="application/x-www-form-urlencoded; charset=UTF-8",b0=aq,am=bK||"",bf="",cn="",bC=bE||"",a8="",bl="",aK,aV="",cs=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ai=[cj],a9=[],bi=[],aN=[],bg=500,ca,aL,bo,bm,ac,bW=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],be=["pk_kwd","piwik_kwd","utm_term"],aW="_pk_",cl,a1,aX=false,cf,aT,a5,cb=33955200000,bU=1800000,cr=15768000000,aI=true,bS=0,bn=false,ax=false,bH,bs={},bR={},aY={},a4=200,co={},ct={},bG=[],bL=false,b4=false,ad=false,cu=false,av=false,aS=o(),cm=null,bI,ay,ba,bD=Z,a0;
+try{aV=y.title}catch(b2){aV=""}function cy(cI,cF,cE,cH,cD,cG){if(aX){return}var cC;if(cE){cC=new Date();cC.setTime(cC.getTime()+cE)}y.cookie=cI+"="+n(cF)+(cE?";expires="+cC.toGMTString():"")+";path="+(cH||"/")+(cD?";domain="+cD:"")+(cG?";secure":"")}function al(cE){if(aX){return 0}var cC=new RegExp("(^|;)[ ]*"+cE+"=([^;]*)"),cD=cC.exec(y.cookie);return cD?K(cD[2]):0}function by(cC){var cD;if(bm){cD=new RegExp("#.*");return cC.replace(cD,"")}return cC}function br(cE,cC){var cF=m(cC),cD;if(cF){return cC}if(cC.slice(0,1)==="/"){return m(cE)+"://"+c(cE)+cC}cE=by(cE);cD=cE.indexOf("?");if(cD>=0){cE=cE.slice(0,cD)}cD=cE.lastIndexOf("/");if(cD!==cE.length-1){cE=cE.slice(0,cD+1)}return cE+cC}function b8(cE,cC){var cD;cE=String(cE).toLowerCase();cC=String(cC).toLowerCase();if(cE===cC){return true}if(cC.slice(0,1)==="."){if(cE===cC.slice(1)){return true}cD=cE.length-cC.length;if((cD>0)&&(cE.slice(cD)===cC)){return true}}return false}function bQ(cC){var cD=document.createElement("a");if(cC.indexOf("//")!==0&&cC.indexOf("http")!==0){if(cC.indexOf("*")===0){cC=cC.substr(1)
+}if(cC.indexOf(".")===0){cC=cC.substr(1)}cC="http://"+cC}cD.href=p.toAbsoluteUrl(cC);if(cD.pathname){return cD.pathname}return""}function aJ(cD,cC){if(!X(cC,"/")){cC="/"+cC}if(!X(cD,"/")){cD="/"+cD}var cE=(cC==="/"||cC==="/*");if(cE){return true}if(cD===cC){return true}cC=String(cC).toLowerCase();cD=String(cD).toLowerCase();if(J(cC,"*")){cC=cC.slice(0,-1);cE=(!cC||cC==="/");if(cE){return true}if(cD===cC){return true}return cD.indexOf(cC)===0}if(!J(cD,"/")){cD+="/"}if(!J(cC,"/")){cC+="/"}return cD.indexOf(cC)===0}function af(cG,cI){var cD,cC,cE,cF,cH;for(cD=0;cD<ai.length;cD++){cF=D(ai[cD]);cH=bQ(ai[cD]);if(b8(cG,cF)&&aJ(cI,cH)){return true}}return false}function aC(cF){var cD,cC,cE;for(cD=0;cD<ai.length;cD++){cC=D(ai[cD].toLowerCase());if(cF===cC){return true}if(cC.slice(0,1)==="."){if(cF===cC.slice(1)){return true}cE=cF.length-cC.length;if((cE>0)&&(cF.slice(cE)===cC)){return true}}}return false}function bV(cC,cE){var cD=new Image(1,1);cD.onload=function(){x=0;if(typeof cE==="function"){cE()
+}};cC=cC.replace("send_image=0","send_image=1");cD.src=am+(am.indexOf("?")<0?"?":"&")+cC}function cq(cD,cG,cC){if(!B(cC)||null===cC){cC=true}try{var cF=L.XMLHttpRequest?new L.XMLHttpRequest():L.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;cF.open("POST",am,true);cF.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)&&cC){bV(cD,cG)}else{if(this.readyState===4&&(typeof cG==="function")){cG()}}};cF.setRequestHeader("Content-Type",b0);cF.send(cD)}catch(cE){if(cC){bV(cD,cG)}}}function bM(cD){var cC=new Date();var cE=cC.getTime()+cD;if(!l||cE>l){l=cE}}function bT(cC){if(bI||!aL){return}bI=setTimeout(function cD(){bI=null;if(!aS){aS=(!y.hasFocus||y.hasFocus())}if(!aS){bT(aL);return}if(bo()){return}var cE=new Date(),cF=aL-(cE.getTime()-cm);cF=Math.min(aL,cF);bT(cF)},cC||aL)}function bh(){if(!bI){return}clearTimeout(bI);bI=null}function aP(){aS=true;if(bo()){return}bT()}function aj(){bh()}function cA(){if(av||!aL){return}av=true;aa(L,"focus",aP);
+aa(L,"blur",aj);bT()}function b5(cG){var cD=new Date();var cC=cD.getTime();cm=cC;if(b4&&cC<b4){var cE=b4-cC;setTimeout(cG,cE);bM(cE+50);b4+=50;return}if(b4===false){var cF=800;b4=cC+cF}cG()}function bd(cD,cC,cE){if(!cf&&cD){b5(function(){if(cv==="POST"){cq(cD,cE)}else{bV(cD,cE)}bM(cC)})}if(!av){cA()}else{bT()}}function bP(cC){if(cf){return false}return(cC&&cC.length)}function cz(cE,cC){if(!bP(cE)){return}var cD='{"requests":["?'+cE.join('","?')+'"]}';b5(function(){cq(cD,null,false);bM(cC)})}function aA(cC){return aW+cC+"."+bC+"."+a0}function bB(){if(aX){return"0"}if(!B(f.cookieEnabled)){var cC=aA("testcookie");cy(cC,"1");return al(cC)==="1"?"1":"0"}return f.cookieEnabled?"1":"0"}function aU(){a0=bD((cl||cj)+(a1||"/")).slice(0,4)}function bt(){var cD=aA("cvar"),cC=al(cD);if(cC.length){cC=JSON2.parse(cC);if(O(cC)){return cC}}return{}}function b6(){if(ax===false){ax=bt()}}function cg(){return bD((f.userAgent||"")+(f.platform||"")+JSON2.stringify(ct)+(new Date()).getTime()+Math.random()).slice(0,16)
+}function cd(){var cE=new Date(),cC=Math.round(cE.getTime()/1000),cD=aA("id"),cH=al(cD),cG,cF;if(cH){cG=cH.split(".");cG.unshift("0");if(bl.length){cG[1]=bl}return cG}if(bl.length){cF=bl}else{if("0"===bB()){cF=""}else{cF=cg()}}cG=["1",cF,cC,0,cC,"",""];return cG}function aE(){var cJ=cd(),cF=cJ[0],cG=cJ[1],cD=cJ[2],cC=cJ[3],cH=cJ[4],cE=cJ[5];if(!B(cJ[6])){cJ[6]=""}var cI=cJ[6];return{newVisitor:cF,uuid:cG,createTs:cD,visitCount:cC,currentVisitTs:cH,lastVisitTs:cE,lastEcommerceOrderTs:cI}}function ap(){var cF=new Date(),cD=cF.getTime(),cG=aE().createTs;var cC=parseInt(cG,10);var cE=(cC*1000)+cb-cD;return cE}function at(cC){if(!bC){return}var cE=new Date(),cD=Math.round(cE.getTime()/1000);if(!B(cC)){cC=aE()}var cF=cC.uuid+"."+cC.createTs+"."+cC.visitCount+"."+cD+"."+cC.lastVisitTs+"."+cC.lastEcommerceOrderTs;cy(aA("id"),cF,ap(),a1,cl)}function bj(){var cC=al(aA("ref"));if(cC.length){try{cC=JSON2.parse(cC);if(O(cC)){return cC}}catch(cD){}}return["","",0,""]}function bu(cE,cD,cC){cy(cE,"",-86400,cD,cC)
+}function a6(cD){var cC="testvalue";cy("test",cC,10000,null,cD);if(al("test")===cC){bu("test",null,cD);return true}return false}function an(){var cE=aX;aX=false;var cC=["id","ses","cvar","ref"];var cD,cF;for(cD=0;cD<cC.length;cD++){cF=aA(cC[cD]);if(0!==al(cF)){bu(cF,a1,cl)}}aX=cE}function bz(cC){bC=cC;at()}function cB(cG){if(!cG||!O(cG)){return}var cF=[];var cE;for(cE in cG){if(Object.prototype.hasOwnProperty.call(cG,cE)){cF.push(cE)}}var cH={};cF.sort();var cC=cF.length;var cD;for(cD=0;cD<cC;cD++){cH[cF[cD]]=cG[cF[cD]]}return cH}function bJ(){cy(aA("ses"),"*",bU,a1,cl)}function bX(cE,cZ,c0,cF){var cY,cD=new Date(),cM=Math.round(cD.getTime()/1000),cJ,cX,cG=1024,c5,cN,cV=ax,cH=aA("ses"),cT=aA("ref"),cQ=aA("cvar"),cR=al(cH),cW=bj(),c2=aK||bk,cK,cC;if(aX){an()}if(cf){return""}var cS=aE();if(!B(cF)){cF=""}var cP=y.characterSet||y.charset;if(!cP||cP.toLowerCase()==="utf-8"){cP=null}cK=cW[0];cC=cW[1];cJ=cW[2];cX=cW[3];if(!cR){var c1=bU/1000;if(!cS.lastVisitTs||(cM-cS.lastVisitTs)>c1){cS.visitCount++;
+cS.lastVisitTs=cS.currentVisitTs}if(!a5||!cK.length){for(cY in bW){if(Object.prototype.hasOwnProperty.call(bW,cY)){cK=N(c2,bW[cY]);if(cK.length){break}}}for(cY in be){if(Object.prototype.hasOwnProperty.call(be,cY)){cC=N(c2,be[cY]);if(cC.length){break}}}}c5=c(aZ);cN=cX.length?c(cX):"";if(c5.length&&!aC(c5)&&(!a5||!cN.length||aC(cN))){cX=aZ}if(cX.length||cK.length){cJ=cM;cW=[cK,cC,cJ,by(cX.slice(0,cG))];cy(cT,JSON2.stringify(cW),cr,a1,cl)}}cE+="&idsite="+bC+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+cD.getHours()+"&m="+cD.getMinutes()+"&s="+cD.getSeconds()+"&url="+n(by(c2))+(aZ.length?"&urlref="+n(by(aZ)):"")+((a8&&a8.length)?"&uid="+n(a8):"")+"&_id="+cS.uuid+"&_idts="+cS.createTs+"&_idvc="+cS.visitCount+"&_idn="+cS.newVisitor+(cK.length?"&_rcn="+n(cK):"")+(cC.length?"&_rck="+n(cC):"")+"&_refts="+cJ+"&_viewts="+cS.lastVisitTs+(String(cS.lastEcommerceOrderTs).length?"&_ects="+cS.lastEcommerceOrderTs:"")+(String(cX).length?"&_ref="+n(by(cX.slice(0,cG))):"")+(cP?"&cs="+n(cP):"")+"&send_image=0";
+for(cY in ct){if(Object.prototype.hasOwnProperty.call(ct,cY)){cE+="&"+cY+"="+ct[cY]}}var c4=[];if(cZ){for(cY in cZ){if(Object.prototype.hasOwnProperty.call(cZ,cY)&&/^dimension\d+$/.test(cY)){var cI=cY.replace("dimension","");c4.push(parseInt(cI,10));c4.push(String(cI));cE+="&"+cY+"="+cZ[cY];delete cZ[cY]}}}if(cZ&&u(cZ)){cZ=null}for(cY in aY){if(Object.prototype.hasOwnProperty.call(aY,cY)){var cO=(-1===E(c4,cY));if(cO){cE+="&dimension"+cY+"="+aY[cY]}}}if(cZ){cE+="&data="+n(JSON2.stringify(cZ))}else{if(ac){cE+="&data="+n(JSON2.stringify(ac))}}function cL(c6,c7){var c8=JSON2.stringify(c6);if(c8.length>2){return"&"+c7+"="+n(c8)}return""}var c3=cB(bs);var cU=cB(bR);cE+=cL(c3,"cvar");cE+=cL(cU,"e_cvar");if(ax){cE+=cL(ax,"_cvar");for(cY in cV){if(Object.prototype.hasOwnProperty.call(cV,cY)){if(ax[cY][0]===""||ax[cY][1]===""){delete ax[cY]}}}if(bn){cy(cQ,JSON2.stringify(ax),bU,a1,cl)}}if(aI){if(bS){cE+="&gt_ms="+bS}else{if(g&&g.timing&&g.timing.requestStart&&g.timing.responseEnd){cE+="&gt_ms="+(g.timing.responseEnd-g.timing.requestStart)
+}}}cS.lastEcommerceOrderTs=B(cF)&&String(cF).length?cF:cS.lastEcommerceOrderTs;at(cS);bJ();cE+=S(c0);if(cn.length){cE+="&"+cn}if(t(bH)){cE=bH(cE)}return cE}bo=function aM(){var cC=new Date();if(cm+aL<=cC.getTime()){var cD=bX("ping=1",null,"ping");bd(cD,bg);return true}return false};function a2(cF,cE,cK,cG,cC,cN){var cI="idgoal=0",cJ,cD=new Date(),cL=[],cM,cH=String(cF).length;if(cH){cI+="&ec_id="+n(cF);cJ=Math.round(cD.getTime()/1000)}cI+="&revenue="+cE;if(String(cK).length){cI+="&ec_st="+cK}if(String(cG).length){cI+="&ec_tx="+cG}if(String(cC).length){cI+="&ec_sh="+cC}if(String(cN).length){cI+="&ec_dt="+cN}if(co){for(cM in co){if(Object.prototype.hasOwnProperty.call(co,cM)){if(!B(co[cM][1])){co[cM][1]=""}if(!B(co[cM][2])){co[cM][2]=""}if(!B(co[cM][3])||String(co[cM][3]).length===0){co[cM][3]=0}if(!B(co[cM][4])||String(co[cM][4]).length===0){co[cM][4]=1}cL.push(co[cM])}}cI+="&ec_items="+n(JSON2.stringify(cL))}cI=bX(cI,ac,"ecommerce",cJ);bd(cI,bg);if(cH){co={}}}function bv(cC,cG,cF,cE,cD,cH){if(String(cC).length&&B(cG)){a2(cC,cG,cF,cE,cD,cH)
+}}function a3(cC){if(B(cC)){a2("",cC,"","","","")}}function bw(cD,cF,cE){var cC=bX("action_name="+n(ab(cD||aV)),cF,"log");bd(cC,bg,cE)}function aG(cE,cD){var cF,cC="(^| )(piwik[_-]"+cD;if(cE){for(cF=0;cF<cE.length;cF++){cC+="|"+cE[cF]}}cC+=")( |$)";return new RegExp(cC)}function aB(cC){return(am&&cC&&0===String(cC).indexOf(am))}function bY(cG,cC,cH,cD){if(aB(cC)){return 0}var cF=aG(bi,"download"),cE=aG(aN,"link"),cI=new RegExp("\\.("+cs.join("|")+")([?&#]|$)","i");if(cE.test(cG)){return"link"}if(cD||cF.test(cG)||cI.test(cC)){return"download"}if(cH){return 0}return"link"}function ag(cD){var cC;cC=cD.parentNode;while(cC!==null&&B(cC)){if(U.isLinkElement(cD)){break}cD=cC;cC=cD.parentNode}return cD}function cw(cH){cH=ag(cH);if(!U.hasNodeAttribute(cH,"href")){return}if(!B(cH.href)){return}var cG=U.getAttributeValueFromNode(cH,"href");if(aB(cG)){return}var cD=cH.pathname||bQ(cH.href);var cI=cH.hostname||c(cH.href);var cJ=cI.toLowerCase();var cE=cH.href.replace(cI,cJ);var cF=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");
+if(!cF.test(cE)){var cC=bY(cH.className,cE,af(cJ,cD),U.hasNodeAttribute(cH,"download"));if(cC){return{type:cC,href:cE}}}}function aw(cC,cD,cE,cF){var cG=p.buildInteractionRequestParams(cC,cD,cE,cF);if(!cG){return}return bX(cG,null,"contentInteraction")}function cc(cE,cF,cJ,cC,cD){if(!B(cE)){return}if(aB(cE)){return cE}var cH=p.toAbsoluteUrl(cE);var cG="redirecturl="+n(cH)+"&";cG+=aw(cF,cJ,cC,(cD||cE));var cI="&";if(am.indexOf("?")<0){cI="?"}return am+cI+cG}function aQ(cC,cD){if(!cC||!cD){return false}var cE=p.findTargetNode(cC);if(p.shouldIgnoreInteraction(cE)){return false}cE=p.findTargetNodeNoDefault(cC);if(cE&&!M(cE,cD)){return false}return true}function bZ(cE,cD,cG){if(!cE){return}var cC=p.findParentContentNode(cE);if(!cC){return}if(!aQ(cC,cE)){return}var cF=p.buildContentBlock(cC);if(!cF){return}if(!cF.target&&cG){cF.target=cG}return p.buildInteractionRequestParams(cD,cF.name,cF.piece,cF.target)}function aD(cD){if(!bG||!bG.length){return false}var cC,cE;for(cC=0;cC<bG.length;cC++){cE=bG[cC];
+if(cE&&cE.name===cD.name&&cE.piece===cD.piece&&cE.target===cD.target){return true}}return false}function bc(cF){if(!cF){return false}var cI=p.findTargetNode(cF);if(!cI||p.shouldIgnoreInteraction(cI)){return false}var cJ=cw(cI);if(cu&&cJ&&cJ.type){return false}if(U.isLinkElement(cI)&&U.hasNodeAttributeWithValue(cI,"href")){var cC=String(U.getAttributeValueFromNode(cI,"href"));if(0===cC.indexOf("#")){return false}if(aB(cC)){return true}if(!p.isUrlToCurrentDomain(cC)){return false}var cG=p.buildContentBlock(cF);if(!cG){return}var cE=cG.name;var cK=cG.piece;var cH=cG.target;if(!U.hasNodeAttributeWithValue(cI,p.CONTENT_TARGET_ATTR)||cI.wasContentTargetAttrReplaced){cI.wasContentTargetAttrReplaced=true;cH=p.toAbsoluteUrl(cC);U.setAnyAttribute(cI,p.CONTENT_TARGET_ATTR,cH)}var cD=cc(cC,"click",cE,cK,cH);p.setHrefAttribute(cI,cD);return true}return false}function au(cD){if(!cD||!cD.length){return}var cC;for(cC=0;cC<cD.length;cC++){bc(cD[cC])}}function aF(cC){return function(cD){if(!cC){return}var cG=p.findParentContentNode(cC);
+var cH;if(cD){cH=cD.target||cD.srcElement}if(!cH){cH=cC}if(!aQ(cG,cH)){return}bM(bg);if(U.isLinkElement(cC)&&U.hasNodeAttributeWithValue(cC,"href")&&U.hasNodeAttributeWithValue(cC,p.CONTENT_TARGET_ATTR)){var cE=U.getAttributeValueFromNode(cC,"href");if(!aB(cE)&&cC.wasContentTargetAttrReplaced){U.setAnyAttribute(cC,p.CONTENT_TARGET_ATTR,"")}}var cL=cw(cC);if(ad&&cL&&cL.type){return cL.type}if(bc(cG)){return"href"}var cI=p.buildContentBlock(cG);if(!cI){return}var cF=cI.name;var cM=cI.piece;var cK=cI.target;var cJ=aw("click",cF,cM,cK);bd(cJ,bg);return cJ}}function bx(cE){if(!cE||!cE.length){return}var cC,cD;for(cC=0;cC<cE.length;cC++){cD=p.findTargetNode(cE[cC]);if(cD&&!cD.contentInteractionTrackingSetupDone){cD.contentInteractionTrackingSetupDone=true;aa(cD,"click",aF(cD))}}}function a7(cE,cF){if(!cE||!cE.length){return[]}var cC,cD;for(cC=0;cC<cE.length;cC++){if(aD(cE[cC])){cE.splice(cC,1);cC--}else{bG.push(cE[cC])}}if(!cE||!cE.length){return[]}au(cF);bx(cF);var cG=[];for(cC=0;cC<cE.length;
+cC++){cD=bX(p.buildImpressionRequestParams(cE[cC].name,cE[cC].piece,cE[cC].target),undefined,"contentImpressions");if(cD){cG.push(cD)}}return cG}function b3(cD){var cC=p.collectContent(cD);return a7(cC,cD)}function aO(cD){if(!cD||!cD.length){return[]}var cC;for(cC=0;cC<cD.length;cC++){if(!p.isNodeVisible(cD[cC])){cD.splice(cC,1);cC--}}if(!cD||!cD.length){return[]}return b3(cD)}function ao(cE,cC,cD){var cF=p.buildImpressionRequestParams(cE,cC,cD);return bX(cF,null,"contentImpression")}function cx(cF,cD){if(!cF){return}var cC=p.findParentContentNode(cF);var cE=p.buildContentBlock(cC);if(!cE){return}if(!cD){cD="Unknown"}return aw(cD,cE.name,cE.piece,cE.target)}function ce(cD,cF,cC,cE){return"e_c="+n(cD)+"&e_a="+n(cF)+(B(cC)?"&e_n="+n(cC):"")+(B(cE)?"&e_v="+n(cE):"")}function ah(cE,cG,cC,cF,cH){if(String(cE).length===0||String(cG).length===0){return false}var cD=bX(ce(cE,cG,cC,cF),cH,"event");bd(cD,bg)}function bF(cC,cF,cD,cG){var cE=bX("search="+n(cC)+(cF?"&search_cat="+n(cF):"")+(B(cD)?"&search_count="+cD:""),cG,"sitesearch");
+bd(cE,bg)}function ci(cC,cF,cE){var cD=bX("idgoal="+cC+(cF?"&revenue="+cF:""),cE,"goal");bd(cD,bg)}function cp(cF,cC,cJ,cI,cE){var cH=cC+"="+n(by(cF));var cD=bZ(cE,"click",cF);if(cD){cH+="&"+cD}var cG=bX(cH,cJ,"link");bd(cG,(cI?0:bg),cI)}function bp(cD,cC){if(cD!==""){return cD+cC.charAt(0).toUpperCase()+cC.slice(1)}return cC}function bN(cH){var cG,cC,cF=["","webkit","ms","moz"],cE;if(!aT){for(cC=0;cC<cF.length;cC++){cE=cF[cC];if(Object.prototype.hasOwnProperty.call(y,bp(cE,"hidden"))){if(y[bp(cE,"visibilityState")]==="prerender"){cG=true}break}}}if(cG){aa(y,cE+"visibilitychange",function cD(){y.removeEventListener(cE+"visibilitychange",cD,false);cH()});return}cH()}function ar(cC){if(y.readyState==="complete"){cC()}else{if(L.addEventListener){L.addEventListener("load",cC)}else{if(L.attachEvent){L.attachEvent("onload",cC)}}}}function aR(cF){var cC=false;if(y.attachEvent){cC=y.readyState==="complete"}else{cC=y.readyState!=="loading"}if(cC){cF();return}var cE;if(y.addEventListener){aa(y,"DOMContentLoaded",function cD(){y.removeEventListener("DOMContentLoaded",cD,false);
+if(!cC){cC=true;cF()}})}else{if(y.attachEvent){y.attachEvent("onreadystatechange",function cD(){if(y.readyState==="complete"){y.detachEvent("onreadystatechange",cD);if(!cC){cC=true;cF()}}});if(y.documentElement.doScroll&&L===L.top){(function cD(){if(!cC){try{y.documentElement.doScroll("left")}catch(cG){setTimeout(cD,0);return}cC=true;cF()}}())}}}aa(L,"load",function(){if(!cC){cC=true;cF()}},false)}function b9(cC){var cD=cw(cC);if(cD&&cD.type){cD.href=k(cD.href);cp(cD.href,cD.type,undefined,null,cC)}}function b1(){return y.all&&!y.addEventListener}function ck(cC){var cE=cC.which;var cD=(typeof cC.button);if(!cE&&cD!=="undefined"){if(b1()){if(cC.button&1){cE=1}else{if(cC.button&2){cE=3}else{if(cC.button&4){cE=2}}}}else{if(cC.button===0||cC.button==="0"){cE=1}else{if(cC.button&1){cE=2}else{if(cC.button&2){cE=3}}}}}return cE}function bq(cC){switch(ck(cC)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function aH(cC){return cC.target||cC.srcElement}function ak(cC){return function(cF){cF=cF||L.event;
+var cE=bq(cF);var cG=aH(cF);if(cF.type==="click"){var cD=false;if(cC&&cE==="middle"){cD=true}if(cG&&!cD){b9(cG)}}else{if(cF.type==="mousedown"){if(cE==="middle"&&cG){ay=cE;ba=cG}else{ay=ba=null}}else{if(cF.type==="mouseup"){if(cE===ay&&cG===ba){b9(cG)}ay=ba=null}else{if(cF.type==="contextmenu"){b9(cG)}}}}}}function ae(cD,cC){aa(cD,"click",ak(cC),false);if(cC){aa(cD,"mouseup",ak(cC),false);aa(cD,"mousedown",ak(cC),false);aa(cD,"contextmenu",ak(cC),false)}}function bb(cD){if(!ad){ad=true;var cE,cC=aG(a9,"ignore"),cF=y.links;if(cF){for(cE=0;cE<cF.length;cE++){if(!cC.test(cF[cE].className)){ae(cF[cE],cD)}}}}}function az(cE,cG,cH){if(bL){return true}bL=true;var cI=false;var cF,cD;function cC(){cI=true}ar(function(){function cJ(cL){setTimeout(function(){if(!bL){return}cI=false;cH.trackVisibleContentImpressions();cJ(cL)},cL)}function cK(cL){setTimeout(function(){if(!bL){return}if(cI){cI=false;cH.trackVisibleContentImpressions()}cK(cL)},cL)}if(cE){cF=["scroll","resize"];for(cD=0;cD<cF.length;cD++){if(y.addEventListener){y.addEventListener(cF[cD],cC)
+}else{L.attachEvent("on"+cF[cD],cC)}}cK(100)}if(cG&&cG>0){cG=parseInt(cG,10);cJ(cG)}})}function b7(){var cD,cF,cG={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(f.userAgent))){if(f.mimeTypes&&f.mimeTypes.length){for(cD in cG){if(Object.prototype.hasOwnProperty.call(cG,cD)){cF=f.mimeTypes[cG[cD]];ct[cD]=(cF&&cF.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unknown"&&B(f.javaEnabled)&&f.javaEnabled()){ct.java="1"}if(t(L.GearsFactory)){ct.gears="1"}ct.cookie=bB()}var cE=parseInt(P.width,10);var cC=parseInt(P.height,10);ct.res=parseInt(cE,10)+"x"+parseInt(cC,10)}b7();aU();at();this.getVisitorId=function(){return aE().uuid};this.getVisitorInfo=function(){return cd()};this.getAttributionInfo=function(){return bj()};this.getAttributionCampaignName=function(){return bj()[0]
+};this.getAttributionCampaignKeyword=function(){return bj()[1]};this.getAttributionReferrerTimestamp=function(){return bj()[2]};this.getAttributionReferrerUrl=function(){return bj()[3]};this.setTrackerUrl=function(cC){am=cC};this.getTrackerUrl=function(){return am};this.addTracker=function(cC,cE){if(!cE){throw new Error("A siteId must be given to add a new tracker")}if(!B(cC)||null===cC){cC=this.getTrackerUrl()}var cD=new I(cC,cE);A.push(cD);return cD};this.getSiteId=function(){return bC};this.setSiteId=function(cC){bz(cC)};this.setUserId=function(cC){if(!B(cC)||!cC.length){return}a8=cC;bl=bD(a8).substr(0,16)};this.getUserId=function(){return a8};this.setCustomData=function(cC,cD){if(O(cC)){ac=cC}else{if(!ac){ac={}}ac[cC]=cD}};this.getCustomData=function(){return ac};this.setCustomRequestProcessing=function(cC){bH=cC};this.appendToTrackingUrl=function(cC){cn=cC};this.getRequest=function(cC){return bX(cC)};this.addPlugin=function(cC,cD){a[cC]=cD};this.setCustomDimension=function(cC,cD){cC=parseInt(cC,10);
+if(cC>0){if(!B(cD)){cD=""}if(!q(cD)){cD=String(cD)}aY[cC]=cD}};this.getCustomDimension=function(cC){cC=parseInt(cC,10);if(cC>0&&Object.prototype.hasOwnProperty.call(aY,cC)){return aY[cC]}};this.deleteCustomDimension=function(cC){cC=parseInt(cC,10);if(cC>0){delete aY[cC]}};this.setCustomVariable=function(cD,cC,cG,cE){var cF;if(!B(cE)){cE="visit"}if(!B(cC)){return}if(!B(cG)){cG=""}if(cD>0){cC=!q(cC)?String(cC):cC;cG=!q(cG)?String(cG):cG;cF=[cC.slice(0,a4),cG.slice(0,a4)];if(cE==="visit"||cE===2){b6();ax[cD]=cF}else{if(cE==="page"||cE===3){bs[cD]=cF}else{if(cE==="event"){bR[cD]=cF}}}}};this.getCustomVariable=function(cD,cE){var cC;if(!B(cE)){cE="visit"}if(cE==="page"||cE===3){cC=bs[cD]}else{if(cE==="event"){cC=bR[cD]}else{if(cE==="visit"||cE===2){b6();cC=ax[cD]}}}if(!B(cC)||(cC&&cC[0]==="")){return false}return cC};this.deleteCustomVariable=function(cC,cD){if(this.getCustomVariable(cC,cD)){this.setCustomVariable(cC,"","",cD)}};this.storeCustomVariablesInCookie=function(){bn=true};this.setLinkTrackingTimer=function(cC){bg=cC
+};this.setDownloadExtensions=function(cC){if(q(cC)){cC=cC.split("|")}cs=cC};this.addDownloadExtensions=function(cD){var cC;if(q(cD)){cD=cD.split("|")}for(cC=0;cC<cD.length;cC++){cs.push(cD[cC])}};this.removeDownloadExtensions=function(cE){var cD,cC=[];if(q(cE)){cE=cE.split("|")}for(cD=0;cD<cs.length;cD++){if(E(cE,cs[cD])===-1){cC.push(cs[cD])}}cs=cC};this.setDomains=function(cC){ai=q(cC)?[cC]:cC;var cG=false,cE=0,cD;for(cE;cE<ai.length;cE++){cD=String(ai[cE]);if(b8(cj,D(cD))){cG=true;break}var cF=bQ(cD);if(cF&&cF!=="/"&&cF!=="/*"){cG=true;break}}if(!cG){ai.push(cj)}};this.setIgnoreClasses=function(cC){a9=q(cC)?[cC]:cC};this.setRequestMethod=function(cC){cv=cC||bO};this.setRequestContentType=function(cC){b0=cC||aq};this.setReferrerUrl=function(cC){aZ=cC};this.setCustomUrl=function(cC){aK=br(bk,cC)};this.setDocumentTitle=function(cC){aV=cC};this.setAPIUrl=function(cC){bf=cC};this.setDownloadClasses=function(cC){bi=q(cC)?[cC]:cC};this.setLinkClasses=function(cC){aN=q(cC)?[cC]:cC};this.setCampaignNameKey=function(cC){bW=q(cC)?[cC]:cC
+};this.setCampaignKeywordKey=function(cC){be=q(cC)?[cC]:cC};this.discardHashTag=function(cC){bm=cC};this.setCookieNamePrefix=function(cC){aW=cC;ax=bt()};this.setCookieDomain=function(cC){var cD=D(cC);if(a6(cD)){cl=cD;aU()}};this.setCookiePath=function(cC){a1=cC;aU()};this.setVisitorCookieTimeout=function(cC){cb=cC*1000};this.setSessionCookieTimeout=function(cC){bU=cC*1000};this.setReferralCookieTimeout=function(cC){cr=cC*1000};this.setConversionAttributionFirstReferrer=function(cC){a5=cC};this.disableCookies=function(){aX=true;ct.cookie="0";if(bC){an()}};this.deleteCookies=function(){an()};this.setDoNotTrack=function(cD){var cC=f.doNotTrack||f.msDoNotTrack;cf=cD&&(cC==="yes"||cC==="1");if(cf){this.disableCookies()}};this.addListener=function(cD,cC){ae(cD,cC)};this.enableLinkTracking=function(cC){cu=true;bN(function(){aR(function(){bb(cC)})})};this.enableJSErrorTracking=function(){if(ch){return}ch=true;var cC=L.onerror;L.onerror=function(cH,cF,cE,cG,cD){bN(function(){var cI="JavaScript Errors";
+var cJ=cF+":"+cE;if(cG){cJ+=":"+cG}ah(cI,cJ,cH)});if(cC){return cC(cH,cF,cE,cG,cD)}return false}};this.disablePerformanceTracking=function(){aI=false};this.setGenerationTimeMs=function(cC){bS=parseInt(cC,10)};this.enableHeartBeatTimer=function(cC){cC=Math.max(cC,1);aL=(cC||15)*1000;if(cm!==null){cA()}};this.killFrame=function(){if(L.location!==L.top.location){L.top.location=L.location}};this.redirectFile=function(cC){if(L.location.protocol==="file:"){L.location=cC}};this.setCountPreRendered=function(cC){aT=cC};this.trackGoal=function(cC,cE,cD){bN(function(){ci(cC,cE,cD)})};this.trackLink=function(cD,cC,cF,cE){bN(function(){cp(cD,cC,cF,cE)})};this.trackPageView=function(cC,cE,cD){bG=[];if(F(bC)){bN(function(){Q(am,bf,bC)})}else{bN(function(){bw(cC,cE,cD)})}};this.trackAllContentImpressions=function(){if(F(bC)){return}bN(function(){aR(function(){var cC=p.findContentNodes();var cD=b3(cC);cz(cD,bg)})})};this.trackVisibleContentImpressions=function(cC,cD){if(F(bC)){return}if(!B(cC)){cC=true}if(!B(cD)){cD=750
+}az(cC,cD,this);bN(function(){ar(function(){var cE=p.findContentNodes();var cF=aO(cE);cz(cF,bg)})})};this.trackContentImpression=function(cE,cC,cD){if(F(bC)){return}if(!cE){return}cC=cC||"Unknown";bN(function(){var cF=ao(cE,cC,cD);bd(cF,bg)})};this.trackContentImpressionsWithinNode=function(cC){if(F(bC)||!cC){return}bN(function(){if(bL){ar(function(){var cD=p.findContentNodesWithinNode(cC);var cE=aO(cD);cz(cE,bg)})}else{aR(function(){var cD=p.findContentNodesWithinNode(cC);var cE=b3(cD);cz(cE,bg)})}})};this.trackContentInteraction=function(cE,cF,cC,cD){if(F(bC)){return}if(!cE||!cF){return}cC=cC||"Unknown";bN(function(){var cG=aw(cE,cF,cC,cD);bd(cG,bg)})};this.trackContentInteractionNode=function(cD,cC){if(F(bC)||!cD){return}bN(function(){var cE=cx(cD,cC);bd(cE,bg)})};this.logAllContentBlocksOnPage=function(){var cD=p.findContentNodes();var cC=p.collectContent(cD);if(console!==undefined&&console&&console.log){console.log(cC)}};this.trackEvent=function(cD,cF,cC,cE,cG){bN(function(){ah(cD,cF,cC,cE,cG)
+})};this.trackSiteSearch=function(cC,cE,cD,cF){bN(function(){bF(cC,cE,cD,cF)})};this.setEcommerceView=function(cF,cC,cE,cD){if(!B(cE)||!cE.length){cE=""}else{if(cE instanceof Array){cE=JSON2.stringify(cE)}}bs[5]=["_pkc",cE];if(B(cD)&&String(cD).length){bs[2]=["_pkp",cD]}if((!B(cF)||!cF.length)&&(!B(cC)||!cC.length)){return}if(B(cF)&&cF.length){bs[3]=["_pks",cF]}if(!B(cC)||!cC.length){cC=""}bs[4]=["_pkn",cC]};this.addEcommerceItem=function(cG,cC,cE,cD,cF){if(cG.length){co[cG]=[cG,cC,cE,cD,cF]}};this.trackEcommerceOrder=function(cC,cG,cF,cE,cD,cH){bv(cC,cG,cF,cE,cD,cH)};this.trackEcommerceCartUpdate=function(cC){a3(cC)};this.trackRequest=function(cC,cE,cD){bN(function(){var cF=bX(cC,cE);bd(cF,bg,cD)})};d.trigger("TrackerSetup",[this])}function z(){return{push:V}}function b(ah,ag){var ai={};var ae,af;for(ae=0;ae<ag.length;ae++){var ac=ag[ae];ai[ac]=1;for(af=0;af<ah.length;af++){if(ah[af]&&ah[af][0]){var ad=ah[af][0];if(ac===ad){V(ah[af]);delete ah[af];if(ai[ad]>1){Y("The method "+ad+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')
+}ai[ad]++}}}}return ah}var v=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","enableLinkTracking"];function T(ac,ae){var ad=new I(ac,ae);A.push(ad);_paq=b(_paq,v);for(x=0;x<_paq.length;x++){if(_paq[x]){V(_paq[x])}}_paq=new z();return ad}aa(L,"beforeunload",W,false);Date.prototype.getTimeAlias=Date.prototype.getTime;d={initialized:false,on:function(ad,ac){if(!r[ad]){r[ad]=[]}r[ad].push(ac)},off:function(ae,ad){if(!r[ae]){return}var ac=0;for(ac;ac<r[ae].length;ac++){if(r[ae][ac]===ad){delete r[ae][ac]}}},trigger:function(ae,af,ad){if(!r[ae]){return}var ac=0;for(ac;ac<r[ae].length;ac++){r[ae][ac].apply(ad||L,af)}},addPlugin:function(ac,ad){a[ac]=ad},getTracker:function(ac,ad){if(!B(ad)){ad=this.getAsyncTracker().getSiteId()}if(!B(ac)){ac=this.getAsyncTracker().getTrackerUrl()}return new I(ac,ad)},getAsyncTrackers:function(){return A},addTracker:function(ac,ad){if(!A.length){T(ac,ad)}else{A[0].addTracker(ac,ad)
+}},getAsyncTracker:function(ad,ag){var af;if(A&&A[0]){af=A[0]}if(!ag&&!ad){return af}if((!B(ag)||null===ag)&&af){ag=af.getSiteId()}if((!B(ad)||null===ad)&&af){ad=af.getTrackerUrl()}var ae,ac=0;for(ac;ac<A.length;ac++){ae=A[ac];if(ae&&String(ae.getSiteId())===String(ag)&&ae.getTrackerUrl()===ad){return ae}}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return d})}return d}());
+/*!!! pluginTrackerHook */
+}(function(){if(window&&"object"===typeof window.piwikPluginAsyncInit&&window.piwikPluginAsyncInit.length){var a=0;for(a;a<window.piwikPluginAsyncInit.length;a++){if(typeof window.piwikPluginAsyncInit[a]==="function"){window.piwikPluginAsyncInit[a]()}}}window.Piwik.addTracker();window.Piwik.trigger("PiwikInitialized",[]);window.Piwik.initialized=true}());if(window&&window.piwikAsyncInit){window.piwikAsyncInit()}(function(){var a=(typeof AnalyticsTracker);if(a==="undefined"){AnalyticsTracker=window.Piwik}}());if(typeof piwik_log!=="function"){piwik_log=function(b,f,d,g){function a(h){try{if(window["piwik_"+h]){return window["piwik_"+h]
+}}catch(i){}return}var c,e=window.Piwik.getTracker(d,f);e.setDocumentTitle(b);e.setCustomData(g);c=a("tracker_pause");if(c){e.setLinkTrackingTimer(c)}c=a("download_extensions");if(c){e.setDownloadExtensions(c)}c=a("hosts_alias");if(c){e.setDomains(c)}c=a("ignore_classes");if(c){e.setIgnoreClasses(c)}e.trackPageView();if(a("install_tracker")){piwik_track=function(i,k,j,h){e.setSiteId(k);e.setTrackerUrl(j);e.trackLink(i,h)};e.enableLinkTracking()}};
+/*!! @license-end */
+}; \ No newline at end of file
diff --git a/lang/README.md b/lang/README.md
index 5683ccccda..7e66de76eb 100644
--- a/lang/README.md
+++ b/lang/README.md
@@ -2,6 +2,6 @@
If you want to improve an existing Piwik translation or contribute a new translation, please have a look at our [Transifex project](http://translations.piwik.org).
-We cannot accept pull requests for translations on Github since we manage all translations in this separate system. Translations will automatically be transfered to GitHub from time to time!
+We cannot accept pull requests for translations on GitHub since we manage all translations in this separate system. Translations will automatically be transferred to GitHub from time to time!
If you have any questions feel free to contact the team at translations@piwik.org.
diff --git a/lang/ar.json b/lang/ar.json
index 0ba900d175..3cf538d2f8 100644
--- a/lang/ar.json
+++ b/lang/ar.json
@@ -1,5 +1,7 @@
{
"General": {
+ "12HourClock": "نظام ١٢ ساعة",
+ "24HourClock": "نظام ٢٤ ساعة",
"AbandonedCarts": "عربات متروكة",
"AboutPiwikX": "حول Piwik %s",
"Action": "أمر",
@@ -10,6 +12,7 @@
"AllWebsitesDashboard": "لوحة التحكم لكافة المواقع",
"And": "و",
"API": "واجهة تحكم التطبيقات",
+ "Apply": "تطبيق",
"ArchivingInlineHelp": "للمواقع المتوسطة وعالية الزيارات، من المفضل تعطيل إطلاق الأرشفة من المتصفح. بدلاً من ذلك، فنحن نفضل ضبط Cron job لمعالجة Piwik كل ساعة.",
"ArchivingTriggerDescription": "مفضل في حالة مواقع Piwik الكبيرة أن تقوم %1$sبضبط وظيفة %2$s لمعالجة التقارير آلياً.",
"AuthenticationMethodSmtp": "أسلوب المصادقة لمزود SMTP",
@@ -21,19 +24,31 @@
"Cancel": "إلغاء",
"CannotUnzipFile": "لايمكن فك ضغط الملف %1$s: %2$s",
"ChangePassword": "تغيير كلمة المرور",
+ "ChooseDate": "إختر التاريخ ، التاريخ المحدد حالياً هو: %s",
"ChooseLanguage": "اختر اللغة",
"ChoosePeriod": "اختر المدة",
"ClickHere": "إضغط هنا لمزيد من المعلومات.",
+ "ClickToChangePeriod": "إضغط ثانيةً لتغيّر المدة.",
"Close": "إغلاق",
+ "ClickToSearch": "إضغط للبحث",
"ColumnActionsPerVisit": "السلوكيات لكل زيارة",
+ "ColumnActionsPerVisitDocumentation": "عدد متوسط للإجراءات (عرض الصفحات،عمليات بحث في الموقع،تنزيلات من الموقع أو روابط خارجية) التي أُنجِزت أثناء الزيارات.",
+ "ColumnAverageGenerationTime": "متوسط مدة الإنشاء",
+ "ColumnAverageGenerationTimeDocumentation": "متوسط الوقت المستغرق لإنشاء الصفحة. يشمل هذا المقياس الوقت الذي أخذه الخادم لإنشاط صفحة الوب ، مضافاً إليه الوقت الذي استغرق عند الزائر في تنزيل استجابة الخادم. 'متوسط وقت إنشاء' قليل يعني موقعاً أسرع لزوارك!",
"ColumnAverageTimeOnPage": "متوسط الزمن على الصفحة",
"ColumnAvgTimeOnSite": "متوسط الزمن على الموقع",
+ "ColumnAvgTimeOnSiteDocumentation": "متوسط مدة زيارة.",
"ColumnBounceRate": "معدل الارتداد",
"ColumnBounces": "الارتدادات",
"ColumnConversionRate": "معدل الفاعلية",
+ "ColumnDestinationPage": "الصفحة الوِجهَة",
"ColumnEntrances": "الدخول",
+ "ColumnEntrancesDocumentation": "عدد الزيارات التي بدأت من هذه الصفحة.",
"ColumnExitRate": "معدل الخروج",
+ "ColumnExitRateDocumentation": "نسبة الزيارات التي تركت الموقع بعد عرض هذه الصفحة.",
"ColumnExits": "الخروج",
+ "ColumnExitsDocumentation": "عدد الزيارات التي انتهت بعرض هذه الصفحة.",
+ "ColumnGenerationTime": "وقت الإنشاء",
"ColumnKeyword": "كلمة دلالية",
"ColumnLabel": "عنوان",
"ColumnMaxActions": "أقصى عدد من السلوكيات في زيارة واحدة",
@@ -42,19 +57,24 @@
"ColumnNbUsers": "المستخدمون",
"ColumnNbVisits": "الزيارات",
"ColumnPageviews": "المشاهدات",
+ "ColumnPageviewsDocumentation": "عدد مرات زيارة هذه الصفحة.",
"ColumnPercentageVisits": "% زيارة",
"ColumnRevenue": "الأرباح",
"ColumnSumVisitLength": "إجمالي الوقت الذي استغرقه الزائر (بالثواني)",
+ "ColumnTotalPageviews": "إجمالي عدد المشاهدات",
"ColumnUniquePageviews": "المشاهدات الفريدة",
"ColumnValuePerVisit": "القيمة لكل زيارة",
"ColumnVisitDuration": "مدة الزيارة (بالثواني)",
"ColumnVisitsWithConversions": "زيارات بفائدة",
"ConfigFileIsNotWritable": "ملف إعدادات Piwik %1$s غير قابل للكتابة، بعض التغييرات التي قمت بها قد لا تكون محفوظة. %2$s الرجاء تغيير صلاحيات ملف الإعدادات بحيث تكون قابلة للكتابة.",
+ "Continue": "تابع",
"ContinueToPiwik": "المتابعة إلى Piwik",
"CurrentMonth": "الشهر الحالي",
"CurrentWeek": "الأسبوع الحالي",
"CurrentYear": "السنة الحالية",
"Daily": "يومي",
+ "DailyReport": "يومي",
+ "DailyReports": "التقارير اليومية",
"DashboardForASpecificWebsite": "اللوحة الرئيسية لموقع محدد",
"Date": "التاريخ",
"DateRange": "فترة معينة:",
@@ -65,21 +85,30 @@
"DaysSinceLastEcommerceOrder": "منذ أيام النظام التجارة الإلكترونية مشاركة",
"DaysSinceLastVisit": "أيام منذ آخر زيارة",
"Default": "الافتراضي",
+ "DefaultAppended": "(الافتراضي)",
"Delete": "حذف",
"Description": "الوصف",
+ "Desktop": "المكتب",
"Details": "التفاصيل",
+ "Discount": "خصم",
"DisplaySimpleTable": "عرض جدول مبسط",
"DisplayTableWithGoalMetrics": "عرض الجدول مع متغيرات الأهداف",
"DisplayTableWithMoreMetrics": "عرض جدول مع المزيد من المتغيرات",
+ "Documentation": "مستندات الدعم",
"Donate": "تبرع",
"Done": "تم",
"Download": "تنزيل",
+ "DownloadFail_FileExists": "الملف %s موجود مسبقاً !",
+ "DownloadFail_FileExistsContinue": "محاولة متابعة تنزيل %s، لكن الملف قد تم تنزيله بالكامل مسبقاً !",
+ "DownloadFail_HttpRequestFail": "لا يمكن تحميل الملف ! قد يكون هناك مشكل مع موقع الوب الذي تحاول التنزيل منه. يمكن المحاولة مرة أخرى لاحقا أو الحصول على الملف بنفسك.",
"DownloadFullVersion": "%1$s قم بتحميل %2$s الإصدار الكامل! انظر %3$s",
+ "DownloadPleaseRemoveExisting": "إذا كنت تريد استبداله، الرجاء القيام بحذف الملف الموجود.",
"Downloads": "التحميلات",
"EcommerceOrders": "طلبات التجارة الإلكترونية",
"Edit": "تحرير",
"EncryptedSmtpTransport": "أدخل نوع التشفير المطلوب بواسطة خادم SMTP",
"Error": "خطأ",
+ "ErrorRequest": "عفوا ... كان هناك مشكلة أثناء الطلب. ربما يواجه الخادم مشكلة مؤقتة، أو ربما طلبت تقريرا يحوي عدد كبير من البيانات. حاول مرة اخرى. في حالة حدوث هذا الخطأ بشكل متكرر يرجى %1$s الاتصال بالمشرف ب Piwik %2$s للحصول على المساعدة.",
"EvolutionOverPeriod": "النمو خلال فترة معينة",
"ExceptionConfigurationFileNotFound": "لم يمكن العثور على ملف الإعدادات (%s).",
"ExceptionDatabaseVersion": "%1$s إصدارك %2$s ولكن Piwik يتطلب على الأقل %3$s.",
@@ -105,49 +134,84 @@
"Export": "تصدير",
"ExportAsImage": "تصدير كصورة",
"ExportThisReport": "تصدير البيانات في هيئة ملفات أخرى",
+ "Faq": "الأسئلة الشائعة",
"FileIntegrityWarningExplanation": "فشل فحص سلامة الملفات وتم تسجيل بعض الأخطاء. يحدث هذا غالباً نتيجة الرفع الناقص أو الخاطئ لبعض ملفات Piwik. يتوجب عليك إعادة رفع ملفات Piwik في وضع BINARY ثم إعادة تحديث هذه الصفحة حتى تنتهي هذه الأخطاء.",
+ "First": "أول",
+ "Flatten": "تسطيح",
"ForExampleShort": "مثال:",
+ "Forums": "المنتديات",
"FromReferrer": "من",
+ "GeneralInformation": "معلومات عامة",
+ "General": "عام",
+ "GetStarted": "الشروع",
"GiveUsYourFeedback": "أخبرنا عن رأيك!",
+ "Goal": "هدف",
"GoTo": "اذهب إلى %s",
"GraphHelp": "لمزيد من المعلومات حول عرض الرسومات البيانية في Piwik.",
"HelloUser": "مرحباً بك %s",
+ "Help": "مساعدة",
+ "HelpTranslatePiwik": "قد ترغب في %1$s مساعدتنا لتحسين ترجمة Piwik %2$s ؟",
+ "Hide": "إخفاء",
"HoursMinutes": "%1$s ساعة%2$s دقيقة",
"Id": "معرف",
"IfArchivingIsFastYouCanSetupCronRunMoreOften": "بفرض أن الأرشفة سريعة بالنسبة لإعداداتك، فيمكنك ضبط إعدادات Crontab ليتم تفعيلها بمعدل أكبر.",
+ "InfoFor": "معلومات عن %s",
"Installed": "مُثبت",
"InvalidDateRange": "مدى التاريخ غير صالح، حاول مرة أخرى",
"InvalidResponse": "البيانات المستقبلة غير صالحة.",
+ "IP": "بروتوكول الإنترنت",
"JsTrackingTag": "وسم التتبع بلغة جافا",
"Language": "اللغة",
"LastDays": "آخر %s أيام (تشمل اليوم)",
+ "LastDaysShort": "آخر %s يوما",
+ "LearnMore": "%1$s تعلم المزيد %2$s",
+ "Live": "مباشر",
"Loading": "جاري التحميل...",
"LoadingData": "جاري تحميل البيانات...",
+ "LoadingPopover": "%s جار التحميل ...",
+ "LoadingPopoverFor": "جار التحميل %s ل",
"Locale": "ar_EG.UTF-8",
"Logout": "تسحيل خروج",
"MainMetrics": "أهم مقاييس",
+ "Matches": "مطابقات",
"MediumToHighTrafficItIsRecommendedTo": "للمواقع متوسطة وعالية الزيارات، نفضل معالجة تقارير اليوم الحالي على الأكثر كل نصف ساعة (%1$s ثانية) أو كل ساعة (%2$s ثانية).",
"Metadata": "الفوقية",
+ "Metric": "القياس",
+ "Metrics": "القياسات",
"MetricsToPlot": "مقاييس لمؤامرة",
"MetricToPlot": "متري لرسم",
"MinutesSeconds": "%1$s دقيقة%2$s ثانية",
+ "Mobile": "هاتف محمول",
"Monthly": "شهري",
+ "MonthlyReport": "شهري",
+ "MonthlyReports": "تقارير شهرية",
+ "More": "أكثر",
+ "MoreDetails": "تفاصيل أكثر",
+ "MoreLowerCase": "أكثر",
"MultiSitesSummary": "كافة المواقع",
"Name": "الاسم",
"NbActions": "عدد السلوكيات",
+ "NbSearches": "عدد عمليات البحث الداخلية",
+ "NeedMoreHelp": "تحتاج المزيد من المساعدة ؟",
"Never": "أبداً",
"NewReportsWillBeProcessedByCron": "عندما لا تم إطلاق أرشفة Piwik من خلال المتصفح، يتم معالجة التقارير بواسطة Cronjob.",
"NewUpdatePiwikX": "تحديث جديد: Piwik %s",
"NewVisitor": "زائر جديد",
+ "NewVisits": "زيارات جديدة",
"Next": "التالي",
"No": "لا",
"NoDataForGraph": "لا توجد بيانات لهذا الرسم البياني.",
"NoDataForTagCloud": "لا توجد بيانات لسحابة الوسوم هذه.",
"NotDefined": "ليست محددة %s",
+ "Note": "ملاحظة",
+ "NotInstalled": "غير مثبت",
+ "NotRecommended": "غير موصى به",
"NotValid": "%s غير صالح",
"NumberOfVisits": "عدد الزيارات",
+ "NUsers": "%s المستخدمون",
"NVisits": "%s الزيارات",
"Ok": "موافق",
+ "OneAction": "إجراء 1",
"OneVisit": "1 زيارة",
"OnlyEnterIfRequired": "أدخل اسم مستخدم فقط في حالة ما إذا كان مزود SMTP يطلب ذلك.",
"OnlyEnterIfRequiredPassword": "أدخل كلمة مرور فقط في حالة ما إذا كان مزود SMTP يطلب ذلك.",
@@ -163,9 +227,14 @@
"OperationIsNot": "هو ليس",
"OperationLessThan": "أقل من",
"OperationNotEquals": "لا يساوي",
+ "OperationStartsWith": "يبدأ ب",
+ "OperationEndsWith": "ينتهي ب",
"OptionalSmtpPort": "اختياري. الافتراضي 25 لاتصالات TLS SMTP غير المشفرة، و465 لاتصالات SSL SMTP المشفرة.",
+ "Options": "اختيارات",
+ "Or": "أو",
"OrCancel": "أو %1$s إلغاء %2$s",
"Others": "أخرى",
+ "Outlink": "رابط صادر",
"Outlinks": "الروابط الصادرة",
"Overview": "نظرة عامة",
"Pages": "الصفحات",
@@ -246,25 +315,56 @@
"Account": "الحساب",
"Accounts": "الحسابات",
"AddAccount": "أضف حساب",
+ "AddPiwikDemo": "إضافة العرض التوضيحي ل Piwik",
"Advanced": "متقدم",
"AnonymousAccess": "وصول الزائر المجهول",
"AnonymousTracking": "تتبع وصول الزوار المجهولين",
+ "ChooseHttpTimeout": "إختر قيمة مهلة HTTP",
+ "ChooseMetric": "اختر المقياس",
"ChooseReport": "إختر التقرير",
"ChooseSegment": "إنتق قطاعاً",
"ConfirmRemoveAccount": "هل تريد حذف هذا الحساب؟",
+ "DefaultReportDate": "تاريخ التقرير",
"EmailUs": "أرسل لنا بريداً",
"EnableGraphsLabel": "إعرض الرسوم",
"EvolutionGraph": "رسم التاريخ",
+ "HelpUsToImprovePiwikMobile": "هل ترغب في تفعيل تتبع الاستخدام المجهول في Piwik Mobile ؟",
"HowtoDeleteAnAccount": "إضغط باستمرار لحذف حسابٍ ما",
"HowtoDeleteAnAccountOniOS": "مرّر من اليمين لليسار لتحذف حساباً",
"HowtoLoginAnonymous": "أترك اسم المسخدم وكلمة المرور فارغين للدخول المجهول",
"HttpTimeout": "مهلة HTTP",
"LastUpdated": "آخر تحديث: %s",
"LoadingReport": "تحميل %s",
+ "LoginUseHttps": "استخدم https",
+ "NavigationBack": "العودة",
+ "NetworkError": "خطأ شبكة",
+ "NetworkErrorWithStatusCodeShort": "خطأ شبكة %s",
+ "NetworkNotReachable": "لايمكن الوصول للشبكة",
+ "NoAccountIsSelected": "لا بد أن تختار حساباً. أضف حساباً جديداً إن كنت لم تُعِدّ واحداً حتى الآن.",
+ "NoDataShort": "لا توجد بيانات",
+ "NoPiwikAccount": "بدون حساب Piwik ؟",
+ "NoReportsShort": "لا تقارير",
+ "NoVisitorFound": "لا يوجد زائر",
"NoVisitorsShort": "لا زوار",
"NoWebsiteFound": "لم أجد موقع الوب",
"NoWebsitesShort": "لا مواقع وب",
- "PullDownToRefresh": "إسحب للأسفل للتحديث..."
+ "PullDownToRefresh": "إسحب للأسفل للتحديث...",
+ "PossibleSslError": "احتمال خطأ في شهادة SSL",
+ "IgnoreSslError": "تجاهل خطأ SSL",
+ "RatingDontRemindMe": "لا تُذكِّرني",
+ "RatingNotNow": "ليس الآن",
+ "RatingNow": "حسناً سأقيّمه الآن",
+ "Reloading": "إعادة تحميل...",
+ "RequestTimedOutShort": "خطأ مهلة الشبكة",
+ "SaveSuccessError": "رابط Piwik أو اسم المستخدم و كلمة السر غير صحيح.",
+ "SearchWebsite": "بحث مواقع الوب",
+ "ShowAll": "عرض الكل",
+ "ShowLess": "إعرض أقلّ",
+ "StaticGraph": "رسم النظرة العامّة",
+ "TopVisitedWebsites": "أكثر مواقع الويب تصفحاً",
+ "TryIt": "جربه !",
+ "VerifyLoginData": "تأكد من أن اسم المستخدم وكلمة المرور صحيحين.",
+ "YouAreOffline": "نعتذر، لست مشتركاً حالياً"
},
"RowEvolution": {
"AvailableMetrics": "المقاييس المتوفرة",
@@ -272,6 +372,10 @@
"ComparingRecords": "مقارنة %s صفوف",
"MetricBetweenText": "من %1$s إلى %2$s",
"MetricChangeText": "%s التغير خلال المدة",
+ "MetricMinMax": "%1$s تراوحت بين %2$s و %3$s ضمن المدة",
+ "MetricsFor": "قياسات لـ %s",
+ "MultiRowEvolutionTitle": "تطور صفوف متعددة",
+ "PickAnotherRow": "انتق صفاً آخر للمقارنة",
"PickARow": "إختر صفاً للمقارنة"
}
} \ No newline at end of file
diff --git a/lang/bg.json b/lang/bg.json
index 843f5ca515..93c642b01c 100644
--- a/lang/bg.json
+++ b/lang/bg.json
@@ -267,7 +267,6 @@
"Password": "Парола",
"Period": "Период",
"Piechart": "Диаграма",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s е съвместен проект достъпен за вас благодарение на %7$sPiwik екипа%8$s, както много други доброволци. Ако харесвате Piwik, може да помогнете: вижте как %3$sКак да се включа в Piwik%4$s или %5$sдарете сега%6$s, за да помогнете с финансирането на Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s е наличен. Моля, уведомете %2$sPiwik администратор%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s е наличен. %2$s Обновете сега. %3$s (вижте %4$s промените%5$s).",
"PleaseSpecifyValue": "Моля, въведете стойност за '%s'.",
diff --git a/lang/cs.json b/lang/cs.json
index 274cd5ed67..02d99dbac4 100644
--- a/lang/cs.json
+++ b/lang/cs.json
@@ -140,7 +140,8 @@
"ExceptionContactSupportGeneric": "Pokud problém přetrvá, %1$skontaktujte pro pomoc svého Piwik administrátora%2$s.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Uživatel musí být super-uživatel nebo uživatel %s.",
"ExceptionConfigurationFileNotFound": "Konfigurační soubor {%s} nebyl nalezen",
- "ExceptionConfigurationFileNotFound2": "Pokud soubor existuje, ověřte, že %1$s může číst uživatel '%2$s'.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Konfigurační soubor %s nejspíš existuje, ale Piwik ho nemůže přečíst.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Ověřte prosím, že %1$s může číst uživatel '%2$s'.",
"ExceptionDatabaseVersion": "Vaše %1$s verze je %2$s ale Piwik vyžaduje minimálně %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Kód Piwiku je z verze %1$s, ale bylo zjištěno, že databáze byla již aktualizována na verzi %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Vaši administrátoři možná pracují na aktualizaci. Zkuste to prosím za pár minut.",
@@ -285,7 +286,7 @@
"Password": "Heslo",
"Period": "Období",
"Piechart": "Koláčový graf",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s je společný projekt, který je zajištěn členy %7$sPiwik týmu%8$s a mnoha přispěvateli z celého světa. Pokud jste fanouškem Piwiku, můžete se podívat, %3$sjak přispět do Piwiku%4$s, nebo %5$sjak finančně podpořit%6$s vývoj Piwiku 3.0!",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s je společný projekt zajištěný členy %7$stýmem Piwiku%8$s, stejně jako mnoha dalšími přispěvateli z celého světa. <br\/> Pokud jste fanoušek Piwiku, můžete zjistit, %3$sjak se zapojit%4$s, nebo %5$spřispějte%6$s na vývoj Piwiku 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s je dostupný. Prosím, upozorněte %2$sadministrátora Piwiku%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Je k dispozici Piwik %1$s. %2$s Prosím aktualizujte jej!%3$s (viz %4$s změny%5$s).",
"PleaseSpecifyValue": "Prosím zapiště hodnotu pro '%s'.",
diff --git a/lang/cy.json b/lang/cy.json
index 71bf2b10da..d191316767 100644
--- a/lang/cy.json
+++ b/lang/cy.json
@@ -3,10 +3,8 @@
"AbandonedCarts": "Troliau Siopa a Adawyd",
"AboutPiwikX": "Am dan Piwik %s",
"Actions": "Camau gweithredu",
- "AllowPiwikArchivingToTriggerBrowser": "Caniatáu system archifo Piwik i sbarduno pan fydd adroddiadau yn cael eu hystyried gan y porwr",
"AllWebsitesDashboard": "Dangosfwrdd Holl Wefannau",
"API": "API",
- "ApplyDateRange": "Defnyddio'r Amrediad Dyddiad",
"ArchivingInlineHelp": "Ar gyfer gwefannau sydd a traffig canolig i uchel, argymhellir i analluogi'r system archifo Piwik gael ei sbarduno gan y porwr. Yn hytrach, rydym yn argymell eich bod yn sefydlu swydd cron i brosesu adroddiadau Piwik bob awr.",
"AuthenticationMethodSmtp": "Dull dilysu ar gyfer SMTP",
"AverageOrderValue": "Gwerth yr Archeb (ar gyfartaledd)",
@@ -15,10 +13,8 @@
"BackToPiwik": "Yn ôl i",
"BrokenDownReportDocumentation": "Mae'n cael ei dorri lawr i wahanol adroddiadau, sy'n cael eu harddangos mewn sparklines ar waelod y dudalen. Gallwch chwyddo y graffiau drwy glicio ar yr adroddiad hoffech ei weld.",
"ChangeTagCloudView": "Nodwch, y gallwch weld yr adroddiad mewn ffyrdd heblaw fel cwmwl tag. Defnyddiwch y rheolaethau ar waelod yr adroddiad i wneud hynny.",
- "ChooseDate": "Dewiswch ddyddiad",
"ChooseLanguage": "Dewiswch Iaith",
"ChoosePeriod": "Dewiswch gyfnod",
- "ChooseWebsite": "Dewiswch wefan",
"ClickHere": "Cliciwch yma am fwy o wybodaeth",
"Close": "Cau",
"ColumnActionsPerVisit": "Nifer o gamau gweitredu fesul ymweliad",
@@ -29,7 +25,6 @@
"ColumnAvgTimeOnSiteDocumentation": "Hyd Ymweliad (cyfartaledd)",
"ColumnBounceRate": "Cyfradd Adlam",
"ColumnBounceRateDocumentation": "Canran o ymweliadau sydd ond wedi agor un dudalen. Mae hyn yn golygu, bod yr ymwelydd yn gadael y wefan yn uniongyrchol o'r dudalen fynedfa.",
- "ColumnBounceRateForPageDocumentation": "Canran yr ymweliadau a ddechreuodd a ddaeth i ben ar y dudalen hon.",
"ColumnBounces": "Adlamau",
"ColumnBouncesDocumentation": "Nifer o ymweliadau a ddechreuodd a ddaeth i ben ar y dudalen hon. Mae hyn yn golygu bod yr ymwelydd wedi gadael y wefan ar ôl edrych ar y dudalen hon yn unig.",
"ColumnConversionRate": "Cyfradd Trosi",
@@ -58,7 +53,7 @@
"ColumnValuePerVisit": "Refeniw fesul Ymweliad",
"ColumnVisitDuration": "Hyd Ymweliad (mewn eiliadau)",
"ColumnVisitsWithConversions": "Ymweliadau â Addasiadau",
- "ConfigFileIsNotWritable": "Nid yw ffeil ffurfweddu %s Piwik yn ysgrifenadwy, efallai na fydd rhai o'ch newidiadau yn cael eu cadw. %s Newidiwch caniatadau y ffeil config i'w gwneud yn ysgrifenadwy os gwelwch yn dda.",
+ "ConfigFileIsNotWritable": "Nid yw ffeil ffurfweddu %1$s Piwik yn ysgrifenadwy, efallai na fydd rhai o'ch newidiadau yn cael eu cadw. %2$s Newidiwch caniatadau y ffeil config i'w gwneud yn ysgrifenadwy os gwelwch yn dda.",
"CurrentMonth": "Mis Cyfredol",
"CurrentWeek": "Wythnos Cyfredol",
"CurrentYear": "Blwyddyn Cyfredol",
@@ -67,8 +62,7 @@
"Date": "Dyddiad",
"DateRange": "Amrediad dyddiad:",
"DateRangeFrom": "Oddiwrth",
- "DateRangeFromTo": "O %s i %s",
- "DateRangeInPeriodList": "Amrediad dyddiad",
+ "DateRangeFromTo": "O %1$s i %2$s",
"DateRangeTo": "I",
"DaysHours": "%1$s diwrnodau %2$s oriau",
"DaysSinceFirstVisit": "Nifer o ddiwrnodau ers yr ymweliad cyntaf",
@@ -97,13 +91,13 @@
"ExceptionFileIntegrity": "Gwirio uniondeb wedi methu: %s",
"ExceptionFilesizeMismatch": "Diffyg cyfatebiaeth maint y ffeil: %1$s (disgwylir hyd o: %2$s, wedi dod o hyd i: %3$s)",
"ExceptionInvalidArchiveTimeToLive": "I drosglwyddo amser archif i amser byw rhaid fod y nifer o eiliadau fwy na sero",
- "ExceptionInvalidDateFormat": "Rhaid i fformat dyddiadau fod yn: %s neu unrhyw air allweddol a gefnogir gan y gweithred %s (gweler %s am fwy o wybodaeth)",
- "ExceptionInvalidDateRange": "Nid yw'r '%s' dyddiad mewn ystod dyddiad cywir. Dylai fod yn y ffurf canlynol: %s.",
- "ExceptionInvalidPeriod": "Nid yw'r cyfnod '%s' yn cael ei gefnogi Rhowch gynnig ar unrhyw un o'r canlynol yn lle hynny: %s",
- "ExceptionInvalidReportRendererFormat": "Nid yw '%s' yn ddilys. Rhowch gynnig ar unrhyw un o'r canlynol yn lle hynny: %s.",
+ "ExceptionInvalidDateFormat": "Rhaid i fformat dyddiadau fod yn: %1$s neu unrhyw air allweddol a gefnogir gan y gweithred %2$s (gweler %3$s am fwy o wybodaeth)",
+ "ExceptionInvalidDateRange": "Nid yw'r '%1$s' dyddiad mewn ystod dyddiad cywir. Dylai fod yn y ffurf canlynol: %2$s.",
+ "ExceptionInvalidPeriod": "Nid yw'r cyfnod '%1$s' yn cael ei gefnogi Rhowch gynnig ar unrhyw un o'r canlynol yn lle hynny: %2$s",
+ "ExceptionInvalidReportRendererFormat": "Nid yw '%1$s' yn ddilys. Rhowch gynnig ar unrhyw un o'r canlynol yn lle hynny: %2$s.",
"ExceptionInvalidToken": "Nid yw'r tocyn yn ddilys.",
"ExceptionLanguageFileNotFound": "Nid yw'r ffeil Iaith '%s' wedi ei chanfod.",
- "ExceptionMethodNotFound": "Nid yw'r dull '%s' yn bodoli neu nid yw ar gael yn y modiwl '%s'.",
+ "ExceptionMethodNotFound": "Nid yw'r dull '%1$s' yn bodoli neu nid yw ar gael yn y modiwl '%2$s'.",
"ExceptionMissingFile": "Ffeil ar goll: %s",
"ExceptionNonceMismatch": "Doedd dim modd gwirio'r tocyn diogelwch ar y ffurflen hon.",
"ExceptionPrivilege": "Ni allwch ddefnyddio'r adnodd hwn, mae'n ofynnol cael %s i gael mynediad.",
@@ -111,7 +105,7 @@
"ExceptionPrivilegeAtLeastOneWebsite": "Ni allwch ddefnyddio'r adnodd hwn, mae'n ofynnol cael lefel %s i gael mynediad ar gyfer o leiaf un wefan.",
"ExceptionUnableToStartSession": "Methu dechrau sesiwn",
"ExceptionUndeletableFile": "Wedi methu dileu %s",
- "ExceptionUnreadableFileDisabledMethod": "Nid oedd modd darllen y ffeil cyfluniad {%s}. Efallai bod eich cynhaliwr gwefan wedi ei anablu %s.",
+ "ExceptionUnreadableFileDisabledMethod": "Nid oedd modd darllen y ffeil cyfluniad {%1$s}. Efallai bod eich cynhaliwr gwefan wedi ei anablu %2$s.",
"Export": "Allforio",
"ExportAsImage": "Allforio fel llun",
"ExportThisReport": "Allforio'r set ddata hon mewn fformatau eraill",
@@ -149,7 +143,6 @@
"NoDataForTagCloud": "Dim data ar gyfer y tag cwmwl.",
"NotDefined": "%s heb ei ddiffinio",
"NotValid": "%s ddim yn ddilys",
- "NSeconds": "%s eiliad",
"NumberOfVisits": "Nifer o Ymweliadau",
"Ok": "Iawn",
"OnlyEnterIfRequired": "Dim ond rhoi enw defnyddiwr os yw eich gweinyddwr SMTP yn gofyn amdano.",
@@ -157,7 +150,7 @@
"OnlyUsedIfUserPwdIsSet": "Yn cael ei ddefnyddio ond pan fydd enw defnyddiwr \/ cyfrinair wedi ei osod, gofynnwch i'ch darparwr os ydych yn ansicr pa ddull i'w ddefnyddio.",
"OpenSourceWebAnalytics": "Dadansoddwr Gwefannol Ffynhonnell Agored",
"OptionalSmtpPort": "Dewisol. Yn rhagosod i 25 os heb eu amgryptio a TLS SMTP, a 465 ar gyfer SSL SMTP.",
- "OrCancel": "neu %s Canslo %s",
+ "OrCancel": "neu %1$s Canslo %2$s",
"Others": "Eraill",
"Period": "Cyfnod",
"Piechart": "Siart Cylch",
@@ -175,7 +168,6 @@
"RefreshPage": "Adnewyddwch y dudalen",
"Report": "Adroddiad",
"Reports": "Adroddiadau",
- "ReportsContainingTodayWillBeProcessedAtMostEvery": "Bydd adroddiadau ar gyfer heddiw (neu unrhyw amrediad arall o ddyddiadau gan gynnwys heddiw) yn cael eu prosesu yn y rhan fwyaf pob",
"ReportsWillBeProcessedAtMostEveryHour": "Felly bydd adroddiadau yn cael ei prosesu ar y mwyaf pob awr.",
"RequestTimedOut": "Mae cais data i %s wedi dod i ben. Rhowch gynnig arall arni.",
"Required": "%s angenrheidiol",
@@ -183,7 +175,6 @@
"Save": "Cadw",
"SaveImageOnYourComputer": "I gadw copi o'r llun ar eich cyfrifiadur, cliciwch a'r y botwm dde a dewiswch \"Save Image As...\"",
"Search": "Chwilio",
- "Seconds": "%ss",
"SelectYesIfYouWantToSendEmailsViaServer": "Dewiswch \"Oes\" os ydych eisiau, neu ydych yn gorfod anfon e-bost trwy weinyddwr a enwir yn lle y defnyddio gweithred post lleol",
"Settings": "Gosodiadau",
"Shipping": "Cludiant",
@@ -216,18 +207,16 @@
"VisitorIP": "IP yr Ymwelydd",
"Visitors": "Ymwelwyr",
"VisitsWith": "Ymweliadau gyda %s",
- "VisitType": "Math o ymwelydd",
"VisitTypeExample": "Fel enghraifft, i ddewis pob ymwelydd sydd wedi ail ddychwelyd i'r safle, yn cynnwys y rhai hynny sydd wedi prynu rhywbeth yn ystod eu hymweliad diwethaf, bydd y cais API yn cynnwys %s",
"Warning": "Rhybudd",
"WarningFileIntegrityNoManifest": "Nid oedd yn bosib perfformio gwiriad cywirdeb ar y ffeil am fod manifest.inc.php ar goll.",
"WarningFileIntegrityNoMd5file": "Nid oedd yn bosib perfformio gwiriad cywirdeb ar y ffeil am fod gweithred md5_file() ar goll.",
- "WarningPasswordStored": "%sRhybudd%:%s Bydd y cyfrinair yn cael ei storio yn y ffeil config ac yn weladwy i bawb sydd a mynediad iddo.",
+ "WarningPasswordStored": "%1$sRhybudd:%2$s Bydd y cyfrinair yn cael ei storio yn y ffeil config ac yn weladwy i bawb sydd a mynediad iddo.",
"Website": "Gwefan",
"Weekly": "Wythnosol",
"Widgets": "Widgets",
"YearsDays": "%1$s blynyddoedd %2$s diwrnodau",
"Yes": "Ia",
- "YouAreViewingDemoShortMessage": "Rydych ar hyn o bryd yn edrych ar demo o Piwik",
"YouMustBeLoggedIn": "Rhaid i chi fewngofnodi i ddefnyddio'r gweithred hwn.",
"YourChangesHaveBeenSaved": "Mae eich newidiadau wedi eu cadw."
}
diff --git a/lang/da.json b/lang/da.json
index d390d5016d..bfb7437601 100644
--- a/lang/da.json
+++ b/lang/da.json
@@ -1,5 +1,7 @@
{
"General": {
+ "12HourClock": "12 timers ur",
+ "24HourClock": "24 timers ur",
"AbandonedCarts": "Afbrudte Ordrer",
"AboutPiwikX": "Om Piwik %s",
"Action": "Handling",
@@ -7,9 +9,11 @@
"Add": "Tilføj",
"AfterEntry": "efter indtastning her",
"All": "Alle",
+ "AllowPiwikArchivingToTriggerBrowser": "Arkiver rapporter når de er set i browseren",
"AllWebsitesDashboard": "Kontrolpanel for alle hjemmesider",
"And": "og",
"API": "API",
+ "Apply": "Tilføj",
"ArchivingInlineHelp": "For hjemmesider med medium til høj trafik anbefales det at deaktivere Piwik-arkivering udløst fra browseren. I stedet anbefales det at køre et cron job hver time til at behandle Piwik rapporter.",
"ArchivingTriggerDescription": "Til større Piwik installationer anbefales det, at %1$soprette et cron job%2$s til at behandle rapporterne automatisk.",
"AuthenticationMethodSmtp": "Godkenselsesmetode til SMTP",
@@ -23,11 +27,13 @@
"CannotUnzipFile": "Kan ikke udpakke filen %1$s: %2$s",
"ChangePassword": "Skift adgangskode",
"ChangeTagCloudView": "Bemærk, at du kan få vist rapporten på andre måder end som en emnesky. Brug kontrolelementerne nederst i rapporten for at gøre det.",
+ "ChooseDate": "Vælg dato, aktuel valgt dato er: %s",
"ChooseLanguage": "Vælg sprog",
"ChoosePeriod": "Vælg periode",
"ClickHere": "Klik her for yderligere oplysninger.",
"ClickToChangePeriod": "Klik igen for at ændre perioden.",
"Close": "Luk",
+ "ClickToSearch": "Klik for at søge",
"ColumnActionsPerVisit": "Handlinger pr. besøg",
"ColumnActionsPerVisitDocumentation": "Det gennemsnitlige antal handlinger (sidevisninger, filhentninger eller udgående links), der blev udført under besøgene.",
"ColumnAverageGenerationTime": "Gennemsnitlig genereringstid",
@@ -80,6 +86,8 @@
"ConfigFileIsNotWritable": "Piwik konfigurationsfilen %1$s er skrivebeskyttet, nogle af ændringerne vil ikke blive gemt. %2$s Skift tilladelser til konfigurationsfilen for at gøre den skrivebar.",
"Continue": "Fortsæt",
"ContinueToPiwik": "Fortsæt til Piwik",
+ "CurrentlyUsingUnsecureHttp": "Du bruger i øjeblikket Piwik på en usikker HTTP forbindelse, som kan være risikabelt. Vi anbefaler, at du sætter Piwik op til at bruge SSL (HTTPS) for forbedret sikkerhed.",
+ "CreatedByUser": "oprettet a %s",
"CurrentMonth": "Denne måned",
"CurrentWeek": "Nuværende uge",
"CurrentYear": "Dette år",
@@ -94,6 +102,7 @@
"DateRange": "Datointerval:",
"DateRangeFrom": "Fra",
"DateRangeFromTo": "Fra %1$s til %2$s",
+ "DateRangeInPeriodList": "Datointerval",
"DateRangeTo": "Til",
"DaysHours": "%1$s dage %2$s timer",
"DaysSinceFirstVisit": "Dage siden første besøg",
@@ -221,6 +230,7 @@
"Name": "Navn",
"NbActions": "Antal handlinger",
"NbSearches": "Antal af interne søgning",
+ "NeedMoreHelp": "Behøver du mere hjælp?",
"Never": "Aldrig",
"NewReportsWillBeProcessedByCron": "Når Piwik arkivering ikke udløses af browseren, vil nye rapporter blive behandlet af crontab.",
"NewUpdatePiwikX": "Ny opdatering: Piwik %s",
@@ -233,6 +243,7 @@
"NotDefined": "%s ikke defineret",
"Note": "Note",
"NotInstalled": "Ikke installeret",
+ "NotRecommended": "ikke anbefalet",
"NotValid": "%s er ikke gyldig",
"NumberOfVisits": "Antal besøg",
"NUsers": "%s brugere",
@@ -254,8 +265,11 @@
"OperationIsNot": "Er ikke",
"OperationLessThan": "Mindre end",
"OperationNotEquals": "Ikke lig med",
+ "OperationStartsWith": "Start med",
+ "OperationEndsWith": "Slutter med",
"OptionalSmtpPort": "Valgfri: Standard 25 for ukrypteret og TLS SMTP og 465 for SSL SMTP.",
"Options": "Indstillinger",
+ "Or": "eller",
"OrCancel": "eller %1$s Fortryd %2$s",
"Others": "Andre",
"Outlink": "Udgående links",
@@ -270,7 +284,6 @@
"Password": "Adgangskode",
"Period": "Periode",
"Piechart": "Cirkeldiagram",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s er et samarbejdsprojekt af %7$sPiwik holdets%8$s medlemmer samt mange andre bidragydere i hele verden. Hvis du er en fan af Piwik, kan du hjælpe med: at finde ud af %3$shvordan du hjælper Piwik%4$s eller %5$sdoner nu%6$s til at hjælpe med at finansiere Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s er tilængelig. Kontakt venligst %2$sPiwik administrator%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s er tilgængelig. %2$sOpdater nu!%3$s (se %4$sændringer%5$s).",
"PleaseSpecifyValue": "Angiv værdi for '%s'.",
@@ -284,10 +297,13 @@
"Price": "Pris",
"ProductConversionRate": "Produkt konverteringsfrekvens",
"ProductRevenue": "Produkt Omsætning",
+ "Measurable": "Målbar",
+ "Measurables": "Målbare",
"PurchasedProducts": "Købte produkter",
"Quantity": "Mængde",
"RangeReports": "Brugerdefinerede datointervaller",
"ReadThisToLearnMore": "%1$sLæs dette for at lære mere.%2$s",
+ "Recommended": "Anbefalede",
"RecordsToPlot": "Poster at afbilde",
"Refresh": "Opdater",
"RefreshPage": "Opdater siden",
@@ -298,6 +314,8 @@
"ReportGeneratedFrom": "Denne rapport blev genereret med data fra %s.",
"ReportRatioTooltip": "'%1$s' repræsenterer %2$s af %3$s %4$s med %5$s.",
"Reports": "Rapporter",
+ "ReportsContainingTodayWillBeProcessedAtMostEvery": "Arkivrapporter højst hvert X sekender",
+ "RearchiveTimeIntervalOnlyForTodayReports": "Dette berører kun rapporter for i dag (eller et andet datointerval inklusive i dag)",
"ReportsWillBeProcessedAtMostEveryHour": "Rapporterne vil derfor blive behandlet højst hver time.",
"RequestTimedOut": "En anmodning til %s fik timeout. Prøv igen.",
"Required": "%s påkrævet",
@@ -335,10 +353,15 @@
"TagCloud": "Emne sky",
"Tax": "Moms",
"TimeAgo": "%s siden",
+ "TimeFormat": "Tidsformat",
"TimeOnPage": "Tid på siden",
"Total": "Total",
"TotalRatioTooltip": "Dette er %1$s af alle %2$s %3$s.",
"TotalRevenue": "Indtægter i alt",
+ "TotalVisitsPageviewsActionsRevenue": "(Total: %1$s besøg, %2$s sidevisninger, %3$s handlinger, %4$s indtjening)",
+ "TrackingScopeAction": "Handling",
+ "TrackingScopePage": "Side",
+ "TrackingScopeVisit": "Besøg",
"TransitionsRowActionTooltip": "See hvad besøgende gjorde før og efter de så denne side",
"TransitionsRowActionTooltipTitle": "Åben overgange",
"TranslatorName": "Daniel Juhl, jan madsen",
@@ -364,13 +387,16 @@
"Visitors": "Besøgende",
"VisitsWith": "Besøg med %s",
"VisitorSettings": "Besøgendes indstillinger",
+ "VisitType": "Besøgstype",
"VisitTypeExample": "F. eks., for at vælge alle besøgende, som er vendt tilbage til hjemmesiden, herunder dem, der har købt noget i deres tidligere besøg, vil API-anmodningen indeholde %s",
"Warning": "Advarsel",
"WarningPhpVersionXIsTooOld": "PHP version %s har nået slutningen af ​​sin levetid (EOL). Du opfordres kraftigt til at opgradere til den aktuelle version, fordi brug af denne version kan udsætte dig for sikkerhedshuller og fejl, som er blevet rettet i nyere versioner af PHP.",
+ "WarningPiwikWillStopSupportingPHPVersion": "Piwik ophører med at understøtte PHP %1$s i den næste store opdatering. Opgrader din PHP mindst PHP %2$s før det er for sent!",
"WarningFileIntegrityNoManifest": "Fil integritetstjek kunne ikke udføres på grund af manglende manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Hvis du implementerer Piwik fra Git, er meddelelsen normal.",
"WarningFileIntegrityNoMd5file": "Fil integritetstjek kunne ikke gennemføres pga. manglende md5_file () funktion.",
"WarningPasswordStored": "%1$sAdvarsel:%2$s Adgangskoden bliver gemt i konfigurationsfilen synlig for alle, der har adgang til den.",
+ "WarningDebugOnDemandEnabled": "Tracker %1$s mode er aktiveret. Af sikkerhedsgrunde skal denne indstilling kun være aktiveret en kort periode. For at deaktivere sæt %2$s til %3$s i %4$s",
"Website": "Hjemmeside",
"Weekly": "Ugentligt",
"WeeklyReport": "ugentlig",
@@ -385,6 +411,7 @@
"YearsDays": "%1$s år %2$s dage",
"Yes": "Ja",
"YouAreCurrentlyUsing": "Du bruger i øjeblikket Piwik %s.",
+ "YouAreViewingDemoShortMessage": "Du bruger en demo version af Piwik",
"YouMustBeLoggedIn": "Du skal være logget på for at få adgang til denne funktion.",
"YourChangesHaveBeenSaved": "Ændringer er gemt."
},
diff --git a/lang/de.json b/lang/de.json
index 4fcf0eb9bb..44c2c2ceab 100644
--- a/lang/de.json
+++ b/lang/de.json
@@ -27,10 +27,10 @@
"CannotUnzipFile": "Die Datei %1$s kann nicht entpackt werden: %2$s",
"ChangePassword": "Passwort ändern",
"ChangeTagCloudView": "Bitte beachten Sie, dass Sie den Bericht nicht nur als Tag-Cloud anzeigen können. Verwenden Sie die Steuerelemente in der Fußleiste, um die Ansicht zu wechseln.",
- "ChooseDate": "Wählen Sie ein datum, aktuell gewähltes Datum ist: %s",
+ "ChooseDate": "Wählen Sie ein Datum, aktuell gewähltes Datum ist: %s",
"ChooseLanguage": "Sprache wählen",
"ChoosePeriod": "Zeitraum wählen",
- "ClickHere": "Klicken Sie hier für mehr Informationen.",
+ "ClickHere": "Klicken Sie hier für weitere Informationen.",
"ClickToChangePeriod": "Klicken Sie erneut, um den Zeitraum zu ändern.",
"Close": "Schließen",
"ClickToSearch": "Zum Suchen klicken",
@@ -74,7 +74,7 @@
"ColumnRevenue": "Umsatz",
"ColumnSumVisitLength": "Von Besuchern verbrachte Gesamtzeit (in Sekunden)",
"ColumnTotalPageviews": "Gesamte Seitenansichten",
- "ColumnUniqueEntrances": "Eindeutige Eingänge",
+ "ColumnUniqueEntrances": "Eindeutige Einstiege",
"ColumnUniqueExits": "Eindeutige Ausstiege",
"ColumnUniquePageviews": "Eindeutige Seitenansichten",
"ColumnUniquePageviewsDocumentation": "Die Anzahl der Besuche, welche diese Seite aufgerufen haben. Sollte die Seite mehrmals bei einem Besuch aufgerufen worden sein, so wird dies nur einmal gezählt.",
@@ -140,7 +140,8 @@
"ExceptionContactSupportGeneric": "Falls dieses Problem weiterhin besteht, %1$skontaktieren Sie bitte Ihren Piwik Administrator%2$s für Unterstützung.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Der Benutzer muss entweder ein Hauptadministrator sein oder der Benutzer '%s'.",
"ExceptionConfigurationFileNotFound": "Die Konfigurationsdatei {%s} wurde nicht gefunden.",
- "ExceptionConfigurationFileNotFound2": "Insofern die Datei existiert überprüfen Sie bitte dass %1$s für den Benutzer '%2$s' lesbar ist.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Die Konfigurationsdatei %s scheint zu existieren, konnte von Piwik jedoch nicht gelesen werden.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Bitte überprüfen Sie ob der Benutzer %2$s Lesezugriff auf die Datei %1$s hat.",
"ExceptionDatabaseVersion": "Ihre %1$s-Version ist %2$s, aber Piwik benötigt mindestens %3$s",
"ExceptionDatabaseVersionNewerThanCodebase": "Ihre Piwik Codebase läuft auf der alten Version %1$s und wir haben erkannt, dass Ihre Piwik Datenbank bereits auf die neuere Version %2$s aktualisiert wurde.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Möglicherweise sind die Piwik Administratoren gerade daran, den Aktualisierungsprozess abzuschliessen. Bitte versuchen Sie es in ein paar Minuten noch einmal.",
@@ -285,7 +286,6 @@
"Password": "Passwort",
"Period": "Zeitraum",
"Piechart": "Kreisdiagramm",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$s Piwik %2$s ist ein gemeinschaftliches Projekt der %7$s Piwik Team%8$s Mitglieder. Wenn Ihnen Piwik gefällt, können Sie helfen: Finden Sie heraus, %3$s wie Sie Piwik unterstützen können%4$s oder %5$s Spenden Sie jetzt%6$s und unterstützen Sie Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s ist verfügbar. Bitte benachrichtigen Sie den %2$sPiwik Administrator%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s ist verfügbar. %2$s Bitte aktualisieren Sie jetzt!%3$s (siehe %4$s Änderungen%5$s).",
"PleaseSpecifyValue": "Bitte geben Sie einen Wert für '%s' an.",
@@ -303,7 +303,7 @@
"Measurables": "Messbares",
"PurchasedProducts": "Gekaufte Produkte",
"Quantity": "Menge",
- "RangeReports": "Benutzerdefinierte Bereiche",
+ "RangeReports": "Benutzerdefinierte Zeitspannen",
"ReadThisToLearnMore": "%1$sErfahren Sie hier mehr darüber.%2$s",
"Recommended": "Empfohlen",
"RecordsToPlot": "Anzuzeigende Datensätze",
@@ -436,7 +436,7 @@
"DefaultReportDate": "Berichtsdatum",
"EmailUs": "Email senden",
"EnableGraphsLabel": "Graphen anzeigen",
- "EvolutionGraph": "Historischer Graph",
+ "EvolutionGraph": "Zeitdiagramm",
"HelpUsToImprovePiwikMobile": "Anonyme Nutzungsdaten in Piwik Mobile aktivieren?",
"HowtoDeleteAnAccount": "Drücken Sie lange, um einen Account zu entfernen.",
"HowtoDeleteAnAccountOniOS": "Von rechts nach links wischen, um einen Account zu löschen",
diff --git a/lang/el.json b/lang/el.json
index c141191e32..f54dcf6c37 100644
--- a/lang/el.json
+++ b/lang/el.json
@@ -140,7 +140,8 @@
"ExceptionContactSupportGeneric": "Αν συνεχίζετε να αντιμετωπίζετε πρόβλημα, %1$sεπικοινωνήστε με τον διαχειριστή σας του Piwik%2$s για βοήθεια.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Ο χρήστης πρέπει να είναι είτε Υπερ-Χρήστης είτε ο ίδιος ο χρήστης '%s'.",
"ExceptionConfigurationFileNotFound": "Δεν βρέθηκε το αρχείο ρυθμίσεων {%s} ή δεν ήταν δυνατή η ανάγνωσή του.",
- "ExceptionConfigurationFileNotFound2": "Αν το αρχείο υπάρχει, ελέγξτε αν είναι %1$s αναγνώσιμο από τον χρήστη '%2$s'.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Το αρχείο ρυθμίσεων %s του Piwik φαίνεται να υπάρχει αλλά το Piwik δεν μπορεί να το διαβάσει.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Παρακαλούμε ελέγξτε το %1$s είναι αναγνώσιμο από το χρήστη '%2$s'.",
"ExceptionDatabaseVersion": "Η έκδοσή %1$s είναι %2$s αλλά το Piwik απαιτεί τουλάχιστον %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Ο κώδικας του Piwik εκτελεί την παλιότερη έκδοση %1$s και εντοπίστηκε ότι η βάση δεδομένων του Piwik έχει ήδη αναβαθμιστεί στην νεότερη έκδοση %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Είναι πιθανόν οι διαχειριστές του Piwik να τελειώνουν τη διαδικασία αναβάθμισης. Παρακαλούμε δοκιμάστε πάλι αργότερα σε λίγα λεπτά.",
@@ -285,7 +286,7 @@
"Password": "Κωδικός",
"Period": "Περίοδος",
"Piechart": "Διάγραμμα πίτας",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "Το %1$sPiwik%2$s είναι ένα συνεργατικό έργο για εσάς, προερχόμενο από τα μέλη της %7$sομάδας του Piwik%8$s όπως επίσης και από άλλους συμμετέχοντες ανά τον κόσμο. Αν είστε οπαδός του Piwik, μπορείτε να βοηθήσετε: δείτε πως %3$sμπορείτε να συμμετέχετε στο Piwik%4$s, ή να %5$sδώσετε δωρεά%6$s για να ενισχύσετε οικονομικά το Piwik 3.0!",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "Τι %1$sPiwik%2$s αποτελεί μια συλλογική προσπάθεια που σας παρέχει η %7$sομάδα μελών του Piwik%8$s καθώς επίσης και άλλοι συνεργάτες ανά την υφήλιο.<br\/>Αν είστε οπαδός του Piwik, μπορείτε να βοηθήσετε: δείτε πως να %3$sσυμμετέχετε στο Piwik%4$s ή %5$sκάνετε μια δωρεά%6$s για να χρηματοδοτήσετε την ανάπτυξη του Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "Το %1$s είναι διαθέσιμο. Παρακαλούμε ειδοποιήστε τον %2$sδιαχειριστή του Piwik σας%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Είναι διαθέσιμο το Piwik %1$s. %2$s Άμεση ενημέρωση τώρα!%3$s (δείτε τις %4$s αλλαγές%5$s).",
"PleaseSpecifyValue": "Ορίστε μια τιμή για το «%s».",
diff --git a/lang/en.json b/lang/en.json
index d196250fcc..a5de07e7ca 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -141,7 +141,8 @@
"ExceptionContactSupportGeneric": "If you still have this issue please %1$scontact your Piwik administrator%2$s for assistance. ",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "The user has to be either a Super User or the user '%s' itself.",
"ExceptionConfigurationFileNotFound": "The configuration file {%s} has not been found or could not be read.",
- "ExceptionConfigurationFileNotFound2": "If the file exists, please check that %1$s is readable by the user '%2$s'.",
+ "ExceptionConfigurationFileExistsButNotReadable": "The config file %s seems to exist but Piwik could not read it.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Please check that %1$s is readable by the user '%2$s'.",
"ExceptionDatabaseVersion": "Your %1$s version is %2$s but Piwik requires at least %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Your Piwik codebase is running the old version %1$s and we have detected that your Piwik Database has already been upgraded to the newer version %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Maybe your Piwik administrators are currently finishing the upgrade process. Please try again in a few minutes.",
@@ -287,7 +288,7 @@
"Password": "Password",
"Period": "Period",
"Piechart": "Piechart",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s is a collaborative project brought to you by the %7$sPiwik team%8$s members as well as many other contributors around the globe. If you're a fan of Piwik, you can help: find out %3$sHow to participate in Piwik%4$s, or %5$sdonate now%6$s to help fund Piwik 3.0!",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s is a collaborative project brought to you by the %7$sPiwik team%8$s members as well as many other contributors around the globe. <br/> If you're a fan of Piwik, you can help: find out %3$sHow to participate in Piwik%4$s, or %5$sdonate now%6$s to help fund Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s is available. Please notify the %2$sPiwik administrator%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s is available. %2$sPlease update now!%3$s (see %4$schanges%5$s).",
"PleaseSpecifyValue": "Please specify a value for '%s'.",
diff --git a/lang/es.json b/lang/es.json
index 787397776f..8dc19b7a06 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -1,5 +1,7 @@
{
"General": {
+ "12HourClock": "12 horas",
+ "24HourClock": "24 horas",
"AbandonedCarts": "Carros abandonados",
"AboutPiwikX": "Acerca de Piwik %s",
"Action": "Acción",
@@ -11,6 +13,7 @@
"AllWebsitesDashboard": "Panel de todos los sitios de internet",
"And": "y",
"API": "API",
+ "Apply": "Aplicar",
"ArchivingInlineHelp": "Para sitios de internet de medio o alto tráfico, se recomienda deshabilitar el archivado de Piwik al ingresar con el navegador. En su lugar, le recomendamos que configure una tarea cron para procesar los informes de Piwik cada hora.",
"ArchivingTriggerDescription": "Recomendado para grandes instalaciones de Piwik, necesita %1$sconfigurar una tarea de cron %2$s para procesar los reportes automáticamente.",
"AuthenticationMethodSmtp": "Método de autenticación SMTP",
@@ -24,6 +27,7 @@
"CannotUnzipFile": "No se puede descomprimir el archivo %1$s: %2$s",
"ChangePassword": "Cambiar contraseña",
"ChangeTagCloudView": "Por favor tenga en cuenta que puede ver el reporte de otros modos que no sean una nube de etiquetas. Use los controles al final del informe para hacerlo.",
+ "ChooseDate": "Elige la fecha, actualmente la fecha seleccionada es: %s",
"ChooseLanguage": "Elegir idioma",
"ChoosePeriod": "Elegir periodo",
"ClickHere": "Haga clic aquí para más información.",
@@ -82,6 +86,8 @@
"ConfigFileIsNotWritable": "El archivo de configuración de Piwik %1$s no tiene permisos de escritura, algunos de los cambios no se guardarán. %2$s Por favor, cambie los permisos del archivo de configuración para que sea modificable.",
"Continue": "Continuar",
"ContinueToPiwik": "Ir a Piwik",
+ "CurrentlyUsingUnsecureHttp": "Actualmente estás usando Piwik bajo protocolo HTTP, el cual puede ser arriesgado. Recomendamos configurar Piwik para que utilice SSL (HTTPS) para mejorar la seguridad.",
+ "CreatedByUser": "Creado por %s",
"CurrentMonth": "Mes actual",
"CurrentWeek": "Semana actual",
"CurrentYear": "Año actual",
@@ -96,6 +102,7 @@
"DateRange": "Rango de fecha:",
"DateRangeFrom": "Desde",
"DateRangeFromTo": "Desde %1$s a %2$s",
+ "DateRangeInPeriodList": "Rango de fecha",
"DateRangeTo": "A",
"DaysHours": "%1$s días %2$s horas",
"DaysSinceFirstVisit": "Días desde la primera visita",
@@ -127,13 +134,14 @@
"Edit": "Editar",
"EncryptedSmtpTransport": "Ingrese el tipo de encriptación de su servidor SMTP.",
"Error": "Error",
- "ErrorRequest": "Oops... hubo un problema durante la petición. Tal vez el servidor tuvo un problema temporal, o tal vez pidió un informe con demasiada información. Por favor vuelva a intentarlo. Si el error ocurre repetidamente, %1$scontáctese con su administrador Piwik%2$s para ayudarlo.",
+ "ErrorRequest": "Oops... hubo un problema durante la petición. Tal vez el servidor tuvo un problema temporal, o tal vez pidió un informe con demasiada información. Por favor vuelva a intentarlo. Si el error ocurre repetidamente, %1$scontácte con su administrador Piwik%2$s para ayudarlo.",
"EvolutionOverPeriod": "Evolución en el periodo",
"EvolutionSummaryGeneric": "%1$s en %2$s comparado con %3$s en %4$s. Evolución: %5$s",
- "ExceptionContactSupportGeneric": "Si todavía tienes este problema, por favor %1$scontáctese con su administrador Piwik%2$s en busca de ayuda.",
+ "ExceptionContactSupportGeneric": "Si todavía tiene este problema, por favor %1$scontácte con su administrador Piwik%2$s en busca de ayuda.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Este usuario debe ser Super User o el mismo usuario '%s'.",
"ExceptionConfigurationFileNotFound": "El archivo de configuración {%s} no fue encontrado o no puedo ser leído.",
- "ExceptionConfigurationFileNotFound2": "Si el archivo existe, por favor compruebe que %1$s es legible por el usuario '%2$s'.",
+ "ExceptionConfigurationFileExistsButNotReadable": "El archivo de configuración %s parece existir pero Piwik no puede leerlo.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Por favor, verifique que %1$s es legible por el usuario '%2$s'.",
"ExceptionDatabaseVersion": "Su versión %1$s es %2$s pero Piwik requiere al menos %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Su código base Piwik está ejecutando una versión añeja %1$s y hemos detectado que su base de datos Piwik ya se ha actualizado a la versión más reciente %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Tal vez sus administradores Piwik están actualmente finalizando el proceso de actualización. Por favor vuelva a intentarlo en unos minutos.",
@@ -143,7 +151,7 @@
"ExceptionInvalidAggregateReportsFormat": "El formato de informes global '%1$s' no es válido. En su lugar, pruebe alguno de los siguientes: %2$s.",
"ExceptionInvalidArchiveTimeToLive": "El archivo de hoy debe tener un tiempo de vida en segundos mayor a cero",
"ExceptionInvalidDateFormat": "El formato de fecha debe ser: %1$s o cualquier palabra clave soportada por la función %2$s (vea %3$s para más información)",
- "ExceptionInvalidDateRange": "La fecha '%1$s' no es rango de fecha correcto Puede tener el siguiente formato: %2$s.",
+ "ExceptionInvalidDateRange": "La fecha '%1$s' no es rango de fecha correcto. Puede tener el siguiente formato: %2$s.",
"ExceptionInvalidPeriod": "El período '%1$s' no es válido. Pruebe alguno de los siguientes en su lugar: %2$s.",
"ExceptionInvalidRendererFormat": "Formato de renderizado '%1$s' no válido. Pruebe alguno de los siguientes en su lugar: %2$s.",
"ExceptionInvalidReportRendererFormat": "El formato de informe '%1$s' no es válido. Pruebe cualquiera de los siguientes en su lugar: %2$s.",
@@ -224,6 +232,7 @@
"Name": "Nombre",
"NbActions": "Número de acciones",
"NbSearches": "Número de búsquedas internas",
+ "NeedMoreHelp": "Necesita más ayuda?",
"Never": "Nunca",
"NewReportsWillBeProcessedByCron": "Cuando el archivado de Piwik no es activado por el navegador, los nuevos informes serán procesados por el crontab.",
"NewUpdatePiwikX": "Nueva actualización: Piwik %s",
@@ -258,8 +267,11 @@
"OperationIsNot": "No es",
"OperationLessThan": "Menos que",
"OperationNotEquals": "No Iguales",
+ "OperationStartsWith": "Empieza con",
+ "OperationEndsWith": "Termina con",
"OptionalSmtpPort": "Opcional. Por defecto 25 para SMTP sin encriptación y TLS, y 465 para SSL SMTP",
"Options": "Opciones",
+ "Or": "o",
"OrCancel": "o %1$s Cancelar %2$s",
"Others": "Otros",
"Outlink": "Enlace externo",
@@ -274,7 +286,6 @@
"Password": "Contraseña",
"Period": "Periodo",
"Piechart": "Gráfica circular",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s es un proyecto de colaboración entre los miembros del %7$sequipo de Piwik%8$s y muchos otros colaboradores en todo el mundo. Si es un fan de Piwik, puede ayudar: entérese %3$scomo puede participar en Piwik%4$s o %5$shaga una donación ahora%6$s para ayudar a financiar Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s está disponible. Por favor alerte al %2$s administrador Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s está disponible. %2$s ¡Por favor, actualice ahora!%3$s (ver %4$scambios%5$s).",
"PleaseSpecifyValue": "Por favor especifique un valor para '%s'.",
@@ -344,10 +355,15 @@
"TagCloud": "Nube de Etiquetas",
"Tax": "Impuesto",
"TimeAgo": "hace %s",
+ "TimeFormat": "Formato de hora",
"TimeOnPage": "Tiempo en la página",
"Total": "Total",
"TotalRatioTooltip": "Esto es %1$s de todos los %2$s %3$s.",
"TotalRevenue": "Ingresos totales",
+ "TotalVisitsPageviewsActionsRevenue": "(Total: %1$s visitas, %2$s páginas vistas, %3$s acciones, %4$s ingresos)",
+ "TrackingScopeAction": "Acción",
+ "TrackingScopePage": "Página",
+ "TrackingScopeVisit": "Visita",
"TransitionsRowActionTooltip": "Vea que hicieron los visitantes antes y después de observar esta página",
"TransitionsRowActionTooltipTitle": "Transiciones abiertas",
"TranslatorName": "Marcos Alberto Sanmartín Pereira, David Ernesto Soto Vásquez, Fernando SFEIR, Darío Hereñu, David Álvarez Robert, Adrián Seldes, Héctor Nicolás Suero",
@@ -373,13 +389,16 @@
"Visitors": "Visitantes",
"VisitsWith": "Visitas con %s",
"VisitorSettings": "Configuración de visitantes",
+ "VisitType": "Tipo de visita",
"VisitTypeExample": "Por ejemplo, para seleccionar todos los visitantes que han vuelto al sitio, incluyendo a aquellos que han comprado algo en sus anteriores visitas, la solicitud de la API debe contener %s",
"Warning": "Advertencia",
"WarningPhpVersionXIsTooOld": "La versión %s de PHP que está utilizando ha alcanzado su End of LIfe (EOL). Necesitas urgentemente actualizar a una versión más reciente, ya que usando esta versión puede exponerlo a vulnerabilidades de seguridad y errores que han sido arreglados en versiones más recientes de PHP.",
+ "WarningPiwikWillStopSupportingPHPVersion": "Piwik abandonará el soporte para PHP %1$s en la siguiente versión. Actualiza PHP a la versión PHP %2$s, antes de que sea demasiado tarde!",
"WarningFileIntegrityNoManifest": "La verificación de integridad de archivos no se pudo realizar debido a que falta manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Si está desplegando Piwik con Git, este mensaje es normal.",
"WarningFileIntegrityNoMd5file": "La verificación de integridad no pudo ser completada debido a que falta la función md5_file().",
"WarningPasswordStored": "%1$sWarning:%2$s Esta contraseña se almacenará en el archivo de configuración visible a todo el que pueda acceder a él.",
+ "WarningDebugOnDemandEnabled": "El modo de seguimiento %1$s está activado. Por razones de seguridad debe habilitarlo sólo durante un corto periodo de tiempo. Para deshabilitarlo establece %2$s a %3$s en %4$s",
"Website": "Sitio de internet",
"Weekly": "Semanal",
"WeeklyReport": "semanal",
@@ -394,6 +413,7 @@
"YearsDays": "%1$s años %2$s días",
"Yes": "Sí",
"YouAreCurrentlyUsing": "Actualmente está utilizando Piwik %s.",
+ "YouAreViewingDemoShortMessage": "Estás viendo una demo de Piwik",
"YouMustBeLoggedIn": "Debe ingresar para acceder a esta funcionalidad.",
"YourChangesHaveBeenSaved": "Se han guardado los cambios."
},
diff --git a/lang/et.json b/lang/et.json
index c610b75d91..69b3e2b5f1 100644
--- a/lang/et.json
+++ b/lang/et.json
@@ -1,5 +1,7 @@
{
"General": {
+ "12HourClock": "12-tunnine kell",
+ "24HourClock": "24-tunnine kell",
"AbandonedCarts": "Hüljatud ostukorvid",
"AboutPiwikX": "Lisainfo Piwik %s",
"Action": "Tegevus",
@@ -10,6 +12,7 @@
"AllWebsitesDashboard": "Kõigi veebilehtede töölaud",
"And": "ja",
"API": "API",
+ "Apply": "Rakenda",
"AuthenticationMethodSmtp": "SMTP serveri autentimismeetod",
"AverageOrderValue": "Keskmine tellimuse väärtus",
"AveragePrice": "Keskmine hind",
@@ -24,6 +27,7 @@
"ClickHere": "Vajuta siia lisainfo saamiseks.",
"ClickToChangePeriod": "Vajuta siia perioodi muutmiseks.",
"Close": "Sulge",
+ "ClickToSearch": "Vajuta et otsida",
"ColumnActionsPerVisit": "Tegevusi külastuse jooksul",
"ColumnActionsPerVisitDocumentation": "Keskmine tegevuste (lehe vaatamine, lehe otsing, allalaadimine või väljuv link) arv külastuste jooksul.",
"ColumnAverageGenerationTime": "Keskmine lehe genereerimise aeg",
@@ -60,6 +64,7 @@
"ColumnVisitsWithConversions": "Külastused tulu tekitamisega",
"Continue": "Jätka",
"ContinueToPiwik": "Jätka Piwiku kasutamist",
+ "CreatedByUser": "loonud %s",
"CurrentMonth": "Praegune kuu",
"CurrentWeek": "Praegune nädal",
"CurrentYear": "Praegune aasta",
@@ -110,6 +115,7 @@
"Forums": "Foorumid",
"FromReferrer": "tuli",
"GeneralInformation": "Üldine info",
+ "General": "Üldine",
"GetStarted": "Alusta kasutamist",
"GiveUsYourFeedback": "Tagasiside!",
"Goal": "Eesmärk",
@@ -155,6 +161,7 @@
"Name": "Nimi",
"NbActions": "Tegevuste arv",
"NbSearches": "Sisemiste otsingute arv",
+ "NeedMoreHelp": "Vajad rohkem abi?",
"Never": "Mitte kunagi",
"NewUpdatePiwikX": "Uus uuendus: Piwik %s",
"NewVisitor": "Uus külaline",
@@ -166,6 +173,7 @@
"NotDefined": "%s on defineerimata",
"Note": "Märkus",
"NotInstalled": "Pole paigaldatud",
+ "NotRecommended": "pole soovituslik",
"NotValid": "%s ei ole kehtiv",
"NumberOfVisits": "Külastuste arv",
"NUsers": "%s kasutajaid",
@@ -186,8 +194,11 @@
"OperationIsNot": "Ei ole",
"OperationLessThan": "Vähem kui",
"OperationNotEquals": "Ei võrdu",
+ "OperationStartsWith": "Algab",
+ "OperationEndsWith": "Lõppeb",
"OptionalSmtpPort": "Valikuline. Vaikimisi 25 kaitsmata ja TLS ning 465 krüpteeritud SSL SMTP jaoks.",
"Options": "Valikud",
+ "Or": "või",
"OrCancel": "või %1$s Katkesta %2$s",
"Others": "Teised",
"Outlink": "Väljuv link",
@@ -215,6 +226,7 @@
"Quantity": "Kogus",
"RangeReports": "Enda määratud ajavahemik",
"ReadThisToLearnMore": "%1$sLoe seda, et õppida rohkem.%2$s",
+ "Recommended": "Soovituslik",
"RecordsToPlot": "Väljastatavad tulemused",
"Refresh": "Värskenda",
"RefreshPage": "Värskenda lehte",
@@ -256,6 +268,9 @@
"Total": "Kokku",
"TotalRatioTooltip": "See on %1$s kõigist %2$s %3$s.",
"TotalRevenue": "Kogutulu",
+ "TrackingScopeAction": "Tegevus",
+ "TrackingScopePage": "Lehekülg",
+ "TrackingScopeVisit": "Külastus",
"TransitionsRowActionTooltip": "Vaata mida külastajad tegid enne ja peale selle lehe vaatamist",
"TransitionsRowActionTooltipTitle": "Ava üleminekud",
"TranslatorName": "<a href=\"http:\/\/ee.linkedin.com\/in\/aivokoger\/\">Aivo Koger<\/a>, Kaido Toomingas",
@@ -281,6 +296,7 @@
"Visitors": "Külastajad",
"VisitsWith": "Külastused koos %s",
"VisitorSettings": "Külastajate seaded",
+ "VisitType": "Külastuse tüüp",
"Warning": "Hoiatus",
"Website": "Veebileht",
"Weekly": "Iganädalane",
@@ -288,6 +304,7 @@
"WeeklyReports": "Iganädalased raportid",
"WellDone": "Hästi tehtud!",
"Widgets": "Moodulid",
+ "Widget": "Moodul",
"XComparedToY": "%1$s võrreldes %2$s",
"XFromY": "%1$s, tuli: %2$s",
"YearlyReport": "iga-aastane",
@@ -310,11 +327,14 @@
"AnonymousTracking": "Anonüümne info kogumine",
"ChooseMetric": "Vali mõõdik",
"ChooseReport": "Vali raport",
+ "ChooseSegment": "Vali segment",
"ConfirmRemoveAccount": "Kas sa soovid eemaldada antud kontot?",
"DefaultReportDate": "Raporti kuupäev",
"EmailUs": "Kirjuta meile",
"EnableGraphsLabel": "Kuva graafikud",
"EvolutionGraph": "Ajalooline graafik",
+ "HttpTimeout": "HTTP Timeout",
+ "LastUpdated": "Viimati uuendatud: %s",
"LoadingReport": "Laen %s",
"LoginCredentials": "Mandaadid",
"LoginUseHttps": "Kasuta https ühendust",
diff --git a/lang/fa.json b/lang/fa.json
index 248c7712e4..20adc1c540 100644
--- a/lang/fa.json
+++ b/lang/fa.json
@@ -1,5 +1,7 @@
{
"General": {
+ "12HourClock": "زمان 12 ساعته",
+ "24HourClock": "زمان 24 ساعته",
"AbandonedCarts": "سبد خرید رهاشده",
"AboutPiwikX": "درباره ی پیویک %s",
"Action": "فعالیت",
@@ -7,7 +9,7 @@
"Add": "افزودن",
"AfterEntry": "پس از ورود به اینجا",
"All": "همه",
- "AllowPiwikArchivingToTriggerBrowser": "آرشیو گزارش‌ها زمان نمایش از مرورگر",
+ "AllowPiwikArchivingToTriggerBrowser": "آرشیو گزارش‌ها زمان نمایش در مرورگر",
"AllWebsitesDashboard": "داشبورد همه وبسايت‌ها",
"And": "و",
"API": "API",
@@ -15,32 +17,33 @@
"ArchivingInlineHelp": "توصیه می‌شود برای وبسایت‌های با ترافیک متوسط یا بالا گزینه آرشیو پیویک از مرورگر غیر فعال شود. بجای آن توصیه می‌کنیم تا یک cron job برای پردازش گزارش‌ها هر یک ساعت راه‌اندازی شود.",
"ArchivingTriggerDescription": "شما به %1$sراه‌اندازی یک cron job%2$s برای پردازش خودکار گزارش‌ها نیاز دارید.",
"AuthenticationMethodSmtp": "روش تایید هویت برای SMTP",
- "AverageOrderValue": "ارزش ترتیبی متوسط",
- "AveragePrice": "قیمت متوسط",
+ "AverageOrderValue": "مقدار متوسط ترتیب",
+ "AveragePrice": "متوسط قیمت",
"AverageQuantity": "متوسط تعداد",
"BackToPiwik": "بازگشت به پیویک",
"Broken": "از کار افتاده",
- "BrokenDownReportDocumentation": "ین است که به گزارش های مختلف، که در پایین صفحه نمایش داده شده در خطوط جرقه خراب است. شما می توانید نمودار را با کلیک کردن بر روی این گزارش شما می خواهم برای دیدن تصویر را بزرگ تر ببینید.",
+ "BrokenDownReportDocumentation": "در گزارش‌های مختلف که در پایین صفحه به صورت متمایز نمایش داده شده‌اند، تقسیم شده است. شما می‌توانید با کلیک بر روی هر کدام از نمودارها که تمایل دارید، آن را با جزییات بیشتر ببینید .",
"Cancel": "لغو",
- "CannotUnzipFile": "فایل %1$s: %2$s نمی تواند از حالت فشرده خارج شود",
+ "CannotUnzipFile": "فایل %1$s: %2$s نتوانست از حالت فشرده خارج شود",
"ChangePassword": "تغییر کلمه عبور",
"ChangeTagCloudView": "لطفا توجه داشته باشید که شما می توانید این گزارش را در راه های دیگر به عنوان یک ابر برچسب مشاهده است. استفاده از کنترل در پایین گزارش به انجام این کار است.",
+ "ChooseDate": "انتخاب تاریخ، تاریخ کنونی: %s",
"ChooseLanguage": "انتخاب زبان",
- "ChoosePeriod": "انتخاب دوره",
- "ClickHere": "برای اطلاعات بیشتر اینجا کلیک کنید",
- "ClickToChangePeriod": "برای تغییر بازه دوباره کلیک کنید.",
+ "ChoosePeriod": "انتخاب بازه",
+ "ClickHere": "برای اطلاعات بیشتر کلیک کنید",
+ "ClickToChangePeriod": "برای تغییر بازه یک بار دیگر کلیک کنید.",
"Close": "بستن",
"ClickToSearch": "برای جستجو کلیک کنید",
- "ColumnActionsPerVisit": "عملیات در هر بازدید",
+ "ColumnActionsPerVisit": "فعالیت‌ها در هر بازدید",
"ColumnActionsPerVisitDocumentation": "میانگین تعداد عملیاتی (صفحات بازدید شده ، دانلودها و لینکهای بیرونی)که در طی بازدید انجام شده است.",
- "ColumnAverageGenerationTime": "میانگین زمان ایجاد",
- "ColumnAverageTimeOnPage": "میانگین زمان سپری شده بر روی صفحه",
+ "ColumnAverageGenerationTime": "میانگین زمان تولید",
+ "ColumnAverageTimeOnPage": "میانگین زمان سپری شده در صفحه",
"ColumnAverageTimeOnPageDocumentation": "مقدار به طور متوسط ​​از بازدید کنندگان زمان صرف شده در این صفحه (فقط صفحه، کل وب سایت نیست).",
"ColumnAvgTimeOnSite": "میانگین زمان سپری شده روی وبسایت",
"ColumnAvgTimeOnSiteDocumentation": "میانگین زمان سپری شده در یک بازدید",
- "ColumnBounceRate": "نرخ بونس",
+ "ColumnBounceRate": "میزان پس‌زدگی - بانس ریت",
"ColumnBounceRateDocumentation": "درصد از بار مشاهده شده است که فقط نمایش صفحه واحد. این به اینمعنی است که بازدید کننده وب سایت را ترک کرد به طور مستقیم از صفحه ورودی.",
- "ColumnBounces": "پس زده",
+ "ColumnBounces": "پس زدگی",
"ColumnBouncesDocumentation": "بازدیدکننده داشته است است که آغاز شده و به پایان رسید در این صفحه آدرس ایمیل خود را در زیر وارد نموده و کلید خرید با پرداخت اینترنتی را بزنید. این به این معنی است که بازدید کننده وب سایت پس از مشاهده فقط این صفحه را ترک کردند.",
"ColumnConversionRate": "نرخ تبدیل",
"ColumnConversionRateDocumentation": "درصد بازدیدهایی که به هدف رسیده اند",
@@ -79,7 +82,8 @@
"ColumnVisitDuration": "طول زمان بازدید (بر اساس ثانیه)",
"ColumnVisitsWithConversions": "بازدید های موثر",
"Continue": "ادامه",
- "ContinueToPiwik": "همچنان پیویک را دنبال کنید",
+ "ContinueToPiwik": "ادامه در پیویک",
+ "CreatedByUser": "ایجادشده توسط %s",
"CurrentMonth": "ماه جاری",
"CurrentWeek": "هفته جاری",
"CurrentYear": "سال جاری",
@@ -94,6 +98,7 @@
"DateRange": "بازه زمانی:",
"DateRangeFrom": "از",
"DateRangeFromTo": "از %1$s تا %2$s",
+ "DateRangeInPeriodList": "بازه تاریخ",
"DateRangeTo": "به",
"DaysHours": "%1$s روز %2$s ساعت",
"DaysSinceFirstVisit": "روز بعد از اولین بازدید",
@@ -125,6 +130,9 @@
"EncryptedSmtpTransport": "رمزگذاری لایه انتقال مورد نیاز توسط سرور SMTP خود را وارد کنید.",
"Error": "خطا",
"EvolutionOverPeriod": "تکامل در طول دوره",
+ "EvolutionSummaryGeneric": "%1$s در %2$s درمقایسه با %3$s در %4$s. چرخه: %5$s",
+ "ExceptionContactSupportGeneric": "اگر هنوز با مشکل روبرو هستید، لطفاً برای راهنمایی با %1$sادمین پیویک خود تماس بگیرید%2$s.",
+ "ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "کاربر باید یا سطح دسترسی مدیر ارشد را داشته باشد یا خود کاربر '%s باشد.",
"ExceptionConfigurationFileNotFound": "فایل تنظیمات {%s} یافت نشد.",
"ExceptionFileIntegrity": "بررسی درستی شکست خورد: %s",
"ExceptionFilesizeMismatch": "اندازه فایل اشتباه است: %1$s (اندازه مورد انتظار:%2$s , اندازه کنونی:%3$s)",
@@ -203,7 +211,7 @@
"NbSearches": "تعداد جستجوهای داخلی",
"Never": "هرگز",
"NewReportsWillBeProcessedByCron": "هنگامی که Piwik آرشیو توسط مرورگر نمی شود، گزارش های جدید خواهد شد به crontab پردازش شده است.",
- "NewUpdatePiwikX": "آپدیت جدید: Piwik %s",
+ "NewUpdatePiwikX": "آپدیت تازه: Piwik %s",
"NewVisitor": "بازدید کننده جدید",
"NewVisits": "بازدید جدید",
"Next": "بعدی",
@@ -247,12 +255,13 @@
"Password": "رمزعبور",
"Period": "دوره",
"Piechart": "نمودار دایره ای",
- "PiwikXIsAvailablePleaseUpdateNow": "پیویک %1$s آماده است. %2$s لطفا هم اکنون بروزرسانی کنید! %3$s (%4$sتغییرات %5$s را ببینید).",
+ "PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s آماده است. لطفاً به %2$sادمین پیویک%3$s خود اطلاع دهید.",
+ "PiwikXIsAvailablePleaseUpdateNow": "پیویک %1$s آماده است. %2$s لطفاً هم‌اکنون بروزرسانی کنید! %3$s (مشاهده %4$sتغییرات%5$s).",
"PleaseSpecifyValue": "لطفا یک مقدار برای \"%s\" مشخص کنید.",
- "PleaseUpdatePiwik": "لطفا Piwik خود را بروزرسانی کنید.",
+ "PleaseUpdatePiwik": "لطفاً نسخه پیویک خود را بروزر کنید.",
"Plugin": "افزونه",
"Plugins": "افزونه ها",
- "PoweredBy": "نیرو گرفته به وسیله",
+ "PoweredBy": "نیرو گرفته از",
"Previous": "قبلی",
"PreviousDays": "روزهای %s قبلی (بجز امروز)",
"PreviousDaysShort": "%s روز پیش",
@@ -300,7 +309,7 @@
"SmtpServerAddress": "آدرس SMTP سرور",
"SmtpUsername": "نام کاربری SMTP",
"Source": "منبع",
- "StatisticsAreNotRecorded": "ردیاب بازدیدکننده ی پیویک هم اکنون غیرفعال است! ردیاب را با تنظیم record_statistics = 1 در فایل config\/config.ini.php دوباره فعال کنید.",
+ "StatisticsAreNotRecorded": "رهگیری بازدیدکننده پیویک هم اکنون غیرفعال است! فعالسازی مجدد با تنظیم record_statistics = 1 در فایل config\/config.ini.php امکان‌پذیر است.",
"Subtotal": "جمع کل",
"Summary": "خلاصه",
"Table": "جدول",
@@ -336,8 +345,9 @@
"VisitorSettings": "تنظیمات بازدید کننده",
"VisitTypeExample": "به عنوان مثال، برای انتخاب تمام بازدید کنندگان که به وب سایت،از جمله کسانی که چیزی در بازدیدکننده داشته است گذشته خود را خریداری بازگردانده، درخواست API حاوی %s",
"Warning": "هشدار",
+ "WarningPiwikWillStopSupportingPHPVersion": "پیویک در نسخه اصلی آینده خود دیگر از PHP %1$s پشتیبانی نخواهد کرد. پس قبل از آنکه خیلی دیر شود نخسه خود را به PHP %2$s ارتقاع دهید!",
"WarningFileIntegrityNoManifest": "چک کردن فایل یکپارچگی می تواند انجام نمی شود به دلیل از دست رفته manifest.inc.php.",
- "WarningFileIntegrityNoManifestDeployingFromGit": "اگر شما در حال توسعه پیویک به کمک Git هستید ، این پیغام عادی است.",
+ "WarningFileIntegrityNoManifestDeployingFromGit": "اگر شما پیویک را از گیت (Git) دریافت کرده‌اید، این پیام عادی است.",
"WarningFileIntegrityNoMd5file": "کنترل یکپارچگی فایل نمی تواند به دلیل md5_file گم شده تابع () تکمیل شده است.",
"WarningPasswordStored": "%1$sهشدار: %2$s این رمزعبور در فایل تنظیمات ذخیره خواهد شد که قابل مشاهده برای هرکسی است که به آن دسترسی دارد.",
"Website": "وب سایت",
@@ -352,7 +362,8 @@
"YearlyReports": "گزارش سالانه",
"YearsDays": "%1$s سال ها %2$s روز ها",
"Yes": "بلی",
- "YouAreCurrentlyUsing": "شما هم اکنون از پیوک %s استفاده می کنید.",
+ "YouAreCurrentlyUsing": "شما هم اکنون از پیوک نسخه %s استفاده می‌کنید.",
+ "YouAreViewingDemoShortMessage": "شما نسخه آزمایشی پیویک را مشاهده می‌کنید.",
"YouMustBeLoggedIn": "برای دسترسی به این قابلیت شما باید وارد سیستم شوید.",
"YourChangesHaveBeenSaved": "تغییرات شما دخیره شد."
},
@@ -376,29 +387,29 @@
"EmailUs": "به ما ایمیل بزنید",
"EnableGraphsLabel": "نمایش نمودارها",
"EvolutionGraph": "نمودار زمانی",
- "HelpUsToImprovePiwikMobile": "آیا مایل هستید به کار بردن ردیابی را برای ناشناس ها در پیویک موبایل غعال کنید؟",
+ "HelpUsToImprovePiwikMobile": "آیا مایل هستید به کار بردن ردیابی را برای ناشناس ها در پیویک موبایل فعال کنید؟",
"HowtoDeleteAnAccount": "به مدت طولانی نگه دارید تا اکانت حذف شود.",
- "HowtoDeleteAnAccountOniOS": "کش رفتن از چپ به راست برای حذف یک حساب کاربری",
- "HowtoLoginAnonymous": "خروج از نام کاربری و رمز عبور خالی برای ورود به صورت ناشناس",
+ "HowtoDeleteAnAccountOniOS": "برای حذف حساب کاربری از راست به چپ بکشید.",
+ "HowtoLoginAnonymous": "برای ورود ناشناس نام کاربری و رمز عبور را خالی بگذارید",
"HttpIsNotSecureWarning": "Piwik اجازه شما نشانه (token_auth) را در متن روشن فرستاده، اگر شما استفاده از 'HTTP'. به همین دلیل توصیه می کنیم HTTPS را برای انتقال امن اطلاعات بر روی اینترنت است. آیا می خواهید ادامه دهید؟",
- "HttpTimeout": "HTTP ناموفق",
+ "HttpTimeout": "HTTP Timeout",
"IncompatiblePiwikVersion": "نسخه پیویک که از آن استفاده می‌کنید با پیویک موبایل 2 سازگار نیست. نسخه نصب شده پیویک خود را ارتقا دهید و دوباره سعی کنید. یا می‌توانید از پیویک موبایل نسخه 1 استفاده کنید.",
"LastUpdated": "آخرین بروزرسانی: %s",
- "LoadingReport": "در حال لود %s",
+ "LoadingReport": "در حال بارگذاری %s",
"LoginCredentials": "اعتبار نامه",
"LoginToPiwikToChangeSettings": "به سرور پیویک خود وارد شوید تا بتوانید وبسایت‌ها و کاربران تازه ایجاد کنید یا آن‌ها را بروز کنید. همچنین برای تغییر تنظیمات کلی همانند «گزارش برای بارگزاری به‌صورت پیشفرض»",
- "LoginUseHttps": "از پروتکل امن(https)استفاده کن",
- "MultiChartLabel": "نمایش sparklines",
- "NavigationBack": "به عقب",
- "NetworkError": "ارور شبکه",
- "NetworkErrorWithStatusCodeShort": "ارور شبکه %s",
+ "LoginUseHttps": "استفاده از HTTPS",
+ "MultiChartLabel": "نمایش نمودار خطی",
+ "NavigationBack": "بازگشت",
+ "NetworkError": "خطای شبکه",
+ "NetworkErrorWithStatusCodeShort": "خطای شبکه %s",
"NetworkNotReachable": "شبکه در دسترس نیست",
"NoAccountIsSelected": "شما باید یک حساب کاربری را انتخاب کنید. اگر یک حساب تنظیم شده ندارید، یک حساب جدید ایجاد کنید.",
- "NoDataShort": "بدون اطلاعات",
- "NoPiwikAccount": "هنوز حساب کاربری ندارید؟",
+ "NoDataShort": "بدون داده",
+ "NoPiwikAccount": "حساب کاربری پیویک ندارید؟",
"NoReportsShort": "بدون گزارش",
- "NoVisitorFound": "بازدید کننده ای یافت نشد",
- "NoVisitorsShort": "بدون بازدید کننده",
+ "NoVisitorFound": "هیچ بازدیدکننده‌ای یافت نشد",
+ "NoVisitorsShort": "بدون بازدیدکننده",
"NoWebsiteFound": "وب سایتی یافت نشد",
"NoWebsitesShort": "وب سایتی پیدا نشد",
"PullDownToRefresh": "پایین اوردن به تجدید ...",
@@ -411,7 +422,7 @@
"Reloading": "بارگزاری دوباره...",
"RequestTimedOutShort": "ارور خارج شدن شبکه از دسترس",
"RestrictedCompatibility": "سازگاری محدود شده است",
- "SaveSuccessError": "لطفا تایید تنظیمات",
+ "SaveSuccessError": "آدرس پیویک یا ترکیب نام کاربری و رمز عبور اشتباه است.",
"SearchWebsite": "وب سایت جستجو",
"ShowAll": "همه را نشان بده",
"ShowLess": "نشان دادن کمتر",
@@ -419,6 +430,7 @@
"TopVisitedWebsites": "بهترین بازدیدهای سایت",
"TryIt": "سعی کنید.",
"VerifyAccount": "بررسی حساب",
+ "ValidateSslCertificate": "اعتبارسنجی گواهینامه SSL",
"VerifyLoginData": "مطمئن شوید که نام کاربری و رمزعبورتان صحیح می باشد.",
"YouAreOffline": "با عرض پوزش , شما در حال حاضر برخط نیستید."
},
@@ -428,7 +440,7 @@
"CompareRows": "مقایسه سوابق",
"ComparingRecords": "مقایسه %s ردیف",
"Documentation": "با کلیک روی معیارها در نمودار تکامل بزرگ نشان داده می شوند. برای نشان دادن معیارهای چندگانه به صورت یکجا از SHIFT-کلیک استفاده کنید.",
- "MetricBetweenText": "بین %1$s و %2$s",
+ "MetricBetweenText": "از %1$s تا %2$s",
"MetricChangeText": "%s تغییر در طول دوره",
"MetricMinMax": "%1$s در بازه مابین %2$s و %3$s در طول دوره",
"MetricsFor": "معیارها برای %s",
diff --git a/lang/fr.json b/lang/fr.json
index 7331784560..c1c5b55dd8 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -86,6 +86,7 @@
"ConfigFileIsNotWritable": "Le fichier de configuration de Piwik %1$s n'a pas la permission d'écriture, vos modifications ne seront pas sauvegardées. %2$s Merci de modifier les permissions du fichier de configuration de manière à le rendre accessible en écriture.",
"Continue": "Continuer",
"ContinueToPiwik": "Continuer vers Piwik",
+ "CurrentlyUsingUnsecureHttp": "Vous utilisez Piwik en mode HTTP non sécurisé, ce qui peut être dangereux. Nous vous recommandons de configurer Piwik pour utiliser SSL (HTTPS) afin d'accroître la sécurité.",
"CreatedByUser": "créé par %s",
"CurrentMonth": "Mois courant",
"CurrentWeek": "Semaine courante",
@@ -139,7 +140,8 @@
"ExceptionContactSupportGeneric": "Si vous avez toujours ce problème veuillez %1$scontacter votre administrateur Piwik%2$s pour obtenir de l'aide.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "L'utilisateur doit être un Super Utilisateur ou l'utilisateur \"%s\" lui-même.",
"ExceptionConfigurationFileNotFound": "Le fichier de configuration {%s} n'a pas été trouvé",
- "ExceptionConfigurationFileNotFound2": "Si le fichier existe, veuillez vérifier que %1$s est lisible pour l'utilisateur '%2$s'.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Le fichier de configuration %s semble exister mais Piwik n'arrive pas à le lire.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Merci de vérifier que %1$s est lisible par l'utilisateur '%2$s'",
"ExceptionDatabaseVersion": "Votre version de %1$s est %2$s mais Piwik a besoin au minimum de la version %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Votre installation de Piwik fonctionne sur l'ancienne version %1$s et nous avons détecté que votre base de données a été mise à jour vers la version plus récente %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Peut-être que vos administrateurs Piwik sont en train de terminer le processus de mise à jour en ce moment. Veuillez réessayer dans quelques minutes.",
@@ -230,6 +232,7 @@
"Name": "Nom",
"NbActions": "Nombre d'actions",
"NbSearches": "Nombre de recherche interne",
+ "NeedMoreHelp": "Besoin d'aide ?",
"Never": "Jamais",
"NewReportsWillBeProcessedByCron": "Quand l'archivage de Piwik n'est pas déclenché par le navigateur, les nouveaux rapports seront générés par la crontab.",
"NewUpdatePiwikX": "Nouvelle mise à jour : Piwik %s",
@@ -283,7 +286,7 @@
"Password": "Mot de passe",
"Period": "Période",
"Piechart": "Camembert",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s est un projet collaboratif réalisé pour vous par les membres de %7$sl'équipe Piwik%8$s ainsi que de nombreux autres contributeurs du monde entier. Si vous êtes fan de Piwik, vous pouvez aider: trouvez %3$scomment participer à Piwik%4$s, ou %5$sdonnez maintenant%6$s pour aider à financer Piwik 3.0!",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s est un projet collaboratif réalisé pour vous par les membres de %7$sl'équipe Piwik%8$s ainsi que de nombreux autres contributeurs du monde entier.<br \/> Si vous êtes fan de Piwik, vous pouvez aider: trouvez %3$scomment participer à Piwik%4$s, ou %5$sdonnez maintenant%6$s pour aider à financer Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s est disponible. Veuillez informer %2$sl'administrateur Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s est maintenant disponible. %2$s Merci de mettre à jour!%3$s (voir %4$s les modifications%5$s).",
"PleaseSpecifyValue": "Merci de spécifier une valeur pour %s",
diff --git a/lang/he.json b/lang/he.json
index ad2e793d56..54e2fca1f0 100644
--- a/lang/he.json
+++ b/lang/he.json
@@ -9,6 +9,7 @@
"AllWebsitesDashboard": "פאנל סקירה לכל האתרים",
"And": "ו",
"API": "API",
+ "Apply": "החל",
"ArchivingInlineHelp": "עבור אתרים בעלי תעבורה בינוניתעד גבוהה, מומלץ לבטל את ארכיון Piwik בעת צפייה דרך הדפדפן בדוחות. במקום זאת, מומלץ להגדיר עבודה כרונית (cron job) שתעבד דוחות Piwik בכל שעה.",
"ArchivingTriggerDescription": "מומלץ להתקנות גדולות יותר של Piwik, צריך %1$sלהגדיר עבודה כרונית%2$s שתעבד את הדוחות אוטומטית.",
"AuthenticationMethodSmtp": "שיטת אימות עבור SMTP",
@@ -147,6 +148,7 @@
"Others": "אחרים",
"Outlinks": "קישורים יוצאים",
"Overview": "מבט כללי",
+ "Pages": "עמודים",
"Password": "סיסמה",
"Period": "תקופה",
"Piechart": "גרף עוגה",
@@ -237,7 +239,8 @@
"HelpUsToImprovePiwikMobile": "האם ברצונך לשפעל איסוף נתונים אנונימי ב-Piwik בנייד?",
"HowtoDeleteAnAccount": "לחץ לחיצה ארוכה כדי להסיר את החשבון",
"HowtoDeleteAnAccountOniOS": "גרור שמאלה כדי למחוק את החשבון",
- "HowtoLoginAnonymous": "השאר את שם המשתמש והסיסמא ריקים כדי להתחבר אנונימית"
+ "HowtoLoginAnonymous": "השאר את שם המשתמש והסיסמא ריקים כדי להתחבר אנונימית",
+ "NavigationBack": "חזרה"
},
"RowEvolution": {
"AvailableMetrics": "מדדים זמינים",
diff --git a/lang/id.json b/lang/id.json
index 32d01c7113..220be335cf 100644
--- a/lang/id.json
+++ b/lang/id.json
@@ -137,7 +137,6 @@
"ExceptionContactSupportGeneric": "Bila Anda tetap mengalami kendala, silakan %1$shubungi pengelola Piwik Anda%2$s untuk bantuan.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Pengguna harus menjadi Pengguna Super atau pengguna '%s' itu sendiri.",
"ExceptionConfigurationFileNotFound": "Berkas konfigurasi {%s} tak ditemukan.",
- "ExceptionConfigurationFileNotFound2": "Bila berkas tersebut ada, harap memeriksa bahwa berkas %1$s dapat dibaca oleh pengguna '%2$s'.",
"ExceptionDatabaseVersion": "Versi %1$s Anda adalah %2$s, tetapi Piwik membtuhkan setidaknya versi %3$s.",
"ExceptionFileIntegrity": "Pemerikasaa intergritas gagal: %s",
"ExceptionFilesizeMismatch": "Ukuran berkas tak sesuai: %1$s (diharapkan panjang: %2$s, ditemukan: %3$s)",
diff --git a/lang/is.json b/lang/is.json
index 6e74149762..f508d9b9f3 100644
--- a/lang/is.json
+++ b/lang/is.json
@@ -3,17 +3,14 @@
"AboutPiwikX": "Um Piwik %s",
"Action": "Aðgerð",
"Actions": "Aðgerðir",
- "AllowPiwikArchivingToTriggerBrowser": "Leyfa Piwik geymslu kveikjun þegar skýrslur eru skoðaðar í vafranum",
"AllWebsitesDashboard": "Skjáborð fyrir alla vefi",
"API": "API",
"ArchivingInlineHelp": "Á meðal til hárrar umferðar vefna er mælst til þess að óvirkja Piwik geymslu sem kveikt er á frá vafra. Þess í stað mælum við með að þú setjir upp cronfærslu sem vinnur skýrslurnar á hverri klukkustund",
- "ArchivingTriggerDescription": "Mælt er með fyrir stærri Piwik uppsetningar að þú þurfir að %ssetja upp cronfærslu%s til að vinna skýrslurnar sjálfkrafa",
+ "ArchivingTriggerDescription": "Mælt er með fyrir stærri Piwik uppsetningar að þú þurfir að %1$ssetja upp cronfærslu%2$s til að vinna skýrslurnar sjálfkrafa",
"BackToPiwik": "Aftur í Piwik",
"ChangePassword": "Breyta lykilorði",
- "ChooseDate": "Veldu dagsetningu",
"ChooseLanguage": "Veldu tungumál",
"ChoosePeriod": "Veldu tímabil",
- "ChooseWebsite": "Veldu vef",
"Close": "Loka",
"ColumnActionsPerVisit": "Aðgerðir per heimsókn",
"ColumnAverageTimeOnPage": "Meðaltími eytt á síðu",
@@ -83,7 +80,7 @@
"LoadingData": "Sækir gögn...",
"Locale": "is_IS.UTF-8",
"Logout": "Útskrá",
- "MediumToHighTrafficItIsRecommendedTo": "Á vefsvæðum með umferð yfir meðallagi, er mælt með að úrvinnsla skýrslna sé ekki framkvæmd tíðar en á hálftíma fresti (%s sekúndur) eða á klukkustundar fresti (%s seconds).",
+ "MediumToHighTrafficItIsRecommendedTo": "Á vefsvæðum með umferð yfir meðallagi, er mælt með að úrvinnsla skýrslna sé ekki framkvæmd tíðar en á hálftíma fresti (%1$s sekúndur) eða á klukkustundar fresti (%2$s seconds).",
"MinutesSeconds": "%1$s mín %2$ss",
"Monthly": "Mánaðalega",
"MultiSitesSummary": "Allir vefir",
@@ -95,14 +92,13 @@
"NoDataForGraph": "Engin gögn fyrir þetta graf.",
"NoDataForTagCloud": "Engin gögn fyrir þetta klisjuský.",
"NotValid": "%s er ekki gilt",
- "NSeconds": "%s sekúndur",
"NVisits": "%s heimsóknir",
"Ok": "Ok",
"OnlyEnterIfRequired": "Einungis slá inn notendanafn ef SMTP þjónninn krefst þess.",
"OnlyEnterIfRequiredPassword": "Einungis slá inn lykilorð ef SMTP þjónninn krefst þess.",
"OpenSourceWebAnalytics": "Opin hugbúnaðar vefgreining",
"OptionalSmtpPort": "Valmögulegt. Sjálgefið er gátt 25 fyrir ódulkóðuð samskipti og einnig fyrir TLS SMTP, en gátt 465 fyrir dulkóða SSL SMTP samskipti.",
- "OrCancel": "eða %s hætta við %s",
+ "OrCancel": "eða %1$s hætta við %2$s",
"Others": "Aðrir",
"Outlinks": "Hlekkir út",
"Overview": "Yfirlit",
@@ -124,8 +120,7 @@
"Save": "Vista",
"SaveImageOnYourComputer": "Til að vista myndina á tölvunni þinni, þarf að hægrismella á myndina og velja \"Vista mynd sem...\"",
"Search": "Leita",
- "Seconds": "%ss",
- "SeeTheOfficialDocumentationForMoreInformation": "Sjá frekari upplýsingar í gögnunum%sofficial documentation%s",
+ "SeeTheOfficialDocumentationForMoreInformation": "Sjá frekari upplýsingar í gögnunum %1$sofficial documentation%2$s",
"SelectYesIfYouWantToSendEmailsViaServer": "Veldu \"Já\" ef þig langar að verður að senda tölvupóst í gegnum nefndan þjón í staðin fyrir staðbundna póstvirkni",
"Settings": "Stillingar",
"SmallTrafficYouCanLeaveDefault": "Á vefjum með litla umferðgeturðu notað sjálfgefna tímann %s sekúndur, og skoðað skýrlurnar í rauntíma.",
@@ -146,13 +141,12 @@
"Visitors": "Gestir",
"VisitorSettings": "Stillingar gesta",
"Warning": "Aðvörun",
- "WarningPasswordStored": "%sVarist:%s Þetta lykilorð mun vera vistað í stillingar skrá sem er sýnileg öllum sem hafa næga aðgangsheimild.",
+ "WarningPasswordStored": "%1$sVarist:%2$s Þetta lykilorð mun vera vistað í stillingar skrá sem er sýnileg öllum sem hafa næga aðgangsheimild.",
"Website": "Vefur",
"Weekly": "Vikulega",
"Widgets": "aukahlutir",
"YearsDays": "%1$s ár %2$s dagar",
"Yes": "Já",
- "YouAreViewingDemoShortMessage": "Núna ertu að skoða tilraunaútgáfu af Piwik",
"YouMustBeLoggedIn": "Þú verður að verainnskráð(ur) til að hafa aðgang að þessu.",
"YourChangesHaveBeenSaved": "Breytingarnarn þínar hafa verið vistaðar."
}
diff --git a/lang/it.json b/lang/it.json
index adbd85d363..7612c7c81e 100644
--- a/lang/it.json
+++ b/lang/it.json
@@ -140,7 +140,8 @@
"ExceptionContactSupportGeneric": "Se hai ancora questo problema %1$scontatta il tuo amministratore di Piwik%2$s per assistenza.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "L'utente deve essere un Super User o l'utente '%s' stesso.",
"ExceptionConfigurationFileNotFound": "Il file di configurazione {%s} non è stato trovato.",
- "ExceptionConfigurationFileNotFound2": "Se il file esiste, controlla che %1$s sia leggibile dall'utente '%2$s'.",
+ "ExceptionConfigurationFileExistsButNotReadable": "Sembra che il file di configurazione %s esista ma che Piwik non sia in grado di leggerlo.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Si prega di verificare che %1$s sia leggibile dall'utente '%2$s'.",
"ExceptionDatabaseVersion": "La tua %1$s versione è %2$s ma Piwik richiede almeno la %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Il tuo codice di Piwik è quello della vecchia versione %1$s mentre abbiamo rilevato che il database di Piwik è già stato aggiornato alla nuova versione %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Può darsi che i tuoi amministratori di Piwik al momento stiano terminando il processo di aggiornamento. Prova ancora tra qualche minuto.",
@@ -285,7 +286,7 @@
"Password": "Password",
"Period": "Periodo",
"Piechart": "Diagramma a torta",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s è un progetto in collaborazione portato a te dai membri del %7$steam di Piwik%8$s e da molti altri collaboratori in tutto il mondo. Se sei un fan di Piwik, puoi aiutare: guarda %3$sCome partecipare a Piwik%4$s, o %5$sdona adesso%6$s per aiutare a finanziare Piwik 3.0!",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s è un progetto in collaborazione che ti viene fornito dai membri del %7$sPiwik team%8$s e da molti altri collaboratori di tutto il mondo. <br\/>Se sei un fan di Piwik, puoi aiutare anche tu: scopri %3$sCome partecipare a Piwik%4$s, o %5$sdona adesso%6$s per aiutare a finanziare Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s è disponibile. Avvisa l'%2$samministratore di Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "È disponibile la versione %1$s di Piwik. %2$sAggiorna ora!%3$s (%4$svedi le modifiche%5$s).",
"PleaseSpecifyValue": "Per favore specifica un valore per '%s'.",
diff --git a/lang/ja.json b/lang/ja.json
index a76d0acd92..29af488328 100644
--- a/lang/ja.json
+++ b/lang/ja.json
@@ -136,7 +136,6 @@
"ExceptionContactSupportGeneric": "いまだにこの問題が発生する場合は、%1$s Piwik 管理者に連絡してください。 %2$s",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "ユーザーは、スーパーユーザーもしくはユーザー '%s' それ自身のいずれかである必要があります。",
"ExceptionConfigurationFileNotFound": "設定ファイル {%s} が見つかりませんでした",
- "ExceptionConfigurationFileNotFound2": "ファイルが存在する場合は、%1$s が '%2$s' のユーザーによって読み取り可能な事を確認してください。",
"ExceptionDatabaseVersion": "%1$s のバージョンが %2$s ですが、Piwik には少なくとも %3$s が必要となります。",
"ExceptionDatabaseVersionNewerThanCodebase": "Piwik コードベースが古いバージョン %1$s を実行し、Piwik データベースが既に新しいバージョン %2$s にアップグレードされたことを検出しました。",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "おそらく Piwik 管理者は現在、アップグレードプロセスを終了しています。数分後にもう一度お試しください。",
@@ -277,7 +276,6 @@
"Password": "パスワード",
"Period": "期間",
"Piechart": "円グラフ",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$s Piwik %2$s は、%7$s Piwik team %8$s メンバーだけでなく世界中の他の多くの貢献者による共同プロジェクトです。もし Piwik のファンになって頂けたら、ぜひ貢献してください。: %3$s How to participate in Piwik%4$s を読んで、Piwik 3.0 基金にご協力ください %5$s %6$s !",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s が利用可能です。ぜひ %2$sPiwik administrator%3$s に通知してください。",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s が利用可能です。 %2$s今すぐアップデートしてください!%3$s(%4$s変更点%5$sを参照)。",
"PleaseSpecifyValue": "'%s' の値を指定してください。",
diff --git a/lang/ka.json b/lang/ka.json
index fdeca6b312..5a4fc9d91d 100644
--- a/lang/ka.json
+++ b/lang/ka.json
@@ -3,18 +3,15 @@
"AboutPiwikX": "Piwik %s–ის შესახებ",
"Action": "ქმედება",
"Actions": "ქმედებები",
- "AllowPiwikArchivingToTriggerBrowser": "რეპორტების ბრაუზერიდან დათვალიერებისას ჩაირთოს Piwik არქივირება",
"AllWebsitesDashboard": "ყველა ვებ საიტის საერთო სტატისტიკა",
"API": "API",
"ArchivingInlineHelp": "საშუალო და მაღალი ტრაფიკის მქონე ვებ საიტებისთვის რეკომენდირებულია არ გამოიყენოთ Piwik არქივირების ჩართვა ბრაუზერიდან. ნაცვლად ამისა, ჩვენ გირჩევთ მოაწყოთ ქრონირების ფუნქცია ისე, რომ Piwik რეპორტები ყოველ საათში დამუშავდეს.",
- "ArchivingTriggerDescription": "რეკომენდირებული უფრო მსხვილი Piwik ინსტალაციების შემთხვევაში, თქვენ უნდა %sმოაწყოთ ქრონირების ფუნქცია%s ისე, რომ რეპორტები ავტომატურად დამუშავდეს.",
+ "ArchivingTriggerDescription": "რეკომენდირებული უფრო მსხვილი Piwik ინსტალაციების შემთხვევაში, თქვენ უნდა %1$sმოაწყოთ ქრონირების ფუნქცია%2$s ისე, რომ რეპორტები ავტომატურად დამუშავდეს.",
"AuthenticationMethodSmtp": "SMTP–ის აუტენთიფიკაციის მეთოდი",
"BackToPiwik": "Piwik–ზე დაბრუნება",
"ChangePassword": "პაროლის შეცვლა",
- "ChooseDate": "თარიღის არჩევა",
"ChooseLanguage": "აირჩიეთ ენა",
"ChoosePeriod": "აირჩიეთ პერიოდი",
- "ChooseWebsite": "აირჩიეთ ვებ საიტი",
"Close": "დახურვა",
"ColumnActionsPerVisit": "ქმედებები ვიზიტის დროს",
"ColumnAverageTimeOnPage": "საშ. დრო გვერდზე",
@@ -39,7 +36,7 @@
"ColumnUniquePageviews": "უნიკალური გვერდის ნახვები",
"ColumnValuePerVisit": "მნიშვნელობა ვიზიტზე",
"ColumnVisitsWithConversions": "გადმოსვლები რეკლამებიდან",
- "ConfigFileIsNotWritable": "Piwik კონფიგურაციის ფაილში %s ჩაწერა არ შეიძლება, თქვენს მიერ შეტანილი ცვლილებები შეიძლება არ შეინახოს. %s გთხოვთ, შეუცვალოთ კონფიგ ფაილს პარამეტრი და გახადოთ ის ჩაწერადი.",
+ "ConfigFileIsNotWritable": "Piwik კონფიგურაციის ფაილში %1$s ჩაწერა არ შეიძლება, თქვენს მიერ შეტანილი ცვლილებები შეიძლება არ შეინახოს. %2$s გთხოვთ, შეუცვალოთ კონფიგ ფაილს პარამეტრი და გახადოთ ის ჩაწერადი.",
"ContinueToPiwik": "Piwik მუშაობის გაგრძელება",
"CurrentMonth": "მიმდინარე თვე",
"CurrentWeek": "მიმდინარე კვირა",
@@ -71,20 +68,20 @@
"ExceptionFilesizeMismatch": "ფაილის ზომა არ ემთხვევა: %1$s (მოითხოვებოდა ზომა: %2$s, არის: %3$s)",
"ExceptionIncompatibleClientServerVersions": "თქვენი %1$s კლიენტის ვერსია არის %2$s, რაც არ არის თავსებადი სერვერის ვერსიასთან %3$s.",
"ExceptionInvalidArchiveTimeToLive": "დღეს არქივის სიცოცხლის დროის წამების რაოდენობა მეტი უნდა იყოს ნულზე",
- "ExceptionInvalidDateFormat": "თარიღის ფორმატი უნდა იყოს: %s ან რაიმე საკვანძო სიტყვა, რომელსაც %s ფუნქციის მხარდაჭერა აქვს (დამატებითი ინფორმაციისთვის იხ. %s)",
- "ExceptionInvalidDateRange": "თარიღი '%s' არ არის კორექტულად მითითებული. მას უნდა ქონდეს ასეთი ფორმატი: %s.",
- "ExceptionInvalidPeriod": "პერიოდი '%s' არასწორია. მის ნაცვლად ცადეთ აქედან რომელიმე: %s",
- "ExceptionInvalidRendererFormat": "რენდერერის ფორმატი '%s' ვალიდური არ არის. მის ნაცვლად ცადეთ აქედან რომელიმე: %s.",
+ "ExceptionInvalidDateFormat": "თარიღის ფორმატი უნდა იყოს: %1$s ან რაიმე საკვანძო სიტყვა, რომელსაც %2$s ფუნქციის მხარდაჭერა აქვს (დამატებითი ინფორმაციისთვის იხ. %3$s)",
+ "ExceptionInvalidDateRange": "თარიღი '%1$s' არ არის კორექტულად მითითებული. მას უნდა ქონდეს ასეთი ფორმატი: %2$s.",
+ "ExceptionInvalidPeriod": "პერიოდი '%1$s' არასწორია. მის ნაცვლად ცადეთ აქედან რომელიმე: %2$s",
+ "ExceptionInvalidRendererFormat": "რენდერერის ფორმატი '%1$s' ვალიდური არ არის. მის ნაცვლად ცადეთ აქედან რომელიმე: %2$s.",
"ExceptionInvalidToken": "მარკერი ვალიდური არაა.",
"ExceptionLanguageFileNotFound": "ენის ფაილი '%s' ვერ მოიძებნა.",
- "ExceptionMethodNotFound": "მეთოდი '%s' არ არსებობს ან '%s' მოდულში არ მუშაობს.",
+ "ExceptionMethodNotFound": "მეთოდი '%1$s' არ არსებობს ან '%2$s' მოდულში არ მუშაობს.",
"ExceptionMissingFile": "გამოტოვებული ფაილი: %s",
"ExceptionNonceMismatch": "ამ ფორმაზე უსაფრთხოების მარკერის შემოწმება ვერ მოხერხდა.",
"ExceptionPrivilege": "თქვენ ვერ ნახავთ ამ რესურს, რადგან ის მოითხოვს %s წვდომას.",
"ExceptionPrivilegeAccessWebsite": "თქვენ ვერ ნახავთ ამ რესურს, რადგან ის მოითხოვს %s წვდომას ვებ საიტზე id = %d.",
"ExceptionPrivilegeAtLeastOneWebsite": "თქვენ ვერ ნახავთ ამ რესურს, რადგან ის მოითხოვს %s წვდომას ერთ ვებ საიტზე მაინც.",
"ExceptionUndeletableFile": "%s–ის წაშლა ვერ მოხერხდა",
- "ExceptionUnreadableFileDisabledMethod": "კონფიგურაციის ფაილის {%s} წაკითხვა ვერ მოხერხდა. შესაძლოა თქვენმა ჰოსტმა გამორთო %s.",
+ "ExceptionUnreadableFileDisabledMethod": "კონფიგურაციის ფაილის {%1$s} წაკითხვა ვერ მოხერხდა. შესაძლოა თქვენმა ჰოსტმა გამორთო %2$s.",
"ExportAsImage": "ექსპორტი სურათის ფორმატში",
"ExportThisReport": "გააკეთეთ მონაცემთა ამ ნაკრების ექსპორტი სხვა ფორმატებში",
"FileIntegrityWarningExplanation": "ფაილის მთლიანობის შემოწმება ჩაიშალა და შეცდომების შესახებ გაიგზავნა რეპორტი. სავარაუდოდ, ამის მიზეზია Piwik ფაილების არასრულად ან უშედეგოდ ატვირთვა. ხელმეორედ უნდა ატვირთოთ Piwik–ის ყველა ფაილი BINARY რეჟიმში და განაახლოთ ეს გვერდი იქამდე, სანამ შეცდომის შეტყობინებები არ შეწყდება.",
@@ -103,7 +100,7 @@
"LoadingData": "მონაცემები იტვირთება...",
"Locale": "ka_GE.UTF-8",
"Logout": "გასვლა",
- "MediumToHighTrafficItIsRecommendedTo": "საშუალო და მაღალი ტრაფიკის მქონე ვებ საიტებისთვის ჩვენ გირჩევთ დღის რეპორტები დაამუშავოთ ყოველ ნახევარ საათში (%s წამი) ან ყოველ საათში (%s წამი).",
+ "MediumToHighTrafficItIsRecommendedTo": "საშუალო და მაღალი ტრაფიკის მქონე ვებ საიტებისთვის ჩვენ გირჩევთ დღის რეპორტები დაამუშავოთ ყოველ ნახევარ საათში (%1$s წამი) ან ყოველ საათში (%2$s წამი).",
"MinutesSeconds": "%1$s წუთი %2$sწმ",
"Monthly": "ყოველ თვე",
"MultiSitesSummary": "ყველა ვებ საიტი",
@@ -115,7 +112,6 @@
"NoDataForGraph": "ამ გრაფიკისთვის მონაცემები არ არის.",
"NoDataForTagCloud": "ამ ტეგებისთვის მონაცემები არ არის.",
"NotValid": "%s არ არის ვალიდური",
- "NSeconds": "%s წამში",
"NVisits": "%s ვიზიტი",
"Ok": "კარგი",
"OnlyEnterIfRequired": "ჩაწერეთ მომხმარებლის სახელი მხოლოდ იმ შემთხვევაში, თუ SMTP სერვერი მოითხოვს ამას.",
@@ -123,7 +119,7 @@
"OnlyUsedIfUserPwdIsSet": "გამოიყენება მხოლოდ მომხმარებლის სახელი\/პაროლის მითითების შემთხვევაში, მიმართეთ პროვაიდერს, თუ არ იცით რომელი მეთოდი გამოიყენოთ.",
"OpenSourceWebAnalytics": "Open Source Web Analytics",
"OptionalSmtpPort": "ოფციონალური. არ მუშაობს მნიშვნელობა 25 დაშიფრული და TLS SMTP–სთვის და 465 SSL SMTP–სთვის.",
- "OrCancel": "ან %s გაუქმება %s",
+ "OrCancel": "ან %1$s გაუქმება %2$s",
"Others": "სხვა",
"Outlinks": "გარებმულები",
"Overview": "მიმოხილვა",
@@ -146,8 +142,7 @@
"Save": "შენახვა",
"SaveImageOnYourComputer": "თქვენს კომპიუტერში სურათის შენახვისთვის დააწკაპუნეთ სურათზე მარჯვენა ღილაკით და შეარჩიეთ \"შეინახეთ სურათი როგორც...\"",
"Search": "ძებნა",
- "Seconds": "%sწმ",
- "SeeTheOfficialDocumentationForMoreInformation": "დამატებითი ინფორმაციისთვის იხილეთ %sოფიციალური დოკუმენტაცია%s.",
+ "SeeTheOfficialDocumentationForMoreInformation": "დამატებითი ინფორმაციისთვის იხილეთ %1$sოფიციალური დოკუმენტაცია%2$s.",
"SelectYesIfYouWantToSendEmailsViaServer": "შეარჩიეთ \"დიახ\", თუ გსურთ ან გჭირდებათ, ელ.წერილი გააგზავნოთ სახელობითი სერვერიდან და არა ადგილობრივის ფოსტის ფუნქციის გამოყენებით",
"Settings": "პარამეტრები",
"SmallTrafficYouCanLeaveDefault": "მცირე ტრაფიკის მქონე ვებ საიტებისთვის შეგიძლიათ დატოვოთ ნაგულისხმევი %s წამი და ყველა რეპორტი ნახოთ რეალურ დროში.",
@@ -171,13 +166,12 @@
"Warning": "გაფრთხილება",
"WarningFileIntegrityNoManifest": "ფაილის მთლიანობის შემოწმება ვერ განხორციელდება, რადგან manifest.inc.php ფაილი არ არსებობს.",
"WarningFileIntegrityNoMd5file": "ფაილის მთლიანობის შემოწმება ვერ დასრულდება, რადგან md5_file() ფუნქცია არ არსებობს.",
- "WarningPasswordStored": "%sგაფრთხილება:%s ეს პაროლი ჩაიწერება კონფიგ ფაილში, რომლის ნახვასაც შეძლებს ყველა, ვისაც მასზე წვდომა აქვს.",
+ "WarningPasswordStored": "%1$sგაფრთხილება:%2$s ეს პაროლი ჩაიწერება კონფიგ ფაილში, რომლის ნახვასაც შეძლებს ყველა, ვისაც მასზე წვდომა აქვს.",
"Website": "ვებ საიტი",
"Weekly": "ყოველ კვირა",
"Widgets": "ვიჯეტები",
"YearsDays": "%1$s წელი %2$s დღე",
"Yes": "დიახ",
- "YouAreViewingDemoShortMessage": "ახლა თქვენ ათვალიერებთ Piwik–ის დემო ვერსიას",
"YouMustBeLoggedIn": "ამ ფუნქციის გამოყენებისთვის სისტემაში შესული უნდა იყოთ.",
"YourChangesHaveBeenSaved": "თქვენს მიერ გაკეთებული ცვლილებები შენახულია."
}
diff --git a/lang/nb.json b/lang/nb.json
index c307c41792..f2ec153df6 100644
--- a/lang/nb.json
+++ b/lang/nb.json
@@ -83,7 +83,7 @@
"ColumnViewedAfterSearchDocumentation": "Antallet ganger denne siden var besøkt etter at en besøker gjorde et søk på nettstedet ditt og klikket på denne siden i søkeresultatene.",
"ColumnVisitDuration": "Besøksvarighet (i sekunder)",
"ColumnVisitsWithConversions": "Besøk med konvertering",
- "ConfigFileIsNotWritable": "Konfigurasjonsfilen for Piwik %1$s er ikke skrivbar. Noen av endringene dine blir kanskje ikke lagret. %2$s Endre rettighetene for filen slik at den er skrivbar.",
+ "ConfigFileIsNotWritable": "Konfigurasjonsfilen for Piwik %1$s er ikke skrivbar. Noen av endringene dine blir kanskje ikke lagret. %2$s Vennligst endre rettighetene for filen slik at den er skrivbar.",
"Continue": "Fortsett",
"ContinueToPiwik": "Fortsett til Piwik",
"CurrentlyUsingUnsecureHttp": "Du bruker nå Piwik over usikker HTTP, som kan være risikabelt. Vi anbefaler at du setter opp Piwik til å bruke SSL (HTTPS) for økt sikkerhet.",
@@ -140,7 +140,8 @@
"ExceptionContactSupportGeneric": "Hvis du fortsatt har dette problemet, %1$skontakt din Piwik-administrator%2$s for assistanse.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Bruker må enten være en superbruker eller brukeren «%s» selv.",
"ExceptionConfigurationFileNotFound": "Klarte ikke finne eller lese konfigurasjonsfilen {%s}.",
- "ExceptionConfigurationFileNotFound2": "Hvis filen eksisterer, vennligst sjekk at %1$s er lesbar for brukeren «%2$s».",
+ "ExceptionConfigurationFileExistsButNotReadable": "Konfigurasjonsfilen %s virker å finnes, men Piwik kunne ikke lese den.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Vennligst sjekk at %1$s er lesbar for brukeren %2$s.",
"ExceptionDatabaseVersion": "Din %1$s versjon er %2$s, men Piwik krever minst %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Din Piwik-kodebase kjører den gamle versjonen %1$s, og vi har oppdaget at din Piwik-database allerede har blitt oppgradert til den nyere versjonen %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Kanskje dine Piwik-administratorer holder på med å fullføre oppgraderingsprosessen. Prøv igjen om noen få minutter.",
@@ -152,7 +153,7 @@
"ExceptionInvalidDateFormat": "Datoformatet må være %1$s eller et nøkkelord støttet av %2$s-funksjonen (se %3$s for mer informasjon).",
"ExceptionInvalidDateRange": "Datoen «%1$s» er ikke et gyldig datointervall. Riktig format er: %2$s",
"ExceptionInvalidPeriod": "Perioden «%1$s» er ikke støttet. Prøv en av følgende istedenfor: %2$s",
- "ExceptionInvalidRendererFormat": "Format «%1$s» for rendering er ikke gyldig. Prøv en av følgende istedenfor: %2$s.",
+ "ExceptionInvalidRendererFormat": "Format «%1$s» for rendring er ikke gyldig. Prøv en av følgende istedenfor: %2$s.",
"ExceptionInvalidReportRendererFormat": "Rapportformat «%1$s» er ikke gyldig. Prøv en av følgende istedenfor: %2$s.",
"ExceptionInvalidStaticGraphType": "Statisk graftype «%1$s» er ikke gyldig. Prøv en av følgende istedenfor: %2$s.",
"ExceptionInvalidToken": "Autentiseringsnøkkel er ikke gyldig.",
@@ -285,7 +286,7 @@
"Password": "Passord",
"Period": "Periode",
"Piechart": "Kakediagram",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s er et samarbeidsprosjekt mellom %7$sPiwik-teamets%8$s medlemmer og mange andre bidragsytere over hele verden. Hvis du liker Piwik, kan du hjelpe oss: finn ut %3$shvordan delta i Piwik%4$s eller %5$sdoner nå%6$s for å støtte utviklingen av Piwik 3.0!",
+ "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s er et samarbeidsprosjekt mellom %7$sPiwik-teamets%8$s medlemmer og mange andre bidragsytere over hele verden. <br\/>Hvis du liker Piwik, kan du hjelpe oss: finn ut %3$shvordan du deltar i Piwik%4$s, eller %5$sdoner nå%6$s for å støtte utviklingen av Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s er tilgjengelig. Vennligst gi beskjed til %2$sPiwik administrator%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s er tilgjengelig. %2$s Oppdater nå!%3$s (se %4$s endringer%5$s).",
"PleaseSpecifyValue": "Oppgi en verdi for «%s».",
diff --git a/lang/nl.json b/lang/nl.json
index 7d94a685fb..0db9c72d77 100644
--- a/lang/nl.json
+++ b/lang/nl.json
@@ -1,5 +1,7 @@
{
"General": {
+ "12HourClock": "12-uren klok",
+ "24HourClock": "24-uren klok",
"AbandonedCarts": "Niet afgeronde bestellingen",
"AboutPiwikX": "Over Piwik %s",
"Action": "Actie",
@@ -11,6 +13,7 @@
"AllWebsitesDashboard": "Dashboard van alle websites",
"And": "en",
"API": "API",
+ "Apply": "Gebruiken",
"ArchivingInlineHelp": "Voor middelgrote tot grote websites, is het aan te raden Piwik archivering voor de browser uit te schakelen. Als alternatief raden we aan om een cronjob te maken om piwik om het uur rapporten te laten genereren.",
"ArchivingTriggerDescription": "Aangeraden voor grote Piwik installaties, gebruik een %1$scronjob%2$s om automatisch rapporten te genereren.",
"AuthenticationMethodSmtp": "Authenticatie methode voor SMTP",
@@ -24,6 +27,7 @@
"CannotUnzipFile": "Kan bestand %1$s niet uitpakken: %2$s",
"ChangePassword": "Wijzig wachtwoord",
"ChangeTagCloudView": "Je kunt het rapport ook op andere manieren dan een tag-cloud bekijken door de icoontjes onderaan het rapport te gebruiken.",
+ "ChooseDate": "Kies een datum, de nu geslecteerde datum is: %s",
"ChooseLanguage": "Kies taal",
"ChoosePeriod": "Kies periode",
"ClickHere": "Klik hier voor meer informatie.",
@@ -82,6 +86,8 @@
"ConfigFileIsNotWritable": "Het piwik configuratiebestand %1$s is niet beschrijfbaar. Niet alle wijzigingen zullen worden bewaard. %2$s Wijzig de permissies van het configuratie bestand om het beschrijfbaar te maken.",
"Continue": "Ga verder",
"ContinueToPiwik": "Ga verder naar Piwik",
+ "CurrentlyUsingUnsecureHttp": "Je gebruikt momenteel Piwik over een onbeveiligde HTTP, wat riskant kan zijn. We raden je aan om Piwik zo in te stellen dat het SSL (HTTPS) gebruikt, voor meer veiligheid.",
+ "CreatedByUser": "Gemaakt door %s",
"CurrentMonth": "Huidige maand",
"CurrentWeek": "Huidige week",
"CurrentYear": "Huidig jaar",
@@ -96,6 +102,7 @@
"DateRange": "Datumbereik:",
"DateRangeFrom": "Van",
"DateRangeFromTo": "Van %1$s tot %2$s",
+ "DateRangeInPeriodList": "datumbereik",
"DateRangeTo": "Tot",
"DaysHours": "%1$s dagen %2$s uren",
"DaysSinceFirstVisit": "Aantal dagen sinds eerste bezoek",
@@ -133,7 +140,6 @@
"ExceptionContactSupportGeneric": "Als het probleem zich nog steeds voordoet, neem dan %1$scontact op met je Piwik beheerder%2$s.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "De gebruiker dient een Super User of de gebruiker '%s' zelf te zijn.",
"ExceptionConfigurationFileNotFound": "Het configuratiebestand {%s} is niet gevonden of kon niet worden gelezen.",
- "ExceptionConfigurationFileNotFound2": "Indien het bestand bestaat, wees er dan zeker van %1$s kan gelezen worden door de gebruiker '%2$s'.",
"ExceptionDatabaseVersion": "Uw %1$s versie is %2$s maar Piwik vereist ten minste %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "De Piwik bestanden zijn van de verouderde versie %1$s en we zien dat de Piwik Database al een upgrade heeft gehad naar de nieuwere versie %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Het kan zijn dat de Piwik beheerder op dit moment de upgrade aan het uitvoeren is. Probeer het over een paar minuten nog eens.",
@@ -224,6 +230,7 @@
"Name": "Naam",
"NbActions": "Aantal acties",
"NbSearches": "Aantal interne zoekopdrachten",
+ "NeedMoreHelp": "Meer hulp nodig?",
"Never": "Nooit",
"NewReportsWillBeProcessedByCron": "Wanneer Piwik archivering niet wordt ingeschakeld door de browser, zullen nieuwe rapporten verwerkt worden door de crontab.",
"NewUpdatePiwikX": "Nieuwe Update: Piwik %s",
@@ -258,8 +265,11 @@
"OperationIsNot": "Is niet",
"OperationLessThan": "Kleiner dan",
"OperationNotEquals": "Niet gelijk aan",
+ "OperationStartsWith": "Begint met",
+ "OperationEndsWith": "Eindigt met",
"OptionalSmtpPort": "Optioneel. Standaard 25 voor onbeveiligd and TLS SMTP, en 465 voor SSL SMTP",
"Options": "Opties",
+ "Or": "of",
"OrCancel": "of %1$s Annuleer %2$s",
"Others": "Andere",
"Outlink": "Uitgaande Link",
@@ -274,7 +284,6 @@
"Password": "Wachtwoord",
"Period": "Periode",
"Piechart": "Taartdiagram",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s is een samenwerkingsproject, wat door %7$sPiwik team%8$s leden, maar ook door vele andere personen die over de hele wereld hun steentje bijdragen. Als je een fan bent van Piwik, kun je helpen: kom te weten %3$shoe je kunt participeren in Piwik%4$s, of %5$sdoneer nu%6$s om Piwik 3.0 mee te financieren!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s is beschikbaar. Je kunt dit melden bij de %2$sPiwik beheerder%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s is beschikbaar. %2$s Gelieve nu te updaten!%3$s (zie %4$s wijzigingen%5$s)",
"PleaseSpecifyValue": "Gelieve een waarde op te geven voor '%s'.",
@@ -344,11 +353,15 @@
"TagCloud": "Tag Cloud",
"Tax": "Belasting",
"TimeAgo": "%s geleden",
+ "TimeFormat": "Tijd formaat",
"TimeOnPage": "Tijd op pagina",
"Total": "Totaal",
"TotalRatioTooltip": "Dit is %1$s van alle %2$s %3$s.",
"TotalRevenue": "Totale Inkomsten",
"TotalVisitsPageviewsActionsRevenue": "(Totaal: %1$s bezoekers, %2$s paginaweergaves,%3$s acties, %4$s inkomsten)",
+ "TrackingScopeAction": "Actie",
+ "TrackingScopePage": "Pagina",
+ "TrackingScopeVisit": "Bezoek",
"TransitionsRowActionTooltip": "Bekijk wat bezoekers voor en na het bekijken van deze pagina deden",
"TransitionsRowActionTooltipTitle": "Open transities",
"TranslatorName": "Martijn van Laar, Hannes Bossuyt, Sigge Stegeman, Taco Vader, Benkheil Abdelouali, Ko de Pree, Richard Mastop",
@@ -374,9 +387,11 @@
"Visitors": "Bezoekers",
"VisitsWith": "Bezoeken met %s",
"VisitorSettings": "Bezoeker Instellingen",
+ "VisitType": "Bezoek type",
"VisitTypeExample": "Om bijvoorbeeld het aantal terugkerende bezoekers (inclusief die bezoekers die iets gekocht hebben) te selecteren moet de API %s bevatten",
"Warning": "Let op",
"WarningPhpVersionXIsTooOld": "Je gebruikt PHP versie %s. Deze heeft de status 'End of Life (OEL)'. We adviseren je ten zeerste om te upgraden naar de recente versie van PHP, omdat de versie die nu gebruikt beveiligingslekken en bugs kan bevatten, welke in meer recente versies van PHP opgelost zijn.",
+ "WarningPiwikWillStopSupportingPHPVersion": "Piwik stop de ondersteuning van PHP %1$s in de volgende grote versie. Upgrade je PHP tot ten minste PHP %2$s voor het te laat is!",
"WarningFileIntegrityNoManifest": "Bestand integriteits controle kon niet worden uitgevoerd vanwege ontbrekend manifest.inc.php",
"WarningFileIntegrityNoManifestDeployingFromGit": "Als je Piwik vanuit Git deployed, dan is deze melding normaal.",
"WarningFileIntegrityNoMd5file": "Bestand integriteit controle kon niet worden voltooid vanwege ontbrekende md5_file() functie.",
@@ -396,6 +411,7 @@
"YearsDays": "%1$s jaren %2$s dagen",
"Yes": "Ja",
"YouAreCurrentlyUsing": "U gebruikt momenteel Piwik %s.",
+ "YouAreViewingDemoShortMessage": "Je bekijkt de demo van Piwik",
"YouMustBeLoggedIn": "U moet ingelogd zijn om deze functionaliteit te gebruiken.",
"YourChangesHaveBeenSaved": "De wijzigingen zijn opgeslagen."
},
diff --git a/lang/pt-br.json b/lang/pt-br.json
index caa49ba874..5c709dc22c 100644
--- a/lang/pt-br.json
+++ b/lang/pt-br.json
@@ -140,7 +140,8 @@
"ExceptionContactSupportGeneric": "Se você ainda tiver esse problema, por favor %1$scontate o seu administrador Piwik%2$s para assistência.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "O usuário precisa ter permissão de Super Usuário ou ser o próprio: '%s'.",
"ExceptionConfigurationFileNotFound": "O ficheiro de configuração {%s} não foi encontrado.",
- "ExceptionConfigurationFileNotFound2": "Se o arquivo existir, por favor verifique se %1$s é legível pelo usuário '%2$s'.",
+ "ExceptionConfigurationFileExistsButNotReadable": "O arquivo de configuração %s parece existir, mas o Piwik não pode o ler.",
+ "ExceptionConfigurationFilePleaseCheckReadableByUser": "Verifique se %1$s é legível pelo usuário '%2$s'.",
"ExceptionDatabaseVersion": "Sua %1$s versão é %2$s mas o Piwik requer no mínimo %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Sua base de código Piwik está executando a versão antiga %1$s e foi detectado que seu banco de dados Piwik já foi atualizado para a nova versão %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Talvez seus administradores do Piwik estejam atualmente terminando o processo de atualização. Por favor, tente novamente em alguns minutos.",
@@ -285,7 +286,6 @@
"Password": "Senha",
"Period": "Período",
"Piechart": "Gráfico circular",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s é um projeto colaborativo trazido a você pelos %7$smembros da equipe Piwik%8$s, bem como muitos outros colaboradores ao redor do mundo. Se você é um fã de Piwik, você pode ajudar: saiba como%3$sparticipar do Piwik%4$s, ou %5$s doe agora %6$s para ajudar a financiar o Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s está disponível. Por favor notifique o %2$sadministrator Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwiki %1$s está disponível. %2$s Por favor atualize agora!%3$s (veja %4$sas mudanças%5$s).",
"PleaseSpecifyValue": "Por favor, especifique um valor para '%s'.",
@@ -366,7 +366,7 @@
"TrackingScopeVisit": "Visita",
"TransitionsRowActionTooltip": "Veja o que os visitantes fizeram antes e depois de verem este página",
"TransitionsRowActionTooltipTitle": "Transições abertas",
- "TranslatorName": "<a href=\"https:\/\/arenato.com\">A. Renato<\/a>",
+ "TranslatorName": "A. Renato",
"UniquePurchases": "Pedidos únicos",
"Unknown": "Desconhecido",
"Upload": "Carregar",
diff --git a/lang/ro.json b/lang/ro.json
index b180bbe00e..a8a366a56e 100644
--- a/lang/ro.json
+++ b/lang/ro.json
@@ -258,7 +258,6 @@
"Password": "Parola",
"Period": "Perioada",
"Piechart": "Diagrama",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s este un proiect colaborativ realizat de membrii %7$sPiwik team%8$s ca și de mulți alți contributori de pe mapamond. Dacă ești un fan Piwik, poți ajuta: află %3$sCum poți participa la Piwik%4$s, sau %5$sdonează acum%6$s pentru a ajuta la finanțarea Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s este disponibil. Va rugam instiintati %2$sAdministratorul dvs al Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s este disponibil. %2$s Actualizeaza-l acum!%3$s (see %4$s changes%5$s).",
"PleaseSpecifyValue": "Va rugam specificati o valoare pentru '%s'.",
diff --git a/lang/ru.json b/lang/ru.json
index 9ec7aa55b0..0afffae4eb 100644
--- a/lang/ru.json
+++ b/lang/ru.json
@@ -140,7 +140,6 @@
"ExceptionContactSupportGeneric": "Если вы продолжаете получать эту ошибку, пожалуйста, %1$sобратитесь к администратору Piwik%2$s за помощью.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Пользователь должен быть либо суперпользователем, либо пользователем '%s'.",
"ExceptionConfigurationFileNotFound": "Конфигурационный файл {%s} не может быть найден.",
- "ExceptionConfigurationFileNotFound2": "Если файл существует, пожалуйста, проверьте, что %1$s доступен для чтения пользователем \"%2$s\".",
"ExceptionDatabaseVersion": "Версия вашего %1$s - %2$s, но Piwik требует хотя бы %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Исполняемые файлы Piwik устаревшей версии %1$s, а база данных Piwik уже обновлена до новой версии %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Возможно Ваш Piwik-администратор только что закончил процесс обновления. Попробуйте повторить позже.",
@@ -284,7 +283,6 @@
"Password": "Пароль",
"Period": "Период",
"Piechart": "Круговая диаграмма",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s является совместным проектом, представленный вам %7$sкомандой Piwik%8$s, а также многими другими разработчиками по всему миру. Если вы поклонник Piwik, вы можете помочь: %3$sУзнайте, как принять участие в Piwik%4$s, или %5$sпожертвуйте сейчас%6$s, чтобы помочь финансировать Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "Доступен %1$s. Пожалуйста, сообщите %2$sадминистратору Piwik%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s доступен для скачивания. %2$s Пожалуйста, обновитесь!%3$s (см. %4$s изменения%5$s).",
"PleaseSpecifyValue": "Пожалуйста, определите значение для '%s'.",
diff --git a/lang/sk.json b/lang/sk.json
index 23e3e458ab..7f2e943715 100644
--- a/lang/sk.json
+++ b/lang/sk.json
@@ -140,7 +140,6 @@
"ExceptionContactSupportGeneric": "Ak sa stále vyskytuje táto záležitosť, prosím %1$s kontaktujte Vášho Piwik administrátora %2$s.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Užívateľ musí byť buďto Superužívateľ alebo samotný užívateľ '%s'.",
"ExceptionConfigurationFileNotFound": "Konfiguračný súbor{%s} nebol nájdený.",
- "ExceptionConfigurationFileNotFound2": "Ak súbor existuje, prosím skontrolujte či %1$s je užívateľom '%2$s' čitateľné.",
"ExceptionDatabaseVersion": "Vaša verzia %1$s je %2$s,ale Piwik potrebuje aspoň verziu %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Vaša Piwik kódovacia základňa beží pod starou verziou %1$s a my sme zistili, že Vaša Piwik databáza bola práve aktualizovaná na novšiu verziu %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Možno Vaši Piwik administrátori práve dokončujú proces aktualizácie. Prosím skúste znova o niekoľko minút.",
@@ -285,7 +284,6 @@
"Password": "Heslo",
"Period": "Obdobie",
"Piechart": "Koláčový graf",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s je spoločný projekt, ktorý Vám prinášajú %8$s členovia %7$sPiwik tímu spolu s mnohými prispievateľmi z celého sveta. Ak ste fanúšikom Piwiku, tak môžete pomôcť: vyzistiť %3$s ako participovať na Piwiku%4$s, alebo %5$s prispieť finančne%6$s pre podporu pri Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s je dostupné. Prosím informujte %2$sPiwik administrátora%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s je k dispozícií. %2$s Prosím vykonajte aktualizáciu!%3$s (pozrieť %4$s zmeny%5$s).",
"PleaseSpecifyValue": "Špecifikujte, prosím, hodnotu pre %s.",
diff --git a/lang/sl.json b/lang/sl.json
index 70c1860508..bfd9800c02 100644
--- a/lang/sl.json
+++ b/lang/sl.json
@@ -21,11 +21,13 @@
"AveragePrice": "Povprečna Cena",
"AverageQuantity": "Povprečna Količina",
"BackToPiwik": "Nazaj na Piwik",
- "BrokenDownReportDocumentation": "Razčlenjen je na različna poročila, ki so prikazana z grafi na dnu strani. grafe lahko povečate s klikov na poročilo, ki bi si ga radi ogledali.",
+ "Broken": "Broken",
+ "BrokenDownReportDocumentation": "Razčlenjen je na različna poročila, ki so prikazana z grafi na dnu strani. Grafe lahko povečate s klikov na poročilo, ki bi si ga radi ogledali.",
"Cancel": "Prekliči",
"CannotUnzipFile": "Ne morem odzipati datoteke %1$s: %2$s",
"ChangePassword": "Spremeni geslo",
"ChangeTagCloudView": "Zavedajte se, da si lahko ogledate proočila na drugačne načine kot oblak oznak. Za spremembo uporabite izbire na dnu poročila.",
+ "ChooseDate": "Izberi datum, trenutno izbrani datum je: %s",
"ChooseLanguage": "Izberite jezik",
"ChoosePeriod": "Izberite obdobje",
"ClickHere": "Za več informacij, kliknite tu.",
@@ -41,9 +43,9 @@
"ColumnAvgTimeOnSite": "Povpr. čas na spletni strani",
"ColumnAvgTimeOnSiteDocumentation": "Povprečno trajanje obiska.",
"ColumnBounceRate": "Odbojno razmerje",
- "ColumnBounceRateDocumentation": "Delež obiskov, ki je vseboval zgolj en sam ogled strani. To pomeni, da je obiskovalec zapustil spletno stran direktno z vhodne strani.",
+ "ColumnBounceRateDocumentation": "Delež obiskov, ki je vseboval zgolj en sam ogled strani. Obiskovalec je zapustil spletno stran direktno z vhodne strani.",
"ColumnBounces": "Odbojev",
- "ColumnBouncesDocumentation": "Število obiskov, ki so se začeli in končali na tej strani. To pomeni, da je obiskovalec odšel po ogledu ene same strani.",
+ "ColumnBouncesDocumentation": "Število obiskov, ki so se začeli in končali na tej strani. Obiskovalec je odšel po ogledu ene same strani.",
"ColumnConversionRate": "Pretvorbeno razmerje",
"ColumnConversionRateDocumentation": "Procent obiskov, ki so sprožili spreobrnitev cilja.",
"ColumnDestinationPage": "Ciljna stran",
@@ -67,13 +69,13 @@
"ColumnNbVisitsDocumentation": "V primeru da pride obiskovalec na vašo spletno stran prvič, ali pa je njegov obisk daljši od 30 minut, se bo to štelo kot novi obisk.",
"ColumnPageBounceRateDocumentation": "Delež obiskov, ki so se začeli na tej strani, a so nemudoma zapustili spletno stran.",
"ColumnPageviews": "Ogledov strani",
- "ColumnPageviewsDocumentation": "Število, kolikokrat je bila ta stran obiskana.",
+ "ColumnPageviewsDocumentation": "Število obiskov te strani.",
"ColumnPercentageVisits": "% Obiskov",
"ColumnRevenue": "Prihodki",
"ColumnSumVisitLength": "Skupni čas, ki so ga porabili obiskovalci (v sekundah)",
"ColumnTotalPageviews": "Vseh ogledov strani",
- "ColumnUniqueEntrances": "Edinstveni vhodi",
- "ColumnUniqueExits": "Edinstveni izhodi",
+ "ColumnUniqueEntrances": "Edinstveni vhodi na stran",
+ "ColumnUniqueExits": "Edinstveni izhodi iz strani",
"ColumnUniquePageviews": "Edinstvenih ogledov strani",
"ColumnUniquePageviewsDocumentation": "Število obiskov, ki so vključevali to stran. V primeru, da je bila stran ogledana večkrat, se to šteje kot le-en ogled.",
"ColumnValuePerVisit": "Vrednost na Obisk",
@@ -84,6 +86,8 @@
"ConfigFileIsNotWritable": "Piwik-ova konfiguracijska datoteka %1$s ni zapisljiva, zato nekaterih vaših sprememb ni bilo mogoče shraniti. %2$s Prosimo, da spremenite dovoljenja konfiguracijske datoteke tako, da bo zapisljiva.",
"Continue": "Nadaljuj",
"ContinueToPiwik": "Nadaljuj na Piwik",
+ "CurrentlyUsingUnsecureHttp": "Trenutno uporabljaš Piwik preko nekodiranega HTTP protokola, kar je lahko nevarno. Priporočamo uporabo Piwik z uporabo SSL (HTTPS) protokola za izboljšano varnost.",
+ "CreatedByUser": "ustvaril %s",
"CurrentMonth": "Trenutni mesec",
"CurrentWeek": "Trenutni teden",
"CurrentYear": "Trenutno leto",
@@ -98,6 +102,7 @@
"DateRange": "Datumski razpon:",
"DateRangeFrom": "Od",
"DateRangeFromTo": "Od %1$s do %2$s",
+ "DateRangeInPeriodList": "date range",
"DateRangeTo": "Za",
"DaysHours": "%1$s dni %2$s ur",
"DaysSinceFirstVisit": "Dni od prvega obiska",
@@ -130,6 +135,8 @@
"EncryptedSmtpTransport": "Vnesite nivo enkripcije, ki jo uporablja vaš SMTP strežnik.",
"Error": "Napaka",
"ErrorRequest": "Prišlo je do težave pri izvedbi zahtevka. Morda gre za začasno težavo na strežniku ali pa ste zahtevali poročilo s preveliko količino podatkov. Prosimo, poskusite ponovno. Če se bo napaka ponavljala, se prosimo %1$sobrnite po pomoč%2$s na vašega Piwik skrbnika.",
+ "EvolutionOverPeriod": "Evolution over the period",
+ "EvolutionSummaryGeneric": "%1$s in %2$s compared to %3$s in %4$s. Evolution: %5$s",
"ExceptionContactSupportGeneric": "Če težava vztraja, se prosimo %1$sobrnite po pomoč%2$s na vašega Piwik skrbnika.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Uporabnik mora biti Super User ali uporabnik '%s'.",
"ExceptionConfigurationFileNotFound": "Konfiguracijska datoteka {%s} ni bila najdena.",
@@ -159,11 +166,12 @@
"ExceptionUndeletableFile": "%s ni možno izbrisati.",
"ExceptionUnreadableFileDisabledMethod": "Konfiguracijske datoteke {%1$s} ni bilo mogoče prebrati. Možno je, da je vaš gostitelj onemogočil %2$s.",
"ExceptionReportNotFound": "Zahtevano poročilo ne obstaja.",
+ "ExceptionWidgetNotFound": "The requested widget does not exist.",
"ExceptionReportNotEnabled": "Zahtevano poročilo ni omogočeno. To ponavadi pomeni, da vtičnik, ki definira poročilo, ni aktiviran ali, da nimate dovoljenj za dostop do tega poročila.",
"ExpandDataTableFooter": "Spremeni izgled ali uredi nastavitve poročila",
"Export": "Izvozi",
"ExportAsImage": "Izvozi kot Sliko",
- "ExportThisReport": "Izvoti to razpredelnico v drugih formatih",
+ "ExportThisReport": "Izvozi to razpredelnico v drugih formatih",
"Faq": "FAQ",
"FileIntegrityWarningExplanation": "Preverjanje integritete ni uspelo in je javilo neke napake. Vzrok za to so verjetno nekatere Piwik datoteke, ki so se delno ali narobe prenesle. Ponovno morate prenesti vse Piwik datoteke na strežnik v BINARY načinu in osvežiti to stran, tako da ne bo več vidne nobene napake.",
"First": "Prvi",
@@ -174,17 +182,17 @@
"GeneralInformation": "Splošne informacije",
"General": "Splošno",
"GetStarted": "Pričnite",
- "GiveUsYourFeedback": "Podajte nam Povratno Informacijo!",
+ "GiveUsYourFeedback": "Podajte nam povratno informacijo!",
"Goal": "Cilj",
"GoTo": "Pojdi na %s",
- "GraphHelp": "Več informacij o prikazovanju Grafov v Piwik-u.",
+ "GraphHelp": "Več informacij o prikazovanju grafov v Piwik-u.",
"HelloUser": "Pozdravljen, %s!",
"Help": "Pomoč",
"HelpTranslatePiwik": "Morda bi nam %1$spomagali izboljšati prevode Piwika%2$s?",
"Hide": "skrij",
"HoursMinutes": "%1$s ur %2$s min",
"Id": "Id",
- "IfArchivingIsFastYouCanSetupCronRunMoreOften": "Če bo arhiviranje na vašem sistemu hitro, lahko popravite crontab, tako da se bo arhiviranje zagnalo pogosteje.",
+ "IfArchivingIsFastYouCanSetupCronRunMoreOften": "Če bo arhiviranje na vašem sistemu hitro, lahko popravite datoteko crontab, tako, da se bo arhiviranje zagnalo pogosteje.",
"InfoFor": "Informacija za %s",
"Installed": "Nameščeno",
"InvalidDateRange": "Neveljaven Datumski Razpon. Prosimo, Poskusite Znova",
@@ -202,14 +210,14 @@
"LoadingPopoverFor": "Nalagam %s za",
"Locale": "sl_SI.UTF-8",
"Logout": "Izpis",
- "MainMetrics": "Glavna meterika",
+ "MainMetrics": "Glavna metrika",
"Matches": "Zadetki",
"MediumToHighTrafficItIsRecommendedTo": "Za srednje velike in velike spletne strani vam priporočamo, da procesirate poročila največ na pol ure (%1$s sekund) ali na eno uro (%2$s sekund).",
"Metadata": "Metadata",
"Metric": "Metrika",
"Metrics": "Metrike",
- "MetricsToPlot": "Metrično v spletko",
- "MetricToPlot": "Metrično v spletko",
+ "MetricsToPlot": "Metrike za izris",
+ "MetricToPlot": "Metrika za izris",
"MinutesSeconds": "%1$s min %2$ss",
"Mobile": "Mobilno",
"Monthly": "Mesečno",
@@ -220,8 +228,9 @@
"MoreLowerCase": "več",
"MultiSitesSummary": "Vse spletne strani",
"Name": "Ime",
- "NbActions": "Šttevilo Dejanj",
+ "NbActions": "Število Dejanj",
"NbSearches": "Število notranjih iskanj",
+ "NeedMoreHelp": "Potrebujete več pomoči?",
"Never": "Nikoli",
"NewReportsWillBeProcessedByCron": "Ko se arhiviranje ne sproži preko brskalnika, bodo nova poročila generirana preko crontaba.",
"NewUpdatePiwikX": "Nova posodobitev: Piwik %s",
@@ -229,7 +238,7 @@
"NewVisits": "Novi obiski",
"Next": "Naslednji",
"No": "Ne",
- "NoDataForGraph": "Nobenih podatkov za ta graf.",
+ "NoDataForGraph": "Ni podatkov za ta graf.",
"NoDataForTagCloud": "Ni podatkov za oblaček z etiketami",
"NotDefined": "%s ni definiran",
"Note": "Opomba",
@@ -245,7 +254,7 @@
"OnlyEnterIfRequired": "Uporabniško ime vnesite le, če to zahteva vaš SMTP strežnik.",
"OnlyEnterIfRequiredPassword": "Geslo vnesite le, če to zahteva vaš SMTP strežnik.",
"OnlyUsedIfUserPwdIsSet": "Uporabljeno samo če je nastavljeno uporabniško ime in geslo. Če niste prepričani katero metodo bi uporabili, prosmo kontaktirajte vašega ponudnika.",
- "OpenSourceWebAnalytics": "Odprtokodna Spletna Analitika",
+ "OpenSourceWebAnalytics": "Odprtokodna spletna analitika",
"OperationAtLeast": "Vsaj",
"OperationAtMost": "Največ",
"OperationContains": "Vsebuje",
@@ -256,8 +265,11 @@
"OperationIsNot": "Ni",
"OperationLessThan": "Manj kot",
"OperationNotEquals": "Ni enako",
- "OptionalSmtpPort": "Neobvezno. Privzeto je 25 za nekriptiran prometi in za TLS SMTP. 465 za SSL SMTP.",
+ "OperationStartsWith": "Starts with",
+ "OperationEndsWith": "Ends with",
+ "OptionalSmtpPort": "Neobvezno. Privzet je vrata 25 za nekriptiran prometi in za TLS SMTP, vrata 465 za SSL SMTP.",
"Options": "Možnosti",
+ "Or": "or",
"OrCancel": "ali %1$s Prekliči %2$s",
"Others": "Ostali",
"Outlink": "Izhodna povezaba",
@@ -272,7 +284,6 @@
"Password": "Geslo",
"Period": "Obdobje",
"Piechart": "Kolačni diagram",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s je odprtokodni projekt, ki ga vodijo člani %7$sPiwik ekipe%8$s kot tudi mnogi drugi po celem svetu. Če ste nad Piwikom navdušeni, lahko pomagate: poglejte %3$sKako sodelovati pri razvoju Piwika%4$s ali %5$sdonirajte sredstva%6$s, da bi pomagali razviti Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s je na voljo. Prosimo, obvestite %2$sPiwik skrbnika%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s je na voljo. %2$sProsimo posodobite ga zdaj!ow!%3$s (oglejte si %4$sspremembe%5$s).",
"PleaseSpecifyValue": "Prosimo, navedite vrednost za \"%s\"",
@@ -286,6 +297,8 @@
"Price": "Cena",
"ProductConversionRate": "Stopnja konverzije izdelka",
"ProductRevenue": "Prihodki izdelka",
+ "Measurable": "Merljivo",
+ "Measurables": "Merjenje",
"PurchasedProducts": "Kupljeni Izdelki",
"Quantity": "Količina",
"RangeReports": "Časovni razpon po meri",
@@ -309,6 +322,7 @@
"ReturningVisitor": "Ponoven Obiskovalec",
"ReturningVisitorAllVisits": "Ogled vseh obiskov",
"RowEvolutionRowActionTooltip": "Poglejte, koliko metrik za to vrstico se je spremenilo v obdobju",
+ "RowEvolutionRowActionTooltipTitle": "Potek odpre vrstice",
"Rows": "Vrstice",
"RowsToDisplay": "Vrst za prikaz",
"Save": "Shrani",
@@ -339,17 +353,22 @@
"TagCloud": "Oblak z etiketami",
"Tax": "Davek",
"TimeAgo": "pred %s",
+ "TimeFormat": "Time format",
"TimeOnPage": "Čas na strani",
"Total": "Skupaj",
"TotalRatioTooltip": "To je %1$s od vseh %2$s %3$s.",
"TotalRevenue": "Skupni prihodki",
+ "TotalVisitsPageviewsActionsRevenue": "(Skupaj: %1$s obiskov, %2$s ogledov strani, %3$s akcij, %4$s prihodek)",
+ "TrackingScopeAction": "Akcija",
+ "TrackingScopePage": "Stran",
+ "TrackingScopeVisit": "Obisk",
"TransitionsRowActionTooltip": "Poglejte kaj so obiskovalci počeli pred in potem, ko so obiskali to stran",
"TransitionsRowActionTooltipTitle": "Odpri prehode",
- "TranslatorName": "Aleksej Lazanski, Tom Merc",
+ "TranslatorName": "Aleksej Lazanski, Tom Merc, Boris Gabrič",
"UniquePurchases": "Edinstveni nakupi",
"Unknown": "Neznano",
"Upload": "Naloži",
- "UsePlusMinusIconsDocumentation": "Uporabite plus in minus ikoni na levi za navigacijo.",
+ "UsePlusMinusIconsDocumentation": "Za navigacijo uporabite ikoni plus in minus na levi.",
"UserId": "Uporabniški ID",
"Username": "Uporabniško Ime",
"UseSMTPServerForEmail": "Uporabljaj SMTP strežnik za e-pošto",
@@ -368,26 +387,32 @@
"Visitors": "Obiskovalci",
"VisitsWith": "Obiski z\/s %s",
"VisitorSettings": "Nastavitve obiskovalcev",
+ "VisitType": "Visit type",
"VisitTypeExample": "Na primer, če želite zbrati vse obiskovalce, ki so se vrnili na spletno stran, vključno s tistimi, ki so v prejšnjih obiskih kaj kupili, bi API zahteva vsebovala %s",
"Warning": "Opozorilo",
"WarningPhpVersionXIsTooOld": "Različica PHP %s, ki jo uporabljate, ni več podprta! Priporočamo čim prejšnjo nadgradnjo na zadnjo stabilno različico, saj ste z nadaljnjo uporabo trenutne različice lahko izpostavljeni varnostnim ranljivostim in napakam, ki so odpravljene v novejših različicah PHP.",
+ "WarningPiwikWillStopSupportingPHPVersion": "Piwik will stop supporting PHP %1$s in the next major version. Upgrade your PHP to at least PHP %2$s, before it's too late!",
"WarningFileIntegrityNoManifest": "Pregleda integritete datotek ni bilo mogoče izvesti, saj manjka manifest.inc.php.",
"WarningFileIntegrityNoManifestDeployingFromGit": "Če nameščate Piwik iz Git repozitorija, je to sporočilo normalno.",
"WarningFileIntegrityNoMd5file": "Ne morem preveriti integritete datoteke, ker manjka funkcija md5_file().",
"WarningPasswordStored": "%1$sPozor:%2$s To geslo bo shranjeno v config datoteki. Tako bo vidna vsem, ki imajo dostop do te datoteke.",
+ "WarningDebugOnDemandEnabled": "Sledilni način %1$s je vkljulen. Zaradi varnostnih razlogov priporočamo vklop le za kratek čas. Za izklop nastavi %2$s na %3$s v %4$s",
"Website": "Spletna stran",
"Weekly": "Tedensko",
"WeeklyReport": "tedensko",
"WeeklyReports": "Tedenska poročila",
"WellDone": "Dobro opravljeno!",
"Widgets": "Gradniki",
+ "Widget": "Gradnik",
"XComparedToY": "%1$s v primerjavi z %2$s",
+ "XFromY": "%1$s from %2$s",
"YearlyReport": "letno",
"YearlyReports": "Letna poročila",
"YearsDays": "%1$s let %2$s dni",
"Yes": "Da",
"YouAreCurrentlyUsing": "Trenutno uporabljate Piwik %s.",
- "YouMustBeLoggedIn": "Za uporabo te funkcije morate biti vpisani.",
+ "YouAreViewingDemoShortMessage": "Pregledujete demo različico Piwik",
+ "YouMustBeLoggedIn": "Za uporabo te funkcije morate biti prijavljeni.",
"YourChangesHaveBeenSaved": "Vaše spremembe so bile shranjene."
},
"Mobile": {
@@ -409,18 +434,20 @@
"DefaultReportDate": "Datum poročila",
"EmailUs": "Pišite nam",
"EnableGraphsLabel": "Prikaži grafe",
+ "EvolutionGraph": "Zgodovinski graf",
"HelpUsToImprovePiwikMobile": "Želite omogočiti anonimno sledenje uporabe v Piwik Mobile?",
"HowtoDeleteAnAccount": "Pritisnite in držite, da odstranite račun.",
"HowtoDeleteAnAccountOniOS": "Povlecite od desne proti levi, da izbrišete račun",
"HowtoLoginAnonymous": "Za anonimno prijavo pustite polji za uporabniško ime in geslo prazni",
"HttpIsNotSecureWarning": "Če uporabljate HTTP protokol, je vaš Piwik overitveni žeton (token_auth) poslan po internetu v berljivi obliki. Za varen prenos podatkov po internetu priporočamo uporabo HTTPS protokola. Želite nadaljevati?",
- "HttpTimeout": "HTTP Timeout",
+ "HttpTimeout": "Pretek HTTP časovne omejitve",
"IncompatiblePiwikVersion": "Verzija Piwika, ki jo uporabljate, ni skladna s Piwik Mobile 2. Nadgradite vaš Piwik in poskusite znova ali namestite Piwik Mobile 1.",
- "LastUpdated": "Zadnje posodobljeno: %s",
+ "LastUpdated": "Zadnja posodobitev: %s",
"LoadingReport": "Nalaganje %s",
"LoginCredentials": "Poverilnice",
"LoginToPiwikToChangeSettings": "Prijavite se v vaš Piwik strežnik, da bi ustvarili ali posodobili spletna mesta, uporabnike ali, da bi spremenili splošne nastavitve kot npr. \"Privzeto poročilo za prikaz\".",
"LoginUseHttps": "Uporabi https",
+ "MultiChartLabel": "Prikaži minimume\/maksimume",
"NavigationBack": "Nazaj",
"NetworkError": "Napaka omrežja",
"NetworkErrorWithStatusCode": "Prišlo je do napake \"%1$s\". Zahtevek je vrnil status \"%2$s\". URL je bil \"%3$s\". Prosimo, preverite vnešeni URL in error loge na strežniku za več informacij o napaki in namig kako jo rešiti.",
@@ -430,7 +457,7 @@
"NoDataShort": "Ni podatkov",
"NoPiwikAccount": "Nimate Piwik uporabniškega računa?",
"NoReportsShort": "Ni poročil",
- "NoVisitorFound": "Noben obiskovalec ni najden",
+ "NoVisitorFound": "Obiskovalec ni najden",
"NoVisitorsShort": "Ni obiskovalcev",
"NoWebsiteFound": "Nobeno spletno mesto ni najdeno",
"NoWebsitesShort": "Ni spletnih mest",
@@ -444,13 +471,14 @@
"RatingPleaseRateUs": "Piwik Mobile App je brezplačna programska oprema. Zelo bi vam bili hvaležni, če bi si vzeli 1 minuto časa in ocenili aplikacijo v %1$s. Če imate kakšne predloge za nove funkcionalnosti ali bi radi prijavili napako, prosimo kontaktirajte %2$s",
"ReleaseToRefresh": "Izpustite za osvežitev...",
"Reloading": "Nalagam...",
- "RequestTimedOutShort": "Napaka - network timeout",
+ "RequestTimedOutShort": "Napaka - pretek omrežne časovne omejitve",
"RestrictedCompatibility": "Omejena združljivost",
"RestrictedCompatibilityExplanation": "Verzija Piwika, ki jo uporabljate (%s), ni v polnosti podprta v Piwik Mobile 2. Lahko se pojavijo napake. Predlagamo, da nadgradite vaš Piwik na zadnjo verzijo ali uporabite Piwik Mobile 1.",
"SaveSuccessError": "Prosimo, zagotovite nastavitve",
"SearchWebsite": "Išči spletna mesta",
"ShowAll": "Prikaži vse",
"ShowLess": "Prikaži manj",
+ "StaticGraph": "Overview Graph",
"TopVisitedWebsites": "Najbolj obiskana spletna mesta",
"TryIt": "Poskusite!",
"UseSearchBarHint": "Prikazanih je samo prvih %s spletnih mest. Za prikaz preostalih, prosimo uporabite iskalnik.",
@@ -467,7 +495,9 @@
"Documentation": "Kliknite metrike, da jih prikažete na velikem razvojnem grafu. Uporabite tipko Shift za prikaz večih metrik na enkrat.",
"MetricBetweenText": "od %1$s do %2$s",
"MetricChangeText": "%s sprememb v časovnem obdobju",
+ "MetricMinMax": "%1$s ranged between %2$s and %3$s over the period",
"MetricsFor": "Metrike za %s",
+ "MultiRowEvolutionTitle": "Potek več vrstic",
"PickAnotherRow": "Izberi še eno vrstico za primerjavo",
"PickARow": "Izberi vrstico za primerjavo"
}
diff --git a/lang/sq.json b/lang/sq.json
index c071259db9..114c9b4c61 100644
--- a/lang/sq.json
+++ b/lang/sq.json
@@ -76,12 +76,15 @@
"ColumnUniqueExits": "Dalje unike",
"ColumnUniquePageviews": "Parje Unike Faqesh",
"ColumnUniquePageviewsDocumentation": "Numër vizitash që përfshinë edhe këtë faqe. Nëse një faqe qe parë disa herë gjatë një vizite, numërohet vetëm një herë.",
+ "ColumnValuePerVisit": "Të ardhura për Vizitë",
"ColumnViewedAfterSearch": "Përfundime kërkimi të klikuara",
"ColumnViewedAfterSearchDocumentation": "Numri i herëve që kjo Faqe qe vizituar nga një vizitor, pasi kreu një kërkim mbi sajtin tuaj, dhe klikoi mbi këtë faqe te përfundimet e kërkimit.",
"ColumnVisitDuration": "Kohëzgjatje Vizite (në sekonda)",
"ColumnVisitsWithConversions": "Vizita me Shndërrime",
"Continue": "Vazhdo",
"ContinueToPiwik": "Vazhdoni te Piwik-u",
+ "CurrentlyUsingUnsecureHttp": "Po e përdorni Piwik-un përmes HTTP jo të sigurt, çka mund të jetë e rrezikshme. Për shtim të sigurisë, këshillojmë ta rregulloni Piwik-un të përdorë SSL (HTTPS).",
+ "CreatedByUser": "krijuar nga %s",
"CurrentMonth": "Muaji i Tanishëm",
"CurrentWeek": "Java e Tanishme",
"CurrentYear": "Viti i Tanishëm",
@@ -131,7 +134,6 @@
"EvolutionSummaryGeneric": "%1$s në %2$s krahasuar me %3$s te %4$s. Evolucion: %5$s",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Përdoruesi duhet të jetë ose Superpërdorues, ose vetë përdoruesi '%s'.",
"ExceptionConfigurationFileNotFound": "S’u gjet kartela {%s} e formësimit.",
- "ExceptionConfigurationFileNotFound2": "Nëse kartela ekziston, ju lutemi, kontrolloni nëse përdoruesi '%1$s' mundet ta lexojë %2$s.",
"ExceptionDatabaseVersion": "Versioni juaj për %1$s është %2$s por Piwik-u lyp të paktën %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Kodi bazë i Piwik-ut tuaj xhiron versionin e vjetër %1$s dhe kemi dalluar se Baza juaj e të Dhënave Piwik është përmirësuar tashmë me versionin më të ri %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Ndoshta përgjegjësit e Piwik-ut tuaj janë duke përfunduar procesin e përmirësimit. Ju lutemi, riprovoni pas pak minutash.",
@@ -170,22 +172,28 @@
"GraphHelp": "Më tepër të dhëna rreth shfaqjes së grafikëve në Piwik.",
"HelloUser": "Tungjatjeta, %s!",
"Help": "Nidhmë",
+ "HelpTranslatePiwik": "Ndoshta do të donit të %1$sna ndihmonit të përmirësojmë përkthimet e Piwik-ut%2$s?",
"Hide": "hide",
"HoursMinutes": "%1$s orë %2$s minuta",
"Id": "Id",
"IfArchivingIsFastYouCanSetupCronRunMoreOften": "Duke pranuar që arkivimi në site-in tuaj është i shpejtë, mund ta rregulloni crontab-in të xhirojë më shpesh.",
+ "InfoFor": "Të dhëna për %s",
"InvalidDateRange": "Interval i Pavlefshëm Datash, Ju lutem, Riprovoni",
"InvalidResponse": "Të dhënat e marra janë të pavlefshme.",
"IP": "IP",
"JsTrackingTag": "Kod JavaScript Gjurmimi",
"Language": "Gjuhë",
"LastDays": "%s ditët e fundit (përfshirë të sotmen)",
+ "LastDaysShort": "%s ditët e fundit",
+ "LearnMore": "%1$smësoni më tepër%2$s",
"Loading": "Po ngarkohet...",
"LoadingData": "Po ngarkohen të dhënat...",
"LoadingPopover": "Loading %s...",
+ "LoadingPopoverFor": "Po ngarkohet %s për",
"Locale": "sq_AL.UTF-8",
"Logout": "Dilni",
"MainMetrics": "Matjet kryesore",
+ "Matches": "Përputhje",
"MediumToHighTrafficItIsRecommendedTo": "Për sajte me trafik të shumtë, këshillojmë t’i përpunoni raportet për ditën e sotme e shumta çdo gjysmë ore (%1$s sekonda) ose çdo një orë (%2$s sekonda).",
"Metadata": "Tejtëdhëna",
"Metric": "Metric",
@@ -195,9 +203,16 @@
"MinutesSeconds": "%1$s minuta %2$ss",
"Mobile": "Mobile",
"Monthly": "Përmuaj",
+ "MonthlyReport": "përmuaj",
+ "MonthlyReports": "Raporte të përmuajshëm",
+ "More": "Më tepër",
+ "MoreDetails": "Më Tepër Hollësi",
+ "MoreLowerCase": "më tepër",
"MultiSitesSummary": "Krejt Sajtet",
"Name": "Emër",
"NbActions": "Numër Veprimesh",
+ "NbSearches": "Numër Kërkimesh të Brendshme",
+ "NeedMoreHelp": "Ju duhet më shumë ndihmë?",
"Never": "Kurrë",
"NewReportsWillBeProcessedByCron": "Kur arkivimi nga Piwik-u nuk vihet në punë nga shfletuesi, raportet e reja do të përpunohen nga crontab.",
"NewUpdatePiwikX": "Përditësim i Ri: Piwik %s",
@@ -208,25 +223,46 @@
"NoDataForGraph": "Pa të dhëna për këtë grafik",
"NoDataForTagCloud": "Pa të dhëna për këtë re etiketash.",
"NotDefined": "%s pa u përkufizuar",
+ "Note": "Shënim",
+ "NotInstalled": "E painstaluar",
"NotRecommended": "jo e këshillueshme",
"NotValid": "%s nuk është e vlefshme",
"NumberOfVisits": "Numër vizitash",
+ "NUsers": "%s përdorues",
"NVisits": "%s vizita",
"Ok": "Ok",
+ "OneAction": "1 veprim",
"OneVisit": "1 vizitë",
"OnlyEnterIfRequired": "Jepni emër përdoruesi vetëm nëse shërbyesi juaj SMTP lyp një të tillë.",
"OnlyEnterIfRequiredPassword": "Jepni fjalëkalim vetëm nëse shërbyesi juaj SMTP lyp një të tillë.",
"OnlyUsedIfUserPwdIsSet": "E përdorur vetëm kur ka të caktuar një emër përdoruesi\/fjalëkalim, pyesni mundësuesin e llogarisë suaj nëse jeni i pasigurt se cilën metodë të përdorni.",
"OpenSourceWebAnalytics": "Analizë Web me Burim të Hapët",
+ "OperationAtLeast": "E pakta",
+ "OperationAtMost": "E shumta",
+ "OperationContains": "Përmban",
+ "OperationDoesNotContain": "S’përmban",
+ "OperationEquals": "Baras me",
+ "OperationGreaterThan": "Më e madhe se",
+ "OperationIs": "Është",
+ "OperationIsNot": "S’është",
+ "OperationLessThan": "Më e vogël se",
+ "OperationNotEquals": "Jo e barabartë me",
+ "OperationStartsWith": "Fillon me",
+ "OperationEndsWith": "Mbaron me",
"OptionalSmtpPort": "Opsionale. Parazgjedhjet janë 25 për të pafshehtëzuarat dhe TLS SMTP, dhe 465 për SSL SMTP.",
+ "Options": "Mundësi",
+ "Or": "ose",
"Others": "Tjetër",
"Outlink": "Lidhje për gjetiu",
"Outlinks": "Lidhje për Jashtë",
+ "OverlayRowActionTooltip": "Shihni të dhëna analitike drejt e te sajti juaj (hapet në skedë të re)",
+ "OverlayRowActionTooltipTitle": "Hapni Përmbledhje Faqeje",
"Overview": "Përmbledhje",
"Pages": "Faqe",
"Password": "Fjalëkalim",
"Period": "Periudhë",
"Piechart": "Qarkore",
+ "PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s është gati. Ju lutemi, njoftoni %2$spërgjegjësin e Piwik-ut%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Mund të kihet Piwik %1$s. %2$s Ju lutem, përditësojeni tani!%3$s (shihni %4$s ndryshimet%5$s).",
"PleaseSpecifyValue": "Ju lutemi, përcaktoni një vlerë për '%s'.",
"PleaseUpdatePiwik": "Ju lutemi, përditësoni Piwik-un tuaj",
@@ -235,6 +271,7 @@
"PoweredBy": "Bazuar në",
"Previous": "E mëparshmja",
"PreviousDays": "%s ditë më parë (pa përfshirë të sotmen)",
+ "PreviousDaysShort": "%s ditët e mëparshme",
"Price": "Çmim",
"ProductConversionRate": "Kurs Këmbimi Produkti",
"ProductRevenue": "Të ardhura Produkti",
@@ -242,9 +279,18 @@
"Measurables": "Të matshme",
"PurchasedProducts": "Produkte të Blerë",
"Quantity": "Sasi",
+ "RangeReports": "Intervale vetjakë datash",
+ "ReadThisToLearnMore": "%1$sLexoni këtë, që të dini më shumë.%2$s",
"Recommended": "(e këshilluar)",
"RecordsToPlot": "Regjistrime për t’u hedhur në grafik",
+ "Refresh": "Rifreskoje",
"RefreshPage": "Rifreskoje faqen",
+ "RelatedReport": "Raport i afërt",
+ "RelatedReports": "Raporte të afërt",
+ "Remove": "Hiqe",
+ "Report": "Raport",
+ "ReportGeneratedFrom": "Ky raport u prodhua duke përdorur të dhëna nga %s.",
+ "ReportRatioTooltip": "'%1$s' përfaqëson %2$s e %3$s %4$s me %5$s.",
"Reports": "Raporte",
"ReportsContainingTodayWillBeProcessedAtMostEvery": "Raportet për ditën e sotme (ose për çfarëdo Intervali Datash që përfshin ditën e sotme) do të përpunohen e shumta çdo",
"RearchiveTimeIntervalOnlyForTodayReports": "Kjo prek vetëm raportet për sot (ose çfarëdo Interval Datash që përfshin të sotmen)",
@@ -252,14 +298,24 @@
"RequestTimedOut": "Kërkesës për të dhëna te %s i mbaroi koha. Ju lutem, riprovoni.",
"Required": "%s i domosdoshëm",
"ReturningVisitor": "Vizitor i Mëparshëm",
+ "ReturningVisitorAllVisits": "Shihni krejt vizitat",
+ "RowEvolutionRowActionTooltip": "Shihni se si kanë ndryshuar përgjatë kohës vlerat për këtë rresht",
+ "RowEvolutionRowActionTooltipTitle": "Hapni Evolucion Rreshti",
+ "Rows": "Rreshta",
"RowsToDisplay": "Rreshta për shfaqje",
"Save": "Ruaje",
"SaveImageOnYourComputer": "Për ta ruajtur figurën në kompjuterin tuaj, djathtasklikoni mbi figurën dhe përzgjidhni \"Ruajeni Figurën Si...\"",
"Search": "Kërko",
+ "Clear": "Pastroje",
+ "SearchNoResults": "S’ka përfundime",
+ "SeeAll": "shihini krejt",
+ "SeeThisFaq": "Shihni %1$skëtë faq%2$s.",
"Segment": "Segment",
"SelectYesIfYouWantToSendEmailsViaServer": "Përzgjidhni \"Po\" nëse doni të dërgoni, ose keni për të dërguar, e-mail përmes një shërbyesi të emërtuar, në vend se përmes të një funksioni vendor poste",
"Settings": "Rregullime",
"Shipping": "Dërgesë",
+ "Show": "shfaqe",
+ "SingleWebsitesDashboard": "Pult Sajti Njësh",
"SmallTrafficYouCanLeaveDefault": "Për sajte me trafik të pakët, mund të lini parazgjedhjen prej %s sekondash, dhe të konsultoni krejt raportet në kohë reale.",
"SmtpEncryption": "Fshehtëzim SMTP-je",
"SmtpPassword": "Fjalëkalim SMTP",
@@ -267,14 +323,23 @@
"SmtpServerAddress": "Adresë shërbyesi SMTP",
"SmtpUsername": "Emër përdoruesi SMTP",
"Source": "Burim",
+ "StatisticsAreNotRecorded": "Ndjekja e Vizitorëve Nga Piwik-u është e çaktivizuar! Riaktivizojeni ndjekjen duke dhënë vlerën record_statistics = 1 te kartela juaj config\/config.ini.php.",
"Subtotal": "Nëntotal",
+ "Summary": "Përmbledhe",
"Table": "Tabelë",
"TagCloud": "Re Etiketash",
"Tax": "Taksë",
+ "TimeAgo": "%s më parë",
+ "TimeFormat": "Format kohe",
+ "TimeOnPage": "Koha në faqe",
"Total": "Gjithsej",
+ "TotalRatioTooltip": "Kjo është %1$s e krejt %2$s %3$s.",
"TotalRevenue": "Të ardhura Gjithsej",
"TotalVisitsPageviewsActionsRevenue": "(Gjithsej: %1$s vizita, %2$s parje faqesh, %3$s veprime, %4$s të ardhura)",
+ "TrackingScopeAction": "Veprim",
"TrackingScopePage": "Faqe",
+ "TrackingScopeVisit": "Vizitë",
+ "TransitionsRowActionTooltip": "Shihni se ç’bënë vizitorët para dhe pas parjes së kësaj faqeje",
"TranslatorName": "Besnik Bleta",
"UniquePurchases": "Blerje Unike",
"Unknown": "I panjohur",
@@ -286,6 +351,7 @@
"Value": "Vlerë",
"VBarGraph": "Grafik me shtylla vertikale",
"View": "Pamje",
+ "ViewDocumentationFor": "Shihni dokumentimin e %1$s",
"Visit": "Vizitë",
"VisitConvertedGoal": "Vizita shndërroi të paktën një Objektiv",
"VisitConvertedGoalId": "Vizita shndërroi një Id specifike Objektivi",
@@ -300,13 +366,21 @@
"VisitType": "Lloj vizitori",
"VisitTypeExample": "Për shembull, për përzgjedhjen e krejt vizitorëve që janë rikthyer te site-i web, përfshi ata që kanë blerë diçka gjatë vizitash të mëparshme, kërkesa API do të duhej të përmbante %s",
"Warning": "Sinjalizim",
+ "WarningPhpVersionXIsTooOld": "Versioni PHP %s që po përdorni, ka mbërritur në Fundin e Vet (EOL). Këshilloheni me forcë ta përmirësoni me një version të tanishëm, ngaqë përdorimi i këtij versioni mund t’ju lërë zbuluar përballë cenueshmërish sigurie dhe të metash që janë ndrequr në versione më të rinj të PHP-së.",
+ "WarningPiwikWillStopSupportingPHPVersion": "Piwik-u do të reshtë së mbuluari PHP %1$s në versionin pasues të rëndësishëm. Përmirësojeni PHP-në tuaj të paktën me PHP %2$s, para se të jetë shumë vonë!",
"WarningFileIntegrityNoManifest": "Kontrolli i pacenueshmërisë së kartelës s’u krye dot për shkak të mungesës së manifest.inc.php.",
+ "WarningFileIntegrityNoManifestDeployingFromGit": "Nëse po kryeni instalim të Piwik-ut nga Git, ky mesazh është normal.",
"WarningFileIntegrityNoMd5file": "Kontrolli i pacënueshmërisë së kartelës nuk u plotësua dot për shkak të mungesës së funksionit md5_file().",
"WarningDebugOnDemandEnabled": "Mënyra gjurmues %1$s është e aktivizuar. Për arsye sigurie, kjo do të duhej të aktivizohej vetëm për një kohë të shkurtër. Që ta çaktivizoni, caktojeni %2$s si %3$s te %4$s",
"Website": "Sajt",
"Weekly": "Përjavë",
+ "WeeklyReports": "Raporte të përjavshëm",
+ "WellDone": "Ju lumtë!",
"Widgets": "Widget-e",
"Widget": "Widget",
+ "XComparedToY": "%1$s krahasuar me %2$s",
+ "XFromY": "%1$s nga %2$s",
+ "YearlyReports": "Raporte të përvitshëm",
"YearsDays": "%1$s vite %2$s ditë",
"Yes": "Po",
"YouAreCurrentlyUsing": "Jeni duke përdorur Piwik %s.",
@@ -315,15 +389,83 @@
"YourChangesHaveBeenSaved": "Ndryshimet tuaja u ruajtën."
},
"Mobile": {
+ "AboutPiwikMobile": "Rreth Piwik-ut për Celular",
+ "AccessUrlLabel": "URL Hyrjeje Piwik",
"Account": "Llogari",
"Accounts": "Llogari",
+ "AddAccount": "Shtoni llogari",
+ "AddPiwikDemo": "Shtoni Demo Piwik-u",
+ "Advanced": "Të mëtejshme",
"AnonymousAccess": "Hyrje anonime",
- "AnonymousTracking": "Gjurmim anonim"
+ "AnonymousTracking": "Gjurmim anonim",
+ "AskForAnonymousTrackingPermission": "Po u aktivizua, Piwik-u për Celular do të dërgojë te piwik.org të dhëna anonime përdorimi. Synimi është të përdoren këto të dhëna për të ndihmuar zhvilluesit e Piwik-ut për Celular të kuptojnë më mirë se si përdoret aplikacioni. Të dhënat që dërgohen janë: menu dhe rregullime të klikuara, emër dhe version OS-i, çfarëdo gabimi i shfaqur në Piwik-un për Celular. NUK do të gjurmojmë ndonjë të dhënë të statistikave tuaja. Këto të dhëna të anonime nuk do të bëhen kurrë publike. Gjurmimin anonim mund ta aktivizoni\/çaktivizoni kur të doni, te Rregullimet.",
+ "ChooseHttpTimeout": "Zgjidhni vlerë mbarimi kohe për HTTP-në",
+ "ChooseMetric": "Zgjidhni matje",
+ "ChooseReport": "Zgjidhni një raport",
+ "ChooseSegment": "Zgjidhni segment",
+ "ConfirmRemoveAccount": "Doni të hiqet kjo llogari?",
+ "DefaultReportDate": "Datë raporti",
+ "EmailUs": "Dërgonani email",
+ "EnableGraphsLabel": "Shfaq graikë",
+ "HelpUsToImprovePiwikMobile": "Do të donit të aktivizionit gjurmim anonim përdorimi në Piwik Mobile?",
+ "HowtoDeleteAnAccount": "Që të hiqni një llogari, shtypeni për pak çaste.",
+ "HowtoDeleteAnAccountOniOS": "Rrëshqitni gishtin nga e djathta në të majtë që të fshihni një llogari",
+ "HowtoLoginAnonymous": "Për hyrje anonime, lërini të zbrazëta fushat për emrin e përdoruesit dhe fjalëkalimin",
+ "HttpIsNotSecureWarning": "Token-i juaj i autorizimit Piwik (token_auth) dërgohet si tekst i dukshëm, nëse përdorni 'HTTP'. Për këtë arsye këshillojmë HTTPS-në për transport të sigurt të të dhënave nëpër internet. Doni të vazhdohet?",
+ "HttpTimeout": "Mbarim kohe për HTTP-në",
+ "IncompatiblePiwikVersion": "Versioni Piwik që përdorni është i papërputhshëm me Piwik Mobile 2. Përditësoni instalimin tuaj të Piwik-ut dhe riprovoni, ose instaloni Piwik Mobile 1.",
+ "LastUpdated": "Përditësuar Së Fundi Më: %s",
+ "LoadingReport": "Po ngarkohet %s",
+ "LoginCredentials": "Kredenciale",
+ "LoginToPiwikToChangeSettings": "Hyni te shërbyesi juaj Piwik që të krijoni dhe përditësoni sajte, përdorues ose për të ndryshuar Rregullime të Përgjithshme, të tilla si \"Raport për ngarkim si parazgjedhje\".",
+ "LoginUseHttps": "Përdor https",
+ "NavigationBack": "Mbrapsht",
+ "NetworkError": "Gabim Rrjeti",
+ "NetworkErrorWithStatusCode": "Pati një gabim \"%1$s\". Kërkesa pati si përgjigje gjendjen \"%2$s\". URL-ja qe \"%3$s\". Për më tepër të dhëna rreth gabimit dhe se si të zgjidhet, ju lutemi, kontrolloni URL-në që dhatë dhe regjistrat e gabimeve në këtë shërbyes.",
+ "NetworkErrorWithStatusCodeShort": "Gabim Rrjeti %s",
+ "NetworkNotReachable": "Rrjet i pakapshëm",
+ "NoAccountIsSelected": "Duhet të përzgjidhni një llogari. Shtoni një llogari të re, nëse s’keni formësuar një të tillë.",
+ "NoDataShort": "S’ka të Dhëna",
+ "NoPiwikAccount": "S’keni Llogari Piwik?",
+ "NoReportsShort": "S’ka Raporte",
+ "NoVisitorFound": "S’u gjet vizitor",
+ "NoVisitorsShort": "S’ka Vizitorë",
+ "NoWebsiteFound": "S’u gjet sajt",
+ "NoWebsitesShort": "S’ka Sajte",
+ "PullDownToRefresh": "Tërhiqeni poshtë që të rifreskohet…",
+ "PossibleSslErrorExplanation": "Ndodhi një gabim që mund të jetë shkaktuar nga një dëshmi e pavlefshme ose e vetënënshkruar: \"%s\". Mund të arrini të bëni hyrjen, kur shpërfillni vleftësimin SSL, por është më pak i sigurt. Zgjedhjen për vleftësime SSL mund ta ndryshoni kur të doni, te Rregullimet.",
+ "IgnoreSslError": "Shpërfille Gabimin SSL",
+ "RatingDontRemindMe": "Mos ma kujto",
+ "RatingNotNow": "Jo tani",
+ "RatingNow": "OK, do ta vlerësoj tani",
+ "RatingPleaseRateUs": "Aplikacioni Piwik Mobile është Software i Lirë, do tta vlerësonim vërtet, nëse ndaleni një minutë që ta vlerësoni këtë aplikacion te %1$s. Nëse keni sugjerime për veçori të reja ose njoftime të metash, ju lutemi, lidhuni me %2$s",
+ "ReleaseToRefresh": "Lëshojeni që të rifreskohet…",
+ "Reloading": "Po ringarkohet…",
+ "RequestTimedOutShort": "Gabim Mbarimi Kohe Rrjeti",
+ "RestrictedCompatibility": "Përputhshmëri e kufizuar",
+ "RestrictedCompatibilityExplanation": "Versioni %s i Piwik-ut që po përdorni nuk mbulohet plotësisht nga Piwik Mobile 2. Mund të hasni në të meta. Ju këshillojmë ose ta përditësoni Piwik-un me versionin më të ri, ose të përdorni Piwik Mobile 1.",
+ "SaveSuccessError": "URL-ja Piwik ose dyshja emër përdoruesi dhe fjalëkalim është e gabuar.",
+ "SearchWebsite": "Kërkoni sajte",
+ "ShowAll": "Shfaqi krejt",
+ "ShowLess": "Shfaq më pak",
+ "TopVisitedWebsites": "Sajtet më të vizituar",
+ "TryIt": "Provojeni!",
+ "UseSearchBarHint": "Këtu shfaqen vetëm %s sajtet e parë. Që të shihni sajtet e tjerë, ju lutemi, përdorni shtyllën e kërkimeve.",
+ "VerifyAccount": "Verifikim Llogarie",
+ "ValidateSslCertificate": "Vleftëso Dëshminë SSL",
+ "VerifyLoginData": "Sigurohuni që dyshja emër përdoruesi dhe fjalëkalim të jetë e saktë.",
+ "YouAreOffline": "Na ndjeni, jeni i palidhur në internet"
},
"RowEvolution": {
"AvailableMetrics": "Matje të mundshme",
+ "CompareDocumentation": "Që të krahasoni disa zëra njëherësh, klikoni mbi lidhjen më poshtë dhe hapeni këtë flluskë për një tjetër rresht nga e njëjta tabelë.<br \/>Përdorni ndërthurjen Shift-klikim që t’i vini shenjë rreshtit për krahasim, pa hapur këtë flluskë.",
"CompareRows": "Krahasoni regjistrime",
+ "ComparingRecords": "Po krahasohen %s rreshta",
+ "Documentation": "Klikoni mbi matjet që t’i shfaqni në grafik të mëdhenj evolucioni. Përdorni Shift-klikim që të shfaqni disa matje njëherësh..",
"MetricBetweenText": "nga %1$s në %2$s",
- "MetricsFor": "Matje për %s"
+ "MetricsFor": "Matje për %s",
+ "MultiRowEvolutionTitle": "Evolucion i shumë rreshtave",
+ "PickAnotherRow": "Zgjidhni një tjetër rresht për krahasim",
+ "PickARow": "Zgjidhni një rresht për krahasim"
}
} \ No newline at end of file
diff --git a/lang/sr.json b/lang/sr.json
index b32a676c9b..4282a3d16b 100644
--- a/lang/sr.json
+++ b/lang/sr.json
@@ -133,7 +133,6 @@
"ExceptionContactSupportGeneric": "Ukoliko se ovo još uvek dešava, molimo vas %1$sda kontaktirate vašeg Piwik administratora%2$s za pomoć.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Korisnik treba da bude ili superkorisnik ili sam korisnik '%s'.",
"ExceptionConfigurationFileNotFound": "Datoteka sa podešavanjima {%s} nije nađena.",
- "ExceptionConfigurationFileNotFound2": "Ukoliko datoteka postoji, molimo vas da proverite da je %1$s dostupna za čitanje korisniku '%2$s'.",
"ExceptionDatabaseVersion": "Vaša %1$s verzija je %2$s ali Piwik zahteva barem %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Vaša Piwik aplikacija radi pod starom verzijom %1$s a otkrili smo da je Piwik baza već nadograđena na verziju %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Možda vaš Piwik administrator baš sad završava proces nadogradnje. Molimo vas da pokušate ponovo za par minuta.",
@@ -274,7 +273,6 @@
"Password": "Lozinka",
"Period": "Period",
"Piechart": "Grafikon",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s je saradnički projekat %7$sPiwik tim%8$s članova kao i mnogih drugih učesnika širom sveta. Ukoliko ste Piwik fan, možete da pomognete: pogledajte %3$sKako da učestvujete u Piwik-u%4$s, ili %5$sizvršite donaciju%6$s kako biste pomogli razvoju Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s je izašao. Obavestite %2$sPiwik administratora%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Objavljen je Piwik %1$s. %2$s Molimo Vas da izvršite nadogradnju!%3$s (pogledajte %4$spromene%5$s).",
"PleaseSpecifyValue": "Molimo vas da navedete vrednost za '%s'.",
diff --git a/lang/sv.json b/lang/sv.json
index 312eb24a1b..1b6f9f683d 100644
--- a/lang/sv.json
+++ b/lang/sv.json
@@ -1,7 +1,7 @@
{
"General": {
- "12HourClock": "12-timmars klocka",
- "24HourClock": "24-timmars klocka",
+ "12HourClock": "12-timmarsklocka",
+ "24HourClock": "24-timmarsklocka",
"AbandonedCarts": "Övergivna varukorgar",
"AboutPiwikX": "Om Piwik %s",
"Action": "Handling",
@@ -140,7 +140,6 @@
"ExceptionContactSupportGeneric": "Om detta fel består, %1$skontakta din Piwikadministratör%2$s för hjälp.",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Den här användaren måste vara antingen Superanvändaren eller '%s' användaren.",
"ExceptionConfigurationFileNotFound": "Konfigurationsfilen {%s} hittades inte.",
- "ExceptionConfigurationFileNotFound2": "Om filen existerar, vänligen kolla att %1$s är läsbar av användaren '%2$s'.",
"ExceptionDatabaseVersion": "Din %1$s version är %2$s men Piwik kräver åtminstone %3$s.",
"ExceptionDatabaseVersionNewerThanCodebase": "Din Piwikinstallation använder den gamla versionen %1$s och vi har upptäckt att din Piwikdatabas redan har uppdaterats till den nyare versionen %2$s.",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "Det är möjligt att din Piwikadministratör håller på att uppdatera systemet. Försök igen om några minuter.",
@@ -285,7 +284,6 @@
"Password": "Lösenord",
"Period": "Period",
"Piechart": "Cirkeldiagram",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s är ett samarbetsprojekt av %7$sPiwik teamet%8$som består av medlemmar och även bidragsgivare från hela världen. Om du gillar Piwik, så kan du hjälpa till: läs mer om %3$sHur du hjälper till med Piwik%4$s, eller %5$sdonera nu%6$s för att hjälpa till att finansiera Piwik 3.0!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s finns tillgänglig. Vänligen informera din %2$sPiwik administratör%3$s.",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s är tillgänglig. %2$sVänligen uppdatera nu!%3$s (se %4$sförändringar%5$s).",
"PleaseSpecifyValue": "Var vänlig och ange ett värde för '%s'.",
@@ -366,7 +364,7 @@
"TrackingScopeVisit": "Besök",
"TransitionsRowActionTooltip": "Se vad besökarna gjorde före och efter att ha tittat på den här sidan",
"TransitionsRowActionTooltipTitle": "Öppna övergångar",
- "TranslatorName": "Sökmotoroptimering.se, Kampanjjakt.se, Fredrik Astrom, Tony, <a href=\"http:\/\/www.kb.se\/\">National Library of Sweden<\/a>, <a href=\"https:\/\/www.facebook.com\/Rabattkod-147619931946607\">Yegane Shirazi<\/a>",
+ "TranslatorName": "Fredrik Astrom, <a href=\"http:\/\/www.kb.se\/\">National Library of Sweden<\/a>, <a href=\"https:\/\/www.facebook.com\/Rabattkod-147619931946607\">Yegane Shirazi<\/a>",
"UniquePurchases": "Unika beställningar",
"Unknown": "Okänt",
"Upload": "Ladda upp",
@@ -418,7 +416,7 @@
"YourChangesHaveBeenSaved": "Dina ändringar har sparats."
},
"Mobile": {
- "AboutPiwikMobile": "Om Piwik Mobil",
+ "AboutPiwikMobile": "Om Piwik Mobile",
"AccessUrlLabel": "Piwik URL",
"Account": "Konto",
"Accounts": "Konton",
@@ -439,7 +437,7 @@
"EvolutionGraph": "Historisk graf",
"HelpUsToImprovePiwikMobile": "Vill du aktivera anonym spårning i Piwik Mobile?",
"HowtoDeleteAnAccount": "Tryck länge för att ta bort ett konto.",
- "HowtoDeleteAnAccountOniOS": "Dra från vänster till höger för att radera ett konto",
+ "HowtoDeleteAnAccountOniOS": "Dra från vänster till höger för att ta bort ett konto",
"HowtoLoginAnonymous": "Lämna användarnamn och lösenord tomt för anonym inloggning",
"HttpIsNotSecureWarning": "Ditt Piwik tillståndsbevis (token_auth) skickas i klartext om du använder 'HTTP'. Av denna anledning rekommenderar vi HTTPS för säker transport av data över Internet. Vill du fortsätta?",
"HttpTimeout": "HTTP timeout",
diff --git a/lang/tr.json b/lang/tr.json
index faa035cf35..1475840f3f 100644
--- a/lang/tr.json
+++ b/lang/tr.json
@@ -2,24 +2,25 @@
"General": {
"12HourClock": "12 saatlik zaman biçimi",
"24HourClock": "24 saatlik zaman biçimi",
- "AbandonedCarts": "Terkedilen Sepetler",
+ "AbandonedCarts": "İptal Edilen Sepetler",
"AboutPiwikX": "Piwik %s Hakkında",
"Action": "Eylem",
"Actions": "Eylemler",
"Add": "Ekle",
- "AfterEntry": "buraya girdikten sonra",
- "All": "Hepsi",
- "AllowPiwikArchivingToTriggerBrowser": "Tarayıcı tarafından görüntülendiğinde raporları arşivle",
- "AllWebsitesDashboard": "Tüm Websitelerin Panosu",
+ "AfterEntry": "buraya yazdıktan sonra",
+ "All": "Tümü",
+ "AllowPiwikArchivingToTriggerBrowser": "Web tarayıcıda görüntülenen raporları arşivlensin",
+ "AllWebsitesDashboard": "Tüm Web Siteleri Panosu",
"And": "ve",
"API": "API",
"Apply": "Uygula",
- "ArchivingInlineHelp": "Orta yoğunluklu web siteleri için Tarayıcı üzerinden arşivlemenin kapatılması öneriilir. Bunun yerine her saat Piwik raporu üretecek zamanlanmış bir görev tanımlanması tavsiye edilir.",
- "AuthenticationMethodSmtp": "SMTP için kimlik doğrulama yöntemi",
+ "ArchivingInlineHelp": "Orta ve yüksek yoğunluklu web siteleri için Piwik arşivlemesinin web tarayıcı üzerinden tetiklenme seçeneğinin kapatılması öneriilir. Bunun yerine saatlik olarak Piwik raporlarını oluşturacak zamanlanmış bir görevin tanımlanması önerilir.",
+ "ArchivingTriggerDescription": "Daha büyük Piwik kurulumları için raporları otomatik olarak işleyen bir %1$szamanlanmış görev%2$s oluşturulması önerilir.",
+ "AuthenticationMethodSmtp": "SMTP kimlik doğrulama yöntemi",
"AverageOrderValue": "Ortalama Sipariş Değeri",
"AveragePrice": "Ortalama Fiyat",
- "AverageQuantity": "Ortalama Ürün Adedi",
- "BackToPiwik": "Piwik'e geri dön.",
+ "AverageQuantity": "Ortalama Adet",
+ "BackToPiwik": "Piwik'e Geri Dön",
"Broken": "Bozuk",
"BrokenDownReportDocumentation": "aksis veya ordinatı olmayan kullanışlı küçük grafikler şeklinde sayfanın altına gösterilen çeşitli raporlar çökmüştür. Raporda bulunan grafiklere tıklayarak grafikleri büyütebilirsin.",
"Cancel": "İptal",
@@ -221,6 +222,7 @@
"OverlayRowActionTooltip": "İstatistik verilerini direkt site üzerinde gör (yeni sekmede açılır)",
"Overview": "Genel Bakış",
"Pages": "Sayfalar",
+ "Pagination": "%1$s - %2$s of %3$s",
"ParameterMustIntegerBetween": "%1$s değeri %2$s ve %3$s arasında sayısal bir değer olmalıdır.",
"Password": "Şifre",
"Period": "Zaman aralığı",
@@ -303,7 +305,7 @@
"Visitors": "Ziyaretçiler",
"VisitsWith": "%s ile Ziyaretler",
"VisitorSettings": "Ziyaretçi Ayarlari",
- "VisitType": "Ziyaret tipi",
+ "VisitType": "Ziyaret türü",
"Warning": "Uyarı",
"WarningFileIntegrityNoManifest": "manifest.inc.php dosyası bulunamadığı için dosya bütünlük kontrolü gerçekleştirilemedi.",
"WarningFileIntegrityNoMd5file": "md5_file() fonksiyonu bulunamadığı için dosya bütünlük kontrolü tamamlanamadı.",
@@ -325,24 +327,25 @@
},
"Mobile": {
"AboutPiwikMobile": "Piwik Mobil Hakkında",
- "AccessUrlLabel": "Piwik Erişim Url'si",
+ "AccessUrlLabel": "Piwik Erişim Adresi",
"Account": "Hesap",
"Accounts": "Hesaplar",
"AddAccount": "Hesap ekle",
- "AddPiwikDemo": "Piwik Demo Ekle",
+ "AddPiwikDemo": "Piwik Tanıtımı Ekle",
"Advanced": "Gelişmiş",
"AnonymousAccess": "İsimsiz erişim",
"AnonymousTracking": "İsimsiz izleme",
- "ChooseHttpTimeout": "HTTP zamanaşımı değerini seçin",
- "ChooseMetric": "Metriki seç",
- "ChooseReport": "Rapor seçin",
- "ChooseSegment": "Bölüm seç",
- "ConfirmRemoveAccount": "Bu hesabı kaldırmak istediğinizden emin misiniz?",
+ "AskForAnonymousTrackingPermission": "Bu seçenek etkinleştirildiğinde, Piwik Mobile, kullanım verilerini piwik.org üzerine isimsiz olarak gönderir. Böylece Piwik Mobile geliştiricileri bu verileri sayesinde uygulamanın nasıl kullanıldığını daha iyi anlayabilir. Gönderilen bilgiler tıklanan menü ve ayarlar, işletim sisteminin adı ve sürümü, Piwik Mobile üzerindeki hatalardan oluşur. İstatistik bilgilerinizin hiç biri İZLENMEZ. Bu isimsiz veriler asla herkese açık olarak sunulmaz. İsimsiz izlemeyi istediğiniz zaman ayarlar bölümünden etkinleştirebilir ya da devre dışı bırakabilirsiniz.",
+ "ChooseHttpTimeout": "HTTP zaman aşımı değerini seçin",
+ "ChooseMetric": "Ölçümü seçin",
+ "ChooseReport": "Bir rapor seçin",
+ "ChooseSegment": "Parça seçin",
+ "ConfirmRemoveAccount": "Bu hesabı silmek istediğinize emin misiniz?",
"DefaultReportDate": "Rapor tarihi",
- "EmailUs": "Bize E-Posta gönder",
- "EnableGraphsLabel": "Grafikleri Göster",
- "EvolutionGraph": "Tarihsel Grafik",
- "HelpUsToImprovePiwikMobile": "Piwik Mobil'de anonim kullanımları takip etmek ister misin?",
+ "EmailUs": "Bize e-Posta gönderin",
+ "EnableGraphsLabel": "Çizelgeleri görüntüle",
+ "EvolutionGraph": "Geçmiş Çizelgesi",
+ "HelpUsToImprovePiwikMobile": "Piwik Mobil üzerinde isimsiz kullanım verilerinin izlenmesini etkinleştirmek ister misiniz?",
"HowtoDeleteAnAccount": "Bir hesabı silmek için uzun basın.",
"HowtoDeleteAnAccountOniOS": "Bir hesabı silmek için sağdan sola kaydırın.",
"HowtoLoginAnonymous": "Anonim giriş yapmak için kullanıcı adı ve şifre kısmını boş bırakın",
@@ -383,14 +386,17 @@
"YouAreOffline": "Üzgünüm, şu anda çevrimdışısınız"
},
"RowEvolution": {
- "AvailableMetrics": "Kullanılabilir ölçümler",
+ "AvailableMetrics": "Kullanılabilecek ölçümler",
"CompareDocumentation": "Aşağıdaki bağlantıyı tıklayın ve birden çok kaydı karşılaştırmak için aynı tablodan başka bir satır için bu pencereyi açın<br \/>Bu pencereyi açmadan satırı karşılaştırma için işaretlemek istiyorsanız Üst Karakter tuşuna basarak tıklayın.",
"CompareRows": "Kayıtları karşılaştır",
"ComparingRecords": "%s satır karşılaştırılıyor",
+ "Documentation": "Büyük gelişim çizelgesinde görüntülenecek ölçümlere tıklayın. Aynı anda birden çok ölçüm görüntülemek için Üst Karakter tuşuna basarak tıklayın.",
"MetricBetweenText": "%1$s - %2$s arası",
- "MetricChangeText": "%s zaman içinde değişim",
- "MetricsFor": "%s için ölçümler",
- "PickAnotherRow": "Karşılaştırmak için başka bir satır seç",
- "PickARow": "Karşılaştırmak için bir satır seç"
+ "MetricChangeText": "Zaman içinde %s değişim",
+ "MetricMinMax": "%1$s sınırında %2$s ile %3$s arasında aralık boyunca",
+ "MetricsFor": "%s ölçümleri",
+ "MultiRowEvolutionTitle": "Birden çok satırın gelişimi",
+ "PickAnotherRow": "Karşılaştırılacak başka bir satır seçin",
+ "PickARow": "Karşılaştırılacak bir satır seçin"
}
} \ No newline at end of file
diff --git a/lang/uk.json b/lang/uk.json
index 923a203cc7..31f5c63dd3 100644
--- a/lang/uk.json
+++ b/lang/uk.json
@@ -1,179 +1,504 @@
{
"General": {
+ "12HourClock": "12-годинний формат часу",
+ "24HourClock": "24-годинний формат часу",
+ "AbandonedCarts": "Нереалізовані покупки",
"AboutPiwikX": "Про Piwik %s",
"Action": "Дія",
"Actions": "Дії",
- "AllWebsitesDashboard": "Панель керування всіх сайтів",
- "API": "API",
- "ArchivingInlineHelp": "Для веб-сайтів з середнім та високим трафіком рекомендується вимкнути можливість запуску Piwik при перегляді браузером. В такому випадку рекомендується налаштувати планувальних завдань (cron job) та генерувати звіти що години.",
- "ArchivingTriggerDescription": "Для великих інсталяцій Piwik рекомендується %1$sналаштувати планувальних завдань (cron job)%2$s щоб обробляти звіти автоматизовано.",
- "AuthenticationMethodSmtp": "Метод аутентифікації на SMTP сервері",
+ "Add": "Додати",
+ "AfterEntry": "після заходу сюди",
+ "All": "Усе",
+ "AllowPiwikArchivingToTriggerBrowser": "Архів звітів при перегляді в браузері",
+ "AllWebsitesDashboard": "Статистика всіх сайтів",
+ "And": "і",
+ "API": "API-функції",
+ "Apply": "Застосувати",
+ "ArchivingInlineHelp": "Для сайтів із середнім або високим навантаженням рекомендується скасувати архівування даних при вході в веб-аналітику через браузер. Замість цього краще призначити cron-завдання, щоб Piwik автоматично формував звіти кожну годину.",
+ "ArchivingTriggerDescription": "Для сайтів з високим навантаженням настійно рекомендується %1$sпризначити cron-завдання%2$s, яка буде формувати звіти автоматично.",
+ "AuthenticationMethodSmtp": "метод аутентифікації SMTP",
+ "AverageOrderValue": "Середня вартість замовлення",
+ "AveragePrice": "Середня ціна",
+ "AverageQuantity": "Середня кількість",
"BackToPiwik": "Повернутися до Piwik",
+ "Broken": "Виникла помилка",
+ "BrokenDownReportDocumentation": "Він розбитий на безліч окремих звітів, які відображаються графіками внизу сторінки. Выможете збільшити ці графіки звичайним кліком по ним.",
+ "Cancel": "Відміна",
+ "CannotUnzipFile": "Не можу розпакувати файл %1$s: %2$s",
"ChangePassword": "Змінити пароль",
- "ChooseLanguage": "Виберіть мову",
- "ChoosePeriod": "Виберіть період",
+ "ChangeTagCloudView": "Врахуйте, що Ви можете переглядати звіт не тільки через хмару тегів. Використовуйте елементи керування внизу звіту для перемикання варіантів перегляду.",
+ "ChooseDate": "Вибір дати, зараз обрана дата %s",
+ "ChooseLanguage": "Вибрати мову",
+ "ChoosePeriod": "вибрати період",
+ "ClickHere": "Натисніть тут, щоб дізнатися більше",
+ "ClickToChangePeriod": "Натисніть ще раз, щоб змінити період.",
"Close": "Закрити",
- "ColumnActionsPerVisit": "Дій на кожне відвідування",
- "ColumnAverageTimeOnPage": "Середній час на стор.",
+ "ClickToSearch": "Натисніть для пошуку",
+ "ColumnActionsPerVisit": "Дії за відвідування",
+ "ColumnActionsPerVisitDocumentation": "Середня кількість дій (перегляди сторінок, завантаження або зовнішні посилання), які було виконано під час візитів.",
+ "ColumnAverageGenerationTime": "Середній час генерації сторінки",
+ "ColumnAverageGenerationTimeDocumentation": "Середній час, витрачений на генерацію сторінки. Цей показник включає в себе час, витрачений сервером для генерації веб-сторінки, а також час, який знадобився для відвідувачів, щоб скачати відповідь від сервера. Маленьке значення показника 'Середній час генерації' означає більш швидкий веб-сайт для Ваших відвідувачів!",
+ "ColumnAverageTimeOnPage": "Середній час перегляду сторінки",
+ "ColumnAverageTimeOnPageDocumentation": "Загальний час, який відвідувачі провели на даній сторінці (тільки на сторінці, а не на всьому сайті).",
"ColumnAvgTimeOnSite": "Середній час на сайті",
- "ColumnBounceRate": "Частота відмов",
+ "ColumnAvgTimeOnSiteDocumentation": "Середня тривалість відвідування.",
+ "ColumnBounceRate": "відсоток відмов",
+ "ColumnBounceRateDocumentation": "Відсоток візитів, які мали тільки один перегляд сторінки. Це означає, що користувач покинув сайт відразу зі стартової сторінки.",
"ColumnBounces": "Відмови",
- "ColumnConversionRate": "Коефіцієнт конвертації",
- "ColumnEntrances": "Заходи",
- "ColumnExitRate": "Частота виходів",
- "ColumnExits": "Виходи",
+ "ColumnBouncesDocumentation": "Число відвідувань, які почалися і закінчилися на цій сторінці. Це означає, що відвідувач залишив сайт після перегляду лише однієї сторінки.",
+ "ColumnConversionRate": "Конверсія",
+ "ColumnConversionRateDocumentation": "Відсоток відвідувань, які внесли вклад в конверсію цілей.",
+ "ColumnDestinationPage": "сторінка призначення",
+ "ColumnEntrances": "Входи на сайт",
+ "ColumnEntrancesDocumentation": "Число відвідувань, які почали з цієї сторінки.",
+ "ColumnExitRate": "Відсоток виходів",
+ "ColumnExitRateDocumentation": "Відсоток відвідувань, які закінчилися після перегляду даної сторінки.",
+ "ColumnExits": "Виходи з сайту",
+ "ColumnExitsDocumentation": "Число відвідувань, які закінчилися цією сторінкою.",
+ "ColumnGenerationTime": "Час генерації",
"ColumnKeyword": "Ключове слово",
- "ColumnLabel": "Напис",
- "ColumnMaxActions": "Максимум дій на одне відвідування",
+ "ColumnLabel": "Позначення",
+ "ColumnMaxActions": "Макс. дій за одне відвідування",
"ColumnNbActions": "Дії",
+ "ColumnNbActionsDocumentation": "Кількість дій, виконаних Вашими користувачами. До подій належать перегляди сторінок, завантаження і зовнішні посилання.",
"ColumnNbUniqVisitors": "Унікальні відвідувачі",
+ "ColumnNbUniqVisitorsDocumentation": "Число не повторюваних відвідувачів на Вашому сайті. Кожен користувач зараховується один раз, навіть якщо він відвідує сайт кілька разів на день.",
"ColumnNbUsers": "Користувачі",
+ "ColumnNbUsersDocumentation": "Кількість користувачів, зареєстрованих на Вашому сайті. Це число унікальних користувачів для яких встановлений User ID (за допомогою функції Tracking-коду 'setUserId').",
"ColumnNbVisits": "Відвідування",
- "ColumnPageviews": "Переглядів сторінок",
+ "ColumnNbVisitsDocumentation": "Якщо відвідувач відвідує Ваш сайт вперше або після 30 хвилин з моменту останнього відвідування, таке відвідування буде записано як нове.",
+ "ColumnPageBounceRateDocumentation": "Відсоток відвідувань, які почалися на цій сторінці і відразу ж закінчилися (відвідувач пішов на інший сайт або закрив вкладку).",
+ "ColumnPageviews": "Перегляди сторінок",
+ "ColumnPageviewsDocumentation": "Кількість переглядів цієї сторінки.",
"ColumnPercentageVisits": "% відвідувань",
"ColumnRevenue": "Прибуток",
- "ColumnSumVisitLength": "Кількість часу проведеного користувачем (в секундах)",
- "ColumnUniquePageviews": "Унікальних переглядів сторінок",
- "ColumnValuePerVisit": "Цінність на відвідування",
- "ColumnVisitsWithConversions": "Відвідування з конвертаціями",
- "ConfigFileIsNotWritable": "Файл конфігурації Piwik %1$s захищений від запису, деякі зміни можуть бути не збережені. %2$s Змініть права доступу до файла конфігурації щоб дозволити запис.",
- "ContinueToPiwik": "Перейти далі до Piwik",
+ "ColumnSumVisitLength": "Загальний час відвідувачів на сайті (секунд)",
+ "ColumnTotalPageviews": "Загальна кількість переглядів сторінок",
+ "ColumnUniqueEntrances": "Унікальні входи",
+ "ColumnUniqueExits": "Унікальні виходи",
+ "ColumnUniquePageviews": "Унікальні перегляди сторінок",
+ "ColumnUniquePageviewsDocumentation": "Число відвідувань, які включали також цю сторінку. Якщо сторінка була переглянута одним користувачем кілька разів, це зараховується як одне відвідування сторінки.",
+ "ColumnValuePerVisit": "Вартість візиту",
+ "ColumnViewedAfterSearch": "Клікнули по результату в пошуку",
+ "ColumnViewedAfterSearchDocumentation": "Число разів, коли відвідувачі відвідували цю сторінку після того, як вони користувалися пошуком на Вашому сайті і клікнули по знайденої сторінці.",
+ "ColumnVisitDuration": "Тривалість відвідування (сек)",
+ "ColumnVisitsWithConversions": "Повторні відвідування",
+ "ConfigFileIsNotWritable": "файл конфігурації Piwik %1$s закритий для запису, Ваші зміни не будуть збережені. %2$s Будь ласка, поміняйте дозволи конфігураційного файлу і дозвольте запис в нього.",
+ "Continue": "Продовжити",
+ "ContinueToPiwik": "Перейти до Piwik",
+ "CurrentlyUsingUnsecureHttp": "В даний момент Ви використовуєте Piwik через небезпечне з'єднання HTTP, що може бути ризиковано. Ми рекомендуємо налаштувати Piwik на використання SSL (HTTPS) для підвищення рівня безпеки.",
+ "CreatedByUser": "зроблено %s",
"CurrentMonth": "Поточний місяць",
"CurrentWeek": "Поточний тиждень",
"CurrentYear": "Поточний рік",
- "Daily": "По днях",
- "DashboardForASpecificWebsite": "Панель керування сайту",
+ "Daily": "Щодня",
+ "DailyReport": "Щодня",
+ "DailyReports": "Щоденні звіти",
+ "DailySum": "сума за день",
+ "DashboardForASpecificWebsite": "Зведена статистика для окремого сайту",
+ "DataForThisGraphHasBeenPurged": "Дані для цього графіка, які старше ніж %s місяців і були очищені.",
+ "DataForThisTagCloudHasBeenPurged": "Дані для цієї хмари тегів, які старше ніж %s місяців і були очищені.",
"Date": "Дата",
- "DateRange": "Діапазон дат:",
- "DateRangeFrom": "Ні",
- "DaysHours": "%1$s днів %2$s годин",
- "Default": "Типово",
+ "DateRange": "Часовий період:",
+ "DateRangeFrom": "Від",
+ "DateRangeFromTo": "З %1$s по %2$s",
+ "DateRangeInPeriodList": "діапазон дат:",
+ "DateRangeTo": "До",
+ "DaysHours": "%1$s дн. %2$s год.",
+ "DaysSinceFirstVisit": "Днів пройшло з моменту першого відвідування",
+ "DaysSinceLastEcommerceOrder": "Днів з моменту останнього електронного замовлення.",
+ "DaysSinceLastVisit": "Днів пройшло з моменту останнього відвідування",
+ "Default": "За замовчуванням",
+ "DefaultAppended": "(за замовчуванням)",
"Delete": "Видалити",
"Description": "Опис",
+ "Desktop": "Комп'ютер",
"Details": "Деталі",
- "DisplaySimpleTable": "Показати просту таблицю",
- "DisplayTableWithGoalMetrics": "Показати таблицю з показниками Цілей",
- "DisplayTableWithMoreMetrics": "Показати таблицю з більшою кількістю показників",
- "Done": "Виконано",
+ "Discount": "Знижки",
+ "DisplaySimpleTable": "Показати приклад таблиці",
+ "DisplayTableWithGoalMetrics": "Показати таблицю з метрикою цілей",
+ "DisplayTableWithMoreMetrics": "Показати таблицю з великим об'ємом метрики",
+ "Documentation": "документація",
+ "Donate": "Пожертвувати",
+ "Done": "Завершено",
"Download": "Завантажити",
- "DownloadFullVersion": "%1$sЗавантажити%2$s повну версію! Переглянути %3$s",
+ "DownloadFail_FileExists": "Файл %s вже існує!",
+ "DownloadFail_FileExistsContinue": "Намагаюся продовжити скачування %s, але повністю завантажений файл вже існує!",
+ "DownloadFail_HttpRequestFail": "Не вдалося завантажити файл! Щось може бути не так з сайтом звідки Ви завантажуєте. Ви можете спробувати пізніше або отримати файл самостійно.",
+ "DownloadFullVersion": "%1$sЗавантажте%2$s повну версію! дивіться тут: %3$s",
+ "DownloadPleaseRemoveExisting": "Якщо Ви хочете його замінити, будь ласка, видаліть існуючий файл.",
"Downloads": "Завантаження",
+ "EcommerceOrders": "Замовлення",
+ "EcommerceVisitStatusDesc": "Статус відвідування \"Електронної комерції\" на кінець відвідування",
+ "EcommerceVisitStatusEg": "Наприклад, щоб вибрати всі відвідування, коли було здійснене електронне замовлення, API-запит буде містити: %s",
"Edit": "Редагувати",
- "EncryptedSmtpTransport": "Введіть шифрування транспортного рівня що вимагається вашим SMTP сервером.",
+ "EncryptedSmtpTransport": "Виберіть тип шифрування на транспортному рівні, необхідний Вашому SMTP серверу.",
"Error": "Помилка",
- "EvolutionOverPeriod": "Динаміка протягом періоду",
- "ExceptionConfigurationFileNotFound": "Файл конфігурації {%s} не знайдено.",
- "ExceptionDatabaseVersion": "Ваша версія %1$s є %2$s але Piwik вимагає мінімум %3$s.",
- "ExceptionFileIntegrity": "Помилка перевірки на цілісність: %s",
- "ExceptionFilesizeMismatch": "Розмір файлу відрізняється: %1$s (очікувана довжина: %2$s, знайдено: %3$s)",
- "ExceptionIncompatibleClientServerVersions": "Ваша версія клієнта %1$s є %2$s що несумісно з версією сервера %3$s.",
- "ExceptionInvalidArchiveTimeToLive": "Час публікації сьогоднішнього архіву має бути числом більшим від нуля.",
- "ExceptionInvalidDateFormat": "Формат дати: %1$s або текст що підтримується функцією %2$s (див. %3$s для детальнішої інформації)",
- "ExceptionInvalidDateRange": "Значення '%1$s' задає неправильний діапізон дат. Повинен використовуватися наступний формат: %2$s.",
- "ExceptionInvalidPeriod": "Період '%1$s' не підтримується. Спробуйте натомість один з таких варіантів: %2$s.",
- "ExceptionInvalidRendererFormat": "Формат відображувача '%1$s' неправильний. Спробуйте натомість один з таких варіантів: %2$s.",
- "ExceptionInvalidToken": "Маркер невірний.",
- "ExceptionLanguageFileNotFound": "Файл мови '%s' не знайдено.",
- "ExceptionMethodNotFound": "Метод '%1$s' не існує або не доступний у модулі '%2$s'.",
+ "ErrorRequest": "Ой... виникла проблема під час виконання запиту. Можливо причиною тому тимчасова проблема на сервері, або Вами був запитаний звіт, що містить великий обсяг даних. Будь ласка, спробуйте ще раз. Якщо це не спрацювало, будь ласка %1$sзв'яжіться з адміністратором Piwik%2$s.",
+ "EvolutionOverPeriod": "Еволюція за період",
+ "EvolutionSummaryGeneric": "%1$s в %2$s порівняно з %3$s в %4$s. Зміни: %5$s",
+ "ExceptionContactSupportGeneric": "Якщо Ви продовжуєте отримувати цю помилку, будь ласка, %1$sзверніться до адміністратора Piwik%2$s за допомогою.",
+ "ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "Користувач повинен бути або суперкористувачем, або користувачем '%s'.",
+ "ExceptionConfigurationFileNotFound": "Конфігураційний файл {%s} не може бути знайдений.",
+ "ExceptionDatabaseVersion": "Версія Вашого %1$s - %2$s, але Piwik вимагає хоча б %3$s.",
+ "ExceptionDatabaseVersionNewerThanCodebase": "Виконувані файли Piwik застарілої версії %1$s, а база даних Piwik вже оновлена ​​до нової версії %2$s.",
+ "ExceptionDatabaseVersionNewerThanCodebaseWait": "Можливо Ваш Piwik-адміністратор щойно закінчив процес оновлення. Спробуйте повторити пізніше.",
+ "ExceptionFileIntegrity": "Перевірка цілісності не вдалася: %s",
+ "ExceptionFilesizeMismatch": "Розмір файлу не збігається: %1$s (очікувався: %2$s, виявлено: %3$s)",
+ "ExceptionIncompatibleClientServerVersions": "Версія %1$s Вашого клієнта - %2$s, вона не сумісна з сервером версії %3$s.",
+ "ExceptionInvalidAggregateReportsFormat": "Визначення формату звітів '%1$s' невірно. Спробуйте що-небудь інше, замість: %2$s.",
+ "ExceptionInvalidArchiveTimeToLive": "Час архівування (в секундах) має бути більше нуля",
+ "ExceptionInvalidDateFormat": "Формат дати повинен бути: %1$s або будь-яке інше ключове слово, підтримуване функцією %2$s (див. %3$s, щоб дізнатися більше)",
+ "ExceptionInvalidDateRange": "Дата '%1$s' не входить в коректний проміжок. Вона повинна бути наступного формату: %2$s.",
+ "ExceptionInvalidPeriod": "Період '%1$s' не підтримується. Спробуйте замість нього інший з доступних: %2$s",
+ "ExceptionInvalidRendererFormat": "формат рендерера '%1$s' невірний. Спробуйте замість нього інший з доступних: %2$s.",
+ "ExceptionInvalidReportRendererFormat": "формат звіту '%1$s' хибний. Спробуйте замість нього інший з доступних: '%2$s'.",
+ "ExceptionInvalidStaticGraphType": "Тип статичного графіка '%1$s' невірний. Спробуйте що-небудь таке, замість: %2$s.",
+ "ExceptionInvalidToken": "Токен невірний.",
+ "ExceptionLanguageFileNotFound": "Файл мови '%s' не знайдений.",
+ "ExceptionMethodNotFound": "Метод '%1$s' не існує або недоступний в модулі '%2$s'.",
"ExceptionMissingFile": "Відсутній файл: %s",
- "ExceptionNonceMismatch": "Не вдалося перевірити маркер безпеки для цієї форми.",
- "ExceptionPrivilege": "Неможливо отримати доступ до даного ресурсу так як треба мати доступ на %s.",
- "ExceptionPrivilegeAccessWebsite": "Неможливо отримати доступ до даного ресурсу так як треба мати доступ на %s для сайту з ідентифікатором %d",
- "ExceptionPrivilegeAtLeastOneWebsite": "Неможливо отримати доступ до даного ресурсу так як треба мати доступ на %s як мінімум до одного сайту.",
- "ExceptionUndeletableFile": "Не вдалося видалити %s",
- "ExceptionUnreadableFileDisabledMethod": "Неможливо прочитати файл конфігурації {%1$s}. Ваш хостинг можливо закрив доступ %2$s.",
+ "ExceptionNonceMismatch": "Не можу перевірити елемент безпеки для цієї форми.",
+ "ExceptionPrivilege": "Ви не можете мати доступ до цього ресурсу, оскільки він вимагає прав %s.",
+ "ExceptionPrivilegeAccessWebsite": "Ви не можете отримати доступ до цього ресурсу, оскільки необхідні права %s для сайту з id = %d.",
+ "ExceptionPrivilegeAtLeastOneWebsite": "Ви не можете отримати доступ до цього ресурсу, оскільки необхідні права %s хоча б для одного сайту.",
+ "ExceptionUnableToStartSession": "Не вдалося запустити сесію.",
+ "ExceptionUndeletableFile": "Неможливо видалити %s",
+ "ExceptionUnreadableFileDisabledMethod": "Конфігураційний файл {%1$s} не може бути прочитаний. Можливо, на Вашому хості відключений %2$s.",
+ "ExceptionReportNotFound": "Запитуваний звіт не існує.",
+ "ExceptionWidgetNotFound": "Запитуваний віджет не існує.",
+ "ExceptionReportNotEnabled": "Запитаний звіт не включений. Це означає, як правило, що або вимкнений плагін, який визначає цей звіт, або немає прав доступу до цього звіту.",
+ "ExpandDataTableFooter": "Змінити візуалізацію або налаштувати звіт",
"Export": "Експорт",
"ExportAsImage": "Експортувати як зображення",
- "ExportThisReport": "Експортувати цей набір даних в інші формати",
- "FileIntegrityWarningExplanation": "Перевірка цілісності файлу визначила пошкоджені файли. Можливо це відбулося через часткове завантаження або розриви зв’язку підчас завантаження файлів Piwik на сервер. Перезавантажте всі файли Piwik в двійковому режимі (BINARY mode) та обновіть цю сторінку щоб повторити перевірку.",
- "ForExampleShort": "пр.",
- "GiveUsYourFeedback": "Надішліть нам відгук!",
+ "ExportThisReport": "Експортувати в інші формати",
+ "Faq": "ЧаПИ",
+ "FileIntegrityWarningExplanation": "Перевірка цілісності файлів завершилася невдачею і повернула помилки. Це сталося, можливо, через те, що на сервер, при завантаженні на нього системи Piwik, частина файлів була завантажена некоректно. Рекомендується перезавантажити усі файли Piwik на сервер, оновити сторінку, і переконатися, що вже не виникає помилок.",
+ "First": "Перший",
+ "Flatten": "Згладити",
+ "ForExampleShort": "напр.,",
+ "Forums": "Форуми",
+ "FromReferrer": "джерело",
+ "GeneralInformation": "Загальна інформація",
+ "General": "Основне",
+ "GetStarted": "Приступити",
+ "GiveUsYourFeedback": "Залиште нам відгук!",
+ "Goal": "Досягнення",
"GoTo": "Перейти до %s",
- "GraphHelp": "Дізнатися більше інформації про відображення графіків в Piwik",
- "HelloUser": "Привіт, %s!",
- "HoursMinutes": "%1$s годин %2$s хв.",
- "Id": "ID",
- "IfArchivingIsFastYouCanSetupCronRunMoreOften": "Якщо обробка даних проходить швидко для даної інсталяції, можна налаштувати планувальник завдань (crontab) виконувати завдання частіше.",
- "InvalidResponse": "Отримані дані невірні.",
- "JsTrackingTag": "Тег відслідковування JavaScript",
+ "GraphHelp": "Більше інформації про відображення графіків в Веб-аналітиці.",
+ "HelloUser": "Вітаю, %s!",
+ "Help": "Допомога",
+ "HelpTranslatePiwik": "Можливо, Ви захочете %1$sдопомогти покращити переклади в Piwik%2$s?",
+ "Hide": "приховати",
+ "HoursMinutes": "%1$s год %2$s хв",
+ "Id": "Id",
+ "IfArchivingIsFastYouCanSetupCronRunMoreOften": "Якщо архівація працює досить швидко у Вашій установці Piwik, Ви можете встановити crontab на більш частий запуск.",
+ "InfoFor": "Інформація для %s",
+ "Installed": "Встановлено",
+ "InvalidDateRange": "Невірний період, будь ласка, спробуйте знову",
+ "InvalidResponse": "Отримані дані є некоректними.",
+ "IP": "IP",
+ "JsTrackingTag": "JavaScript Tracking-код",
"Language": "Мова",
+ "LastDays": "Минулі %s дні (включаючи сьогодні)",
+ "LastDaysShort": "%s останніх днів",
+ "LearnMore": "%1$sдізнатися більше%2$s",
+ "Live": "Прямий ефір",
"Loading": "Завантаження...",
"LoadingData": "Завантаження даних...",
+ "LoadingPopover": "Завантаження %s...",
+ "LoadingPopoverFor": "Завантаження %s для",
"Locale": "uk_UA.UTF-8",
"Logout": "Вийти",
- "MediumToHighTrafficItIsRecommendedTo": "Для веб-сайтів з середнім та високим трафіком рекомендується обробляти звіти за поточний день не частіше ніж кожні пів години (%1$s секунд) або що години (%2$s секунд).",
- "MinutesSeconds": "%1$s хв. %2$s сек.",
- "Monthly": "по місяцях",
- "MultiSitesSummary": "Всі сайти",
- "Name": "Ім’я",
- "NewReportsWillBeProcessedByCron": "Якщо обробка даних Piwik не запускається браузером то нові звіти будуть оброблені планувальником завдань (crontab)",
- "NewUpdatePiwikX": "останнє поновлення: Piwik %s",
+ "MainMetrics": "Основні показники",
+ "Matches": "Збігів",
+ "MediumToHighTrafficItIsRecommendedTo": "Для сайтів з середнім або високим навантаженням ми рекомендуємо формувати звіти за сьогоднішній день кожні півгодини (%1$s сек) або щогодини (%2$s сек).",
+ "Metadata": "Метадані",
+ "Metric": "Показник",
+ "Metrics": "Показники",
+ "MetricsToPlot": "Метрики для побудови графіка",
+ "MetricToPlot": "Метрика для побудови графіка",
+ "MinutesSeconds": "%1$s хв %2$s сек",
+ "Mobile": "Мобільний додаток",
+ "Monthly": "Щомісяця",
+ "MonthlyReport": "Щомісяця",
+ "MonthlyReports": "Щомісячні звіти",
+ "More": "Ще",
+ "MoreDetails": "Деталізація",
+ "MoreLowerCase": "ще",
+ "MultiSitesSummary": "Всі проекти",
+ "Name": "Ім'я",
+ "NbActions": "Кількість дій",
+ "NbSearches": "Кількість звернень до внутрішнього пошуку",
+ "NeedMoreHelp": "Потрібна допомога?",
+ "Never": "Ніколи",
+ "NewReportsWillBeProcessedByCron": "Якщо архівування Piwik не провокується браузером, нові звіти виробляються за допомогою crontab-завдань.",
+ "NewUpdatePiwikX": "Нове оновлення: Piwik %s",
+ "NewVisitor": "новий відвідувач",
+ "NewVisits": "Нові відвідування",
"Next": "Далі",
- "No": "Ні",
- "NoDataForGraph": "Немає даних для цього графіку",
- "NoDataForTagCloud": "Немає даних для цієї хмари тегів",
- "NotValid": "%s не підходить",
+ "No": "Немає",
+ "NoDataForGraph": "Немає даних для побудови графіка.",
+ "NoDataForTagCloud": "Немає даних по цим тегами",
+ "NotDefined": "%s - не визначено",
+ "Note": "Замітка",
+ "NotInstalled": "Не встановлено",
+ "NotRecommended": "не рекомендується",
+ "NotValid": "%s невірний",
+ "NumberOfVisits": "Кількість відвідувань",
+ "NUsers": "%s користувачів",
"NVisits": "%s відвідувань",
- "Ok": "Ok",
- "OnlyEnterIfRequired": "Заповніть поле лише тоді якщо SMTP сервер вимагає логін.",
- "OnlyEnterIfRequiredPassword": "Заповніть поле лише тоді якщо SMTP сервер вимагає пароль.",
- "OnlyUsedIfUserPwdIsSet": "Використовується тільки якщо задано логін\/пароль, запитайте адміністратора хостингу якщо не впевнені який метод вибрати.",
- "OpenSourceWebAnalytics": "Open Source Веб-аналітика",
- "OptionalSmtpPort": "Не обовязково. Типово 25 для нешифрованої і TLS SMTP та 465 для SSL SMTP.",
- "OrCancel": "або %1$s Скасувати %2$s",
+ "Ok": "ОК",
+ "OneAction": "1 дія",
+ "OneVisit": "1 відвідування",
+ "OnlyEnterIfRequired": "Введіть ім'я користувача, якщо Ваш SMTP сервер вимагає цього.",
+ "OnlyEnterIfRequiredPassword": "Введіть пароль, якщо Ваш SMTP сервер вимагає цього.",
+ "OnlyUsedIfUserPwdIsSet": "Використовується якщо ім'я користувача\/пароль задані, запитайте у свого провайдера, якщо не впевнені у виборі методу.",
+ "OpenSourceWebAnalytics": "відкрита\/вільна аналітична платформа",
+ "OperationAtLeast": "Не менше",
+ "OperationAtMost": "Не більше",
+ "OperationContains": "Містить",
+ "OperationDoesNotContain": "Не містить",
+ "OperationEquals": "дорівнює",
+ "OperationGreaterThan": "Більше ніж",
+ "OperationIs": "Є",
+ "OperationIsNot": "Не",
+ "OperationLessThan": "Менше ніж",
+ "OperationNotEquals": "Не дорівнює",
+ "OperationStartsWith": "Починається з",
+ "OperationEndsWith": "Закінчується з",
+ "OptionalSmtpPort": "Не обов'язково. За замовчуванням використовується 25 для незашифрованого TLS SMTP з'єднання, і 465 для SSL SMTP.",
+ "Options": "Налаштування",
+ "Or": "або",
+ "OrCancel": "або %1$s Відмініть %2$s",
"Others": "Інші",
- "Outlinks": "Зовнішні посилання",
+ "Outlink": "Вихідне посилання",
+ "Outlinks": "Вихідні посилання",
+ "OverlayRowActionTooltip": "Дивитися аналітику прямо на Вашому сайті (відкриється в новому вікні)",
+ "OverlayRowActionTooltipTitle": "Відкрити сторінку з накладенням",
"Overview": "Огляд",
"Pages": "Сторінки",
+ "Pagination": "%1$s - %2$s з %3$s",
+ "PaginationWithoutTotal": "%1$s - %2$s",
+ "ParameterMustIntegerBetween": "Параметр %1$s повинен бути цілим числом між %2$s и %3$s.",
"Password": "Пароль",
"Period": "Період",
"Piechart": "Кругова діаграма",
- "PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s випущено. %2$s Будь-ласка поновіть негайно!%3$s (дивитися %4$s що змінилося%5$s).",
- "PleaseSpecifyValue": "Вкажіть значення для '%s'.",
- "PleaseUpdatePiwik": "Поновіть вашу інсталяцію Piwik",
- "Plugin": "Плагін",
- "Plugins": "Плагіни",
+ "PiwikXIsAvailablePleaseNotifyPiwikAdmin": "Доступний %1$s. Будь ласка повідомте %2$sадміністратору Piwik%3$s.",
+ "PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s доступний для завантаження. %2$s Будь ласка, оновіться!%3$s (див. %4$s зміни%5$s).",
+ "PleaseSpecifyValue": "Будь ласка, визначте значення для '%s'.",
+ "PleaseUpdatePiwik": "Будь ласка, оновіть систему Веб-аналітики",
+ "Plugin": "Модуль",
+ "Plugins": "Модулі",
+ "PoweredBy": "Powered by",
"Previous": "Назад",
+ "PreviousDays": "Минулі %s дні (без сьогоднішього)",
+ "PreviousDaysShort": "%s попередніх днів",
+ "Price": "Ціна",
+ "ProductConversionRate": "Конверсія для товара",
+ "ProductRevenue": "Прибуток з товару",
+ "Measurable": "Одиниця виміру",
+ "Measurables": "Одиниці виміру",
+ "PurchasedProducts": "Куплені товари",
+ "Quantity": "Кількість",
+ "RangeReports": "Інші періоди",
+ "ReadThisToLearnMore": "%1$sПрочитайте це, щоб дізнатися більше.%2$s",
+ "Recommended": "Рекомендується",
+ "RecordsToPlot": "Записи для побудови графіка",
+ "Refresh": "Оновити",
"RefreshPage": "Оновити сторінку",
+ "RelatedReport": "Пов'язаний звіт",
+ "RelatedReports": "Пов'язані звіти",
+ "Remove": "Видалити",
"Report": "Звіт",
- "Reports": "Звіт",
- "ReportsWillBeProcessedAtMostEveryHour": "Звіти будуть оброблені приблизно що години.",
- "RequestTimedOut": "Завершився термін очікування на запрошені дані в %s. Спробуйте ще раз.",
+ "ReportGeneratedFrom": "Цей звіт був сформований з використанням даних: %s.",
+ "ReportRatioTooltip": "'%1$s' представляє %2$s з %3$s %4$s з %5$s.",
+ "Reports": "Звіти",
+ "ReportsContainingTodayWillBeProcessedAtMostEvery": "Архів звітів на кожні Х секунд",
+ "RearchiveTimeIntervalOnlyForTodayReports": "Це впливає тільки на звіти (або інші Діапазони Дат включаючи сьогодні)",
+ "ReportsWillBeProcessedAtMostEveryHour": "Отже, звіти обробляються щогодини.",
+ "RequestTimedOut": "Час очікування при запиті даних до %s минув. Будь ласка, спробуйте ще раз.",
"Required": "%s необхідно",
+ "ReturningVisitor": "Відвідувач що повернувся",
+ "ReturningVisitorAllVisits": "Подивитися всі візити",
+ "RowEvolutionRowActionTooltip": "Подивіться, як показники для цього рядка змінювалися з плином часу",
+ "RowEvolutionRowActionTooltipTitle": "Відкрити динаміку по цьому рядку",
+ "Rows": "Рядки",
+ "RowsToDisplay": "Рядки для відображення",
"Save": "Зберегти",
- "SaveImageOnYourComputer": "Для того щоб зберегти зображення компютері, клацнути правою кнопкою на зображенні та вибрати \"Зберегти зображення як...\"",
+ "SaveImageOnYourComputer": "Щоб зберегти зображення на комп'ютері, натисніть правою кнопкою на ньому і виберіть \"Зберегти зображення як...\"",
"Search": "Пошук",
- "SeeTheOfficialDocumentationForMoreInformation": "Перегляньте %1$sофіційну документацію%2$s щоб отримати більше інформації.",
- "SelectYesIfYouWantToSendEmailsViaServer": "Виберіть \"Так\" якщо ви хочете надсилати е-майли через SMTP а не локальною поштовою функцією.",
+ "Clear": "Очистити",
+ "SearchNoResults": "Без результатів",
+ "SeeAll": "переглянути все",
+ "SeeTheOfficialDocumentationForMoreInformation": "Дивіться %1$sофіційну документацію%2$s щоб дізнатися більше.",
+ "SeeThisFaq": "Подивіться %1$sці часті питання%2$s.",
+ "Segment": "Сегмент",
+ "SelectYesIfYouWantToSendEmailsViaServer": "Виберіть \"Так\", якщо Ви хочете відсилати e-mail листи через певний сервер, замість використання локальної mail функції.",
"Settings": "Налаштування",
- "SmallTrafficYouCanLeaveDefault": "Для веб-сайтів з малим навантаження по трафіку, можна залишити типові %s секунд, та матидоступ до звітів в реальному часі.",
+ "Shipping": "Доставка",
+ "Show": "показати",
+ "SingleWebsitesDashboard": "Статистика по сайту",
+ "SmallTrafficYouCanLeaveDefault": "Для сайтів з невеликим навантаженням Ви можете залишити %s сек за замовчуванням, і переглядати звіти в реальному часі.",
"SmtpEncryption": "SMTP шифрування",
"SmtpPassword": "SMTP пароль",
- "SmtpPort": "Порт SMTP сервера",
+ "SmtpPort": "SMTP Порт",
"SmtpServerAddress": "Адреса SMTP сервера",
- "SmtpUsername": "SMTP логін",
+ "SmtpUsername": "SMTP ім'я користувача",
+ "Source": "Джерело",
+ "StatisticsAreNotRecorded": "Відстеження відвідувачів Piwik в даний час відключено! Ви можете повторно включити відстеження встановивши record_statistics = 1 у файлі config\/config.ini.php.",
+ "Subtotal": "Сума",
+ "Summary": "Зведений звіт",
"Table": "Таблиця",
- "TagCloud": "Хмара тегів",
- "TranslatorName": "Joseph Chereshnovsky, Anton Andriyevskyy",
+ "TagCloud": "Теги",
+ "Tax": "Податок (комісія)",
+ "TimeAgo": "%s назад",
+ "TimeFormat": "Формат часу",
+ "TimeOnPage": "Час, проведений на сторінці",
+ "Total": "Усього",
+ "TotalRatioTooltip": "Це %1$s з усіх %2$s %3$s.",
+ "TotalRevenue": "Загальний прибуток",
+ "TotalVisitsPageviewsActionsRevenue": "(Загалом: %1$s візити, %2$s перегляди сторінок, %3$s дії, %4$s виручка)",
+ "TrackingScopeAction": "Дія",
+ "TrackingScopePage": "Сторінка",
+ "TrackingScopeVisit": "Відвідування",
+ "TransitionsRowActionTooltip": "Подивіться, що відвідувачі робили до і після перегляду цієї сторінки",
+ "TransitionsRowActionTooltipTitle": "Відкрити переходи",
+ "TranslatorName": "twixi (dimboy.com), Joseph Chereshnovsky, Anton Andriyevskyy",
+ "UniquePurchases": "унікальні покупки",
"Unknown": "Невідомо",
- "Username": "Логін",
- "UseSMTPServerForEmail": "Використовуйте SMTP сервер для надсилання електронної пошти",
+ "Upload": "Завантажити",
+ "UsePlusMinusIconsDocumentation": "Використовуйте іконки плюс і мінус зліва для навігації",
+ "UserId": "ID користувача",
+ "Username": "Ім'я користувача",
+ "UseSMTPServerForEmail": "Використовувати SMTP сервер для e-mail",
"Value": "Значення",
- "VBarGraph": "Гістограма",
- "View": "Перегляд",
- "VisitDuration": "Середня тривалість відвідування (в секундах)",
+ "VBarGraph": "Стовпчаста діаграма",
+ "View": "Дивитися",
+ "ViewDocumentationFor": "Дивитися документацію для %1$s",
+ "Visit": "Відвідування",
+ "VisitConvertedGoal": "Відвідування, прийнято як мінімум однією ціллю",
+ "VisitConvertedGoalId": "Відвідування, яке зконвертувало певну Ціль",
+ "VisitConvertedNGoals": "Відвідування зконвертувало %s цілей",
+ "VisitDuration": "Орієнтовна тривалість відвідування (секунд)",
+ "Visitor": "Відвідувач",
+ "VisitorID": "ID відвідувача",
+ "VisitorIP": "IP відвідувача",
"Visitors": "Відвідувачі",
- "VisitorSettings": "Налаштування відвідувача",
- "Warning": "Застереження",
- "WarningFileIntegrityNoManifest": "Перевірка цілісності файлу не може бути виконана через відсутність manifest.inc.php",
- "WarningFileIntegrityNoMd5file": "Перевірка цілісності файлу не може бути виконана через відсутність функції md5_file().",
- "WarningPasswordStored": "%1$sЗастереження:%2$s Цей пароль буде зберігатися в файлі конфігурації та буде видимий для кожного хто має доступ до файлової системи.",
- "Website": "Веб-сайт",
- "Weekly": "по тижнях",
- "Widgets": "Віджет",
- "YearsDays": "%1$s років %2$s днів",
+ "VisitsWith": "Відвідування з %s",
+ "VisitorSettings": "Налаштування відвідувачів",
+ "VisitType": "Тип візиту",
+ "VisitTypeExample": "Наприклад, щоб вибрати всіх відвідувачів, які повернулись на сайт, включаючи тих, хто вже купив щось в свої попередні візити, API-запит буде містити: %s",
+ "Warning": "Увага",
+ "WarningPhpVersionXIsTooOld": "Версія PHP %s, яку Ви використовуєте, завершила свій життєвий цикл (EOL). Настійно рекомендуємо оновитися до поточної версії, т. к. використання застарілої версії піддає Вас вразливості в безпеці і помилок, які усунуті в більш свіжій версії PHP.",
+ "WarningPiwikWillStopSupportingPHPVersion": "Piwik припинить підтримку PHP %1$s в наступної версії. Оновіть Ваш PHP, по крайній мірі, до версії PHP %2$s !",
+ "WarningFileIntegrityNoManifest": "Перевірка цілісності не може бути проведена через відсутність manifest.inc.php.",
+ "WarningFileIntegrityNoManifestDeployingFromGit": "Якщо Ви робите розгортання Piwik з Git, це повідомлення є нормальним.",
+ "WarningFileIntegrityNoMd5file": "Перевірка цілісності не може бути проведена через відсутність функції md5_file().",
+ "WarningPasswordStored": "%1$sУвага:%2$s Цей пароль буде збережений у файлі конфігурації на сервері в незашифрованому вигляді, і буде видно кожному, хто має доступ до файлової системи сервера.",
+ "WarningDebugOnDemandEnabled": "Режим стеження за %1$s увімкнений. З міркувань безпеки він повинен бути включений тільки на невеликий період часу. Щоб відключити його, встановіть %2$s на %3$s в %4$s",
+ "Website": "Сайт",
+ "Weekly": "Щотижня",
+ "WeeklyReport": "щотижня",
+ "WeeklyReports": "Щотижневі звіти",
+ "WellDone": "Відмінно!",
+ "Widgets": "Віджети",
+ "Widget": "Віджет",
+ "XComparedToY": "%1$s у порівнянні з %2$s",
+ "XFromY": "%1$s – %2$s",
+ "YearlyReport": "щорічно",
+ "YearlyReports": "Щорічні звіти",
+ "YearsDays": "%1$s р. %2$s дн.",
"Yes": "Так",
- "YouMustBeLoggedIn": "Треба увійти в систему щоб отримати доступ до цих функцій.",
- "YourChangesHaveBeenSaved": "Зміни збережено."
+ "YouAreCurrentlyUsing": "Ви використовуєте версію Piwik %s.",
+ "YouAreViewingDemoShortMessage": "Ви переглядаєте Piwik в демо режимі",
+ "YouMustBeLoggedIn": "Ви повинні зайти на сайт, щоб отримати доступ до цього функціоналу.",
+ "YourChangesHaveBeenSaved": "Зміни збережені."
+ },
+ "Mobile": {
+ "AboutPiwikMobile": "Про Piwik Mobile",
+ "AccessUrlLabel": "URL для анонімного доступу",
+ "Account": "Обліковий запис",
+ "Accounts": "Акаунти",
+ "AddAccount": "Додати аккаунт",
+ "AddPiwikDemo": "Додати демо Piwik",
+ "Advanced": "Розширені",
+ "AnonymousAccess": "Анонімний доступ",
+ "AnonymousTracking": "Анонімне стеження",
+ "AskForAnonymousTrackingPermission": "При активації Piwik Mobile відправлятиме дані piwik.org анонімно. Відправлені дані допоможуть розробникам Piwik Mobile краще зрозуміти, як Ви використовуєте додаток. Відправляється інформація: кліки по меню і налаштуванням, назва ОС і версія, помилки, які виникають в Piwik Mobile. Ми НЕ відстежуємо Ваші аналітичні дані. Ці анонімні дані ніколи не стануть доступними для кого-то ще. Ви можете вимкнути\/увімкнути анонімне стеження в Налаштуваннях в будь-який час.",
+ "ChooseHttpTimeout": "Виберіть значення HTTP тайм-аут",
+ "ChooseMetric": "Виберіть показник",
+ "ChooseReport": "Виберіть звіт",
+ "ChooseSegment": "Виберіть сегмент",
+ "ConfirmRemoveAccount": "Ви хочете видалити цей акаунт?",
+ "DefaultReportDate": "Дата звіту",
+ "EmailUs": "Надішліть нам email",
+ "EnableGraphsLabel": "Відображати графіки",
+ "EvolutionGraph": "Історичний графік",
+ "HelpUsToImprovePiwikMobile": "Ви хочете активувати анонімне відстеження в Piwik Mobile?",
+ "HowtoDeleteAnAccount": "Натисніть і утримуйте для видалення облікового запису.",
+ "HowtoDeleteAnAccountOniOS": "Проведіть з ліва на право, щоб видалити акаунт",
+ "HowtoLoginAnonymous": "Залиште ім'я користувача і пароль порожнім для анонімного входу",
+ "HttpIsNotSecureWarning": "Ваш авторизаційний ключ в Piwik (token_auth) відправляється в незахищеному вигляді, якщо Ви використовуєте \"HTTP\". Тому ми рекомендуємо HTTPS для безпеки передачі інформації по інтернету. бажаєте продовжити?",
+ "HttpTimeout": "HTTP Тайм-аут",
+ "IncompatiblePiwikVersion": "Використовувана версія Piwik несумісна с Piwik Mobile 2. Оновіть Piwik і спробуйте знову або встановіть Piwik Mobile 1.",
+ "LastUpdated": "Останнє оновлення: %s",
+ "LoadingReport": "Завантаження %s",
+ "LoginCredentials": "Повноваження",
+ "LoginToPiwikToChangeSettings": "Увійдіть на сервер Piwik для створення і зміни веб-сайтів, користувачів або зміни загальних параметрів, таких як \"Звіт за замовчуванням\".",
+ "LoginUseHttps": "Використовувати https",
+ "MultiChartLabel": "Відображати тонкі графіки (нитки)",
+ "NavigationBack": "Назад",
+ "NetworkError": "Помилка мережі",
+ "NetworkErrorWithStatusCode": "Виникла помилка \"%1$s\". Запит повернув статус: \"%2$s\". URL був: \"%3$s\". Будь ласка, перевірте введений URL і лог помилок на сервері для більш детальної інформації помилки і способи її рішення.",
+ "NetworkErrorWithStatusCodeShort": "Помилка мережі %s",
+ "NetworkNotReachable": "Мережа недоступна",
+ "NoAccountIsSelected": "Ви повинні вибрати обліковий запис. Додайте новий обліковий запис, якщо Ви цього ще не зробили.",
+ "NoDataShort": "Немає даних",
+ "NoPiwikAccount": "У Вас ще немає аккаунта в Piwik?",
+ "NoReportsShort": "Немає звітів",
+ "NoVisitorFound": "Відвідувачів не знайдено",
+ "NoVisitorsShort": "Немає відвідувачів",
+ "NoWebsiteFound": "Сайтів не знайдено",
+ "NoWebsitesShort": "Немає сайтів",
+ "PullDownToRefresh": "Потягніть вниз, щоб оновити...",
+ "PossibleSslError": "Можливо помилка SSL-сертифікату",
+ "PossibleSslErrorExplanation": "Сталася помилка, яка може бути викликана неправильним або самоподпісаним сертифікатом: \"%s\". Ігнорування перевірки SSL може не перешкодити входу на сайт для Вас, але це менш безпечно. Ви можете змінити перевірку SSL в будь-який час в налаштуваннях.",
+ "IgnoreSslError": "Ігнорувати помилку SSL",
+ "RatingDontRemindMe": "Не нагадувати мені",
+ "RatingNotNow": "Не зараз",
+ "RatingNow": "OK, зараз оціню",
+ "RatingPleaseRateUs": "Мобільний додаток Piwik безкоштовно, ми будемо дуже вдячні Вам, якщо Ви знайдете хвилинку, щоб оцінити програму в %1$s. Якщо у Вас є пропозиції щодо нових функцій або Ви знайшли баг, будь ласка зв'яжіться з %2$s",
+ "ReleaseToRefresh": "Відпустіть, щоб оновити...",
+ "Reloading": "Оновлення...",
+ "RequestTimedOutShort": "Помилка часу очікування в мережі",
+ "RestrictedCompatibility": "Обмежена сумісність",
+ "RestrictedCompatibilityExplanation": "Використовувана версія Piwik %s не повністю підтримується Piwik Mobile 2. Можливі помилки під час роботи. Ми рекомендуємо Вам оновити Piwik до останньої версії, або використовувати Piwik Mobile 1.",
+ "SaveSuccessError": "Будь ласка, перевірте налаштування",
+ "SearchWebsite": "Шукати сайти",
+ "ShowAll": "Показати все",
+ "ShowLess": "Показати менше",
+ "StaticGraph": "огляд графіка",
+ "TopVisitedWebsites": "Найбільш відвідувані веб-сайти",
+ "TryIt": "Спробуйте!",
+ "UseSearchBarHint": "Тут відображаються тільки перші %s сайтов. Будь ласка, використовуйте рядок пошуку, щоб отримати доступ до інших Ваших сайтів.",
+ "VerifyAccount": "Перевірка аккаунта",
+ "ValidateSslCertificate": "Перевірити SSL-сертифікат",
+ "VerifyLoginData": "Переконайтеся, що Ви ввели ім'я користувача і пароль правильно.",
+ "YouAreOffline": "Вибачте, але Ви зараз офлайн"
+ },
+ "RowEvolution": {
+ "AvailableMetrics": "Доступні показники",
+ "CompareDocumentation": "Натисніть на посилання нижче, щоб відкрити спливаюче вікно для іншого рядка з тієї ж самої таблиці для порівняння декількох записів.<br \/>Використовуйте shift+клік, щоб позначити рядок для подальшого порівняння без відкриття спливаючого вікна.",
+ "CompareRows": "Порівняти записи",
+ "ComparingRecords": "Порівняння %s рядків",
+ "Documentation": "Натисніть на показники, щоб відобразити їх динаміку на великому графіку. Використовуйте shift+клік для відображення декількох показників одночасно.",
+ "MetricBetweenText": "від %1$s до %2$s",
+ "MetricChangeText": "%s за період",
+ "MetricMinMax": "%1$s виставлення між %2$s і %3$s більше періоду",
+ "MetricsFor": "Показники для %s",
+ "MultiRowEvolutionTitle": "Динаміка кількох рядків",
+ "PickAnotherRow": "Виберіть інший рядок для порівняння",
+ "PickARow": "Вкажіть рядок для порівняння"
}
} \ No newline at end of file
diff --git a/lang/vi.json b/lang/vi.json
index 87f3b07014..ce80ede12d 100644
--- a/lang/vi.json
+++ b/lang/vi.json
@@ -1,5 +1,7 @@
{
"General": {
+ "12HourClock": "Đồng hồ 12-tiếng",
+ "24HourClock": "Đồng hồ 24-tiếng",
"AbandonedCarts": "giỏ hàng bị bỏ quên",
"AboutPiwikX": "Giới thiệu Piwik %s",
"Action": "Hành vi",
@@ -11,6 +13,7 @@
"AllWebsitesDashboard": "Bảng điều khiển tất cả các Website",
"And": "và",
"API": "API",
+ "Apply": "Áp dụng",
"ArchivingInlineHelp": "Đối với những trang web có mức độ truy cập trung bình và cao, chúng tôi khuyến cáo bạn bỏ chế độ cập nhật lên Piwik dựa vào trigger phía trình duyệt. Thay vào đó, bạn nên thiết lập lịch cho Piwik tự xử lý báo cáo sau mỗi giờ đồng hồ (để tránh quá tải server).",
"ArchivingTriggerDescription": "Đề nghị cho cài đặt Piwik lớn hơn, bạn cần phải %1$s thiết lập một cron %2$s để xử lý các báo cáo tự động.",
"AuthenticationMethodSmtp": "Phương thức xác thực SMTP",
@@ -24,6 +27,7 @@
"CannotUnzipFile": "Không thể giải nén file %1$s: %2$s",
"ChangePassword": "Thay đổi mật khẩu",
"ChangeTagCloudView": "Xin lưu ý, bạn có thể xem báo cáo theo những cách khác như là một Tag Cloud. Sử dụng các điều khiển ở dưới cùng của báo cáo để làm như vậy.",
+ "ChooseDate": "Chọn ngày, ngày đang lựa chọn là: %s",
"ChooseLanguage": "Chọn ngôn ngữ",
"ChoosePeriod": "Chọn khoảng thời gian",
"ClickHere": "Click vào đây để tìm hiểu thêm",
@@ -81,6 +85,7 @@
"ConfigFileIsNotWritable": "Tập tin cấu hình Piwik %1$s không ghi, một số thay đổi của bạn có thể không được lưu. %2$s Hãy cho phép thay đổi các tập tin cấu hình để làm cho nó có thể ghi",
"Continue": "Tiếp tục",
"ContinueToPiwik": "Tiếp tục Piwik",
+ "CreatedByUser": "đã tạo bởi %s",
"CurrentMonth": "Tháng này",
"CurrentWeek": "Tuần này",
"CurrentYear": "Năm nay",
@@ -95,6 +100,7 @@
"DateRange": "Thời gian:",
"DateRangeFrom": "Từ",
"DateRangeFromTo": "Từ %1$s đến %2$s",
+ "DateRangeInPeriodList": "phạm vi ngày",
"DateRangeTo": "Đến",
"DaysHours": "%1$s ngày %2$s giờ",
"DaysSinceFirstVisit": "Số ngày từ lần ghé thăm đầu tiên",
@@ -152,6 +158,8 @@
"ExceptionUnableToStartSession": "Không thể bắt đầu phiên.",
"ExceptionUndeletableFile": "Không thể xóa %s",
"ExceptionUnreadableFileDisabledMethod": "Tập tin cấu hình {%1$s} không có thể đọc. Máy chủ của bạn có thể đã bị vô hiệu hóa %2$s.",
+ "ExceptionReportNotFound": "Báo cáo được yêu cầu không tồn tại.",
+ "ExceptionWidgetNotFound": "Widget được yêu cầu không tồn tại.",
"Export": "Xuất",
"ExportAsImage": "Xuất ra dạng ảnh(Image)",
"ExportThisReport": "Xuất dữ liệu này với các định dạng khác",
@@ -163,6 +171,7 @@
"Forums": "Các diễn đàn",
"FromReferrer": "Mẫu",
"GeneralInformation": "Thông tin chung",
+ "General": "Tổng quan",
"GetStarted": "Bắt đầu",
"GiveUsYourFeedback": "Thông tin phản hồi cho chúng tôi!",
"Goal": "Chỉ tiêu",
@@ -210,6 +219,7 @@
"Name": "Tên",
"NbActions": "Số hành động",
"NbSearches": "Số lần tìm kiếm nội bộ",
+ "NeedMoreHelp": "Cần thêm trợ giúp?",
"Never": "Không bao giờ",
"NewReportsWillBeProcessedByCron": "Khi bộ lưu trữ Piwik không được kích hoạt bởi trình duyệt, báo cáo mới sẽ được xử lý bởi crontab.",
"NewUpdatePiwikX": "Cập nhật mới: Piwik %s",
@@ -244,8 +254,11 @@
"OperationIsNot": "Không phải là",
"OperationLessThan": "Ít hơn",
"OperationNotEquals": "Không bằng",
+ "OperationStartsWith": "Bắt đầu với",
+ "OperationEndsWith": "Kết thúc với",
"OptionalSmtpPort": "Tùy chọn. Mặc định 25 là không mã hóa và TLS SMTP, và 465 cho SSL SMTP.",
"Options": "Tùy chọn",
+ "Or": "hoặc",
"OrCancel": "hoặc %1$s Hủy %2$s",
"Others": "Khác",
"Outlink": "Outlink",
@@ -272,6 +285,8 @@
"Price": "Giá",
"ProductConversionRate": "Tỷ lệ cải biến sản phẩm",
"ProductRevenue": "Doanh thu sản phẩm",
+ "Measurable": "Đo lường",
+ "Measurables": "Đo lường",
"PurchasedProducts": "Sản phẩm đã mua",
"Quantity": "Số lượng",
"RangeReports": "Tùy chọn thời gian",
@@ -298,6 +313,7 @@
"Save": "Lưu",
"SaveImageOnYourComputer": "Lưu hình ảnh này cho máy tính của bạn, Click phải chuột trên ảnh và chọn \"lưu ảnh như...\"",
"Search": "Tìm kiếm",
+ "Clear": "Làm sạch",
"SearchNoResults": "Không có kết quả",
"SeeAll": "Xem tất cả",
"SeeTheOfficialDocumentationForMoreInformation": "Xem %1$s tài liệu chính thức %2$s để biết thêm thông tin.",
@@ -319,9 +335,14 @@
"Table": "Bảng",
"TagCloud": "Tag Cloud",
"Tax": "Thuế",
+ "TimeAgo": "%s trước",
+ "TimeFormat": "Định dạng thời gian",
"TimeOnPage": "Thời điểm trên trang",
"Total": "Tổng",
"TotalRevenue": "Tổng doanh thu",
+ "TrackingScopeAction": "Hành động",
+ "TrackingScopePage": "Trang",
+ "TrackingScopeVisit": "Ghé thăm",
"TransitionsRowActionTooltip": "Xem những gì khách truy cập đã làm trước và sau khi xem trang này.",
"TransitionsRowActionTooltipTitle": "mở quá trình chuyển đổi",
"TranslatorName": "Do Cong Anh",
@@ -329,6 +350,7 @@
"Unknown": "Chưa rõ",
"Upload": "Tải lên",
"UsePlusMinusIconsDocumentation": "Sử dụng các biểu tượng cộng và trừ ở bên trái để di chuyển.",
+ "UserId": "ID người dùng",
"Username": "Tên truy nhập",
"UseSMTPServerForEmail": "Sử dụng máy chủ SMTP cho e-mail",
"Value": "Giá trị",
@@ -346,6 +368,7 @@
"Visitors": "Lượng truy cập",
"VisitsWith": "Lượng truy cập với %s",
"VisitorSettings": "Thiết lập lượt truy cập",
+ "VisitType": "Loại ghé thăm",
"VisitTypeExample": "Lấy ví dụ, để chọn tất cả những người truy cập đã quay lại website, bao gồm cả những người đã mua thứ gì đó trong những lượt truy cập trước, yêu cầu API có thể chứa %s",
"Warning": "Cảnh báo",
"WarningFileIntegrityNoManifest": "Tập tin kiểm tra tính toàn vẹn không thể thực hiện do thiếu manifest.inc.php.",
@@ -364,6 +387,7 @@
"YearsDays": "%1$s năm %2$s ngày",
"Yes": "Có",
"YouAreCurrentlyUsing": "Bạn đang sử dụng Piwik %s.",
+ "YouAreViewingDemoShortMessage": "Bạn đang xem phiên bản xem thử của Piwik",
"YouMustBeLoggedIn": "Bạn phải đăng nhập để truy cập chức năng này.",
"YourChangesHaveBeenSaved": "Các thay đổi của bạn đã được lưu."
},
@@ -414,6 +438,7 @@
"NoWebsiteFound": "Không có website nào được tìm thấy",
"NoWebsitesShort": "Không có trang web",
"PullDownToRefresh": "Kéo xuống để làm mới ...",
+ "PossibleSslError": "Có thể lỗi chứng chỉ SSL",
"IgnoreSslError": "Bỏ qua lỗi SSL",
"RatingDontRemindMe": "Đừng nhắc tôi",
"RatingNotNow": "Không phải bây giờ",
@@ -433,6 +458,7 @@
"TryIt": "Hãy thử!",
"UseSearchBarHint": "Chỉ trang web %s đầu tiên được hiển thị ở đây. Vui lòng sử dụng thanh tìm kiếm để truy cập vào các trang web khác của bạn.",
"VerifyAccount": "Xác minh tài khoản",
+ "ValidateSslCertificate": "Xác nhận chứng chỉ SSL",
"VerifyLoginData": "Hãy chắc chắn tên và mật khẩu người dùng kết hợp là chính xác.",
"YouAreOffline": "Xin lỗi, hiện bạn đang offline"
},
diff --git a/lang/zh-cn.json b/lang/zh-cn.json
index 7968d6fd0a..e72cf2a471 100644
--- a/lang/zh-cn.json
+++ b/lang/zh-cn.json
@@ -140,7 +140,6 @@
"ExceptionContactSupportGeneric": "如果您仍然有这个问题,请%1$s联系您的Piwik管理员%2$s寻求援助。",
"ExceptionCheckUserHasSuperUserAccessOrIsTheUser": "用户必须是超级用户或是'%s' 自己。",
"ExceptionConfigurationFileNotFound": "配置文件 {%s} 找不到。",
- "ExceptionConfigurationFileNotFound2": "如果该文件存在,请检查用户 '%2$s'具有读写 %1$s 的权限。",
"ExceptionDatabaseVersion": "您的 %1$s 版本为 %2$s ,但 Piwik 需求至少要 %3$s。",
"ExceptionDatabaseVersionNewerThanCodebase": "您的Piwik代码库运行旧版本%1$s,但是我们检测到您的Piwik数据库已经升级到新的版本%2$s。",
"ExceptionDatabaseVersionNewerThanCodebaseWait": "也许你的Piwik管理员正在完成升级过程。请在几分钟后再试一次。",
@@ -285,7 +284,6 @@
"Password": "密码",
"Period": "统计时间",
"Piechart": "圆饼图",
- "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$s Piwik%2$s是由%7$s Piwik团队%8$s的成员以及全球许多其他贡献者赞助商的合作项目。如果你是Piwik的粉丝,你可以帮助我们:找到%3$s怎样参与Piwik项目%4$s,或者%5$s捐赠%6$s开发Piwik3.0的基金!",
"PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s可用。请通知%2$sPiwik管理员%3$s。",
"PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s 已经发布。 %2$s 请立即更新!%3$s (查看 %4$s 与%5$s 的差异)。",
"PleaseSpecifyValue": "请为 '%s' 选择一个指标。",
diff --git a/libs/Zend/Validate/Hostname.php b/libs/Zend/Validate/Hostname.php
index 6a6c4aabb8..1ea9800546 100644
--- a/libs/Zend/Validate/Hostname.php
+++ b/libs/Zend/Validate/Hostname.php
@@ -492,7 +492,12 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract
'微博' => array(1 => self::VALID_UNICODE_DOMAIN),
'ابوظبي' => array(1 => self::VALID_UNICODE_DOMAIN),
'网站' => array(1 => self::VALID_UNICODE_DOMAIN),
+ '大众汽车' => array(1 => self::VALID_UNICODE_DOMAIN),
'香格里拉' => array(1 => self::VALID_UNICODE_DOMAIN),
+ 'бг' => array(1 => self::VALID_UNICODE_DOMAIN),
+ '電訊盈科' => array(1 => self::VALID_UNICODE_DOMAIN),
+ 'العليان' => array(1 => self::VALID_UNICODE_DOMAIN),
+ '嘉里' => array(1 => self::VALID_UNICODE_DOMAIN),
);
diff --git a/libs/bower_components/jScrollPane/GPL-LICENSE.txt b/libs/bower_components/jScrollPane/GPL-LICENSE.txt
deleted file mode 100644
index 11dddd00ef..0000000000
--- a/libs/bower_components/jScrollPane/GPL-LICENSE.txt
+++ /dev/null
@@ -1,278 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
diff --git a/libs/bower_components/jScrollPane/ajax.html b/libs/bower_components/jScrollPane/ajax.html
deleted file mode 100644
index 006006f019..0000000000
--- a/libs/bower_components/jScrollPane/ajax.html
+++ /dev/null
@@ -1,151 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - ajax demo page</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var api = $('.scroll-pane').jScrollPane(
- {
- showArrows:true,
- maintainPosition: false
- }
- ).data('jsp');
-
- $('#do-ajax').bind(
- 'click',
- function()
- {
- api.getContentPane().load(
- 'ajax_content.html',
- function()
- {
- api.reinitialise();
- }
- );
- return false;
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - ajax demo page</h1>
- <p>
- This demonstration shows how you can use ajax to dynamically load content into your jScrollPane. Because of
- the way jScrollPane works you need to use the <a href="api.html#getContentPane">getContentPane</a> API method
- to get the element which you are adding content to and then <a href="api.html#reinitialise">reinitialise</a>
- the scrollpane once you have changed the content. As the <a href="settings.html#maintainPosition">maintainPosition
- </a> setting is true by default then the position of the scrollpane is maintained even if we are scrolling
- while the update happens.
- </p>
- <p>
- You can <a href="#" id="do-ajax">click here</a> to load some content into the scrollpane below using ajax.
- </p>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/ajax_content.html b/libs/bower_components/jScrollPane/ajax_content.html
deleted file mode 100644
index e67ffb2021..0000000000
--- a/libs/bower_components/jScrollPane/ajax_content.html
+++ /dev/null
@@ -1,73 +0,0 @@
-
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/anchors.html b/libs/bower_components/jScrollPane/anchors.html
deleted file mode 100644
index 327ad57667..0000000000
--- a/libs/bower_components/jScrollPane/anchors.html
+++ /dev/null
@@ -1,140 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane anchors demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane(
- {
- hijackInternalLinks: true
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - anchors demo page</h1>
- <p>
- This demonstration shows how jScrollPane can check the location.hash when the page loads and
- automatically scroll the pane to the correct place if the hash refers to an element within the scroll
- pane. jScrollPane can also hijack links within your page and automatically convert relevant ones to
- scroll the jScrollPane. As an example, the following links will scroll to the paragraphs in the scroll
- pane below: <a href="#para1">1</a>, <a href="#para2">2</a>, <a href="#para3">3</a>,
- <a href="#para4">4</a> and <a href="#para5">5</a>. <a href="#sourcecode-display">This link</a> (to the
- sourcecode listing below) is also an internal link but because its target isn't within the scrollpane
- we don't mess with it.
- </p>
- <p>
- <strong>Note</strong> that the link hijacking functionality is off by default (as it has a small
- performance overhead so if you don't need it you might as well not have it). To enable it pass
- <strong><a href="settings.html#hijackInternalLinks">hijackInternalLinks</a>: true</strong> in with
- your settings (as I do on this page). Internally only one live event is bound to the document body.
- </p>
- <div class="scroll-pane">
- <p id="para1">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p id="para2">
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p id="para3">
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p id="para4">
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p id="para5">
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/api.html b/libs/bower_components/jScrollPane/api.html
deleted file mode 100644
index 0b5b381872..0000000000
--- a/libs/bower_components/jScrollPane/api.html
+++ /dev/null
@@ -1,191 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - API documentation</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - API documentation</h1>
- <p>
- This page shows how you can use the jScrollPane API (in addition to the <a href="settings.html">
- settings object</a> and the <a href="events.html">events</a> which are dispatched) to update your
- jScrollPane after it's has been initially created.
- </p>
- <p>
- To get a reference to the API for a particular scrollpane you will need to access the 'jsp' variable in
- the <em>data</em> of the element you applied jScrollPane to. e.g.
- </p>
- <pre>var element = $('#my-element').jScrollPane({/* ...settings... */});
-var api = element.data('jsp');</pre>
- <p>
- Once you have a reference to the API you can call any of the following methods on it:
- </p>
- <h2 id="reinitialise">reinitialise(s)</h2>
- <p>
- Reinitialises the scroll pane (if it's internal dimensions have changed since the last time it
- was initialised). The settings object which is passed in will override any settings from the
- previous time it was initialised - if you don't pass any settings then the ones from the previous
- initialisation will be used.
- </p>
- <h2 id="scrollToElement">scrollToElement(ele, stickToTop, animate)</h2>
- <p>
- Scrolls the specified element (a jQuery object, DOM node or jQuery selector string) into view so
- that it can be seen within the viewport. If stickToTop is true then the element will appear at
- the top of the viewport, if it is false then the viewport will scroll as little as possible to
- show the element. You can also specify if you want animation to occur. If you don't provide this
- argument then the animateScroll value from the settings object is used instead.
- </p>
- <h2 id="scrollTo">scrollTo(destX, destY, animate)</h2>
- <p>
- Scrolls the pane so that the specified co-ordinates within the content are at the top left
- of the viewport. animate is optional and if not passed then the value of animateScroll from
- the settings object this jScrollPane was initialised with is used.
- </p>
- <h2 id="scrollToX">scrollToX(destX, animate)</h2>
- <p>
- Scrolls the pane so that the specified co-ordinate within the content is at the left of the
- viewport. animate is optional and if not passed then the value of animateScroll from the settings
- object this jScrollPane was initialised with is used.
- </p>
- <h2 id="scrollToY">scrollToY(destY, animate)</h2>
- <p>
- Scrolls the pane so that the specified co-ordinate within the content is at the top of the
- viewport. animate is optional and if not passed then the value of animateScroll from the settings
- object this jScrollPane was initialised with is used.
- </p>
- <h2 id="scrollToPercentX">scrollToPercentX(destPercentX, animate)</h2>
- <p>
- Scrolls the pane to the specified percentage of its maximum horizontal scroll position. animate
- is optional and if not passed then the value of animateScroll from the settings object this
- jScrollPane was initialised with is used.
- </p>
- <h2 id="scrollToPercentY">scrollToPercentY(destPercentY, animate)</h2>
- <p>
- Scrolls the pane to the specified percentage of its maximum vertical scroll position. animate
- is optional and if not passed then the value of animateScroll from the settings object this
- jScrollPane was initialised with is used.
- </p>
- <h2 id="scrollBy">scrollBy(deltaX, deltaY, animate)</h2>
- <p>
- Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- </p>
- <h2 id="scrollByX">scrollByX(deltaX, animate)</h2>
- <p>
- Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- </p>
- <h2 id="scrollByY">scrollByY(deltaY, animate)</h2>
- <p>
- Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- </p>
- <h2 id="positionDragX">positionDragX(x, animate)</h2>
- <p>
- Positions the horizontal drag at the specified x position (and updates the viewport to reflect
- this). animate is optional and if not passed then the value of animateScroll from the settings
- object this jScrollPane was initialised with is used.
- </p>
- <h2 id="positionDragY">positionDragY(y, animate)</h2>
- <p>
- Positions the vertical drag at the specified y position (and updates the viewport to reflect
- this). animate is optional and if not passed then the value of animateScroll from the settings
- object this jScrollPane was initialised with is used.
- </p>
- <h2 id="animate">animate(ele, prop, value, stepCallback, completeCallback)</h2>
- <p>
- This method is called when jScrollPane is trying to animate to a new position. You can override
- it if you want to provide advanced animation functionality. It is passed the following arguments:
- </p>
- <ul class="link-list">
- <li><strong>ele</strong> - the element whose position is being animated</li>
- <li><strong>prop</strong> - the property that is being animated</li>
- <li><strong>value</strong> - the value it's being animated to</li>
- <li><strong>stepCallback</strong> - a function that you must execute each time you update the value of the property</li>
- <li><strong>completeCallback</strong> - a function that will be executed after the animation had finished</li>
- </ul>
- <p>
- You can use the default implementation (see <a href="script/jquery.jscrollpane.js">sourcecode</a>) as a
- starting point for your own implementation.
- </p>
- <h2 id="getContentPositionX">getContentPositionX()</h2>
- <p>
- Returns the current x position of the viewport with regards to the content pane.
- </p>
- <h2 id="getContentPositionY">getContentPositionY()</h2>
- <p>
- Returns the current y position of the viewport with regards to the content pane.
- </p>
- <h2 id="getContentWidth">getContentWidth()</h2>
- <p>
- Returns the width of the content within the scroll pane.
- </p>
- <h2 id="getContentHeight">getContentHeight()</h2>
- <p>
- Returns the height of the content within the scroll pane.
- </p>
- <h2 id="getIsScrollableH">getIsScrollableH()</h2>
- <p>
- Returns whether or not this scrollpane has a horizontal scrollbar.
- </p>
- <h2 id="getPercentScrolledX">getPercentScrolledX()</h2>
- <p>
- Returns the horizontal position of the viewport within the pane content.
- </p>
- <h2 id="getPercentScrolledY">getPercentScrolledY()</h2>
- <p>
- Returns the vertical position of the viewport within the pane content.
- </p>
- <h2 id="getIsScrollableV">getIsScrollableV()</h2>
- <p>
- Returns whether or not this scrollpane has a vertical scrollbar.
- </p>
- <h2 id="getContentPane">getContentPane()</h2>
- <p>
- Gets a reference to the content pane. It is important that you use this method if you want to
- edit the content of your jScrollPane as if you access the element directly then you may have some
- problems (as your original element has had additional elements for the scrollbars etc added into
- it).
- </p>
- <h2 id="scrollToBottom">scrollToBottom(animate)</h2>
- <p>
- Scrolls this jScrollPane down as far as it can currently scroll. If animate isn't passed then the
- animateScroll value from settings is used instead.
- </p>
- <h2 id="hijackInternalLinks">hijackInternalLinks()</h2>
- <p>
- Hijacks the links on the page which link to content inside the scrollpane. If you have changed
- the content of your page (e.g. via AJAX) and want to make sure any new anchor links to the
- contents of your scroll pane will work then call this function.
- </p>
- <h2 id="destroy">destroy()</h2>
- <p>
- Destroys the jScrollPane on the instance matching this API object and restores the browser's
- default behaviour. <a href="destroy.html">Example</a>.
- </p>
- </div>
- </body>
-</html>
diff --git a/libs/bower_components/jScrollPane/arrow_hover.html b/libs/bower_components/jScrollPane/arrow_hover.html
deleted file mode 100644
index 42775c6c52..0000000000
--- a/libs/bower_components/jScrollPane/arrow_hover.html
+++ /dev/null
@@ -1,208 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane arrow hover demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane(
- {
- showArrows: true,
- arrowScrollOnHover: true
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - arrow hover example</h1>
- <p>
- This demonstration builds on the <a href="arrows.html">scrollpane arrows example</a> and adds in the
- ability for the scrollpane to automatically scroll when you are hovering over the arrow buttons. If you
- want this functionality then simply pass in <strong><a href="settings.html#arrowScrollOnHover">
- arrowScrollOnHover</a>: true</strong> when you initialise your scrollpane.
- </p>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/arrow_positions.html b/libs/bower_components/jScrollPane/arrow_positions.html
deleted file mode 100644
index bc3acf9eae..0000000000
--- a/libs/bower_components/jScrollPane/arrow_positions.html
+++ /dev/null
@@ -1,634 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane arrow positioning example</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane-before,
- .scroll-pane-after,
- .scroll-pane-split,
- .scroll-pane-os
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane-before').jScrollPane(
- {
- showArrows: true,
- verticalArrowPositions: 'before',
- horizontalArrowPositions: 'before'
- }
- );
- $('.scroll-pane-after').jScrollPane(
- {
- showArrows: true,
- verticalArrowPositions: 'after',
- horizontalArrowPositions: 'after'
- }
- );
- $('.scroll-pane-os').jScrollPane(
- {
- showArrows: true,
- verticalArrowPositions: 'os',
- horizontalArrowPositions: 'os'
- }
- );
- $('.scroll-pane-split').jScrollPane(
- {
- showArrows: true,
- verticalArrowPositions: 'split',
- horizontalArrowPositions: 'split'
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - example showing options for arrow positioning</h1>
- <p>
- This demonstration builds on the <a href="arrows.html">basic arrows scrollpane example</a> and
- demonstrates the different possible settings for <a href="settings.html#verticalArrowPositions">
- verticalArrowPositions</a> and <a href="settings.html#horizontalArrowPositions">horizontalArrowPositions
- </a>. These settings allow you to choose where the arrows appear relative to the tracks and each of the
- settings has four valid values:
- </p>
- <ul class="link-list">
- <li>
- <strong>split</strong> - First arrow will appear before track, second arrow afterwards (the default)
- </li>
- <li>
- <strong>before</strong> - Both arrows will appear before the track.
- </li>
- <li>
- <strong>after</strong> - Both arrows will appear after the track (as is default on OSX).
- </li>
- <li>
- <strong>os</strong> - The positioning of the arrows will be chosen dependant on the users operating
- system (e.g. the value will be "after" for OSX and "split" or other operating systems).
- </li>
- </ul>
- <p>
- Note that in these examples the arrows are simple squares which can cause confusion when they are next
- to each other. This won't be a problem with well designed graphical elements.
- </p>
-
- <h2>Vertical only, "before"</h2>
- <div class="scroll-pane-before">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only, "before"</h2>
- <div class="scroll-pane-before horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both, "before"</h2>
- <div class="scroll-pane-before">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
-
- <h2>Vertical only, "after"</h2>
- <div class="scroll-pane-after">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only, "after"</h2>
- <div class="scroll-pane-after horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both, "after"</h2>
- <div class="scroll-pane-after">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
-
- <h2>Vertical only, "os"</h2>
- <div class="scroll-pane-os">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only, "os"</h2>
- <div class="scroll-pane-os horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both, "os"</h2>
- <div class="scroll-pane-os">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
-
- <h2>Vertical only, "split" (default)</h2>
- <div class="scroll-pane-split">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only, "split" (default)</h2>
- <div class="scroll-pane-split horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both, "split" (default)</h2>
- <div class="scroll-pane-split">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/arrows.html b/libs/bower_components/jScrollPane/arrows.html
deleted file mode 100644
index 7b667ab24e..0000000000
--- a/libs/bower_components/jScrollPane/arrows.html
+++ /dev/null
@@ -1,203 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>Basic arrows jScrollPane demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane({showArrows: true});
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - example with arrow buttons</h1>
- <p>
- This demonstration builds on the <a href="basic.html">basic scrollpane example</a> by adding navigation
- "arrows" to the scrollbar. As you can see from the sourcecode below, these are simply added by passing
- <strong><a href="settings.html#showArrows">showArrows</a>:true</strong> in the settings object when you
- initialise jScrollPane.
- </p>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/auto_reinitialise.html b/libs/bower_components/jScrollPane/auto_reinitialise.html
deleted file mode 100644
index 7e1bbd7a17..0000000000
--- a/libs/bower_components/jScrollPane/auto_reinitialise.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - automatic reinitialise demo page</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var settings = {
- showArrows: true,
- autoReinitialise: true
- };
- var pane = $('.scroll-pane')
- pane.jScrollPane(settings);
- var contentPane = pane.data('jsp').getContentPane();
- var i = 1;
-
- // Every second add some new content...
- setInterval(
- function()
- {
- contentPane.append(
- $('<p />').text('This is paragraph number ' + i++)
- );
- },
- 1000
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - automatic reinitialisation demo page</h1>
- <p>
- This demonstration shows how you can tell jScrollPane to automatically reinitialise itself. You do this
- by passing in <strong><a href="settings.html#autoReinitialise">autoReinitialise</a>: true</strong> as a
- setting. If you do this then the scrollpane attempts to reinitialise itself every
- <a href="settings.html#autoReinitialiseDelay">autoReinitialiseDelay</a> miliseconds.
- </p>
- <p>
- Note that there is obviously a processing overhead associated with this method as the script is running
- repeatedly in the background. For this reason <strong>autoReinitialise</strong> is false by default and
- if possible you are recommended to <a href="dynamic_content.html">manually reinitialise</a>
- jScrollPane when you add content to it. However, in some situations this isn't possible so the
- <strong>autoReinitialise</strong> method is provided for convenience.
- </p>
- <div class="scroll-pane">
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/basic.html b/libs/bower_components/jScrollPane/basic.html
deleted file mode 100644
index 79e0d7723e..0000000000
--- a/libs/bower_components/jScrollPane/basic.html
+++ /dev/null
@@ -1,204 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>Basic jScrollPane demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - simple demo page</h1>
- <p>
- This demonstration shows basic use of the jScrollPane plugin to add scrollbars to a HTML
- element which has an overflow of "auto". Note that with javascript disabled the browsers
- default scrollbars will be used to provide scrolling for the element below. With javascript
- enabled then the browsers default scrollbars will be replaced with jScrollPane scrollbars
- which can be styled at will.
- </p>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/caps.html b/libs/bower_components/jScrollPane/caps.html
deleted file mode 100644
index 065e77970d..0000000000
--- a/libs/bower_components/jScrollPane/caps.html
+++ /dev/null
@@ -1,236 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane "caps" demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .jspCap
- {
- display: block;
- background: #eeeef4;
- }
-
- .jspVerticalBar .jspCap
- {
- height: 20px;
- }
-
- .jspHorizontalBar .jspCap
- {
- width: 50px;
- height: 100%;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane(
- {
- showArrows: true,
- horizontalGutter: 30,
- verticalGutter: 30
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - demo showing "caps" functionality</h1>
- <p>
- This demo shows how you can use CSS to set up "caps" e.g. unused spaces at the end of the scrollbars
- which make the scrollbars appear shorter than the content block that they are scrolling. Note that in
- addition to the CSS to show and size the caps I also added extra gutter in the jScrollPane constructor
- - this introduces a gap between the scrolling content and the scrollbar itself.
- </p>
- <h2>Vertical scroll with buttons and caps</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal scroll with buttons and caps</h2>
- <div class="scroll-pane">
- <p style="width: 940px">
- Vestibulumdic tumconsecte turmagnaeuegestas.Praesentmolestie dapibuserat,sitametsodaleslectus
- congueut. Namadipiscing, tortoracblanditeges tas,lor emligula posuereipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- </div>
- <h2>Horizontal and vertical scrolling with buttons and caps</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p style="width: 940px">
- Vestibulumdic tumconsecte turmagnaeuegestas.Praesentmolestie dapibuserat,sitametsodaleslectus
- congueut. Namadipiscing, tortoracblanditeges tas,lor emligula posuereipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/changelog.html b/libs/bower_components/jScrollPane/changelog.html
deleted file mode 100644
index e5818a15eb..0000000000
--- a/libs/bower_components/jScrollPane/changelog.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - changelog</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - changelog</h1>
- <p>
- jScrollPane was originally developed in December 2006. Since then it has been constantly updated to
- fix bugs and add new features. The change history since November 2008 is available in the jScrollPane
- <a href="http://github.com/vitch/jScrollPane">git repository</a>. In August 2010 a major rewrite was
- undertaken, starting from a blank canvas and adding long awaited features like horizontal scrolling
- and automatic reinitialisation. If you want to find old versions of jScrollPane then there are links
- to the still available versions below:
- </p>
- <ul class="link-list">
- <li>2011-04-17 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta10">2.0.0beta10</a> - cleaner required size calculation, improved keyboard support, stickToBottom/Left, other small fixes</li>
- <li>2011-01-31 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta9">2.0.0beta9</a> - new API methods, bug fixes and correct keyboard support for FF/OSX</li>
- <li>2011-01-29 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta8">2.0.0beta8</a> - touchscreen support, improved keyboard support</li>
- <li>2011-01-23 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta7">2.0.0beta7</a> - scroll speed consistent (thanks Aivo Paas)</li>
- <li>2010-12-07 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta6">2.0.0beta6</a> - scrollToElement horizontal support</li>
- <li>2010-10-18 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta5">2.0.0beta5</a> - jQuery 1.4.3 support, various bug fixes</li>
- <li>2010-09-13 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta4">2.0.0beta4</a> - clickOnTrack support, bug fixes</li>
- <li>2010-08-27 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta3">2.0.0beta3</a> - Horizontal mousewheel, mwheelIntent, keyboard support, bug fixes</li>
- <li>2010-08-21 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta2">2.0.0beta2</a> - Bug fixes</li>
- <li>2010-08-17 - <a href="http://github.com/vitch/jScrollPane/tree/2.0.0beta1">2.0.0beta1</a> - Rewrite to follow modern best practices and enable horizontal scrolling, initially hidden elements and dynamically sized elements.</li>
- <li>2010-06-11 - <a href="http://github.com/vitch/jScrollPane/tree/1.x">v1.2+</a></li>
- <li>2008-12-10 - <a href="http://github.com/vitch/jScrollPane/tree/1.2.3">v1.2.3</a></li>
- <li>2008-11-29 - <a href="http://github.com/vitch/jScrollPane/tree/1.2.2">v1.2.2</a></li>
- <li>2008-11-13 - <a href="http://github.com/vitch/jScrollPane/tree/1.2.1">v1.2.1</a></li>
- <li>2008-11-07 - <a href="http://github.com/vitch/jScrollPane/tree/1.2">v1.2</a></li>
- <li>2006-12-31 - <a href="http://www.kelvinluck.com/2006/12/jscrollpane-cross-browser-custom-scrollbars/">v1</a></li>
- </ul>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/destroy.html b/libs/bower_components/jScrollPane/destroy.html
deleted file mode 100644
index f98ae3f1d4..0000000000
--- a/libs/bower_components/jScrollPane/destroy.html
+++ /dev/null
@@ -1,237 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>Basic jScrollPane destroy demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var apis = [];
- $('#jsp-destroy').bind(
- 'click',
- function()
- {
- if (apis.length) {
- $.each(
- apis,
- function(i) {
- this.destroy();
- }
- )
- apis = [];
- }
- return false;
- }
- );
- $('#jsp-init').bind(
- 'click',
- function()
- {
- // Loop over each scrollpane individually so we can
- // save a reference to each api object.
- $('.scroll-pane').each(
- function()
- {
- apis.push($(this).jScrollPane().data().jsp);
- }
- )
- return false;
- }
- ).trigger('click'); // initially initialise
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - destroy demo page</h1>
- <p>
- This demonstration shows how you can use the <a href="api.html#destroy">destroy</a> method of the
- jScrollPane API to remove a jScrollPane that you have added to an element. Use the links below to
- initialise and destroy the jScrollPane.
- </p>
- <ul>
- <li><a href="#" id="jsp-destroy">Destroy</a></li>
- <li><a href="#" id="jsp-init">Initialise</a></li>
- </ul>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/drag_size.html b/libs/bower_components/jScrollPane/drag_size.html
deleted file mode 100644
index 1b084c4c87..0000000000
--- a/libs/bower_components/jScrollPane/drag_size.html
+++ /dev/null
@@ -1,206 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane drag size demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane(
- {
- verticalDragMinHeight: 20,
- verticalDragMaxHeight: 20,
- horizontalDragMinWidth: 20,
- horizontalDragMaxWidth: 20
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - drag size demo</h1>
- <p>
- This example shows how you can use the <a href="settings.html#verticalDragMinHeight">
- verticalDragMinHeight</a>, <a href="settings.html#verticalDragMaxHeight">verticalDragMaxHeight</a>,
- <a href="settings.html#horizontalDragMinWidth">horizontalDragMinWidth</a> and
- <a href="settings.html#horizontalDragMaxWidth">horizontalDragMaxWidth</a> properties to control the
- size of the drag elements in the scrollbars. In this example I pass the same numbers in for min and max
- which has the effect of forcing the drag element to be that exact size.
- </p>
- <h2>Basic vertical jScrollPane with 20px drag</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Basic horizontal jScrollPane with 20px drag</h2>
- <div class="scroll-pane">
- <p style="width: 900px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Basic bi-directional jScrollPane with 20px drag</h2>
- <div class="scroll-pane">
- <p style="width: 900px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/dynamic_content.html b/libs/bower_components/jScrollPane/dynamic_content.html
deleted file mode 100644
index 4e476e6883..0000000000
--- a/libs/bower_components/jScrollPane/dynamic_content.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - dynamic content demo page</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var settings = {
- showArrows: true
- };
- var pane = $('.scroll-pane')
- pane.jScrollPane(settings);
- var api = pane.data('jsp');
- var i = 1;
-
- // Every second add some new content...
- setInterval(
- function()
- {
- api.getContentPane().append(
- $('<p />').text('This is paragraph number ' + i++)
- );
- // we could call "pane.jScrollPane(settings)" again but it is
- // more convenient to call via the API as then the original
- // settings we passed in are automatically remembered.
- api.reinitialise();
- },
- 1000
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - dynamic content demo page</h1>
- <p>
- This demonstration shows how you can manually reinitialise jScrollPane when new content is added to it.
- Every second we add a new line of content to the scrollpane (using the <a href="api.html#getContentPane">
- getContentPane</a> API method) and then <a href="api.html#reinitialise">reinitialise</a> the scrollpane.
- As the <a href="settings.html#maintainPosition">maintainPosition</a> setting is true by default then
- the position of the scrollpane is maintained even if we are scrolling while the update happens.
- </p>
- <div class="scroll-pane">
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/dynamic_height.html b/libs/bower_components/jScrollPane/dynamic_height.html
deleted file mode 100644
index 6b05550b88..0000000000
--- a/libs/bower_components/jScrollPane/dynamic_height.html
+++ /dev/null
@@ -1,207 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane dynamic height demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- html,
- body
- {
- height: 100%;
- }
- #container
- {
- height: 100%;
- }
- pre
- {
- width: 95%;
- }
- .scroll-pane
- {
- width: 100%;
- height: 30%;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').each(
- function()
- {
- $(this).jScrollPane(
- {
- showArrows: $(this).is('.arrow')
- }
- );
- var api = $(this).data('jsp');
- var throttleTimeout;
- $(window).bind(
- 'resize',
- function()
- {
- // IE fires multiple resize events while you are dragging the browser window which
- // causes it to crash if you try to update the scrollpane on every one. So we need
- // to throttle it to fire a maximum of once every 50 milliseconds...
- if (!throttleTimeout) {
- throttleTimeout = setTimeout(
- function()
- {
- api.reinitialise();
- throttleTimeout = null;
- },
- 50
- );
- }
- }
- );
- }
- )
-
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - dynamic height demo</h1>
- <p>
- This demonstration builds on the <a href="dynamic_width.html">dynamic width</a> demo and shows how
- jScrollPane will also work correctly with elements which have a percentage height. Note that the rest
- of the infrastructure for this site isn't built for dynamic height so the code listings may overhang
- the bottom of their containing box. Also note (if your screen is big enough) that the scrollbars will
- automatically appear/ disappear as they become necessary or not (dependant on the content).
- </p>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/dynamic_width.html b/libs/bower_components/jScrollPane/dynamic_width.html
deleted file mode 100644
index 90e5fdc085..0000000000
--- a/libs/bower_components/jScrollPane/dynamic_width.html
+++ /dev/null
@@ -1,368 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane dynamic width demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- #container
- {
- width: 60%;
- }
- pre
- {
- width: 95%;
- }
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
-
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').each(
- function()
- {
- $(this).jScrollPane(
- {
- showArrows: $(this).is('.arrow')
- }
- );
- var api = $(this).data('jsp');
- var throttleTimeout;
- $(window).bind(
- 'resize',
- function()
- {
- if (!throttleTimeout) {
- throttleTimeout = setTimeout(
- function()
- {
- api.reinitialise();
- throttleTimeout = null;
- },
- 50
- );
- }
- }
- );
- }
- )
-
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - dynamic width demo</h1>
- <p>
- This demonstration shows how jScrollPane can work correctly on elements whose width is specified as a
- percentage. Notice that the jScrollPanes reflow correctly as you resize your browser window. We are
- listening to the window resize event as we know that is what is causing the scrollpane's container to
- change size. You could just as easily use <a href="settings.html#autoReinitialise">autoReinitialise</a>
- so that the scrollpanes were updated automatically.
- </p>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
-
- <h2>Vertical only (with arrows)</h2>
- <div class="scroll-pane arrow">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only (with arrows)</h2>
- <div class="scroll-pane arrow horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both (with arrows)</h2>
- <div class="scroll-pane arrow">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/events.html b/libs/bower_components/jScrollPane/events.html
deleted file mode 100644
index 235bab7ee5..0000000000
--- a/libs/bower_components/jScrollPane/events.html
+++ /dev/null
@@ -1,324 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane events demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane')
- .bind(
- 'jsp-initialised',
- function(event, isScrollable)
- {
- console.log('Handle jsp-initialised', this,
- 'isScrollable=', isScrollable);
- }
- )
- .bind(
- 'jsp-will-scroll-x',
- function(event, destX)
- {
- console.log(
- 'Handle jsp-will-scroll-x', this,
- 'destX=', destX
- );
- }
- )
- .bind(
- 'jsp-will-scroll-y',
- function(event, destY)
- {
- console.log(
- 'Handle jsp-will-scroll-y', this,
- 'destY=', destY
- );
- }
- )
- .bind(
- 'jsp-scroll-y',
- function(event, scrollPositionY, isAtTop, isAtBottom)
- {
- console.log('Handle jsp-scroll-y', this,
- 'scrollPositionY=', scrollPositionY,
- 'isAtTop=', isAtTop,
- 'isAtBottom=', isAtBottom);
- }
- )
- .bind(
- 'jsp-scroll-x',
- function(event, scrollPositionX, isAtLeft, isAtRight)
- {
- console.log('Handle jsp-scroll-x', this,
- 'scrollPositionX=', scrollPositionX,
- 'isAtLeft=', isAtLeft,
- 'isAtRight=', isAtRight);
- }
- )
- .bind(
- 'jsp-arrow-change',
- function(event, isAtTop, isAtBottom, isAtLeft, isAtRight)
- {
- console.log('Handle jsp-arrow-change', this,
- 'isAtTop=', isAtTop,
- 'isAtBottom=', isAtBottom,
- 'isAtLeft=', isAtLeft,
- 'isAtRight=', isAtRight);
- }
- )
- .bind(
- 'jsp-user-scroll-y',
- function(event, destTop, isAtTop, isAtBottom)
- {
- console.log(
- 'Handle jsp-user-scroll-y', this,
- 'destTop=', destTop,
- 'isAtTop=', isAtTop,
- 'isAtBottom=', isAtBottom
- );
- }
- )
- .bind(
- 'jsp-user-scroll-x',
- function(event, destLeft, isAtLeft, isAtRight)
- {
- console.log(
- 'Handle jsp-user-scroll-x', this,
- 'destLeft=', destLeft,
- 'isAtLeft=', isAtLeft,
- 'isAtRight=', isAtRight
- );
- }
- )
- .jScrollPane();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - events demo page</h1>
- <p>
- This demonstration shows you the various events that are dispatched by jScrollPane. As you can see,
- the relevant data from each event is logged to the console (this page requires a browser that supports
- <em>console.log</em>).
- </p>
- <p>
- The available events are:
- </p>
- <ul class="link-list">
- <li>
- <strong>jsp-initialised [event, isScrollable]</strong> - Fires when an element is (re)initialised.
- </li>
- <li>
- <strong>jsp-scroll-y [event, scrollPositionY, isAtTop, isAtBottom]</strong> - Fires continuously
- whilst vertical scrolling is occuring
- </li>
- <li>
- <strong>jsp-scroll-x [event, scrollPositionX, isAtLeft, isAtRight]</strong> - Fires continuously
- whilst horizontal scrolling is occuring
- </li>
- <li>
- <strong>jsp-arrow-change [event, isAtTop, isAtBottom, isAtLeft, isAtRight]</strong> - Fires
- whenever the state of the arrow buttons changes (i.e. when the scroll reaches or leaves any end of
- the viewport). Note that this function isn't dependant on having <a href="settings.html#showArrows">
- showArrows</a> set to true, indeed it is most useful when implementing your own arrow keys.
- </li>
- <li>
- <strong>jsp-user-scroll-y [event, -destTop, isAtTop, isAtBottom]</strong> - Fires only when the
- scroll is caused by the user. Also, its fired after the actual scroll had happened.
- </li>
- <li>
- <strong>jsp-user-scroll-x [event, -destLeft, isAtLeft, isAtRight]</strong> - Fires only when the
- scroll is caused by the user. Also, its fired after the actual scroll had happened.
- </li>
- <li>
- <strong>jsp-will-scroll-y [event, destY]</strong> - Fired before the actual scroll had happened.
- This can be used to disable the scroll functionality if the event.preventDefault() is called.
- </li>
- <li>
- <strong>jsp-will-scroll-x [event, destX]</strong> - Fired before the actual scroll had happened.
- This can be used to disable the scroll functionality if the event.preventDefault() is called.
- </li>
- </ul>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html>
diff --git a/libs/bower_components/jScrollPane/faqs.html b/libs/bower_components/jScrollPane/faqs.html
deleted file mode 100644
index 70cd8c1e2b..0000000000
--- a/libs/bower_components/jScrollPane/faqs.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - frequently asked questions</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - frequently asked questions</h1>
- <p>
- This page contains some frequently asked questions about jScrollPane and their answers.
- </p>
- <h2 id="webkit-broken">Why does my scrollbar only appear intermittantly in Webkit based browsers?</h2>
- <p>
- In Webkit based browsers (e.g. Safari, Chrome, iOS and Android) there is a known issue where you must
- include your CSS before your JS. <a href="known_issues.html#webkit-css-first">More info</a>.
- </p>
- <h2 id="ajax-disappearing-scrollbar">Why does my scrollbar disappear when I reinitialise my jScrollPane after updating the content with ajax?</h2>
- <p>
- jScrollPane version 2 places the scrollbar and associated controls <strong>inside</strong> the element you apply jScrollPane to. This means that
- any positional styling on the containing element continues to work correctly and also allows us to calculate size changes correctly when the
- parent element's size changes.
- </p>
- <p>
- Because of this you can't simply replace the contents of jScrollPane. Instead you need to use the <a href="api.html#getContentPane">
- getContentPane</a> API method as shown in the <a href="ajax.html">ajax</a> and <a href="dynamic_content.html">dynamic content</a> examples.
- </p>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/fixed_width.html b/libs/bower_components/jScrollPane/fixed_width.html
deleted file mode 100644
index 23aafe8661..0000000000
--- a/libs/bower_components/jScrollPane/fixed_width.html
+++ /dev/null
@@ -1,230 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane fixed width demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .width-marker
- {
- width: 300px;
- border-bottom: 15px solid #3333ff;
- margin: 0 0 1em;
- }
- .scroll-pane
- {
- width: 300px;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').before(
- $('<div class="width-marker" />')
- );
- $('.scroll-pane').jScrollPane();
- $('#reinit-link').bind(
- 'click',
- function()
- {
- // Using this form rather than the API simply because
- // it is easier to apply the same action to multiple
- // scrollpanes this way - they should be equivalent
- $('.scroll-pane').jScrollPane();
- return false;
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - fixed width demo page</h1>
- <p>
- This demonstration is to test a fix for a problem with elements who have a fixed width (as
- <a href="http://groups.google.com/group/jscrollpane/browse_thread/thread/a5955d3b77d56afb#msg_0867f38ede7398ce">
- reported</a> on the mailing list).
- </p>
- <p>
- When the panes are reinitialised (by clicking <a href="#" id="reinit-link">this link</a>) they should
- stay at their fixed width (300px).
- </p>
- <p>
- Note that I have also added blue bars marking 300px widths to double check that the scrollpane is
- displaying its content at the correct width.
- </p>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/focus.html b/libs/bower_components/jScrollPane/focus.html
deleted file mode 100644
index ae38d46d00..0000000000
--- a/libs/bower_components/jScrollPane/focus.html
+++ /dev/null
@@ -1,207 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane tracking focus demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - demo page showing how focus is automatically tracked</h1>
- <p>
- This demonstration shows how jScrollPane can track the focus of focusble elements (e.g. form elements
- and links) within your scroll pane and automatically scroll so that the focused element is visible.
- </p>
- <form>
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum <a href="#">ante</a>. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <fieldset>
- <legend>Demo form</legend>
- <label for="input1">Input 1</label>
- <input type="text" id="input1" name="input1" />
- <label for="input2">Input 2</label>
- <textarea id="input2" name="input1"></textarea>
- <label for="input3">Input 3</label>
- <select id="input3" name="input3">
- <option>There is no option</option>
- </select>
- <input type="submit" value="Don't click me" />
- </fieldset>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et <a href="#">sapien</a> ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal and vertical</h2>
- <div class="scroll-pane">
- <p style="width: 900px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae <a href="#">ante</a>, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum . Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <fieldset>
- <legend>Demo form</legend>
- <label for="input1">Input 1</label>
- <input type="text" id="input1" name="input1" />
- <label for="input2">Input 2</label>
- <textarea id="input2" name="input1"></textarea>
- <label for="input3">Input 3</label>
- <select id="input3" name="input3">
- <option>There is no option</option>
- </select>
- <input type="submit" value="Don't click me" />
- </fieldset>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et <a href="#">sapien</a> ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </form>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/fullpage_scroll.html b/libs/bower_components/jScrollPane/fullpage_scroll.html
deleted file mode 100644
index 996f5e874b..0000000000
--- a/libs/bower_components/jScrollPane/fullpage_scroll.html
+++ /dev/null
@@ -1,259 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane demo - full page scrollpane</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- html
- {
- overflow: auto;
- }
- #full-page-container
- {
- overflow: auto;
- }
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var win = $(window);
- // Full body scroll
- var isResizing = false;
- win.bind(
- 'resize',
- function()
- {
- if (!isResizing) {
- isResizing = true;
- var container = $('#full-page-container');
- // Temporarily make the container tiny so it doesn't influence the
- // calculation of the size of the document
- container.css(
- {
- 'width': 1,
- 'height': 1
- }
- );
- // Now make it the size of the window...
- container.css(
- {
- 'width': win.width(),
- 'height': win.height()
- }
- );
- isResizing = false;
- container.jScrollPane(
- {
- 'showArrows': true
- }
- );
- }
- }
- ).trigger('resize');
-
- // Workaround for known Opera issue which breaks demo (see
- // http://jscrollpane.kelvinluck.com/known_issues.html#opera-scrollbar )
- $('body').css('overflow', 'hidden');
-
- // IE calculates the width incorrectly first time round (it
- // doesn't count the space used by the native scrollbar) so
- // we re-trigger if necessary.
- if ($('#full-page-container').width() != win.width()) {
- win.trigger('resize');
- }
-
- // Internal scrollpanes
- $('.scroll-pane').jScrollPane({showArrows: true});
- });
- </script>
- </head>
- <body>
- <div id="full-page-container">
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - example with whole page scrolling and nested scrollbars</h1>
- <p>
- This example demonstrates how you can use jScrollPane to style the scrollbars for an entire
- document. It also demonstrates that jScrollPane works correctly when scrollbars are nested
- (i.e. when there is a jScrollPane inside another jScrollPane).
- </p>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/iframe.html b/libs/bower_components/jScrollPane/iframe.html
deleted file mode 100644
index 6e58671f4e..0000000000
--- a/libs/bower_components/jScrollPane/iframe.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>iframe jScrollPane demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- iframe {
- width: 100%;
- height: 200px;
- border: 0;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- // No page specific javascript - see the sourcecode of the loaded content instead
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - example with iframes</h1>
- <p>
- This demonstration shows how you can apply jScrollPane to content in an iframe. Note that in this
- demo nothing is done in the hosting page (this one), all of the necessary javascript happens inside
- the loaded pages (e.g. <a href="iframe_content1.html">iframe_content1.html</a> and
- <a href="iframe_content2.html">iframe_content2.html</a>). Those pages basically use the same technique
- as in the <a href="fullpage_scroll.html">full page scroll</a> example.
- </p>
- <p>
- To implement this technique you don't need to add any code to the hosting page but you do need to have
- control over the pages which you load into the iframes. And each of those pages will need to include the
- relevant script files (e.g. jQuery, jScrollPane etc etc) as well as the document ready script as I show
- in my examples.
- </p>
-
- <h2>Vertical only</h2>
- <iframe src="iframe_content1.html"></iframe>
- <h2>Both</h2>
- <iframe src="iframe_content2.html"></iframe>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/iframe2.html b/libs/bower_components/jScrollPane/iframe2.html
deleted file mode 100644
index 07d4c92fa1..0000000000
--- a/libs/bower_components/jScrollPane/iframe2.html
+++ /dev/null
@@ -1,121 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - alternative iframe demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .iframe-holder {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- iframe
- {
- border: 0;
- width: 100%;
- height: 100%;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('iframe').bind(
- 'load.jsp',
- function()
- {
- var doc = this.contentDocument || this.contentWindow.document;
- var jDoc = $(doc);
- //jDoc = $('body', doc);
- var frame = $(this);
- var destWidth = jDoc.width();
- var destHeight = jDoc.height();
-
- // Need to unbind the load event otherwise it is triggered again
- // when jScrollPane wraps the iframe which results in it being removed
- // from the document and added again.
- frame.unbind('load.jsp');
-
- if (destWidth > frame.width()) {
- // to allow for the scrollbar...
- // Should be possible more cleanly though
- destWidth += 16;
- }
- if (destHeight > frame.height()) {
- // to allow for the scrollbar...
- // Should be possible more cleanly though
- destHeight += 16;
- }
- frame.width(destWidth);
- frame.height(destHeight);
- frame.parent().jScrollPane();
- }
- );
- }
- );
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - alternative approach to implement jScrollPane with iframes</h1>
- <p>
- This demonstration shows a different approach to <a href="iframe.html">the first iframe demo</a> for
- styling the scrollbars associated with an iframe. This approach requires no special code inside the
- iframe content pages (e.g. <a href="iframe_content3.html">iframe_content3.html</a> and
- <a href="iframe_content4.html">iframe_content4.html</a>) and instead relies on the script in the hosting
- page (this page).
- </p>
- <p>
- This approach has some shortcomings though. The mousewheel doesn't work and the calculation of the width
- and height seems a little off...
- </p>
-
- <h2>Vertical only</h2>
- <div class="iframe-holder">
- <iframe src="iframe_content3.html"></iframe>
- </div>
- <h2>Both</h2>
- <div class="iframe-holder">
- <iframe src="iframe_content4.html"></iframe>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/iframe_content1.html b/libs/bower_components/jScrollPane/iframe_content1.html
deleted file mode 100644
index f0d42f6723..0000000000
--- a/libs/bower_components/jScrollPane/iframe_content1.html
+++ /dev/null
@@ -1,143 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane iframe content</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- body
- {
- background: #fff;
- overflow: auto;
- height: 100%;
- }
- #content
- {
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var win = $(window);
- // Full body scroll
- var isResizing = false;
- win.bind(
- 'resize',
- function()
- {
- if (!isResizing) {
- isResizing = true;
- var container = $('#content');
- // Temporarily make the container tiny so it doesn't influence the
- // calculation of the size of the document
- container.css(
- {
- 'width': 1,
- 'height': 1
- }
- );
- // Now make it the size of the window...
- container.css(
- {
- 'width': win.width(),
- 'height': win.height()
- }
- );
- isResizing = false;
- container.jScrollPane(
- {
- 'showArrows': true
- }
- );
- }
- }
- ).trigger('resize');
-
- // Workaround for known Opera issue which breaks demo (see
- // http://jscrollpane.kelvinluck.com/known_issues.html#opera-scrollbar )
- $('body').css('overflow', 'hidden');
-
- // IE calculates the width incorrectly first time round (it
- // doesn't count the space used by the native scrollbar) so
- // we re-trigger if necessary.
- if ($('#full-page-container').width() != win.width()) {
- win.trigger('resize');
- }
- });
- </script>
- </head>
- <body>
- <div id="content">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/iframe_content2.html b/libs/bower_components/jScrollPane/iframe_content2.html
deleted file mode 100644
index 2059b4f2e6..0000000000
--- a/libs/bower_components/jScrollPane/iframe_content2.html
+++ /dev/null
@@ -1,143 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane iframe content 2</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- body
- {
- background: #fff;
- height: 100%;
- }
- .scroll-pane p
- {
- padding: 0 0 0 1em;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var win = $(window);
- // Full body scroll
- var isResizing = false;
- win.bind(
- 'resize',
- function()
- {
- if (!isResizing) {
- isResizing = true;
- var container = $('#content');
- // Temporarily make the container tiny so it doesn't influence the
- // calculation of the size of the document
- container.css(
- {
- 'width': 1,
- 'height': 1
- }
- );
- // Now make it the size of the window...
- container.css(
- {
- 'width': win.width(),
- 'height': win.height()
- }
- );
- isResizing = false;
- container.jScrollPane(
- {
- 'showArrows': true
- }
- );
- }
- }
- ).trigger('resize');
-
- // Workaround for known Opera issue which breaks demo (see
- // http://jscrollpane.kelvinluck.com/known_issues.html#opera-scrollbar )
- $('body').css('overflow', 'hidden');
-
- // IE calculates the width incorrectly first time round (it
- // doesn't count the space used by the native scrollbar) so
- // we re-trigger if necessary.
- if ($('#full-page-container').width() != win.width()) {
- win.trigger('resize');
- }
- });
- </script>
- </head>
- <body>
- <div id="content">
- <p style="width: 900px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/iframe_content3.html b/libs/bower_components/jScrollPane/iframe_content3.html
deleted file mode 100644
index 7fbdc356c0..0000000000
--- a/libs/bower_components/jScrollPane/iframe_content3.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane iframe content 3</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- html,
- body
- {
- background: #fff;
- }
- </style>
-
- </head>
- <body>
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/iframe_content4.html b/libs/bower_components/jScrollPane/iframe_content4.html
deleted file mode 100644
index 294d766b57..0000000000
--- a/libs/bower_components/jScrollPane/iframe_content4.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane iframe content 4</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- html,
- body
- {
- background: #fff;
- }
- </style>
-
- </head>
- <body>
- <p style="width: 900px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/image.html b/libs/bower_components/jScrollPane/image.html
deleted file mode 100644
index 9c9055e64b..0000000000
--- a/libs/bower_components/jScrollPane/image.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane image demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 400px;
- overflow: auto;
- }
-
- img
- {
- margin: 1em 0;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane(
- {
- autoReinitialise: true
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - image demo page</h1>
- <p>
- This demonstration shows how jScrollPane can handle it when some slow loading images are included
- in the contents of the pane.
- </p>
- <p>
- We use <a href="settings.html#autoReinitialise">autoReinitialse</a> so that the scrollpane automatically
- re-calculates the size of it's content if and when it changes. Note that use of this property adds an
- overhead to your page and is subject to the same warnings on the <a href="auto_reinitialise.html">auto
- reinitialise demo</a> page.
- </p>
- <p>
- If you can it is better to include width and height for each image (either through width and height
- attributes or via CSS) in the markup. That way you can avoid the autoReinitialise cost. See
- <a href="image2.html">this demo</a> for an example of that approach.
- </p>
- <div class="scroll-pane">
- <img src="http://farm5.static.flickr.com/4068/4502147230_61d4f18460_z.jpg" alt="Touring" />
- <img src="http://farm5.static.flickr.com/4065/4501530717_8a7f9c8ce8_z.jpg" alt="Avalauncher" />
- <img src="http://farm5.static.flickr.com/4034/4502145190_d7ae16127b_z.jpg" alt="Rockies" />
- <img src="http://farm5.static.flickr.com/4003/4409969018_16cc9d8bf1_z.jpg" alt="Paper cranes" />
- <img src="http://farm5.static.flickr.com/4064/4407630907_1430d32efa_z.jpg" alt="Icecream">
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/image2.html b/libs/bower_components/jScrollPane/image2.html
deleted file mode 100644
index 476eaa51df..0000000000
--- a/libs/bower_components/jScrollPane/image2.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane image demo 2</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 400px;
- overflow: auto;
- }
-
- img
- {
- margin: 1em 0;
- }
-
- img.portrait
- {
- width: 480px;
- height: 640px;
- }
-
- img.landscape
- {
- width: 640px;
- height: 480px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - image demo page part 2</h1>
- <p>
- This demonstration shows how you can avoid the autoReinitialise overhead (as seen in the
- <a href="image.html">first image demo</a>) by fixing the width and height of the images inside your
- scroll pane.
- </p>
- <p>
- As you can see from the sourcecode for this page, you can set the width and height either through CSS or
- using width and height attributes on the image itself.
- </p>
- <div class="scroll-pane">
- <img src="http://farm5.static.flickr.com/4068/4502147230_61d4f18460_z.jpg" class="portrait" alt="Touring" />
- <img src="http://farm5.static.flickr.com/4065/4501530717_8a7f9c8ce8_z.jpg" class="landscape" alt="Avalauncher" />
- <img src="http://farm5.static.flickr.com/4034/4502145190_d7ae16127b_z.jpg" class="landscape" alt="Rockies" />
- <img src="http://farm5.static.flickr.com/4003/4409969018_16cc9d8bf1_z.jpg" width="640" height="480" alt="Paper cranes" />
- <img src="http://farm5.static.flickr.com/4064/4407630907_1430d32efa_z.jpg" width="480" height="640" alt="Icecream">
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/index.html b/libs/bower_components/jScrollPane/index.html
deleted file mode 100644
index be39c07e46..0000000000
--- a/libs/bower_components/jScrollPane/index.html
+++ /dev/null
@@ -1,319 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - cross browser styleable scrollbars with jQuery and CSS</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="#">Home</a></li>
- <li><a href="#examples">Examples</a></li>
- <li><a href="#themes">Themes</a></li>
- <li><a href="#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="#support">Support</a></li>
- <li><a href="#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - cross browser styleable scrollbars with jQuery and CSS</h1>
- <p class="intro">
- jScrollPane is a cross-browser <a href="http://jquery.com">jQuery</a> plugin by
- <a href="http://www.kelvinluck.com">Kelvin Luck</a> which converts a browser's default scrollbars (on
- elements with a relevant overflow property) into an HTML structure which can be easily skinned with CSS.
- </p>
- <p>
- jScrollPane is designed to be flexible but very easy to use. After you have <a href="#download">
- downloaded</a> and <a href="#usage">included</a> the relevant files
- in the head of your document all you need to to is call one javascript function to initialise the
- scrollpane. You can style the resultant scrollbars easily with CSS or choose from the existing
- <a href="#themes">themes</a>. There are a number of different <a href="#examples">examples</a> showcasing
- different features of jScrollPane and a number of ways for you to get <a href="#support">support</a>.
- </p>
-
- <h2 id="usage">How to use</h2>
- <p>
- It is very simple to use jScrollPane. You will need to <a href="#download">download</a> the necessary
- files and place them on your server. Then you just need to include the relevant files in the &lt;head&gt;
- of your document:
- </p>
- <pre>&lt;!-- styles needed by jScrollPane --&gt;
-&lt;link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" /&gt;
-
-&lt;!-- latest jQuery direct from google's CDN --&gt;
-&lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"&gt;
-&lt;/script&gt;
-
-&lt;!-- the mousewheel plugin - optional to provide mousewheel support --&gt;
-&lt;script type="text/javascript" src="script/jquery.mousewheel.js"&gt;&lt;/script&gt;
-
-&lt;!-- the jScrollPane script --&gt;
-&lt;script type="text/javascript" src="script/jquery.jscrollpane.min.js"&gt;&lt;/script&gt;</pre>
- <p>
- Then you just need to initialise jScrollPane on document.ready (using a selector which will find the
- content you want to apply jScrollPane to):
- </p>
- <pre>$(function()
-{
- $('.scroll-pane').jScrollPane();
-});</pre>
- <p>
- There are plenty of different ways to use jScrollPane - either passing in different <a href="settings.html">
- settings</a> when you initialise it or by using the <a href="api.html">API</a>. Each of these different
- use cases is covered by an <a href="#examples">example</a> linked to from below.
- </p>
-
- <h2 id="download">Download</h2>
- <p>
- You can always find the latest code for jScrollPane on its <a href="http://github.com/vitch/jScrollPane">
- github</a> page. You can either check out this entire website (including all examples) via git, or you
- can use the handy github functionality to <a href="http://github.com/vitch/jScrollPane/archives/master">
- download a zip</a> of the repository.
- </p>
- <p>
- The particular files that you need are:
- </p>
- <ul class="link-list">
- <li>
- <a href="style/jquery.jscrollpane.css">jquery.jscrollpane.css</a> - the basic CSS styles that are
- needed for jScrollPane to work.
- </li>
- <li>
- <a href="http://www.jquery.com">The jQuery library</a> - although I recommend including this
- directly from a CDN like I do above and in all of the examples.
- </li>
- <li>
- <a href="script/jquery.mousewheel.js">jquery.mousewheel.js</a> - The
- <a href="http://github.com/brandonaaron/jquery-mousewheel/">jQuery mouseweel</a> plugin. This is
- optional but recommended, include it to allow people to scroll your content using their mouse wheel.
- </li>
- <li>
- <a href="script/mwheelIntent.js">mwheelIntent.js</a> - The
- <a href="http://www.protofunc.com/scripts/jquery/mwheelIntent/">mwheelIntent</a> plugin. This is
- totally optional but can increase the usability of the mousewheel in nested scroll areas.
- <a href="mwheel_intent.html">See demo</a>.
- </li>
- <li>
- <a href="script/jquery.jscrollpane.min.js">jquery.jscrollpane.min.js</a> - the actual javascript file
- for jScrollPane (you can also get the <a href="script/jquery.jscrollpane.js">unminified</a> version
- if yu want to see the sourcecode and read the comments).
- </li>
- </ul>
-
- <h2 id="examples">Simple examples/ tests</h2>
- <p>
- These examples show very basic functionality and exist so that I can test that any changes to
- jScrollPane work cross browser and don't cause any new problems. Note that these examples aren't meant
- to look pretty, they merely highlight different bits of functionaity which are available. If you want
- examples of jScrollPane looking good then check out the <a href="#themes">themes</a>.
- </p>
- <ul class="link-list">
- <li>
- <a href="basic.html">Demo</a> showing basic scrolling (horizontal, vertical and combined)
- </li>
- <li>
- <a href="arrows.html">Demo</a> showing basic scrolling (horizontal, vertical and combined) with
- arrow buttons
- </li>
- <li>
- <a href="focus.html">Demo</a> showing how the contents of the scrollpane is focused as you tab to it
- </li>
- <li>
- <a href="caps.html">Demo</a> showing how you can set "caps" and "gutters" to change the size and
- positioning of the scrollbar relative to the content it is scrolling
- </li>
- <li>
- <a href="drag_size.html">Demo</a> showing how you can restrict the minimum and maxium size of the
- drag part of the scrollbar
- </li>
- <li>
- <a href="arrow_hover.html">Demo</a> showing how the <a href="settings.html#arrowScrollOnHover">
- arrowScrollOnHover</a> option makes the arrow buttons automatically scroll the content when you
- hover over them
- </li>
- <li>
- <a href="arrow_positions.html">Demo</a> showing how the <a href="settings.html#verticalArrowPositions">
- verticalArrowPositions</a> and <a href="settings.html#horizontalArrowPositions">
- horizontalArrowPositions</a> options can change the position of the arrow buttons
- </li>
- <li>
- <a href="scroll_to.html">Demo</a> showing how you can use the <a href="api.html#scrollTo">scrollTo
- </a> and <a href="api.html#scrollBy">scrollBy</a> methods of the API
- </li>
- <li>
- <a href="scroll_to_animate.html">Demo</a> showing how you can use the <a href="api.html#scrollTo">
- scrollTo</a> and <a href="api.html#scrollBy">scrollBy</a> methods of the API along with the
- <a href="settings.html#animateScroll">animateScroll</a> which enables animation when scrolling
- </li>
- <li>
- <a href="anchors.html">Demo</a> showing how you can make internal links automatically scroll the
- scrollpane (and how <a href="anchors.html#para4">external links</a> can link directly into content
- within a jScrollPane)
- </li>
- <li>
- <a href="invisibles.html">Demo</a> showing that jScrollPane can work correctly on elements which are
- initially set to be invisible via CSS
- </li>
- <li>
- <a href="less_basic.html">Demo</a> showing vertical scrolling with multiple panes on the same page
- and adding dynamic content and then reinitialising one of the panes
- </li>
- <li>
- <a href="dynamic_content.html">Demo</a> showing how you can manually <a href="api.html#reinitialise">
- reinitialise</a> the scrollpane if you add dynamic content to it
- </li>
- <li>
- <a href="ajax.html">Demo</a> showing how you can change the content of your jScrollPane via an ajax
- call and can reinitialise the scrollpane once the new content has loaded
- </li>
- <li>
- <a href="auto_reinitialise.html">Demo</a> showing how jScrollPane can be set to automatically
- reinitialise itself on a timer via the <a href="settings.html#autoReinitialise">autoReinitialise</a>
- parameter
-
- </li>
- <li>
- <a href="image.html">Demo</a> showing how <a href="settings.html#autoReinitialise">autoReinitialise
- </a> can also be used so that content with images in it displays correctly in jScrollPane
- </li>
- <li>
- <a href="dynamic_width.html">Demo</a> showing how jScrollPane can be reinitialised when the width of
- it's container changes and will update to fill the available space
- </li>
- <li>
- <a href="dynamic_height.html">Demo</a> showing how jScrollPane can be reinitialised when the height
- of it's container changes and will update to fill the available space
- </li>
- <li>
- <a href="fullpage_scroll.html">Demo</a> showing how jScrollPane can be applied to an entire page
- so that the browser's default scrollbars for the page are replaced. This demo also shows that you
- can nest jScrollPanes and everything will still work correctly.
- </li>
- <li>
- <a href="iframe.html">Demo</a> showing how jScrollPane can be used to style the scrollbars in an
- iframe.
- </li>
- <li>
- <a href="scroll_on_left.html">Demo</a> showing how vertical scrollbars can also appear on the left
- hand side of content
- </li>
- <li>
- <a href="short.html">Demo</a> showing that no scrollbars are created when the content is too short
- to scroll
- </li>
- <li>
- <a href="events.html">Demo</a> showing the events that are dispatched by an element you apply
- jScrollPane to.
- </li>
- <li>
- <a href="https://github.com/bodrovis/jscrollpane-rails/">jscrollpane-rails</a> makes integrating jScrollPane
- with Rails apps easier.
- </li>
- </ul>
-
- <h2 id="themes">Themes</h2>
- <p>
- You can style jScrollPane however you like using simple CSS. To give you some ideas, here are a variety
- of different themes which you are free to <a href="#download">download</a> and use or modify:
- </p>
- <ul>
- <li><a href="themes/lozenge/">Lozenge</a> - lozenge shaped sliders and small arrow buttons</li>
- </ul>
-
- <h2 id="support">Support</h2>
- <p>
- Before trying to get support please check if your problem is a <a href="known_issues.html">known
- issue</a> or if it is mentioned in the <a href="faqs.html">FAQs</a>. If your issue is a new one and
- you can't find any information about it then you can try one of the following two options:
- </p>
- <ul>
- <li>
- <p>
- Using the <a href="http://stackoverflow.com">StackOverflow</a> site. This is probably the
- place you are most likely to get a quick answer as many Javascript experts spend time on
- the site. It also provides niceties like pretty formatting of posted sourcecode.
- </p>
- <p>
- If you ask a question on the site make sure you add the tags "jquery" and "jscrollpane" as
- I will be monitoring these tags to try to provide support.
- </p>
- </li>
- <li>
- <p>
- Through the <a href="http://groups.google.com/group/jscrollpane/">jScrollPane google group
- </a> - sign up and then you can start a discussion (either by email or through the web
- interface).
- </p>
- <p>
- Please remember to use the search field at the top of the group's homepage to search the
- archive to find out if your question has been answered before.
- </p>
- </li>
- </ul>
- <p>
- If you have contacted support and established that your problem is definitely a bug then you can
- <a href="http://github.com/vitch/jScrollPane/issues">raise an issue</a> on the project's github
- site.
- </p>
-
- <h2 id="history">History</h2>
- <p>
- jScrollPane was originally developed in December 2006. Since then it has been constantly updated to
- fix bugs and add new features. The change history since November 2008 is available in the jScrollPane
- <a href="http://github.com/vitch/jScrollPane">git repository</a>. In August 2010 a major rewrite was
- undertaken, starting from a blank canvas and adding long awaited features like horizontal scrolling
- and automatic reinitialisation. If you want to find old versions of jScrollPane then you can check out
- the <a href="changelog.html">changelog</a>.
- </p>
-
- <h2 id="credits">Credits</h2>
- <p>
- Thanks to <a href="http://www.hoppermagic.com">Hoppermagic</a> for creating the jScrollPane logo! And
- thanks to Mark Reed, Philip Leff and <a href="http://www.erwinodendaal.com">Erwin Odendaal</a> for
- sponsoring the development of v2 of this plugin (particularly to enable horizontal scrolling).
- </p>
-
- <h2 id="donate">Donate</h2>
- <p>
- jScrollPane is a personal project that is open source for anybody to use as they want to. If you (and
- your clients!) like jScrollPane then please consider donating to it's ongoing development. You can do
- so via Pledgie or Paypal using the images below:
- </p>
- <p style="margin-top: 0; float: left;">
- <a href='http://www.pledgie.com/campaigns/12524'>
- <img alt='Click here to lend your support to: jScrollPane and make a donation at www.pledgie.com !'
- src='http://www.pledgie.com/campaigns/12524.png?skin_name=chrome' border='0'
- />
- </a>
- </p>
- <form method="post" action="https://www.paypal.com/cgi-bin/webscr" style="margin: 15px 0 0 20px;">
- <input type="hidden" value="_donations" name="cmd">
- <input type="hidden" value="V2UG6D75CZ4SS" name="business">
- <input type="hidden" value="GB" name="lc">
- <input type="hidden" value="jScrollPane" name="item_name">
- <input type="hidden" value="GBP" name="currency_code">
- <input type="hidden" value="PP-DonationsBF:btn_donate_SM.gif:NonHosted" name="bn">
- <input type="image" alt="" name="submit" style="border: 0pt none;" src="https://www.paypal.com/en_GB/i/btn/btn_donate_SM.gif">
- <img height="1" border="0" width="1" src="https://www.paypal.com/en_GB/i/scr/pixel.gif" style="padding: 0pt;" alt="">
- </form>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/invisibles.html b/libs/bower_components/jScrollPane/invisibles.html
deleted file mode 100644
index 33eabf6e00..0000000000
--- a/libs/bower_components/jScrollPane/invisibles.html
+++ /dev/null
@@ -1,523 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane demo showing jScrollPane working on elements which are initially display:none</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- ul.tabs
- {
- margin: 0 0 .5em;
- padding: 0;
- overflow: hidden;
- }
- ul.tabs li
- {
- list-style: none;
- float: left;
- margin: 0 1em 0 0;
- }
- ul.tabs li a
- {
- color: #fff;
- padding: 3px 5px;
- display: block;
- float: left;
- background: #8B8B9F;
-
- -moz-border-radius: 3px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- }
- ul.tabs li a.active
- {
- background: #50506D;
- }
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- // Create the "tabs"
- $('.tabs').each(
- function()
- {
- var currentTab, ul = $(this);
- $(this).find('a').each(
- function(i)
- {
- var a = $(this).bind(
- 'click',
- function()
- {
- if (currentTab) {
- ul.find('a.active').removeClass('active');
- $(currentTab).hide();
- }
- currentTab = $(this).addClass('active')
- .attr('href');
- $(currentTab).show().jScrollPane();
- return false;
- }
- );
- $(a.attr('href')).hide();
- }
- );
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - demo showing jScrollPane working on elements which are initially display: none</h1>
- <p>
- This demo shows that jScrollPane works correctly on elements who are initially set to <strong>display:
- none</strong>. When the element is first shown you simply have to (re)initialise the scrollpane (or you
- could even use <a href="settings.html#autoReinitialise">autoReinitialise</a> if you like) and its width
- and height will be calculated correctly.
- </p>
- <p>
- Note that the majority of the custom javascript and CSS on this page is just to create basic "tabs"
- functionality where you can switch between different content on the page by clicking links. You don't
- need to do anything special for jScrollPane to work in this situation.
- </p>
-
- <h2>Vertical only</h2>
- <ul class="tabs">
- <li><a href="#pane1">Pane 1</a></li>
- <li><a href="#pane2">Pane 2</a></li>
- <li><a href="#pane3">Pane 3</a></li>
- </ul>
- <div class="scroll-pane" id="pane1">
- <p>
- <strong>ONE</strong> amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <div class="scroll-pane" id="pane2">
- <p>
- <strong>TWO</strong> amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <div class="scroll-pane" id="pane3">
- <p>
- <strong>THREE</strong> amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <ul class="tabs">
- <li><a href="#pane4">Pane 4</a></li>
- <li><a href="#pane5">Pane 5</a></li>
- <li><a href="#pane6">Pane 6</a></li>
- </ul>
- <div class="scroll-pane horizontal-only" id="pane4">
- <p style="width: 1000px;">
- <strong>FOUR</strong>, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <div class="scroll-pane horizontal-only" id="pane5">
- <p style="width: 1000px;">
- <strong>FIVE</strong>, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <div class="scroll-pane horizontal-only" id="pane6">
- <p style="width: 1000px;">
- <strong>SIX</strong>, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <ul class="tabs">
- <li><a href="#pane7">Pane 7</a></li>
- <li><a href="#pane8">Pane 8</a></li>
- <li><a href="#pane9">Pane 9</a></li>
- </ul>
- <div class="scroll-pane" id="pane7">
- <p style="width: 1000px">
- <strong>SEVEN</strong>, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <div class="scroll-pane" id="pane8">
- <p style="width: 1000px">
- <strong>EIGHT</strong>, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <div class="scroll-pane" id="pane9">
- <p style="width: 1000px">
- <strong>NINE</strong>, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/11/after.html b/libs/bower_components/jScrollPane/issues/11/after.html
deleted file mode 100644
index 775019be18..0000000000
--- a/libs/bower_components/jScrollPane/issues/11/after.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<meta name="verify-v1" content="ven67p9fXoMQpbw1icSXo8l+I5Z+upY90LnIqaPDgKo=" />
-<meta name="description" content="Tinyfish is the smallest progressive rock band in the world, self-taught, self-financed, and self-abusing - no, wait..." />
-<meta name="keywords" content="Tinyfish, Pink Floyd, Porcupine Tree, progrock, progressive rock, prog rock, prog, Marillion, King Crimson, Rush, The Big Red Spark, Curious Things" />
-<link href="brs_main.css" rel="stylesheet" type="text/css"/>
-<link type="text/css" href="../../style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-<title>latest news</title>
-<!-- compliance patch for microsoft browsers -->
-<!--[if lt IE 8]><script src="../__js/IE8.js" type="text/javascript"></script><![endif]-->
-<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
-<script type="text/javascript" src="../../script/jquery.mousewheel.js"></script>
-
-<script type="text/javascript" src="../../script/jquery.jscrollpane.js"></script>
-<script language="javascript" type="text/javascript">
-$(function()
-{
- $("#content").jScrollPane({
- showArrows: true
- });
-});
-</script>
-</head>
-<body class="nopage">
-<div id="content">
-<h1>news</h1>
-<p>After three years of toil, The new Tinyfish album, The Big Red Spark,
- is finally finished, and to celebrate, you'll be able to join us at The Luminaire
- in Kilburn for a very special gig to launch the album on an unsuspecting world.</p>
-<p>Although by this point, some people may already have suspected.</p>
-<p>Support will be provided by the excellent Dec Burke and his new band,
- Destroy All Monsters</p>
-<p>When: Friday, 10th September<br />
-
- Where: The Luminaire (click for map)<br />
- How much: &pound;10 in advance (&pound;8 CRS members advance) or &pound;12 on the door.<br />
- Doors open at 7:30.</p>
-<p>Tickets: www.linktoticket website.co.uk</p>
-</div>
-
-</body>
-
-</html>
diff --git a/libs/bower_components/jScrollPane/issues/11/before.html b/libs/bower_components/jScrollPane/issues/11/before.html
deleted file mode 100644
index ffcfa4ba8c..0000000000
--- a/libs/bower_components/jScrollPane/issues/11/before.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<meta name="verify-v1" content="ven67p9fXoMQpbw1icSXo8l+I5Z+upY90LnIqaPDgKo=" />
-<meta name="description" content="Tinyfish is the smallest progressive rock band in the world, self-taught, self-financed, and self-abusing - no, wait..." />
-<meta name="keywords" content="Tinyfish, Pink Floyd, Porcupine Tree, progrock, progressive rock, prog rock, prog, Marillion, King Crimson, Rush, The Big Red Spark, Curious Things" />
-<link href="brs_main.css" rel="stylesheet" type="text/css"/>
-<link type="text/css" href="jscrollpane-2b3.css" rel="stylesheet" media="all" />
-<title>latest news</title>
-<!-- compliance patch for microsoft browsers -->
-<!--[if lt IE 8]><script src="../__js/IE8.js" type="text/javascript"></script><![endif]-->
-<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
-<script type="text/javascript" src="jquery.mousewheel.js"></script>
-
-<script type="text/javascript" src="jscrollpane-2b3.js"></script>
-<script language="javascript" type="text/javascript">
-$(function()
-{
- $("#content").jScrollPane({
- showArrows: true
- });
-});
-</script>
-</head>
-<body class="nopage">
-<div id="content">
-<h1>news</h1>
-<p>After three years of toil, The new Tinyfish album, The Big Red Spark,
- is finally finished, and to celebrate, you'll be able to join us at The Luminaire
- in Kilburn for a very special gig to launch the album on an unsuspecting world.</p>
-<p>Although by this point, some people may already have suspected.</p>
-<p>Support will be provided by the excellent Dec Burke and his new band,
- Destroy All Monsters</p>
-<p>When: Friday, 10th September<br />
-
- Where: The Luminaire (click for map)<br />
- How much: &pound;10 in advance (&pound;8 CRS members advance) or &pound;12 on the door.<br />
- Doors open at 7:30.</p>
-<p>Tickets: www.linktoticket website.co.uk</p>
-</div>
-
-</body>
-
-</html>
diff --git a/libs/bower_components/jScrollPane/issues/11/brs_main.css b/libs/bower_components/jScrollPane/issues/11/brs_main.css
deleted file mode 100644
index d4bf825511..0000000000
--- a/libs/bower_components/jScrollPane/issues/11/brs_main.css
+++ /dev/null
@@ -1,301 +0,0 @@
-@charset "utf-8";
-/* CSS Document */
-@font-face {
- font-family: 'HelveticaNeueThin';
- src: url('helveticaneue-thin-webfont.eot');
- src: local(''), url('helveticaneue-thin-webfont.woff') format('woff'), url('helveticaneue-thin-webfont.ttf') format('truetype'), url('helveticaneue-thin-webfont.svg#webfont2SG3yTkB') format('svg');
- font-weight: normal;
- font-style: normal;
- font-variant: normal;
-}
-
-body {
- font-family: 'HelveticaNeueThin',Helvetica,Arial,sans-serif;
- font-weight: normal;
- font-style: normal;
- line-height: normal;
- font-size-adjust: 0.51;
- margin: 0px;
- color: #fff;
- background-color: #000;
- overflow:hidden;
-}
-
-P, A {
- font-size: 1em;
- line-height: 1.2em;
-}
-
-P {
- text-align: justify;
- margin-bottom: 1.0em;
-}
-
-a:active {color:#e0262f; text-decoration: none;} /* selected link */
-a:visited {color:#c62128; text-decoration: none;} /* visited link */
-a:link {color:#d2232a; text-decoration: none;} /* unvisited link */
-a:hover {color:#df262e; text-decoration: underline;} /* mouse over link */
-
-LI LI, LI LI A, TD, TD P, BLOCKQUOTE P {
- font-size: 1em;
- line-height: 1.2em;
-}
-
-TABLE {
- border: none;
-}
-
-TD {
- vertical-align: top;
- padding: 0px;
-}
-
-A {
- outline: none;
-}
-
-A IMG {
- border: none;
-}
-
-object { outline:none; }
-
-.red {
- color: #d2232a;
-}
-
-STRONG {
- color: #d2232a;
- font-weight: bold;
-}
-
-h1,h2,h3,h4,h5 {
- color: #d2232a;
-}
-
-h1 {
- font-size: 1.6em;
- font-weight: normal;
- font-style: normal;
- margin-top: 0.5em;
- margin-bottom: 0.5em;
-}
-
-h2 {
- font-size: 1.3em;
- font-weight: normal;
- font-style: italic;
- margin-top: 0.8em;
- margin-bottom: 0px;
-}
-
-h5 {
- font-size: 0.8em;
- margin: 0.5em 0px 0px 0px;
-}
-
-hr {
- color: #ff0000;
-}
-
-/* ----------------- begin supersize --------------------- */
-
-#loading {
- position: absolute;
- top: 49.5%;
- left: 49.5%;
- z-index: 5;
- width: 24px;
- height: 24px;
- text-indent: -999em;
- background-image: url('../__imgs/furn/loading.gif');
-}
-
-#supersize {
- position:fixed;
-}
-
-#supersize img, #supersize a {
- height:100%;
- width:100%;
- position:absolute;
- z-index: 0;
-}
-
-#supersize img {
- image-rendering: optimizeQuality; /* Firefox 3.6+; default behavior is identical, no need to specify */
- -ms-interpolation-mode: bicubic; /* Internet Explorer 7.0; default in IE8+ */
-}
-
-#supersize .prevslide, #supersize .prevslide img {
- z-index: 1;
-}
-
-#supersize .activeslide, #supersize .activeslide img {
- z-index: 2;
-}
-
-/* ------------------ end supersize ---------------------- */
-
-/* ------------------- begin header ---------------------- */
-
-#header {
- position: absolute;
- top: 15px;
- width: 100%;
- margin: 0px auto;
- z-index: 4;
- text-align: center;
-}
-
-#header p {
- text-align: center;
- margin-top: 0.5em;
- }
-
-/* -------------------- end header ----------------------- */
-
-/* ------------------- begin content --------------------- */
-
-#content {
- z-index: 3;
- background-color: #000;
- background-color: rgba(0,0,0,0.9);
- position: absolute;
- left: 0px;
- bottom: 17%;
- height: 62%;
- width: 45%;
- border: 1px solid #555;
- border-left: 0px;
- padding: 0px;
- padding-left: 30px;
- padding-right: 20px;
- overflow: auto;
-}
-
-.frontpage #content {
- visibility: hidden;
-}
-
-.gallerypage #content {
- border: none;
- width: 100%;
- height: 33em;
- bottom: 15%;
- padding: 0px;
- margin: 0px;
-}
-
-.gallerypage #content p {
- text-align: center;
-}
-
-.videopage #content {
- border: none;
- width: 100%;
- height: 65%;
- bottom: 15%;
- padding: 0px;
- margin: 0px;
-}
-
-.videopage #content p {
- text-align: center;
-}
-
-
-/* -------------------- end content ---------------------- */
-
-/* ----------------- begin navigation -------------------- */
-
-#navigate {
- position: absolute;
- height: 4em;
- width: 100%;
- padding: 0px;
- margin: 0px auto;
- bottom: 5%;
- z-index: 3;
- background-color: #000;
- background-color: rgba(0,0,0,0.9);
- border: 1px solid #555;
- border-left: 0px;
- border-right: 0px;
-}
-
-#nav, #nav ul {
- margin: 0px;
- padding: 0px;
- list-style-type: none;
- list-style-position: outside;
- position: relative;
- line-height: 1.6em;
-}
-
-#nav {
- padding: 0.4em;
-}
-
-#nav a {
- display: block;
- height: 1.6em;
- padding: 0px 10px;
- text-decoration:none;
- line-height: 1.6em;
- background-color: #000;
- background-color: rgba(0,0,0,0.9); /* bug in Opera!!! */
-}
-
-#nav a:link, #nav a:active, #nav a:visited {
- color: #fff;
-}
-
-#nav a:hover {
- color: #d2232a;
-}
-
-#nav li {
- float: left;
- font-size: 1em;
- line-height: 1.6em;
-}
-
-#nav ul {
- position:absolute;
- display: none;
-}
-
-#nav ul li a {
- float: left;
- font-size: 1em;
- line-height: 1.6em;
-}
-
-#nav li:hover ul ul, #nav li:hover ul ul ul, #nav li:hover ul ul ul ul {
- display: none;
-}
-
-#nav li:hover ul, #nav li li:hover ul, #nav li li li:hover ul, #nav li li li li:hover ul {
- display: block;
- height: 1.6em;
-}
-
-/* ------------------ end navigation --------------------- */
-
-/* ------------------ begin viewcart --------------------- */
-
-#viewcart {
- z-index: 4;
- background-color: #000;
- background-color: rgba(0,0,0,0.9);
- position: absolute;
- right: 10px;
- bottom: 5.5%;
- height: 51px;
- width: 130px;
- padding: 0px;
- overflow: hidden;
-}
-
-/* ------------------- end viewcart ---------------------- */
diff --git a/libs/bower_components/jScrollPane/issues/11/index.html b/libs/bower_components/jScrollPane/issues/11/index.html
deleted file mode 100644
index e42743a385..0000000000
--- a/libs/bower_components/jScrollPane/issues/11/index.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - issue 11</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="../../style/demo.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="../../script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="../../image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="../../index.html">Home</a></li>
- <li><a href="../../index.html#examples">Examples</a></li>
- <li><a href="../../index.html#themes">Themes</a></li>
- <li><a href="../../index.html#usage">How to use</a></li>
- <li><a href="../../faqs.html">FAQs</a></li>
- <li><a href="../../known_issues.html">Known issues</a></li>
- <li><a href="../../index.html#support">Support</a></li>
- <li><a href="../../index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - issue 11</h1>
- <p>
- This page demonstrates the bug described in <a href="http://github.com/vitch/jScrollPane/issues#issue/11">
- issue 11</a> as reported (with nice striped down test cases) by
- <a href="http://groups.google.com/group/jscrollpane/browse_thread/thread/09d5097b536d7064">TinyFish</a>.
- </p>
- <ul class="link-list">
- <li>
- <a href="before.html">Before</a> - showing the bug as it appears in the version of jScrollPane which
- was current when it was reported.
- </li>
- <li>
- <a href="native.html">Native</a> - showing how the page looks with native scrollbars (i.e. if
- jScrollPane isn't initialised).
- </li>
- <li>
- <a href="after.html">After</a> - showing the page which was displaying the bug with the latest
- version of jScrollPane.
- </li>
- </ul>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/11/jquery.mousewheel.js b/libs/bower_components/jScrollPane/issues/11/jquery.mousewheel.js
deleted file mode 100644
index 27ed2f102f..0000000000
--- a/libs/bower_components/jScrollPane/issues/11/jquery.mousewheel.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net)
- * Licensed under the MIT License (LICENSE.txt).
- *
- * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
- * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
- * Thanks to: Seamus Leahy for adding deltaX and deltaY
- *
- * Version: 3.0.3
- *
- * Requires: 1.2.2+
- */
-
-(function($) {
-
-var types = ['DOMMouseScroll', 'mousewheel'];
-
-$.event.special.mousewheel = {
- setup: function() {
- if ( this.addEventListener ) {
- for ( var i=types.length; i; ) {
- this.addEventListener( types[--i], handler, false );
- }
- } else {
- this.onmousewheel = handler;
- }
- },
-
- teardown: function() {
- if ( this.removeEventListener ) {
- for ( var i=types.length; i; ) {
- this.removeEventListener( types[--i], handler, false );
- }
- } else {
- this.onmousewheel = null;
- }
- }
-};
-
-$.fn.extend({
- mousewheel: function(fn) {
- return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
- },
-
- unmousewheel: function(fn) {
- return this.unbind("mousewheel", fn);
- }
-});
-
-
-function handler(event) {
- var orgEvent = event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0;
-
- event = $.event.fix(event || window.event);
- event.type = "mousewheel";
-
- // Old school scrollwheel delta
- if ( event.wheelDelta ) { delta = event.wheelDelta/120; }
- if ( event.detail ) { delta = -event.detail/3; }
-
- // New school multidimensional scroll (touchpads) deltas
- deltaY = delta;
-
- // Gecko
- if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
- deltaY = 0;
- deltaX = -1*delta;
- }
-
- // Webkit
- if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; }
- if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; }
-
- // Add event and delta to the front of the arguments
- args.unshift(event, delta, deltaX, deltaY);
-
- return $.event.handle.apply(this, args);
-}
-
-})(jQuery); \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/11/jscrollpane-2b3.css b/libs/bower_components/jScrollPane/issues/11/jscrollpane-2b3.css
deleted file mode 100644
index 4b91ece526..0000000000
--- a/libs/bower_components/jScrollPane/issues/11/jscrollpane-2b3.css
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * CSS Styles that are needed by jScrollPane for it to operate correctly.
- *
- * Include this stylesheet in your site or copy and paste the styles below into your stylesheet - jScrollPane
- * may not operate correctly without them.
- */
-
-.jspContainer
-{
- overflow: hidden;
- position: relative;
-}
-
-.jspPane
-{
- position: absolute;
-}
-
-.jspVerticalBar
-{
- position: absolute;
- top: 0;
- right: 0;
- width: 16px;
- height: 100%;
- background: red;
-}
-
-.jspHorizontalBar
-{
- position: absolute;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 16px;
- background: red;
-}
-
-.jspVerticalBar *,
-.jspHorizontalBar *
-{
- margin: 0;
- padding: 0;
-}
-
-.jspCap
-{
- display: none;
-}
-
-.jspHorizontalBar .jspCap
-{
- float: left;
-}
-
-.jspTrack
-{
- background: #000 url(../__imgs/furn/track.gif) repeat-y center;
- position: relative;
-}
-
-.jspDrag
-{
- background: #666;
- border: solid #aaa 2px;
- position: relative;
- top: 0;
- left: 0;
- cursor: pointer;
-}
-
-.jspHorizontalBar .jspTrack,
-.jspHorizontalBar .jspDrag
-{
- float: left;
- height: 100%;
-}
-
-.jspArrow
-{
- background-color: rgba(0,0,0,0.9);
- text-indent: -20000px;
- display: block;
- cursor: pointer;
-}
-
-.jspArrowUp
-{
- background-image: url("../__imgs/furn/arrow_up.gif");
-}
-
-.jspArrowDown
-{
- background-image: url("../__imgs/furn/arrow_down.gif");
-}
-
-.jspArrow.jspDisabled
-{
- cursor: default;
- background: #80808d;
-}
-
-.jspArrowUp.jspDisabled
-{
- cursor: default;
- background-image: url("../__imgs/furn/arrow_up.gif");
-}
-
-.jspArrowDown.jspDisabled
-{
- cursor: default;
- background-image: url("../__imgs/furn/arrow_down.gif");
-}
-
-.jspVerticalBar .jspArrow
-{
- height: 16px;
-}
-
-.jspHorizontalBar .jspArrow
-{
- width: 16px;
- float: left;
- height: 100%;
-}
-
-.jspVerticalBar .jspArrow:focus
-{
- outline: none;
-}
-
-.jspCorner
-{
- background: #eeeef4;
- float: left;
- height: 100%;
-}
-
-/* Yuk! CSS Hack for IE6 3 pixel bug :( */
-* html .jspCorner
-{
- margin: 0 -3px 0 0;
-} \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/11/jscrollpane-2b3.js b/libs/bower_components/jScrollPane/issues/11/jscrollpane-2b3.js
deleted file mode 100644
index b87f97e107..0000000000
--- a/libs/bower_components/jScrollPane/issues/11/jscrollpane-2b3.js
+++ /dev/null
@@ -1,1063 +0,0 @@
-/*!
- * jScrollPane - v2.0.0beta3 - 2010-08-27
- * http://jscrollpane.kelvinluck.com/
- *
- * Copyright (c) 2010 Kelvin Luck
- * Dual licensed under the MIT or GPL licenses.
- */
-
-// Script: jScrollPane - cross browser customisable scrollbars
-//
-// *Version: 2.0.0beta3, Last updated: 2010-08-27*
-//
-// Project Home - http://jscrollpane.kelvinluck.com/
-// GitHub - http://github.com/vitch/jScrollPane
-// Source - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.js
-// (Minified) - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.min.js
-//
-// About: License
-//
-// Copyright (c) 2010 Kelvin Luck
-// Dual licensed under the MIT or GPL Version 2 licenses.
-// http://jscrollpane.kelvinluck.com/MIT-LICENSE.txt
-// http://jscrollpane.kelvinluck.com/GPL-LICENSE.txt
-//
-// About: Examples
-//
-// All examples and demos are available through the jScrollPane example site at:
-// http://jscrollpane.kelvinluck.com/
-//
-// About: Support and Testing
-//
-// This plugin is tested on the browsers below and has been found to work reliably on them. If you run
-// into a problem on one of the supported browsers then please visit the support section on the jScrollPane
-// website (http://jscrollpane.kelvinluck.com/) for more information on getting support. You are also
-// welcome to fork the project on GitHub if you can contribute a fix for a given issue.
-//
-// jQuery Versions - 1.4.2
-// Browsers Tested - Firefox 3.6.8, Safari 5, Opera 10.6, Chrome 5.0, IE 6, 7, 8
-//
-// About: Release History
-//
-// 2.0.0beta3 - (2010-08-27) Horizontal mousewheel, mwheelIntent, keyboard support, bug fixes
-// 2.0.0beta2 - (2010-08-21) Bug fixes
-// 2.0.0beta1 - (2010-08-17) Rewrite to follow modern best practices and enable horizontal scrolling, initially hidden
-// elements and dynamically sized elements.
-// 1.x - (2006-12-31 - 2010-07-31) Initial version, hosted at googlecode, deprecated
-
-(function($,window,undefined){
-
- $.fn.jScrollPane = function(settings)
- {
- // JScrollPane "class" - public methods are available through $('selector').data('jsp')
- function JScrollPane(elem, s)
- {
-
- var settings, jsp = this, pane, paneWidth, paneHeight, container, contentWidth, contentHeight,
- percentInViewH, percentInViewV, isScrollableV, isScrollableH, verticalDrag, dragMaxY,
- verticalDragPosition, horizontalDrag, dragMaxX, horizontalDragPosition,
- verticalBar, verticalTrack, scrollbarWidth, verticalTrackHeight, verticalDragHeight, arrowUp, arrowDown,
- horizontalBar, horizontalTrack, horizontalTrackWidth, horizontalDragWidth, arrowLeft, arrowRight,
- reinitialiseInterval, originalPadding, originalPaddingTotalWidth, previousPaneWidth,
- wasAtTop = true, wasAtLeft = true, wasAtBottom = false, wasAtRight = false,
- mwEvent = $.fn.mwheelIntent ? 'mwheelIntent.jsp' : 'mousewheel.jsp';
-
- originalPadding = elem.css('paddingTop') + ' ' +
- elem.css('paddingRight') + ' ' +
- elem.css('paddingBottom') + ' ' +
- elem.css('paddingLeft');
- originalPaddingTotalWidth = (parseInt(elem.css('paddingLeft')) || 0) +
- (parseInt(elem.css('paddingRight')) || 0);
-
- initialise(s);
-
- function initialise(s)
- {
-
- var clonedElem, tempWrapper, /*firstChild, lastChild, */isMaintainingPositon, lastContentX, lastContentY,
- hasContainingSpaceChanged;
-
- settings = s;
-
- if (pane == undefined) {
-
- elem.css(
- {
- 'overflow': 'hidden',
- 'padding': 0
- }
- );
- // TODO: Deal with where width/ height is 0 as it probably means the element is hidden and we should
- // come back to it later and check once it is unhidden...
- paneWidth = elem.innerWidth() + originalPaddingTotalWidth;
- paneHeight = elem.innerHeight();
-
- elem.width(paneWidth);
-
- pane = $('<div class="jspPane" />').wrap(
- $('<div class="jspContainer" />')
- .css({
- 'width': paneWidth + 'px',
- 'height': paneHeight + 'px'
- }
- )
- );
-
- elem.wrapInner(pane.parent());
- // Need to get the vars after being added to the document, otherwise they reference weird
- // disconnected orphan elements...
- container = elem.find('>.jspContainer');
- pane = container.find('>.jspPane');
- pane.css('padding', originalPadding);
-
- /*
- // Move any margins from the first and last children up to the container so they can still
- // collapse with neighbouring elements as they would before jScrollPane
- firstChild = pane.find(':first-child');
- lastChild = pane.find(':last-child');
- elem.css(
- {
- 'margin-top': firstChild.css('margin-top'),
- 'margin-bottom': lastChild.css('margin-bottom')
- }
- );
- firstChild.css('margin-top', 0);
- lastChild.css('margin-bottom', 0);
- */
- } else {
-
- elem.css('width', null);
-
- hasContainingSpaceChanged = elem.outerWidth() + originalPaddingTotalWidth != paneWidth || elem.outerHeight() != paneHeight;
-
- if (hasContainingSpaceChanged) {
- paneWidth = elem.innerWidth() + originalPaddingTotalWidth;
- paneHeight = elem.innerHeight();
- container.css({
- 'width': paneWidth + 'px',
- 'height': paneHeight + 'px'
- });
- }
-
- previousPaneWidth = pane.innerWidth();
-
- if (!hasContainingSpaceChanged && pane.outerWidth() == contentWidth && pane.outerHeight() == contentHeight) {
- // Nothing has changed since we last initialised
- if (isScrollableH || isScrollableV) { // If we had already set a width then re-set it
- pane.css('width', previousPaneWidth + 'px');
- elem.css('width', (previousPaneWidth + originalPaddingTotalWidth) + 'px');
- }
- // Then abort...
- return;
- }
-
- pane.css('width', null);
- elem.css('width', (paneWidth + originalPaddingTotalWidth) + 'px');
-
- container.find('>.jspVerticalBar,>.jspHorizontalBar').remove().end();
- }
-
- // Unfortunately it isn't that easy to find out the width of the element as it will always report the
- // width as allowed by its container, regardless of overflow settings.
- // A cunning workaround is to clone the element, set its position to absolute and place it in a narrow
- // container. Now it will push outwards to its maxium real width...
- clonedElem = pane.clone().css('position', 'absolute');
- tempWrapper = $('<div style="width:1px; position: relative;" />').append(clonedElem);
- $('body').append(tempWrapper);
- contentWidth = Math.max(pane.outerWidth(), clonedElem.outerWidth());
- tempWrapper.remove();
-
- contentHeight = pane.outerHeight(true);
- /*alert(contentHeight); */
- percentInViewH = contentWidth / paneWidth;
- percentInViewV = contentHeight / paneHeight;
- isScrollableV = percentInViewV > 1;
-
- isScrollableH = percentInViewH > 1;
-
- //console.log(paneWidth, paneHeight, contentWidth, contentHeight, percentInViewH, percentInViewV, isScrollableH, isScrollableV);
-
- if (!(isScrollableH || isScrollableV)) {
- elem.removeClass('jspScrollable');
- pane.css({
- 'top': 0,
- 'width': container.width() + 'px'
- });
- removeMousewheel();
- removeFocusHandler();
- removeKeyboardNav();
- unhijackInternalLinks();
- } else {
- elem.addClass('jspScrollable');
-
- isMaintainingPositon = settings.maintainPosition && (verticalDragPosition || horizontalDragPosition);
- if (isMaintainingPositon) {
- lastContentX = contentPositionX();
- lastContentY = contentPositionY();
- }
-
- initialiseVerticalScroll();
- initialiseHorizontalScroll();
- resizeScrollbars();
-
- if (isMaintainingPositon) {
- scrollToX(lastContentX);
- scrollToY(lastContentY);
- }
-
- initFocusHandler();
- initMousewheel();
- if (settings.enableKeyboardNavigation) {
- initKeyboardNav();
- }
-
- observeHash();
- if (settings.hijackInternalLinks) {
- hijackInternalLinks();
- }
- }
-
- if (settings.autoReinitialise && !reinitialiseInterval) {
- reinitialiseInterval = setInterval(
- function()
- {
- initialise(settings);
- },
- settings.autoReinitialiseDelay
- );
- } else if (!settings.autoReinitialise && reinitialiseInterval) {
- clearInterval(reinitialiseInterval)
- }
-
- elem.trigger('jsp-initialised', [isScrollableH || isScrollableV]);
- }
-
- function initialiseVerticalScroll()
- {
- if (isScrollableV) {
-
- container.append(
- $('<div class="jspVerticalBar" />').append(
- $('<div class="jspCap jspCapTop" />'),
- $('<div class="jspTrack" />').append(
- $('<div class="jspDrag" />').append(
- $('<div class="jspDragTop" />'),
- $('<div class="jspDragBottom" />')
- )
- ),
- $('<div class="jspCap jspCapBottom" />')
- )
- );
-
- verticalBar = container.find('>.jspVerticalBar');
- verticalTrack = verticalBar.find('>.jspTrack');
- verticalDrag = verticalTrack.find('>.jspDrag');
-
- if (settings.showArrows) {
- arrowUp = $('<a class="jspArrow jspArrowUp" />').bind(
- 'mousedown.jsp', getArrowScroll(0, -1)
- ).bind('click.jsp', nil);
- arrowDown = $('<a class="jspArrow jspArrowDown" />').bind(
- 'mousedown.jsp', getArrowScroll(0, 1)
- ).bind('click.jsp', nil);
- if (settings.arrowScrollOnHover) {
- arrowUp.bind('mouseover.jsp', getArrowScroll(0, -1, arrowUp));
- arrowDown.bind('mouseover.jsp', getArrowScroll(0, 1, arrowDown));
- }
-
- appendArrows(verticalTrack, settings.verticalArrowPositions, arrowUp, arrowDown);
- }
-
- verticalTrackHeight = paneHeight;
- container.find('>.jspVerticalBar>.jspCap:visible,>.jspVerticalBar>.jspArrow').each(
- function()
- {
- verticalTrackHeight -= $(this).outerHeight();
- }
- );
-
-
- verticalDrag.hover(
- function()
- {
- verticalDrag.addClass('jspHover');
- },
- function()
- {
- verticalDrag.removeClass('jspHover');
- }
- ).bind(
- 'mousedown.jsp',
- function(e)
- {
- // Stop IE from allowing text selection
- $('html').bind('dragstart.jsp selectstart.jsp', function() { return false; });
-
- verticalDrag.addClass('jspActive');
-
- var startY = e.pageY - verticalDrag.position().top;
-
- $('html').bind(
- 'mousemove.jsp',
- function(e)
- {
- positionDragY(e.pageY - startY, false);
- }
- ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
- return false;
- }
- );
- sizeVerticalScrollbar();
- updateVerticalArrows();
- }
- }
-
- function sizeVerticalScrollbar()
- {
- verticalTrack.height(verticalTrackHeight + 'px');
- verticalDragPosition = 0;
- scrollbarWidth = settings.verticalGutter + verticalTrack.outerWidth();
-
- // Make the pane thinner to allow for the vertical scrollbar
- pane.width(paneWidth - scrollbarWidth - originalPaddingTotalWidth);
-
- // Add margin to the left of the pane if scrollbars are on that side (to position
- // the scrollbar on the left or right set it's left or right property in CSS)
- if (verticalBar.position().left == 0) {
- pane.css('margin-left', scrollbarWidth + 'px');
- }
- }
-
- function initialiseHorizontalScroll()
- {
- if (isScrollableH) {
-
- container.append(
- $('<div class="jspHorizontalBar" />').append(
- $('<div class="jspCap jspCapLeft" />'),
- $('<div class="jspTrack" />').append(
- $('<div class="jspDrag" />').append(
- $('<div class="jspDragLeft" />'),
- $('<div class="jspDragRight" />')
- )
- ),
- $('<div class="jspCap jspCapRight" />')
- )
- );
-
- horizontalBar = container.find('>.jspHorizontalBar');
- horizontalTrack = horizontalBar.find('>.jspTrack');
- horizontalDrag = horizontalTrack.find('>.jspDrag');
-
- if (settings.showArrows) {
- arrowLeft = $('<a class="jspArrow jspArrowLeft" />').bind(
- 'mousedown.jsp', getArrowScroll(-1, 0)
- ).bind('click.jsp', nil);
- arrowRight = $('<a class="jspArrow jspArrowRight" />').bind(
- 'mousedown.jsp', getArrowScroll(1, 0)
- ).bind('click.jsp', nil);
- if (settings.arrowScrollOnHover) {
- arrowLeft.bind('mouseover.jsp', getArrowScroll(-1, 0, arrowLeft));
- arrowRight.bind('mouseover.jsp', getArrowScroll(1, 0, arrowRight));
- }
- appendArrows(horizontalTrack, settings.horizontalArrowPositions, arrowLeft, arrowRight);
- }
-
- horizontalDrag.hover(
- function()
- {
- horizontalDrag.addClass('jspHover');
- },
- function()
- {
- horizontalDrag.removeClass('jspHover');
- }
- ).bind(
- 'mousedown.jsp',
- function(e)
- {
- // Stop IE from allowing text selection
- $('html').bind('dragstart.jsp selectstart.jsp', function() { return false; });
-
- horizontalDrag.addClass('jspActive');
-
- var startX = e.pageX - horizontalDrag.position().left;
-
- $('html').bind(
- 'mousemove.jsp',
- function(e)
- {
- positionDragX(e.pageX - startX, false);
- }
- ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
- return false;
- }
- );
- horizontalTrackWidth = container.innerWidth();
- sizeHorizontalScrollbar();
- updateHorizontalArrows();
- } else {
- // no horizontal scroll
- }
- }
-
- function sizeHorizontalScrollbar()
- {
-
- container.find('>.jspHorizontalBar>.jspCap:visible,>.jspHorizontalBar>.jspArrow').each(
- function()
- {
- horizontalTrackWidth -= $(this).outerWidth();
- }
- );
-
- horizontalTrack.width(horizontalTrackWidth + 'px');
- horizontalDragPosition = 0;
- }
-
- function resizeScrollbars()
- {
- if (isScrollableH && isScrollableV) {
- var horizontalTrackHeight = horizontalTrack.outerHeight(),
- verticalTrackWidth = verticalTrack.outerWidth();
- verticalTrackHeight -= horizontalTrackHeight;
- $(horizontalBar).find('>.jspCap:visible,>.jspArrow').each(
- function()
- {
- horizontalTrackWidth += $(this).outerWidth();
- }
- );
- horizontalTrackWidth -= verticalTrackWidth;
- paneHeight -= verticalTrackWidth;
- paneWidth -= horizontalTrackHeight;
- horizontalTrack.parent().append(
- $('<div class="jspCorner" />').css('width', horizontalTrackHeight + 'px')
- );
- sizeVerticalScrollbar();
- sizeHorizontalScrollbar();
- }
- // reflow content
- if (isScrollableH) {
- pane.width((container.outerWidth() - originalPaddingTotalWidth) + 'px');
- }
- contentHeight = pane.outerHeight();
- percentInViewV = contentHeight / paneHeight;
-
- if (isScrollableH) {
- horizontalDragWidth = 1 / percentInViewH * horizontalTrackWidth;
- if (horizontalDragWidth > settings.horizontalDragMaxWidth) {
- horizontalDragWidth = settings.horizontalDragMaxWidth;
- } else if (horizontalDragWidth < settings.horizontalDragMinWidth) {
- horizontalDragWidth = settings.horizontalDragMinWidth;
- }
- horizontalDrag.width(horizontalDragWidth + 'px');
- dragMaxX = horizontalTrackWidth - horizontalDragWidth;
- }
- if (isScrollableV) {
- verticalDragHeight = 1 / percentInViewV * verticalTrackHeight;
- if (verticalDragHeight > settings.verticalDragMaxHeight) {
- verticalDragHeight = settings.verticalDragMaxHeight;
- } else if (verticalDragHeight < settings.verticalDragMinHeight) {
- verticalDragHeight = settings.verticalDragMinHeight;
- }
- verticalDrag.height(verticalDragHeight + 'px');
- dragMaxY = verticalTrackHeight - verticalDragHeight;
- }
- }
-
- function appendArrows(ele, p, a1, a2)
- {
- var p1 = "before", p2 = "after", aTemp;
-
- // Sniff for mac... Is there a better way to determine whether the arrows would naturally appear
- // at the top or the bottom of the bar?
- if (p == "os") {
- p = /Mac/.test(navigator.platform) ? "after" : "split";
- }
- if (p == p1) {
- p2 = p;
- } else if (p == p2) {
- p1 = p;
- aTemp = a1;
- a1 = a2;
- a2 = aTemp;
- }
-
- ele[p1](a1)[p2](a2);
- }
-
- function getArrowScroll(dirX, dirY, ele) {
- return function()
- {
- arrowScroll(dirX, dirY, this, ele);
- this.blur();
- return false;
- }
- }
-
- function arrowScroll(dirX, dirY, arrow, ele)
- {
- arrow = $(arrow).addClass('jspActive');
-
- var eve, doScroll = function()
- {
- if (dirX != 0) {
- positionDragX(horizontalDragPosition + dirX * settings.arrowButtonSpeed, false);
- }
- if (dirY != 0) {
- positionDragY(verticalDragPosition + dirY * settings.arrowButtonSpeed, false);
- }
- },
- scrollInt = setInterval(doScroll, settings.arrowRepeatFreq);
-
- doScroll();
-
- eve = ele == undefined ? 'mouseup.jsp' : 'mouseout.jsp';
- ele = ele || $('html');
- ele.bind(
- eve,
- function()
- {
- arrow.removeClass('jspActive');
- clearInterval(scrollInt);
- ele.unbind(eve);
- }
- );
- }
-
- function cancelDrag()
- {
- $('html').unbind('dragstart.jsp selectstart.jsp mousemove.jsp mouseup.jsp mouseleave.jsp');
-
- verticalDrag && verticalDrag.removeClass('jspActive');
- horizontalDrag && horizontalDrag.removeClass('jspActive');
- }
-
- function positionDragY(destY, animate)
- {
- if (!isScrollableV) {
- return;
- }
- if (destY < 0) {
- destY = 0;
- } else if (destY > dragMaxY) {
- destY = dragMaxY;
- }
-
- // can't just check if(animate) because false is a valid value that could be passed in...
- if (animate == undefined) {
- animate = settings.animateScroll;
- }
- if (animate) {
- jsp.animate(verticalDrag, 'top', destY, _positionDragY);
- } else {
- verticalDrag.css('top', destY);
- _positionDragY(destY);
- }
-
- }
-
- function _positionDragY(destY)
- {
- if (destY == undefined) {
- destY = verticalDrag.position().top;
- }
-
- container.scrollTop(0);
- verticalDragPosition = destY;
-
- var isAtTop = verticalDragPosition == 0,
- isAtBottom = verticalDragPosition == dragMaxY,
- percentScrolled = destY/ dragMaxY,
- destTop = -percentScrolled * (contentHeight - paneHeight);
-
- if (wasAtTop != isAtTop || wasAtBottom != isAtBottom) {
- wasAtTop = isAtTop;
- wasAtBottom = isAtBottom;
- elem.trigger('jsp-arrow-change', [wasAtTop, wasAtBottom, wasAtLeft, wasAtRight]);
- }
-
- updateVerticalArrows(isAtTop, isAtBottom);
- pane.css('top', destTop);
- elem.trigger('jsp-scroll-y', [-destTop, isAtTop, isAtBottom]);
- }
-
- function positionDragX(destX, animate)
- {
- if (!isScrollableH) {
- return;
- }
- if (destX < 0) {
- destX = 0;
- } else if (destX > dragMaxX) {
- destX = dragMaxX;
- }
-
- if (animate == undefined) {
- animate = settings.animateScroll;
- }
- if (animate) {
- jsp.animate(horizontalDrag, 'left', destX, _positionDragX);
- } else {
- horizontalDrag.css('left', destX);
- _positionDragX(destX);
- }
- }
-
- function _positionDragX(destX)
- {
- if (destX == undefined) {
- destX = horizontalDrag.position().left;
- }
-
- container.scrollTop(0);
- horizontalDragPosition = destX;
-
- var isAtLeft = horizontalDragPosition == 0,
- isAtRight = horizontalDragPosition == dragMaxY,
- percentScrolled = destX / dragMaxX,
- destLeft = -percentScrolled * (contentWidth - paneWidth);
-
- if (wasAtLeft != isAtLeft || wasAtRight != isAtRight) {
- wasAtLeft = isAtLeft;
- wasAtRight = isAtRight;
- elem.trigger('jsp-arrow-change', [wasAtTop, wasAtBottom, wasAtLeft, wasAtRight]);
- }
-
- updateHorizontalArrows(isAtLeft, isAtRight);
- pane.css('left', destLeft);
- elem.trigger('jsp-scroll-x', [-destLeft, isAtLeft, isAtRight]);
- }
-
- function updateVerticalArrows(isAtTop, isAtBottom)
- {
- if (settings.showArrows) {
- arrowUp[isAtTop ? 'addClass' : 'removeClass']('jspDisabled');
- arrowDown[isAtBottom ? 'addClass' : 'removeClass']('jspDisabled');
- }
- }
-
- function updateHorizontalArrows(isAtLeft, isAtRight)
- {
- if (settings.showArrows) {
- arrowLeft[isAtLeft ? 'addClass' : 'removeClass']('jspDisabled');
- arrowRight[isAtRight ? 'addClass' : 'removeClass']('jspDisabled');
- }
- }
-
- function scrollToY(destY, animate)
- {
- var percentScrolled = destY / (contentHeight - paneHeight);
- positionDragY(percentScrolled * dragMaxY, animate);
- }
-
- function scrollToX(destX, animate)
- {
- var percentScrolled = destX / (contentWidth - paneWidth);
- positionDragX(percentScrolled * dragMaxX, animate);
- }
-
- function scrollToElement(ele, stickToTop, animate)
- {
- var e, eleHeight, eleTop = 0, viewportTop, maxVisibleEleTop, destY;
-
- // Legal hash values aren't necessarily legal jQuery selectors so we need to catch any
- // errors from the lookup...
- try {
- e = $(ele);
- } catch (err) {
- return;
- }
- eleHeight = e.outerHeight();
-
- container.scrollTop(0);
-
- // loop through parents adding the offset top of any elements that are relatively positioned between
- // the focused element and the jspPane so we can get the true distance from the top
- // of the focused element to the top of the scrollpane...
- while (!e.is('.jspPane')) {
- eleTop += e.position().top;
- e = e.offsetParent();
- if (/^body|html$/i.test(e[0].nodeName)) {
- // we ended up too high in the document structure. Quit!
- return;
- }
- }
-
-
- viewportTop = contentPositionY();
- maxVisibleEleTop = viewportTop + paneHeight;
- if (eleTop < viewportTop || stickToTop) { // element is above viewport
- destY = eleTop - settings.verticalGutter;
- } else if (eleTop + eleHeight > maxVisibleEleTop) { // element is below viewport
- destY = eleTop - paneHeight + eleHeight + settings.verticalGutter;
- }
- if (destY) {
- scrollToY(destY, animate);
- }
- // TODO: Implement automatic horizontal scrolling?
- }
-
- function contentPositionX()
- {
- return -pane.position().left;
- }
-
- function contentPositionY()
- {
- return -pane.position().top;
- }
-
- function initMousewheel()
- {
- container.unbind(mwEvent).bind(
- mwEvent,
- function (event, delta, deltaX, deltaY) {
- var dX = horizontalDragPosition, dY = verticalDragPosition;
- positionDragX(horizontalDragPosition + deltaX * settings.mouseWheelSpeed, false)
- positionDragY(verticalDragPosition - deltaY * settings.mouseWheelSpeed, false);
- // return true if there was no movement so rest of screen can scroll
- return dX == horizontalDragPosition && dY == verticalDragPosition;
- }
- );
- }
-
- function removeMousewheel()
- {
- container.unbind(mwEvent);
- }
-
- function nil()
- {
- return false;
- }
-
- function initFocusHandler()
- {
- pane.unbind('focusin.jsp').bind(
- 'focusin.jsp',
- function(e)
- {
- if(e.target === pane[0]){return;}
- scrollToElement(e.target, false);
- }
- );
- }
-
- function removeFocusHandler()
- {
-
- pane.unbind('focusin.jsp');
- }
-
- function initKeyboardNav()
- {
- var pressed, pressedTimer;
- elem.attr('tabindex', 0)
- .unbind('keydown.jsp')
- .bind(
- 'keydown.jsp',
- function(e)
- {
- if(e.target !== elem[0]){
- return;
- }
- var dX = horizontalDragPosition, dY = verticalDragPosition, step = pressed ? 2 : 16;
- switch(e.keyCode) {
- case 40: // down
- positionDragY(verticalDragPosition + step, false);
- break;
- case 38: // up
- positionDragY(verticalDragPosition - step, false);
- break;
- case 34: // page down
- case 32: // space
- scrollToY(contentPositionY() + Math.max(32, paneHeight) - 16);
- break;
- case 33: // page up
- scrollToY(contentPositionY() - paneHeight + 16);
- break;
- case 35: // end
- scrollToY(contentHeight - paneHeight);
- break;
- case 36: // home
- scrollToY(0);
- break;
- case 39: // right
- positionDragX(horizontalDragPosition + step, false);
- break;
- case 37: // left
- positionDragX(horizontalDragPosition - step, false);
- break;
- }
-
- if( !(dX == horizontalDragPosition && dY == verticalDragPosition) ){
- pressed = true;
- clearTimeout(pressedTimer);
- pressedTimer = setTimeout(function(){
- pressed = false;
- }, 260);
- return false;
- }
- }
- );
- if(settings.hideFocus) {
- elem.css('outline', 'none');
- if('hideFocus' in container[0]){
- elem.attr('hideFocus', true);
- }
- } else {
- elem.css('outline', '');
- if('hideFocus' in container[0]){
- elem.attr('hideFocus', false);
- }
- }
- }
-
- function removeKeyboardNav()
- {
- elem.attr('tabindex', '-1')
- .removeAttr('tabindex')
- .unbind('keydown.jsp');
- }
-
- function observeHash()
- {
- if (location.hash && location.hash.length > 1) {
- var e, retryInt;
- try {
- e = $(location.hash);
- } catch (err) {
- return;
- }
-
- if (e.length && pane.find(e)) {
- // nasty workaround but it appears to take a little while before the hash has done its thing
- // to the rendered page so we just wait until the container's scrollTop has been messed up.
- if (container.scrollTop() == 0) {
- retryInt = setInterval(
- function()
- {
- if (container.scrollTop() > 0) {
- scrollToElement(location.hash, true);
- $(document).scrollTop(container.position().top);
- clearInterval(retryInt);
- }
- },
- 50
- )
- } else {
- scrollToElement(location.hash, true);
- $(document).scrollTop(container.position().top);
- }
- }
- }
- }
-
- function unhijackInternalLinks()
- {
- $('a.jspHijack').unbind('click.jsp-hijack').removeClass('jspHijack');
- }
-
- function hijackInternalLinks()
- {
- unhijackInternalLinks();
- $('a[href^=#]').addClass('jspHijack').bind(
- 'click.jsp-hijack',
- function()
- {
- var uriParts = this.href.split('#'), hash;
- if (uriParts.length > 1) {
- hash = uriParts[1];
- if (hash.length > 0 && pane.find('#' + hash).length > 0) {
- scrollToElement('#' + hash, true);
- // Need to return false otherwise things mess up... Would be nice to maybe also scroll
- // the window to the top of the scrollpane?
- return false;
- }
- }
- }
- )
- }
-
- // Public API
- $.extend(
- jsp,
- {
- // Reinitialises the scroll pane (if it's internal dimensions have changed since the last time it
- // was initialised). The settings object which is passed in will override any settings from the
- // previous time it was initialised - if you don't pass any settings then the ones from the previous
- // initialisation will be used.
- reinitialise: function(s)
- {
- s = $.extend({}, s, settings);
- initialise(s);
- },
- // Scrolls the specified element (a jQuery object, DOM node or jQuery selector string) into view so
- // that it can be seen within the viewport. If stickToTop is true then the element will appear at
- // the top of the viewport, if it is false then the viewport will scroll as little as possible to
- // show the element. You can also specify if you want animation to occur. If you don't provide this
- // argument then the animateScroll value from the settings object is used instead.
- scrollToElement: function(ele, stickToTop, animate)
- {
- scrollToElement(ele, stickToTop, animate);
- },
- // Scrolls the pane so that the specified co-ordinates within the content are at the top left
- // of the viewport. animate is optional and if not passed then the value of animateScroll from
- // the settings object this jScrollPane was initialised with is used.
- scrollTo: function(destX, destY, animate)
- {
- scrollToX(destX, animate);
- scrollToY(destY, animate);
- },
- // Scrolls the pane so that the specified co-ordinate within the content is at the left of the
- // viewport. animate is optional and if not passed then the value of animateScroll from the settings
- // object this jScrollPane was initialised with is used.
- scrollToX: function(destX, animate)
- {
- scrollToX(destX, animate);
- },
- // Scrolls the pane so that the specified co-ordinate within the content is at the top of the
- // viewport. animate is optional and if not passed then the value of animateScroll from the settings
- // object this jScrollPane was initialised with is used.
- scrollToY: function(destY, animate)
- {
- scrollToY(destY, animate);
- },
- // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- scrollBy: function(deltaX, deltaY, animate)
- {
- jsp.scrollByX(deltaX, animate);
- jsp.scrollByY(deltaY, animate);
- },
- // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- scrollByX: function(deltaX, animate)
- {
- var destX = contentPositionX() + deltaX,
- percentScrolled = destX / (contentWidth - paneWidth);
- positionDragX(percentScrolled * dragMaxX, animate);
- },
- // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- scrollByY: function(deltaY, animate)
- {
- var destY = contentPositionY() + deltaY,
- percentScrolled = destY / (contentHeight - paneHeight);
- positionDragY(percentScrolled * dragMaxY, animate);
- },
- // This method is called when jScrollPane is trying to animate to a new position. You can override
- // it if you want to provide advanced animation functionality. It is passed the following arguments:
- // * ele - the element whose position is being animated
- // * prop - the property that is being animated
- // * value - the value it's being animated to
- // * stepCallback - a function that you must execute each time you update the value of the property
- // You can use the default implementation (below) as a starting point for your own implementation.
- animate: function(ele, prop, value, stepCallback)
- {
- var params = {};
- params[prop] = value;
- ele.animate(
- params,
- {
- 'duration' : settings.animateDuration,
- 'ease' : settings.animateEase,
- 'queue' : false,
- 'step' : stepCallback
- }
- );
- },
- // Returns the current x position of the viewport with regards to the content pane.
- getContentPositionX: function()
- {
- return contentPositionX();
- },
- // Returns the current y position of the viewport with regards to the content pane.
- getContentPositionY: function()
- {
- return contentPositionY();
- },
- // Returns whether or not this scrollpane has a horizontal scrollbar.
- getIsScrollableH: function()
- {
- return isScrollableH;
- },
- // Returns whether or not this scrollpane has a vertical scrollbar.
- getIsScrollableV: function()
- {
- return isScrollableV;
- },
- // Gets a reference to the content pane. It is important that you use this method if you want to
- // edit the content of your jScrollPane as if you access the element directly then you may have some
- // problems (as your original element has had additional elements for the scrollbars etc added into
- // it).
- getContentPane: function()
- {
- return pane;
- },
- // Scrolls this jScrollPane down as far as it can currently scroll. If animate isn't passed then the
- // animateScroll value from settings is used instead.
- scrollToBottom: function(animate)
- {
- positionDragY(dragMaxY, animate);
- },
- // Hijacks the links on the page which link to content inside the scrollpane. If you have changed
- // the content of your page (e.g. via AJAX) and want to make sure any new anchor links to the
- // contents of your scroll pane will work then call this function.
- hijackInternalLinks: function()
- {
- hijackInternalLinks();
- }
- }
- );
- }
-
- // Pluginifying code...
-
- settings = $.extend({}, $.fn.jScrollPane.defaults, settings);
-
- var ret;
- this.each(
- function()
- {
- var elem = $(this), jspApi = elem.data('jsp');
- if (jspApi) {
- jspApi.reinitialise(settings);
- } else {
- jspApi = new JScrollPane(elem, settings);
- elem.data('jsp', jspApi);
- }
- ret = ret ? ret.add(elem) : elem;
- }
- )
- return ret;
- };
-
- $.fn.jScrollPane.defaults = {
- 'showArrows' : false,
- 'maintainPosition' : true,
- 'autoReinitialise' : false,
- 'autoReinitialiseDelay' : 500,
- 'verticalDragMinHeight' : 0,
- 'verticalDragMaxHeight' : 99999,
- 'horizontalDragMinWidth' : 0,
- 'horizontalDragMaxWidth' : 99999,
- 'animateScroll' : false,
- 'animateDuration' : 300,
- 'animateEase' : 'linear',
- 'hijackInternalLinks' : false,
- 'verticalGutter' : 4,
- 'horizontalGutter' : 4,
- 'mouseWheelSpeed' : 10,
- 'arrowButtonSpeed' : 10,
- 'arrowRepeatFreq' : 100,
- 'arrowScrollOnHover' : false,
- 'verticalArrowPositions' : 'split',
- 'horizontalArrowPositions' : 'split',
- 'enableKeyboardNavigation' : true,
- 'hideFocus' : false
- };
-
-})(jQuery,this);
-
diff --git a/libs/bower_components/jScrollPane/issues/11/native.html b/libs/bower_components/jScrollPane/issues/11/native.html
deleted file mode 100644
index 2b72862b4b..0000000000
--- a/libs/bower_components/jScrollPane/issues/11/native.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<meta name="verify-v1" content="ven67p9fXoMQpbw1icSXo8l+I5Z+upY90LnIqaPDgKo=" />
-<meta name="description" content="Tinyfish is the smallest progressive rock band in the world, self-taught, self-financed, and self-abusing - no, wait..." />
-<meta name="keywords" content="Tinyfish, Pink Floyd, Porcupine Tree, progrock, progressive rock, prog rock, prog, Marillion, King Crimson, Rush, The Big Red Spark, Curious Things" />
-<link href="brs_main.css" rel="stylesheet" type="text/css"/>
-<link type="text/css" href="../../style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-<title>latest news</title>
-<!-- compliance patch for microsoft browsers -->
-<!--[if lt IE 8]><script src="../__js/IE8.js" type="text/javascript"></script><![endif]-->
-<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
-<script type="text/javascript" src="../../script/jquery.mousewheel.js"></script>
-
-<script type="text/javascript" src="../../script/jquery.jscrollpane.js"></script>
-<script language="javascript" type="text/javascript">
-$(function()
-{
-});
-</script>
-</head>
-<body class="nopage">
-<div id="content">
-<h1>news</h1>
-<p>After three years of toil, The new Tinyfish album, The Big Red Spark,
- is finally finished, and to celebrate, you'll be able to join us at The Luminaire
- in Kilburn for a very special gig to launch the album on an unsuspecting world.</p>
-<p>Although by this point, some people may already have suspected.</p>
-<p>Support will be provided by the excellent Dec Burke and his new band,
- Destroy All Monsters</p>
-<p>When: Friday, 10th September<br />
-
- Where: The Luminaire (click for map)<br />
- How much: &pound;10 in advance (&pound;8 CRS members advance) or &pound;12 on the door.<br />
- Doors open at 7:30.</p>
-<p>Tickets: www.linktoticket website.co.uk</p>
-</div>
-
-</body>
-
-</html>
diff --git a/libs/bower_components/jScrollPane/issues/12/after.html b/libs/bower_components/jScrollPane/issues/12/after.html
deleted file mode 100644
index 039370c360..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/after.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<meta name="verify-v1" content="ven67p9fXoMQpbw1icSXo8l+I5Z+upY90LnIqaPDgKo=" />
-<link href="brs_main.css" rel="stylesheet" type="text/css"/>
-<link type="text/css" href="../../style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-<title>The History of Tinyfish</title>
-<!-- compliance patch for microsoft browsers -->
-<!--[if lt IE 8]><script src="../__js/IE8.js" type="text/javascript"></script><![endif]-->
-<script src="http://cdn.jquerytools.org/1.2.2/full/jquery.tools.min.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="../../script/jquery.mousewheel.js"></script>
-<script type="text/javascript" src="../../script/jquery.jscrollpane.js"></script>
-
-<script language="javascript" type="text/javascript">
-$(function()
-{
- var api = $("#content").jScrollPane({
- showArrows: true
- }).data('jsp');
-
- $(window).bind(
- 'resize',
- function()
- {
- api.reinitialise();
- }
- ).trigger('resize');
-});
-</script>
-</head>
-<body class="nopage">
-<div id="content">
- <h1>The History of Tinyfish</h1>
- <p>It all began with a pair of broken arms and two dodgy eyes.</p>
- <p>It&rsquo;s 1978, the year that <a href="../__imgs/band/history/schoolboyjim.jpg" title="Jim at school" rel="#hist02">Jim Sanders</a> and <a href="../__imgs/band/history/babysimon.jpg" title="Simon as a baby" rel="#hist01">Simon Godfrey</a> met at school in East Sheen (South London). Although each had been aware of the other since the age of five, the two would have been on nothing more than nodding acquaintance, save for two medical problems that forced them together and would eventually lead to the band we know today as Tinyfish.</p>
-
- <p>Bloody weaklings.</p>
- <p>Jim had been diagnosed with a rare retinal disease which had a good chance of robbing him of his vision, and had recently undergone laser eye surgery. Simon more comedically had broken both arms after falling off a roof, leaving him with seriously weakened joints. As part of their convalescence from their respective surgeries, both boys were excused sports for six months.</p>
- <p>While the rest of the kids kicked the living crap out of each other under the pretence of playing football or rugby, Jim and Simon sat on a low school wall watching the on-field carnage and eyeing one another warily. Initially Simon was the talkative one while Jim sat silently, but as soon as the subject matter turned to music, both began to find some common ground, and the conversation became a two way street.</p>
- <p>Initially, Jim had been a Rock/New Wave fan who loved Thin Lizzy (above all others), but incongruously, also the Skids (who would later become Big Country) and the Rezillos (who wouldn&rsquo;t). Simon on the other hand was a fan of ELO and The Sweet but both agreed that music, and in particular, rock bands, were the bee&rsquo;s knees.</p>
- <p>Around the same time , Simon had struck up a friendship with another boy at school called <a href="../__imgs/band/history/youngpaul.jpg" title="Paul - much younger" rel="#hist03">Paul Worwood</a>, initially during school music lessons. The pair were both big fans of Dungeons and Dragons and would play the game constantly throughout their teenage years.</p>
-
- <p>Bloody geeks.</p>
- <p>As the 70&rsquo;s gave way to the 80&rsquo;s and the three grew to be good friends, Jim drew Simon and Paul towards a new love; heavy metal. Over the next three years, the trio saw every metal band that played at their local venue (The Hammersmith Odeon). While the three saw the likes of Thin Lizzy, Saxon, MSG, Iron Maiden and The Scorpions, their listening tastes also encompassed bands such as Yes, Genesis, King Crimson and Magnum.</p>
- <p>Jim had first played &lsquo;Going For The One&rsquo; by Yes to Simon back in the 70's (Simon rather uncharitably dubbed it &lsquo;f***ing Country &amp; Western&rsquo;. To be fair, Jim told Simon not to bother with Jethro Tull, as he thought they were arse... without actually having ever heard them. Twit.). Jim persevered however, and when he spun &lsquo;A Farewell To Kings&rsquo; by Rush in an afternoon listening session, Simon was well and truly hooked. He now also likes Yes very much. Hah! Jim now also likes Jethro Tull. Hah! Hah!</p>
-
- <p>During their time at Richmond College (South West London), Jim and Simon met guitarist Nick Denville, and formed their first band, with Paul joining on bass soon after. Paul was the only person they knew who owned a car. They also thought he was a top bloke, and so without mentioning the car caveat, the three miscreants cajoled Paul into buying a bass guitar and an amplifier. They called themselves <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">&lsquo;Blackstone Edge&rsquo;</a> and they were bloody rubbish. All they needed was a keyboard player to crown their musical ineptitude.</p>
- <p>Simon&rsquo;s younger brother Jem was 14 when he received his first keyboard (a Casio home synth which he put through a flanger pedal to make it sound cosmic). Jem was initially invited to rehearsals to hold the lyrics up for Jim to sing from while the rest of the band played. It soon became obvious to the guys that Jem's talents were wasted as a music stand and so he was invited into the band. This line up survived for a few months before Nick Denville left to live a happier and entirely more melodic life elsewhere.</p>
- <p>Bloody kids.</p>
- <p>The band continued, and Simon relentlessly poured prog music into Jem's head which was immediately absorbed by the young keyboard player. Less than six months later, Jem had learned all of Tony Banks&rsquo; keyboard solos from both Seconds Out and Three Sides Live along with Rick Wakeman's and Patrick Moraz's solos from Yesshows. With Jem's considerable technique, and the band hungry to write original music, the direction of the band was truely set towards progressive rock. The name <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">Blackstone Edge</a> was soon dropped in favour of &lsquo;Freefall Warriors&rsquo; (after a story in a Doctor Who comic) which very quickly contracted simply to <a href="../__imgs/band/history/freefall.jpg" title="Freefall Mk.1" rel="#hist06">&lsquo;Freefall&rsquo;</a> and with the addition of vocalist Andrew Lovatt, the band began to rehearse <a href="../__imgs/band/history/freefallposter.jpg" title="Poster for Freefall's first gig" rel="#hist05">in preparation for live gigs.</a></p>
-
- <p>During this time the band bumped into actor <a href="../__imgs/band/history/tonyaitken.jpg" title="Tony Aitken" rel="#hist07">Tony Aitken</a> who had worked during his less successful years as a supply teacher at Jim and Simon&rsquo;s school in the 70&rsquo;s. Tony was looking for musicians to back him in a covers band, and the guys duly offered their services (even though they then had no live experience whatsoever). The arrangement worked so well that they kept the band going for over a decade and it was there, working the pubs and clubs of southern England, that they learned the musical chops that would serve them so well in later years.</p>
- <p>In parallel to their function band work, Freefall practice/writing sessions continued. As luck would have it, IQ rehearsed in the studio next door to them, and on the back of their first gig, attended by IQ&rsquo;s then manager, they managed to land the support slot at IQ&rsquo;s Christmas show <a href="../__imgs/band/history/freefallmarquee.jpg" title="Freefall at the Marquee" rel="#hist08">at the Marquee Club in London. Gulp.</a></p>
- <p>Thankfully, the band hit it off immediately with the crowd and soon managed to get a string of gigs with bands like Jadis, Ark, Galahad, Mentaur and Geoff Mann from Twelth Night. Freefall looked as though they were going to make a big impact with the prog community but after an ill-judged attempt to &lsquo;go commercial&rsquo; in the early &lsquo;90s, (Bloody managers!) Jim left the band and the remaining members recruited a very nice gentleman called <a href="../__imgs/band/history/johnboyes.jpg" title="and on guitar - Mr. John Boyes!" rel="#hist09">John Boyes</a> on guitar. However, the moment was lost and the band soon fell apart.</p>
-
- <p>Bloody idiots.</p>
- <p>Jim and Jem briefly went on, to form Pop-proggers &ldquo;Charlottes&rsquo; Web&rdquo; before Jem gave up the scene to work for national radio (although Jem's involvement with prog would be re-ignited a decade later with the formation (with John Boyes) of the Prog supergroup Frost*).</p>
- <p>Meanwhile, Simon and Paul formed an acoustic outfit called <a href="../__imgs/band/history/maddogs.jpg" title="Men Are Dead Mk. I" rel="#hist10">&lsquo;Men Are Dead&rsquo;</a> with keyboard player Col Alkins and lyricist/harmonica player Rob Ramsay. Simon had met Rob way back in the early 80&rsquo;s at Richmond College, at the same time Freefall were making their first tentative steps in music. They became good friends and Rob was always involved at some level, either by helping out at gigs or writing the occasional lyric.</p>
-
- <br />
- <p>Men Are Dead began to play gigs on London's open mic scene (where any artist can roll up and play a short set of between two and five songs) and the band proved to be extremely popular with both audience and fellow musos alike. Col left after their first album, but thankfully, Jim once again joined up with Simon and Paul as a second guitarist, along with <a href="../__imgs/band/history/wayne.jpg" title="Wayne caught in the headlights" rel="#hist12">Wayne Collier</a>, an extraordinary drummer who played in almost every band in West London. <a href="../__imgs/band/history/menaredead.jpg" title="Men Are Dead Mk. II" rel="#hist11">What evolved was a prototype Tinyfish</a> sound and much of the band&rsquo;s current style comes from these early twin guitar shows.</p>
- <p>The millennium came and went, and so did the name &lsquo;Men Are Dead&rsquo;. In came Simon&rsquo;s alter ego &lsquo;Simon Walsh&rsquo;, a <em>nom-de-guerre</em> he still uses today when playing solo acoustic gigs. Whilst notching up appearances in the UK, Germany, France, Estonia and America, they recruited a third guitarist <a href="../__imgs/band/history/hw1.jpg" title="Tim solos at the Hope and Anchor" rel="#hist13">(Tim Eyles)</a> and all looked rosy (if a little Lynyrd Skynyrd) in the garden. Behind the scenes however, things were not going well with the band. Frustration with the strict definitions of acoustic music imposed by many clubs and venues began to take their toll on both the music and musicians. Their material was becoming more complex and the songs started to push past the three minute mark, as the band's deep-seated prog influences once again made themselves felt.</p>
-
- <p>Finally in the late autumn of 2004, after much soul searching, Simon sent Jim an e-mail suggesting that maybe there was little more they could achieve as an acoustic unit and perhaps they should return to their progressive roots. Jim happily agreed and an invite was duly sent out to both Paul and Rob asking if they would be interested in joining, which thankfully they did.</p>
- <p>Simon disbanded the acoustic band, with Tim Eyles joining the punk-pop band &lsquo;The Random&rsquo; and the four remaining musicians <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">assembled in Simon's loft</a> and began writing and rehearsing. Within six weeks it was obvious that there were real possibilities in the music they were making, but the question as to how to record this new material was causing them concern. None of them could afford to go the professional route, so the decision was made to turn the loft into a studio, and try it themselves.</p>
- <p>Robert had set up Lazy Gun Records several years previously, to promote both Men Are Dead and Simon Walsh, and suggested that this new band join the roster. This gave them complete artistic and financial control of their work. </p>
- <p>Bloody tight bastards.</p>
-
- <p>Finally the subject of the name for the band reared its ugly head. There were thoughts that they could resurrect the name Freefall but that idea was soon discarded. This was a new band, and it deserved a new name (besides, someone else was now using &lsquo;Freefall&rsquo; and they looked bigger and meaner than this band). It was Jim that quipped that they were just tiny fish compared to some of the huge prog bands still out there and within moments the name had stuck.</p>
- <p>The problem remained that they were a man short for playing live shows, but in the studio, that base was covered by Simon who, happily, can play both <a href="../__imgs/band/history/drumkit.jpg" title="Simon's electronic drumkit" rel="#hist15">drums</a> and <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">guitar</a> in equal measure (although not at the same time). Meanwhile, the studio had taken shape and the band had found that familiar progressive chemistry once again. The smiles were back on everybody&rsquo;s faces, and the band had a sound they could work to develop.</p>
- <p>When the talk turned once more to live performances, Jim mentioned that he knew a drummer of many bands, the semi-Italian <a href="../__imgs/band/history/leonstatue.jpg" title="Leon at the kit" rel="#hist16">Leon Camfield</a>, and after a few rehearsals (and many beers) together, Leon (for whom truely progressive music is a long held love (note King Crimson tattoo on arm)) enthusiastically joined to complete the Fab Five.</p>
-
- <p>So here we are in 2010. <a href="../__imgs/band/history/tinyfish1.jpg" title="tinyfish" rel="#hist17">Tinyfish</a> have gigged around the country, released both two albums, a mini-album, and a live album &amp; DVD, and have <a href="../__imgs/band/history/tinyfish2.jpg" title="tinyfish" rel="#hist18">arrived at a destination</a> where they feel at home, and are proud of their journey to this place of better dreams.</p>
- <p class="centre"><a href="../__imgs/band/history/strangestudioshot.jpg" title="a tinyfish close encounter" rel="#hist19">Bloody pretentious tossers.</a></p>
-</div>
-</body>
-</html>
-
diff --git a/libs/bower_components/jScrollPane/issues/12/after_reinit.html b/libs/bower_components/jScrollPane/issues/12/after_reinit.html
deleted file mode 100644
index e61225778e..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/after_reinit.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<meta name="verify-v1" content="ven67p9fXoMQpbw1icSXo8l+I5Z+upY90LnIqaPDgKo=" />
-<link href="brs_main.css" rel="stylesheet" type="text/css"/>
-<link type="text/css" href="../../style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-<title>The History of Tinyfish</title>
-<!-- compliance patch for microsoft browsers -->
-<!--[if lt IE 8]><script src="../__js/IE8.js" type="text/javascript"></script><![endif]-->
-<script src="http://cdn.jquerytools.org/1.2.2/full/jquery.tools.min.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="../../script/jquery.mousewheel.js"></script>
-<script type="text/javascript" src="../../script/jquery.jscrollpane.js"></script>
-
-<script language="javascript" type="text/javascript">
-$(function()
-{
- $("#content").jScrollPane({
- showArrows: true,
- autoReinitialise: true
- });
-});
-</script>
-</head>
-<body class="nopage">
-<div id="content">
- <h1>The History of Tinyfish</h1>
- <p>It all began with a pair of broken arms and two dodgy eyes.</p>
- <p>It&rsquo;s 1978, the year that <a href="../__imgs/band/history/schoolboyjim.jpg" title="Jim at school" rel="#hist02">Jim Sanders</a> and <a href="../__imgs/band/history/babysimon.jpg" title="Simon as a baby" rel="#hist01">Simon Godfrey</a> met at school in East Sheen (South London). Although each had been aware of the other since the age of five, the two would have been on nothing more than nodding acquaintance, save for two medical problems that forced them together and would eventually lead to the band we know today as Tinyfish.</p>
-
- <p>Bloody weaklings.</p>
- <p>Jim had been diagnosed with a rare retinal disease which had a good chance of robbing him of his vision, and had recently undergone laser eye surgery. Simon more comedically had broken both arms after falling off a roof, leaving him with seriously weakened joints. As part of their convalescence from their respective surgeries, both boys were excused sports for six months.</p>
- <p>While the rest of the kids kicked the living crap out of each other under the pretence of playing football or rugby, Jim and Simon sat on a low school wall watching the on-field carnage and eyeing one another warily. Initially Simon was the talkative one while Jim sat silently, but as soon as the subject matter turned to music, both began to find some common ground, and the conversation became a two way street.</p>
- <p>Initially, Jim had been a Rock/New Wave fan who loved Thin Lizzy (above all others), but incongruously, also the Skids (who would later become Big Country) and the Rezillos (who wouldn&rsquo;t). Simon on the other hand was a fan of ELO and The Sweet but both agreed that music, and in particular, rock bands, were the bee&rsquo;s knees.</p>
- <p>Around the same time , Simon had struck up a friendship with another boy at school called <a href="../__imgs/band/history/youngpaul.jpg" title="Paul - much younger" rel="#hist03">Paul Worwood</a>, initially during school music lessons. The pair were both big fans of Dungeons and Dragons and would play the game constantly throughout their teenage years.</p>
-
- <p>Bloody geeks.</p>
- <p>As the 70&rsquo;s gave way to the 80&rsquo;s and the three grew to be good friends, Jim drew Simon and Paul towards a new love; heavy metal. Over the next three years, the trio saw every metal band that played at their local venue (The Hammersmith Odeon). While the three saw the likes of Thin Lizzy, Saxon, MSG, Iron Maiden and The Scorpions, their listening tastes also encompassed bands such as Yes, Genesis, King Crimson and Magnum.</p>
- <p>Jim had first played &lsquo;Going For The One&rsquo; by Yes to Simon back in the 70's (Simon rather uncharitably dubbed it &lsquo;f***ing Country &amp; Western&rsquo;. To be fair, Jim told Simon not to bother with Jethro Tull, as he thought they were arse... without actually having ever heard them. Twit.). Jim persevered however, and when he spun &lsquo;A Farewell To Kings&rsquo; by Rush in an afternoon listening session, Simon was well and truly hooked. He now also likes Yes very much. Hah! Jim now also likes Jethro Tull. Hah! Hah!</p>
-
- <p>During their time at Richmond College (South West London), Jim and Simon met guitarist Nick Denville, and formed their first band, with Paul joining on bass soon after. Paul was the only person they knew who owned a car. They also thought he was a top bloke, and so without mentioning the car caveat, the three miscreants cajoled Paul into buying a bass guitar and an amplifier. They called themselves <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">&lsquo;Blackstone Edge&rsquo;</a> and they were bloody rubbish. All they needed was a keyboard player to crown their musical ineptitude.</p>
- <p>Simon&rsquo;s younger brother Jem was 14 when he received his first keyboard (a Casio home synth which he put through a flanger pedal to make it sound cosmic). Jem was initially invited to rehearsals to hold the lyrics up for Jim to sing from while the rest of the band played. It soon became obvious to the guys that Jem's talents were wasted as a music stand and so he was invited into the band. This line up survived for a few months before Nick Denville left to live a happier and entirely more melodic life elsewhere.</p>
- <p>Bloody kids.</p>
- <p>The band continued, and Simon relentlessly poured prog music into Jem's head which was immediately absorbed by the young keyboard player. Less than six months later, Jem had learned all of Tony Banks&rsquo; keyboard solos from both Seconds Out and Three Sides Live along with Rick Wakeman's and Patrick Moraz's solos from Yesshows. With Jem's considerable technique, and the band hungry to write original music, the direction of the band was truely set towards progressive rock. The name <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">Blackstone Edge</a> was soon dropped in favour of &lsquo;Freefall Warriors&rsquo; (after a story in a Doctor Who comic) which very quickly contracted simply to <a href="../__imgs/band/history/freefall.jpg" title="Freefall Mk.1" rel="#hist06">&lsquo;Freefall&rsquo;</a> and with the addition of vocalist Andrew Lovatt, the band began to rehearse <a href="../__imgs/band/history/freefallposter.jpg" title="Poster for Freefall's first gig" rel="#hist05">in preparation for live gigs.</a></p>
-
- <p>During this time the band bumped into actor <a href="../__imgs/band/history/tonyaitken.jpg" title="Tony Aitken" rel="#hist07">Tony Aitken</a> who had worked during his less successful years as a supply teacher at Jim and Simon&rsquo;s school in the 70&rsquo;s. Tony was looking for musicians to back him in a covers band, and the guys duly offered their services (even though they then had no live experience whatsoever). The arrangement worked so well that they kept the band going for over a decade and it was there, working the pubs and clubs of southern England, that they learned the musical chops that would serve them so well in later years.</p>
- <p>In parallel to their function band work, Freefall practice/writing sessions continued. As luck would have it, IQ rehearsed in the studio next door to them, and on the back of their first gig, attended by IQ&rsquo;s then manager, they managed to land the support slot at IQ&rsquo;s Christmas show <a href="../__imgs/band/history/freefallmarquee.jpg" title="Freefall at the Marquee" rel="#hist08">at the Marquee Club in London. Gulp.</a></p>
- <p>Thankfully, the band hit it off immediately with the crowd and soon managed to get a string of gigs with bands like Jadis, Ark, Galahad, Mentaur and Geoff Mann from Twelth Night. Freefall looked as though they were going to make a big impact with the prog community but after an ill-judged attempt to &lsquo;go commercial&rsquo; in the early &lsquo;90s, (Bloody managers!) Jim left the band and the remaining members recruited a very nice gentleman called <a href="../__imgs/band/history/johnboyes.jpg" title="and on guitar - Mr. John Boyes!" rel="#hist09">John Boyes</a> on guitar. However, the moment was lost and the band soon fell apart.</p>
-
- <p>Bloody idiots.</p>
- <p>Jim and Jem briefly went on, to form Pop-proggers &ldquo;Charlottes&rsquo; Web&rdquo; before Jem gave up the scene to work for national radio (although Jem's involvement with prog would be re-ignited a decade later with the formation (with John Boyes) of the Prog supergroup Frost*).</p>
- <p>Meanwhile, Simon and Paul formed an acoustic outfit called <a href="../__imgs/band/history/maddogs.jpg" title="Men Are Dead Mk. I" rel="#hist10">&lsquo;Men Are Dead&rsquo;</a> with keyboard player Col Alkins and lyricist/harmonica player Rob Ramsay. Simon had met Rob way back in the early 80&rsquo;s at Richmond College, at the same time Freefall were making their first tentative steps in music. They became good friends and Rob was always involved at some level, either by helping out at gigs or writing the occasional lyric.</p>
-
- <br />
- <p>Men Are Dead began to play gigs on London's open mic scene (where any artist can roll up and play a short set of between two and five songs) and the band proved to be extremely popular with both audience and fellow musos alike. Col left after their first album, but thankfully, Jim once again joined up with Simon and Paul as a second guitarist, along with <a href="../__imgs/band/history/wayne.jpg" title="Wayne caught in the headlights" rel="#hist12">Wayne Collier</a>, an extraordinary drummer who played in almost every band in West London. <a href="../__imgs/band/history/menaredead.jpg" title="Men Are Dead Mk. II" rel="#hist11">What evolved was a prototype Tinyfish</a> sound and much of the band&rsquo;s current style comes from these early twin guitar shows.</p>
- <p>The millennium came and went, and so did the name &lsquo;Men Are Dead&rsquo;. In came Simon&rsquo;s alter ego &lsquo;Simon Walsh&rsquo;, a <em>nom-de-guerre</em> he still uses today when playing solo acoustic gigs. Whilst notching up appearances in the UK, Germany, France, Estonia and America, they recruited a third guitarist <a href="../__imgs/band/history/hw1.jpg" title="Tim solos at the Hope and Anchor" rel="#hist13">(Tim Eyles)</a> and all looked rosy (if a little Lynyrd Skynyrd) in the garden. Behind the scenes however, things were not going well with the band. Frustration with the strict definitions of acoustic music imposed by many clubs and venues began to take their toll on both the music and musicians. Their material was becoming more complex and the songs started to push past the three minute mark, as the band's deep-seated prog influences once again made themselves felt.</p>
-
- <p>Finally in the late autumn of 2004, after much soul searching, Simon sent Jim an e-mail suggesting that maybe there was little more they could achieve as an acoustic unit and perhaps they should return to their progressive roots. Jim happily agreed and an invite was duly sent out to both Paul and Rob asking if they would be interested in joining, which thankfully they did.</p>
- <p>Simon disbanded the acoustic band, with Tim Eyles joining the punk-pop band &lsquo;The Random&rsquo; and the four remaining musicians <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">assembled in Simon's loft</a> and began writing and rehearsing. Within six weeks it was obvious that there were real possibilities in the music they were making, but the question as to how to record this new material was causing them concern. None of them could afford to go the professional route, so the decision was made to turn the loft into a studio, and try it themselves.</p>
- <p>Robert had set up Lazy Gun Records several years previously, to promote both Men Are Dead and Simon Walsh, and suggested that this new band join the roster. This gave them complete artistic and financial control of their work. </p>
- <p>Bloody tight bastards.</p>
-
- <p>Finally the subject of the name for the band reared its ugly head. There were thoughts that they could resurrect the name Freefall but that idea was soon discarded. This was a new band, and it deserved a new name (besides, someone else was now using &lsquo;Freefall&rsquo; and they looked bigger and meaner than this band). It was Jim that quipped that they were just tiny fish compared to some of the huge prog bands still out there and within moments the name had stuck.</p>
- <p>The problem remained that they were a man short for playing live shows, but in the studio, that base was covered by Simon who, happily, can play both <a href="../__imgs/band/history/drumkit.jpg" title="Simon's electronic drumkit" rel="#hist15">drums</a> and <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">guitar</a> in equal measure (although not at the same time). Meanwhile, the studio had taken shape and the band had found that familiar progressive chemistry once again. The smiles were back on everybody&rsquo;s faces, and the band had a sound they could work to develop.</p>
- <p>When the talk turned once more to live performances, Jim mentioned that he knew a drummer of many bands, the semi-Italian <a href="../__imgs/band/history/leonstatue.jpg" title="Leon at the kit" rel="#hist16">Leon Camfield</a>, and after a few rehearsals (and many beers) together, Leon (for whom truely progressive music is a long held love (note King Crimson tattoo on arm)) enthusiastically joined to complete the Fab Five.</p>
-
- <p>So here we are in 2010. <a href="../__imgs/band/history/tinyfish1.jpg" title="tinyfish" rel="#hist17">Tinyfish</a> have gigged around the country, released both two albums, a mini-album, and a live album &amp; DVD, and have <a href="../__imgs/band/history/tinyfish2.jpg" title="tinyfish" rel="#hist18">arrived at a destination</a> where they feel at home, and are proud of their journey to this place of better dreams.</p>
- <p class="centre"><a href="../__imgs/band/history/strangestudioshot.jpg" title="a tinyfish close encounter" rel="#hist19">Bloody pretentious tossers.</a></p>
-</div>
-</body>
-</html>
-
diff --git a/libs/bower_components/jScrollPane/issues/12/before.html b/libs/bower_components/jScrollPane/issues/12/before.html
deleted file mode 100644
index ee7402dbaa..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/before.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<meta name="verify-v1" content="ven67p9fXoMQpbw1icSXo8l+I5Z+upY90LnIqaPDgKo=" />
-<link href="brs_main.css" rel="stylesheet" type="text/css"/>
-<link type="text/css" href="jscrollpane-2b3.css" rel="stylesheet" media="all" />
-<title>The History of Tinyfish</title>
-<!-- compliance patch for microsoft browsers -->
-<!--[if lt IE 8]><script src="../__js/IE8.js" type="text/javascript"></script><![endif]-->
-<script src="http://cdn.jquerytools.org/1.2.2/full/jquery.tools.min.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="jquery.mousewheel.js"></script>
-<script type="text/javascript" src="jscrollpane-2b3.js"></script>
-
-<script language="javascript" type="text/javascript">
-$(function()
-{
- $("#content").jScrollPane({
- showArrows: true
- });
-});
-</script>
-</head>
-<body class="nopage">
-<div id="content">
- <h1>The History of Tinyfish</h1>
- <p>It all began with a pair of broken arms and two dodgy eyes.</p>
- <p>It&rsquo;s 1978, the year that <a href="../__imgs/band/history/schoolboyjim.jpg" title="Jim at school" rel="#hist02">Jim Sanders</a> and <a href="../__imgs/band/history/babysimon.jpg" title="Simon as a baby" rel="#hist01">Simon Godfrey</a> met at school in East Sheen (South London). Although each had been aware of the other since the age of five, the two would have been on nothing more than nodding acquaintance, save for two medical problems that forced them together and would eventually lead to the band we know today as Tinyfish.</p>
-
- <p>Bloody weaklings.</p>
- <p>Jim had been diagnosed with a rare retinal disease which had a good chance of robbing him of his vision, and had recently undergone laser eye surgery. Simon more comedically had broken both arms after falling off a roof, leaving him with seriously weakened joints. As part of their convalescence from their respective surgeries, both boys were excused sports for six months.</p>
- <p>While the rest of the kids kicked the living crap out of each other under the pretence of playing football or rugby, Jim and Simon sat on a low school wall watching the on-field carnage and eyeing one another warily. Initially Simon was the talkative one while Jim sat silently, but as soon as the subject matter turned to music, both began to find some common ground, and the conversation became a two way street.</p>
- <p>Initially, Jim had been a Rock/New Wave fan who loved Thin Lizzy (above all others), but incongruously, also the Skids (who would later become Big Country) and the Rezillos (who wouldn&rsquo;t). Simon on the other hand was a fan of ELO and The Sweet but both agreed that music, and in particular, rock bands, were the bee&rsquo;s knees.</p>
- <p>Around the same time , Simon had struck up a friendship with another boy at school called <a href="../__imgs/band/history/youngpaul.jpg" title="Paul - much younger" rel="#hist03">Paul Worwood</a>, initially during school music lessons. The pair were both big fans of Dungeons and Dragons and would play the game constantly throughout their teenage years.</p>
-
- <p>Bloody geeks.</p>
- <p>As the 70&rsquo;s gave way to the 80&rsquo;s and the three grew to be good friends, Jim drew Simon and Paul towards a new love; heavy metal. Over the next three years, the trio saw every metal band that played at their local venue (The Hammersmith Odeon). While the three saw the likes of Thin Lizzy, Saxon, MSG, Iron Maiden and The Scorpions, their listening tastes also encompassed bands such as Yes, Genesis, King Crimson and Magnum.</p>
- <p>Jim had first played &lsquo;Going For The One&rsquo; by Yes to Simon back in the 70's (Simon rather uncharitably dubbed it &lsquo;f***ing Country &amp; Western&rsquo;. To be fair, Jim told Simon not to bother with Jethro Tull, as he thought they were arse... without actually having ever heard them. Twit.). Jim persevered however, and when he spun &lsquo;A Farewell To Kings&rsquo; by Rush in an afternoon listening session, Simon was well and truly hooked. He now also likes Yes very much. Hah! Jim now also likes Jethro Tull. Hah! Hah!</p>
-
- <p>During their time at Richmond College (South West London), Jim and Simon met guitarist Nick Denville, and formed their first band, with Paul joining on bass soon after. Paul was the only person they knew who owned a car. They also thought he was a top bloke, and so without mentioning the car caveat, the three miscreants cajoled Paul into buying a bass guitar and an amplifier. They called themselves <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">&lsquo;Blackstone Edge&rsquo;</a> and they were bloody rubbish. All they needed was a keyboard player to crown their musical ineptitude.</p>
- <p>Simon&rsquo;s younger brother Jem was 14 when he received his first keyboard (a Casio home synth which he put through a flanger pedal to make it sound cosmic). Jem was initially invited to rehearsals to hold the lyrics up for Jim to sing from while the rest of the band played. It soon became obvious to the guys that Jem's talents were wasted as a music stand and so he was invited into the band. This line up survived for a few months before Nick Denville left to live a happier and entirely more melodic life elsewhere.</p>
- <p>Bloody kids.</p>
- <p>The band continued, and Simon relentlessly poured prog music into Jem's head which was immediately absorbed by the young keyboard player. Less than six months later, Jem had learned all of Tony Banks&rsquo; keyboard solos from both Seconds Out and Three Sides Live along with Rick Wakeman's and Patrick Moraz's solos from Yesshows. With Jem's considerable technique, and the band hungry to write original music, the direction of the band was truely set towards progressive rock. The name <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">Blackstone Edge</a> was soon dropped in favour of &lsquo;Freefall Warriors&rsquo; (after a story in a Doctor Who comic) which very quickly contracted simply to <a href="../__imgs/band/history/freefall.jpg" title="Freefall Mk.1" rel="#hist06">&lsquo;Freefall&rsquo;</a> and with the addition of vocalist Andrew Lovatt, the band began to rehearse <a href="../__imgs/band/history/freefallposter.jpg" title="Poster for Freefall's first gig" rel="#hist05">in preparation for live gigs.</a></p>
-
- <p>During this time the band bumped into actor <a href="../__imgs/band/history/tonyaitken.jpg" title="Tony Aitken" rel="#hist07">Tony Aitken</a> who had worked during his less successful years as a supply teacher at Jim and Simon&rsquo;s school in the 70&rsquo;s. Tony was looking for musicians to back him in a covers band, and the guys duly offered their services (even though they then had no live experience whatsoever). The arrangement worked so well that they kept the band going for over a decade and it was there, working the pubs and clubs of southern England, that they learned the musical chops that would serve them so well in later years.</p>
- <p>In parallel to their function band work, Freefall practice/writing sessions continued. As luck would have it, IQ rehearsed in the studio next door to them, and on the back of their first gig, attended by IQ&rsquo;s then manager, they managed to land the support slot at IQ&rsquo;s Christmas show <a href="../__imgs/band/history/freefallmarquee.jpg" title="Freefall at the Marquee" rel="#hist08">at the Marquee Club in London. Gulp.</a></p>
- <p>Thankfully, the band hit it off immediately with the crowd and soon managed to get a string of gigs with bands like Jadis, Ark, Galahad, Mentaur and Geoff Mann from Twelth Night. Freefall looked as though they were going to make a big impact with the prog community but after an ill-judged attempt to &lsquo;go commercial&rsquo; in the early &lsquo;90s, (Bloody managers!) Jim left the band and the remaining members recruited a very nice gentleman called <a href="../__imgs/band/history/johnboyes.jpg" title="and on guitar - Mr. John Boyes!" rel="#hist09">John Boyes</a> on guitar. However, the moment was lost and the band soon fell apart.</p>
-
- <p>Bloody idiots.</p>
- <p>Jim and Jem briefly went on, to form Pop-proggers &ldquo;Charlottes&rsquo; Web&rdquo; before Jem gave up the scene to work for national radio (although Jem's involvement with prog would be re-ignited a decade later with the formation (with John Boyes) of the Prog supergroup Frost*).</p>
- <p>Meanwhile, Simon and Paul formed an acoustic outfit called <a href="../__imgs/band/history/maddogs.jpg" title="Men Are Dead Mk. I" rel="#hist10">&lsquo;Men Are Dead&rsquo;</a> with keyboard player Col Alkins and lyricist/harmonica player Rob Ramsay. Simon had met Rob way back in the early 80&rsquo;s at Richmond College, at the same time Freefall were making their first tentative steps in music. They became good friends and Rob was always involved at some level, either by helping out at gigs or writing the occasional lyric.</p>
-
- <br />
- <p>Men Are Dead began to play gigs on London's open mic scene (where any artist can roll up and play a short set of between two and five songs) and the band proved to be extremely popular with both audience and fellow musos alike. Col left after their first album, but thankfully, Jim once again joined up with Simon and Paul as a second guitarist, along with <a href="../__imgs/band/history/wayne.jpg" title="Wayne caught in the headlights" rel="#hist12">Wayne Collier</a>, an extraordinary drummer who played in almost every band in West London. <a href="../__imgs/band/history/menaredead.jpg" title="Men Are Dead Mk. II" rel="#hist11">What evolved was a prototype Tinyfish</a> sound and much of the band&rsquo;s current style comes from these early twin guitar shows.</p>
- <p>The millennium came and went, and so did the name &lsquo;Men Are Dead&rsquo;. In came Simon&rsquo;s alter ego &lsquo;Simon Walsh&rsquo;, a <em>nom-de-guerre</em> he still uses today when playing solo acoustic gigs. Whilst notching up appearances in the UK, Germany, France, Estonia and America, they recruited a third guitarist <a href="../__imgs/band/history/hw1.jpg" title="Tim solos at the Hope and Anchor" rel="#hist13">(Tim Eyles)</a> and all looked rosy (if a little Lynyrd Skynyrd) in the garden. Behind the scenes however, things were not going well with the band. Frustration with the strict definitions of acoustic music imposed by many clubs and venues began to take their toll on both the music and musicians. Their material was becoming more complex and the songs started to push past the three minute mark, as the band's deep-seated prog influences once again made themselves felt.</p>
-
- <p>Finally in the late autumn of 2004, after much soul searching, Simon sent Jim an e-mail suggesting that maybe there was little more they could achieve as an acoustic unit and perhaps they should return to their progressive roots. Jim happily agreed and an invite was duly sent out to both Paul and Rob asking if they would be interested in joining, which thankfully they did.</p>
- <p>Simon disbanded the acoustic band, with Tim Eyles joining the punk-pop band &lsquo;The Random&rsquo; and the four remaining musicians <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">assembled in Simon's loft</a> and began writing and rehearsing. Within six weeks it was obvious that there were real possibilities in the music they were making, but the question as to how to record this new material was causing them concern. None of them could afford to go the professional route, so the decision was made to turn the loft into a studio, and try it themselves.</p>
- <p>Robert had set up Lazy Gun Records several years previously, to promote both Men Are Dead and Simon Walsh, and suggested that this new band join the roster. This gave them complete artistic and financial control of their work. </p>
- <p>Bloody tight bastards.</p>
-
- <p>Finally the subject of the name for the band reared its ugly head. There were thoughts that they could resurrect the name Freefall but that idea was soon discarded. This was a new band, and it deserved a new name (besides, someone else was now using &lsquo;Freefall&rsquo; and they looked bigger and meaner than this band). It was Jim that quipped that they were just tiny fish compared to some of the huge prog bands still out there and within moments the name had stuck.</p>
- <p>The problem remained that they were a man short for playing live shows, but in the studio, that base was covered by Simon who, happily, can play both <a href="../__imgs/band/history/drumkit.jpg" title="Simon's electronic drumkit" rel="#hist15">drums</a> and <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">guitar</a> in equal measure (although not at the same time). Meanwhile, the studio had taken shape and the band had found that familiar progressive chemistry once again. The smiles were back on everybody&rsquo;s faces, and the band had a sound they could work to develop.</p>
- <p>When the talk turned once more to live performances, Jim mentioned that he knew a drummer of many bands, the semi-Italian <a href="../__imgs/band/history/leonstatue.jpg" title="Leon at the kit" rel="#hist16">Leon Camfield</a>, and after a few rehearsals (and many beers) together, Leon (for whom truely progressive music is a long held love (note King Crimson tattoo on arm)) enthusiastically joined to complete the Fab Five.</p>
-
- <p>So here we are in 2010. <a href="../__imgs/band/history/tinyfish1.jpg" title="tinyfish" rel="#hist17">Tinyfish</a> have gigged around the country, released both two albums, a mini-album, and a live album &amp; DVD, and have <a href="../__imgs/band/history/tinyfish2.jpg" title="tinyfish" rel="#hist18">arrived at a destination</a> where they feel at home, and are proud of their journey to this place of better dreams.</p>
- <p class="centre"><a href="../__imgs/band/history/strangestudioshot.jpg" title="a tinyfish close encounter" rel="#hist19">Bloody pretentious tossers.</a></p>
-</div>
-</body>
-</html>
-
diff --git a/libs/bower_components/jScrollPane/issues/12/before_reinit.html b/libs/bower_components/jScrollPane/issues/12/before_reinit.html
deleted file mode 100644
index 458e64530d..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/before_reinit.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<meta name="verify-v1" content="ven67p9fXoMQpbw1icSXo8l+I5Z+upY90LnIqaPDgKo=" />
-<link href="brs_main.css" rel="stylesheet" type="text/css"/>
-<link type="text/css" href="jscrollpane-2b3.css" rel="stylesheet" media="all" />
-<title>The History of Tinyfish</title>
-<!-- compliance patch for microsoft browsers -->
-<!--[if lt IE 8]><script src="../__js/IE8.js" type="text/javascript"></script><![endif]-->
-<script src="http://cdn.jquerytools.org/1.2.2/full/jquery.tools.min.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="jquery.mousewheel.js"></script>
-<script type="text/javascript" src="jscrollpane-2b3.js"></script>
-
-<script language="javascript" type="text/javascript">
-$(function()
-{
- $("#content").jScrollPane({
- showArrows: true,
- autoReinitialise: true
- });
-});
-</script>
-</head>
-<body class="nopage">
-<div id="content">
- <h1>The History of Tinyfish</h1>
- <p>It all began with a pair of broken arms and two dodgy eyes.</p>
- <p>It&rsquo;s 1978, the year that <a href="../__imgs/band/history/schoolboyjim.jpg" title="Jim at school" rel="#hist02">Jim Sanders</a> and <a href="../__imgs/band/history/babysimon.jpg" title="Simon as a baby" rel="#hist01">Simon Godfrey</a> met at school in East Sheen (South London). Although each had been aware of the other since the age of five, the two would have been on nothing more than nodding acquaintance, save for two medical problems that forced them together and would eventually lead to the band we know today as Tinyfish.</p>
-
- <p>Bloody weaklings.</p>
- <p>Jim had been diagnosed with a rare retinal disease which had a good chance of robbing him of his vision, and had recently undergone laser eye surgery. Simon more comedically had broken both arms after falling off a roof, leaving him with seriously weakened joints. As part of their convalescence from their respective surgeries, both boys were excused sports for six months.</p>
- <p>While the rest of the kids kicked the living crap out of each other under the pretence of playing football or rugby, Jim and Simon sat on a low school wall watching the on-field carnage and eyeing one another warily. Initially Simon was the talkative one while Jim sat silently, but as soon as the subject matter turned to music, both began to find some common ground, and the conversation became a two way street.</p>
- <p>Initially, Jim had been a Rock/New Wave fan who loved Thin Lizzy (above all others), but incongruously, also the Skids (who would later become Big Country) and the Rezillos (who wouldn&rsquo;t). Simon on the other hand was a fan of ELO and The Sweet but both agreed that music, and in particular, rock bands, were the bee&rsquo;s knees.</p>
- <p>Around the same time , Simon had struck up a friendship with another boy at school called <a href="../__imgs/band/history/youngpaul.jpg" title="Paul - much younger" rel="#hist03">Paul Worwood</a>, initially during school music lessons. The pair were both big fans of Dungeons and Dragons and would play the game constantly throughout their teenage years.</p>
-
- <p>Bloody geeks.</p>
- <p>As the 70&rsquo;s gave way to the 80&rsquo;s and the three grew to be good friends, Jim drew Simon and Paul towards a new love; heavy metal. Over the next three years, the trio saw every metal band that played at their local venue (The Hammersmith Odeon). While the three saw the likes of Thin Lizzy, Saxon, MSG, Iron Maiden and The Scorpions, their listening tastes also encompassed bands such as Yes, Genesis, King Crimson and Magnum.</p>
- <p>Jim had first played &lsquo;Going For The One&rsquo; by Yes to Simon back in the 70's (Simon rather uncharitably dubbed it &lsquo;f***ing Country &amp; Western&rsquo;. To be fair, Jim told Simon not to bother with Jethro Tull, as he thought they were arse... without actually having ever heard them. Twit.). Jim persevered however, and when he spun &lsquo;A Farewell To Kings&rsquo; by Rush in an afternoon listening session, Simon was well and truly hooked. He now also likes Yes very much. Hah! Jim now also likes Jethro Tull. Hah! Hah!</p>
-
- <p>During their time at Richmond College (South West London), Jim and Simon met guitarist Nick Denville, and formed their first band, with Paul joining on bass soon after. Paul was the only person they knew who owned a car. They also thought he was a top bloke, and so without mentioning the car caveat, the three miscreants cajoled Paul into buying a bass guitar and an amplifier. They called themselves <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">&lsquo;Blackstone Edge&rsquo;</a> and they were bloody rubbish. All they needed was a keyboard player to crown their musical ineptitude.</p>
- <p>Simon&rsquo;s younger brother Jem was 14 when he received his first keyboard (a Casio home synth which he put through a flanger pedal to make it sound cosmic). Jem was initially invited to rehearsals to hold the lyrics up for Jim to sing from while the rest of the band played. It soon became obvious to the guys that Jem's talents were wasted as a music stand and so he was invited into the band. This line up survived for a few months before Nick Denville left to live a happier and entirely more melodic life elsewhere.</p>
- <p>Bloody kids.</p>
- <p>The band continued, and Simon relentlessly poured prog music into Jem's head which was immediately absorbed by the young keyboard player. Less than six months later, Jem had learned all of Tony Banks&rsquo; keyboard solos from both Seconds Out and Three Sides Live along with Rick Wakeman's and Patrick Moraz's solos from Yesshows. With Jem's considerable technique, and the band hungry to write original music, the direction of the band was truely set towards progressive rock. The name <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">Blackstone Edge</a> was soon dropped in favour of &lsquo;Freefall Warriors&rsquo; (after a story in a Doctor Who comic) which very quickly contracted simply to <a href="../__imgs/band/history/freefall.jpg" title="Freefall Mk.1" rel="#hist06">&lsquo;Freefall&rsquo;</a> and with the addition of vocalist Andrew Lovatt, the band began to rehearse <a href="../__imgs/band/history/freefallposter.jpg" title="Poster for Freefall's first gig" rel="#hist05">in preparation for live gigs.</a></p>
-
- <p>During this time the band bumped into actor <a href="../__imgs/band/history/tonyaitken.jpg" title="Tony Aitken" rel="#hist07">Tony Aitken</a> who had worked during his less successful years as a supply teacher at Jim and Simon&rsquo;s school in the 70&rsquo;s. Tony was looking for musicians to back him in a covers band, and the guys duly offered their services (even though they then had no live experience whatsoever). The arrangement worked so well that they kept the band going for over a decade and it was there, working the pubs and clubs of southern England, that they learned the musical chops that would serve them so well in later years.</p>
- <p>In parallel to their function band work, Freefall practice/writing sessions continued. As luck would have it, IQ rehearsed in the studio next door to them, and on the back of their first gig, attended by IQ&rsquo;s then manager, they managed to land the support slot at IQ&rsquo;s Christmas show <a href="../__imgs/band/history/freefallmarquee.jpg" title="Freefall at the Marquee" rel="#hist08">at the Marquee Club in London. Gulp.</a></p>
- <p>Thankfully, the band hit it off immediately with the crowd and soon managed to get a string of gigs with bands like Jadis, Ark, Galahad, Mentaur and Geoff Mann from Twelth Night. Freefall looked as though they were going to make a big impact with the prog community but after an ill-judged attempt to &lsquo;go commercial&rsquo; in the early &lsquo;90s, (Bloody managers!) Jim left the band and the remaining members recruited a very nice gentleman called <a href="../__imgs/band/history/johnboyes.jpg" title="and on guitar - Mr. John Boyes!" rel="#hist09">John Boyes</a> on guitar. However, the moment was lost and the band soon fell apart.</p>
-
- <p>Bloody idiots.</p>
- <p>Jim and Jem briefly went on, to form Pop-proggers &ldquo;Charlottes&rsquo; Web&rdquo; before Jem gave up the scene to work for national radio (although Jem's involvement with prog would be re-ignited a decade later with the formation (with John Boyes) of the Prog supergroup Frost*).</p>
- <p>Meanwhile, Simon and Paul formed an acoustic outfit called <a href="../__imgs/band/history/maddogs.jpg" title="Men Are Dead Mk. I" rel="#hist10">&lsquo;Men Are Dead&rsquo;</a> with keyboard player Col Alkins and lyricist/harmonica player Rob Ramsay. Simon had met Rob way back in the early 80&rsquo;s at Richmond College, at the same time Freefall were making their first tentative steps in music. They became good friends and Rob was always involved at some level, either by helping out at gigs or writing the occasional lyric.</p>
-
- <br />
- <p>Men Are Dead began to play gigs on London's open mic scene (where any artist can roll up and play a short set of between two and five songs) and the band proved to be extremely popular with both audience and fellow musos alike. Col left after their first album, but thankfully, Jim once again joined up with Simon and Paul as a second guitarist, along with <a href="../__imgs/band/history/wayne.jpg" title="Wayne caught in the headlights" rel="#hist12">Wayne Collier</a>, an extraordinary drummer who played in almost every band in West London. <a href="../__imgs/band/history/menaredead.jpg" title="Men Are Dead Mk. II" rel="#hist11">What evolved was a prototype Tinyfish</a> sound and much of the band&rsquo;s current style comes from these early twin guitar shows.</p>
- <p>The millennium came and went, and so did the name &lsquo;Men Are Dead&rsquo;. In came Simon&rsquo;s alter ego &lsquo;Simon Walsh&rsquo;, a <em>nom-de-guerre</em> he still uses today when playing solo acoustic gigs. Whilst notching up appearances in the UK, Germany, France, Estonia and America, they recruited a third guitarist <a href="../__imgs/band/history/hw1.jpg" title="Tim solos at the Hope and Anchor" rel="#hist13">(Tim Eyles)</a> and all looked rosy (if a little Lynyrd Skynyrd) in the garden. Behind the scenes however, things were not going well with the band. Frustration with the strict definitions of acoustic music imposed by many clubs and venues began to take their toll on both the music and musicians. Their material was becoming more complex and the songs started to push past the three minute mark, as the band's deep-seated prog influences once again made themselves felt.</p>
-
- <p>Finally in the late autumn of 2004, after much soul searching, Simon sent Jim an e-mail suggesting that maybe there was little more they could achieve as an acoustic unit and perhaps they should return to their progressive roots. Jim happily agreed and an invite was duly sent out to both Paul and Rob asking if they would be interested in joining, which thankfully they did.</p>
- <p>Simon disbanded the acoustic band, with Tim Eyles joining the punk-pop band &lsquo;The Random&rsquo; and the four remaining musicians <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">assembled in Simon's loft</a> and began writing and rehearsing. Within six weeks it was obvious that there were real possibilities in the music they were making, but the question as to how to record this new material was causing them concern. None of them could afford to go the professional route, so the decision was made to turn the loft into a studio, and try it themselves.</p>
- <p>Robert had set up Lazy Gun Records several years previously, to promote both Men Are Dead and Simon Walsh, and suggested that this new band join the roster. This gave them complete artistic and financial control of their work. </p>
- <p>Bloody tight bastards.</p>
-
- <p>Finally the subject of the name for the band reared its ugly head. There were thoughts that they could resurrect the name Freefall but that idea was soon discarded. This was a new band, and it deserved a new name (besides, someone else was now using &lsquo;Freefall&rsquo; and they looked bigger and meaner than this band). It was Jim that quipped that they were just tiny fish compared to some of the huge prog bands still out there and within moments the name had stuck.</p>
- <p>The problem remained that they were a man short for playing live shows, but in the studio, that base was covered by Simon who, happily, can play both <a href="../__imgs/band/history/drumkit.jpg" title="Simon's electronic drumkit" rel="#hist15">drums</a> and <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">guitar</a> in equal measure (although not at the same time). Meanwhile, the studio had taken shape and the band had found that familiar progressive chemistry once again. The smiles were back on everybody&rsquo;s faces, and the band had a sound they could work to develop.</p>
- <p>When the talk turned once more to live performances, Jim mentioned that he knew a drummer of many bands, the semi-Italian <a href="../__imgs/band/history/leonstatue.jpg" title="Leon at the kit" rel="#hist16">Leon Camfield</a>, and after a few rehearsals (and many beers) together, Leon (for whom truely progressive music is a long held love (note King Crimson tattoo on arm)) enthusiastically joined to complete the Fab Five.</p>
-
- <p>So here we are in 2010. <a href="../__imgs/band/history/tinyfish1.jpg" title="tinyfish" rel="#hist17">Tinyfish</a> have gigged around the country, released both two albums, a mini-album, and a live album &amp; DVD, and have <a href="../__imgs/band/history/tinyfish2.jpg" title="tinyfish" rel="#hist18">arrived at a destination</a> where they feel at home, and are proud of their journey to this place of better dreams.</p>
- <p class="centre"><a href="../__imgs/band/history/strangestudioshot.jpg" title="a tinyfish close encounter" rel="#hist19">Bloody pretentious tossers.</a></p>
-</div>
-</body>
-</html>
-
diff --git a/libs/bower_components/jScrollPane/issues/12/brs_main.css b/libs/bower_components/jScrollPane/issues/12/brs_main.css
deleted file mode 100644
index d4bf825511..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/brs_main.css
+++ /dev/null
@@ -1,301 +0,0 @@
-@charset "utf-8";
-/* CSS Document */
-@font-face {
- font-family: 'HelveticaNeueThin';
- src: url('helveticaneue-thin-webfont.eot');
- src: local(''), url('helveticaneue-thin-webfont.woff') format('woff'), url('helveticaneue-thin-webfont.ttf') format('truetype'), url('helveticaneue-thin-webfont.svg#webfont2SG3yTkB') format('svg');
- font-weight: normal;
- font-style: normal;
- font-variant: normal;
-}
-
-body {
- font-family: 'HelveticaNeueThin',Helvetica,Arial,sans-serif;
- font-weight: normal;
- font-style: normal;
- line-height: normal;
- font-size-adjust: 0.51;
- margin: 0px;
- color: #fff;
- background-color: #000;
- overflow:hidden;
-}
-
-P, A {
- font-size: 1em;
- line-height: 1.2em;
-}
-
-P {
- text-align: justify;
- margin-bottom: 1.0em;
-}
-
-a:active {color:#e0262f; text-decoration: none;} /* selected link */
-a:visited {color:#c62128; text-decoration: none;} /* visited link */
-a:link {color:#d2232a; text-decoration: none;} /* unvisited link */
-a:hover {color:#df262e; text-decoration: underline;} /* mouse over link */
-
-LI LI, LI LI A, TD, TD P, BLOCKQUOTE P {
- font-size: 1em;
- line-height: 1.2em;
-}
-
-TABLE {
- border: none;
-}
-
-TD {
- vertical-align: top;
- padding: 0px;
-}
-
-A {
- outline: none;
-}
-
-A IMG {
- border: none;
-}
-
-object { outline:none; }
-
-.red {
- color: #d2232a;
-}
-
-STRONG {
- color: #d2232a;
- font-weight: bold;
-}
-
-h1,h2,h3,h4,h5 {
- color: #d2232a;
-}
-
-h1 {
- font-size: 1.6em;
- font-weight: normal;
- font-style: normal;
- margin-top: 0.5em;
- margin-bottom: 0.5em;
-}
-
-h2 {
- font-size: 1.3em;
- font-weight: normal;
- font-style: italic;
- margin-top: 0.8em;
- margin-bottom: 0px;
-}
-
-h5 {
- font-size: 0.8em;
- margin: 0.5em 0px 0px 0px;
-}
-
-hr {
- color: #ff0000;
-}
-
-/* ----------------- begin supersize --------------------- */
-
-#loading {
- position: absolute;
- top: 49.5%;
- left: 49.5%;
- z-index: 5;
- width: 24px;
- height: 24px;
- text-indent: -999em;
- background-image: url('../__imgs/furn/loading.gif');
-}
-
-#supersize {
- position:fixed;
-}
-
-#supersize img, #supersize a {
- height:100%;
- width:100%;
- position:absolute;
- z-index: 0;
-}
-
-#supersize img {
- image-rendering: optimizeQuality; /* Firefox 3.6+; default behavior is identical, no need to specify */
- -ms-interpolation-mode: bicubic; /* Internet Explorer 7.0; default in IE8+ */
-}
-
-#supersize .prevslide, #supersize .prevslide img {
- z-index: 1;
-}
-
-#supersize .activeslide, #supersize .activeslide img {
- z-index: 2;
-}
-
-/* ------------------ end supersize ---------------------- */
-
-/* ------------------- begin header ---------------------- */
-
-#header {
- position: absolute;
- top: 15px;
- width: 100%;
- margin: 0px auto;
- z-index: 4;
- text-align: center;
-}
-
-#header p {
- text-align: center;
- margin-top: 0.5em;
- }
-
-/* -------------------- end header ----------------------- */
-
-/* ------------------- begin content --------------------- */
-
-#content {
- z-index: 3;
- background-color: #000;
- background-color: rgba(0,0,0,0.9);
- position: absolute;
- left: 0px;
- bottom: 17%;
- height: 62%;
- width: 45%;
- border: 1px solid #555;
- border-left: 0px;
- padding: 0px;
- padding-left: 30px;
- padding-right: 20px;
- overflow: auto;
-}
-
-.frontpage #content {
- visibility: hidden;
-}
-
-.gallerypage #content {
- border: none;
- width: 100%;
- height: 33em;
- bottom: 15%;
- padding: 0px;
- margin: 0px;
-}
-
-.gallerypage #content p {
- text-align: center;
-}
-
-.videopage #content {
- border: none;
- width: 100%;
- height: 65%;
- bottom: 15%;
- padding: 0px;
- margin: 0px;
-}
-
-.videopage #content p {
- text-align: center;
-}
-
-
-/* -------------------- end content ---------------------- */
-
-/* ----------------- begin navigation -------------------- */
-
-#navigate {
- position: absolute;
- height: 4em;
- width: 100%;
- padding: 0px;
- margin: 0px auto;
- bottom: 5%;
- z-index: 3;
- background-color: #000;
- background-color: rgba(0,0,0,0.9);
- border: 1px solid #555;
- border-left: 0px;
- border-right: 0px;
-}
-
-#nav, #nav ul {
- margin: 0px;
- padding: 0px;
- list-style-type: none;
- list-style-position: outside;
- position: relative;
- line-height: 1.6em;
-}
-
-#nav {
- padding: 0.4em;
-}
-
-#nav a {
- display: block;
- height: 1.6em;
- padding: 0px 10px;
- text-decoration:none;
- line-height: 1.6em;
- background-color: #000;
- background-color: rgba(0,0,0,0.9); /* bug in Opera!!! */
-}
-
-#nav a:link, #nav a:active, #nav a:visited {
- color: #fff;
-}
-
-#nav a:hover {
- color: #d2232a;
-}
-
-#nav li {
- float: left;
- font-size: 1em;
- line-height: 1.6em;
-}
-
-#nav ul {
- position:absolute;
- display: none;
-}
-
-#nav ul li a {
- float: left;
- font-size: 1em;
- line-height: 1.6em;
-}
-
-#nav li:hover ul ul, #nav li:hover ul ul ul, #nav li:hover ul ul ul ul {
- display: none;
-}
-
-#nav li:hover ul, #nav li li:hover ul, #nav li li li:hover ul, #nav li li li li:hover ul {
- display: block;
- height: 1.6em;
-}
-
-/* ------------------ end navigation --------------------- */
-
-/* ------------------ begin viewcart --------------------- */
-
-#viewcart {
- z-index: 4;
- background-color: #000;
- background-color: rgba(0,0,0,0.9);
- position: absolute;
- right: 10px;
- bottom: 5.5%;
- height: 51px;
- width: 130px;
- padding: 0px;
- overflow: hidden;
-}
-
-/* ------------------- end viewcart ---------------------- */
diff --git a/libs/bower_components/jScrollPane/issues/12/index.html b/libs/bower_components/jScrollPane/issues/12/index.html
deleted file mode 100644
index 9a6f32c8e7..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/index.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - issue 12</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="../../style/demo.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="../../script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="../../image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="../../index.html">Home</a></li>
- <li><a href="../../index.html#examples">Examples</a></li>
- <li><a href="../../index.html#themes">Themes</a></li>
- <li><a href="../../index.html#usage">How to use</a></li>
- <li><a href="../../faqs.html">FAQs</a></li>
- <li><a href="../../known_issues.html">Known issues</a></li>
- <li><a href="../../index.html#support">Support</a></li>
- <li><a href="../../index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - issue 12</h1>
- <p>
- This page demonstrates the bug described in <a href="http://github.com/vitch/jScrollPane/issues#issue/12">
- issue 12</a> as reported (with nice striped down test cases) by
- <a href="http://groups.google.com/group/jscrollpane/browse_thread/thread/98efa9ded76d5729">TinyFish</a>.
- </p>
- <ul class="link-list">
- <li>
- <a href="before.html">Before</a> - showing the bug as it appears in the version of jScrollPane which
- was current when it was reported.
- </li>
- <li>
- <a href="native.html">Native</a> - showing how the page looks with native scrollbars (i.e. if
- jScrollPane isn't initialised).
- </li>
- <li>
- <a href="after.html">After</a> - showing the page which was displaying the bug with the latest
- version of jScrollPane.
- </li>
- </ul>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/12/jquery.mousewheel.js b/libs/bower_components/jScrollPane/issues/12/jquery.mousewheel.js
deleted file mode 100644
index 27ed2f102f..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/jquery.mousewheel.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net)
- * Licensed under the MIT License (LICENSE.txt).
- *
- * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
- * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
- * Thanks to: Seamus Leahy for adding deltaX and deltaY
- *
- * Version: 3.0.3
- *
- * Requires: 1.2.2+
- */
-
-(function($) {
-
-var types = ['DOMMouseScroll', 'mousewheel'];
-
-$.event.special.mousewheel = {
- setup: function() {
- if ( this.addEventListener ) {
- for ( var i=types.length; i; ) {
- this.addEventListener( types[--i], handler, false );
- }
- } else {
- this.onmousewheel = handler;
- }
- },
-
- teardown: function() {
- if ( this.removeEventListener ) {
- for ( var i=types.length; i; ) {
- this.removeEventListener( types[--i], handler, false );
- }
- } else {
- this.onmousewheel = null;
- }
- }
-};
-
-$.fn.extend({
- mousewheel: function(fn) {
- return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
- },
-
- unmousewheel: function(fn) {
- return this.unbind("mousewheel", fn);
- }
-});
-
-
-function handler(event) {
- var orgEvent = event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0;
-
- event = $.event.fix(event || window.event);
- event.type = "mousewheel";
-
- // Old school scrollwheel delta
- if ( event.wheelDelta ) { delta = event.wheelDelta/120; }
- if ( event.detail ) { delta = -event.detail/3; }
-
- // New school multidimensional scroll (touchpads) deltas
- deltaY = delta;
-
- // Gecko
- if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
- deltaY = 0;
- deltaX = -1*delta;
- }
-
- // Webkit
- if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; }
- if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; }
-
- // Add event and delta to the front of the arguments
- args.unshift(event, delta, deltaX, deltaY);
-
- return $.event.handle.apply(this, args);
-}
-
-})(jQuery); \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/12/jscrollpane-2b3.css b/libs/bower_components/jScrollPane/issues/12/jscrollpane-2b3.css
deleted file mode 100644
index 4b91ece526..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/jscrollpane-2b3.css
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * CSS Styles that are needed by jScrollPane for it to operate correctly.
- *
- * Include this stylesheet in your site or copy and paste the styles below into your stylesheet - jScrollPane
- * may not operate correctly without them.
- */
-
-.jspContainer
-{
- overflow: hidden;
- position: relative;
-}
-
-.jspPane
-{
- position: absolute;
-}
-
-.jspVerticalBar
-{
- position: absolute;
- top: 0;
- right: 0;
- width: 16px;
- height: 100%;
- background: red;
-}
-
-.jspHorizontalBar
-{
- position: absolute;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 16px;
- background: red;
-}
-
-.jspVerticalBar *,
-.jspHorizontalBar *
-{
- margin: 0;
- padding: 0;
-}
-
-.jspCap
-{
- display: none;
-}
-
-.jspHorizontalBar .jspCap
-{
- float: left;
-}
-
-.jspTrack
-{
- background: #000 url(../__imgs/furn/track.gif) repeat-y center;
- position: relative;
-}
-
-.jspDrag
-{
- background: #666;
- border: solid #aaa 2px;
- position: relative;
- top: 0;
- left: 0;
- cursor: pointer;
-}
-
-.jspHorizontalBar .jspTrack,
-.jspHorizontalBar .jspDrag
-{
- float: left;
- height: 100%;
-}
-
-.jspArrow
-{
- background-color: rgba(0,0,0,0.9);
- text-indent: -20000px;
- display: block;
- cursor: pointer;
-}
-
-.jspArrowUp
-{
- background-image: url("../__imgs/furn/arrow_up.gif");
-}
-
-.jspArrowDown
-{
- background-image: url("../__imgs/furn/arrow_down.gif");
-}
-
-.jspArrow.jspDisabled
-{
- cursor: default;
- background: #80808d;
-}
-
-.jspArrowUp.jspDisabled
-{
- cursor: default;
- background-image: url("../__imgs/furn/arrow_up.gif");
-}
-
-.jspArrowDown.jspDisabled
-{
- cursor: default;
- background-image: url("../__imgs/furn/arrow_down.gif");
-}
-
-.jspVerticalBar .jspArrow
-{
- height: 16px;
-}
-
-.jspHorizontalBar .jspArrow
-{
- width: 16px;
- float: left;
- height: 100%;
-}
-
-.jspVerticalBar .jspArrow:focus
-{
- outline: none;
-}
-
-.jspCorner
-{
- background: #eeeef4;
- float: left;
- height: 100%;
-}
-
-/* Yuk! CSS Hack for IE6 3 pixel bug :( */
-* html .jspCorner
-{
- margin: 0 -3px 0 0;
-} \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/12/jscrollpane-2b3.js b/libs/bower_components/jScrollPane/issues/12/jscrollpane-2b3.js
deleted file mode 100644
index b87f97e107..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/jscrollpane-2b3.js
+++ /dev/null
@@ -1,1063 +0,0 @@
-/*!
- * jScrollPane - v2.0.0beta3 - 2010-08-27
- * http://jscrollpane.kelvinluck.com/
- *
- * Copyright (c) 2010 Kelvin Luck
- * Dual licensed under the MIT or GPL licenses.
- */
-
-// Script: jScrollPane - cross browser customisable scrollbars
-//
-// *Version: 2.0.0beta3, Last updated: 2010-08-27*
-//
-// Project Home - http://jscrollpane.kelvinluck.com/
-// GitHub - http://github.com/vitch/jScrollPane
-// Source - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.js
-// (Minified) - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.min.js
-//
-// About: License
-//
-// Copyright (c) 2010 Kelvin Luck
-// Dual licensed under the MIT or GPL Version 2 licenses.
-// http://jscrollpane.kelvinluck.com/MIT-LICENSE.txt
-// http://jscrollpane.kelvinluck.com/GPL-LICENSE.txt
-//
-// About: Examples
-//
-// All examples and demos are available through the jScrollPane example site at:
-// http://jscrollpane.kelvinluck.com/
-//
-// About: Support and Testing
-//
-// This plugin is tested on the browsers below and has been found to work reliably on them. If you run
-// into a problem on one of the supported browsers then please visit the support section on the jScrollPane
-// website (http://jscrollpane.kelvinluck.com/) for more information on getting support. You are also
-// welcome to fork the project on GitHub if you can contribute a fix for a given issue.
-//
-// jQuery Versions - 1.4.2
-// Browsers Tested - Firefox 3.6.8, Safari 5, Opera 10.6, Chrome 5.0, IE 6, 7, 8
-//
-// About: Release History
-//
-// 2.0.0beta3 - (2010-08-27) Horizontal mousewheel, mwheelIntent, keyboard support, bug fixes
-// 2.0.0beta2 - (2010-08-21) Bug fixes
-// 2.0.0beta1 - (2010-08-17) Rewrite to follow modern best practices and enable horizontal scrolling, initially hidden
-// elements and dynamically sized elements.
-// 1.x - (2006-12-31 - 2010-07-31) Initial version, hosted at googlecode, deprecated
-
-(function($,window,undefined){
-
- $.fn.jScrollPane = function(settings)
- {
- // JScrollPane "class" - public methods are available through $('selector').data('jsp')
- function JScrollPane(elem, s)
- {
-
- var settings, jsp = this, pane, paneWidth, paneHeight, container, contentWidth, contentHeight,
- percentInViewH, percentInViewV, isScrollableV, isScrollableH, verticalDrag, dragMaxY,
- verticalDragPosition, horizontalDrag, dragMaxX, horizontalDragPosition,
- verticalBar, verticalTrack, scrollbarWidth, verticalTrackHeight, verticalDragHeight, arrowUp, arrowDown,
- horizontalBar, horizontalTrack, horizontalTrackWidth, horizontalDragWidth, arrowLeft, arrowRight,
- reinitialiseInterval, originalPadding, originalPaddingTotalWidth, previousPaneWidth,
- wasAtTop = true, wasAtLeft = true, wasAtBottom = false, wasAtRight = false,
- mwEvent = $.fn.mwheelIntent ? 'mwheelIntent.jsp' : 'mousewheel.jsp';
-
- originalPadding = elem.css('paddingTop') + ' ' +
- elem.css('paddingRight') + ' ' +
- elem.css('paddingBottom') + ' ' +
- elem.css('paddingLeft');
- originalPaddingTotalWidth = (parseInt(elem.css('paddingLeft')) || 0) +
- (parseInt(elem.css('paddingRight')) || 0);
-
- initialise(s);
-
- function initialise(s)
- {
-
- var clonedElem, tempWrapper, /*firstChild, lastChild, */isMaintainingPositon, lastContentX, lastContentY,
- hasContainingSpaceChanged;
-
- settings = s;
-
- if (pane == undefined) {
-
- elem.css(
- {
- 'overflow': 'hidden',
- 'padding': 0
- }
- );
- // TODO: Deal with where width/ height is 0 as it probably means the element is hidden and we should
- // come back to it later and check once it is unhidden...
- paneWidth = elem.innerWidth() + originalPaddingTotalWidth;
- paneHeight = elem.innerHeight();
-
- elem.width(paneWidth);
-
- pane = $('<div class="jspPane" />').wrap(
- $('<div class="jspContainer" />')
- .css({
- 'width': paneWidth + 'px',
- 'height': paneHeight + 'px'
- }
- )
- );
-
- elem.wrapInner(pane.parent());
- // Need to get the vars after being added to the document, otherwise they reference weird
- // disconnected orphan elements...
- container = elem.find('>.jspContainer');
- pane = container.find('>.jspPane');
- pane.css('padding', originalPadding);
-
- /*
- // Move any margins from the first and last children up to the container so they can still
- // collapse with neighbouring elements as they would before jScrollPane
- firstChild = pane.find(':first-child');
- lastChild = pane.find(':last-child');
- elem.css(
- {
- 'margin-top': firstChild.css('margin-top'),
- 'margin-bottom': lastChild.css('margin-bottom')
- }
- );
- firstChild.css('margin-top', 0);
- lastChild.css('margin-bottom', 0);
- */
- } else {
-
- elem.css('width', null);
-
- hasContainingSpaceChanged = elem.outerWidth() + originalPaddingTotalWidth != paneWidth || elem.outerHeight() != paneHeight;
-
- if (hasContainingSpaceChanged) {
- paneWidth = elem.innerWidth() + originalPaddingTotalWidth;
- paneHeight = elem.innerHeight();
- container.css({
- 'width': paneWidth + 'px',
- 'height': paneHeight + 'px'
- });
- }
-
- previousPaneWidth = pane.innerWidth();
-
- if (!hasContainingSpaceChanged && pane.outerWidth() == contentWidth && pane.outerHeight() == contentHeight) {
- // Nothing has changed since we last initialised
- if (isScrollableH || isScrollableV) { // If we had already set a width then re-set it
- pane.css('width', previousPaneWidth + 'px');
- elem.css('width', (previousPaneWidth + originalPaddingTotalWidth) + 'px');
- }
- // Then abort...
- return;
- }
-
- pane.css('width', null);
- elem.css('width', (paneWidth + originalPaddingTotalWidth) + 'px');
-
- container.find('>.jspVerticalBar,>.jspHorizontalBar').remove().end();
- }
-
- // Unfortunately it isn't that easy to find out the width of the element as it will always report the
- // width as allowed by its container, regardless of overflow settings.
- // A cunning workaround is to clone the element, set its position to absolute and place it in a narrow
- // container. Now it will push outwards to its maxium real width...
- clonedElem = pane.clone().css('position', 'absolute');
- tempWrapper = $('<div style="width:1px; position: relative;" />').append(clonedElem);
- $('body').append(tempWrapper);
- contentWidth = Math.max(pane.outerWidth(), clonedElem.outerWidth());
- tempWrapper.remove();
-
- contentHeight = pane.outerHeight(true);
- /*alert(contentHeight); */
- percentInViewH = contentWidth / paneWidth;
- percentInViewV = contentHeight / paneHeight;
- isScrollableV = percentInViewV > 1;
-
- isScrollableH = percentInViewH > 1;
-
- //console.log(paneWidth, paneHeight, contentWidth, contentHeight, percentInViewH, percentInViewV, isScrollableH, isScrollableV);
-
- if (!(isScrollableH || isScrollableV)) {
- elem.removeClass('jspScrollable');
- pane.css({
- 'top': 0,
- 'width': container.width() + 'px'
- });
- removeMousewheel();
- removeFocusHandler();
- removeKeyboardNav();
- unhijackInternalLinks();
- } else {
- elem.addClass('jspScrollable');
-
- isMaintainingPositon = settings.maintainPosition && (verticalDragPosition || horizontalDragPosition);
- if (isMaintainingPositon) {
- lastContentX = contentPositionX();
- lastContentY = contentPositionY();
- }
-
- initialiseVerticalScroll();
- initialiseHorizontalScroll();
- resizeScrollbars();
-
- if (isMaintainingPositon) {
- scrollToX(lastContentX);
- scrollToY(lastContentY);
- }
-
- initFocusHandler();
- initMousewheel();
- if (settings.enableKeyboardNavigation) {
- initKeyboardNav();
- }
-
- observeHash();
- if (settings.hijackInternalLinks) {
- hijackInternalLinks();
- }
- }
-
- if (settings.autoReinitialise && !reinitialiseInterval) {
- reinitialiseInterval = setInterval(
- function()
- {
- initialise(settings);
- },
- settings.autoReinitialiseDelay
- );
- } else if (!settings.autoReinitialise && reinitialiseInterval) {
- clearInterval(reinitialiseInterval)
- }
-
- elem.trigger('jsp-initialised', [isScrollableH || isScrollableV]);
- }
-
- function initialiseVerticalScroll()
- {
- if (isScrollableV) {
-
- container.append(
- $('<div class="jspVerticalBar" />').append(
- $('<div class="jspCap jspCapTop" />'),
- $('<div class="jspTrack" />').append(
- $('<div class="jspDrag" />').append(
- $('<div class="jspDragTop" />'),
- $('<div class="jspDragBottom" />')
- )
- ),
- $('<div class="jspCap jspCapBottom" />')
- )
- );
-
- verticalBar = container.find('>.jspVerticalBar');
- verticalTrack = verticalBar.find('>.jspTrack');
- verticalDrag = verticalTrack.find('>.jspDrag');
-
- if (settings.showArrows) {
- arrowUp = $('<a class="jspArrow jspArrowUp" />').bind(
- 'mousedown.jsp', getArrowScroll(0, -1)
- ).bind('click.jsp', nil);
- arrowDown = $('<a class="jspArrow jspArrowDown" />').bind(
- 'mousedown.jsp', getArrowScroll(0, 1)
- ).bind('click.jsp', nil);
- if (settings.arrowScrollOnHover) {
- arrowUp.bind('mouseover.jsp', getArrowScroll(0, -1, arrowUp));
- arrowDown.bind('mouseover.jsp', getArrowScroll(0, 1, arrowDown));
- }
-
- appendArrows(verticalTrack, settings.verticalArrowPositions, arrowUp, arrowDown);
- }
-
- verticalTrackHeight = paneHeight;
- container.find('>.jspVerticalBar>.jspCap:visible,>.jspVerticalBar>.jspArrow').each(
- function()
- {
- verticalTrackHeight -= $(this).outerHeight();
- }
- );
-
-
- verticalDrag.hover(
- function()
- {
- verticalDrag.addClass('jspHover');
- },
- function()
- {
- verticalDrag.removeClass('jspHover');
- }
- ).bind(
- 'mousedown.jsp',
- function(e)
- {
- // Stop IE from allowing text selection
- $('html').bind('dragstart.jsp selectstart.jsp', function() { return false; });
-
- verticalDrag.addClass('jspActive');
-
- var startY = e.pageY - verticalDrag.position().top;
-
- $('html').bind(
- 'mousemove.jsp',
- function(e)
- {
- positionDragY(e.pageY - startY, false);
- }
- ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
- return false;
- }
- );
- sizeVerticalScrollbar();
- updateVerticalArrows();
- }
- }
-
- function sizeVerticalScrollbar()
- {
- verticalTrack.height(verticalTrackHeight + 'px');
- verticalDragPosition = 0;
- scrollbarWidth = settings.verticalGutter + verticalTrack.outerWidth();
-
- // Make the pane thinner to allow for the vertical scrollbar
- pane.width(paneWidth - scrollbarWidth - originalPaddingTotalWidth);
-
- // Add margin to the left of the pane if scrollbars are on that side (to position
- // the scrollbar on the left or right set it's left or right property in CSS)
- if (verticalBar.position().left == 0) {
- pane.css('margin-left', scrollbarWidth + 'px');
- }
- }
-
- function initialiseHorizontalScroll()
- {
- if (isScrollableH) {
-
- container.append(
- $('<div class="jspHorizontalBar" />').append(
- $('<div class="jspCap jspCapLeft" />'),
- $('<div class="jspTrack" />').append(
- $('<div class="jspDrag" />').append(
- $('<div class="jspDragLeft" />'),
- $('<div class="jspDragRight" />')
- )
- ),
- $('<div class="jspCap jspCapRight" />')
- )
- );
-
- horizontalBar = container.find('>.jspHorizontalBar');
- horizontalTrack = horizontalBar.find('>.jspTrack');
- horizontalDrag = horizontalTrack.find('>.jspDrag');
-
- if (settings.showArrows) {
- arrowLeft = $('<a class="jspArrow jspArrowLeft" />').bind(
- 'mousedown.jsp', getArrowScroll(-1, 0)
- ).bind('click.jsp', nil);
- arrowRight = $('<a class="jspArrow jspArrowRight" />').bind(
- 'mousedown.jsp', getArrowScroll(1, 0)
- ).bind('click.jsp', nil);
- if (settings.arrowScrollOnHover) {
- arrowLeft.bind('mouseover.jsp', getArrowScroll(-1, 0, arrowLeft));
- arrowRight.bind('mouseover.jsp', getArrowScroll(1, 0, arrowRight));
- }
- appendArrows(horizontalTrack, settings.horizontalArrowPositions, arrowLeft, arrowRight);
- }
-
- horizontalDrag.hover(
- function()
- {
- horizontalDrag.addClass('jspHover');
- },
- function()
- {
- horizontalDrag.removeClass('jspHover');
- }
- ).bind(
- 'mousedown.jsp',
- function(e)
- {
- // Stop IE from allowing text selection
- $('html').bind('dragstart.jsp selectstart.jsp', function() { return false; });
-
- horizontalDrag.addClass('jspActive');
-
- var startX = e.pageX - horizontalDrag.position().left;
-
- $('html').bind(
- 'mousemove.jsp',
- function(e)
- {
- positionDragX(e.pageX - startX, false);
- }
- ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
- return false;
- }
- );
- horizontalTrackWidth = container.innerWidth();
- sizeHorizontalScrollbar();
- updateHorizontalArrows();
- } else {
- // no horizontal scroll
- }
- }
-
- function sizeHorizontalScrollbar()
- {
-
- container.find('>.jspHorizontalBar>.jspCap:visible,>.jspHorizontalBar>.jspArrow').each(
- function()
- {
- horizontalTrackWidth -= $(this).outerWidth();
- }
- );
-
- horizontalTrack.width(horizontalTrackWidth + 'px');
- horizontalDragPosition = 0;
- }
-
- function resizeScrollbars()
- {
- if (isScrollableH && isScrollableV) {
- var horizontalTrackHeight = horizontalTrack.outerHeight(),
- verticalTrackWidth = verticalTrack.outerWidth();
- verticalTrackHeight -= horizontalTrackHeight;
- $(horizontalBar).find('>.jspCap:visible,>.jspArrow').each(
- function()
- {
- horizontalTrackWidth += $(this).outerWidth();
- }
- );
- horizontalTrackWidth -= verticalTrackWidth;
- paneHeight -= verticalTrackWidth;
- paneWidth -= horizontalTrackHeight;
- horizontalTrack.parent().append(
- $('<div class="jspCorner" />').css('width', horizontalTrackHeight + 'px')
- );
- sizeVerticalScrollbar();
- sizeHorizontalScrollbar();
- }
- // reflow content
- if (isScrollableH) {
- pane.width((container.outerWidth() - originalPaddingTotalWidth) + 'px');
- }
- contentHeight = pane.outerHeight();
- percentInViewV = contentHeight / paneHeight;
-
- if (isScrollableH) {
- horizontalDragWidth = 1 / percentInViewH * horizontalTrackWidth;
- if (horizontalDragWidth > settings.horizontalDragMaxWidth) {
- horizontalDragWidth = settings.horizontalDragMaxWidth;
- } else if (horizontalDragWidth < settings.horizontalDragMinWidth) {
- horizontalDragWidth = settings.horizontalDragMinWidth;
- }
- horizontalDrag.width(horizontalDragWidth + 'px');
- dragMaxX = horizontalTrackWidth - horizontalDragWidth;
- }
- if (isScrollableV) {
- verticalDragHeight = 1 / percentInViewV * verticalTrackHeight;
- if (verticalDragHeight > settings.verticalDragMaxHeight) {
- verticalDragHeight = settings.verticalDragMaxHeight;
- } else if (verticalDragHeight < settings.verticalDragMinHeight) {
- verticalDragHeight = settings.verticalDragMinHeight;
- }
- verticalDrag.height(verticalDragHeight + 'px');
- dragMaxY = verticalTrackHeight - verticalDragHeight;
- }
- }
-
- function appendArrows(ele, p, a1, a2)
- {
- var p1 = "before", p2 = "after", aTemp;
-
- // Sniff for mac... Is there a better way to determine whether the arrows would naturally appear
- // at the top or the bottom of the bar?
- if (p == "os") {
- p = /Mac/.test(navigator.platform) ? "after" : "split";
- }
- if (p == p1) {
- p2 = p;
- } else if (p == p2) {
- p1 = p;
- aTemp = a1;
- a1 = a2;
- a2 = aTemp;
- }
-
- ele[p1](a1)[p2](a2);
- }
-
- function getArrowScroll(dirX, dirY, ele) {
- return function()
- {
- arrowScroll(dirX, dirY, this, ele);
- this.blur();
- return false;
- }
- }
-
- function arrowScroll(dirX, dirY, arrow, ele)
- {
- arrow = $(arrow).addClass('jspActive');
-
- var eve, doScroll = function()
- {
- if (dirX != 0) {
- positionDragX(horizontalDragPosition + dirX * settings.arrowButtonSpeed, false);
- }
- if (dirY != 0) {
- positionDragY(verticalDragPosition + dirY * settings.arrowButtonSpeed, false);
- }
- },
- scrollInt = setInterval(doScroll, settings.arrowRepeatFreq);
-
- doScroll();
-
- eve = ele == undefined ? 'mouseup.jsp' : 'mouseout.jsp';
- ele = ele || $('html');
- ele.bind(
- eve,
- function()
- {
- arrow.removeClass('jspActive');
- clearInterval(scrollInt);
- ele.unbind(eve);
- }
- );
- }
-
- function cancelDrag()
- {
- $('html').unbind('dragstart.jsp selectstart.jsp mousemove.jsp mouseup.jsp mouseleave.jsp');
-
- verticalDrag && verticalDrag.removeClass('jspActive');
- horizontalDrag && horizontalDrag.removeClass('jspActive');
- }
-
- function positionDragY(destY, animate)
- {
- if (!isScrollableV) {
- return;
- }
- if (destY < 0) {
- destY = 0;
- } else if (destY > dragMaxY) {
- destY = dragMaxY;
- }
-
- // can't just check if(animate) because false is a valid value that could be passed in...
- if (animate == undefined) {
- animate = settings.animateScroll;
- }
- if (animate) {
- jsp.animate(verticalDrag, 'top', destY, _positionDragY);
- } else {
- verticalDrag.css('top', destY);
- _positionDragY(destY);
- }
-
- }
-
- function _positionDragY(destY)
- {
- if (destY == undefined) {
- destY = verticalDrag.position().top;
- }
-
- container.scrollTop(0);
- verticalDragPosition = destY;
-
- var isAtTop = verticalDragPosition == 0,
- isAtBottom = verticalDragPosition == dragMaxY,
- percentScrolled = destY/ dragMaxY,
- destTop = -percentScrolled * (contentHeight - paneHeight);
-
- if (wasAtTop != isAtTop || wasAtBottom != isAtBottom) {
- wasAtTop = isAtTop;
- wasAtBottom = isAtBottom;
- elem.trigger('jsp-arrow-change', [wasAtTop, wasAtBottom, wasAtLeft, wasAtRight]);
- }
-
- updateVerticalArrows(isAtTop, isAtBottom);
- pane.css('top', destTop);
- elem.trigger('jsp-scroll-y', [-destTop, isAtTop, isAtBottom]);
- }
-
- function positionDragX(destX, animate)
- {
- if (!isScrollableH) {
- return;
- }
- if (destX < 0) {
- destX = 0;
- } else if (destX > dragMaxX) {
- destX = dragMaxX;
- }
-
- if (animate == undefined) {
- animate = settings.animateScroll;
- }
- if (animate) {
- jsp.animate(horizontalDrag, 'left', destX, _positionDragX);
- } else {
- horizontalDrag.css('left', destX);
- _positionDragX(destX);
- }
- }
-
- function _positionDragX(destX)
- {
- if (destX == undefined) {
- destX = horizontalDrag.position().left;
- }
-
- container.scrollTop(0);
- horizontalDragPosition = destX;
-
- var isAtLeft = horizontalDragPosition == 0,
- isAtRight = horizontalDragPosition == dragMaxY,
- percentScrolled = destX / dragMaxX,
- destLeft = -percentScrolled * (contentWidth - paneWidth);
-
- if (wasAtLeft != isAtLeft || wasAtRight != isAtRight) {
- wasAtLeft = isAtLeft;
- wasAtRight = isAtRight;
- elem.trigger('jsp-arrow-change', [wasAtTop, wasAtBottom, wasAtLeft, wasAtRight]);
- }
-
- updateHorizontalArrows(isAtLeft, isAtRight);
- pane.css('left', destLeft);
- elem.trigger('jsp-scroll-x', [-destLeft, isAtLeft, isAtRight]);
- }
-
- function updateVerticalArrows(isAtTop, isAtBottom)
- {
- if (settings.showArrows) {
- arrowUp[isAtTop ? 'addClass' : 'removeClass']('jspDisabled');
- arrowDown[isAtBottom ? 'addClass' : 'removeClass']('jspDisabled');
- }
- }
-
- function updateHorizontalArrows(isAtLeft, isAtRight)
- {
- if (settings.showArrows) {
- arrowLeft[isAtLeft ? 'addClass' : 'removeClass']('jspDisabled');
- arrowRight[isAtRight ? 'addClass' : 'removeClass']('jspDisabled');
- }
- }
-
- function scrollToY(destY, animate)
- {
- var percentScrolled = destY / (contentHeight - paneHeight);
- positionDragY(percentScrolled * dragMaxY, animate);
- }
-
- function scrollToX(destX, animate)
- {
- var percentScrolled = destX / (contentWidth - paneWidth);
- positionDragX(percentScrolled * dragMaxX, animate);
- }
-
- function scrollToElement(ele, stickToTop, animate)
- {
- var e, eleHeight, eleTop = 0, viewportTop, maxVisibleEleTop, destY;
-
- // Legal hash values aren't necessarily legal jQuery selectors so we need to catch any
- // errors from the lookup...
- try {
- e = $(ele);
- } catch (err) {
- return;
- }
- eleHeight = e.outerHeight();
-
- container.scrollTop(0);
-
- // loop through parents adding the offset top of any elements that are relatively positioned between
- // the focused element and the jspPane so we can get the true distance from the top
- // of the focused element to the top of the scrollpane...
- while (!e.is('.jspPane')) {
- eleTop += e.position().top;
- e = e.offsetParent();
- if (/^body|html$/i.test(e[0].nodeName)) {
- // we ended up too high in the document structure. Quit!
- return;
- }
- }
-
-
- viewportTop = contentPositionY();
- maxVisibleEleTop = viewportTop + paneHeight;
- if (eleTop < viewportTop || stickToTop) { // element is above viewport
- destY = eleTop - settings.verticalGutter;
- } else if (eleTop + eleHeight > maxVisibleEleTop) { // element is below viewport
- destY = eleTop - paneHeight + eleHeight + settings.verticalGutter;
- }
- if (destY) {
- scrollToY(destY, animate);
- }
- // TODO: Implement automatic horizontal scrolling?
- }
-
- function contentPositionX()
- {
- return -pane.position().left;
- }
-
- function contentPositionY()
- {
- return -pane.position().top;
- }
-
- function initMousewheel()
- {
- container.unbind(mwEvent).bind(
- mwEvent,
- function (event, delta, deltaX, deltaY) {
- var dX = horizontalDragPosition, dY = verticalDragPosition;
- positionDragX(horizontalDragPosition + deltaX * settings.mouseWheelSpeed, false)
- positionDragY(verticalDragPosition - deltaY * settings.mouseWheelSpeed, false);
- // return true if there was no movement so rest of screen can scroll
- return dX == horizontalDragPosition && dY == verticalDragPosition;
- }
- );
- }
-
- function removeMousewheel()
- {
- container.unbind(mwEvent);
- }
-
- function nil()
- {
- return false;
- }
-
- function initFocusHandler()
- {
- pane.unbind('focusin.jsp').bind(
- 'focusin.jsp',
- function(e)
- {
- if(e.target === pane[0]){return;}
- scrollToElement(e.target, false);
- }
- );
- }
-
- function removeFocusHandler()
- {
-
- pane.unbind('focusin.jsp');
- }
-
- function initKeyboardNav()
- {
- var pressed, pressedTimer;
- elem.attr('tabindex', 0)
- .unbind('keydown.jsp')
- .bind(
- 'keydown.jsp',
- function(e)
- {
- if(e.target !== elem[0]){
- return;
- }
- var dX = horizontalDragPosition, dY = verticalDragPosition, step = pressed ? 2 : 16;
- switch(e.keyCode) {
- case 40: // down
- positionDragY(verticalDragPosition + step, false);
- break;
- case 38: // up
- positionDragY(verticalDragPosition - step, false);
- break;
- case 34: // page down
- case 32: // space
- scrollToY(contentPositionY() + Math.max(32, paneHeight) - 16);
- break;
- case 33: // page up
- scrollToY(contentPositionY() - paneHeight + 16);
- break;
- case 35: // end
- scrollToY(contentHeight - paneHeight);
- break;
- case 36: // home
- scrollToY(0);
- break;
- case 39: // right
- positionDragX(horizontalDragPosition + step, false);
- break;
- case 37: // left
- positionDragX(horizontalDragPosition - step, false);
- break;
- }
-
- if( !(dX == horizontalDragPosition && dY == verticalDragPosition) ){
- pressed = true;
- clearTimeout(pressedTimer);
- pressedTimer = setTimeout(function(){
- pressed = false;
- }, 260);
- return false;
- }
- }
- );
- if(settings.hideFocus) {
- elem.css('outline', 'none');
- if('hideFocus' in container[0]){
- elem.attr('hideFocus', true);
- }
- } else {
- elem.css('outline', '');
- if('hideFocus' in container[0]){
- elem.attr('hideFocus', false);
- }
- }
- }
-
- function removeKeyboardNav()
- {
- elem.attr('tabindex', '-1')
- .removeAttr('tabindex')
- .unbind('keydown.jsp');
- }
-
- function observeHash()
- {
- if (location.hash && location.hash.length > 1) {
- var e, retryInt;
- try {
- e = $(location.hash);
- } catch (err) {
- return;
- }
-
- if (e.length && pane.find(e)) {
- // nasty workaround but it appears to take a little while before the hash has done its thing
- // to the rendered page so we just wait until the container's scrollTop has been messed up.
- if (container.scrollTop() == 0) {
- retryInt = setInterval(
- function()
- {
- if (container.scrollTop() > 0) {
- scrollToElement(location.hash, true);
- $(document).scrollTop(container.position().top);
- clearInterval(retryInt);
- }
- },
- 50
- )
- } else {
- scrollToElement(location.hash, true);
- $(document).scrollTop(container.position().top);
- }
- }
- }
- }
-
- function unhijackInternalLinks()
- {
- $('a.jspHijack').unbind('click.jsp-hijack').removeClass('jspHijack');
- }
-
- function hijackInternalLinks()
- {
- unhijackInternalLinks();
- $('a[href^=#]').addClass('jspHijack').bind(
- 'click.jsp-hijack',
- function()
- {
- var uriParts = this.href.split('#'), hash;
- if (uriParts.length > 1) {
- hash = uriParts[1];
- if (hash.length > 0 && pane.find('#' + hash).length > 0) {
- scrollToElement('#' + hash, true);
- // Need to return false otherwise things mess up... Would be nice to maybe also scroll
- // the window to the top of the scrollpane?
- return false;
- }
- }
- }
- )
- }
-
- // Public API
- $.extend(
- jsp,
- {
- // Reinitialises the scroll pane (if it's internal dimensions have changed since the last time it
- // was initialised). The settings object which is passed in will override any settings from the
- // previous time it was initialised - if you don't pass any settings then the ones from the previous
- // initialisation will be used.
- reinitialise: function(s)
- {
- s = $.extend({}, s, settings);
- initialise(s);
- },
- // Scrolls the specified element (a jQuery object, DOM node or jQuery selector string) into view so
- // that it can be seen within the viewport. If stickToTop is true then the element will appear at
- // the top of the viewport, if it is false then the viewport will scroll as little as possible to
- // show the element. You can also specify if you want animation to occur. If you don't provide this
- // argument then the animateScroll value from the settings object is used instead.
- scrollToElement: function(ele, stickToTop, animate)
- {
- scrollToElement(ele, stickToTop, animate);
- },
- // Scrolls the pane so that the specified co-ordinates within the content are at the top left
- // of the viewport. animate is optional and if not passed then the value of animateScroll from
- // the settings object this jScrollPane was initialised with is used.
- scrollTo: function(destX, destY, animate)
- {
- scrollToX(destX, animate);
- scrollToY(destY, animate);
- },
- // Scrolls the pane so that the specified co-ordinate within the content is at the left of the
- // viewport. animate is optional and if not passed then the value of animateScroll from the settings
- // object this jScrollPane was initialised with is used.
- scrollToX: function(destX, animate)
- {
- scrollToX(destX, animate);
- },
- // Scrolls the pane so that the specified co-ordinate within the content is at the top of the
- // viewport. animate is optional and if not passed then the value of animateScroll from the settings
- // object this jScrollPane was initialised with is used.
- scrollToY: function(destY, animate)
- {
- scrollToY(destY, animate);
- },
- // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- scrollBy: function(deltaX, deltaY, animate)
- {
- jsp.scrollByX(deltaX, animate);
- jsp.scrollByY(deltaY, animate);
- },
- // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- scrollByX: function(deltaX, animate)
- {
- var destX = contentPositionX() + deltaX,
- percentScrolled = destX / (contentWidth - paneWidth);
- positionDragX(percentScrolled * dragMaxX, animate);
- },
- // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- scrollByY: function(deltaY, animate)
- {
- var destY = contentPositionY() + deltaY,
- percentScrolled = destY / (contentHeight - paneHeight);
- positionDragY(percentScrolled * dragMaxY, animate);
- },
- // This method is called when jScrollPane is trying to animate to a new position. You can override
- // it if you want to provide advanced animation functionality. It is passed the following arguments:
- // * ele - the element whose position is being animated
- // * prop - the property that is being animated
- // * value - the value it's being animated to
- // * stepCallback - a function that you must execute each time you update the value of the property
- // You can use the default implementation (below) as a starting point for your own implementation.
- animate: function(ele, prop, value, stepCallback)
- {
- var params = {};
- params[prop] = value;
- ele.animate(
- params,
- {
- 'duration' : settings.animateDuration,
- 'ease' : settings.animateEase,
- 'queue' : false,
- 'step' : stepCallback
- }
- );
- },
- // Returns the current x position of the viewport with regards to the content pane.
- getContentPositionX: function()
- {
- return contentPositionX();
- },
- // Returns the current y position of the viewport with regards to the content pane.
- getContentPositionY: function()
- {
- return contentPositionY();
- },
- // Returns whether or not this scrollpane has a horizontal scrollbar.
- getIsScrollableH: function()
- {
- return isScrollableH;
- },
- // Returns whether or not this scrollpane has a vertical scrollbar.
- getIsScrollableV: function()
- {
- return isScrollableV;
- },
- // Gets a reference to the content pane. It is important that you use this method if you want to
- // edit the content of your jScrollPane as if you access the element directly then you may have some
- // problems (as your original element has had additional elements for the scrollbars etc added into
- // it).
- getContentPane: function()
- {
- return pane;
- },
- // Scrolls this jScrollPane down as far as it can currently scroll. If animate isn't passed then the
- // animateScroll value from settings is used instead.
- scrollToBottom: function(animate)
- {
- positionDragY(dragMaxY, animate);
- },
- // Hijacks the links on the page which link to content inside the scrollpane. If you have changed
- // the content of your page (e.g. via AJAX) and want to make sure any new anchor links to the
- // contents of your scroll pane will work then call this function.
- hijackInternalLinks: function()
- {
- hijackInternalLinks();
- }
- }
- );
- }
-
- // Pluginifying code...
-
- settings = $.extend({}, $.fn.jScrollPane.defaults, settings);
-
- var ret;
- this.each(
- function()
- {
- var elem = $(this), jspApi = elem.data('jsp');
- if (jspApi) {
- jspApi.reinitialise(settings);
- } else {
- jspApi = new JScrollPane(elem, settings);
- elem.data('jsp', jspApi);
- }
- ret = ret ? ret.add(elem) : elem;
- }
- )
- return ret;
- };
-
- $.fn.jScrollPane.defaults = {
- 'showArrows' : false,
- 'maintainPosition' : true,
- 'autoReinitialise' : false,
- 'autoReinitialiseDelay' : 500,
- 'verticalDragMinHeight' : 0,
- 'verticalDragMaxHeight' : 99999,
- 'horizontalDragMinWidth' : 0,
- 'horizontalDragMaxWidth' : 99999,
- 'animateScroll' : false,
- 'animateDuration' : 300,
- 'animateEase' : 'linear',
- 'hijackInternalLinks' : false,
- 'verticalGutter' : 4,
- 'horizontalGutter' : 4,
- 'mouseWheelSpeed' : 10,
- 'arrowButtonSpeed' : 10,
- 'arrowRepeatFreq' : 100,
- 'arrowScrollOnHover' : false,
- 'verticalArrowPositions' : 'split',
- 'horizontalArrowPositions' : 'split',
- 'enableKeyboardNavigation' : true,
- 'hideFocus' : false
- };
-
-})(jQuery,this);
-
diff --git a/libs/bower_components/jScrollPane/issues/12/native.html b/libs/bower_components/jScrollPane/issues/12/native.html
deleted file mode 100644
index 54f9920f49..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/native.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<meta name="verify-v1" content="ven67p9fXoMQpbw1icSXo8l+I5Z+upY90LnIqaPDgKo=" />
-<link href="brs_main.css" rel="stylesheet" type="text/css"/>
-<link type="text/css" href="../../style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-<title>The History of Tinyfish</title>
-<!-- compliance patch for microsoft browsers -->
-<!--[if lt IE 8]><script src="../__js/IE8.js" type="text/javascript"></script><![endif]-->
-<script src="http://cdn.jquerytools.org/1.2.2/full/jquery.tools.min.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="../../script/jquery.mousewheel.js"></script>
-<script type="text/javascript" src="../../script/jquery.jscrollpane.js"></script>
-
-<script language="javascript" type="text/javascript">
-$(function()
-{
-});
-</script>
-</head>
-<body class="nopage">
-<div id="content">
- <h1>The History of Tinyfish</h1>
- <p>It all began with a pair of broken arms and two dodgy eyes.</p>
- <p>It&rsquo;s 1978, the year that <a href="../__imgs/band/history/schoolboyjim.jpg" title="Jim at school" rel="#hist02">Jim Sanders</a> and <a href="../__imgs/band/history/babysimon.jpg" title="Simon as a baby" rel="#hist01">Simon Godfrey</a> met at school in East Sheen (South London). Although each had been aware of the other since the age of five, the two would have been on nothing more than nodding acquaintance, save for two medical problems that forced them together and would eventually lead to the band we know today as Tinyfish.</p>
-
- <p>Bloody weaklings.</p>
- <p>Jim had been diagnosed with a rare retinal disease which had a good chance of robbing him of his vision, and had recently undergone laser eye surgery. Simon more comedically had broken both arms after falling off a roof, leaving him with seriously weakened joints. As part of their convalescence from their respective surgeries, both boys were excused sports for six months.</p>
- <p>While the rest of the kids kicked the living crap out of each other under the pretence of playing football or rugby, Jim and Simon sat on a low school wall watching the on-field carnage and eyeing one another warily. Initially Simon was the talkative one while Jim sat silently, but as soon as the subject matter turned to music, both began to find some common ground, and the conversation became a two way street.</p>
- <p>Initially, Jim had been a Rock/New Wave fan who loved Thin Lizzy (above all others), but incongruously, also the Skids (who would later become Big Country) and the Rezillos (who wouldn&rsquo;t). Simon on the other hand was a fan of ELO and The Sweet but both agreed that music, and in particular, rock bands, were the bee&rsquo;s knees.</p>
- <p>Around the same time , Simon had struck up a friendship with another boy at school called <a href="../__imgs/band/history/youngpaul.jpg" title="Paul - much younger" rel="#hist03">Paul Worwood</a>, initially during school music lessons. The pair were both big fans of Dungeons and Dragons and would play the game constantly throughout their teenage years.</p>
-
- <p>Bloody geeks.</p>
- <p>As the 70&rsquo;s gave way to the 80&rsquo;s and the three grew to be good friends, Jim drew Simon and Paul towards a new love; heavy metal. Over the next three years, the trio saw every metal band that played at their local venue (The Hammersmith Odeon). While the three saw the likes of Thin Lizzy, Saxon, MSG, Iron Maiden and The Scorpions, their listening tastes also encompassed bands such as Yes, Genesis, King Crimson and Magnum.</p>
- <p>Jim had first played &lsquo;Going For The One&rsquo; by Yes to Simon back in the 70's (Simon rather uncharitably dubbed it &lsquo;f***ing Country &amp; Western&rsquo;. To be fair, Jim told Simon not to bother with Jethro Tull, as he thought they were arse... without actually having ever heard them. Twit.). Jim persevered however, and when he spun &lsquo;A Farewell To Kings&rsquo; by Rush in an afternoon listening session, Simon was well and truly hooked. He now also likes Yes very much. Hah! Jim now also likes Jethro Tull. Hah! Hah!</p>
-
- <p>During their time at Richmond College (South West London), Jim and Simon met guitarist Nick Denville, and formed their first band, with Paul joining on bass soon after. Paul was the only person they knew who owned a car. They also thought he was a top bloke, and so without mentioning the car caveat, the three miscreants cajoled Paul into buying a bass guitar and an amplifier. They called themselves <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">&lsquo;Blackstone Edge&rsquo;</a> and they were bloody rubbish. All they needed was a keyboard player to crown their musical ineptitude.</p>
- <p>Simon&rsquo;s younger brother Jem was 14 when he received his first keyboard (a Casio home synth which he put through a flanger pedal to make it sound cosmic). Jem was initially invited to rehearsals to hold the lyrics up for Jim to sing from while the rest of the band played. It soon became obvious to the guys that Jem's talents were wasted as a music stand and so he was invited into the band. This line up survived for a few months before Nick Denville left to live a happier and entirely more melodic life elsewhere.</p>
- <p>Bloody kids.</p>
- <p>The band continued, and Simon relentlessly poured prog music into Jem's head which was immediately absorbed by the young keyboard player. Less than six months later, Jem had learned all of Tony Banks&rsquo; keyboard solos from both Seconds Out and Three Sides Live along with Rick Wakeman's and Patrick Moraz's solos from Yesshows. With Jem's considerable technique, and the band hungry to write original music, the direction of the band was truely set towards progressive rock. The name <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">Blackstone Edge</a> was soon dropped in favour of &lsquo;Freefall Warriors&rsquo; (after a story in a Doctor Who comic) which very quickly contracted simply to <a href="../__imgs/band/history/freefall.jpg" title="Freefall Mk.1" rel="#hist06">&lsquo;Freefall&rsquo;</a> and with the addition of vocalist Andrew Lovatt, the band began to rehearse <a href="../__imgs/band/history/freefallposter.jpg" title="Poster for Freefall's first gig" rel="#hist05">in preparation for live gigs.</a></p>
-
- <p>During this time the band bumped into actor <a href="../__imgs/band/history/tonyaitken.jpg" title="Tony Aitken" rel="#hist07">Tony Aitken</a> who had worked during his less successful years as a supply teacher at Jim and Simon&rsquo;s school in the 70&rsquo;s. Tony was looking for musicians to back him in a covers band, and the guys duly offered their services (even though they then had no live experience whatsoever). The arrangement worked so well that they kept the band going for over a decade and it was there, working the pubs and clubs of southern England, that they learned the musical chops that would serve them so well in later years.</p>
- <p>In parallel to their function band work, Freefall practice/writing sessions continued. As luck would have it, IQ rehearsed in the studio next door to them, and on the back of their first gig, attended by IQ&rsquo;s then manager, they managed to land the support slot at IQ&rsquo;s Christmas show <a href="../__imgs/band/history/freefallmarquee.jpg" title="Freefall at the Marquee" rel="#hist08">at the Marquee Club in London. Gulp.</a></p>
- <p>Thankfully, the band hit it off immediately with the crowd and soon managed to get a string of gigs with bands like Jadis, Ark, Galahad, Mentaur and Geoff Mann from Twelth Night. Freefall looked as though they were going to make a big impact with the prog community but after an ill-judged attempt to &lsquo;go commercial&rsquo; in the early &lsquo;90s, (Bloody managers!) Jim left the band and the remaining members recruited a very nice gentleman called <a href="../__imgs/band/history/johnboyes.jpg" title="and on guitar - Mr. John Boyes!" rel="#hist09">John Boyes</a> on guitar. However, the moment was lost and the band soon fell apart.</p>
-
- <p>Bloody idiots.</p>
- <p>Jim and Jem briefly went on, to form Pop-proggers &ldquo;Charlottes&rsquo; Web&rdquo; before Jem gave up the scene to work for national radio (although Jem's involvement with prog would be re-ignited a decade later with the formation (with John Boyes) of the Prog supergroup Frost*).</p>
- <p>Meanwhile, Simon and Paul formed an acoustic outfit called <a href="../__imgs/band/history/maddogs.jpg" title="Men Are Dead Mk. I" rel="#hist10">&lsquo;Men Are Dead&rsquo;</a> with keyboard player Col Alkins and lyricist/harmonica player Rob Ramsay. Simon had met Rob way back in the early 80&rsquo;s at Richmond College, at the same time Freefall were making their first tentative steps in music. They became good friends and Rob was always involved at some level, either by helping out at gigs or writing the occasional lyric.</p>
-
- <br />
- <p>Men Are Dead began to play gigs on London's open mic scene (where any artist can roll up and play a short set of between two and five songs) and the band proved to be extremely popular with both audience and fellow musos alike. Col left after their first album, but thankfully, Jim once again joined up with Simon and Paul as a second guitarist, along with <a href="../__imgs/band/history/wayne.jpg" title="Wayne caught in the headlights" rel="#hist12">Wayne Collier</a>, an extraordinary drummer who played in almost every band in West London. <a href="../__imgs/band/history/menaredead.jpg" title="Men Are Dead Mk. II" rel="#hist11">What evolved was a prototype Tinyfish</a> sound and much of the band&rsquo;s current style comes from these early twin guitar shows.</p>
- <p>The millennium came and went, and so did the name &lsquo;Men Are Dead&rsquo;. In came Simon&rsquo;s alter ego &lsquo;Simon Walsh&rsquo;, a <em>nom-de-guerre</em> he still uses today when playing solo acoustic gigs. Whilst notching up appearances in the UK, Germany, France, Estonia and America, they recruited a third guitarist <a href="../__imgs/band/history/hw1.jpg" title="Tim solos at the Hope and Anchor" rel="#hist13">(Tim Eyles)</a> and all looked rosy (if a little Lynyrd Skynyrd) in the garden. Behind the scenes however, things were not going well with the band. Frustration with the strict definitions of acoustic music imposed by many clubs and venues began to take their toll on both the music and musicians. Their material was becoming more complex and the songs started to push past the three minute mark, as the band's deep-seated prog influences once again made themselves felt.</p>
-
- <p>Finally in the late autumn of 2004, after much soul searching, Simon sent Jim an e-mail suggesting that maybe there was little more they could achieve as an acoustic unit and perhaps they should return to their progressive roots. Jim happily agreed and an invite was duly sent out to both Paul and Rob asking if they would be interested in joining, which thankfully they did.</p>
- <p>Simon disbanded the acoustic band, with Tim Eyles joining the punk-pop band &lsquo;The Random&rsquo; and the four remaining musicians <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">assembled in Simon's loft</a> and began writing and rehearsing. Within six weeks it was obvious that there were real possibilities in the music they were making, but the question as to how to record this new material was causing them concern. None of them could afford to go the professional route, so the decision was made to turn the loft into a studio, and try it themselves.</p>
- <p>Robert had set up Lazy Gun Records several years previously, to promote both Men Are Dead and Simon Walsh, and suggested that this new band join the roster. This gave them complete artistic and financial control of their work. </p>
- <p>Bloody tight bastards.</p>
-
- <p>Finally the subject of the name for the band reared its ugly head. There were thoughts that they could resurrect the name Freefall but that idea was soon discarded. This was a new band, and it deserved a new name (besides, someone else was now using &lsquo;Freefall&rsquo; and they looked bigger and meaner than this band). It was Jim that quipped that they were just tiny fish compared to some of the huge prog bands still out there and within moments the name had stuck.</p>
- <p>The problem remained that they were a man short for playing live shows, but in the studio, that base was covered by Simon who, happily, can play both <a href="../__imgs/band/history/drumkit.jpg" title="Simon's electronic drumkit" rel="#hist15">drums</a> and <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">guitar</a> in equal measure (although not at the same time). Meanwhile, the studio had taken shape and the band had found that familiar progressive chemistry once again. The smiles were back on everybody&rsquo;s faces, and the band had a sound they could work to develop.</p>
- <p>When the talk turned once more to live performances, Jim mentioned that he knew a drummer of many bands, the semi-Italian <a href="../__imgs/band/history/leonstatue.jpg" title="Leon at the kit" rel="#hist16">Leon Camfield</a>, and after a few rehearsals (and many beers) together, Leon (for whom truely progressive music is a long held love (note King Crimson tattoo on arm)) enthusiastically joined to complete the Fab Five.</p>
-
- <p>So here we are in 2010. <a href="../__imgs/band/history/tinyfish1.jpg" title="tinyfish" rel="#hist17">Tinyfish</a> have gigged around the country, released both two albums, a mini-album, and a live album &amp; DVD, and have <a href="../__imgs/band/history/tinyfish2.jpg" title="tinyfish" rel="#hist18">arrived at a destination</a> where they feel at home, and are proud of their journey to this place of better dreams.</p>
- <p class="centre"><a href="../__imgs/band/history/strangestudioshot.jpg" title="a tinyfish close encounter" rel="#hist19">Bloody pretentious tossers.</a></p>
-</div>
-</body>
-</html>
-
diff --git a/libs/bower_components/jScrollPane/issues/12/wrapped.html b/libs/bower_components/jScrollPane/issues/12/wrapped.html
deleted file mode 100644
index 863fb1cb70..0000000000
--- a/libs/bower_components/jScrollPane/issues/12/wrapped.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<meta name="verify-v1" content="ven67p9fXoMQpbw1icSXo8l+I5Z+upY90LnIqaPDgKo=" />
-<link href="brs_main.css" rel="stylesheet" type="text/css"/>
-<link type="text/css" href="jscrollpane-2b3.css" rel="stylesheet" media="all" />
-
-<style type="text/css">
-#content
-{
- overflow: hidden;
-}
-#scroller
-{
- width: 100%;
- height: 100%;
-}
-</style>
-
-<title>The History of Tinyfish</title>
-<!-- compliance patch for microsoft browsers -->
-<!--[if lt IE 8]><script src="../__js/IE8.js" type="text/javascript"></script><![endif]-->
-<script src="http://cdn.jquerytools.org/1.2.2/full/jquery.tools.min.js" type="text/javascript"></script>
-
-<script type="text/javascript" src="jquery.mousewheel.js"></script>
-<script type="text/javascript" src="jscrollpane-2b3.js"></script>
-
-<script language="javascript" type="text/javascript">
-$(function()
-{
- $("#scroller").jScrollPane({
- showArrows: true
- });
-});
-</script>
-</head>
-<body class="nopage">
-<div id="content">
-<div id="scroller">
- <h1>The History of Tinyfish</h1>
- <p>It all began with a pair of broken arms and two dodgy eyes.</p>
- <p>It&rsquo;s 1978, the year that <a href="../__imgs/band/history/schoolboyjim.jpg" title="Jim at school" rel="#hist02">Jim Sanders</a> and <a href="../__imgs/band/history/babysimon.jpg" title="Simon as a baby" rel="#hist01">Simon Godfrey</a> met at school in East Sheen (South London). Although each had been aware of the other since the age of five, the two would have been on nothing more than nodding acquaintance, save for two medical problems that forced them together and would eventually lead to the band we know today as Tinyfish.</p>
-
- <p>Bloody weaklings.</p>
- <p>Jim had been diagnosed with a rare retinal disease which had a good chance of robbing him of his vision, and had recently undergone laser eye surgery. Simon more comedically had broken both arms after falling off a roof, leaving him with seriously weakened joints. As part of their convalescence from their respective surgeries, both boys were excused sports for six months.</p>
- <p>While the rest of the kids kicked the living crap out of each other under the pretence of playing football or rugby, Jim and Simon sat on a low school wall watching the on-field carnage and eyeing one another warily. Initially Simon was the talkative one while Jim sat silently, but as soon as the subject matter turned to music, both began to find some common ground, and the conversation became a two way street.</p>
- <p>Initially, Jim had been a Rock/New Wave fan who loved Thin Lizzy (above all others), but incongruously, also the Skids (who would later become Big Country) and the Rezillos (who wouldn&rsquo;t). Simon on the other hand was a fan of ELO and The Sweet but both agreed that music, and in particular, rock bands, were the bee&rsquo;s knees.</p>
- <p>Around the same time , Simon had struck up a friendship with another boy at school called <a href="../__imgs/band/history/youngpaul.jpg" title="Paul - much younger" rel="#hist03">Paul Worwood</a>, initially during school music lessons. The pair were both big fans of Dungeons and Dragons and would play the game constantly throughout their teenage years.</p>
-
- <p>Bloody geeks.</p>
- <p>As the 70&rsquo;s gave way to the 80&rsquo;s and the three grew to be good friends, Jim drew Simon and Paul towards a new love; heavy metal. Over the next three years, the trio saw every metal band that played at their local venue (The Hammersmith Odeon). While the three saw the likes of Thin Lizzy, Saxon, MSG, Iron Maiden and The Scorpions, their listening tastes also encompassed bands such as Yes, Genesis, King Crimson and Magnum.</p>
- <p>Jim had first played &lsquo;Going For The One&rsquo; by Yes to Simon back in the 70's (Simon rather uncharitably dubbed it &lsquo;f***ing Country &amp; Western&rsquo;. To be fair, Jim told Simon not to bother with Jethro Tull, as he thought they were arse... without actually having ever heard them. Twit.). Jim persevered however, and when he spun &lsquo;A Farewell To Kings&rsquo; by Rush in an afternoon listening session, Simon was well and truly hooked. He now also likes Yes very much. Hah! Jim now also likes Jethro Tull. Hah! Hah!</p>
-
- <p>During their time at Richmond College (South West London), Jim and Simon met guitarist Nick Denville, and formed their first band, with Paul joining on bass soon after. Paul was the only person they knew who owned a car. They also thought he was a top bloke, and so without mentioning the car caveat, the three miscreants cajoled Paul into buying a bass guitar and an amplifier. They called themselves <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">&lsquo;Blackstone Edge&rsquo;</a> and they were bloody rubbish. All they needed was a keyboard player to crown their musical ineptitude.</p>
- <p>Simon&rsquo;s younger brother Jem was 14 when he received his first keyboard (a Casio home synth which he put through a flanger pedal to make it sound cosmic). Jem was initially invited to rehearsals to hold the lyrics up for Jim to sing from while the rest of the band played. It soon became obvious to the guys that Jem's talents were wasted as a music stand and so he was invited into the band. This line up survived for a few months before Nick Denville left to live a happier and entirely more melodic life elsewhere.</p>
- <p>Bloody kids.</p>
- <p>The band continued, and Simon relentlessly poured prog music into Jem's head which was immediately absorbed by the young keyboard player. Less than six months later, Jem had learned all of Tony Banks&rsquo; keyboard solos from both Seconds Out and Three Sides Live along with Rick Wakeman's and Patrick Moraz's solos from Yesshows. With Jem's considerable technique, and the band hungry to write original music, the direction of the band was truely set towards progressive rock. The name <a href="../__imgs/band/history/blackstoneedge.jpg" title="Blackstone Edge" rel="#hist04">Blackstone Edge</a> was soon dropped in favour of &lsquo;Freefall Warriors&rsquo; (after a story in a Doctor Who comic) which very quickly contracted simply to <a href="../__imgs/band/history/freefall.jpg" title="Freefall Mk.1" rel="#hist06">&lsquo;Freefall&rsquo;</a> and with the addition of vocalist Andrew Lovatt, the band began to rehearse <a href="../__imgs/band/history/freefallposter.jpg" title="Poster for Freefall's first gig" rel="#hist05">in preparation for live gigs.</a></p>
-
- <p>During this time the band bumped into actor <a href="../__imgs/band/history/tonyaitken.jpg" title="Tony Aitken" rel="#hist07">Tony Aitken</a> who had worked during his less successful years as a supply teacher at Jim and Simon&rsquo;s school in the 70&rsquo;s. Tony was looking for musicians to back him in a covers band, and the guys duly offered their services (even though they then had no live experience whatsoever). The arrangement worked so well that they kept the band going for over a decade and it was there, working the pubs and clubs of southern England, that they learned the musical chops that would serve them so well in later years.</p>
- <p>In parallel to their function band work, Freefall practice/writing sessions continued. As luck would have it, IQ rehearsed in the studio next door to them, and on the back of their first gig, attended by IQ&rsquo;s then manager, they managed to land the support slot at IQ&rsquo;s Christmas show <a href="../__imgs/band/history/freefallmarquee.jpg" title="Freefall at the Marquee" rel="#hist08">at the Marquee Club in London. Gulp.</a></p>
- <p>Thankfully, the band hit it off immediately with the crowd and soon managed to get a string of gigs with bands like Jadis, Ark, Galahad, Mentaur and Geoff Mann from Twelth Night. Freefall looked as though they were going to make a big impact with the prog community but after an ill-judged attempt to &lsquo;go commercial&rsquo; in the early &lsquo;90s, (Bloody managers!) Jim left the band and the remaining members recruited a very nice gentleman called <a href="../__imgs/band/history/johnboyes.jpg" title="and on guitar - Mr. John Boyes!" rel="#hist09">John Boyes</a> on guitar. However, the moment was lost and the band soon fell apart.</p>
-
- <p>Bloody idiots.</p>
- <p>Jim and Jem briefly went on, to form Pop-proggers &ldquo;Charlottes&rsquo; Web&rdquo; before Jem gave up the scene to work for national radio (although Jem's involvement with prog would be re-ignited a decade later with the formation (with John Boyes) of the Prog supergroup Frost*).</p>
- <p>Meanwhile, Simon and Paul formed an acoustic outfit called <a href="../__imgs/band/history/maddogs.jpg" title="Men Are Dead Mk. I" rel="#hist10">&lsquo;Men Are Dead&rsquo;</a> with keyboard player Col Alkins and lyricist/harmonica player Rob Ramsay. Simon had met Rob way back in the early 80&rsquo;s at Richmond College, at the same time Freefall were making their first tentative steps in music. They became good friends and Rob was always involved at some level, either by helping out at gigs or writing the occasional lyric.</p>
-
- <br />
- <p>Men Are Dead began to play gigs on London's open mic scene (where any artist can roll up and play a short set of between two and five songs) and the band proved to be extremely popular with both audience and fellow musos alike. Col left after their first album, but thankfully, Jim once again joined up with Simon and Paul as a second guitarist, along with <a href="../__imgs/band/history/wayne.jpg" title="Wayne caught in the headlights" rel="#hist12">Wayne Collier</a>, an extraordinary drummer who played in almost every band in West London. <a href="../__imgs/band/history/menaredead.jpg" title="Men Are Dead Mk. II" rel="#hist11">What evolved was a prototype Tinyfish</a> sound and much of the band&rsquo;s current style comes from these early twin guitar shows.</p>
- <p>The millennium came and went, and so did the name &lsquo;Men Are Dead&rsquo;. In came Simon&rsquo;s alter ego &lsquo;Simon Walsh&rsquo;, a <em>nom-de-guerre</em> he still uses today when playing solo acoustic gigs. Whilst notching up appearances in the UK, Germany, France, Estonia and America, they recruited a third guitarist <a href="../__imgs/band/history/hw1.jpg" title="Tim solos at the Hope and Anchor" rel="#hist13">(Tim Eyles)</a> and all looked rosy (if a little Lynyrd Skynyrd) in the garden. Behind the scenes however, things were not going well with the band. Frustration with the strict definitions of acoustic music imposed by many clubs and venues began to take their toll on both the music and musicians. Their material was becoming more complex and the songs started to push past the three minute mark, as the band's deep-seated prog influences once again made themselves felt.</p>
-
- <p>Finally in the late autumn of 2004, after much soul searching, Simon sent Jim an e-mail suggesting that maybe there was little more they could achieve as an acoustic unit and perhaps they should return to their progressive roots. Jim happily agreed and an invite was duly sent out to both Paul and Rob asking if they would be interested in joining, which thankfully they did.</p>
- <p>Simon disbanded the acoustic band, with Tim Eyles joining the punk-pop band &lsquo;The Random&rsquo; and the four remaining musicians <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">assembled in Simon's loft</a> and began writing and rehearsing. Within six weeks it was obvious that there were real possibilities in the music they were making, but the question as to how to record this new material was causing them concern. None of them could afford to go the professional route, so the decision was made to turn the loft into a studio, and try it themselves.</p>
- <p>Robert had set up Lazy Gun Records several years previously, to promote both Men Are Dead and Simon Walsh, and suggested that this new band join the roster. This gave them complete artistic and financial control of their work. </p>
- <p>Bloody tight bastards.</p>
-
- <p>Finally the subject of the name for the band reared its ugly head. There were thoughts that they could resurrect the name Freefall but that idea was soon discarded. This was a new band, and it deserved a new name (besides, someone else was now using &lsquo;Freefall&rsquo; and they looked bigger and meaner than this band). It was Jim that quipped that they were just tiny fish compared to some of the huge prog bands still out there and within moments the name had stuck.</p>
- <p>The problem remained that they were a man short for playing live shows, but in the studio, that base was covered by Simon who, happily, can play both <a href="../__imgs/band/history/drumkit.jpg" title="Simon's electronic drumkit" rel="#hist15">drums</a> and <a href="../__imgs/band/history/guitars.jpg" title="A plethora of guitars" rel="#hist14">guitar</a> in equal measure (although not at the same time). Meanwhile, the studio had taken shape and the band had found that familiar progressive chemistry once again. The smiles were back on everybody&rsquo;s faces, and the band had a sound they could work to develop.</p>
- <p>When the talk turned once more to live performances, Jim mentioned that he knew a drummer of many bands, the semi-Italian <a href="../__imgs/band/history/leonstatue.jpg" title="Leon at the kit" rel="#hist16">Leon Camfield</a>, and after a few rehearsals (and many beers) together, Leon (for whom truely progressive music is a long held love (note King Crimson tattoo on arm)) enthusiastically joined to complete the Fab Five.</p>
-
- <p>So here we are in 2010. <a href="../__imgs/band/history/tinyfish1.jpg" title="tinyfish" rel="#hist17">Tinyfish</a> have gigged around the country, released both two albums, a mini-album, and a live album &amp; DVD, and have <a href="../__imgs/band/history/tinyfish2.jpg" title="tinyfish" rel="#hist18">arrived at a destination</a> where they feel at home, and are proud of their journey to this place of better dreams.</p>
- <p class="centre"><a href="../__imgs/band/history/strangestudioshot.jpg" title="a tinyfish close encounter" rel="#hist19">Bloody pretentious tossers.</a></p>
-</div>
-</div>
-</body>
-</html>
-
diff --git a/libs/bower_components/jScrollPane/issues/7/after.html b/libs/bower_components/jScrollPane/issues/7/after.html
deleted file mode 100644
index a91d42dace..0000000000
--- a/libs/bower_components/jScrollPane/issues/7/after.html
+++ /dev/null
@@ -1,190 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <!-- Thanks to Rob Lifford ( http://www.lifford.org/ ) for the test case -->
- <meta charset="utf-8">
- <title>jScrollPane 2 reinit bug?</title>
- <style type="text/css">
- body, html {
- margin: 0;
- padding: 20px;
- font-family: Verdana, sans-serif;
- font-size: 85%;
- line-height: 1.5;
- }
-
- .float {
- float: left;
- }
-
- .clear {
- clear: both;
- }
-
- .scroll-container {
- width: 400px;
- height: 200px;
- overflow: auto;
- margin: 0 2em 1.5em 0;
- }
-
- .fluid-width {
- width: 100%;
- }
-
- .padded {
- padding: 5px;
- }
-
- ul {
- margin: 0;
- padding: 0;
- line-height: 1;
- list-style: none;
- border-bottom: solid 1px #ccc;
- }
-
- li {
- margin: 0;
- padding: 10px 5px;
- border-top: solid 1px #ccc;
- }
-
- </style>
- <link rel="stylesheet" type="text/css" href="../../style/jquery.jscrollpane.css" />
-
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
-
- <script type="text/javascript" src="../../script/jquery.jscrollpane.js"></script>
-
- <script type="text/javascript">
- $(function()
- {
- var element = $('.scroll-container').jScrollPane();
- var api = element.data('jsp');
-
- $('#jsp').click(function() {
- elem = $('.scroll-container').jScrollPane();
- });
-
- $('#api').click(function() {
- api.reinitialise();
- });
-
- });
- </script>
-
- </head>
- <body>
-
- <div class="scroll-container float">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
-
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
-
- <li>the next list item</li>
- </ul>
- </div>
-
- <div class="scroll-container float">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- </ul>
- </div>
-
- <div class="scroll-container padded clear">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
-
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
-
- <li>the next list item</li>
- </ul>
- </div>
-
- <div class="scroll-container fluid-width clear">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
-
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
-
- <li>the next list item</li>
- </ul>
- </div>
-
-
- <p class="clear"><button id="api">reinit via API</button> <button id="jsp">Reinit by re-calling .jScrollPane</button> </p>
-
- <p>In the above testcase: reinitialising jScrollPane (either via the api or simply by re-calling .jScrollPane() on the original element) strips out the width of the div.jspPane and causes a rendering issue: the absolutely-positioned div renders only as wide as its text content. The expected behavior is that it'll fill the available width, as it does on page load after the first call to .jScrollPane().</p>
-
-
-<p><strong>UPDATE:</strong> this is fixed for scrollable content in v2b2, but when the content is not scrollable there's still undesired rendering on first load.</p>
-
-<p>Additionally, padding calculations might need some tweaks. The third list box here is identical to the first two except for an added 5px of padding all the way around: note how the jspVerticalBar is partially pushed out of view.</p>
-
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/7/before.html b/libs/bower_components/jScrollPane/issues/7/before.html
deleted file mode 100644
index c703503f15..0000000000
--- a/libs/bower_components/jScrollPane/issues/7/before.html
+++ /dev/null
@@ -1,190 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <!-- Thanks to Rob Lifford ( http://www.lifford.org/ ) for the test case -->
- <meta charset="utf-8">
- <title>jScrollPane 2 reinit bug?</title>
- <style type="text/css">
- body, html {
- margin: 0;
- padding: 20px;
- font-family: Verdana, sans-serif;
- font-size: 85%;
- line-height: 1.5;
- }
-
- .float {
- float: left;
- }
-
- .clear {
- clear: both;
- }
-
- .scroll-container {
- width: 400px;
- height: 200px;
- overflow: auto;
- margin: 0 2em 1.5em 0;
- }
-
- .fluid-width {
- width: 100%;
- }
-
- .padded {
- padding: 5px;
- }
-
- ul {
- margin: 0;
- padding: 0;
- line-height: 1;
- list-style: none;
- border-bottom: solid 1px #ccc;
- }
-
- li {
- margin: 0;
- padding: 10px 5px;
- border-top: solid 1px #ccc;
- }
-
- </style>
- <link rel="stylesheet" type="text/css" href="jscrollpane-2b1.css" />
-
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
-
- <script type="text/javascript" src="jscrollpane-2b2.js"></script>
-
- <script type="text/javascript">
- $(function()
- {
- var element = $('.scroll-container').jScrollPane();
- var api = element.data('jsp');
-
- $('#jsp').click(function() {
- elem = $('.scroll-container').jScrollPane();
- });
-
- $('#api').click(function() {
- api.reinitialise();
- });
-
- });
- </script>
-
- </head>
- <body>
-
- <div class="scroll-container float">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
-
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
-
- <li>the next list item</li>
- </ul>
- </div>
-
- <div class="scroll-container float">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- </ul>
- </div>
-
- <div class="scroll-container padded clear">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
-
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
-
- <li>the next list item</li>
- </ul>
- </div>
-
- <div class="scroll-container fluid-width clear">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
-
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
-
- <li>the next list item</li>
- </ul>
- </div>
-
-
- <p class="clear"><button id="api">reinit via API</button> <button id="jsp">Reinit by re-calling .jScrollPane</button> </p>
-
- <p>In the above testcase: reinitialising jScrollPane (either via the api or simply by re-calling .jScrollPane() on the original element) strips out the width of the div.jspPane and causes a rendering issue: the absolutely-positioned div renders only as wide as its text content. The expected behavior is that it'll fill the available width, as it does on page load after the first call to .jScrollPane().</p>
-
-
-<p><strong>UPDATE:</strong> this is fixed for scrollable content in v2b2, but when the content is not scrollable there's still undesired rendering on first load.</p>
-
-<p>Additionally, padding calculations might need some tweaks. The third list box here is identical to the first two except for an added 5px of padding all the way around: note how the jspVerticalBar is partially pushed out of view.</p>
-
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/7/index.html b/libs/bower_components/jScrollPane/issues/7/index.html
deleted file mode 100644
index 7d8e95f039..0000000000
--- a/libs/bower_components/jScrollPane/issues/7/index.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - issue 7</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="../../style/demo.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="../../script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="../../image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="../../index.html">Home</a></li>
- <li><a href="../../index.html#examples">Examples</a></li>
- <li><a href="../../index.html#themes">Themes</a></li>
- <li><a href="../../index.html#usage">How to use</a></li>
- <li><a href="../../faqs.html">FAQs</a></li>
- <li><a href="../../known_issues.html">Known issues</a></li>
- <li><a href="../../index.html#support">Support</a></li>
- <li><a href="../../index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - issue 7</h1>
- <p>
- This page demonstrates the bug described in <a href="http://github.com/vitch/jScrollPane/issues#issue/7">
- issue 7</a> as reported (with nice striped down test cases) by <a href="http://rob.lifford.org/">Rob
- Lifford</a>.
- </p>
- <ul class="link-list">
- <li>
- <a href="before.html">Before</a> - showing the bug as it appears in the version of jScrollPane which
- was current when it was reported.
- </li>
- <li>
- <a href="native.html">Native</a> - showing how the page looks with native scrollbars (i.e. if
- jScrollPane isn't initialised).
- </li>
- <li>
- <a href="after.html">After</a> - showing the page which was displaying the bug with the latest
- version of jScrollPane.
- </li>
- </ul>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/7/jscrollpane-2b1.css b/libs/bower_components/jScrollPane/issues/7/jscrollpane-2b1.css
deleted file mode 100644
index a051caed0a..0000000000
--- a/libs/bower_components/jScrollPane/issues/7/jscrollpane-2b1.css
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * CSS Styles that are needed by jScrollPane for it to operate correctly.
- *
- * Include this stylesheet in your site or copy and paste the styles below into your stylesheet - jScrollPane
- * may not operate correctly without them.
- */
-
-.jspContainer
-{
- overflow: hidden;
- position: relative;
-}
-
-.jspPane
-{
- position: absolute;
-}
-
-.jspVerticalBar
-{
- position: absolute;
- top: 0;
- right: 0;
- width: 16px;
- height: 100%;
- background: red;
-}
-
-.jspHorizontalBar
-{
- position: absolute;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 16px;
- background: red;
-}
-
-.jspVerticalBar *,
-.jspHorizontalBar *
-{
- margin: 0;
- padding: 0;
-}
-
-.jspCap
-{
- display: none;
-}
-
-.jspHorizontalBar .jspCap
-{
- float: left;
-}
-
-.jspTrack
-{
- background: #dde;
- position: relative;
-}
-
-.jspDrag
-{
- background: #bbd;
- position: relative;
- top: 0;
- left: 0;
- cursor: pointer;
-}
-
-.jspHorizontalBar .jspTrack,
-.jspHorizontalBar .jspDrag
-{
- float: left;
- height: 100%;
-}
-
-.jspArrow
-{
- background: #50506d;
- text-indent: -20000px;
- display: block;
- cursor: pointer;
-}
-
-.jspArrow.jspDisabled
-{
- cursor: default;
- background: #80808d;
-}
-
-.jspVerticalBar .jspArrow
-{
- height: 16px;
-}
-
-.jspHorizontalBar .jspArrow
-{
- width: 16px;
- float: left;
- height: 100%;
-}
-
-.jspVerticalBar .jspArrow:focus
-{
- outline: none;
-}
-
-.jspCorner
-{
- background: #eeeef4;
- float: left;
- height: 100%;
-}
-
-/* Yuk! CSS Hack for IE6 3 pixel bug :( */
-* html .jspCorner
-{
- margin: 0 -3px 0 0;
-} \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/issues/7/jscrollpane-2b2.js b/libs/bower_components/jScrollPane/issues/7/jscrollpane-2b2.js
deleted file mode 100644
index e8e89e3e4a..0000000000
--- a/libs/bower_components/jScrollPane/issues/7/jscrollpane-2b2.js
+++ /dev/null
@@ -1,947 +0,0 @@
-/*!
- * jScrollPane - v2.0.0beta2 - 2010-08-19
- * http://jscrollpane.kelvinluck.com/
- *
- * Copyright (c) 2010 Kelvin Luck
- * Dual licensed under the MIT or GPL licenses.
- */
-
-// Script: jScrollPane - cross browser customisable scrollbars
-//
-// *Version: 2.0.0beta2, Last updated: 2010-08-19*
-//
-// Project Home - http://jscrollpane.kelvinluck.com/
-// GitHub - http://github.com/vitch/jScrollPane
-// Source - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.js
-// (Minified) - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.min.js
-//
-// About: License
-//
-// Copyright (c) 2010 Kelvin Luck
-// Dual licensed under the MIT or GPL Version 2 licenses.
-// http://jscrollpane.kelvinluck.com/MIT-LICENSE.txt
-// http://jscrollpane.kelvinluck.com/GPL-LICENSE.txt
-//
-// About: Examples
-//
-// All examples and demos are available through the jScrollPane example site at:
-// http://jscrollpane.kelvinluck.com/
-//
-// About: Support and Testing
-//
-// This plugin is tested on the browsers below and has been found to work reliably on them. If you run
-// into a problem on one of the supported browsers then please visit the support section on the jScrollPane
-// website (http://jscrollpane.kelvinluck.com/) for more information on getting support. You are also
-// welcome to fork the project on GitHub if you can contribute a fix for a given issue.
-//
-// jQuery Versions - 1.4.2
-// Browsers Tested - Firefox 3.6.8, Safari 5, Opera 10.6, Chrome 5.0, IE 6, 7, 8
-//
-// About: Release History
-//
-// 2.0.0beta2 - (2010-08-19) Bug fixes
-// 2.0.0beta1 - (2010-08-17) Rewrite to follow modern best practices and enable horizontal scrolling, initially hidden
-// elements and dynamically sized elements.
-// 1.x - (2006-12-31 - 2010-07-31) Initial version, hosted at googlecode, deprecated
-
-(function($,window,undefined){
-
- $.fn.jScrollPane = function(settings)
- {
- // JScrollPane "class" - public methods are available through $('selector').data('jsp')
- function JScrollPane(elem, s)
- {
-
- var settings, jsp = this, pane, paneWidth, paneHeight, container, contentWidth, contentHeight,
- percentInViewH, percentInViewV, isScrollableV, isScrollableH, verticalDrag, dragMaxY,
- verticalDragPosition, horizontalDrag, dragMaxX, horizontalDragPosition,
- verticalBar, verticalTrack, scrollbarWidth, verticalTrackHeight, verticalDragHeight, arrowUp, arrowDown,
- horizontalBar, horizontalTrack, horizontalTrackWidth, horizontalDragWidth, arrowLeft, arrowRight,
- reinitialiseInterval, originalPadding, originalPaddingTotalWidth, previousPaneWidth;
-
- originalPadding = elem.css('paddingTop') + ' ' +
- elem.css('paddingRight') + ' ' +
- elem.css('paddingBottom') + ' ' +
- elem.css('paddingLeft');
- originalPaddingTotalWidth = (parseInt(elem.css('paddingLeft')) || 0) +
- (parseInt(elem.css('paddingRight')) || 0);
-
- initialise(s);
-
- function initialise(s)
- {
-
- var clonedElem, tempWrapper, /*firstChild, lastChild, */isMaintainingPositon, lastContentX, lastContentY,
- hasContainingSpaceChanged;
-
- settings = s;
-
- if (pane == undefined) {
-
- elem.css(
- {
- 'overflow': 'hidden',
- 'padding': 0
- }
- );
- // TODO: Deal with where width/ height is 0 as it probably means the element is hidden and we should
- // come back to it later and check once it is unhidden...
- paneWidth = elem.innerWidth() + originalPaddingTotalWidth;
- paneHeight = elem.innerHeight();
-
- pane = $('<div class="jspPane" />').wrap(
- $('<div class="jspContainer" />')
- .css({
- 'width': paneWidth + 'px',
- 'height': paneHeight + 'px'
- }
- )
- );
-
- elem.wrapInner(pane.parent());
- // Need to get the vars after being added to the document, otherwise they reference weird
- // disconnected orphan elements...
- container = elem.find('>.jspContainer');
- pane = container.find('>.jspPane');
- pane.css('padding', originalPadding);
-
- /*
- // Move any margins from the first and last children up to the container so they can still
- // collapse with neighbouring elements as they would before jScrollPane
- firstChild = pane.find(':first-child');
- lastChild = pane.find(':last-child');
- elem.css(
- {
- 'margin-top': firstChild.css('margin-top'),
- 'margin-bottom': lastChild.css('margin-bottom')
- }
- );
- firstChild.css('margin-top', 0);
- lastChild.css('margin-bottom', 0);
- */
- } else {
- hasContainingSpaceChanged = elem.outerWidth() != paneWidth || elem.outerHeight() != paneHeight;
-
- if (hasContainingSpaceChanged) {
- paneWidth = elem.innerWidth();
- paneHeight = elem.innerHeight();
- container.css({
- 'width': paneWidth + 'px',
- 'height': paneHeight + 'px'
- });
- }
-
- previousPaneWidth = pane.innerWidth();
- pane.css('width', null);
-
- if (!hasContainingSpaceChanged && pane.outerWidth() == contentWidth && pane.outerHeight() == contentHeight) {
- // Nothing has changed since we last initialised
- if (isScrollableH || isScrollableV) { // If we had already set a width then re-set it
- pane.css('width', previousPaneWidth + 'px');
- }
- // Then abort...
- return;
- }
-
- container.find('>.jspVerticalBar,>.jspHorizontalBar').remove().end();
- }
-
- // Unfortunately it isn't that easy to find out the width of the element as it will always report the
- // width as allowed by its container, regardless of overflow settings.
- // A cunning workaround is to clone the element, set its position to absolute and place it in a narrow
- // container. Now it will push outwards to its maxium real width...
- clonedElem = pane.clone().css('position', 'absolute');
- tempWrapper = $('<div style="width:1px; position: relative;" />').append(clonedElem);
- $('body').append(tempWrapper);
- contentWidth = Math.max(pane.outerWidth(), clonedElem.outerWidth());
- tempWrapper.remove();
-
- contentHeight = pane.outerHeight();
- percentInViewH = contentWidth / paneWidth;
- percentInViewV = contentHeight / paneHeight;
- isScrollableV = percentInViewV > 1;
-
- isScrollableH = percentInViewH > 1;
-
- //console.log(paneWidth, paneHeight, contentWidth, contentHeight, percentInViewH, percentInViewV, isScrollableH, isScrollableV);
-
- if (!(isScrollableH || isScrollableV)) {
- elem.removeClass('jspScrollable');
- pane.css('top', 0);
- removeMousewheel();
- removeFocusHandler();
- unhijackInternalLinks();
- } else {
- elem.addClass('jspScrollable');
-
- isMaintainingPositon = settings.maintainPosition && (verticalDragPosition || horizontalDragPosition);
- if (isMaintainingPositon) {
- lastContentX = contentPositionX();
- lastContentY = contentPositionY();
- }
-
- initialiseVerticalScroll();
- initialiseHorizontalScroll();
- resizeScrollbars();
-
- if (isMaintainingPositon) {
- scrollToX(lastContentX);
- scrollToY(lastContentY);
- }
-
- initFocusHandler();
- observeHash();
- if (settings.hijackInternalLinks) {
- hijackInternalLinks();
- }
- }
-
- if (settings.autoReinitialise && !reinitialiseInterval) {
- reinitialiseInterval = setInterval(
- function()
- {
- initialise(settings);
- },
- settings.autoReinitialiseDelay
- );
- } else if (!settings.autoReinitialise && reinitialiseInterval) {
- clearInterval(reinitialiseInterval)
- }
- }
-
- function initialiseVerticalScroll()
- {
- if (isScrollableV) {
-
- container.append(
- $('<div class="jspVerticalBar" />').append(
- $('<div class="jspCap jspCapTop" />'),
- $('<div class="jspTrack" />').append(
- $('<div class="jspDrag" />').append(
- $('<div class="jspDragTop" />'),
- $('<div class="jspDragBottom" />')
- )
- ),
- $('<div class="jspCap jspCapBottom" />')
- )
- );
-
- verticalBar = container.find('>.jspVerticalBar');
- verticalTrack = verticalBar.find('>.jspTrack');
- verticalDrag = verticalTrack.find('>.jspDrag');
-
- if (settings.showArrows) {
- arrowUp = $('<a href="#" class="jspArrow jspArrowUp">Scroll up</a>').bind(
- 'mousedown.jsp', getArrowScroll(0, -1)
- ).bind('click.jsp', nil);
- arrowDown = $('<a href="#" class="jspArrow jspArrowDown">Scroll down</a>').bind(
- 'mousedown.jsp', getArrowScroll(0, 1)
- ).bind('click.jsp', nil);
- if (settings.arrowScrollOnHover) {
- arrowUp.bind('mouseover.jsp', getArrowScroll(0, -1, arrowUp));
- arrowDown.bind('mouseover.jsp', getArrowScroll(0, 1, arrowDown));
- }
-
- appendArrows(verticalTrack, settings.verticalArrowPositions, arrowUp, arrowDown);
- }
-
- verticalTrackHeight = paneHeight;
- container.find('>.jspVerticalBar>.jspCap:visible,>.jspVerticalBar>.jspArrow').each(
- function()
- {
- verticalTrackHeight -= $(this).outerHeight();
- }
- );
-
-
- verticalDrag.hover(
- function()
- {
- verticalDrag.addClass('jspHover');
- },
- function()
- {
- verticalDrag.removeClass('jspHover');
- }
- ).bind(
- 'mousedown.jsp',
- function(e)
- {
- // Stop IE from allowing text selection
- $('html').bind('dragstart.jsp selectstart.jsp', function() { return false; });
-
- verticalDrag.addClass('jspActive');
-
- var startY = e.pageY - verticalDrag.position().top;
-
- $('html').bind(
- 'mousemove.jsp',
- function(e)
- {
- positionDragY(e.pageY - startY, false);
- }
- ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
- return false;
- }
- );
- sizeVerticalScrollbar();
- updateVerticalArrows();
- initMousewheel();
- } else {
- // no vertical scroll
- removeMousewheel();
- }
- }
-
- function sizeVerticalScrollbar()
- {
- verticalTrack.height(verticalTrackHeight + 'px');
- verticalDragPosition = 0;
- scrollbarWidth = settings.verticalGutter + verticalTrack.outerWidth();
-
- // Make the pane thinner to allow for the vertical scrollbar
- pane.width(paneWidth - scrollbarWidth - originalPaddingTotalWidth);
-
- // Add margin to the left of the pane if scrollbars are on that side (to position
- // the scrollbar on the left or right set it's left or right property in CSS)
- if (verticalBar.position().left == 0) {
- pane.css('margin-left', scrollbarWidth + 'px');
- }
- }
-
- function initialiseHorizontalScroll()
- {
- if (isScrollableH) {
-
- container.append(
- $('<div class="jspHorizontalBar" />').append(
- $('<div class="jspCap jspCapLeft" />'),
- $('<div class="jspTrack" />').append(
- $('<div class="jspDrag" />').append(
- $('<div class="jspDragLeft" />'),
- $('<div class="jspDragRight" />')
- )
- ),
- $('<div class="jspCap jspCapRight" />')
- )
- );
-
- horizontalBar = container.find('>.jspHorizontalBar');
- horizontalTrack = horizontalBar.find('>.jspTrack');
- horizontalDrag = horizontalTrack.find('>.jspDrag');
-
- if (settings.showArrows) {
- arrowLeft = $('<a href="#" class="jspArrow jspArrowLeft">Scroll left</a>').bind(
- 'mousedown.jsp', getArrowScroll(-1, 0)
- ).bind('click.jsp', nil);
- arrowRight = $('<a href="#" class="jspArrow jspArrowRight">Scroll right</a>').bind(
- 'mousedown.jsp', getArrowScroll(1, 0)
- ).bind('click.jsp', nil);
- if (settings.arrowScrollOnHover) {
- arrowLeft.bind('mouseover.jsp', getArrowScroll(-1, 0, arrowLeft));
- arrowRight.bind('mouseover.jsp', getArrowScroll(1, 0, arrowRight));
- }
- appendArrows(horizontalTrack, settings.horizontalArrowPositions, arrowLeft, arrowRight);
- }
-
- horizontalDrag.hover(
- function()
- {
- horizontalDrag.addClass('jspHover');
- },
- function()
- {
- horizontalDrag.removeClass('jspHover');
- }
- ).bind(
- 'mousedown.jsp',
- function(e)
- {
- // Stop IE from allowing text selection
- $('html').bind('dragstart.jsp selectstart.jsp', function() { return false; });
-
- horizontalDrag.addClass('jspActive');
-
- var startX = e.pageX - horizontalDrag.position().left;
-
- $('html').bind(
- 'mousemove.jsp',
- function(e)
- {
- positionDragX(e.pageX - startX, false);
- }
- ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
- return false;
- }
- );
- horizontalTrackWidth = container.innerWidth();
- sizeHorizontalScrollbar();
- updateHorizontalArrows();
- } else {
- // no horizontal scroll
- }
- }
-
- function sizeHorizontalScrollbar()
- {
-
- container.find('>.jspHorizontalBar>.jspCap:visible,>.jspHorizontalBar>.jspArrow').each(
- function()
- {
- horizontalTrackWidth -= $(this).outerWidth();
- }
- );
-
- horizontalTrack.width(horizontalTrackWidth + 'px');
- horizontalDragPosition = 0;
- }
-
- function resizeScrollbars()
- {
- if (isScrollableH && isScrollableV) {
- var horizontalTrackHeight = horizontalTrack.outerHeight(),
- verticalTrackWidth = verticalTrack.outerWidth();
- verticalTrackHeight -= horizontalTrackHeight;
- $(horizontalBar).find('>.jspCap:visible,>.jspArrow').each(
- function()
- {
- horizontalTrackWidth += $(this).outerWidth();
- }
- );
- horizontalTrackWidth -= verticalTrackWidth;
- paneHeight -= verticalTrackWidth;
- paneWidth -= horizontalTrackHeight;
- horizontalTrack.parent().append(
- $('<div class="jspCorner" />').css('width', horizontalTrackHeight + 'px')
- );
- sizeVerticalScrollbar();
- sizeHorizontalScrollbar();
- }
- // reflow content
- if (isScrollableH) {
- pane.width((container.outerWidth() - originalPaddingTotalWidth) + 'px');
- }
- contentHeight = pane.outerHeight();
- percentInViewV = contentHeight / paneHeight;
-
- if (isScrollableH) {
- horizontalDragWidth = 1 / percentInViewH * horizontalTrackWidth;
- if (horizontalDragWidth > settings.horizontalDragMaxWidth) {
- horizontalDragWidth = settings.horizontalDragMaxWidth;
- } else if (horizontalDragWidth < settings.horizontalDragMinWidth) {
- horizontalDragWidth = settings.horizontalDragMinWidth;
- }
- horizontalDrag.width(horizontalDragWidth + 'px');
- dragMaxX = horizontalTrackWidth - horizontalDragWidth;
- }
- if (isScrollableV) {
- verticalDragHeight = 1 / percentInViewV * verticalTrackHeight;
- if (verticalDragHeight > settings.verticalDragMaxHeight) {
- verticalDragHeight = settings.verticalDragMaxHeight;
- } else if (verticalDragHeight < settings.verticalDragMinHeight) {
- verticalDragHeight = settings.verticalDragMinHeight;
- }
- verticalDrag.height(verticalDragHeight + 'px');
- dragMaxY = verticalTrackHeight - verticalDragHeight;
- }
- }
-
- function appendArrows(ele, p, a1, a2)
- {
- var p1 = "before", p2 = "after", aTemp;
-
- // Sniff for mac... Is there a better way to determine whether the arrows would naturally appear
- // at the top or the bottom of the bar?
- if (p == "os") {
- p = /Mac/.test(navigator.platform) ? "after" : "split";
- }
- if (p == p1) {
- p2 = p;
- } else if (p == p2) {
- p1 = p;
- aTemp = a1;
- a1 = a2;
- a2 = aTemp;
- }
-
- ele[p1](a1)[p2](a2);
- }
-
- function getArrowScroll(dirX, dirY, ele) {
- return function()
- {
- arrowScroll(dirX, dirY, this, ele);
- this.blur();
- return false;
- }
- }
-
- function arrowScroll(dirX, dirY, arrow, ele)
- {
- arrow = $(arrow).addClass('jspActive');
-
- var eve, doScroll = function()
- {
- if (dirX != 0) {
- positionDragX(horizontalDragPosition + dirX * settings.arrowButtonSpeed, false);
- }
- if (dirY != 0) {
- positionDragY(verticalDragPosition + dirY * settings.arrowButtonSpeed, false);
- }
- },
- scrollInt = setInterval(doScroll, settings.arrowRepeatFreq);
-
- doScroll();
-
- eve = ele == undefined ? 'mouseup.jsp' : 'mouseout.jsp';
- ele = ele || $('html');
- ele.bind(
- eve,
- function()
- {
- arrow.removeClass('jspActive');
- clearInterval(scrollInt);
- ele.unbind(eve);
- }
- );
- }
-
- function cancelDrag()
- {
- $('html').unbind('dragstart.jsp selectstart.jsp mousemove.jsp mouseup.jsp mouseleave.jsp');
-
- verticalDrag && verticalDrag.removeClass('jspActive');
- horizontalDrag && horizontalDrag.removeClass('jspActive');
- }
-
- function positionDragY(destY, animate)
- {
- if (!isScrollableV) {
- return;
- }
- if (destY < 0) {
- destY = 0;
- } else if (destY > dragMaxY) {
- destY = dragMaxY;
- }
-
- // can't just check if(animate) because false is a valid value that could be passed in...
- if (animate == undefined) {
- animate = settings.animateScroll;
- }
- if (animate) {
- jsp.animate(verticalDrag, 'top', destY, _positionDragY);
- } else {
- verticalDrag.css('top', destY);
- _positionDragY(destY);
- }
-
- }
-
- function _positionDragY(destY)
- {
- if (destY == undefined) {
- destY = verticalDrag.position().top;
- }
-
- container.scrollTop(0);
- verticalDragPosition = destY;
-
- var isAtTop = verticalDragPosition == 0,
- isAtBottom = verticalDragPosition == dragMaxY,
- percentScrolled = destY/ dragMaxY,
- destTop = -percentScrolled * (contentHeight - paneHeight);
-
- updateVerticalArrows(isAtTop, isAtBottom);
- pane.css('top', destTop);
- elem.trigger('jsp-scroll-y', [-destTop, isAtTop, isAtBottom]);
- }
-
- function positionDragX(destX, animate)
- {
- if (!isScrollableH) {
- return;
- }
- if (destX < 0) {
- destX = 0;
- } else if (destX > dragMaxX) {
- destX = dragMaxX;
- }
-
- if (animate == undefined) {
- animate = settings.animateScroll;
- }
- if (animate) {
- jsp.animate(horizontalDrag, 'left', destX, _positionDragX);
- } else {
- horizontalDrag.css('left', destX);
- _positionDragX(destX);
- }
- }
-
- function _positionDragX(destX)
- {
- if (destX == undefined) {
- destX = horizontalDrag.position().left;
- }
-
- container.scrollTop(0);
- horizontalDragPosition = destX;
-
- var isAtLeft = horizontalDragPosition == 0,
- isAtRight = horizontalDragPosition == dragMaxY,
- percentScrolled = destX / dragMaxX,
- destLeft = -percentScrolled * (contentWidth - paneWidth);
-
- updateHorizontalArrows(isAtLeft, isAtRight);
- pane.css('left', destLeft);
- elem.trigger('jsp-scroll-x', [-destLeft, isAtLeft, isAtRight]);
- }
-
- function updateVerticalArrows(isAtTop, isAtBottom)
- {
- if (settings.showArrows) {
- arrowUp[isAtTop ? 'addClass' : 'removeClass']('jspDisabled');
- arrowDown[isAtBottom ? 'addClass' : 'removeClass']('jspDisabled');
- }
- }
-
- function updateHorizontalArrows(isAtLeft, isAtRight)
- {
- if (settings.showArrows) {
- arrowLeft[isAtLeft ? 'addClass' : 'removeClass']('jspDisabled');
- arrowRight[isAtRight ? 'addClass' : 'removeClass']('jspDisabled');
- }
- }
-
- function scrollToY(destY, animate)
- {
- var percentScrolled = destY / (contentHeight - paneHeight);
- positionDragY(percentScrolled * dragMaxY, animate);
- }
-
- function scrollToX(destX, animate)
- {
- var percentScrolled = destX / (contentWidth - paneWidth);
- positionDragX(percentScrolled * dragMaxX, animate);
- }
-
- function scrollToElement(ele, stickToTop, animate)
- {
- var e, eleHeight, eleTop = 0, viewportTop, maxVisibleEleTop, destY;
-
- // Legal hash values aren't necessarily legal jQuery selectors so we need to catch any
- // errors from the lookup...
- try {
- e = $(ele);
- } catch (err) {
- return;
- }
- eleHeight = e.outerHeight();
-
- container.scrollTop(0);
-
- // loop through parents adding the offset top of any elements that are relatively positioned between
- // the focused element and the jspPane so we can get the true distance from the top
- // of the focused element to the top of the scrollpane...
- while (!e.is('.jspPane')) {
- eleTop += e.position().top;
- e = e.offsetParent();
- if (/^body|html$/i.test(e[0].nodeName)) {
- // we ended up too high in the document structure. Quit!
- return;
- }
- }
-
-
- viewportTop = contentPositionY();
- maxVisibleEleTop = viewportTop + paneHeight;
- if (eleTop < viewportTop || stickToTop) { // element is above viewport
- destY = eleTop - settings.verticalGutter;
- } else if (eleTop + eleHeight > maxVisibleEleTop) { // element is below viewport
- destY = eleTop - paneHeight + eleHeight + settings.verticalGutter;
- }
- if (destY) {
- scrollToY(destY, animate);
- }
- // TODO: Implement automatic horizontal scrolling?
- }
-
- function contentPositionX()
- {
- return -pane.position().left;
- }
-
- function contentPositionY()
- {
- return -pane.position().top;
- }
-
- function initMousewheel()
- {
- container.unbind('mousewheel.jsp').bind(
- 'mousewheel.jsp',
- function (event, delta) {
- var d = verticalDragPosition;
- positionDragY(verticalDragPosition - delta * settings.mouseWheelSpeed, false);
- // return true if there was no movement so rest of screen can scroll
- return d == verticalDragPosition;
- }
- );
- }
-
- function removeMousewheel()
- {
- container.unbind('mousewheel.jsp');
- }
-
- function nil()
- {
- return false;
- }
-
- function initFocusHandler()
- {
- pane.find(':input,a').bind(
- 'focus.jsp',
- function()
- {
- scrollToElement(this, false);
- }
- );
- }
-
- function removeFocusHandler()
- {
-
- pane.find(':input,a').unbind('focus.jsp')
- }
-
- function observeHash()
- {
- if (location.hash && location.hash.length > 1) {
- var e, retryInt;
- try {
- e = $(location.hash);
- } catch (err) {
- return;
- }
-
- if (e.length && pane.find(e)) {
- // nasty workaround but it appears to take a little while before the hash has done its thing
- // to the rendered page so we just wait until the container's scrollTop has been messed up.
- if (container.scrollTop() == 0) {
- retryInt = setInterval(
- function()
- {
- if (container.scrollTop() > 0) {
- scrollToElement(location.hash, true);
- $(document).scrollTop(container.position().top);
- clearInterval(retryInt);
- }
- },
- 50
- )
- } else {
- scrollToElement(location.hash, true);
- $(document).scrollTop(container.position().top);
- }
- }
- }
- }
-
- function unhijackInternalLinks()
- {
- $('a.jspHijack').unbind('click.jsp-hijack').removeClass('jspHijack');
- }
-
- function hijackInternalLinks()
- {
- unhijackInternalLinks();
- $('a[href^=#]').addClass('jspHijack').bind(
- 'click.jsp-hijack',
- function()
- {
- var uriParts = this.href.split('#'), hash;
- if (uriParts.length > 1) {
- hash = uriParts[1];
- if (hash.length > 0 && pane.find('#' + hash).length > 0) {
- scrollToElement('#' + hash, true);
- // Need to return false otherwise things mess up... Would be nice to maybe also scroll
- // the window to the top of the scrollpane?
- return false;
- }
- }
- }
- )
- }
-
- // Public API
- $.extend(
- jsp,
- {
- // Reinitialises the scroll pane (if it's internal dimensions have changed since the last time it
- // was initialised). The settings object which is passed in will override any settings from the
- // previous time it was initialised - if you don't pass any settings then the ones from the previous
- // initialisation will be used.
- reinitialise: function(s)
- {
- s = $.extend({}, s, settings);
- initialise(s);
- },
- // Scrolls the specified element (a jQuery object, DOM node or jQuery selector string) into view so
- // that it can be seen within the viewport. If stickToTop is true then the element will appear at
- // the top of the viewport, if it is false then the viewport will scroll as little as possible to
- // show the element. You can also specify if you want animation to occur. If you don't provide this
- // argument then the animateScroll value from the settings object is used instead.
- scrollToElement: function(ele, stickToTop, animate)
- {
- scrollToElement(ele, stickToTop, animate);
- },
- // Scrolls the pane so that the specified co-ordinates within the content are at the top left
- // of the viewport. animate is optional and if not passed then the value of animateScroll from
- // the settings object this jScrollPane was initialised with is used.
- scrollTo: function(destX, destY, animate)
- {
- scrollToX(destX, animate);
- scrollToY(destY, animate);
- },
- // Scrolls the pane so that the specified co-ordinate within the content is at the left of the
- // viewport. animate is optional and if not passed then the value of animateScroll from the settings
- // object this jScrollPane was initialised with is used.
- scrollToX: function(destX, animate)
- {
- scrollToX(destX, animate);
- },
- // Scrolls the pane so that the specified co-ordinate within the content is at the top of the
- // viewport. animate is optional and if not passed then the value of animateScroll from the settings
- // object this jScrollPane was initialised with is used.
- scrollToY: function(destY, animate)
- {
- scrollToY(destY, animate);
- },
- // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- scrollBy: function(deltaX, deltaY, animate)
- {
- jsp.scrollByX(deltaX, animate);
- jsp.scrollByY(deltaY, animate);
- },
- // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- scrollByX: function(deltaX, animate)
- {
- var destX = contentPositionX() + deltaX,
- percentScrolled = destX / (contentWidth - paneWidth);
- positionDragX(percentScrolled * dragMaxX, animate);
- },
- // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
- // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
- scrollByY: function(deltaY, animate)
- {
- var destY = contentPositionY() + deltaY,
- percentScrolled = destY / (contentHeight - paneHeight);
- positionDragY(percentScrolled * dragMaxY, animate);
- },
- // This method is called when jScrollPane is trying to animate to a new position. You can override
- // it if you want to provide advanced animation functionality. It is passed the following arguments:
- // * ele - the element whose position is being animated
- // * prop - the property that is being animated
- // * value - the value it's being animated to
- // * stepCallback - a function that you must execute each time you update the value of the property
- // You can use the default implementation (below) as a starting point for your own implementation.
- animate: function(ele, prop, value, stepCallback)
- {
- var params = {};
- params[prop] = value;
- ele.animate(
- params,
- {
- 'duration' : settings.animateDuration,
- 'ease' : settings.animateEase,
- 'queue' : false,
- 'step' : stepCallback
- }
- );
- },
- // Returns the current x position of the viewport with regards to the content pane.
- getContentPositionX: function()
- {
- return contentPositionX();
- },
- // Returns the current y position of the viewport with regards to the content pane.
- getContentPositionY: function()
- {
- return contentPositionY();
- },
- // Gets a reference to the content pane. It is important that you use this method if you want to
- // edit the content of your jScrollPane as if you access the element directly then you may have some
- // problems (as your original element has had additional elements for the scrollbars etc added into
- // it).
- getContentPane: function()
- {
- return pane;
- },
- // Scrolls this jScrollPane down as far as it can currently scroll. If animate isn't passed then the
- // animateScroll value from settings is used instead.
- scrollToBottom: function(animate)
- {
- positionDragY(dragMaxY, animate);
- },
- // Hijacks the links on the page which link to content inside the scrollpane. If you have changed
- // the content of your page (e.g. via AJAX) and want to make sure any new anchor links to the
- // contents of your scroll pane will work then call this function.
- hijackInternalLinks: function()
- {
- hijackInternalLinks();
- }
- }
- );
- }
-
- // Pluginifying code...
-
- settings = $.extend({}, $.fn.jScrollPane.defaults, settings);
-
- var ret;
- this.each(
- function()
- {
- var elem = $(this), jspApi = elem.data('jsp');
- if (jspApi) {
- jspApi.reinitialise(settings);
- } else {
- jspApi = new JScrollPane(elem, settings);
- elem.data('jsp', jspApi);
- }
- ret = ret ? ret.add(elem) : elem;
- }
- )
- return ret;
- };
-
- $.fn.jScrollPane.defaults = {
- 'showArrows' : false,
- 'maintainPosition' : true,
- 'autoReinitialise' : false,
- 'autoReinitialiseDelay' : 500,
- 'verticalDragMinHeight' : 0,
- 'verticalDragMaxHeight' : 99999,
- 'horizontalDragMinWidth' : 0,
- 'horizontalDragMaxWidth' : 99999,
- 'animateScroll' : false,
- 'animateDuration' : 300,
- 'animateEase' : 'linear',
- 'hijackInternalLinks' : false,
- 'verticalGutter' : 4,
- 'horizontalGutter' : 4,
- 'mouseWheelSpeed' : 10,
- 'arrowButtonSpeed' : 10,
- 'arrowRepeatFreq' : 100,
- 'arrowScrollOnHover' : false,
- 'verticalArrowPositions' : 'split',
- 'horizontalArrowPositions' : 'split'
- };
-
-})(jQuery,this);
-
diff --git a/libs/bower_components/jScrollPane/issues/7/native.html b/libs/bower_components/jScrollPane/issues/7/native.html
deleted file mode 100644
index 51d0c8e6dc..0000000000
--- a/libs/bower_components/jScrollPane/issues/7/native.html
+++ /dev/null
@@ -1,171 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <!-- Thanks to Rob Lifford ( http://www.lifford.org/ ) for the test case -->
- <meta charset="utf-8">
- <title>jScrollPane 2 reinit bug?</title>
- <style type="text/css">
- body, html {
- margin: 0;
- padding: 20px;
- font-family: Verdana, sans-serif;
- font-size: 85%;
- line-height: 1.5;
- }
-
- .float {
- float: left;
- }
-
- .clear {
- clear: both;
- }
-
- .scroll-container {
- width: 400px;
- height: 200px;
- overflow: auto;
- margin: 0 2em 1.5em 0;
- }
-
- .fluid-width {
- width: 100%;
- }
-
- .padded {
- padding: 5px;
- }
-
- ul {
- margin: 0;
- padding: 0;
- line-height: 1;
- list-style: none;
- border-bottom: solid 1px #ccc;
- }
-
- li {
- margin: 0;
- padding: 10px 5px;
- border-top: solid 1px #ccc;
- }
-
- </style>
- <link rel="stylesheet" type="text/css" href="jscrollpane-2b1.css" />
-
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
-
- </head>
- <body>
-
- <div class="scroll-container float">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
-
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
-
- <li>the next list item</li>
- </ul>
- </div>
-
- <div class="scroll-container float">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- </ul>
- </div>
-
- <div class="scroll-container padded clear">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
-
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
-
- <li>the next list item</li>
- </ul>
- </div>
-
- <div class="scroll-container fluid-width clear">
- <ul>
- <li><strong>scrollable list box</strong></li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
-
- <li>another list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
-
- <li>list item</li>
- <li>another list item</li>
- <li>the next list item</li>
- <li>the next list item</li>
- <li>list item</li>
- <li>another list item</li>
-
- <li>the next list item</li>
- </ul>
- </div>
-
-
- <p class="clear"><button id="api">reinit via API</button> <button id="jsp">Reinit by re-calling .jScrollPane</button> </p>
-
- <p>In the above testcase: reinitialising jScrollPane (either via the api or simply by re-calling .jScrollPane() on the original element) strips out the width of the div.jspPane and causes a rendering issue: the absolutely-positioned div renders only as wide as its text content. The expected behavior is that it'll fill the available width, as it does on page load after the first call to .jScrollPane().</p>
-
-
-<p><strong>UPDATE:</strong> this is fixed for scrollable content in v2b2, but when the content is not scrollable there's still undesired rendering on first load.</p>
-
-<p>Additionally, padding calculations might need some tweaks. The third list box here is identical to the first two except for an added 5px of padding all the way around: note how the jspVerticalBar is partially pushed out of view.</p>
-
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/known_issues.html b/libs/bower_components/jScrollPane/known_issues.html
deleted file mode 100644
index 1d962fafda..0000000000
--- a/libs/bower_components/jScrollPane/known_issues.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - known issues</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - cross browser styleable scrollbars with jQuery and CSS</h1>
- <p>
- This page discusses known issues with jScrollPane and provides suggested workarounds for these issues.
- </p>
- <h2 id="opera-scrollbar">In Opera the main window scrollbar appears when a jScrollPane contains lots of content</h2>
- <p>
- As far as I can tell this is due to a bug in Opera. The workaround is to include something absolutely
- positioned as a parent of your jScrollPane. See <a href="http://code.google.com/p/jscrollpane/issues/detail?id=19">
- this bug report</a> (from the previous version of jScrollPane) for discussion of this problem.
- </p>
- <h2 id="webkit-css-first">In Webkit browsers CSS must be included before Javascript</h2>
- <p>
- For jScrollPane to work correctly in Webkit based browsers (e.g. Safari, Chrome, iOS and Android) then
- the CSS must be included above your javascript includes. Otherwise jScrollPane can't correctly measure
- the size of the item you are applying jScrollPane to. See all of the <a href="index.html#examples">
- example</a> or <a href="index.html#themes">theme</a> pages for a reference as to the correct ordering
- of items in your &lt;head&gt;.
- </p>
- <h2 id="specified-width">Width specified directly on an element you apply jScrollPane to will be overwritten</h2>
- <p>
- If you apply a width to an element (e.g. via jQuery's width method or via a style attribute) then this
- width will be overwritten when you reinitialise the scrollpane. Unforunately I can't find a way to avoid
- this and still support percentage based widths for elements/
- </p>
- <p>
- As a workaround you can specify the width via a CSS class refering to a stylesheet rule. If you can't do
- this (e.g. you calculate the width dynamically) you will have to wrap your element in an additional div
- and apply the width to that element while setting the width of your element to 100% via the stylesheet.
- </p>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/less_basic.html b/libs/bower_components/jScrollPane/less_basic.html
deleted file mode 100644
index db76f0201d..0000000000
--- a/libs/bower_components/jScrollPane/less_basic.html
+++ /dev/null
@@ -1,164 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>Less basic jScrollPane demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- // Initialise the scrollpanes
- $('.scroll-pane').jScrollPane();
-
- // Add some content to #pane2
- var pane2api = $('#pane2').data('jsp');
- var originalContent = pane2api.getContentPane().html();
- pane2api.getContentPane().html(originalContent + originalContent + originalContent);
-
- // Reinitialise the #pane2 scrollpane
- pane2api.reinitialise();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - less basic demo page</h1>
- <p>
- This page shows some slightly more complex features of jScrollPane... Matching multiple elements but
- allowing each to work independantly, <a href="api.html#reinitialise">reinitialising</a> when you call it
- again etc... Note that you need to use the API to <a href="api.html#getContentPane">getContentPane</a>
- to add and remove content (as your original element now contains the scrollbars etc).
- </p>
- <h2>Pane 1</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Pane 2</h2>
- <div class="scroll-pane" id="pane2">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/mwheel_intent.html b/libs/bower_components/jScrollPane/mwheel_intent.html
deleted file mode 100644
index c674cf14e7..0000000000
--- a/libs/bower_components/jScrollPane/mwheel_intent.html
+++ /dev/null
@@ -1,209 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane mwheelIntent demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the mwheelIntent plugin -->
- <script type="text/javascript" src="script/mwheelIntent.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - mwheelIntent demo page</h1>
- <p>
- This demonstration shows how the <a href="http://www.protofunc.com/scripts/jquery/mwheelIntent/">
- mwheelIntent</a> plugin can be used to increase the usability of jScrollPane when using the mouse wheel.
- Note that when you scroll this page the body continues to scroll unless you stop scrolling and move your
- mouse over a jScrollPane.
- </p>
- <p>
- To use the mwheelIntent plugin with jScrollPane simply include it in the head of your document (as I
- do above).
- </p>
-
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/override_animate.html b/libs/bower_components/jScrollPane/override_animate.html
deleted file mode 100644
index 448e898cff..0000000000
--- a/libs/bower_components/jScrollPane/override_animate.html
+++ /dev/null
@@ -1,215 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane override animate demo page</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
-
- div#forms
- {
- overflow: hidden;
-
- }
-
- form
- {
- float: left;
- width: 50%;
- padding: 0 0 1em;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var pane = $('.scroll-pane');
- pane.jScrollPane(
- {
- showArrows: true,
- animateScroll: true
- }
- );
- var api = pane.data('jsp');
-
- api.animate = function(ele, prop, value, stepCallback)
- {
- // Set the property to its new value
- ele.css(prop, value);
- // Call the stepCallback so that jScrollPane can update everything as necessary
- stepCallback();
- /*
- // Default implemenation for reference
- var params = {};
- params[prop] = value;
- ele.animate(
- params,
- {
- 'duration' : settings.animateDuration,
- 'easing' : settings.animateEase,
- 'queue' : false,
- 'step' : stepCallback
- }
- );
- */
- }
-
- $('#but-scroll-to').bind(
- 'click',
- function()
- {
- // Note, there is also scrollToX and scrollToY methods if you only
- // want to scroll in one dimension
- api.scrollTo(parseInt($('#toX').val()), parseInt($('#toY').val()));
- return false;
- }
- );
-
- $('#but-scroll-by').bind(
- 'click',
- function()
- {
- // Note, there is also scrollByX and scrollByY methods if you only
- // want to scroll in one dimension
- api.scrollBy(parseInt($('#byX').val()), parseInt($('#byY').val()));
- return false;
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - overriding animate example</h1>
- <p>
- This example extends the <a href="scroll_to_animate.html">scroll to animate</a> example to show how you
- can override the <a href="api.html#animate">animate</a> method of the jScrollPane API to implement your
- own custom animation.
- </p>
- <p>
- For the purposes of the demo we simply implement an animation which jumps to the end point (i.e. doesn't
- animate at all!) but it shows how you would hook your custom code in...
- </p>
- <div id="forms">
- <form>
- <fieldset>
- <legend>scrollTo functionality</legend>
- <label for="toX">To x:</label>
- <input type="text" id="toX" name="toX" value="0" />
- <label for="toY">To y:</label>
- <input type="text" id="toY" name="toY" value="0" />
- <input type="submit" id="but-scroll-to" value="Scroll to" />
- </fieldset>
- </form>
- <form>
- <fieldset>
- <legend>scrollBy functionality</legend>
- <label for="byX">By x:</label>
- <input type="text" id="byX" name="byX" value="0" />
- <label for="byY">By y:</label>
- <input type="text" id="byY" name="byY" value="0" />
- <input type="submit" id="but-scroll-by" value="Scroll by" />
- </fieldset>
- </form>
- </div>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p style="width: 900px;">
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/runeimp.html b/libs/bower_components/jScrollPane/runeimp.html
deleted file mode 100644
index 394f4049bf..0000000000
--- a/libs/bower_components/jScrollPane/runeimp.html
+++ /dev/null
@@ -1,314 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - RuneImp demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .section
- {
- width: 190px;
- height: 300px;
- float: left;
- margin: 0 0 1em 0;
- }
- .scroll-pane
- {
- width: 170px;
- padding: 0 10px;
- height: 100%;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - RuneImp demo page</h1>
- <p>
- This demonstration tries to recreate the situation described in
- <a href="http://code.google.com/p/jscrollpane/issues/detail?id=60#c65">this support ticket</a> to fix
- the problem and verify the fix. If you view this example page with javascript disabled and then with it
- enabled you will see that the result is almost identical in terms of scrollbar placement and content
- padding.
- </p>
- <p>
- After looking at this example it occured to me that the aim of the layout could probably be better served
- by using margins as well as padding so I put together a <a href="runeimp2.html">follow on example</a>.
- </p>
-
- <h2>Panes</h2>
- <div class="section">
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </div>
- <div class="section">
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </div>
- <div class="section">
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </div>
- <div class="section">
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/runeimp2.html b/libs/bower_components/jScrollPane/runeimp2.html
deleted file mode 100644
index afe5fd01c4..0000000000
--- a/libs/bower_components/jScrollPane/runeimp2.html
+++ /dev/null
@@ -1,320 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - RuneImp demo 2</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .section
- {
- width: 180px;
- margin: 0 13px 1em 0;
- height: 300px;
- float: left;
- }
- .last
- {
- margin-right: 0;
- }
- .scroll-pane
- {
- background: #fff;
- padding: 0 0 0 10px;
- width: 170px;
- height: 100%;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - RuneImp demo 2 page</h1>
- <p>
- This demonstration is an extension of the <a href="runeimp.html">RuneImp demo</a> to verify that
- jScrollPane works correctly when the gap between the sections is specified as margin on the container
- (rather than padding on the element). As you can see, I still using padding on the left hand side of
- the scrolling element to bring the text in from the edge but I also use margins to make the space on
- the right hand side of the scrollbars.
- </p>
- <p>
- Note that I've made the background of .scroll-pane white in this example to demonstrate that the gap
- is margin rather than padding. You can also change the margin rules on .section and .last to padding and
- the layout will continue to work as expected.
- </p>
-
- <h2>Panes</h2>
- <div class="section">
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </div>
- <div class="section">
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </div>
- <div class="section">
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </div>
- <div class="section last">
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/scroll_on_left.html b/libs/bower_components/jScrollPane/scroll_on_left.html
deleted file mode 100644
index 1031dd418a..0000000000
--- a/libs/bower_components/jScrollPane/scroll_on_left.html
+++ /dev/null
@@ -1,132 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane demo - scroll on left hand side</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
-
- /* Force the scroll bar to the left hand side of the screen */
- .jspVerticalBar
- {
- left: 0;
- }
-
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - scroll on left demo</h1>
- <p>
- This demonstration shows how you can make the jScrollPane scrollbars appear on the left hand side of
- your content. You simply set "left: 0" on the .jspVerticalBar class (this overrides the "right: 0" in
- the jquery.jscrollpane.css file).
- </p>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/scroll_to.html b/libs/bower_components/jScrollPane/scroll_to.html
deleted file mode 100644
index 3d8e173ac8..0000000000
--- a/libs/bower_components/jScrollPane/scroll_to.html
+++ /dev/null
@@ -1,188 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane scrollTo/ scrollBy demo page</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
-
- div#forms
- {
- overflow: hidden;
-
- }
-
- form
- {
- float: left;
- width: 50%;
- padding: 0 0 1em;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var pane = $('.scroll-pane');
- pane.jScrollPane(
- {
- showArrows: true
- }
- );
- var api = pane.data('jsp');
-
- $('#but-scroll-to').bind(
- 'click',
- function()
- {
- // Note, there is also scrollToX and scrollToY methods if you only
- // want to scroll in one dimension
- api.scrollTo(parseInt($('#toX').val()), parseInt($('#toY').val()));
- return false;
- }
- );
-
- $('#but-scroll-by').bind(
- 'click',
- function()
- {
- // Note, there is also scrollByX and scrollByY methods if you only
- // want to scroll in one dimension
- api.scrollBy(parseInt($('#byX').val()), parseInt($('#byY').val()));
- return false;
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - scrollTo/ scrollBy page</h1>
- <p>
- This example shows how you can use the jScrollPane <a href="api.html">API</a> to tell a scrollpane
- to <a href="api.html#scrollTo">scrollTo</a> a particular place or <a href="api.html#scrollBy">scrollBy
- </a> a particular amount. Use the form below to experiment with this functionality:
- </p>
- <div id="forms">
- <form>
- <fieldset>
- <legend>scrollTo functionality</legend>
- <label for="toX">To x:</label>
- <input type="text" id="toX" name="toX" value="0" />
- <label for="toY">To y:</label>
- <input type="text" id="toY" name="toY" value="0" />
- <input type="submit" id="but-scroll-to" value="Scroll to" />
- </fieldset>
- </form>
- <form>
- <fieldset>
- <legend>scrollBy functionality</legend>
- <label for="byX">By x:</label>
- <input type="text" id="byX" name="byX" value="0" />
- <label for="byY">By y:</label>
- <input type="text" id="byY" name="byY" value="0" />
- <input type="submit" id="but-scroll-by" value="Scroll by" />
- </fieldset>
- </form>
- </div>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p style="width: 900px;">
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/scroll_to_animate.html b/libs/bower_components/jScrollPane/scroll_to_animate.html
deleted file mode 100644
index 3ae825a211..0000000000
--- a/libs/bower_components/jScrollPane/scroll_to_animate.html
+++ /dev/null
@@ -1,197 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane scrollTo/ scrollBy with animation demo page</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
-
- div#forms
- {
- overflow: hidden;
-
- }
-
- form
- {
- float: left;
- width: 50%;
- padding: 0 0 1em;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- var pane = $('.scroll-pane');
- pane.jScrollPane(
- {
- showArrows: true,
- animateScroll: true
- }
- );
- var api = pane.data('jsp');
-
- $('#but-scroll-to').bind(
- 'click',
- function()
- {
- // Note, there is also scrollToX and scrollToY methods if you only
- // want to scroll in one dimension
- api.scrollTo(parseInt($('#toX').val()), parseInt($('#toY').val()));
- return false;
- }
- );
-
- $('#but-scroll-by').bind(
- 'click',
- function()
- {
- // Note, there is also scrollByX and scrollByY methods if you only
- // want to scroll in one dimension
- api.scrollBy(parseInt($('#byX').val()), parseInt($('#byY').val()));
- return false;
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - scrollTo/ scrollBy with animation page</h1>
- <p>
- This example extends the basic <a href="scroll_to.html">scrollTo/ scrollBy</a> demo and passes
- <strong><a href="settings.html#animateScroll">animateScroll</a>: true</strong> in the settings.
- This means that when you call <a href="api.html#scrollTo">scrollTo</a> or <a href="api.html#scrollBy">
- scrollBy</a> the transition to the new state is animated.
- </p>
- <p>
- Note that the <a href="api.html#animate">animate</a> function which is called is a property on the
- jScrollPane API method. This means that you are free to overwrite it if you want to implement custom
- animation settings for your paricular use case. If you just want to tweak the speed and easing of the
- default animation then you can use the <a href="settings.html#animateDuration">animateDuration</a> and
- <a href="settings.html#animateEase">animateEase</a> settings properties.
- </p>
- <div id="forms">
- <form>
- <fieldset>
- <legend>scrollTo functionality</legend>
- <label for="toX">To x:</label>
- <input type="text" id="toX" name="toX" value="0" />
- <label for="toY">To y:</label>
- <input type="text" id="toY" name="toY" value="0" />
- <input type="submit" id="but-scroll-to" value="Scroll to" />
- </fieldset>
- </form>
- <form>
- <fieldset>
- <legend>scrollBy functionality</legend>
- <label for="byX">By x:</label>
- <input type="text" id="byX" name="byX" value="0" />
- <label for="byY">By y:</label>
- <input type="text" id="byY" name="byY" value="0" />
- <input type="submit" id="but-scroll-by" value="Scroll by" />
- </fieldset>
- </form>
- </div>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p style="width: 900px;">
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/settings.html b/libs/bower_components/jScrollPane/settings.html
deleted file mode 100644
index aaa9ff50c5..0000000000
--- a/libs/bower_components/jScrollPane/settings.html
+++ /dev/null
@@ -1,202 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane - settings object documentation</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - settings object documentation</h1>
- <p>
- This page details the various options that you can pass into the settings object when you initialise
- jScrollPane. Note that there is also a number of changes you can make through the <a href="api.html">
- API</a> after the scrollpane is already initialised and a number of <a href="events.html">events</a> you
- can listen to.
- </p>
- <h2 id="showArrows">showArrows <span class="setting-type">- boolean (default false)</span></h2>
- <p>
- Whether arrows should be shown on the generated scroll pane. When set to false only the scrollbar track
- and drag will be shown, if set to true then arrows buttons will also be shown. <a href="arrows.html">
- Demo</a>.
- </p>
- <h2 id="maintainPosition">maintainPosition <span class="setting-type">- boolean (default true)</span></h2>
- <p>
- Whether the scrollpane should attempt to maintain it's position whenever it is reinitialised. If true
- then the viewport of the scrollpane will remain the same when it is reinitialised, if false then the
- viewport will jump back up to the top when the scrollpane is reinitialised. See also
- <a href="#stickToBottom">stickToBottom</a> and <a href="#stickToRight">stickToRight</a>.
- </p>
- <h2 id="stickToBottom">stickToBottom<span class="setting-type">- boolean (default false)</span></h2>
- <p>
- If <a href="#maintainPosition">maintainPosition</a> is true and the scrollpane is scrolled to the
- bottom then the scrollpane then the scrollpane will remain scrolled to the bottom even if new content
- is added to the pane which makes it taller.
- </p>
- <h2 id="stickToRight">stickToRight<span class="setting-type">- boolean (default false)</span></h2>
- <p>
- If <a href="#maintainPosition">maintainPosition</a> is true and the scrollpane is scrolled to its
- right edge then the scrollpane then the scrollpane will remain scrolled to the right edge even if new
- content is added to the pane which makes it wider.
- </p>
- <h2 id="autoReinitialise">autoReinitialise <span class="setting-type">- boolean (default false)</span></h2>
- <p>
- Whether jScrollPane should automatically reinitialise itself periodically after you have initially
- initialised it. This can help with instances when the size of the content of the scrollpane (or the
- surrounding element) changes. However, it does involve an overhead of running a javascript function on
- a timer so it is recommended only to activate where necessary. <a href="auto_reinitialise.html">Demo</a>.
- </p>
- <h2 id="autoReinitialiseDelay">autoReinitialiseDelay <span class="setting-type">- int (default 500)</span></h2>
- <p>
- The number of milliseconds between each reinitialisation (if <a href="#autoReinitialise">autoReinitialise</a>
- is true).
- </p>
- <h2 id="verticalDragMinHeight">verticalDragMinHeight <span class="setting-type">- int (default 0)</span></h2>
- <p>
- The smallest height that the vertical drag can have. The size of the drag elements is based on the
- proportion of the size of the content to the size of the viewport but is contrained within the minimum
- and maximum dimensions given. <a href="drag_size.html">Demo</a>.
- </p>
- <h2 id="verticalDragMaxHeight">verticalDragMaxHeight <span class="setting-type">- int (default 99999)</span></h2>
- <p>
- See <a href="#verticalDragMinHeight">verticalDragMinHeight</a>.
- </p>
- <h2 id="horizontalDragMinWidth">horizontalDragMinWidth <span class="setting-type">- int (default 0)</span></h2>
- <p>
- See <a href="#verticalDragMinHeight">verticalDragMinHeight</a>.
- </p>
- <h2 id="horizontalDragMaxWidth">horizontalDragMaxWidth <span class="setting-type">- int (default 99999)</span></h2>
- <p>
- See <a href="#verticalDragMinHeight">verticalDragMinHeight</a>.
- </p>
- <h2 id="contentWidth">contentWidth <span class="setting-type">- int (default undefined)</span></h2>
- <p>
- The width of the content of the scroll pane. The default value of undefined will allow jScrollPane to
- calculate the width of it's content. However, in some cases you will want to disable this (e.g. to
- prevent horizontal scrolling or where the calculation of the size of the content doesn't return reliable
- results)
- </p>
- <h2 id="animateScroll">animateScroll <span class="setting-type">- boolean (default false)</span></h2>
- <p>
- Whether to use animation when calling <a href="api.html#scrollTo">scrollTo</a> or <a href="api.html#scrollBy">
- scrollBy</a>. You can control the animation speed and easing by using the <a href="#animateDuration">
- animateDuration</a> and <a href="#animateEase">animateEase</a> settings or if you want to exercise more
- complete control then you can override the <a href="api.html#animate">animate</a> API method.
- <a href="scroll_to_animate.html">Demo</a>.
- </p>
- <h2 id="animateDuration">animateDuration <span class="setting-type">- int (default 300)</span></h2>
- <p>
- The number of milliseconds taken to animate to a new position (see <a href="#animateScroll">animateScroll
- </a>).
- </p>
- <h2 id="animateEase">animateEase <span class="setting-type">- string (default 'linear')</span></h2>
- <p>
- The type of easing to use when animating to a new position (see <a href="#animateScroll">animateScroll
- </a> and <a href="http://api.jquery.com/animate/#easing">easing</a>).
- </p>
- <h2 id="hijackInternalLinks">hijackInternalLinks <span class="setting-type">- boolean (default false)</span></h2>
- <p>
- Whether internal links on the page should be hijacked so that if they point so content within a
- jScrollPane then they automatically scroll the jScrollPane to the correct place. <a href="anchors.html">
- Demo</a>.
- </p>
- <h2 id="verticalGutter">verticalGutter <span class="setting-type">- int (default 4)</span></h2>
- <p>
- The amount of space between the side of the content and the vertical scrollbar.
- </p>
- <h2 id="horizontalGutter">horizontalGutter <span class="setting-type">- int (default 4)</span></h2>
- <p>
- The amount of space between the bottom of the content and the horizontal scrollbar.
- </p>
- <h2 id="mouseWheelSpeed">mouseWheelSpeed <span class="setting-type">- int (default 10)</span></h2>
- <p>
- A multiplier which is used to control the amount that the scrollpane scrolls each time the mouse wheel
- is turned. If a recent version of the mousewheel plugin is used then the `deltaFactor` from that is used
- to get a [more reliable](https://github.com/brandonaaron/jquery-mousewheel#getting-the-scroll-distance)
- indication of how far the user wanted to scroll.
- </p>
- <h2 id="arrowButtonSpeed">arrowButtonSpeed <span class="setting-type">- int (default 10)</span></h2>
- <p>
- A multiplier which is used to control the amount that the scrollpane scrolls each time on of the arrow
- buttons is pressed.
- </p>
- <h2 id="arrowRepeatFreq">arrowRepeatFreq <span class="setting-type">- int (default 100)</span></h2>
- <p>
- The number of milliseconds between each repeated scroll event when the mouse is held down over one of
- the arrow keys.
- </p>
- <h2 id="arrowScrollOnHover">arrowScrollOnHover <span class="setting-type">- boolean (default false)</span></h2>
- <p>
- Whether the arrow buttons should cause the jScrollPane to scroll while you are hovering over them.
- <a href="arrow_hover.html">Demo</a>.
- </p>
- <h2 id="verticalArrowPositions">
- verticalArrowPositions <span class="setting-type">- string [split|before|after|os] (default split)</span>
- </h2>
- <p>
- Where the vertical arrows should appear relative to the vertical track. <a href="arrow_positions.html">
- Demo</a>.
- </p>
- <h2 id="horizontalArrowPositions">
- horizontalArrowPositions <span class="setting-type">- string [split|before|after|os] (default split)</span>
- </h2>
- <p>
- Where the horizontal arrows should appear relative to the horizontal track. <a href="arrow_positions.html">
- Demo</a>.
- </p>
- <h2 id="enableKeyboardNavigation">
- enableKeyboardNavigation <span class="setting-type">- boolean (default true)</span>
- </h2>
- <p>
- Whether keyboard navigation should be enabled (e.g. whether the user can focus the scrollpane and then
- use the arrow (and other) keys to navigate around.
- </p>
- <h2 id="hideFocus">
- hideFocus <span class="setting-type">- boolean (default false)</span>
- </h2>
- <p>
- Whether the focus outline should be hidden in all browsers. For best accessibility you should not change
- this option. You can style the outline with the CSS property outline and outline-offset.
- </p>
- <h2 id="clickOnTrack">
- clickOnTrack <span class="setting-type">- boolean (default true)</span>
- </h2>
- <p>
- Whether clicking on the track (e.g. the area behind the drag) should scroll towards the point clicked on.
- Defaults to true as this is the native behaviour in these situations.
- </p>
- <h2 id="trackClickSpeed">trackClickSpeed <span class="setting-type">- int (default 30)</span></h2>
- <p>
- A multiplier which is used to control the amount that the scrollpane scrolls each trackClickRepeatFreq
- while the mouse button is held down over the track.
- </p>
- <h2 id="trackClickRepeatFreq">trackClickRepeatFreq <span class="setting-type">- int (default 100)</span></h2>
- <p>
- The number of milliseconds between each repeated scroll event when the mouse is held down over the
- track.
- </p>
-
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/short.html b/libs/bower_components/jScrollPane/short.html
deleted file mode 100644
index 0e2115b257..0000000000
--- a/libs/bower_components/jScrollPane/short.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>Short jScrollPane demo</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane
- {
- width: 100%;
- max-height: 200px;
- overflow: auto;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane();
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="index.html">Home</a></li>
- <li><a href="index.html#examples">Examples</a></li>
- <li><a href="index.html#themes">Themes</a></li>
- <li><a href="index.html#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="index.html#support">Support</a></li>
- <li><a href="index.html#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - demo page showing "no scroll necessary"</h1>
- <p>
- This demonstration shows how jScrollPane won't add scrollbars if you apply it to an element which
- doesn't require scrolling.
- </p>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_222222_256x240.png b/libs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_222222_256x240.png
deleted file mode 100755
index b273ff111d..0000000000
--- a/libs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_222222_256x240.png
+++ /dev/null
Binary files differ
diff --git a/libs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_888888_256x240.png b/libs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_888888_256x240.png
deleted file mode 100755
index 6d02426c11..0000000000
--- a/libs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_888888_256x240.png
+++ /dev/null
Binary files differ
diff --git a/libs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_cd0a0a_256x240.png b/libs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_cd0a0a_256x240.png
deleted file mode 100755
index 2ab019b73e..0000000000
--- a/libs/bower_components/jScrollPane/themes/lozenge/image/ui-icons_cd0a0a_256x240.png
+++ /dev/null
Binary files differ
diff --git a/libs/bower_components/jScrollPane/themes/lozenge/index.html b/libs/bower_components/jScrollPane/themes/lozenge/index.html
deleted file mode 100644
index e2092b6d83..0000000000
--- a/libs/bower_components/jScrollPane/themes/lozenge/index.html
+++ /dev/null
@@ -1,337 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane theme demo: Lozenge</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="../../style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="../../style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
- <!-- the styles for the lozenge theme -->
- <link type="text/css" href="style/jquery.jscrollpane.lozenge.css" rel="stylesheet" media="all" />
-
- <style type="text/css" id="page-css">
- /* Styles specific to this particular page */
- .scroll-pane,
- .scroll-pane-arrows
- {
- width: 100%;
- height: 200px;
- overflow: auto;
- }
- .horizontal-only
- {
- height: auto;
- max-height: 200px;
- }
- </style>
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="../../script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="../../script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="../../script/demo.js"></script>
-
- <script type="text/javascript" id="sourcecode">
- $(function()
- {
- $('.scroll-pane').jScrollPane();
- $('.scroll-pane-arrows').jScrollPane(
- {
- showArrows: true,
- horizontalGutter: 10
- }
- );
- });
- </script>
- </head>
- <body>
- <div id="top-nav">
- <img src="../../image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="../../">Home</a></li>
- <li><a href="../../#examples">Examples</a></li>
- <li><a href="../../#themes">Themes</a></li>
- <li><a href="../../#usage">How to use</a></li>
- <li><a href="../../faqs.html">FAQs</a></li>
- <li><a href="../../known_issues.html">Known issues</a></li>
- <li><a href="../../#support">Support</a></li>
- <li><a href="../../#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane - lozenge theme</h1>
- <p>
- Lozenge is a very simple theme with rounded corners for the drag element (on browsers which support the
- relevant CSS properties) and simple arrow graphics (borrowed from the jQuery UI
- <a href="http://jqueryui.com/themeroller/">Lightness</a> theme). It also supports hover and disabled
- states for the various elements.
- </p>
- <h2>Vertical only</h2>
- <div class="scroll-pane">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Vertical with arrows</h2>
- <div class="scroll-pane-arrows">
- <p>
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Horizontal only</h2>
- <div class="scroll-pane horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Horizontal only with arrows</h2>
- <div class="scroll-pane-arrows horizontal-only">
- <p style="width: 1000px;">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- </div>
- <h2>Both</h2>
- <div class="scroll-pane">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Both with arrows</h2>
- <div class="scroll-pane-arrows">
- <p style="width: 1000px">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec in ligula id sem tristique ultrices
- eget id neque. Duis enim turpis, tempus at accumsan vitae, lobortis id sapien. Pellentesque nec orci
- mi, in pharetra ligula. Nulla facilisi. Nulla facilisi. Mauris convallis venenatis massa, quis
- consectetur felis ornare quis. Sed aliquet nunc ac ante molestie ultricies. Nam pulvinar ultricies
- bibendum. Vivamus diam leo, faucibus et vehicula eu, molestie sit amet dui. Proin nec orci et elit
- semper ultrices. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus
- mus. Sed quis urna mi, ac dignissim mauris. Quisque mollis ornare mauris, sed laoreet diam malesuada
- quis. Proin vel elementum ante. Donec hendrerit arcu ac odio tincidunt posuere. Vestibulum nec risus
- eu lacus semper viverra.
- </p>
- <p>
- Vestibulum dictum consectetur magna eu egestas. Praesent molestie dapibus erat, sit amet sodales
- lectus congue ut. Nam adipiscing, tortor ac blandit egestas, lorem ligula posuere ipsum, nec
- faucibus nisl enim eu purus. Quisque bibendum diam quis nunc eleifend at molestie libero tincidunt.
- Quisque tincidunt sapien a sapien pellentesque consequat. Mauris adipiscing venenatis augue ut
- tempor. Donec auctor mattis quam quis aliquam. Nullam ultrices erat in dolor pharetra bibendum.
- Suspendisse eget odio ut libero imperdiet rhoncus. Curabitur aliquet, ipsum sit amet aliquet varius,
- est urna ullamcorper magna, sed eleifend libero nunc non erat. Vivamus semper turpis ac turpis
- volutpat non cursus velit aliquam. Fusce id tortor id sapien porta egestas. Nulla venenatis luctus
- libero et suscipit. Sed sed purus risus. Donec auctor, leo nec eleifend vehicula, lacus felis
- sollicitudin est, vitae lacinia lectus urna nec libero. Aliquam pellentesque, arcu condimentum
- pharetra vestibulum, lectus felis malesuada felis, vel fringilla dolor dui tempus nisi. In hac
- habitasse platea dictumst. Ut imperdiet mauris vitae eros varius eget accumsan lectus adipiscing.
- </p>
- <p>
- Quisque et massa leo, sit amet adipiscing nisi. Mauris vel condimentum dolor. Duis quis ullamcorper
- eros. Proin metus dui, facilisis id bibendum sed, aliquet non ipsum. Aenean pulvinar risus eu nisi
- dictum eleifend. Maecenas mattis dolor eget lectus pretium eget molestie libero auctor. Praesent sit
- amet tellus sed nibh convallis semper. Curabitur nisl odio, feugiat non dapibus sed, tincidunt ut
- est. Nullam erat velit, suscipit aliquet commodo sit amet, mollis in mauris. Curabitur pharetra
- dictum interdum. In posuere pretium ultricies. Curabitur volutpat eros vehicula quam ultrices
- varius. Proin volutpat enim a massa tempor ornare. Sed ullamcorper fermentum nisl, ac hendrerit sem
- feugiat ac. Donec porttitor ullamcorper quam. Morbi pretium adipiscing quam, quis bibendum diam
- congue eget. Sed at lectus at est malesuada iaculis. Sed fermentum quam dui. Donec eget ipsum dolor,
- id mollis nisi. Donec fermentum vehicula porta.
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero
- sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed,
- commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros
- ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis.
- Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna
- eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis
- luctus, metus
- </p>
- <p>
- Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
- Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit
- amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
- </p>
- </div>
- <h2>Page javascript</h2>
- <div id="sourcecode-display">
- <p>The contents of this div will be replaced by the javascript added to this page</p>
- </div>
- <h2>Page CSS</h2>
- <div id="css-display">
- <p>The contents of this div will be replaced by the CSS added to this page</p>
- </div>
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/themes/lozenge/style/jquery.jscrollpane.lozenge.css b/libs/bower_components/jScrollPane/themes/lozenge/style/jquery.jscrollpane.lozenge.css
deleted file mode 100644
index 7bdbffa016..0000000000
--- a/libs/bower_components/jScrollPane/themes/lozenge/style/jquery.jscrollpane.lozenge.css
+++ /dev/null
@@ -1,78 +0,0 @@
-
-.jspHorizontalBar,
-.jspVerticalBar,
-.jspTrack
-{
- background: #eeeef4;
-}
-
-.jspDrag
-{
- background: #bbd;
-
- -moz-border-radius: 10px;
- -webkit-border-radius: 10px;
- border-radius: 10px;
-}
-
-.jspTrack .jspActive,
-.jspTrack .jspHover,
-.jspDrag:hover
-{
- background: #8B8B9F;
-}
-
-
-.jspArrow
-{
- background: url(../image/ui-icons_222222_256x240.png) no-repeat;
-
- -moz-border-radius: 10px;
- -webkit-border-radius: 10px;
- border-radius: 10px;
-}
-
-.jspVerticalBar>.jspActive,
-.jspArrow:hover
-{
- background-image: url('../image/ui-icons_cd0a0a_256x240.png');
-}
-
-.jspVerticalBar>.jspDisabled,
-.jspVerticalBar>.jspDisabled:hover,
-.jspHorizontalBar>.jspDisabled,
-.jspHorizontalBar>.jspDisabled:hover
-{
- background-color: transparent;
- background-image: url('../image/ui-icons_888888_256x240.png');
-}
-
-.jspVerticalBar .jspArrow
-{
- height: 15px;
-}
-
-.jspHorizontalBar .jspArrow
-{
- width: 15px;
-}
-
-.jspArrowUp
-{
- background-position: 0 0;
-}
-
-.jspArrowDown
-{
- background-position: -64px 0 !important;
-}
-
-.jspArrowLeft
-{
- background-position: -96px 0 !important;
-}
-
-.jspArrowRight
-{
- background-position: -32px 0 !important;
-} \ No newline at end of file
diff --git a/libs/bower_components/jScrollPane/v1.html b/libs/bower_components/jScrollPane/v1.html
deleted file mode 100644
index 4c14ae5a74..0000000000
--- a/libs/bower_components/jScrollPane/v1.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
-<html>
- <head>
-
- <title>jScrollPane version 1.x</title>
-
- <!-- styles specific to demo site -->
- <link type="text/css" href="style/demo.css" rel="stylesheet" media="all" />
- <!-- styles needed by jScrollPane - include in your own sites -->
- <link type="text/css" href="style/jquery.jscrollpane.css" rel="stylesheet" media="all" />
-
- <!-- latest jQuery direct from google's CDN -->
- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
- <!-- the mousewheel plugin -->
- <script type="text/javascript" src="script/jquery.mousewheel.js"></script>
- <!-- the jScrollPane script -->
- <script type="text/javascript" src="script/jquery.jscrollpane.min.js"></script>
- <!-- scripts specific to this demo site -->
- <script type="text/javascript" src="script/demo.js"></script>
- </head>
- <body>
- <div id="top-nav">
- <img src="image/logo.png" width="196" height="69" alt="jScrollPane">
- <ul>
- <li><a href="#">Home</a></li>
- <li><a href="#examples">Examples</a></li>
- <li><a href="#themes">Themes</a></li>
- <li><a href="#usage">How to use</a></li>
- <li><a href="faqs.html">FAQs</a></li>
- <li><a href="known_issues.html">Known issues</a></li>
- <li><a href="#support">Support</a></li>
- <li><a href="#download">Download</a></li>
- </ul>
- </div>
- <div id="container">
- <h1>jScrollPane version 1.x</h1>
- <p>
- You followed a link to a page for version 1 of jScrollPane - the jQuery plugin which provides cross browser
- custom scrollbars. Version 1 is now deprecated and all development/ support is concentrated on version 2 of
- the plugin. I suggest that you visit the <a href="/">new jScrollPane homepage</a> to find out all about version
- 2 of the plugin.
- </p>
- <p>
- If you must use version 1 of the (for example because you are updating a site that was originally built using
- version 1) then you can find the old site <a href="v1/demo/jScrollPane.html" rel="nofollow">here</a>.
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/libs/bower_components/jquery/src/.jshintrc b/libs/bower_components/jquery/src/.jshintrc
deleted file mode 100644
index ea3549d5c6..0000000000
--- a/libs/bower_components/jquery/src/.jshintrc
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "boss": true,
- "curly": true,
- "eqeqeq": true,
- "eqnull": true,
- "expr": true,
- "immed": true,
- "noarg": true,
- "quotmark": "double",
- "undef": true,
- "unused": true,
-
- "sub": true,
-
- // Support: IE < 10, Android < 4.1
- // The above browsers are failing a lot of tests in the ES5
- // test suite at http://test262.ecmascript.org.
- "es3": true,
-
- "globals": {
- "window": true,
- "JSON": false,
-
- "jQuery": true,
- "define": true,
- "module": true,
- "noGlobal": true
- }
-}
diff --git a/libs/bower_components/jquery/src/ajax.js b/libs/bower_components/jquery/src/ajax.js
deleted file mode 100644
index ba32248324..0000000000
--- a/libs/bower_components/jquery/src/ajax.js
+++ /dev/null
@@ -1,845 +0,0 @@
-define( [
- "./core",
- "./var/document",
- "./var/rnotwhite",
- "./ajax/var/location",
- "./ajax/var/nonce",
- "./ajax/var/rquery",
-
- "./core/init",
- "./ajax/parseJSON",
- "./ajax/parseXML",
- "./event/trigger",
- "./deferred"
-], function( jQuery, document, rnotwhite, location, nonce, rquery ) {
-
-var
- rhash = /#.*$/,
- rts = /([?&])_=[^&]*/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
-
- // #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
- rnoContent = /^(?:GET|HEAD)$/,
- rprotocol = /^\/\//,
-
- /* Prefilters
- * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
- * 2) These are called:
- * - BEFORE asking for a transport
- * - AFTER param serialization (s.data is a string if s.processData is true)
- * 3) key is the dataType
- * 4) the catchall symbol "*" can be used
- * 5) execution will start with transport dataType and THEN continue down to "*" if needed
- */
- prefilters = {},
-
- /* Transports bindings
- * 1) key is the dataType
- * 2) the catchall symbol "*" can be used
- * 3) selection will start with transport dataType and THEN go to "*" if needed
- */
- transports = {},
-
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
- allTypes = "*/".concat( "*" ),
-
- // Anchor tag for parsing the document origin
- originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
- // dataTypeExpression is optional and defaults to "*"
- return function( dataTypeExpression, func ) {
-
- if ( typeof dataTypeExpression !== "string" ) {
- func = dataTypeExpression;
- dataTypeExpression = "*";
- }
-
- var dataType,
- i = 0,
- dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
-
- if ( jQuery.isFunction( func ) ) {
-
- // For each dataType in the dataTypeExpression
- while ( ( dataType = dataTypes[ i++ ] ) ) {
-
- // Prepend if requested
- if ( dataType[ 0 ] === "+" ) {
- dataType = dataType.slice( 1 ) || "*";
- ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
-
- // Otherwise append
- } else {
- ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
- }
- }
- }
- };
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
- var inspected = {},
- seekingTransport = ( structure === transports );
-
- function inspect( dataType ) {
- var selected;
- inspected[ dataType ] = true;
- jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
- var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
- if ( typeof dataTypeOrTransport === "string" &&
- !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-
- options.dataTypes.unshift( dataTypeOrTransport );
- inspect( dataTypeOrTransport );
- return false;
- } else if ( seekingTransport ) {
- return !( selected = dataTypeOrTransport );
- }
- } );
- return selected;
- }
-
- return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
- var key, deep,
- flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
- for ( key in src ) {
- if ( src[ key ] !== undefined ) {
- ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
- }
- }
- if ( deep ) {
- jQuery.extend( true, target, deep );
- }
-
- return target;
-}
-
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
- var ct, type, finalDataType, firstDataType,
- contents = s.contents,
- dataTypes = s.dataTypes;
-
- // Remove auto dataType and get content-type in the process
- while ( dataTypes[ 0 ] === "*" ) {
- dataTypes.shift();
- if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
- }
- }
-
- // Check if we're dealing with a known content-type
- if ( ct ) {
- for ( type in contents ) {
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
- dataTypes.unshift( type );
- break;
- }
- }
- }
-
- // Check to see if we have a response for the expected dataType
- if ( dataTypes[ 0 ] in responses ) {
- finalDataType = dataTypes[ 0 ];
- } else {
-
- // Try convertible dataTypes
- for ( type in responses ) {
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
- finalDataType = type;
- break;
- }
- if ( !firstDataType ) {
- firstDataType = type;
- }
- }
-
- // Or just use first one
- finalDataType = finalDataType || firstDataType;
- }
-
- // If we found a dataType
- // We add the dataType to the list if needed
- // and return the corresponding response
- if ( finalDataType ) {
- if ( finalDataType !== dataTypes[ 0 ] ) {
- dataTypes.unshift( finalDataType );
- }
- return responses[ finalDataType ];
- }
-}
-
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
- var conv2, current, conv, tmp, prev,
- converters = {},
-
- // Work with a copy of dataTypes in case we need to modify it for conversion
- dataTypes = s.dataTypes.slice();
-
- // Create converters map with lowercased keys
- if ( dataTypes[ 1 ] ) {
- for ( conv in s.converters ) {
- converters[ conv.toLowerCase() ] = s.converters[ conv ];
- }
- }
-
- current = dataTypes.shift();
-
- // Convert to each sequential dataType
- while ( current ) {
-
- if ( s.responseFields[ current ] ) {
- jqXHR[ s.responseFields[ current ] ] = response;
- }
-
- // Apply the dataFilter if provided
- if ( !prev && isSuccess && s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
- }
-
- prev = current;
- current = dataTypes.shift();
-
- if ( current ) {
-
- // There's only work to do if current dataType is non-auto
- if ( current === "*" ) {
-
- current = prev;
-
- // Convert response if prev dataType is non-auto and differs from current
- } else if ( prev !== "*" && prev !== current ) {
-
- // Seek a direct converter
- conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
- // If none found, seek a pair
- if ( !conv ) {
- for ( conv2 in converters ) {
-
- // If conv2 outputs current
- tmp = conv2.split( " " );
- if ( tmp[ 1 ] === current ) {
-
- // If prev can be converted to accepted input
- conv = converters[ prev + " " + tmp[ 0 ] ] ||
- converters[ "* " + tmp[ 0 ] ];
- if ( conv ) {
-
- // Condense equivalence converters
- if ( conv === true ) {
- conv = converters[ conv2 ];
-
- // Otherwise, insert the intermediate dataType
- } else if ( converters[ conv2 ] !== true ) {
- current = tmp[ 0 ];
- dataTypes.unshift( tmp[ 1 ] );
- }
- break;
- }
- }
- }
- }
-
- // Apply converter (if not an equivalence)
- if ( conv !== true ) {
-
- // Unless errors are allowed to bubble, catch and return them
- if ( conv && s.throws ) {
- response = conv( response );
- } else {
- try {
- response = conv( response );
- } catch ( e ) {
- return {
- state: "parsererror",
- error: conv ? e : "No conversion from " + prev + " to " + current
- };
- }
- }
- }
- }
- }
- }
-
- return { state: "success", data: response };
-}
-
-jQuery.extend( {
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {},
-
- ajaxSettings: {
- url: location.href,
- type: "GET",
- isLocal: rlocalProtocol.test( location.protocol ),
- global: true,
- processData: true,
- async: true,
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
- /*
- timeout: 0,
- data: null,
- dataType: null,
- username: null,
- password: null,
- cache: null,
- throws: false,
- traditional: false,
- headers: {},
- */
-
- accepts: {
- "*": allTypes,
- text: "text/plain",
- html: "text/html",
- xml: "application/xml, text/xml",
- json: "application/json, text/javascript"
- },
-
- contents: {
- xml: /\bxml\b/,
- html: /\bhtml/,
- json: /\bjson\b/
- },
-
- responseFields: {
- xml: "responseXML",
- text: "responseText",
- json: "responseJSON"
- },
-
- // Data converters
- // Keys separate source (or catchall "*") and destination types with a single space
- converters: {
-
- // Convert anything to text
- "* text": String,
-
- // Text to html (true = no transformation)
- "text html": true,
-
- // Evaluate text as a json expression
- "text json": jQuery.parseJSON,
-
- // Parse text as xml
- "text xml": jQuery.parseXML
- },
-
- // For options that shouldn't be deep extended:
- // you can add your own custom options here if
- // and when you create one that shouldn't be
- // deep extended (see ajaxExtend)
- flatOptions: {
- url: true,
- context: true
- }
- },
-
- // Creates a full fledged settings object into target
- // with both ajaxSettings and settings fields.
- // If target is omitted, writes into ajaxSettings.
- ajaxSetup: function( target, settings ) {
- return settings ?
-
- // Building a settings object
- ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
- // Extending ajaxSettings
- ajaxExtend( jQuery.ajaxSettings, target );
- },
-
- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
- ajaxTransport: addToPrefiltersOrTransports( transports ),
-
- // Main method
- ajax: function( url, options ) {
-
- // If url is an object, simulate pre-1.5 signature
- if ( typeof url === "object" ) {
- options = url;
- url = undefined;
- }
-
- // Force options to be an object
- options = options || {};
-
- var transport,
-
- // URL without anti-cache param
- cacheURL,
-
- // Response headers
- responseHeadersString,
- responseHeaders,
-
- // timeout handle
- timeoutTimer,
-
- // Url cleanup var
- urlAnchor,
-
- // To know if global events are to be dispatched
- fireGlobals,
-
- // Loop variable
- i,
-
- // Create the final options object
- s = jQuery.ajaxSetup( {}, options ),
-
- // Callbacks context
- callbackContext = s.context || s,
-
- // Context for global events is callbackContext if it is a DOM node or jQuery collection
- globalEventContext = s.context &&
- ( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
-
- // Deferreds
- deferred = jQuery.Deferred(),
- completeDeferred = jQuery.Callbacks( "once memory" ),
-
- // Status-dependent callbacks
- statusCode = s.statusCode || {},
-
- // Headers (they are sent all at once)
- requestHeaders = {},
- requestHeadersNames = {},
-
- // The jqXHR state
- state = 0,
-
- // Default abort message
- strAbort = "canceled",
-
- // Fake xhr
- jqXHR = {
- readyState: 0,
-
- // Builds headers hashtable if needed
- getResponseHeader: function( key ) {
- var match;
- if ( state === 2 ) {
- if ( !responseHeaders ) {
- responseHeaders = {};
- while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
- responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
- }
- }
- match = responseHeaders[ key.toLowerCase() ];
- }
- return match == null ? null : match;
- },
-
- // Raw string
- getAllResponseHeaders: function() {
- return state === 2 ? responseHeadersString : null;
- },
-
- // Caches the header
- setRequestHeader: function( name, value ) {
- var lname = name.toLowerCase();
- if ( !state ) {
- name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
- requestHeaders[ name ] = value;
- }
- return this;
- },
-
- // Overrides response content-type header
- overrideMimeType: function( type ) {
- if ( !state ) {
- s.mimeType = type;
- }
- return this;
- },
-
- // Status-dependent callbacks
- statusCode: function( map ) {
- var code;
- if ( map ) {
- if ( state < 2 ) {
- for ( code in map ) {
-
- // Lazy-add the new callback in a way that preserves old ones
- statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
- }
- } else {
-
- // Execute the appropriate callbacks
- jqXHR.always( map[ jqXHR.status ] );
- }
- }
- return this;
- },
-
- // Cancel the request
- abort: function( statusText ) {
- var finalText = statusText || strAbort;
- if ( transport ) {
- transport.abort( finalText );
- }
- done( 0, finalText );
- return this;
- }
- };
-
- // Attach deferreds
- deferred.promise( jqXHR ).complete = completeDeferred.add;
- jqXHR.success = jqXHR.done;
- jqXHR.error = jqXHR.fail;
-
- // Remove hash character (#7531: and string promotion)
- // Add protocol if not provided (prefilters might expect it)
- // Handle falsy url in the settings object (#10093: consistency with old signature)
- // We also use the url parameter if available
- s.url = ( ( url || s.url || location.href ) + "" ).replace( rhash, "" )
- .replace( rprotocol, location.protocol + "//" );
-
- // Alias method option to type as per ticket #12004
- s.type = options.method || options.type || s.method || s.type;
-
- // Extract dataTypes list
- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
-
- // A cross-domain request is in order when the origin doesn't match the current origin.
- if ( s.crossDomain == null ) {
- urlAnchor = document.createElement( "a" );
-
- // Support: IE8-11+
- // IE throws exception if url is malformed, e.g. http://example.com:80x/
- try {
- urlAnchor.href = s.url;
-
- // Support: IE8-11+
- // Anchor's host property isn't correctly set when s.url is relative
- urlAnchor.href = urlAnchor.href;
- s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
- urlAnchor.protocol + "//" + urlAnchor.host;
- } catch ( e ) {
-
- // If there is an error parsing the URL, assume it is crossDomain,
- // it can be rejected by the transport if it is invalid
- s.crossDomain = true;
- }
- }
-
- // Convert data if not already a string
- if ( s.data && s.processData && typeof s.data !== "string" ) {
- s.data = jQuery.param( s.data, s.traditional );
- }
-
- // Apply prefilters
- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
- // If request was aborted inside a prefilter, stop there
- if ( state === 2 ) {
- return jqXHR;
- }
-
- // We can fire global events as of now if asked to
- // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
- fireGlobals = jQuery.event && s.global;
-
- // Watch for a new set of requests
- if ( fireGlobals && jQuery.active++ === 0 ) {
- jQuery.event.trigger( "ajaxStart" );
- }
-
- // Uppercase the type
- s.type = s.type.toUpperCase();
-
- // Determine if request has content
- s.hasContent = !rnoContent.test( s.type );
-
- // Save the URL in case we're toying with the If-Modified-Since
- // and/or If-None-Match header later on
- cacheURL = s.url;
-
- // More options handling for requests with no content
- if ( !s.hasContent ) {
-
- // If data is available, append data to url
- if ( s.data ) {
- cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
-
- // #9682: remove data so that it's not used in an eventual retry
- delete s.data;
- }
-
- // Add anti-cache in url if needed
- if ( s.cache === false ) {
- s.url = rts.test( cacheURL ) ?
-
- // If there is already a '_' parameter, set its value
- cacheURL.replace( rts, "$1_=" + nonce++ ) :
-
- // Otherwise add one to the end
- cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
- }
- }
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- if ( jQuery.lastModified[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
- }
- if ( jQuery.etag[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
- }
- }
-
- // Set the correct header, if data is being sent
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
- }
-
- // Set the Accepts header for the server, depending on the dataType
- jqXHR.setRequestHeader(
- "Accept",
- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
- s.accepts[ s.dataTypes[ 0 ] ] +
- ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
- s.accepts[ "*" ]
- );
-
- // Check for headers option
- for ( i in s.headers ) {
- jqXHR.setRequestHeader( i, s.headers[ i ] );
- }
-
- // Allow custom headers/mimetypes and early abort
- if ( s.beforeSend &&
- ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-
- // Abort if not done already and return
- return jqXHR.abort();
- }
-
- // Aborting is no longer a cancellation
- strAbort = "abort";
-
- // Install callbacks on deferreds
- for ( i in { success: 1, error: 1, complete: 1 } ) {
- jqXHR[ i ]( s[ i ] );
- }
-
- // Get transport
- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
- // If no transport, we auto-abort
- if ( !transport ) {
- done( -1, "No Transport" );
- } else {
- jqXHR.readyState = 1;
-
- // Send global event
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
- }
-
- // If request was aborted inside ajaxSend, stop there
- if ( state === 2 ) {
- return jqXHR;
- }
-
- // Timeout
- if ( s.async && s.timeout > 0 ) {
- timeoutTimer = window.setTimeout( function() {
- jqXHR.abort( "timeout" );
- }, s.timeout );
- }
-
- try {
- state = 1;
- transport.send( requestHeaders, done );
- } catch ( e ) {
-
- // Propagate exception as error if not done
- if ( state < 2 ) {
- done( -1, e );
-
- // Simply rethrow otherwise
- } else {
- throw e;
- }
- }
- }
-
- // Callback for when everything is done
- function done( status, nativeStatusText, responses, headers ) {
- var isSuccess, success, error, response, modified,
- statusText = nativeStatusText;
-
- // Called once
- if ( state === 2 ) {
- return;
- }
-
- // State is "done" now
- state = 2;
-
- // Clear timeout if it exists
- if ( timeoutTimer ) {
- window.clearTimeout( timeoutTimer );
- }
-
- // Dereference transport for early garbage collection
- // (no matter how long the jqXHR object will be used)
- transport = undefined;
-
- // Cache response headers
- responseHeadersString = headers || "";
-
- // Set readyState
- jqXHR.readyState = status > 0 ? 4 : 0;
-
- // Determine if successful
- isSuccess = status >= 200 && status < 300 || status === 304;
-
- // Get response data
- if ( responses ) {
- response = ajaxHandleResponses( s, jqXHR, responses );
- }
-
- // Convert no matter what (that way responseXXX fields are always set)
- response = ajaxConvert( s, response, jqXHR, isSuccess );
-
- // If successful, handle type chaining
- if ( isSuccess ) {
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- modified = jqXHR.getResponseHeader( "Last-Modified" );
- if ( modified ) {
- jQuery.lastModified[ cacheURL ] = modified;
- }
- modified = jqXHR.getResponseHeader( "etag" );
- if ( modified ) {
- jQuery.etag[ cacheURL ] = modified;
- }
- }
-
- // if no content
- if ( status === 204 || s.type === "HEAD" ) {
- statusText = "nocontent";
-
- // if not modified
- } else if ( status === 304 ) {
- statusText = "notmodified";
-
- // If we have data, let's convert it
- } else {
- statusText = response.state;
- success = response.data;
- error = response.error;
- isSuccess = !error;
- }
- } else {
-
- // Extract error from statusText and normalize for non-aborts
- error = statusText;
- if ( status || !statusText ) {
- statusText = "error";
- if ( status < 0 ) {
- status = 0;
- }
- }
- }
-
- // Set data for the fake xhr object
- jqXHR.status = status;
- jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
- // Success/Error
- if ( isSuccess ) {
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
- } else {
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
- }
-
- // Status-dependent callbacks
- jqXHR.statusCode( statusCode );
- statusCode = undefined;
-
- if ( fireGlobals ) {
- globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
- [ jqXHR, s, isSuccess ? success : error ] );
- }
-
- // Complete
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-
- // Handle the global AJAX counter
- if ( !( --jQuery.active ) ) {
- jQuery.event.trigger( "ajaxStop" );
- }
- }
- }
-
- return jqXHR;
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get( url, data, callback, "json" );
- },
-
- getScript: function( url, callback ) {
- return jQuery.get( url, undefined, callback, "script" );
- }
-} );
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
- jQuery[ method ] = function( url, data, callback, type ) {
-
- // Shift arguments if data argument was omitted
- if ( jQuery.isFunction( data ) ) {
- type = type || callback;
- callback = data;
- data = undefined;
- }
-
- // The url can be an options object (which then must have .url)
- return jQuery.ajax( jQuery.extend( {
- url: url,
- type: method,
- dataType: type,
- data: data,
- success: callback
- }, jQuery.isPlainObject( url ) && url ) );
- };
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/ajax/jsonp.js b/libs/bower_components/jquery/src/ajax/jsonp.js
deleted file mode 100644
index 666e5d1e6d..0000000000
--- a/libs/bower_components/jquery/src/ajax/jsonp.js
+++ /dev/null
@@ -1,100 +0,0 @@
-define( [
- "../core",
- "./var/nonce",
- "./var/rquery",
- "../ajax"
-], function( jQuery, nonce, rquery ) {
-
-var oldCallbacks = [],
- rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup( {
- jsonp: "callback",
- jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
- this[ callback ] = true;
- return callback;
- }
-} );
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
- var callbackName, overwritten, responseContainer,
- jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
- "url" :
- typeof s.data === "string" &&
- ( s.contentType || "" )
- .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
- rjsonp.test( s.data ) && "data"
- );
-
- // Handle iff the expected data type is "jsonp" or we have a parameter to set
- if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
- // Get callback name, remembering preexisting value associated with it
- callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
- s.jsonpCallback() :
- s.jsonpCallback;
-
- // Insert callback into url or form data
- if ( jsonProp ) {
- s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
- } else if ( s.jsonp !== false ) {
- s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
- }
-
- // Use data converter to retrieve json after script execution
- s.converters[ "script json" ] = function() {
- if ( !responseContainer ) {
- jQuery.error( callbackName + " was not called" );
- }
- return responseContainer[ 0 ];
- };
-
- // Force json dataType
- s.dataTypes[ 0 ] = "json";
-
- // Install callback
- overwritten = window[ callbackName ];
- window[ callbackName ] = function() {
- responseContainer = arguments;
- };
-
- // Clean-up function (fires after converters)
- jqXHR.always( function() {
-
- // If previous value didn't exist - remove it
- if ( overwritten === undefined ) {
- jQuery( window ).removeProp( callbackName );
-
- // Otherwise restore preexisting value
- } else {
- window[ callbackName ] = overwritten;
- }
-
- // Save back as free
- if ( s[ callbackName ] ) {
-
- // Make sure that re-using the options doesn't screw things around
- s.jsonpCallback = originalSettings.jsonpCallback;
-
- // Save the callback name for future use
- oldCallbacks.push( callbackName );
- }
-
- // Call if it was a function and we have a response
- if ( responseContainer && jQuery.isFunction( overwritten ) ) {
- overwritten( responseContainer[ 0 ] );
- }
-
- responseContainer = overwritten = undefined;
- } );
-
- // Delegate to script
- return "script";
- }
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/ajax/load.js b/libs/bower_components/jquery/src/ajax/load.js
deleted file mode 100644
index 5ec3fa2525..0000000000
--- a/libs/bower_components/jquery/src/ajax/load.js
+++ /dev/null
@@ -1,83 +0,0 @@
-define( [
- "../core",
- "../core/parseHTML",
- "../ajax",
- "../traversing",
- "../manipulation",
- "../selector",
-
- // Optional event/alias dependency
- "../event/alias"
-], function( jQuery ) {
-
-// Keep a copy of the old load method
-var _load = jQuery.fn.load;
-
-/**
- * Load a url into a page
- */
-jQuery.fn.load = function( url, params, callback ) {
- if ( typeof url !== "string" && _load ) {
- return _load.apply( this, arguments );
- }
-
- var selector, type, response,
- self = this,
- off = url.indexOf( " " );
-
- if ( off > -1 ) {
- selector = jQuery.trim( url.slice( off ) );
- url = url.slice( 0, off );
- }
-
- // If it's a function
- if ( jQuery.isFunction( params ) ) {
-
- // We assume that it's the callback
- callback = params;
- params = undefined;
-
- // Otherwise, build a param string
- } else if ( params && typeof params === "object" ) {
- type = "POST";
- }
-
- // If we have elements to modify, make the request
- if ( self.length > 0 ) {
- jQuery.ajax( {
- url: url,
-
- // If "type" variable is undefined, then "GET" method will be used.
- // Make value of this field explicit since
- // user can override it through ajaxSetup method
- type: type || "GET",
- dataType: "html",
- data: params
- } ).done( function( responseText ) {
-
- // Save response for use in complete callback
- response = arguments;
-
- self.html( selector ?
-
- // If a selector was specified, locate the right elements in a dummy div
- // Exclude scripts to avoid IE 'Permission Denied' errors
- jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
- // Otherwise use the full result
- responseText );
-
- // If the request succeeds, this function gets "data", "status", "jqXHR"
- // but they are ignored because response was set above.
- // If it fails, this function gets "jqXHR", "status", "error"
- } ).always( callback && function( jqXHR, status ) {
- self.each( function() {
- callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
- } );
- } );
- }
-
- return this;
-};
-
-} );
diff --git a/libs/bower_components/jquery/src/ajax/parseJSON.js b/libs/bower_components/jquery/src/ajax/parseJSON.js
deleted file mode 100644
index 11918b06d6..0000000000
--- a/libs/bower_components/jquery/src/ajax/parseJSON.js
+++ /dev/null
@@ -1,13 +0,0 @@
-define( [
- "../core"
-], function( jQuery ) {
-
-// Support: Android 2.3
-// Workaround failure to string-cast null input
-jQuery.parseJSON = function( data ) {
- return JSON.parse( data + "" );
-};
-
-return jQuery.parseJSON;
-
-} );
diff --git a/libs/bower_components/jquery/src/ajax/parseXML.js b/libs/bower_components/jquery/src/ajax/parseXML.js
deleted file mode 100644
index 6599aaf5be..0000000000
--- a/libs/bower_components/jquery/src/ajax/parseXML.js
+++ /dev/null
@@ -1,27 +0,0 @@
-define( [
- "../core"
-], function( jQuery ) {
-
-// Cross-browser xml parsing
-jQuery.parseXML = function( data ) {
- var xml;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
-
- // Support: IE9
- try {
- xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
-
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
-};
-
-return jQuery.parseXML;
-
-} );
diff --git a/libs/bower_components/jquery/src/ajax/script.js b/libs/bower_components/jquery/src/ajax/script.js
deleted file mode 100644
index 945bea9dae..0000000000
--- a/libs/bower_components/jquery/src/ajax/script.js
+++ /dev/null
@@ -1,68 +0,0 @@
-define( [
- "../core",
- "../var/document",
- "../ajax"
-], function( jQuery, document ) {
-
-// Install script dataType
-jQuery.ajaxSetup( {
- accepts: {
- script: "text/javascript, application/javascript, " +
- "application/ecmascript, application/x-ecmascript"
- },
- contents: {
- script: /\b(?:java|ecma)script\b/
- },
- converters: {
- "text script": function( text ) {
- jQuery.globalEval( text );
- return text;
- }
- }
-} );
-
-// Handle cache's special case and crossDomain
-jQuery.ajaxPrefilter( "script", function( s ) {
- if ( s.cache === undefined ) {
- s.cache = false;
- }
- if ( s.crossDomain ) {
- s.type = "GET";
- }
-} );
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function( s ) {
-
- // This transport only deals with cross domain requests
- if ( s.crossDomain ) {
- var script, callback;
- return {
- send: function( _, complete ) {
- script = jQuery( "<script>" ).prop( {
- charset: s.scriptCharset,
- src: s.url
- } ).on(
- "load error",
- callback = function( evt ) {
- script.remove();
- callback = null;
- if ( evt ) {
- complete( evt.type === "error" ? 404 : 200, evt.type );
- }
- }
- );
-
- // Use native DOM manipulation to avoid our domManip AJAX trickery
- document.head.appendChild( script[ 0 ] );
- },
- abort: function() {
- if ( callback ) {
- callback();
- }
- }
- };
- }
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/ajax/var/location.js b/libs/bower_components/jquery/src/ajax/var/location.js
deleted file mode 100644
index ff9578e993..0000000000
--- a/libs/bower_components/jquery/src/ajax/var/location.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return window.location;
-} );
diff --git a/libs/bower_components/jquery/src/ajax/var/nonce.js b/libs/bower_components/jquery/src/ajax/var/nonce.js
deleted file mode 100644
index 83fd557c87..0000000000
--- a/libs/bower_components/jquery/src/ajax/var/nonce.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "../../core"
-], function( jQuery ) {
- return jQuery.now();
-} );
diff --git a/libs/bower_components/jquery/src/ajax/var/rquery.js b/libs/bower_components/jquery/src/ajax/var/rquery.js
deleted file mode 100644
index 0502146ca8..0000000000
--- a/libs/bower_components/jquery/src/ajax/var/rquery.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return ( /\?/ );
-} );
diff --git a/libs/bower_components/jquery/src/ajax/xhr.js b/libs/bower_components/jquery/src/ajax/xhr.js
deleted file mode 100644
index db670ff15c..0000000000
--- a/libs/bower_components/jquery/src/ajax/xhr.js
+++ /dev/null
@@ -1,167 +0,0 @@
-define( [
- "../core",
- "../var/support",
- "../ajax"
-], function( jQuery, support ) {
-
-jQuery.ajaxSettings.xhr = function() {
- try {
- return new window.XMLHttpRequest();
- } catch ( e ) {}
-};
-
-var xhrSuccessStatus = {
-
- // File protocol always yields status code 0, assume 200
- 0: 200,
-
- // Support: IE9
- // #1450: sometimes IE returns 1223 when it should be 204
- 1223: 204
- },
- xhrSupported = jQuery.ajaxSettings.xhr();
-
-support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-support.ajax = xhrSupported = !!xhrSupported;
-
-jQuery.ajaxTransport( function( options ) {
- var callback, errorCallback;
-
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( support.cors || xhrSupported && !options.crossDomain ) {
- return {
- send: function( headers, complete ) {
- var i,
- xhr = options.xhr();
-
- xhr.open(
- options.type,
- options.url,
- options.async,
- options.username,
- options.password
- );
-
- // Apply custom fields if provided
- if ( options.xhrFields ) {
- for ( i in options.xhrFields ) {
- xhr[ i ] = options.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( options.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( options.mimeType );
- }
-
- // X-Requested-With header
- // For cross-domain requests, seeing as conditions for a preflight are
- // akin to a jigsaw puzzle, we simply never set it to be sure.
- // (it can always be set on a per-request basis or even using ajaxSetup)
- // For same-domain requests, won't change header if already provided.
- if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
- headers[ "X-Requested-With" ] = "XMLHttpRequest";
- }
-
- // Set headers
- for ( i in headers ) {
- xhr.setRequestHeader( i, headers[ i ] );
- }
-
- // Callback
- callback = function( type ) {
- return function() {
- if ( callback ) {
- callback = errorCallback = xhr.onload =
- xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
-
- if ( type === "abort" ) {
- xhr.abort();
- } else if ( type === "error" ) {
-
- // Support: IE9
- // On a manual native abort, IE9 throws
- // errors on any property access that is not readyState
- if ( typeof xhr.status !== "number" ) {
- complete( 0, "error" );
- } else {
- complete(
-
- // File: protocol always yields status 0; see #8605, #14207
- xhr.status,
- xhr.statusText
- );
- }
- } else {
- complete(
- xhrSuccessStatus[ xhr.status ] || xhr.status,
- xhr.statusText,
-
- // Support: IE9 only
- // IE9 has no XHR2 but throws on binary (trac-11426)
- // For XHR2 non-text, let the caller handle it (gh-2498)
- ( xhr.responseType || "text" ) !== "text" ||
- typeof xhr.responseText !== "string" ?
- { binary: xhr.response } :
- { text: xhr.responseText },
- xhr.getAllResponseHeaders()
- );
- }
- }
- };
- };
-
- // Listen to events
- xhr.onload = callback();
- errorCallback = xhr.onerror = callback( "error" );
-
- // Support: IE9
- // Use onreadystatechange to replace onabort
- // to handle uncaught aborts
- if ( xhr.onabort !== undefined ) {
- xhr.onabort = errorCallback;
- } else {
- xhr.onreadystatechange = function() {
-
- // Check readyState before timeout as it changes
- if ( xhr.readyState === 4 ) {
-
- // Allow onerror to be called first,
- // but that will not handle a native abort
- // Also, save errorCallback to a variable
- // as xhr.onerror cannot be accessed
- window.setTimeout( function() {
- if ( callback ) {
- errorCallback();
- }
- } );
- }
- };
- }
-
- // Create the abort callback
- callback = callback( "abort" );
-
- try {
-
- // Do send the request (this may raise an exception)
- xhr.send( options.hasContent && options.data || null );
- } catch ( e ) {
-
- // #14683: Only rethrow if this hasn't been notified as an error yet
- if ( callback ) {
- throw e;
- }
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback();
- }
- }
- };
- }
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/attributes.js b/libs/bower_components/jquery/src/attributes.js
deleted file mode 100644
index 691e0c0343..0000000000
--- a/libs/bower_components/jquery/src/attributes.js
+++ /dev/null
@@ -1,11 +0,0 @@
-define( [
- "./core",
- "./attributes/attr",
- "./attributes/prop",
- "./attributes/classes",
- "./attributes/val"
-], function( jQuery ) {
-
-// Return jQuery for attributes-only inclusion
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/attributes/attr.js b/libs/bower_components/jquery/src/attributes/attr.js
deleted file mode 100644
index f88808324d..0000000000
--- a/libs/bower_components/jquery/src/attributes/attr.js
+++ /dev/null
@@ -1,142 +0,0 @@
-define( [
- "../core",
- "../core/access",
- "./support",
- "../var/rnotwhite",
- "../selector"
-], function( jQuery, access, support, rnotwhite ) {
-
-var boolHook,
- attrHandle = jQuery.expr.attrHandle;
-
-jQuery.fn.extend( {
- attr: function( name, value ) {
- return access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each( function() {
- jQuery.removeAttr( this, name );
- } );
- }
-} );
-
-jQuery.extend( {
- attr: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set attributes on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- return jQuery.prop( elem, name, value );
- }
-
- // All attributes are lowercase
- // Grab necessary hook if one is defined
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] ||
- ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
- }
-
- if ( value !== undefined ) {
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
- }
-
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- elem.setAttribute( name, value + "" );
- return value;
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- ret = jQuery.find.attr( elem, name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret == null ? undefined : ret;
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- if ( !support.radioValue && value === "radio" &&
- jQuery.nodeName( elem, "input" ) ) {
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- }
- },
-
- removeAttr: function( elem, value ) {
- var name, propName,
- i = 0,
- attrNames = value && value.match( rnotwhite );
-
- if ( attrNames && elem.nodeType === 1 ) {
- while ( ( name = attrNames[ i++ ] ) ) {
- propName = jQuery.propFix[ name ] || name;
-
- // Boolean attributes get special treatment (#10870)
- if ( jQuery.expr.match.bool.test( name ) ) {
-
- // Set corresponding property to false
- elem[ propName ] = false;
- }
-
- elem.removeAttribute( name );
- }
- }
- }
-} );
-
-// Hooks for boolean attributes
-boolHook = {
- set: function( elem, value, name ) {
- if ( value === false ) {
-
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- elem.setAttribute( name, name );
- }
- return name;
- }
-};
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
- var getter = attrHandle[ name ] || jQuery.find.attr;
-
- attrHandle[ name ] = function( elem, name, isXML ) {
- var ret, handle;
- if ( !isXML ) {
-
- // Avoid an infinite loop by temporarily removing this function from the getter
- handle = attrHandle[ name ];
- attrHandle[ name ] = ret;
- ret = getter( elem, name, isXML ) != null ?
- name.toLowerCase() :
- null;
- attrHandle[ name ] = handle;
- }
- return ret;
- };
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/attributes/classes.js b/libs/bower_components/jquery/src/attributes/classes.js
deleted file mode 100644
index 7933873c4f..0000000000
--- a/libs/bower_components/jquery/src/attributes/classes.js
+++ /dev/null
@@ -1,177 +0,0 @@
-define( [
- "../core",
- "../var/rnotwhite",
- "../data/var/dataPriv",
- "../core/init"
-], function( jQuery, rnotwhite, dataPriv ) {
-
-var rclass = /[\t\r\n\f]/g;
-
-function getClass( elem ) {
- return elem.getAttribute && elem.getAttribute( "class" ) || "";
-}
-
-jQuery.fn.extend( {
- addClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- if ( typeof value === "string" && value ) {
- classes = value.match( rnotwhite ) || [];
-
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
- cur = elem.nodeType === 1 &&
- ( " " + curValue + " " ).replace( rclass, " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
- cur += clazz + " ";
- }
- }
-
- // Only assign if different to avoid unneeded rendering.
- finalValue = jQuery.trim( cur );
- if ( curValue !== finalValue ) {
- elem.setAttribute( "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- if ( !arguments.length ) {
- return this.attr( "class", "" );
- }
-
- if ( typeof value === "string" && value ) {
- classes = value.match( rnotwhite ) || [];
-
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
-
- // This expression is here for better compressibility (see addClass)
- cur = elem.nodeType === 1 &&
- ( " " + curValue + " " ).replace( rclass, " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
-
- // Remove *all* instances
- while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
- cur = cur.replace( " " + clazz + " ", " " );
- }
- }
-
- // Only assign if different to avoid unneeded rendering.
- finalValue = jQuery.trim( cur );
- if ( curValue !== finalValue ) {
- elem.setAttribute( "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value;
-
- if ( typeof stateVal === "boolean" && type === "string" ) {
- return stateVal ? this.addClass( value ) : this.removeClass( value );
- }
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function( i ) {
- jQuery( this ).toggleClass(
- value.call( this, i, getClass( this ), stateVal ),
- stateVal
- );
- } );
- }
-
- return this.each( function() {
- var className, i, self, classNames;
-
- if ( type === "string" ) {
-
- // Toggle individual class names
- i = 0;
- self = jQuery( this );
- classNames = value.match( rnotwhite ) || [];
-
- while ( ( className = classNames[ i++ ] ) ) {
-
- // Check each className given, space separated list
- if ( self.hasClass( className ) ) {
- self.removeClass( className );
- } else {
- self.addClass( className );
- }
- }
-
- // Toggle whole class name
- } else if ( value === undefined || type === "boolean" ) {
- className = getClass( this );
- if ( className ) {
-
- // Store className if set
- dataPriv.set( this, "__className__", className );
- }
-
- // If the element has a class name or if we're passed `false`,
- // then remove the whole classname (if there was one, the above saved it).
- // Otherwise bring back whatever was previously saved (if anything),
- // falling back to the empty string if nothing was stored.
- if ( this.setAttribute ) {
- this.setAttribute( "class",
- className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
- );
- }
- }
- } );
- },
-
- hasClass: function( selector ) {
- var className, elem,
- i = 0;
-
- className = " " + selector + " ";
- while ( ( elem = this[ i++ ] ) ) {
- if ( elem.nodeType === 1 &&
- ( " " + getClass( elem ) + " " ).replace( rclass, " " )
- .indexOf( className ) > -1
- ) {
- return true;
- }
- }
-
- return false;
- }
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/attributes/prop.js b/libs/bower_components/jquery/src/attributes/prop.js
deleted file mode 100644
index e127bb08f9..0000000000
--- a/libs/bower_components/jquery/src/attributes/prop.js
+++ /dev/null
@@ -1,125 +0,0 @@
-define( [
- "../core",
- "../core/access",
- "./support",
- "../selector"
-], function( jQuery, access, support ) {
-
-var rfocusable = /^(?:input|select|textarea|button)$/i,
- rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
- prop: function( name, value ) {
- return access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- return this.each( function() {
- delete this[ jQuery.propFix[ name ] || name ];
- } );
- }
-} );
-
-jQuery.extend( {
- prop: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set properties on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- return ( elem[ name ] = value );
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- return elem[ name ];
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
-
- // elem.tabIndex doesn't always return the
- // correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- // Use proper attribute retrieval(#12072)
- var tabindex = jQuery.find.attr( elem, "tabindex" );
-
- return tabindex ?
- parseInt( tabindex, 10 ) :
- rfocusable.test( elem.nodeName ) ||
- rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- -1;
- }
- }
- },
-
- propFix: {
- "for": "htmlFor",
- "class": "className"
- }
-} );
-
-// Support: IE <=11 only
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-if ( !support.optSelected ) {
- jQuery.propHooks.selected = {
- get: function( elem ) {
- var parent = elem.parentNode;
- if ( parent && parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- return null;
- },
- set: function( elem ) {
- var parent = elem.parentNode;
- if ( parent ) {
- parent.selectedIndex;
-
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- }
- };
-}
-
-jQuery.each( [
- "tabIndex",
- "readOnly",
- "maxLength",
- "cellSpacing",
- "cellPadding",
- "rowSpan",
- "colSpan",
- "useMap",
- "frameBorder",
- "contentEditable"
-], function() {
- jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/attributes/support.js b/libs/bower_components/jquery/src/attributes/support.js
deleted file mode 100644
index e8d02b5c90..0000000000
--- a/libs/bower_components/jquery/src/attributes/support.js
+++ /dev/null
@@ -1,36 +0,0 @@
-define( [
- "../var/document",
- "../var/support"
-], function( document, support ) {
-
-( function() {
- var input = document.createElement( "input" ),
- select = document.createElement( "select" ),
- opt = select.appendChild( document.createElement( "option" ) );
-
- input.type = "checkbox";
-
- // Support: iOS<=5.1, Android<=4.2+
- // Default value for a checkbox should be "on"
- support.checkOn = input.value !== "";
-
- // Support: IE<=11+
- // Must access selectedIndex to make default options select
- support.optSelected = opt.selected;
-
- // Support: Android<=2.3
- // Options inside disabled selects are incorrectly marked as disabled
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Support: IE<=11+
- // An input loses its value after becoming a radio
- input = document.createElement( "input" );
- input.value = "t";
- input.type = "radio";
- support.radioValue = input.value === "t";
-} )();
-
-return support;
-
-} );
diff --git a/libs/bower_components/jquery/src/attributes/val.js b/libs/bower_components/jquery/src/attributes/val.js
deleted file mode 100644
index 1fa91713df..0000000000
--- a/libs/bower_components/jquery/src/attributes/val.js
+++ /dev/null
@@ -1,177 +0,0 @@
-define( [
- "../core",
- "./support",
- "../core/init"
-], function( jQuery, support ) {
-
-var rreturn = /\r/g,
- rspaces = /[\x20\t\r\n\f]+/g;
-
-jQuery.fn.extend( {
- val: function( value ) {
- var hooks, ret, isFunction,
- elem = this[ 0 ];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] ||
- jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- if ( hooks &&
- "get" in hooks &&
- ( ret = hooks.get( elem, "value" ) ) !== undefined
- ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
-
- // Handle most common string cases
- ret.replace( rreturn, "" ) :
-
- // Handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return;
- }
-
- isFunction = jQuery.isFunction( value );
-
- return this.each( function( i ) {
- var val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, jQuery( this ).val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
-
- } else if ( typeof val === "number" ) {
- val += "";
-
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map( val, function( value ) {
- return value == null ? "" : value + "";
- } );
- }
-
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- } );
- }
-} );
-
-jQuery.extend( {
- valHooks: {
- option: {
- get: function( elem ) {
-
- var val = jQuery.find.attr( elem, "value" );
- return val != null ?
- val :
-
- // Support: IE10-11+
- // option.text throws exceptions (#14686, #14858)
- // Strip and collapse whitespace
- // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
- jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
- }
- },
- select: {
- get: function( elem ) {
- var value, option,
- options = elem.options,
- index = elem.selectedIndex,
- one = elem.type === "select-one" || index < 0,
- values = one ? null : [],
- max = one ? index + 1 : options.length,
- i = index < 0 ?
- max :
- one ? index : 0;
-
- // Loop through all the selected options
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // IE8-9 doesn't update selected after form reset (#2551)
- if ( ( option.selected || i === index ) &&
-
- // Don't return options that are disabled or in a disabled optgroup
- ( support.optDisabled ?
- !option.disabled : option.getAttribute( "disabled" ) === null ) &&
- ( !option.parentNode.disabled ||
- !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var optionSet, option,
- options = elem.options,
- values = jQuery.makeArray( value ),
- i = options.length;
-
- while ( i-- ) {
- option = options[ i ];
- if ( option.selected =
- jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
- ) {
- optionSet = true;
- }
- }
-
- // Force browsers to behave consistently when non-matching value is set
- if ( !optionSet ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- }
-} );
-
-// Radios and checkboxes getter/setter
-jQuery.each( [ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
- }
- }
- };
- if ( !support.checkOn ) {
- jQuery.valHooks[ this ].get = function( elem ) {
- return elem.getAttribute( "value" ) === null ? "on" : elem.value;
- };
- }
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/callbacks.js b/libs/bower_components/jquery/src/callbacks.js
deleted file mode 100644
index df7c7cf0ef..0000000000
--- a/libs/bower_components/jquery/src/callbacks.js
+++ /dev/null
@@ -1,232 +0,0 @@
-define( [
- "./core",
- "./var/rnotwhite"
-], function( jQuery, rnotwhite ) {
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
- var object = {};
- jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
- object[ flag ] = true;
- } );
- return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- * options: an optional list of space-separated options that will change how
- * the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
- // Convert options from String-formatted to Object-formatted if needed
- // (we check in cache first)
- options = typeof options === "string" ?
- createOptions( options ) :
- jQuery.extend( {}, options );
-
- var // Flag to know if list is currently firing
- firing,
-
- // Last fire value for non-forgettable lists
- memory,
-
- // Flag to know if list was already fired
- fired,
-
- // Flag to prevent firing
- locked,
-
- // Actual callback list
- list = [],
-
- // Queue of execution data for repeatable lists
- queue = [],
-
- // Index of currently firing callback (modified by add/remove as needed)
- firingIndex = -1,
-
- // Fire callbacks
- fire = function() {
-
- // Enforce single-firing
- locked = options.once;
-
- // Execute callbacks for all pending executions,
- // respecting firingIndex overrides and runtime changes
- fired = firing = true;
- for ( ; queue.length; firingIndex = -1 ) {
- memory = queue.shift();
- while ( ++firingIndex < list.length ) {
-
- // Run callback and check for early termination
- if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
- options.stopOnFalse ) {
-
- // Jump to end and forget the data so .add doesn't re-fire
- firingIndex = list.length;
- memory = false;
- }
- }
- }
-
- // Forget the data if we're done with it
- if ( !options.memory ) {
- memory = false;
- }
-
- firing = false;
-
- // Clean up if we're done firing for good
- if ( locked ) {
-
- // Keep an empty list if we have data for future add calls
- if ( memory ) {
- list = [];
-
- // Otherwise, this object is spent
- } else {
- list = "";
- }
- }
- },
-
- // Actual Callbacks object
- self = {
-
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
-
- // If we have memory from a past run, we should fire after adding
- if ( memory && !firing ) {
- firingIndex = list.length - 1;
- queue.push( memory );
- }
-
- ( function add( args ) {
- jQuery.each( args, function( _, arg ) {
- if ( jQuery.isFunction( arg ) ) {
- if ( !options.unique || !self.has( arg ) ) {
- list.push( arg );
- }
- } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
-
- // Inspect recursively
- add( arg );
- }
- } );
- } )( arguments );
-
- if ( memory && !firing ) {
- fire();
- }
- }
- return this;
- },
-
- // Remove a callback from the list
- remove: function() {
- jQuery.each( arguments, function( _, arg ) {
- var index;
- while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
- list.splice( index, 1 );
-
- // Handle firing indexes
- if ( index <= firingIndex ) {
- firingIndex--;
- }
- }
- } );
- return this;
- },
-
- // Check if a given callback is in the list.
- // If no argument is given, return whether or not list has callbacks attached.
- has: function( fn ) {
- return fn ?
- jQuery.inArray( fn, list ) > -1 :
- list.length > 0;
- },
-
- // Remove all callbacks from the list
- empty: function() {
- if ( list ) {
- list = [];
- }
- return this;
- },
-
- // Disable .fire and .add
- // Abort any current/pending executions
- // Clear all callbacks and values
- disable: function() {
- locked = queue = [];
- list = memory = "";
- return this;
- },
- disabled: function() {
- return !list;
- },
-
- // Disable .fire
- // Also disable .add unless we have memory (since it would have no effect)
- // Abort any pending executions
- lock: function() {
- locked = queue = [];
- if ( !memory ) {
- list = memory = "";
- }
- return this;
- },
- locked: function() {
- return !!locked;
- },
-
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- if ( !locked ) {
- args = args || [];
- args = [ context, args.slice ? args.slice() : args ];
- queue.push( args );
- if ( !firing ) {
- fire();
- }
- }
- return this;
- },
-
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
-
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!fired;
- }
- };
-
- return self;
-};
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/core.js b/libs/bower_components/jquery/src/core.js
deleted file mode 100644
index 713c1a3cd0..0000000000
--- a/libs/bower_components/jquery/src/core.js
+++ /dev/null
@@ -1,494 +0,0 @@
-define( [
- "./var/arr",
- "./var/document",
- "./var/slice",
- "./var/concat",
- "./var/push",
- "./var/indexOf",
- "./var/class2type",
- "./var/toString",
- "./var/hasOwn",
- "./var/support"
-], function( arr, document, slice, concat, push, indexOf, class2type, toString, hasOwn, support ) {
-
-var
- version = "@VERSION",
-
- // Define a local copy of jQuery
- jQuery = function( selector, context ) {
-
- // The jQuery object is actually just the init constructor 'enhanced'
- // Need init if jQuery is called (just allow error to be thrown if not included)
- return new jQuery.fn.init( selector, context );
- },
-
- // Support: Android<4.1
- // Make sure we trim BOM and NBSP
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
- // Matches dashed string for camelizing
- rmsPrefix = /^-ms-/,
- rdashAlpha = /-([\da-z])/gi,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function( all, letter ) {
- return letter.toUpperCase();
- };
-
-jQuery.fn = jQuery.prototype = {
-
- // The current version of jQuery being used
- jquery: version,
-
- constructor: jQuery,
-
- // Start with an empty selector
- selector: "",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- toArray: function() {
- return slice.call( this );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num != null ?
-
- // Return just the one element from the set
- ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
-
- // Return all the elements in a clean array
- slice.call( this );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems ) {
-
- // Build a new jQuery matched element set
- var ret = jQuery.merge( this.constructor(), elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
- ret.context = this.context;
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- each: function( callback ) {
- return jQuery.each( this, callback );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map( this, function( elem, i ) {
- return callback.call( elem, i, elem );
- } ) );
- },
-
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ) );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- eq: function( i ) {
- var len = this.length,
- j = +i + ( i < 0 ? len : 0 );
- return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
- },
-
- end: function() {
- return this.prevObject || this.constructor();
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: arr.sort,
- splice: arr.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[ 0 ] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
-
- // Skip the boolean and the target
- target = arguments[ i ] || {};
- i++;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
- target = {};
- }
-
- // Extend jQuery itself if only one argument is passed
- if ( i === length ) {
- target = this;
- i--;
- }
-
- for ( ; i < length; i++ ) {
-
- // Only deal with non-null/undefined values
- if ( ( options = arguments[ i ] ) != null ) {
-
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
- ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
-
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray( src ) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject( src ) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend( {
-
- // Unique for each copy of jQuery on the page
- expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
- // Assume jQuery is ready without the ready module
- isReady: true,
-
- error: function( msg ) {
- throw new Error( msg );
- },
-
- noop: function() {},
-
- isFunction: function( obj ) {
- return jQuery.type( obj ) === "function";
- },
-
- isArray: Array.isArray,
-
- isWindow: function( obj ) {
- return obj != null && obj === obj.window;
- },
-
- isNumeric: function( obj ) {
-
- // parseFloat NaNs numeric-cast false positives (null|true|false|"")
- // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
- // subtraction forces infinities to NaN
- // adding 1 corrects loss of precision from parseFloat (#15100)
- var realStringObj = obj && obj.toString();
- return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
- },
-
- isPlainObject: function( obj ) {
- var key;
-
- // Not plain objects:
- // - Any object or value whose internal [[Class]] property is not "[object Object]"
- // - DOM nodes
- // - window
- if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !hasOwn.call( obj, "constructor" ) &&
- !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
- return false;
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own
- for ( key in obj ) {}
-
- return key === undefined || hasOwn.call( obj, key );
- },
-
- isEmptyObject: function( obj ) {
- var name;
- for ( name in obj ) {
- return false;
- }
- return true;
- },
-
- type: function( obj ) {
- if ( obj == null ) {
- return obj + "";
- }
-
- // Support: Android<4.0, iOS<6 (functionish RegExp)
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[ toString.call( obj ) ] || "object" :
- typeof obj;
- },
-
- // Evaluates a script in a global context
- globalEval: function( code ) {
- var script,
- indirect = eval;
-
- code = jQuery.trim( code );
-
- if ( code ) {
-
- // If the code includes a valid, prologue position
- // strict mode pragma, execute code by injecting a
- // script tag into the document.
- if ( code.indexOf( "use strict" ) === 1 ) {
- script = document.createElement( "script" );
- script.text = code;
- document.head.appendChild( script ).parentNode.removeChild( script );
- } else {
-
- // Otherwise, avoid the DOM node creation, insertion
- // and removal by using an indirect global eval
-
- indirect( code );
- }
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Support: IE9-11+
- // Microsoft forgot to hump their vendor prefix (#9572)
- camelCase: function( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
- },
-
- each: function( obj, callback ) {
- var length, i = 0;
-
- if ( isArrayLike( obj ) ) {
- length = obj.length;
- for ( ; i < length; i++ ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- } else {
- for ( i in obj ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- }
-
- return obj;
- },
-
- // Support: Android<4.1
- trim: function( text ) {
- return text == null ?
- "" :
- ( text + "" ).replace( rtrim, "" );
- },
-
- // results is for internal usage only
- makeArray: function( arr, results ) {
- var ret = results || [];
-
- if ( arr != null ) {
- if ( isArrayLike( Object( arr ) ) ) {
- jQuery.merge( ret,
- typeof arr === "string" ?
- [ arr ] : arr
- );
- } else {
- push.call( ret, arr );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, arr, i ) {
- return arr == null ? -1 : indexOf.call( arr, elem, i );
- },
-
- merge: function( first, second ) {
- var len = +second.length,
- j = 0,
- i = first.length;
-
- for ( ; j < len; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, invert ) {
- var callbackInverse,
- matches = [],
- i = 0,
- length = elems.length,
- callbackExpect = !invert;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( ; i < length; i++ ) {
- callbackInverse = !callback( elems[ i ], i );
- if ( callbackInverse !== callbackExpect ) {
- matches.push( elems[ i ] );
- }
- }
-
- return matches;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var length, value,
- i = 0,
- ret = [];
-
- // Go through the array, translating each of the items to their new values
- if ( isArrayLike( elems ) ) {
- length = elems.length;
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( i in elems ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
- }
-
- // Flatten any nested arrays
- return concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- var tmp, args, proxy;
-
- if ( typeof context === "string" ) {
- tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- args = slice.call( arguments, 2 );
- proxy = function() {
- return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
- return proxy;
- },
-
- now: Date.now,
-
- // jQuery.support is not used in Core but other projects attach their
- // properties to it so it needs to exist.
- support: support
-} );
-
-// JSHint would error on this code due to the Symbol not being defined in ES5.
-// Defining this global in .jshintrc would create a danger of using the global
-// unguarded in another place, it seems safer to just disable JSHint for these
-// three lines.
-/* jshint ignore: start */
-if ( typeof Symbol === "function" ) {
- jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
-/* jshint ignore: end */
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
- // Support: iOS 8.2 (not reproducible in simulator)
- // `in` check used to prevent JIT error (gh-2145)
- // hasOwn isn't used here due to false negatives
- // regarding Nodelist length in IE
- var length = !!obj && "length" in obj && obj.length,
- type = jQuery.type( obj );
-
- if ( type === "function" || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- return type === "array" || length === 0 ||
- typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/core/DOMEval.js b/libs/bower_components/jquery/src/core/DOMEval.js
deleted file mode 100644
index 222b0ca2a2..0000000000
--- a/libs/bower_components/jquery/src/core/DOMEval.js
+++ /dev/null
@@ -1,14 +0,0 @@
-define( [
- "../var/document"
-], function( document ) {
- function DOMEval( code, doc ) {
- doc = doc || document;
-
- var script = doc.createElement( "script" );
-
- script.text = code;
- doc.head.appendChild( script ).parentNode.removeChild( script );
- }
-
- return DOMEval;
-} );
diff --git a/libs/bower_components/jquery/src/core/access.js b/libs/bower_components/jquery/src/core/access.js
deleted file mode 100644
index 19f79efa42..0000000000
--- a/libs/bower_components/jquery/src/core/access.js
+++ /dev/null
@@ -1,65 +0,0 @@
-define( [
- "../core"
-], function( jQuery ) {
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
- var i = 0,
- len = elems.length,
- bulk = key == null;
-
- // Sets many values
- if ( jQuery.type( key ) === "object" ) {
- chainable = true;
- for ( i in key ) {
- access( elems, fn, i, key[ i ], true, emptyGet, raw );
- }
-
- // Sets one value
- } else if ( value !== undefined ) {
- chainable = true;
-
- if ( !jQuery.isFunction( value ) ) {
- raw = true;
- }
-
- if ( bulk ) {
-
- // Bulk operations run against the entire set
- if ( raw ) {
- fn.call( elems, value );
- fn = null;
-
- // ...except when executing function values
- } else {
- bulk = fn;
- fn = function( elem, key, value ) {
- return bulk.call( jQuery( elem ), value );
- };
- }
- }
-
- if ( fn ) {
- for ( ; i < len; i++ ) {
- fn(
- elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
- );
- }
- }
- }
-
- return chainable ?
- elems :
-
- // Gets
- bulk ?
- fn.call( elems ) :
- len ? fn( elems[ 0 ], key ) : emptyGet;
-};
-
-return access;
-
-} );
diff --git a/libs/bower_components/jquery/src/core/init.js b/libs/bower_components/jquery/src/core/init.js
deleted file mode 100644
index c2b6c94d78..0000000000
--- a/libs/bower_components/jquery/src/core/init.js
+++ /dev/null
@@ -1,134 +0,0 @@
-// Initialize a jQuery object
-define( [
- "../core",
- "../var/document",
- "./var/rsingleTag",
- "../traversing/findFilter"
-], function( jQuery, document, rsingleTag ) {
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
- // A simple way to check for HTML strings
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
- // Strict HTML recognition (#11290: must start with <)
- rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
-
- init = jQuery.fn.init = function( selector, context, root ) {
- var match, elem;
-
- // HANDLE: $(""), $(null), $(undefined), $(false)
- if ( !selector ) {
- return this;
- }
-
- // Method init() accepts an alternate rootjQuery
- // so migrate can support jQuery.sub (gh-2101)
- root = root || rootjQuery;
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- if ( selector[ 0 ] === "<" &&
- selector[ selector.length - 1 ] === ">" &&
- selector.length >= 3 ) {
-
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = rquickExpr.exec( selector );
- }
-
- // Match html or make sure no context is specified for #id
- if ( match && ( match[ 1 ] || !context ) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[ 1 ] ) {
- context = context instanceof jQuery ? context[ 0 ] : context;
-
- // Option to run scripts is true for back-compat
- // Intentionally let the error be thrown if parseHTML is not present
- jQuery.merge( this, jQuery.parseHTML(
- match[ 1 ],
- context && context.nodeType ? context.ownerDocument || context : document,
- true
- ) );
-
- // HANDLE: $(html, props)
- if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
- for ( match in context ) {
-
- // Properties of context are called as methods if possible
- if ( jQuery.isFunction( this[ match ] ) ) {
- this[ match ]( context[ match ] );
-
- // ...and otherwise set as attributes
- } else {
- this.attr( match, context[ match ] );
- }
- }
- }
-
- return this;
-
- // HANDLE: $(#id)
- } else {
- elem = document.getElementById( match[ 2 ] );
-
- // Support: Blackberry 4.6
- // gEBID returns nodes no longer in the document (#6963)
- if ( elem && elem.parentNode ) {
-
- // Inject the element directly into the jQuery object
- this.length = 1;
- this[ 0 ] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || root ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(DOMElement)
- } else if ( selector.nodeType ) {
- this.context = this[ 0 ] = selector;
- this.length = 1;
- return this;
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return root.ready !== undefined ?
- root.ready( selector ) :
-
- // Execute immediately if ready is not present
- selector( jQuery );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- };
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-return init;
-
-} );
diff --git a/libs/bower_components/jquery/src/core/parseHTML.js b/libs/bower_components/jquery/src/core/parseHTML.js
deleted file mode 100644
index 3524abd632..0000000000
--- a/libs/bower_components/jquery/src/core/parseHTML.js
+++ /dev/null
@@ -1,41 +0,0 @@
-define( [
- "../core",
- "../var/document",
- "./var/rsingleTag",
- "../manipulation/buildFragment"
-], function( jQuery, document, rsingleTag, buildFragment ) {
-
-// Argument "data" should be string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-jQuery.parseHTML = function( data, context, keepScripts ) {
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- if ( typeof context === "boolean" ) {
- keepScripts = context;
- context = false;
- }
- context = context || document;
-
- var parsed = rsingleTag.exec( data ),
- scripts = !keepScripts && [];
-
- // Single tag
- if ( parsed ) {
- return [ context.createElement( parsed[ 1 ] ) ];
- }
-
- parsed = buildFragment( [ data ], context, scripts );
-
- if ( scripts && scripts.length ) {
- jQuery( scripts ).remove();
- }
-
- return jQuery.merge( [], parsed.childNodes );
-};
-
-return jQuery.parseHTML;
-
-} );
diff --git a/libs/bower_components/jquery/src/core/ready.js b/libs/bower_components/jquery/src/core/ready.js
deleted file mode 100644
index 7d93e67687..0000000000
--- a/libs/bower_components/jquery/src/core/ready.js
+++ /dev/null
@@ -1,103 +0,0 @@
-define( [
- "../core",
- "../var/document",
- "../core/init",
- "../deferred"
-], function( jQuery, document ) {
-
-// The deferred used on DOM ready
-var readyList;
-
-jQuery.fn.ready = function( fn ) {
-
- // Add the callback
- jQuery.ready.promise().done( fn );
-
- return this;
-};
-
-jQuery.extend( {
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
-
- // Abort if there are pending holds or we're already ready
- if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
- return;
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.triggerHandler ) {
- jQuery( document ).triggerHandler( "ready" );
- jQuery( document ).off( "ready" );
- }
- }
-} );
-
-/**
- * The ready event handler and self cleanup method
- */
-function completed() {
- document.removeEventListener( "DOMContentLoaded", completed );
- window.removeEventListener( "load", completed );
- jQuery.ready();
-}
-
-jQuery.ready.promise = function( obj ) {
- if ( !readyList ) {
-
- readyList = jQuery.Deferred();
-
- // Catch cases where $(document).ready() is called
- // after the browser event has already occurred.
- // Support: IE9-10 only
- // Older IE sometimes signals "interactive" too soon
- if ( document.readyState === "complete" ||
- ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- window.setTimeout( jQuery.ready );
-
- } else {
-
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", completed );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", completed );
- }
- }
- return readyList.promise( obj );
-};
-
-// Kick off the DOM ready check even if the user does not
-jQuery.ready.promise();
-
-} );
diff --git a/libs/bower_components/jquery/src/core/support.js b/libs/bower_components/jquery/src/core/support.js
deleted file mode 100644
index 0609a700b6..0000000000
--- a/libs/bower_components/jquery/src/core/support.js
+++ /dev/null
@@ -1,18 +0,0 @@
-define( [
- "../var/document",
- "../var/support"
-], function( document, support ) {
-
-// Support: Safari 8+
-// In Safari 8 documents created via document.implementation.createHTMLDocument
-// collapse sibling forms: the second one becomes a child of the first one.
-// Because of that, this security measure has to be disabled in Safari 8.
-// https://bugs.webkit.org/show_bug.cgi?id=137337
-support.createHTMLDocument = ( function() {
- var body = document.implementation.createHTMLDocument( "" ).body;
- body.innerHTML = "<form></form><form></form>";
- return body.childNodes.length === 2;
-} )();
-
-return support;
-} );
diff --git a/libs/bower_components/jquery/src/core/var/rsingleTag.js b/libs/bower_components/jquery/src/core/var/rsingleTag.js
deleted file mode 100644
index 1a55ee39d2..0000000000
--- a/libs/bower_components/jquery/src/core/var/rsingleTag.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( function() {
-
- // Match a standalone tag
- return ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
-} );
diff --git a/libs/bower_components/jquery/src/css.js b/libs/bower_components/jquery/src/css.js
deleted file mode 100644
index ec55a24115..0000000000
--- a/libs/bower_components/jquery/src/css.js
+++ /dev/null
@@ -1,515 +0,0 @@
-define( [
- "./core",
- "./var/pnum",
- "./core/access",
- "./css/var/rmargin",
- "./var/document",
- "./var/rcssNum",
- "./css/var/rnumnonpx",
- "./css/var/cssExpand",
- "./css/var/isHidden",
- "./css/var/getStyles",
- "./css/var/swap",
- "./css/curCSS",
- "./css/adjustCSS",
- "./css/defaultDisplay",
- "./css/addGetHookIf",
- "./css/support",
- "./data/var/dataPriv",
-
- "./core/init",
- "./core/ready",
- "./selector" // contains
-], function( jQuery, pnum, access, rmargin, document, rcssNum, rnumnonpx, cssExpand, isHidden,
- getStyles, swap, curCSS, adjustCSS, defaultDisplay, addGetHookIf, support, dataPriv ) {
-
-var
-
- // Swappable if display is none or starts with table
- // except "table", "table-cell", or "table-caption"
- // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
- rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
- cssNormalTransform = {
- letterSpacing: "0",
- fontWeight: "400"
- },
-
- cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
- emptyStyle = document.createElement( "div" ).style;
-
-// Return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( name ) {
-
- // Shortcut for names that are not vendor prefixed
- if ( name in emptyStyle ) {
- return name;
- }
-
- // Check for vendor prefixed names
- var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
- i = cssPrefixes.length;
-
- while ( i-- ) {
- name = cssPrefixes[ i ] + capName;
- if ( name in emptyStyle ) {
- return name;
- }
- }
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-
- // Any relative (+/-) values have already been
- // normalized at this point
- var matches = rcssNum.exec( value );
- return matches ?
-
- // Guard against undefined "subtract", e.g., when used as in cssHooks
- Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
- value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
- var i = extra === ( isBorderBox ? "border" : "content" ) ?
-
- // If we already have the right measurement, avoid augmentation
- 4 :
-
- // Otherwise initialize for horizontal or vertical properties
- name === "width" ? 1 : 0,
-
- val = 0;
-
- for ( ; i < 4; i += 2 ) {
-
- // Both box models exclude margin, so add it if we want it
- if ( extra === "margin" ) {
- val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
- }
-
- if ( isBorderBox ) {
-
- // border-box includes padding, so remove it if we want content
- if ( extra === "content" ) {
- val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
- }
-
- // At this point, extra isn't border nor margin, so remove border
- if ( extra !== "margin" ) {
- val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
- } else {
-
- // At this point, extra isn't content, so add padding
- val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
- // At this point, extra isn't content nor padding, so add border
- if ( extra !== "padding" ) {
- val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
- }
- }
-
- return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
- // Start with offset property, which is equivalent to the border-box value
- var valueIsBorderBox = true,
- val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- styles = getStyles( elem ),
- isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
- // Support: IE11 only
- // In IE 11 fullscreen elements inside of an iframe have
- // 100x too small dimensions (gh-1764).
- if ( document.msFullscreenElement && window.top !== window ) {
-
- // Support: IE11 only
- // Running getBoundingClientRect on a disconnected node
- // in IE throws an error.
- if ( elem.getClientRects().length ) {
- val = Math.round( elem.getBoundingClientRect()[ name ] * 100 );
- }
- }
-
- // Some non-html elements return undefined for offsetWidth, so check for null/undefined
- // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
- // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
- if ( val <= 0 || val == null ) {
-
- // Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name, styles );
- if ( val < 0 || val == null ) {
- val = elem.style[ name ];
- }
-
- // Computed unit is not pixels. Stop here and return.
- if ( rnumnonpx.test( val ) ) {
- return val;
- }
-
- // Check for style in case a browser which returns unreliable values
- // for getComputedStyle silently falls back to the reliable elem.style
- valueIsBorderBox = isBorderBox &&
- ( support.boxSizingReliable() || val === elem.style[ name ] );
-
- // Normalize "", auto, and prepare for extra
- val = parseFloat( val ) || 0;
- }
-
- // Use the active box-sizing model to add/subtract irrelevant styles
- return ( val +
- augmentWidthOrHeight(
- elem,
- name,
- extra || ( isBorderBox ? "border" : "content" ),
- valueIsBorderBox,
- styles
- )
- ) + "px";
-}
-
-function showHide( elements, show ) {
- var display, elem, hidden,
- values = [],
- index = 0,
- length = elements.length;
-
- for ( ; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
-
- values[ index ] = dataPriv.get( elem, "olddisplay" );
- display = elem.style.display;
- if ( show ) {
-
- // Reset the inline display of this element to learn if it is
- // being hidden by cascaded rules or not
- if ( !values[ index ] && display === "none" ) {
- elem.style.display = "";
- }
-
- // Set elements which have been overridden with display: none
- // in a stylesheet to whatever the default browser style is
- // for such an element
- if ( elem.style.display === "" && isHidden( elem ) ) {
- values[ index ] = dataPriv.access(
- elem,
- "olddisplay",
- defaultDisplay( elem.nodeName )
- );
- }
- } else {
- hidden = isHidden( elem );
-
- if ( display !== "none" || !hidden ) {
- dataPriv.set(
- elem,
- "olddisplay",
- hidden ? display : jQuery.css( elem, "display" )
- );
- }
- }
- }
-
- // Set the display of most of the elements in a second loop
- // to avoid the constant reflow
- for ( index = 0; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
- if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
- elem.style.display = show ? values[ index ] || "" : "none";
- }
- }
-
- return elements;
-}
-
-jQuery.extend( {
-
- // Add in style property hooks for overriding the default
- // behavior of getting and setting a style property
- cssHooks: {
- opacity: {
- get: function( elem, computed ) {
- if ( computed ) {
-
- // We should always get a number back from opacity
- var ret = curCSS( elem, "opacity" );
- return ret === "" ? "1" : ret;
- }
- }
- }
- },
-
- // Don't automatically add "px" to these possibly-unitless properties
- cssNumber: {
- "animationIterationCount": true,
- "columnCount": true,
- "fillOpacity": true,
- "flexGrow": true,
- "flexShrink": true,
- "fontWeight": true,
- "lineHeight": true,
- "opacity": true,
- "order": true,
- "orphans": true,
- "widows": true,
- "zIndex": true,
- "zoom": true
- },
-
- // Add in properties whose names you wish to fix before
- // setting or getting the value
- cssProps: {
- "float": "cssFloat"
- },
-
- // Get and set the style property on a DOM Node
- style: function( elem, name, value, extra ) {
-
- // Don't set styles on text and comment nodes
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
- return;
- }
-
- // Make sure that we're working with the right name
- var ret, type, hooks,
- origName = jQuery.camelCase( name ),
- style = elem.style;
-
- name = jQuery.cssProps[ origName ] ||
- ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
- // Gets hook for the prefixed version, then unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // Convert "+=" or "-=" to relative numbers (#7345)
- if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
- value = adjustCSS( elem, name, ret );
-
- // Fixes bug #9237
- type = "number";
- }
-
- // Make sure that null and NaN values aren't set (#7116)
- if ( value == null || value !== value ) {
- return;
- }
-
- // If a number was passed in, add the unit (except for certain CSS properties)
- if ( type === "number" ) {
- value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
- }
-
- // Support: IE9-11+
- // background-* props affect original clone's values
- if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
- style[ name ] = "inherit";
- }
-
- // If a hook was provided, use that value, otherwise just set the specified value
- if ( !hooks || !( "set" in hooks ) ||
- ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
- style[ name ] = value;
- }
-
- } else {
-
- // If a hook was provided get the non-computed value from there
- if ( hooks && "get" in hooks &&
- ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
- return ret;
- }
-
- // Otherwise just get the value from the style object
- return style[ name ];
- }
- },
-
- css: function( elem, name, extra, styles ) {
- var val, num, hooks,
- origName = jQuery.camelCase( name );
-
- // Make sure that we're working with the right name
- name = jQuery.cssProps[ origName ] ||
- ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
- // Try prefixed name followed by the unprefixed name
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks ) {
- val = hooks.get( elem, true, extra );
- }
-
- // Otherwise, if a way to get the computed value exists, use that
- if ( val === undefined ) {
- val = curCSS( elem, name, styles );
- }
-
- // Convert "normal" to computed value
- if ( val === "normal" && name in cssNormalTransform ) {
- val = cssNormalTransform[ name ];
- }
-
- // Make numeric if forced or a qualifier was provided and val looks numeric
- if ( extra === "" || extra ) {
- num = parseFloat( val );
- return extra === true || isFinite( num ) ? num || 0 : val;
- }
- return val;
- }
-} );
-
-jQuery.each( [ "height", "width" ], function( i, name ) {
- jQuery.cssHooks[ name ] = {
- get: function( elem, computed, extra ) {
- if ( computed ) {
-
- // Certain elements can have dimension info if we invisibly show them
- // but it must have a current display style that would benefit
- return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
- elem.offsetWidth === 0 ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, name, extra );
- } ) :
- getWidthOrHeight( elem, name, extra );
- }
- },
-
- set: function( elem, value, extra ) {
- var matches,
- styles = extra && getStyles( elem ),
- subtract = extra && augmentWidthOrHeight(
- elem,
- name,
- extra,
- jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
- styles
- );
-
- // Convert to pixels if value adjustment is needed
- if ( subtract && ( matches = rcssNum.exec( value ) ) &&
- ( matches[ 3 ] || "px" ) !== "px" ) {
-
- elem.style[ name ] = value;
- value = jQuery.css( elem, name );
- }
-
- return setPositiveNumber( elem, value, subtract );
- }
- };
-} );
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
- function( elem, computed ) {
- if ( computed ) {
- return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
- elem.getBoundingClientRect().left -
- swap( elem, { marginLeft: 0 }, function() {
- return elem.getBoundingClientRect().left;
- } )
- ) + "px";
- }
- }
-);
-
-// Support: Android 2.3
-jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
- function( elem, computed ) {
- if ( computed ) {
- return swap( elem, { "display": "inline-block" },
- curCSS, [ elem, "marginRight" ] );
- }
- }
-);
-
-// These hooks are used by animate to expand properties
-jQuery.each( {
- margin: "",
- padding: "",
- border: "Width"
-}, function( prefix, suffix ) {
- jQuery.cssHooks[ prefix + suffix ] = {
- expand: function( value ) {
- var i = 0,
- expanded = {},
-
- // Assumes a single number if not a string
- parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
- for ( ; i < 4; i++ ) {
- expanded[ prefix + cssExpand[ i ] + suffix ] =
- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
- }
-
- return expanded;
- }
- };
-
- if ( !rmargin.test( prefix ) ) {
- jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
- }
-} );
-
-jQuery.fn.extend( {
- css: function( name, value ) {
- return access( this, function( elem, name, value ) {
- var styles, len,
- map = {},
- i = 0;
-
- if ( jQuery.isArray( name ) ) {
- styles = getStyles( elem );
- len = name.length;
-
- for ( ; i < len; i++ ) {
- map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
- }
-
- return map;
- }
-
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- }, name, value, arguments.length > 1 );
- },
- show: function() {
- return showHide( this, true );
- },
- hide: function() {
- return showHide( this );
- },
- toggle: function( state ) {
- if ( typeof state === "boolean" ) {
- return state ? this.show() : this.hide();
- }
-
- return this.each( function() {
- if ( isHidden( this ) ) {
- jQuery( this ).show();
- } else {
- jQuery( this ).hide();
- }
- } );
- }
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/css/addGetHookIf.js b/libs/bower_components/jquery/src/css/addGetHookIf.js
deleted file mode 100644
index 9cd21f6833..0000000000
--- a/libs/bower_components/jquery/src/css/addGetHookIf.js
+++ /dev/null
@@ -1,24 +0,0 @@
-define( function() {
-
-function addGetHookIf( conditionFn, hookFn ) {
-
- // Define the hook, we'll check on the first run if it's really needed.
- return {
- get: function() {
- if ( conditionFn() ) {
-
- // Hook not needed (or it's not possible to use it due
- // to missing dependency), remove it.
- delete this.get;
- return;
- }
-
- // Hook needed; redefine it so that the support test is not executed again.
- return ( this.get = hookFn ).apply( this, arguments );
- }
- };
-}
-
-return addGetHookIf;
-
-} );
diff --git a/libs/bower_components/jquery/src/css/adjustCSS.js b/libs/bower_components/jquery/src/css/adjustCSS.js
deleted file mode 100644
index 48fcfec05e..0000000000
--- a/libs/bower_components/jquery/src/css/adjustCSS.js
+++ /dev/null
@@ -1,65 +0,0 @@
-define( [
- "../core",
- "../var/rcssNum"
-], function( jQuery, rcssNum ) {
-
-function adjustCSS( elem, prop, valueParts, tween ) {
- var adjusted,
- scale = 1,
- maxIterations = 20,
- currentValue = tween ?
- function() { return tween.cur(); } :
- function() { return jQuery.css( elem, prop, "" ); },
- initial = currentValue(),
- unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
- // Starting value computation is required for potential unit mismatches
- initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
- rcssNum.exec( jQuery.css( elem, prop ) );
-
- if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
- // Trust units reported by jQuery.css
- unit = unit || initialInUnit[ 3 ];
-
- // Make sure we update the tween properties later on
- valueParts = valueParts || [];
-
- // Iteratively approximate from a nonzero starting point
- initialInUnit = +initial || 1;
-
- do {
-
- // If previous iteration zeroed out, double until we get *something*.
- // Use string for doubling so we don't accidentally see scale as unchanged below
- scale = scale || ".5";
-
- // Adjust and apply
- initialInUnit = initialInUnit / scale;
- jQuery.style( elem, prop, initialInUnit + unit );
-
- // Update scale, tolerating zero or NaN from tween.cur()
- // Break the loop if scale is unchanged or perfect, or if we've just had enough.
- } while (
- scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
- );
- }
-
- if ( valueParts ) {
- initialInUnit = +initialInUnit || +initial || 0;
-
- // Apply relative offset (+=/-=) if specified
- adjusted = valueParts[ 1 ] ?
- initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
- +valueParts[ 2 ];
- if ( tween ) {
- tween.unit = unit;
- tween.start = initialInUnit;
- tween.end = adjusted;
- }
- }
- return adjusted;
-}
-
-return adjustCSS;
-} );
diff --git a/libs/bower_components/jquery/src/css/curCSS.js b/libs/bower_components/jquery/src/css/curCSS.js
deleted file mode 100644
index 084f8c7bde..0000000000
--- a/libs/bower_components/jquery/src/css/curCSS.js
+++ /dev/null
@@ -1,60 +0,0 @@
-define( [
- "../core",
- "./var/rnumnonpx",
- "./var/rmargin",
- "./var/getStyles",
- "./support",
- "../selector" // Get jQuery.contains
-], function( jQuery, rnumnonpx, rmargin, getStyles, support ) {
-
-function curCSS( elem, name, computed ) {
- var width, minWidth, maxWidth, ret,
- style = elem.style;
-
- computed = computed || getStyles( elem );
- ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
-
- // Support: Opera 12.1x only
- // Fall back to style even without computed
- // computed is undefined for elems on document fragments
- if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
- ret = jQuery.style( elem, name );
- }
-
- // Support: IE9
- // getPropertyValue is only needed for .css('filter') (#12537)
- if ( computed ) {
-
- // A tribute to the "awesome hack by Dean Edwards"
- // Android Browser returns percentage for some values,
- // but width seems to be reliably pixels.
- // This is against the CSSOM draft spec:
- // http://dev.w3.org/csswg/cssom/#resolved-values
- if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
- // Remember the original values
- width = style.width;
- minWidth = style.minWidth;
- maxWidth = style.maxWidth;
-
- // Put in the new values to get a computed value out
- style.minWidth = style.maxWidth = style.width = ret;
- ret = computed.width;
-
- // Revert the changed values
- style.width = width;
- style.minWidth = minWidth;
- style.maxWidth = maxWidth;
- }
- }
-
- return ret !== undefined ?
-
- // Support: IE9-11+
- // IE returns zIndex value as an integer.
- ret + "" :
- ret;
-}
-
-return curCSS;
-} );
diff --git a/libs/bower_components/jquery/src/css/defaultDisplay.js b/libs/bower_components/jquery/src/css/defaultDisplay.js
deleted file mode 100644
index b1fb5774d6..0000000000
--- a/libs/bower_components/jquery/src/css/defaultDisplay.js
+++ /dev/null
@@ -1,72 +0,0 @@
-define( [
- "../core",
- "../var/document",
- "../manipulation" // appendTo
-], function( jQuery, document ) {
-
-var iframe,
- elemdisplay = {
-
- // Support: Firefox
- // We have to pre-define these values for FF (#10227)
- HTML: "block",
- BODY: "block"
- };
-
-/**
- * Retrieve the actual display of a element
- * @param {String} name nodeName of the element
- * @param {Object} doc Document object
- */
-
-// Called only from within defaultDisplay
-function actualDisplay( name, doc ) {
- var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-
- display = jQuery.css( elem[ 0 ], "display" );
-
- // We don't have any data stored on the element,
- // so use "detach" method as fast way to get rid of the element
- elem.detach();
-
- return display;
-}
-
-/**
- * Try to determine the default display value of an element
- * @param {String} nodeName
- */
-function defaultDisplay( nodeName ) {
- var doc = document,
- display = elemdisplay[ nodeName ];
-
- if ( !display ) {
- display = actualDisplay( nodeName, doc );
-
- // If the simple way fails, read from inside an iframe
- if ( display === "none" || !display ) {
-
- // Use the already-created iframe if possible
- iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
- .appendTo( doc.documentElement );
-
- // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
- doc = iframe[ 0 ].contentDocument;
-
- // Support: IE
- doc.write();
- doc.close();
-
- display = actualDisplay( nodeName, doc );
- iframe.detach();
- }
-
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
- }
-
- return display;
-}
-
-return defaultDisplay;
-} );
diff --git a/libs/bower_components/jquery/src/css/hiddenVisibleSelectors.js b/libs/bower_components/jquery/src/css/hiddenVisibleSelectors.js
deleted file mode 100644
index cf0955d3eb..0000000000
--- a/libs/bower_components/jquery/src/css/hiddenVisibleSelectors.js
+++ /dev/null
@@ -1,18 +0,0 @@
-define( [
- "../core",
- "../selector"
-], function( jQuery ) {
-
-jQuery.expr.filters.hidden = function( elem ) {
- return !jQuery.expr.filters.visible( elem );
-};
-jQuery.expr.filters.visible = function( elem ) {
-
- // Support: Opera <= 12.12
- // Opera reports offsetWidths and offsetHeights less than zero on some elements
- // Use OR instead of AND as the element is not visible if either is true
- // See tickets #10406 and #13132
- return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;
-};
-
-} );
diff --git a/libs/bower_components/jquery/src/css/showHide.js b/libs/bower_components/jquery/src/css/showHide.js
deleted file mode 100644
index 35e15bde89..0000000000
--- a/libs/bower_components/jquery/src/css/showHide.js
+++ /dev/null
@@ -1,48 +0,0 @@
-define( [
- "../data/var/dataPriv"
-], function( dataPriv ) {
-
-function showHide( elements, show ) {
- var display, elem,
- values = [],
- index = 0,
- length = elements.length;
-
- // Determine new display value for elements that need to change
- for ( ; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
-
- display = elem.style.display;
- if ( show ) {
- if ( display === "none" ) {
-
- // Restore a pre-hide() value if we have one
- values[ index ] = dataPriv.get( elem, "display" ) || "";
- }
- } else {
- if ( display !== "none" ) {
- values[ index ] = "none";
-
- // Remember the value we're replacing
- dataPriv.set( elem, "display", display );
- }
- }
- }
-
- // Set the display of the elements in a second loop
- // to avoid the constant reflow
- for ( index = 0; index < length; index++ ) {
- if ( values[ index ] != null ) {
- elements[ index ].style.display = values[ index ];
- }
- }
-
- return elements;
-}
-
-return showHide;
-
-} );
diff --git a/libs/bower_components/jquery/src/css/support.js b/libs/bower_components/jquery/src/css/support.js
deleted file mode 100644
index 7e6e51334b..0000000000
--- a/libs/bower_components/jquery/src/css/support.js
+++ /dev/null
@@ -1,121 +0,0 @@
-define( [
- "../core",
- "../var/document",
- "../var/documentElement",
- "../var/support"
-], function( jQuery, document, documentElement, support ) {
-
-( function() {
- var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
- container = document.createElement( "div" ),
- div = document.createElement( "div" );
-
- // Finish early in limited (non-browser) environments
- if ( !div.style ) {
- return;
- }
-
- // Support: IE9-11+
- // Style of cloned element affects source element cloned (#8908)
- div.style.backgroundClip = "content-box";
- div.cloneNode( true ).style.backgroundClip = "";
- support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
- container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
- "padding:0;margin-top:1px;position:absolute";
- container.appendChild( div );
-
- // Executing both pixelPosition & boxSizingReliable tests require only one layout
- // so they're executed at the same time to save the second computation.
- function computeStyleTests() {
- div.style.cssText =
-
- // Support: Firefox<29, Android 2.3
- // Vendor-prefix box-sizing
- "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" +
- "position:relative;display:block;" +
- "margin:auto;border:1px;padding:1px;" +
- "top:1%;width:50%";
- div.innerHTML = "";
- documentElement.appendChild( container );
-
- var divStyle = window.getComputedStyle( div );
- pixelPositionVal = divStyle.top !== "1%";
- reliableMarginLeftVal = divStyle.marginLeft === "2px";
- boxSizingReliableVal = divStyle.width === "4px";
-
- // Support: Android 4.0 - 4.3 only
- // Some styles come back with percentage values, even though they shouldn't
- div.style.marginRight = "50%";
- pixelMarginRightVal = divStyle.marginRight === "4px";
-
- documentElement.removeChild( container );
- }
-
- jQuery.extend( support, {
- pixelPosition: function() {
-
- // This test is executed only once but we still do memoizing
- // since we can use the boxSizingReliable pre-computing.
- // No need to check if the test was already performed, though.
- computeStyleTests();
- return pixelPositionVal;
- },
- boxSizingReliable: function() {
- if ( boxSizingReliableVal == null ) {
- computeStyleTests();
- }
- return boxSizingReliableVal;
- },
- pixelMarginRight: function() {
-
- // Support: Android 4.0-4.3
- // We're checking for boxSizingReliableVal here instead of pixelMarginRightVal
- // since that compresses better and they're computed together anyway.
- if ( boxSizingReliableVal == null ) {
- computeStyleTests();
- }
- return pixelMarginRightVal;
- },
- reliableMarginLeft: function() {
-
- // Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
- if ( boxSizingReliableVal == null ) {
- computeStyleTests();
- }
- return reliableMarginLeftVal;
- },
- reliableMarginRight: function() {
-
- // Support: Android 2.3
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. (#3333)
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- // This support function is only executed once so no memoizing is needed.
- var ret,
- marginDiv = div.appendChild( document.createElement( "div" ) );
-
- // Reset CSS: box-sizing; display; margin; border; padding
- marginDiv.style.cssText = div.style.cssText =
-
- // Support: Android 2.3
- // Vendor-prefix box-sizing
- "-webkit-box-sizing:content-box;box-sizing:content-box;" +
- "display:block;margin:0;border:0;padding:0";
- marginDiv.style.marginRight = marginDiv.style.width = "0";
- div.style.width = "1px";
- documentElement.appendChild( container );
-
- ret = !parseFloat( window.getComputedStyle( marginDiv ).marginRight );
-
- documentElement.removeChild( container );
- div.removeChild( marginDiv );
-
- return ret;
- }
- } );
-} )();
-
-return support;
-
-} );
diff --git a/libs/bower_components/jquery/src/css/var/cssExpand.js b/libs/bower_components/jquery/src/css/var/cssExpand.js
deleted file mode 100644
index 9f8194dc88..0000000000
--- a/libs/bower_components/jquery/src/css/var/cssExpand.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return [ "Top", "Right", "Bottom", "Left" ];
-} );
diff --git a/libs/bower_components/jquery/src/css/var/getStyles.js b/libs/bower_components/jquery/src/css/var/getStyles.js
deleted file mode 100644
index 02a4b8194e..0000000000
--- a/libs/bower_components/jquery/src/css/var/getStyles.js
+++ /dev/null
@@ -1,15 +0,0 @@
-define( function() {
- return function( elem ) {
-
- // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
- // IE throws on elements created in popups
- // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
- var view = elem.ownerDocument.defaultView;
-
- if ( !view || !view.opener ) {
- view = window;
- }
-
- return view.getComputedStyle( elem );
- };
-} );
diff --git a/libs/bower_components/jquery/src/css/var/isHidden.js b/libs/bower_components/jquery/src/css/var/isHidden.js
deleted file mode 100644
index 7997efff18..0000000000
--- a/libs/bower_components/jquery/src/css/var/isHidden.js
+++ /dev/null
@@ -1,16 +0,0 @@
-define( [
- "../../core",
- "../../selector"
-
- // css is assumed
-], function( jQuery ) {
-
- return function( elem, el ) {
-
- // isHidden might be called from jQuery#filter function;
- // in that case, element will be second argument
- elem = el || elem;
- return jQuery.css( elem, "display" ) === "none" ||
- !jQuery.contains( elem.ownerDocument, elem );
- };
-} );
diff --git a/libs/bower_components/jquery/src/css/var/rmargin.js b/libs/bower_components/jquery/src/css/var/rmargin.js
deleted file mode 100644
index 9be2212435..0000000000
--- a/libs/bower_components/jquery/src/css/var/rmargin.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return ( /^margin/ );
-} );
diff --git a/libs/bower_components/jquery/src/css/var/rnumnonpx.js b/libs/bower_components/jquery/src/css/var/rnumnonpx.js
deleted file mode 100644
index ed13f0b985..0000000000
--- a/libs/bower_components/jquery/src/css/var/rnumnonpx.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "../../var/pnum"
-], function( pnum ) {
- return new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-} );
diff --git a/libs/bower_components/jquery/src/css/var/swap.js b/libs/bower_components/jquery/src/css/var/swap.js
deleted file mode 100644
index b6d3b679f9..0000000000
--- a/libs/bower_components/jquery/src/css/var/swap.js
+++ /dev/null
@@ -1,24 +0,0 @@
-define( function() {
-
-// A method for quickly swapping in/out CSS properties to get correct calculations.
-return function( elem, options, callback, args ) {
- var ret, name,
- old = {};
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.apply( elem, args || [] );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
-};
-
-} );
diff --git a/libs/bower_components/jquery/src/data.js b/libs/bower_components/jquery/src/data.js
deleted file mode 100644
index b626fda457..0000000000
--- a/libs/bower_components/jquery/src/data.js
+++ /dev/null
@@ -1,187 +0,0 @@
-define( [
- "./core",
- "./core/access",
- "./data/var/dataPriv",
- "./data/var/dataUser"
-], function( jQuery, access, dataPriv, dataUser ) {
-
-// Implementation Summary
-//
-// 1. Enforce API surface and semantic compatibility with 1.9.x branch
-// 2. Improve the module's maintainability by reducing the storage
-// paths to a single mechanism.
-// 3. Use the same single mechanism to support "private" and "user" data.
-// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-// 5. Avoid exposing implementation details on user objects (eg. expando properties)
-// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
- rmultiDash = /[A-Z]/g;
-
-function dataAttr( elem, key, data ) {
- var name;
-
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
- name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
-
- // Only convert to a number if it doesn't change the string
- +data + "" === data ? +data :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch ( e ) {}
-
- // Make sure we set the data so it isn't changed later
- dataUser.set( elem, key, data );
- } else {
- data = undefined;
- }
- }
- return data;
-}
-
-jQuery.extend( {
- hasData: function( elem ) {
- return dataUser.hasData( elem ) || dataPriv.hasData( elem );
- },
-
- data: function( elem, name, data ) {
- return dataUser.access( elem, name, data );
- },
-
- removeData: function( elem, name ) {
- dataUser.remove( elem, name );
- },
-
- // TODO: Now that all calls to _data and _removeData have been replaced
- // with direct calls to dataPriv methods, these can be deprecated.
- _data: function( elem, name, data ) {
- return dataPriv.access( elem, name, data );
- },
-
- _removeData: function( elem, name ) {
- dataPriv.remove( elem, name );
- }
-} );
-
-jQuery.fn.extend( {
- data: function( key, value ) {
- var i, name, data,
- elem = this[ 0 ],
- attrs = elem && elem.attributes;
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = dataUser.get( elem );
-
- if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
- i = attrs.length;
- while ( i-- ) {
-
- // Support: IE11+
- // The attrs elements can be null (#14894)
- if ( attrs[ i ] ) {
- name = attrs[ i ].name;
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.slice( 5 ) );
- dataAttr( elem, name, data[ name ] );
- }
- }
- }
- dataPriv.set( elem, "hasDataAttrs", true );
- }
- }
-
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each( function() {
- dataUser.set( this, key );
- } );
- }
-
- return access( this, function( value ) {
- var data, camelKey;
-
- // The calling jQuery object (element matches) is not empty
- // (and therefore has an element appears at this[ 0 ]) and the
- // `value` parameter was not undefined. An empty jQuery object
- // will result in `undefined` for elem = this[ 0 ] which will
- // throw an exception if an attempt to read a data cache is made.
- if ( elem && value === undefined ) {
-
- // Attempt to get data from the cache
- // with the key as-is
- data = dataUser.get( elem, key ) ||
-
- // Try to find dashed key if it exists (gh-2779)
- // This is for 2.2.x only
- dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() );
-
- if ( data !== undefined ) {
- return data;
- }
-
- camelKey = jQuery.camelCase( key );
-
- // Attempt to get data from the cache
- // with the key camelized
- data = dataUser.get( elem, camelKey );
- if ( data !== undefined ) {
- return data;
- }
-
- // Attempt to "discover" the data in
- // HTML5 custom data-* attrs
- data = dataAttr( elem, camelKey, undefined );
- if ( data !== undefined ) {
- return data;
- }
-
- // We tried really hard, but the data doesn't exist.
- return;
- }
-
- // Set the data...
- camelKey = jQuery.camelCase( key );
- this.each( function() {
-
- // First, attempt to store a copy or reference of any
- // data that might've been store with a camelCased key.
- var data = dataUser.get( this, camelKey );
-
- // For HTML5 data-* attribute interop, we have to
- // store property names with dashes in a camelCase form.
- // This might not apply to all properties...*
- dataUser.set( this, camelKey, value );
-
- // *... In the case of properties that might _actually_
- // have dashes, we need to also store a copy of that
- // unchanged property.
- if ( key.indexOf( "-" ) > -1 && data !== undefined ) {
- dataUser.set( this, key, value );
- }
- } );
- }, null, value, arguments.length > 1, null, true );
- },
-
- removeData: function( key ) {
- return this.each( function() {
- dataUser.remove( this, key );
- } );
- }
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/data/Data.js b/libs/bower_components/jquery/src/data/Data.js
deleted file mode 100644
index 0e29c1fc63..0000000000
--- a/libs/bower_components/jquery/src/data/Data.js
+++ /dev/null
@@ -1,200 +0,0 @@
-define( [
- "../core",
- "../var/rnotwhite",
- "./var/acceptData"
-], function( jQuery, rnotwhite, acceptData ) {
-
-function Data() {
- this.expando = jQuery.expando + Data.uid++;
-}
-
-Data.uid = 1;
-
-Data.prototype = {
-
- register: function( owner, initial ) {
- var value = initial || {};
-
- // If it is a node unlikely to be stringify-ed or looped over
- // use plain assignment
- if ( owner.nodeType ) {
- owner[ this.expando ] = value;
-
- // Otherwise secure it in a non-enumerable, non-writable property
- // configurability must be true to allow the property to be
- // deleted with the delete operator
- } else {
- Object.defineProperty( owner, this.expando, {
- value: value,
- writable: true,
- configurable: true
- } );
- }
- return owner[ this.expando ];
- },
- cache: function( owner ) {
-
- // We can accept data for non-element nodes in modern browsers,
- // but we should not, see #8335.
- // Always return an empty object.
- if ( !acceptData( owner ) ) {
- return {};
- }
-
- // Check if the owner object already has a cache
- var value = owner[ this.expando ];
-
- // If not, create one
- if ( !value ) {
- value = {};
-
- // We can accept data for non-element nodes in modern browsers,
- // but we should not, see #8335.
- // Always return an empty object.
- if ( acceptData( owner ) ) {
-
- // If it is a node unlikely to be stringify-ed or looped over
- // use plain assignment
- if ( owner.nodeType ) {
- owner[ this.expando ] = value;
-
- // Otherwise secure it in a non-enumerable property
- // configurable must be true to allow the property to be
- // deleted when data is removed
- } else {
- Object.defineProperty( owner, this.expando, {
- value: value,
- configurable: true
- } );
- }
- }
- }
-
- return value;
- },
- set: function( owner, data, value ) {
- var prop,
- cache = this.cache( owner );
-
- // Handle: [ owner, key, value ] args
- if ( typeof data === "string" ) {
- cache[ data ] = value;
-
- // Handle: [ owner, { properties } ] args
- } else {
-
- // Copy the properties one-by-one to the cache object
- for ( prop in data ) {
- cache[ prop ] = data[ prop ];
- }
- }
- return cache;
- },
- get: function( owner, key ) {
- return key === undefined ?
- this.cache( owner ) :
- owner[ this.expando ] && owner[ this.expando ][ key ];
- },
- access: function( owner, key, value ) {
- var stored;
-
- // In cases where either:
- //
- // 1. No key was specified
- // 2. A string key was specified, but no value provided
- //
- // Take the "read" path and allow the get method to determine
- // which value to return, respectively either:
- //
- // 1. The entire cache object
- // 2. The data stored at the key
- //
- if ( key === undefined ||
- ( ( key && typeof key === "string" ) && value === undefined ) ) {
-
- stored = this.get( owner, key );
-
- return stored !== undefined ?
- stored : this.get( owner, jQuery.camelCase( key ) );
- }
-
- // When the key is not a string, or both a key and value
- // are specified, set or extend (existing objects) with either:
- //
- // 1. An object of properties
- // 2. A key and value
- //
- this.set( owner, key, value );
-
- // Since the "set" path can have two possible entry points
- // return the expected data based on which path was taken[*]
- return value !== undefined ? value : key;
- },
- remove: function( owner, key ) {
- var i, name, camel,
- cache = owner[ this.expando ];
-
- if ( cache === undefined ) {
- return;
- }
-
- if ( key === undefined ) {
- this.register( owner );
-
- } else {
-
- // Support array or space separated string of keys
- if ( jQuery.isArray( key ) ) {
-
- // If "name" is an array of keys...
- // When data is initially created, via ("key", "val") signature,
- // keys will be converted to camelCase.
- // Since there is no way to tell _how_ a key was added, remove
- // both plain key and camelCase key. #12786
- // This will only penalize the array argument path.
- name = key.concat( key.map( jQuery.camelCase ) );
- } else {
- camel = jQuery.camelCase( key );
-
- // Try the string as a key before any manipulation
- if ( key in cache ) {
- name = [ key, camel ];
- } else {
-
- // If a key with the spaces exists, use it.
- // Otherwise, create an array by matching non-whitespace
- name = camel;
- name = name in cache ?
- [ name ] : ( name.match( rnotwhite ) || [] );
- }
- }
-
- i = name.length;
-
- while ( i-- ) {
- delete cache[ name[ i ] ];
- }
- }
-
- // Remove the expando if there's no more data
- if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
- // Support: Chrome <= 35-45+
- // Webkit & Blink performance suffers when deleting properties
- // from DOM nodes, so set to undefined instead
- // https://code.google.com/p/chromium/issues/detail?id=378607
- if ( owner.nodeType ) {
- owner[ this.expando ] = undefined;
- } else {
- delete owner[ this.expando ];
- }
- }
- },
- hasData: function( owner ) {
- var cache = owner[ this.expando ];
- return cache !== undefined && !jQuery.isEmptyObject( cache );
- }
-};
-
-return Data;
-} );
diff --git a/libs/bower_components/jquery/src/data/accepts.js b/libs/bower_components/jquery/src/data/accepts.js
deleted file mode 100644
index 291c7b4751..0000000000
--- a/libs/bower_components/jquery/src/data/accepts.js
+++ /dev/null
@@ -1,20 +0,0 @@
-define([
- "../core"
-], function( jQuery ) {
-
-/**
- * Determines whether an object can have data
- */
-jQuery.acceptData = function( owner ) {
- // Accepts only:
- // - Node
- // - Node.ELEMENT_NODE
- // - Node.DOCUMENT_NODE
- // - Object
- // - Any
- /* jshint -W018 */
- return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-return jQuery.acceptData;
-});
diff --git a/libs/bower_components/jquery/src/data/support.js b/libs/bower_components/jquery/src/data/support.js
deleted file mode 100644
index f796ab574c..0000000000
--- a/libs/bower_components/jquery/src/data/support.js
+++ /dev/null
@@ -1,23 +0,0 @@
-define( [
- "../var/document",
- "../var/support"
-], function( document, support ) {
-
-( function() {
- var div = document.createElement( "div" );
-
- // Support: IE<9
- support.deleteExpando = true;
- try {
- delete div.test;
- } catch ( e ) {
- support.deleteExpando = false;
- }
-
- // Null elements to avoid leaks in IE.
- div = null;
-} )();
-
-return support;
-
-} );
diff --git a/libs/bower_components/jquery/src/data/var/acceptData.js b/libs/bower_components/jquery/src/data/var/acceptData.js
deleted file mode 100644
index 6e15af1278..0000000000
--- a/libs/bower_components/jquery/src/data/var/acceptData.js
+++ /dev/null
@@ -1,18 +0,0 @@
-define( function() {
-
-/**
- * Determines whether an object can have data
- */
-return function( owner ) {
-
- // Accepts only:
- // - Node
- // - Node.ELEMENT_NODE
- // - Node.DOCUMENT_NODE
- // - Object
- // - Any
- /* jshint -W018 */
- return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-} );
diff --git a/libs/bower_components/jquery/src/data/var/dataPriv.js b/libs/bower_components/jquery/src/data/var/dataPriv.js
deleted file mode 100644
index 9a1343ce1a..0000000000
--- a/libs/bower_components/jquery/src/data/var/dataPriv.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "../Data"
-], function( Data ) {
- return new Data();
-} );
diff --git a/libs/bower_components/jquery/src/data/var/dataUser.js b/libs/bower_components/jquery/src/data/var/dataUser.js
deleted file mode 100644
index 9a1343ce1a..0000000000
--- a/libs/bower_components/jquery/src/data/var/dataUser.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "../Data"
-], function( Data ) {
- return new Data();
-} );
diff --git a/libs/bower_components/jquery/src/deferred.js b/libs/bower_components/jquery/src/deferred.js
deleted file mode 100644
index d2cd6080f8..0000000000
--- a/libs/bower_components/jquery/src/deferred.js
+++ /dev/null
@@ -1,158 +0,0 @@
-define( [
- "./core",
- "./var/slice",
- "./callbacks"
-], function( jQuery, slice ) {
-
-jQuery.extend( {
-
- Deferred: function( func ) {
- var tuples = [
-
- // action, add listener, listener list, final state
- [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
- [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
- [ "notify", "progress", jQuery.Callbacks( "memory" ) ]
- ],
- state = "pending",
- promise = {
- state: function() {
- return state;
- },
- always: function() {
- deferred.done( arguments ).fail( arguments );
- return this;
- },
- then: function( /* fnDone, fnFail, fnProgress */ ) {
- var fns = arguments;
- return jQuery.Deferred( function( newDefer ) {
- jQuery.each( tuples, function( i, tuple ) {
- var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-
- // deferred[ done | fail | progress ] for forwarding actions to newDefer
- deferred[ tuple[ 1 ] ]( function() {
- var returned = fn && fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise()
- .progress( newDefer.notify )
- .done( newDefer.resolve )
- .fail( newDefer.reject );
- } else {
- newDefer[ tuple[ 0 ] + "With" ](
- this === promise ? newDefer.promise() : this,
- fn ? [ returned ] : arguments
- );
- }
- } );
- } );
- fns = null;
- } ).promise();
- },
-
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- return obj != null ? jQuery.extend( obj, promise ) : promise;
- }
- },
- deferred = {};
-
- // Keep pipe for back-compat
- promise.pipe = promise.then;
-
- // Add list-specific methods
- jQuery.each( tuples, function( i, tuple ) {
- var list = tuple[ 2 ],
- stateString = tuple[ 3 ];
-
- // promise[ done | fail | progress ] = list.add
- promise[ tuple[ 1 ] ] = list.add;
-
- // Handle state
- if ( stateString ) {
- list.add( function() {
-
- // state = [ resolved | rejected ]
- state = stateString;
-
- // [ reject_list | resolve_list ].disable; progress_list.lock
- }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
- }
-
- // deferred[ resolve | reject | notify ]
- deferred[ tuple[ 0 ] ] = function() {
- deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
- return this;
- };
- deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
- } );
-
- // Make the deferred a promise
- promise.promise( deferred );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when: function( subordinate /* , ..., subordinateN */ ) {
- var i = 0,
- resolveValues = slice.call( arguments ),
- length = resolveValues.length,
-
- // the count of uncompleted subordinates
- remaining = length !== 1 ||
- ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
- // the master Deferred.
- // If resolveValues consist of only a single Deferred, just use that.
- deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
- // Update function for both resolve and progress values
- updateFunc = function( i, contexts, values ) {
- return function( value ) {
- contexts[ i ] = this;
- values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
- if ( values === progressValues ) {
- deferred.notifyWith( contexts, values );
- } else if ( !( --remaining ) ) {
- deferred.resolveWith( contexts, values );
- }
- };
- },
-
- progressValues, progressContexts, resolveContexts;
-
- // Add listeners to Deferred subordinates; treat others as resolved
- if ( length > 1 ) {
- progressValues = new Array( length );
- progressContexts = new Array( length );
- resolveContexts = new Array( length );
- for ( ; i < length; i++ ) {
- if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
- resolveValues[ i ].promise()
- .progress( updateFunc( i, progressContexts, progressValues ) )
- .done( updateFunc( i, resolveContexts, resolveValues ) )
- .fail( deferred.reject );
- } else {
- --remaining;
- }
- }
- }
-
- // If we're not waiting on anything, resolve the master
- if ( !remaining ) {
- deferred.resolveWith( resolveContexts, resolveValues );
- }
-
- return deferred.promise();
- }
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/deferred/exceptionHook.js b/libs/bower_components/jquery/src/deferred/exceptionHook.js
deleted file mode 100644
index b9955063a6..0000000000
--- a/libs/bower_components/jquery/src/deferred/exceptionHook.js
+++ /dev/null
@@ -1,19 +0,0 @@
-define( [
- "../core",
- "../deferred"
-], function( jQuery ) {
-
-// These usually indicate a programmer mistake during development,
-// warn about them ASAP rather than swallowing them by default.
-var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-
-jQuery.Deferred.exceptionHook = function( error, stack ) {
-
- // Support: IE9
- // Console exists when dev tools are open, which can happen at any time
- if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
- window.console.warn( "jQuery.Deferred exception: " + error.message, stack );
- }
-};
-
-} );
diff --git a/libs/bower_components/jquery/src/deprecated.js b/libs/bower_components/jquery/src/deprecated.js
deleted file mode 100644
index c82989007c..0000000000
--- a/libs/bower_components/jquery/src/deprecated.js
+++ /dev/null
@@ -1,32 +0,0 @@
-define( [
- "./core"
-], function( jQuery ) {
-
-jQuery.fn.extend( {
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
-
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length === 1 ?
- this.off( selector, "**" ) :
- this.off( types, selector || "**", fn );
- },
- size: function() {
- return this.length;
- }
-} );
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-} );
-
diff --git a/libs/bower_components/jquery/src/dimensions.js b/libs/bower_components/jquery/src/dimensions.js
deleted file mode 100644
index 30b55fbc0e..0000000000
--- a/libs/bower_components/jquery/src/dimensions.js
+++ /dev/null
@@ -1,54 +0,0 @@
-define( [
- "./core",
- "./core/access",
- "./css"
-], function( jQuery, access ) {
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
-
- // Margin is only for outerHeight, outerWidth
- jQuery.fn[ funcName ] = function( margin, value ) {
- var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
- extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
- return access( this, function( elem, type, value ) {
- var doc;
-
- if ( jQuery.isWindow( elem ) ) {
-
- // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
- // isn't a whole lot we can do. See pull request at this URL for discussion:
- // https://github.com/jquery/jquery/pull/764
- return elem.document.documentElement[ "client" + name ];
- }
-
- // Get document width or height
- if ( elem.nodeType === 9 ) {
- doc = elem.documentElement;
-
- // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
- // whichever is greatest
- return Math.max(
- elem.body[ "scroll" + name ], doc[ "scroll" + name ],
- elem.body[ "offset" + name ], doc[ "offset" + name ],
- doc[ "client" + name ]
- );
- }
-
- return value === undefined ?
-
- // Get width or height on the element, requesting but not forcing parseFloat
- jQuery.css( elem, type, extra ) :
-
- // Set width or height on the element
- jQuery.style( elem, type, value, extra );
- }, type, chainable ? margin : undefined, chainable, null );
- };
- } );
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/effects.js b/libs/bower_components/jquery/src/effects.js
deleted file mode 100644
index 178fa42f06..0000000000
--- a/libs/bower_components/jquery/src/effects.js
+++ /dev/null
@@ -1,629 +0,0 @@
-define( [
- "./core",
- "./var/document",
- "./var/rcssNum",
- "./css/var/cssExpand",
- "./var/rnotwhite",
- "./css/var/isHidden",
- "./css/adjustCSS",
- "./css/defaultDisplay",
- "./data/var/dataPriv",
-
- "./core/init",
- "./effects/Tween",
- "./queue",
- "./css",
- "./deferred",
- "./traversing"
-], function( jQuery, document, rcssNum, cssExpand, rnotwhite,
- isHidden, adjustCSS, defaultDisplay, dataPriv ) {
-
-var
- fxNow, timerId,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rrun = /queueHooks$/;
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- window.setTimeout( function() {
- fxNow = undefined;
- } );
- return ( fxNow = jQuery.now() );
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
- var which,
- i = 0,
- attrs = { height: type };
-
- // If we include width, step value is 1 to do all cssExpand values,
- // otherwise step value is 2 to skip over Left and Right
- includeWidth = includeWidth ? 1 : 0;
- for ( ; i < 4 ; i += 2 - includeWidth ) {
- which = cssExpand[ i ];
- attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
- }
-
- if ( includeWidth ) {
- attrs.opacity = attrs.width = type;
- }
-
- return attrs;
-}
-
-function createTween( value, prop, animation ) {
- var tween,
- collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
- index = 0,
- length = collection.length;
- for ( ; index < length; index++ ) {
- if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
-
- // We're done with this property
- return tween;
- }
- }
-}
-
-function defaultPrefilter( elem, props, opts ) {
- /* jshint validthis: true */
- var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
- anim = this,
- orig = {},
- style = elem.style,
- hidden = elem.nodeType && isHidden( elem ),
- dataShow = dataPriv.get( elem, "fxshow" );
-
- // Handle queue: false promises
- if ( !opts.queue ) {
- hooks = jQuery._queueHooks( elem, "fx" );
- if ( hooks.unqueued == null ) {
- hooks.unqueued = 0;
- oldfire = hooks.empty.fire;
- hooks.empty.fire = function() {
- if ( !hooks.unqueued ) {
- oldfire();
- }
- };
- }
- hooks.unqueued++;
-
- anim.always( function() {
-
- // Ensure the complete handler is called before this completes
- anim.always( function() {
- hooks.unqueued--;
- if ( !jQuery.queue( elem, "fx" ).length ) {
- hooks.empty.fire();
- }
- } );
- } );
- }
-
- // Height/width overflow pass
- if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-
- // Make sure that nothing sneaks out
- // Record all 3 overflow attributes because IE9-10 do not
- // change the overflow attribute when overflowX and
- // overflowY are set to the same value
- opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
- // Set display property to inline-block for height/width
- // animations on inline elements that are having width/height animated
- display = jQuery.css( elem, "display" );
-
- // Test default display if display is currently "none"
- checkDisplay = display === "none" ?
- dataPriv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
-
- if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
- style.display = "inline-block";
- }
- }
-
- if ( opts.overflow ) {
- style.overflow = "hidden";
- anim.always( function() {
- style.overflow = opts.overflow[ 0 ];
- style.overflowX = opts.overflow[ 1 ];
- style.overflowY = opts.overflow[ 2 ];
- } );
- }
-
- // show/hide pass
- for ( prop in props ) {
- value = props[ prop ];
- if ( rfxtypes.exec( value ) ) {
- delete props[ prop ];
- toggle = toggle || value === "toggle";
- if ( value === ( hidden ? "hide" : "show" ) ) {
-
- // If there is dataShow left over from a stopped hide or show
- // and we are going to proceed with show, we should pretend to be hidden
- if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
- hidden = true;
- } else {
- continue;
- }
- }
- orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
-
- // Any non-fx value stops us from restoring the original display value
- } else {
- display = undefined;
- }
- }
-
- if ( !jQuery.isEmptyObject( orig ) ) {
- if ( dataShow ) {
- if ( "hidden" in dataShow ) {
- hidden = dataShow.hidden;
- }
- } else {
- dataShow = dataPriv.access( elem, "fxshow", {} );
- }
-
- // Store state if its toggle - enables .stop().toggle() to "reverse"
- if ( toggle ) {
- dataShow.hidden = !hidden;
- }
- if ( hidden ) {
- jQuery( elem ).show();
- } else {
- anim.done( function() {
- jQuery( elem ).hide();
- } );
- }
- anim.done( function() {
- var prop;
-
- dataPriv.remove( elem, "fxshow" );
- for ( prop in orig ) {
- jQuery.style( elem, prop, orig[ prop ] );
- }
- } );
- for ( prop in orig ) {
- tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-
- if ( !( prop in dataShow ) ) {
- dataShow[ prop ] = tween.start;
- if ( hidden ) {
- tween.end = tween.start;
- tween.start = prop === "width" || prop === "height" ? 1 : 0;
- }
- }
- }
-
- // If this is a noop like .hide().hide(), restore an overwritten display value
- } else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
- style.display = display;
- }
-}
-
-function propFilter( props, specialEasing ) {
- var index, name, easing, value, hooks;
-
- // camelCase, specialEasing and expand cssHook pass
- for ( index in props ) {
- name = jQuery.camelCase( index );
- easing = specialEasing[ name ];
- value = props[ index ];
- if ( jQuery.isArray( value ) ) {
- easing = value[ 1 ];
- value = props[ index ] = value[ 0 ];
- }
-
- if ( index !== name ) {
- props[ name ] = value;
- delete props[ index ];
- }
-
- hooks = jQuery.cssHooks[ name ];
- if ( hooks && "expand" in hooks ) {
- value = hooks.expand( value );
- delete props[ name ];
-
- // Not quite $.extend, this won't overwrite existing keys.
- // Reusing 'index' because we have the correct "name"
- for ( index in value ) {
- if ( !( index in props ) ) {
- props[ index ] = value[ index ];
- specialEasing[ index ] = easing;
- }
- }
- } else {
- specialEasing[ name ] = easing;
- }
- }
-}
-
-function Animation( elem, properties, options ) {
- var result,
- stopped,
- index = 0,
- length = Animation.prefilters.length,
- deferred = jQuery.Deferred().always( function() {
-
- // Don't match elem in the :animated selector
- delete tick.elem;
- } ),
- tick = function() {
- if ( stopped ) {
- return false;
- }
- var currentTime = fxNow || createFxNow(),
- remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-
- // Support: Android 2.3
- // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
- temp = remaining / animation.duration || 0,
- percent = 1 - temp,
- index = 0,
- length = animation.tweens.length;
-
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( percent );
- }
-
- deferred.notifyWith( elem, [ animation, percent, remaining ] );
-
- if ( percent < 1 && length ) {
- return remaining;
- } else {
- deferred.resolveWith( elem, [ animation ] );
- return false;
- }
- },
- animation = deferred.promise( {
- elem: elem,
- props: jQuery.extend( {}, properties ),
- opts: jQuery.extend( true, {
- specialEasing: {},
- easing: jQuery.easing._default
- }, options ),
- originalProperties: properties,
- originalOptions: options,
- startTime: fxNow || createFxNow(),
- duration: options.duration,
- tweens: [],
- createTween: function( prop, end ) {
- var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
- animation.tweens.push( tween );
- return tween;
- },
- stop: function( gotoEnd ) {
- var index = 0,
-
- // If we are going to the end, we want to run all the tweens
- // otherwise we skip this part
- length = gotoEnd ? animation.tweens.length : 0;
- if ( stopped ) {
- return this;
- }
- stopped = true;
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( 1 );
- }
-
- // Resolve when we played the last frame; otherwise, reject
- if ( gotoEnd ) {
- deferred.notifyWith( elem, [ animation, 1, 0 ] );
- deferred.resolveWith( elem, [ animation, gotoEnd ] );
- } else {
- deferred.rejectWith( elem, [ animation, gotoEnd ] );
- }
- return this;
- }
- } ),
- props = animation.props;
-
- propFilter( props, animation.opts.specialEasing );
-
- for ( ; index < length ; index++ ) {
- result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
- if ( result ) {
- if ( jQuery.isFunction( result.stop ) ) {
- jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
- jQuery.proxy( result.stop, result );
- }
- return result;
- }
- }
-
- jQuery.map( props, createTween, animation );
-
- if ( jQuery.isFunction( animation.opts.start ) ) {
- animation.opts.start.call( elem, animation );
- }
-
- jQuery.fx.timer(
- jQuery.extend( tick, {
- elem: elem,
- anim: animation,
- queue: animation.opts.queue
- } )
- );
-
- // attach callbacks from options
- return animation.progress( animation.opts.progress )
- .done( animation.opts.done, animation.opts.complete )
- .fail( animation.opts.fail )
- .always( animation.opts.always );
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
- tweeners: {
- "*": [ function( prop, value ) {
- var tween = this.createTween( prop, value );
- adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
- return tween;
- } ]
- },
-
- tweener: function( props, callback ) {
- if ( jQuery.isFunction( props ) ) {
- callback = props;
- props = [ "*" ];
- } else {
- props = props.match( rnotwhite );
- }
-
- var prop,
- index = 0,
- length = props.length;
-
- for ( ; index < length ; index++ ) {
- prop = props[ index ];
- Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
- Animation.tweeners[ prop ].unshift( callback );
- }
- },
-
- prefilters: [ defaultPrefilter ],
-
- prefilter: function( callback, prepend ) {
- if ( prepend ) {
- Animation.prefilters.unshift( callback );
- } else {
- Animation.prefilters.push( callback );
- }
- }
-} );
-
-jQuery.speed = function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
- };
-
- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ?
- opt.duration : opt.duration in jQuery.fx.speeds ?
- jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
- // Normalize opt.queue - true/undefined/null -> "fx"
- if ( opt.queue == null || opt.queue === true ) {
- opt.queue = "fx";
- }
-
- // Queueing
- opt.old = opt.complete;
-
- opt.complete = function() {
- if ( jQuery.isFunction( opt.old ) ) {
- opt.old.call( this );
- }
-
- if ( opt.queue ) {
- jQuery.dequeue( this, opt.queue );
- }
- };
-
- return opt;
-};
-
-jQuery.fn.extend( {
- fadeTo: function( speed, to, easing, callback ) {
-
- // Show any hidden elements after setting opacity to 0
- return this.filter( isHidden ).css( "opacity", 0 ).show()
-
- // Animate to the value specified
- .end().animate( { opacity: to }, speed, easing, callback );
- },
- animate: function( prop, speed, easing, callback ) {
- var empty = jQuery.isEmptyObject( prop ),
- optall = jQuery.speed( speed, easing, callback ),
- doAnimation = function() {
-
- // Operate on a copy of prop so per-property easing won't be lost
- var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
- // Empty animations, or finishing resolves immediately
- if ( empty || dataPriv.get( this, "finish" ) ) {
- anim.stop( true );
- }
- };
- doAnimation.finish = doAnimation;
-
- return empty || optall.queue === false ?
- this.each( doAnimation ) :
- this.queue( optall.queue, doAnimation );
- },
- stop: function( type, clearQueue, gotoEnd ) {
- var stopQueue = function( hooks ) {
- var stop = hooks.stop;
- delete hooks.stop;
- stop( gotoEnd );
- };
-
- if ( typeof type !== "string" ) {
- gotoEnd = clearQueue;
- clearQueue = type;
- type = undefined;
- }
- if ( clearQueue && type !== false ) {
- this.queue( type || "fx", [] );
- }
-
- return this.each( function() {
- var dequeue = true,
- index = type != null && type + "queueHooks",
- timers = jQuery.timers,
- data = dataPriv.get( this );
-
- if ( index ) {
- if ( data[ index ] && data[ index ].stop ) {
- stopQueue( data[ index ] );
- }
- } else {
- for ( index in data ) {
- if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
- stopQueue( data[ index ] );
- }
- }
- }
-
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this &&
- ( type == null || timers[ index ].queue === type ) ) {
-
- timers[ index ].anim.stop( gotoEnd );
- dequeue = false;
- timers.splice( index, 1 );
- }
- }
-
- // Start the next in the queue if the last step wasn't forced.
- // Timers currently will call their complete callbacks, which
- // will dequeue but only if they were gotoEnd.
- if ( dequeue || !gotoEnd ) {
- jQuery.dequeue( this, type );
- }
- } );
- },
- finish: function( type ) {
- if ( type !== false ) {
- type = type || "fx";
- }
- return this.each( function() {
- var index,
- data = dataPriv.get( this ),
- queue = data[ type + "queue" ],
- hooks = data[ type + "queueHooks" ],
- timers = jQuery.timers,
- length = queue ? queue.length : 0;
-
- // Enable finishing flag on private data
- data.finish = true;
-
- // Empty the queue first
- jQuery.queue( this, type, [] );
-
- if ( hooks && hooks.stop ) {
- hooks.stop.call( this, true );
- }
-
- // Look for any active animations, and finish them
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
- timers[ index ].anim.stop( true );
- timers.splice( index, 1 );
- }
- }
-
- // Look for any animations in the old queue and finish them
- for ( index = 0; index < length; index++ ) {
- if ( queue[ index ] && queue[ index ].finish ) {
- queue[ index ].finish.call( this );
- }
- }
-
- // Turn off finishing flag
- delete data.finish;
- } );
- }
-} );
-
-jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
- var cssFn = jQuery.fn[ name ];
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return speed == null || typeof speed === "boolean" ?
- cssFn.apply( this, arguments ) :
- this.animate( genFx( name, true ), speed, easing, callback );
- };
-} );
-
-// Generate shortcuts for custom animations
-jQuery.each( {
- slideDown: genFx( "show" ),
- slideUp: genFx( "hide" ),
- slideToggle: genFx( "toggle" ),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" },
- fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return this.animate( props, speed, easing, callback );
- };
-} );
-
-jQuery.timers = [];
-jQuery.fx.tick = function() {
- var timer,
- i = 0,
- timers = jQuery.timers;
-
- fxNow = jQuery.now();
-
- for ( ; i < timers.length; i++ ) {
- timer = timers[ i ];
-
- // Checks the timer has not already been removed
- if ( !timer() && timers[ i ] === timer ) {
- timers.splice( i--, 1 );
- }
- }
-
- if ( !timers.length ) {
- jQuery.fx.stop();
- }
- fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
- jQuery.timers.push( timer );
- if ( timer() ) {
- jQuery.fx.start();
- } else {
- jQuery.timers.pop();
- }
-};
-
-jQuery.fx.interval = 13;
-jQuery.fx.start = function() {
- if ( !timerId ) {
- timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
- }
-};
-
-jQuery.fx.stop = function() {
- window.clearInterval( timerId );
-
- timerId = null;
-};
-
-jQuery.fx.speeds = {
- slow: 600,
- fast: 200,
-
- // Default speed
- _default: 400
-};
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/effects/Tween.js b/libs/bower_components/jquery/src/effects/Tween.js
deleted file mode 100644
index d26ddd9189..0000000000
--- a/libs/bower_components/jquery/src/effects/Tween.js
+++ /dev/null
@@ -1,121 +0,0 @@
-define( [
- "../core",
- "../css"
-], function( jQuery ) {
-
-function Tween( elem, options, prop, end, easing ) {
- return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
- constructor: Tween,
- init: function( elem, options, prop, end, easing, unit ) {
- this.elem = elem;
- this.prop = prop;
- this.easing = easing || jQuery.easing._default;
- this.options = options;
- this.start = this.now = this.cur();
- this.end = end;
- this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
- },
- cur: function() {
- var hooks = Tween.propHooks[ this.prop ];
-
- return hooks && hooks.get ?
- hooks.get( this ) :
- Tween.propHooks._default.get( this );
- },
- run: function( percent ) {
- var eased,
- hooks = Tween.propHooks[ this.prop ];
-
- if ( this.options.duration ) {
- this.pos = eased = jQuery.easing[ this.easing ](
- percent, this.options.duration * percent, 0, 1, this.options.duration
- );
- } else {
- this.pos = eased = percent;
- }
- this.now = ( this.end - this.start ) * eased + this.start;
-
- if ( this.options.step ) {
- this.options.step.call( this.elem, this.now, this );
- }
-
- if ( hooks && hooks.set ) {
- hooks.set( this );
- } else {
- Tween.propHooks._default.set( this );
- }
- return this;
- }
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
- _default: {
- get: function( tween ) {
- var result;
-
- // Use a property on the element directly when it is not a DOM element,
- // or when there is no matching style property that exists.
- if ( tween.elem.nodeType !== 1 ||
- tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
- return tween.elem[ tween.prop ];
- }
-
- // Passing an empty string as a 3rd parameter to .css will automatically
- // attempt a parseFloat and fallback to a string if the parse fails.
- // Simple values such as "10px" are parsed to Float;
- // complex values such as "rotate(1rad)" are returned as-is.
- result = jQuery.css( tween.elem, tween.prop, "" );
-
- // Empty strings, null, undefined and "auto" are converted to 0.
- return !result || result === "auto" ? 0 : result;
- },
- set: function( tween ) {
-
- // Use step hook for back compat.
- // Use cssHook if its there.
- // Use .style if available and use plain properties where available.
- if ( jQuery.fx.step[ tween.prop ] ) {
- jQuery.fx.step[ tween.prop ]( tween );
- } else if ( tween.elem.nodeType === 1 &&
- ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
- jQuery.cssHooks[ tween.prop ] ) ) {
- jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
- } else {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
- }
-};
-
-// Support: IE9
-// Panic based approach to setting things on disconnected nodes
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
- set: function( tween ) {
- if ( tween.elem.nodeType && tween.elem.parentNode ) {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
-};
-
-jQuery.easing = {
- linear: function( p ) {
- return p;
- },
- swing: function( p ) {
- return 0.5 - Math.cos( p * Math.PI ) / 2;
- },
- _default: "swing"
-};
-
-jQuery.fx = Tween.prototype.init;
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-} );
diff --git a/libs/bower_components/jquery/src/effects/animatedSelector.js b/libs/bower_components/jquery/src/effects/animatedSelector.js
deleted file mode 100644
index d84c9c7032..0000000000
--- a/libs/bower_components/jquery/src/effects/animatedSelector.js
+++ /dev/null
@@ -1,13 +0,0 @@
-define( [
- "../core",
- "../selector",
- "../effects"
-], function( jQuery ) {
-
-jQuery.expr.filters.animated = function( elem ) {
- return jQuery.grep( jQuery.timers, function( fn ) {
- return elem === fn.elem;
- } ).length;
-};
-
-} );
diff --git a/libs/bower_components/jquery/src/effects/support.js b/libs/bower_components/jquery/src/effects/support.js
deleted file mode 100644
index 22d4ecb2e9..0000000000
--- a/libs/bower_components/jquery/src/effects/support.js
+++ /dev/null
@@ -1,58 +0,0 @@
-define( [
- "../var/support",
- "../var/document"
-], function( support, document ) {
-
-( function() {
- var shrinkWrapBlocksVal;
-
- support.shrinkWrapBlocks = function() {
- if ( shrinkWrapBlocksVal != null ) {
- return shrinkWrapBlocksVal;
- }
-
- // Will be changed later if needed.
- shrinkWrapBlocksVal = false;
-
- // Minified: var b,c,d
- var div, body, container;
-
- body = document.getElementsByTagName( "body" )[ 0 ];
- if ( !body || !body.style ) {
-
- // Test fired too early or in an unsupported environment, exit.
- return;
- }
-
- // Setup
- div = document.createElement( "div" );
- container = document.createElement( "div" );
- container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
- body.appendChild( container ).appendChild( div );
-
- // Support: IE6
- // Check if elements with layout shrink-wrap their children
- if ( typeof div.style.zoom !== "undefined" ) {
-
- // Reset CSS: box-sizing; display; margin; border
- div.style.cssText =
-
- // Support: Firefox<29, Android 2.3
- // Vendor-prefix box-sizing
- "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
- "box-sizing:content-box;display:block;margin:0;border:0;" +
- "padding:1px;width:1px;zoom:1";
- div.appendChild( document.createElement( "div" ) ).style.width = "5px";
- shrinkWrapBlocksVal = div.offsetWidth !== 3;
- }
-
- body.removeChild( container );
-
- return shrinkWrapBlocksVal;
- };
-
-} )();
-
-return support;
-
-} );
diff --git a/libs/bower_components/jquery/src/event.js b/libs/bower_components/jquery/src/event.js
deleted file mode 100644
index 6d60b4c115..0000000000
--- a/libs/bower_components/jquery/src/event.js
+++ /dev/null
@@ -1,710 +0,0 @@
-define( [
- "./core",
- "./var/document",
- "./var/rnotwhite",
- "./var/slice",
- "./data/var/dataPriv",
-
- "./core/init",
- "./selector"
-], function( jQuery, document, rnotwhite, slice, dataPriv ) {
-
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
- return true;
-}
-
-function returnFalse() {
- return false;
-}
-
-// Support: IE9
-// See #13393 for more info
-function safeActiveElement() {
- try {
- return document.activeElement;
- } catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
- var origFn, type;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
-
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) {
-
- // ( types-Object, data )
- data = data || selector;
- selector = undefined;
- }
- for ( type in types ) {
- on( elem, type, selector, data, types[ type ], one );
- }
- return elem;
- }
-
- if ( data == null && fn == null ) {
-
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
-
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
-
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return elem;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
-
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
-
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return elem.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- } );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
- global: {},
-
- add: function( elem, types, handler, data, selector ) {
-
- var handleObjIn, eventHandle, tmp,
- events, t, handleObj,
- special, handlers, type, namespaces, origType,
- elemData = dataPriv.get( elem );
-
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
- if ( !elemData ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- selector = handleObjIn.selector;
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- if ( !( events = elemData.events ) ) {
- events = elemData.events = {};
- }
- if ( !( eventHandle = elemData.handle ) ) {
- eventHandle = elemData.handle = function( e ) {
-
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
- jQuery.event.dispatch.apply( elem, arguments ) : undefined;
- };
- }
-
- // Handle multiple events separated by a space
- types = ( types || "" ).match( rnotwhite ) || [ "" ];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
- // There *must* be a type, no attaching namespace-only handlers
- if ( !type ) {
- continue;
- }
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend( {
- type: type,
- origType: origType,
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
- namespace: namespaces.join( "." )
- }, handleObjIn );
-
- // Init the event handler queue if we're the first
- if ( !( handlers = events[ type ] ) ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener if the special events handler returns false
- if ( !special.setup ||
- special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- },
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector, mappedTypes ) {
-
- var j, origCount, tmp,
- events, t, handleObj,
- special, handlers, type, namespaces, origType,
- elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
- if ( !elemData || !( events = elemData.events ) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = ( types || "" ).match( rnotwhite ) || [ "" ];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- for ( type in events ) {
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
- }
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector ? special.delegateType : special.bindType ) || type;
- handlers = events[ type ] || [];
- tmp = tmp[ 2 ] &&
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
- // Remove matching events
- origCount = j = handlers.length;
- while ( j-- ) {
- handleObj = handlers[ j ];
-
- if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !tmp || tmp.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector ||
- selector === "**" && handleObj.selector ) ) {
- handlers.splice( j, 1 );
-
- if ( handleObj.selector ) {
- handlers.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( origCount && !handlers.length ) {
- if ( !special.teardown ||
- special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove data and the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- dataPriv.remove( elem, "handle events" );
- }
- },
-
- dispatch: function( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event );
-
- var i, j, ret, matched, handleObj,
- handlerQueue = [],
- args = slice.call( arguments ),
- handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
- special = jQuery.event.special[ event.type ] || {};
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[ 0 ] = event;
- event.delegateTarget = this;
-
- // Call the preDispatch hook for the mapped type, and let it bail if desired
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
- return;
- }
-
- // Determine handlers
- handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
- // Run delegates first; they may want to stop propagation beneath us
- i = 0;
- while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
- event.currentTarget = matched.elem;
-
- j = 0;
- while ( ( handleObj = matched.handlers[ j++ ] ) &&
- !event.isImmediatePropagationStopped() ) {
-
- // Triggered event must either 1) have no namespace, or 2) have namespace(s)
- // a subset or equal to those in the bound event (both can have no namespace).
- if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
-
- event.handleObj = handleObj;
- event.data = handleObj.data;
-
- ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
- handleObj.handler ).apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- if ( ( event.result = ret ) === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
- }
-
- return event.result;
- },
-
- handlers: function( event, handlers ) {
- var i, matches, sel, handleObj,
- handlerQueue = [],
- delegateCount = handlers.delegateCount,
- cur = event.target;
-
- // Support (at least): Chrome, IE9
- // Find delegate handlers
- // Black-hole SVG <use> instance trees (#13180)
- //
- // Support: Firefox<=42+
- // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
- if ( delegateCount && cur.nodeType &&
- ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
-
- for ( ; cur !== this; cur = cur.parentNode || this ) {
-
- // Don't check non-elements (#13208)
- // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
- if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
- matches = [];
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
-
- // Don't conflict with Object.prototype properties (#13203)
- sel = handleObj.selector + " ";
-
- if ( matches[ sel ] === undefined ) {
- matches[ sel ] = handleObj.needsContext ?
- jQuery( sel, this ).index( cur ) > -1 :
- jQuery.find( sel, this, null, [ cur ] ).length;
- }
- if ( matches[ sel ] ) {
- matches.push( handleObj );
- }
- }
- if ( matches.length ) {
- handlerQueue.push( { elem: cur, handlers: matches } );
- }
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- if ( delegateCount < handlers.length ) {
- handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
- }
-
- return handlerQueue;
- },
-
- // Includes some event props shared by KeyEvent and MouseEvent
- props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
- "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
-
- fixHooks: {},
-
- keyHooks: {
- props: "char charCode key keyCode".split( " " ),
- filter: function( event, original ) {
-
- // Add which for key events
- if ( event.which == null ) {
- event.which = original.charCode != null ? original.charCode : original.keyCode;
- }
-
- return event;
- }
- },
-
- mouseHooks: {
- props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " +
- "screenX screenY toElement" ).split( " " ),
- filter: function( event, original ) {
- var eventDoc, doc, body,
- button = original.button;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && original.clientX != null ) {
- eventDoc = event.target.ownerDocument || document;
- doc = eventDoc.documentElement;
- body = eventDoc.body;
-
- event.pageX = original.clientX +
- ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
- ( doc && doc.clientLeft || body && body.clientLeft || 0 );
- event.pageY = original.clientY +
- ( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
- ( doc && doc.clientTop || body && body.clientTop || 0 );
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && button !== undefined ) {
- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
- }
-
- return event;
- }
- },
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop, copy,
- type = event.type,
- originalEvent = event,
- fixHook = this.fixHooks[ type ];
-
- if ( !fixHook ) {
- this.fixHooks[ type ] = fixHook =
- rmouseEvent.test( type ) ? this.mouseHooks :
- rkeyEvent.test( type ) ? this.keyHooks :
- {};
- }
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = new jQuery.Event( originalEvent );
-
- i = copy.length;
- while ( i-- ) {
- prop = copy[ i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Support: Cordova 2.5 (WebKit) (#13255)
- // All events should have a target; Cordova deviceready doesn't
- if ( !event.target ) {
- event.target = document;
- }
-
- // Support: Safari 6.0+, Chrome<28
- // Target should not be a text node (#504, #13143)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
- },
-
- special: {
- load: {
-
- // Prevent triggered image.load events from bubbling to window.load
- noBubble: true
- },
- focus: {
-
- // Fire native event if possible so blur/focus sequence is correct
- trigger: function() {
- if ( this !== safeActiveElement() && this.focus ) {
- this.focus();
- return false;
- }
- },
- delegateType: "focusin"
- },
- blur: {
- trigger: function() {
- if ( this === safeActiveElement() && this.blur ) {
- this.blur();
- return false;
- }
- },
- delegateType: "focusout"
- },
- click: {
-
- // For checkbox, fire native event so checked state will be right
- trigger: function() {
- if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
- this.click();
- return false;
- }
- },
-
- // For cross-browser consistency, don't fire native .click() on links
- _default: function( event ) {
- return jQuery.nodeName( event.target, "a" );
- }
- },
-
- beforeunload: {
- postDispatch: function( event ) {
-
- // Support: Firefox 20+
- // Firefox doesn't alert if the returnValue field is not set.
- if ( event.result !== undefined && event.originalEvent ) {
- event.originalEvent.returnValue = event.result;
- }
- }
- }
- }
-};
-
-jQuery.removeEvent = function( elem, type, handle ) {
-
- // This "if" is needed for plain objects
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle );
- }
-};
-
-jQuery.Event = function( src, props ) {
-
- // Allow instantiation without the 'new' keyword
- if ( !( this instanceof jQuery.Event ) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = src.defaultPrevented ||
- src.defaultPrevented === undefined &&
-
- // Support: Android<4.0
- src.returnValue === false ?
- returnTrue :
- returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- constructor: jQuery.Event,
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse,
-
- preventDefault: function() {
- var e = this.originalEvent;
-
- this.isDefaultPrevented = returnTrue;
-
- if ( e ) {
- e.preventDefault();
- }
- },
- stopPropagation: function() {
- var e = this.originalEvent;
-
- this.isPropagationStopped = returnTrue;
-
- if ( e ) {
- e.stopPropagation();
- }
- },
- stopImmediatePropagation: function() {
- var e = this.originalEvent;
-
- this.isImmediatePropagationStopped = returnTrue;
-
- if ( e ) {
- e.stopImmediatePropagation();
- }
-
- this.stopPropagation();
- }
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://code.google.com/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
- mouseenter: "mouseover",
- mouseleave: "mouseout",
- pointerenter: "pointerover",
- pointerleave: "pointerout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var ret,
- target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj;
-
- // For mouseenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
-} );
-
-jQuery.fn.extend( {
- on: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn );
- },
- one: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- var handleObj, type;
- if ( types && types.preventDefault && types.handleObj ) {
-
- // ( event ) dispatched jQuery.Event
- handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace ?
- handleObj.origType + "." + handleObj.namespace :
- handleObj.origType,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
-
- // ( types-object [, selector] )
- for ( type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
-
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each( function() {
- jQuery.event.remove( this, types, fn, selector );
- } );
- }
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/event/ajax.js b/libs/bower_components/jquery/src/event/ajax.js
deleted file mode 100644
index 98e194bf03..0000000000
--- a/libs/bower_components/jquery/src/event/ajax.js
+++ /dev/null
@@ -1,20 +0,0 @@
-define( [
- "../core",
- "../event"
-], function( jQuery ) {
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [
- "ajaxStart",
- "ajaxStop",
- "ajaxComplete",
- "ajaxError",
- "ajaxSuccess",
- "ajaxSend"
-], function( i, type ) {
- jQuery.fn[ type ] = function( fn ) {
- return this.on( type, fn );
- };
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/event/alias.js b/libs/bower_components/jquery/src/event/alias.js
deleted file mode 100644
index 161c8935ef..0000000000
--- a/libs/bower_components/jquery/src/event/alias.js
+++ /dev/null
@@ -1,27 +0,0 @@
-define( [
- "../core",
-
- "../event",
- "./trigger"
-], function( jQuery ) {
-
-jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu" ).split( " " ),
- function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
-} );
-
-jQuery.fn.extend( {
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/event/focusin.js b/libs/bower_components/jquery/src/event/focusin.js
deleted file mode 100644
index ae7f831a86..0000000000
--- a/libs/bower_components/jquery/src/event/focusin.js
+++ /dev/null
@@ -1,53 +0,0 @@
-define( [
- "../core",
- "../data/var/dataPriv",
- "./support",
-
- "../event",
- "./trigger"
-], function( jQuery, dataPriv, support ) {
-
-// Support: Firefox
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome, Safari
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler on the document while someone wants focusin/focusout
- var handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- var doc = this.ownerDocument || this,
- attaches = dataPriv.access( doc, fix );
-
- if ( !attaches ) {
- doc.addEventListener( orig, handler, true );
- }
- dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
- },
- teardown: function() {
- var doc = this.ownerDocument || this,
- attaches = dataPriv.access( doc, fix ) - 1;
-
- if ( !attaches ) {
- doc.removeEventListener( orig, handler, true );
- dataPriv.remove( doc, fix );
-
- } else {
- dataPriv.access( doc, fix, attaches );
- }
- }
- };
- } );
-}
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/event/support.js b/libs/bower_components/jquery/src/event/support.js
deleted file mode 100644
index 1c4d416e5a..0000000000
--- a/libs/bower_components/jquery/src/event/support.js
+++ /dev/null
@@ -1,9 +0,0 @@
-define( [
- "../var/support"
-], function( support ) {
-
-support.focusin = "onfocusin" in window;
-
-return support;
-
-} );
diff --git a/libs/bower_components/jquery/src/event/trigger.js b/libs/bower_components/jquery/src/event/trigger.js
deleted file mode 100644
index a6fac70ea9..0000000000
--- a/libs/bower_components/jquery/src/event/trigger.js
+++ /dev/null
@@ -1,199 +0,0 @@
-define( [
- "../core",
- "../var/document",
- "../data/var/dataPriv",
- "../data/var/acceptData",
- "../var/hasOwn",
-
- "../event"
-], function( jQuery, document, dataPriv, acceptData, hasOwn ) {
-
-var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
-
-jQuery.extend( jQuery.event, {
-
- trigger: function( event, data, elem, onlyHandlers ) {
-
- var i, cur, tmp, bubbleType, ontype, handle, special,
- eventPath = [ elem || document ],
- type = hasOwn.call( event, "type" ) ? event.type : event,
- namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
- cur = tmp = elem = elem || document;
-
- // Don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
- return;
- }
-
- if ( type.indexOf( "." ) > -1 ) {
-
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split( "." );
- type = namespaces.shift();
- namespaces.sort();
- }
- ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
- // Caller can pass in a jQuery.Event object, Object, or just an event type string
- event = event[ jQuery.expando ] ?
- event :
- new jQuery.Event( type, typeof event === "object" && event );
-
- // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
- event.isTrigger = onlyHandlers ? 2 : 3;
- event.namespace = namespaces.join( "." );
- event.rnamespace = event.namespace ?
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
- null;
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data == null ?
- [ event ] :
- jQuery.makeArray( data, [ event ] );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- if ( !rfocusMorph.test( bubbleType + type ) ) {
- cur = cur.parentNode;
- }
- for ( ; cur; cur = cur.parentNode ) {
- eventPath.push( cur );
- tmp = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( tmp === ( elem.ownerDocument || document ) ) {
- eventPath.push( tmp.defaultView || tmp.parentWindow || window );
- }
- }
-
- // Fire handlers on the event path
- i = 0;
- while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
-
- event.type = i > 1 ?
- bubbleType :
- special.bindType || type;
-
- // jQuery handler
- handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
- dataPriv.get( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
-
- // Native handler
- handle = ontype && cur[ ontype ];
- if ( handle && handle.apply && acceptData( cur ) ) {
- event.result = handle.apply( cur, data );
- if ( event.result === false ) {
- event.preventDefault();
- }
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if ( ( !special._default ||
- special._default.apply( eventPath.pop(), data ) === false ) &&
- acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Don't do default actions on window, that's where global variables be (#6170)
- if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- tmp = elem[ ontype ];
-
- if ( tmp ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- elem[ type ]();
- jQuery.event.triggered = undefined;
-
- if ( tmp ) {
- elem[ ontype ] = tmp;
- }
- }
- }
- }
-
- return event.result;
- },
-
- // Piggyback on a donor event to simulate a different one
- simulate: function( type, elem, event ) {
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- {
- type: type,
- isSimulated: true
-
- // Previously, `originalEvent: {}` was set here, so stopPropagation call
- // would not be triggered on donor event, since in our own
- // jQuery.event.stopPropagation function we had a check for existence of
- // originalEvent.stopPropagation method, so, consequently it would be a noop.
- //
- // But now, this "simulate" function is used only for events
- // for which stopPropagation() is noop, so there is no need for that anymore.
- //
- // For the 1.x branch though, guard for "click" and "submit"
- // events is still used, but was moved to jQuery.event.stopPropagation function
- // because `originalEvent` should point to the original event for the constancy
- // with other events and for more focused logic
- }
- );
-
- jQuery.event.trigger( e, null, elem );
-
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
- }
-
-} );
-
-jQuery.fn.extend( {
-
- trigger: function( type, data ) {
- return this.each( function() {
- jQuery.event.trigger( type, data, this );
- } );
- },
- triggerHandler: function( type, data ) {
- var elem = this[ 0 ];
- if ( elem ) {
- return jQuery.event.trigger( type, data, elem, true );
- }
- }
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/exports/amd.js b/libs/bower_components/jquery/src/exports/amd.js
deleted file mode 100644
index add6eb9bde..0000000000
--- a/libs/bower_components/jquery/src/exports/amd.js
+++ /dev/null
@@ -1,24 +0,0 @@
-define( [
- "../core"
-], function( jQuery ) {
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
- define( "jquery", [], function() {
- return jQuery;
- } );
-}
-
-} );
diff --git a/libs/bower_components/jquery/src/exports/global.js b/libs/bower_components/jquery/src/exports/global.js
deleted file mode 100644
index be9cbfb3ab..0000000000
--- a/libs/bower_components/jquery/src/exports/global.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$;
-
-jQuery.noConflict = function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in AMD
-// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
- window.jQuery = window.$ = jQuery;
-}
diff --git a/libs/bower_components/jquery/src/intro.js b/libs/bower_components/jquery/src/intro.js
deleted file mode 100644
index aab47c2d98..0000000000
--- a/libs/bower_components/jquery/src/intro.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/*!
- * jQuery JavaScript Library v@VERSION
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: @DATE
- */
-
-(function( global, factory ) {
-
- if ( typeof module === "object" && typeof module.exports === "object" ) {
- // For CommonJS and CommonJS-like environments where a proper `window`
- // is present, execute the factory and get jQuery.
- // For environments that do not have a `window` with a `document`
- // (such as Node.js), expose a factory as module.exports.
- // This accentuates the need for the creation of a real `window`.
- // e.g. var jQuery = require("jquery")(window);
- // See ticket #14549 for more info.
- module.exports = global.document ?
- factory( global, true ) :
- function( w ) {
- if ( !w.document ) {
- throw new Error( "jQuery requires a window with a document" );
- }
- return factory( w );
- };
- } else {
- factory( global );
- }
-
-// Pass this if window is not defined yet
-}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Support: Firefox 18+
-// Can't be in strict mode, several libs including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-//"use strict";
diff --git a/libs/bower_components/jquery/src/jquery.js b/libs/bower_components/jquery/src/jquery.js
deleted file mode 100644
index 2faa9c3cda..0000000000
--- a/libs/bower_components/jquery/src/jquery.js
+++ /dev/null
@@ -1,37 +0,0 @@
-define( [
- "./core",
- "./selector",
- "./traversing",
- "./callbacks",
- "./deferred",
- "./core/ready",
- "./data",
- "./queue",
- "./queue/delay",
- "./attributes",
- "./event",
- "./event/alias",
- "./event/focusin",
- "./manipulation",
- "./manipulation/_evalUrl",
- "./wrap",
- "./css",
- "./css/hiddenVisibleSelectors",
- "./serialize",
- "./ajax",
- "./ajax/xhr",
- "./ajax/script",
- "./ajax/jsonp",
- "./ajax/load",
- "./event/ajax",
- "./effects",
- "./effects/animatedSelector",
- "./offset",
- "./dimensions",
- "./deprecated",
- "./exports/amd"
-], function( jQuery ) {
-
-return ( window.jQuery = window.$ = jQuery );
-
-} );
diff --git a/libs/bower_components/jquery/src/manipulation.js b/libs/bower_components/jquery/src/manipulation.js
deleted file mode 100644
index afd5091dda..0000000000
--- a/libs/bower_components/jquery/src/manipulation.js
+++ /dev/null
@@ -1,481 +0,0 @@
-define( [
- "./core",
- "./var/concat",
- "./var/push",
- "./core/access",
- "./manipulation/var/rcheckableType",
- "./manipulation/var/rtagName",
- "./manipulation/var/rscriptType",
- "./manipulation/wrapMap",
- "./manipulation/getAll",
- "./manipulation/setGlobalEval",
- "./manipulation/buildFragment",
- "./manipulation/support",
-
- "./data/var/dataPriv",
- "./data/var/dataUser",
- "./data/var/acceptData",
-
- "./core/init",
- "./traversing",
- "./selector",
- "./event"
-], function( jQuery, concat, push, access,
- rcheckableType, rtagName, rscriptType,
- wrapMap, getAll, setGlobalEval, buildFragment, support,
- dataPriv, dataUser, acceptData ) {
-
-var
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
-
- // Support: IE 10-11, Edge 10240+
- // In IE/Edge using regex groups here causes severe slowdowns.
- // See https://connect.microsoft.com/IE/feedback/details/1736512/
- rnoInnerhtml = /<script|<style|<link/i,
-
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptTypeMasked = /^true\/(.*)/,
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-// Manipulating tables requires a tbody
-function manipulationTarget( elem, content ) {
- return jQuery.nodeName( elem, "table" ) &&
- jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
-
- elem.getElementsByTagName( "tbody" )[ 0 ] ||
- elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
- elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
- elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
- return elem;
-}
-function restoreScript( elem ) {
- var match = rscriptTypeMasked.exec( elem.type );
-
- if ( match ) {
- elem.type = match[ 1 ];
- } else {
- elem.removeAttribute( "type" );
- }
-
- return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
- var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
-
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- // 1. Copy private data: events, handlers, etc.
- if ( dataPriv.hasData( src ) ) {
- pdataOld = dataPriv.access( src );
- pdataCur = dataPriv.set( dest, pdataOld );
- events = pdataOld.events;
-
- if ( events ) {
- delete pdataCur.handle;
- pdataCur.events = {};
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
- }
-
- // 2. Copy user data
- if ( dataUser.hasData( src ) ) {
- udataOld = dataUser.access( src );
- udataCur = jQuery.extend( {}, udataOld );
-
- dataUser.set( dest, udataCur );
- }
-}
-
-// Fix IE bugs, see support tests
-function fixInput( src, dest ) {
- var nodeName = dest.nodeName.toLowerCase();
-
- // Fails to persist the checked state of a cloned checkbox or radio button.
- if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
- dest.checked = src.checked;
-
- // Fails to return the selected option to the default selected state when cloning options
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
- }
-}
-
-function domManip( collection, args, callback, ignored ) {
-
- // Flatten any nested arrays
- args = concat.apply( [], args );
-
- var fragment, first, scripts, hasScripts, node, doc,
- i = 0,
- l = collection.length,
- iNoClone = l - 1,
- value = args[ 0 ],
- isFunction = jQuery.isFunction( value );
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( isFunction ||
- ( l > 1 && typeof value === "string" &&
- !support.checkClone && rchecked.test( value ) ) ) {
- return collection.each( function( index ) {
- var self = collection.eq( index );
- if ( isFunction ) {
- args[ 0 ] = value.call( this, index, self.html() );
- }
- domManip( self, args, callback, ignored );
- } );
- }
-
- if ( l ) {
- fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
- first = fragment.firstChild;
-
- if ( fragment.childNodes.length === 1 ) {
- fragment = first;
- }
-
- // Require either new content or an interest in ignored elements to invoke the callback
- if ( first || ignored ) {
- scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
- hasScripts = scripts.length;
-
- // Use the original fragment for the last item
- // instead of the first because it can end up
- // being emptied incorrectly in certain situations (#8070).
- for ( ; i < l; i++ ) {
- node = fragment;
-
- if ( i !== iNoClone ) {
- node = jQuery.clone( node, true, true );
-
- // Keep references to cloned scripts for later restoration
- if ( hasScripts ) {
-
- // Support: Android<4.1, PhantomJS<2
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( scripts, getAll( node, "script" ) );
- }
- }
-
- callback.call( collection[ i ], node, i );
- }
-
- if ( hasScripts ) {
- doc = scripts[ scripts.length - 1 ].ownerDocument;
-
- // Reenable scripts
- jQuery.map( scripts, restoreScript );
-
- // Evaluate executable scripts on first document insertion
- for ( i = 0; i < hasScripts; i++ ) {
- node = scripts[ i ];
- if ( rscriptType.test( node.type || "" ) &&
- !dataPriv.access( node, "globalEval" ) &&
- jQuery.contains( doc, node ) ) {
-
- if ( node.src ) {
-
- // Optional AJAX dependency, but won't run scripts if not present
- if ( jQuery._evalUrl ) {
- jQuery._evalUrl( node.src );
- }
- } else {
- jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
- }
- }
- }
- }
- }
- }
-
- return collection;
-}
-
-function remove( elem, selector, keepData ) {
- var node,
- nodes = selector ? jQuery.filter( selector, elem ) : elem,
- i = 0;
-
- for ( ; ( node = nodes[ i ] ) != null; i++ ) {
- if ( !keepData && node.nodeType === 1 ) {
- jQuery.cleanData( getAll( node ) );
- }
-
- if ( node.parentNode ) {
- if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
- setGlobalEval( getAll( node, "script" ) );
- }
- node.parentNode.removeChild( node );
- }
- }
-
- return elem;
-}
-
-jQuery.extend( {
- htmlPrefilter: function( html ) {
- return html.replace( rxhtmlTag, "<$1></$2>" );
- },
-
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var i, l, srcElements, destElements,
- clone = elem.cloneNode( true ),
- inPage = jQuery.contains( elem.ownerDocument, elem );
-
- // Fix IE cloning issues
- if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
- !jQuery.isXMLDoc( elem ) ) {
-
- // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
- destElements = getAll( clone );
- srcElements = getAll( elem );
-
- for ( i = 0, l = srcElements.length; i < l; i++ ) {
- fixInput( srcElements[ i ], destElements[ i ] );
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- if ( deepDataAndEvents ) {
- srcElements = srcElements || getAll( elem );
- destElements = destElements || getAll( clone );
-
- for ( i = 0, l = srcElements.length; i < l; i++ ) {
- cloneCopyEvent( srcElements[ i ], destElements[ i ] );
- }
- } else {
- cloneCopyEvent( elem, clone );
- }
- }
-
- // Preserve script evaluation history
- destElements = getAll( clone, "script" );
- if ( destElements.length > 0 ) {
- setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
- }
-
- // Return the cloned set
- return clone;
- },
-
- cleanData: function( elems ) {
- var data, elem, type,
- special = jQuery.event.special,
- i = 0;
-
- for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
- if ( acceptData( elem ) ) {
- if ( ( data = elem[ dataPriv.expando ] ) ) {
- if ( data.events ) {
- for ( type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
-
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
- }
-
- // Support: Chrome <= 35-45+
- // Assign undefined instead of using delete, see Data#remove
- elem[ dataPriv.expando ] = undefined;
- }
- if ( elem[ dataUser.expando ] ) {
-
- // Support: Chrome <= 35-45+
- // Assign undefined instead of using delete, see Data#remove
- elem[ dataUser.expando ] = undefined;
- }
- }
- }
- }
-} );
-
-jQuery.fn.extend( {
-
- // Keep domManip exposed until 3.0 (gh-2225)
- domManip: domManip,
-
- detach: function( selector ) {
- return remove( this, selector, true );
- },
-
- remove: function( selector ) {
- return remove( this, selector );
- },
-
- text: function( value ) {
- return access( this, function( value ) {
- return value === undefined ?
- jQuery.text( this ) :
- this.empty().each( function() {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- this.textContent = value;
- }
- } );
- }, null, value, arguments.length );
- },
-
- append: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.appendChild( elem );
- }
- } );
- },
-
- prepend: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.insertBefore( elem, target.firstChild );
- }
- } );
- },
-
- before: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this );
- }
- } );
- },
-
- after: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- }
- } );
- },
-
- empty: function() {
- var elem,
- i = 0;
-
- for ( ; ( elem = this[ i ] ) != null; i++ ) {
- if ( elem.nodeType === 1 ) {
-
- // Prevent memory leaks
- jQuery.cleanData( getAll( elem, false ) );
-
- // Remove any remaining nodes
- elem.textContent = "";
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function() {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- } );
- },
-
- html: function( value ) {
- return access( this, function( value ) {
- var elem = this[ 0 ] || {},
- i = 0,
- l = this.length;
-
- if ( value === undefined && elem.nodeType === 1 ) {
- return elem.innerHTML;
- }
-
- // See if we can take a shortcut and just use innerHTML
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
- value = jQuery.htmlPrefilter( value );
-
- try {
- for ( ; i < l; i++ ) {
- elem = this[ i ] || {};
-
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( getAll( elem, false ) );
- elem.innerHTML = value;
- }
- }
-
- elem = 0;
-
- // If using innerHTML throws an exception, use the fallback method
- } catch ( e ) {}
- }
-
- if ( elem ) {
- this.empty().append( value );
- }
- }, null, value, arguments.length );
- },
-
- replaceWith: function() {
- var ignored = [];
-
- // Make the changes, replacing each non-ignored context element with the new content
- return domManip( this, arguments, function( elem ) {
- var parent = this.parentNode;
-
- if ( jQuery.inArray( this, ignored ) < 0 ) {
- jQuery.cleanData( getAll( this ) );
- if ( parent ) {
- parent.replaceChild( elem, this );
- }
- }
-
- // Force callback invocation
- }, ignored );
- }
-} );
-
-jQuery.each( {
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var elems,
- ret = [],
- insert = jQuery( selector ),
- last = insert.length - 1,
- i = 0;
-
- for ( ; i <= last; i++ ) {
- elems = i === last ? this : this.clone( true );
- jQuery( insert[ i ] )[ original ]( elems );
-
- // Support: QtWebKit
- // .get() because push.apply(_, arraylike) throws
- push.apply( ret, elems.get() );
- }
-
- return this.pushStack( ret );
- };
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/_evalUrl.js b/libs/bower_components/jquery/src/manipulation/_evalUrl.js
deleted file mode 100644
index 85ca2c62a4..0000000000
--- a/libs/bower_components/jquery/src/manipulation/_evalUrl.js
+++ /dev/null
@@ -1,20 +0,0 @@
-define( [
- "../ajax"
-], function( jQuery ) {
-
-jQuery._evalUrl = function( url ) {
- return jQuery.ajax( {
- url: url,
-
- // Make this explicit, since user can override this through ajaxSetup (#11264)
- type: "GET",
- dataType: "script",
- async: false,
- global: false,
- "throws": true
- } );
-};
-
-return jQuery._evalUrl;
-
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/buildFragment.js b/libs/bower_components/jquery/src/manipulation/buildFragment.js
deleted file mode 100644
index cfdd1c0e67..0000000000
--- a/libs/bower_components/jquery/src/manipulation/buildFragment.js
+++ /dev/null
@@ -1,102 +0,0 @@
-define( [
- "../core",
- "./var/rtagName",
- "./var/rscriptType",
- "./wrapMap",
- "./getAll",
- "./setGlobalEval"
-], function( jQuery, rtagName, rscriptType, wrapMap, getAll, setGlobalEval ) {
-
-var rhtml = /<|&#?\w+;/;
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
- var elem, tmp, tag, wrap, contains, j,
- fragment = context.createDocumentFragment(),
- nodes = [],
- i = 0,
- l = elems.length;
-
- for ( ; i < l; i++ ) {
- elem = elems[ i ];
-
- if ( elem || elem === 0 ) {
-
- // Add nodes directly
- if ( jQuery.type( elem ) === "object" ) {
-
- // Support: Android<4.1, PhantomJS<2
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
- // Convert non-html into a text node
- } else if ( !rhtml.test( elem ) ) {
- nodes.push( context.createTextNode( elem ) );
-
- // Convert html into DOM nodes
- } else {
- tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
-
- // Deserialize a standard representation
- tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
- wrap = wrapMap[ tag ] || wrapMap._default;
- tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
- // Descend through wrappers to the right content
- j = wrap[ 0 ];
- while ( j-- ) {
- tmp = tmp.lastChild;
- }
-
- // Support: Android<4.1, PhantomJS<2
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( nodes, tmp.childNodes );
-
- // Remember the top-level container
- tmp = fragment.firstChild;
-
- // Ensure the created nodes are orphaned (#12392)
- tmp.textContent = "";
- }
- }
- }
-
- // Remove wrapper from fragment
- fragment.textContent = "";
-
- i = 0;
- while ( ( elem = nodes[ i++ ] ) ) {
-
- // Skip elements already in the context collection (trac-4087)
- if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
- if ( ignored ) {
- ignored.push( elem );
- }
- continue;
- }
-
- contains = jQuery.contains( elem.ownerDocument, elem );
-
- // Append to fragment
- tmp = getAll( fragment.appendChild( elem ), "script" );
-
- // Preserve script evaluation history
- if ( contains ) {
- setGlobalEval( tmp );
- }
-
- // Capture executables
- if ( scripts ) {
- j = 0;
- while ( ( elem = tmp[ j++ ] ) ) {
- if ( rscriptType.test( elem.type || "" ) ) {
- scripts.push( elem );
- }
- }
- }
- }
-
- return fragment;
-}
-
-return buildFragment;
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/createSafeFragment.js b/libs/bower_components/jquery/src/manipulation/createSafeFragment.js
deleted file mode 100644
index 5b766d4358..0000000000
--- a/libs/bower_components/jquery/src/manipulation/createSafeFragment.js
+++ /dev/null
@@ -1,20 +0,0 @@
-define( [
- "./var/nodeNames"
-], function( nodeNames ) {
-
-function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
-}
-
-return createSafeFragment;
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/getAll.js b/libs/bower_components/jquery/src/manipulation/getAll.js
deleted file mode 100644
index cc913f29ee..0000000000
--- a/libs/bower_components/jquery/src/manipulation/getAll.js
+++ /dev/null
@@ -1,21 +0,0 @@
-define( [
- "../core"
-], function( jQuery ) {
-
-function getAll( context, tag ) {
-
- // Support: IE9-11+
- // Use typeof to avoid zero-argument method invocation on host objects (#15151)
- var ret = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( tag || "*" ) :
- typeof context.querySelectorAll !== "undefined" ?
- context.querySelectorAll( tag || "*" ) :
- [];
-
- return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
- jQuery.merge( [ context ], ret ) :
- ret;
-}
-
-return getAll;
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/setGlobalEval.js b/libs/bower_components/jquery/src/manipulation/setGlobalEval.js
deleted file mode 100644
index 8ca69a03ad..0000000000
--- a/libs/bower_components/jquery/src/manipulation/setGlobalEval.js
+++ /dev/null
@@ -1,20 +0,0 @@
-define( [
- "../data/var/dataPriv"
-], function( dataPriv ) {
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
- var i = 0,
- l = elems.length;
-
- for ( ; i < l; i++ ) {
- dataPriv.set(
- elems[ i ],
- "globalEval",
- !refElements || dataPriv.get( refElements[ i ], "globalEval" )
- );
- }
-}
-
-return setGlobalEval;
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/support.js b/libs/bower_components/jquery/src/manipulation/support.js
deleted file mode 100644
index cd4081ebb2..0000000000
--- a/libs/bower_components/jquery/src/manipulation/support.js
+++ /dev/null
@@ -1,33 +0,0 @@
-define( [
- "../var/document",
- "../var/support"
-], function( document, support ) {
-
-( function() {
- var fragment = document.createDocumentFragment(),
- div = fragment.appendChild( document.createElement( "div" ) ),
- input = document.createElement( "input" );
-
- // Support: Android 4.0-4.3, Safari<=5.1
- // Check state lost if the name is set (#11217)
- // Support: Windows Web Apps (WWA)
- // `name` and `type` must use .setAttribute for WWA (#14901)
- input.setAttribute( "type", "radio" );
- input.setAttribute( "checked", "checked" );
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
-
- // Support: Safari<=5.1, Android<4.2
- // Older WebKit doesn't clone checked state correctly in fragments
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Support: IE<=11+
- // Make sure textarea (and checkbox) defaultValue is properly cloned
- div.innerHTML = "<textarea>x</textarea>";
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-
-return support;
-
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/var/nodeNames.js b/libs/bower_components/jquery/src/manipulation/var/nodeNames.js
deleted file mode 100644
index 05bb604f47..0000000000
--- a/libs/bower_components/jquery/src/manipulation/var/nodeNames.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( function() {
- return "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
- "details|dialog|figcaption|figure|footer|header|hgroup|main|" +
- "mark|meter|nav|output|picture|progress|section|summary|template|time|video";
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/var/rcheckableType.js b/libs/bower_components/jquery/src/manipulation/var/rcheckableType.js
deleted file mode 100644
index 4c95394ac0..0000000000
--- a/libs/bower_components/jquery/src/manipulation/var/rcheckableType.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return ( /^(?:checkbox|radio)$/i );
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/var/rleadingWhitespace.js b/libs/bower_components/jquery/src/manipulation/var/rleadingWhitespace.js
deleted file mode 100644
index 96ef95f311..0000000000
--- a/libs/bower_components/jquery/src/manipulation/var/rleadingWhitespace.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return ( /^\s+/ );
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/var/rscriptType.js b/libs/bower_components/jquery/src/manipulation/var/rscriptType.js
deleted file mode 100644
index 0c77c8a583..0000000000
--- a/libs/bower_components/jquery/src/manipulation/var/rscriptType.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return ( /^$|\/(?:java|ecma)script/i );
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/var/rtagName.js b/libs/bower_components/jquery/src/manipulation/var/rtagName.js
deleted file mode 100644
index 9e542694a7..0000000000
--- a/libs/bower_components/jquery/src/manipulation/var/rtagName.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return ( /<([\w:-]+)/ );
-} );
diff --git a/libs/bower_components/jquery/src/manipulation/wrapMap.js b/libs/bower_components/jquery/src/manipulation/wrapMap.js
deleted file mode 100644
index fdb430a03b..0000000000
--- a/libs/bower_components/jquery/src/manipulation/wrapMap.js
+++ /dev/null
@@ -1,27 +0,0 @@
-define( function() {
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-
- // Support: IE9
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
-
- // XHTML parsers do not magically insert elements in the
- // same way that tag soup parsers do. So we cannot shorten
- // this by omitting <tbody> or other required elements.
- thead: [ 1, "<table>", "</table>" ],
- col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
- _default: [ 0, "", "" ]
-};
-
-// Support: IE9
-wrapMap.optgroup = wrapMap.option;
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-return wrapMap;
-} );
diff --git a/libs/bower_components/jquery/src/offset.js b/libs/bower_components/jquery/src/offset.js
deleted file mode 100644
index 08a4543e43..0000000000
--- a/libs/bower_components/jquery/src/offset.js
+++ /dev/null
@@ -1,218 +0,0 @@
-define( [
- "./core",
- "./core/access",
- "./var/document",
- "./var/documentElement",
- "./css/var/rnumnonpx",
- "./css/curCSS",
- "./css/addGetHookIf",
- "./css/support",
-
- "./core/init",
- "./css",
- "./selector" // contains
-], function( jQuery, access, document, documentElement, rnumnonpx, curCSS, addGetHookIf, support ) {
-
-/**
- * Gets a window from an element
- */
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
-}
-
-jQuery.offset = {
- setOffset: function( elem, options, i ) {
- var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
- position = jQuery.css( elem, "position" ),
- curElem = jQuery( elem ),
- props = {};
-
- // Set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- curOffset = curElem.offset();
- curCSSTop = jQuery.css( elem, "top" );
- curCSSLeft = jQuery.css( elem, "left" );
- calculatePosition = ( position === "absolute" || position === "fixed" ) &&
- ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
-
- // Need to be able to calculate position if either
- // top or left is auto and position is either absolute or fixed
- if ( calculatePosition ) {
- curPosition = curElem.position();
- curTop = curPosition.top;
- curLeft = curPosition.left;
-
- } else {
- curTop = parseFloat( curCSSTop ) || 0;
- curLeft = parseFloat( curCSSLeft ) || 0;
- }
-
- if ( jQuery.isFunction( options ) ) {
-
- // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
- options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
- }
-
- if ( options.top != null ) {
- props.top = ( options.top - curOffset.top ) + curTop;
- }
- if ( options.left != null ) {
- props.left = ( options.left - curOffset.left ) + curLeft;
- }
-
- if ( "using" in options ) {
- options.using.call( elem, props );
-
- } else {
- curElem.css( props );
- }
- }
-};
-
-jQuery.fn.extend( {
- offset: function( options ) {
- if ( arguments.length ) {
- return options === undefined ?
- this :
- this.each( function( i ) {
- jQuery.offset.setOffset( this, options, i );
- } );
- }
-
- var docElem, win,
- elem = this[ 0 ],
- box = { top: 0, left: 0 },
- doc = elem && elem.ownerDocument;
-
- if ( !doc ) {
- return;
- }
-
- docElem = doc.documentElement;
-
- // Make sure it's not a disconnected DOM node
- if ( !jQuery.contains( docElem, elem ) ) {
- return box;
- }
-
- box = elem.getBoundingClientRect();
- win = getWindow( doc );
- return {
- top: box.top + win.pageYOffset - docElem.clientTop,
- left: box.left + win.pageXOffset - docElem.clientLeft
- };
- },
-
- position: function() {
- if ( !this[ 0 ] ) {
- return;
- }
-
- var offsetParent, offset,
- elem = this[ 0 ],
- parentOffset = { top: 0, left: 0 };
-
- // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
- // because it is its only offset parent
- if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
- // Assume getBoundingClientRect is there when computed position is fixed
- offset = elem.getBoundingClientRect();
-
- } else {
-
- // Get *real* offsetParent
- offsetParent = this.offsetParent();
-
- // Get correct offsets
- offset = this.offset();
- if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
- parentOffset = offsetParent.offset();
- }
-
- // Add offsetParent borders
- parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
- parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
- }
-
- // Subtract parent offsets and element margins
- return {
- top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
- };
- },
-
- // This method will return documentElement in the following cases:
- // 1) For the element inside the iframe without offsetParent, this method will return
- // documentElement of the parent window
- // 2) For the hidden or detached element
- // 3) For body or html element, i.e. in case of the html node - it will return itself
- //
- // but those exceptions were never presented as a real life use-cases
- // and might be considered as more preferable results.
- //
- // This logic, however, is not guaranteed and can change at any point in the future
- offsetParent: function() {
- return this.map( function() {
- var offsetParent = this.offsetParent;
-
- while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
- offsetParent = offsetParent.offsetParent;
- }
-
- return offsetParent || documentElement;
- } );
- }
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
- var top = "pageYOffset" === prop;
-
- jQuery.fn[ method ] = function( val ) {
- return access( this, function( elem, method, val ) {
- var win = getWindow( elem );
-
- if ( val === undefined ) {
- return win ? win[ prop ] : elem[ method ];
- }
-
- if ( win ) {
- win.scrollTo(
- !top ? val : win.pageXOffset,
- top ? val : win.pageYOffset
- );
-
- } else {
- elem[ method ] = val;
- }
- }, method, val, arguments.length );
- };
-} );
-
-// Support: Safari<7-8+, Chrome<37-44+
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
-// getComputedStyle returns percent when specified for top/left/bottom/right;
-// rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
- jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
- function( elem, computed ) {
- if ( computed ) {
- computed = curCSS( elem, prop );
-
- // If curCSS returns percentage, fallback to offset
- return rnumnonpx.test( computed ) ?
- jQuery( elem ).position()[ prop ] + "px" :
- computed;
- }
- }
- );
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/outro.js b/libs/bower_components/jquery/src/outro.js
deleted file mode 100644
index d792ffb58f..0000000000
--- a/libs/bower_components/jquery/src/outro.js
+++ /dev/null
@@ -1,2 +0,0 @@
-return jQuery;
-}));
diff --git a/libs/bower_components/jquery/src/queue.js b/libs/bower_components/jquery/src/queue.js
deleted file mode 100644
index 813c41cd3b..0000000000
--- a/libs/bower_components/jquery/src/queue.js
+++ /dev/null
@@ -1,143 +0,0 @@
-define( [
- "./core",
- "./data/var/dataPriv",
- "./deferred",
- "./callbacks"
-], function( jQuery, dataPriv ) {
-
-jQuery.extend( {
- queue: function( elem, type, data ) {
- var queue;
-
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- queue = dataPriv.get( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !queue || jQuery.isArray( data ) ) {
- queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
- } else {
- queue.push( data );
- }
- }
- return queue || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- startLength = queue.length,
- fn = queue.shift(),
- hooks = jQuery._queueHooks( elem, type ),
- next = function() {
- jQuery.dequeue( elem, type );
- };
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- startLength--;
- }
-
- if ( fn ) {
-
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- // Clear up the last queue stop function
- delete hooks.stop;
- fn.call( elem, next, hooks );
- }
-
- if ( !startLength && hooks ) {
- hooks.empty.fire();
- }
- },
-
- // Not public - generate a queueHooks object, or return the current one
- _queueHooks: function( elem, type ) {
- var key = type + "queueHooks";
- return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
- empty: jQuery.Callbacks( "once memory" ).add( function() {
- dataPriv.remove( elem, [ type + "queue", key ] );
- } )
- } );
- }
-} );
-
-jQuery.fn.extend( {
- queue: function( type, data ) {
- var setter = 2;
-
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- setter--;
- }
-
- if ( arguments.length < setter ) {
- return jQuery.queue( this[ 0 ], type );
- }
-
- return data === undefined ?
- this :
- this.each( function() {
- var queue = jQuery.queue( this, type, data );
-
- // Ensure a hooks for this queue
- jQuery._queueHooks( this, type );
-
- if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- } );
- },
- dequeue: function( type ) {
- return this.each( function() {
- jQuery.dequeue( this, type );
- } );
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
-
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, obj ) {
- var tmp,
- count = 1,
- defer = jQuery.Deferred(),
- elements = this,
- i = this.length,
- resolve = function() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- };
-
- if ( typeof type !== "string" ) {
- obj = type;
- type = undefined;
- }
- type = type || "fx";
-
- while ( i-- ) {
- tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
- if ( tmp && tmp.empty ) {
- count++;
- tmp.empty.add( resolve );
- }
- }
- resolve();
- return defer.promise( obj );
- }
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/queue/delay.js b/libs/bower_components/jquery/src/queue/delay.js
deleted file mode 100644
index 8d5844d6b4..0000000000
--- a/libs/bower_components/jquery/src/queue/delay.js
+++ /dev/null
@@ -1,22 +0,0 @@
-define( [
- "../core",
- "../queue",
- "../effects" // Delay is optional because of this dependency
-], function( jQuery ) {
-
-// Based off of the plugin by Clint Helfers, with permission.
-// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.delay = function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = window.setTimeout( next, time );
- hooks.stop = function() {
- window.clearTimeout( timeout );
- };
- } );
-};
-
-return jQuery.fn.delay;
-} );
diff --git a/libs/bower_components/jquery/src/selector-native.js b/libs/bower_components/jquery/src/selector-native.js
deleted file mode 100644
index ee81483426..0000000000
--- a/libs/bower_components/jquery/src/selector-native.js
+++ /dev/null
@@ -1,211 +0,0 @@
-define( [
- "./core",
- "./var/document",
- "./var/documentElement",
- "./var/hasOwn",
- "./var/indexOf"
-], function( jQuery, document, documentElement, hasOwn, indexOf ) {
-
-/*
- * Optional (non-Sizzle) selector module for custom builds.
- *
- * Note that this DOES NOT SUPPORT many documented jQuery
- * features in exchange for its smaller size:
- *
- * Attribute not equal selector
- * Positional selectors (:first; :eq(n); :odd; etc.)
- * Type selectors (:input; :checkbox; :button; etc.)
- * State-based selectors (:animated; :visible; :hidden; etc.)
- * :has(selector)
- * :not(complex selector)
- * custom selectors via Sizzle extensions
- * Leading combinators (e.g., $collection.find("> *"))
- * Reliable functionality on XML fragments
- * Requiring all parts of a selector to match elements under context
- * (e.g., $div.find("div > *") now matches children of $div)
- * Matching against non-elements
- * Reliable sorting of disconnected nodes
- * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit)
- *
- * If any of these are unacceptable tradeoffs, either use Sizzle or
- * customize this stub for the project's specific needs.
- */
-
-var hasDuplicate, sortInput,
- sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando,
- matches = documentElement.matches ||
- documentElement.webkitMatchesSelector ||
- documentElement.mozMatchesSelector ||
- documentElement.oMatchesSelector ||
- documentElement.msMatchesSelector;
-
-function sortOrder( a, b ) {
-
- // Flag for duplicate removal
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- // Sort on method existence if only one input has compareDocumentPosition
- var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
- if ( compare ) {
- return compare;
- }
-
- // Calculate position if both inputs belong to the same document
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
- a.compareDocumentPosition( b ) :
-
- // Otherwise we know they are disconnected
- 1;
-
- // Disconnected nodes
- if ( compare & 1 ) {
-
- // Choose the first element that is related to our preferred document
- if ( a === document || a.ownerDocument === document &&
- jQuery.contains( document, a ) ) {
- return -1;
- }
- if ( b === document || b.ownerDocument === document &&
- jQuery.contains( document, b ) ) {
- return 1;
- }
-
- // Maintain original order
- return sortInput ?
- ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
- 0;
- }
-
- return compare & 4 ? -1 : 1;
-}
-
-function uniqueSort( results ) {
- var elem,
- duplicates = [],
- j = 0,
- i = 0;
-
- hasDuplicate = false;
- sortInput = !sortStable && results.slice( 0 );
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- while ( ( elem = results[ i++ ] ) ) {
- if ( elem === results[ i ] ) {
- j = duplicates.push( i );
- }
- }
- while ( j-- ) {
- results.splice( duplicates[ j ], 1 );
- }
- }
-
- // Clear input after sorting to release objects
- // See https://github.com/jquery/sizzle/pull/225
- sortInput = null;
-
- return results;
-}
-
-jQuery.extend( {
- find: function( selector, context, results, seed ) {
- var elem, nodeType,
- i = 0;
-
- results = results || [];
- context = context || document;
-
- // Same basic safeguard as Sizzle
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- // Early return if context is not an element or document
- if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 ) {
- return [];
- }
-
- if ( seed ) {
- while ( ( elem = seed[ i++ ] ) ) {
- if ( jQuery.find.matchesSelector( elem, selector ) ) {
- results.push( elem );
- }
- }
- } else {
- jQuery.merge( results, context.querySelectorAll( selector ) );
- }
-
- return results;
- },
- uniqueSort: uniqueSort,
- unique: uniqueSort,
- text: function( elem ) {
- var node,
- ret = "",
- i = 0,
- nodeType = elem.nodeType;
-
- if ( !nodeType ) {
-
- // If no nodeType, this is expected to be an array
- while ( ( node = elem[ i++ ] ) ) {
-
- // Do not traverse comment nodes
- ret += jQuery.text( node );
- }
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-
- // Use textContent for elements
- return elem.textContent;
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
-
- // Do not include comment or processing instruction nodes
-
- return ret;
- },
- contains: function( a, b ) {
- var adown = a.nodeType === 9 ? a.documentElement : a,
- bup = b && b.parentNode;
- return a === bup || !!( bup && bup.nodeType === 1 && adown.contains( bup ) );
- },
- isXMLDoc: function( elem ) {
-
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = elem && ( elem.ownerDocument || elem ).documentElement;
- return documentElement ? documentElement.nodeName !== "HTML" : false;
- },
- expr: {
- attrHandle: {},
- match: {
- bool: new RegExp( "^(?:checked|selected|async|autofocus|autoplay|controls|defer" +
- "|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$", "i" ),
- needsContext: /^[\x20\t\r\n\f]*[>+~]/
- }
- }
-} );
-
-jQuery.extend( jQuery.find, {
- matches: function( expr, elements ) {
- return jQuery.find( expr, null, null, elements );
- },
- matchesSelector: function( elem, expr ) {
- return matches.call( elem, expr );
- },
- attr: function( elem, name ) {
- var fn = jQuery.expr.attrHandle[ name.toLowerCase() ],
-
- // Don't get fooled by Object.prototype properties (jQuery #13807)
- value = fn && hasOwn.call( jQuery.expr.attrHandle, name.toLowerCase() ) ?
- fn( elem, name, jQuery.isXMLDoc( elem ) ) :
- undefined;
- return value !== undefined ? value : elem.getAttribute( name );
- }
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/selector-sizzle.js b/libs/bower_components/jquery/src/selector-sizzle.js
deleted file mode 100644
index 9728a1f57e..0000000000
--- a/libs/bower_components/jquery/src/selector-sizzle.js
+++ /dev/null
@@ -1,14 +0,0 @@
-define( [
- "./core",
- "../external/sizzle/dist/sizzle"
-], function( jQuery, Sizzle ) {
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-} );
diff --git a/libs/bower_components/jquery/src/selector.js b/libs/bower_components/jquery/src/selector.js
deleted file mode 100644
index e13f585ae6..0000000000
--- a/libs/bower_components/jquery/src/selector.js
+++ /dev/null
@@ -1 +0,0 @@
-define( [ "./selector-sizzle" ], function() {} );
diff --git a/libs/bower_components/jquery/src/serialize.js b/libs/bower_components/jquery/src/serialize.js
deleted file mode 100644
index 94698fc2fc..0000000000
--- a/libs/bower_components/jquery/src/serialize.js
+++ /dev/null
@@ -1,125 +0,0 @@
-define( [
- "./core",
- "./manipulation/var/rcheckableType",
- "./core/init",
- "./traversing", // filter
- "./attributes/prop"
-], function( jQuery, rcheckableType ) {
-
-var r20 = /%20/g,
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
- rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-function buildParams( prefix, obj, traditional, add ) {
- var name;
-
- if ( jQuery.isArray( obj ) ) {
-
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
-
- // Treat each array item as a scalar.
- add( prefix, v );
-
- } else {
-
- // Item is non-scalar (array or object), encode its numeric index.
- buildParams(
- prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
- v,
- traditional,
- add
- );
- }
- } );
-
- } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-
- // Serialize object item.
- for ( name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
- }
-
- } else {
-
- // Serialize scalar item.
- add( prefix, obj );
- }
-}
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function( a, traditional ) {
- var prefix,
- s = [],
- add = function( key, value ) {
-
- // If value is a function, invoke it and return its value
- value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
- s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
- };
-
- // Set traditional to true for jQuery <= 1.3.2 behavior.
- if ( traditional === undefined ) {
- traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
- }
-
- // If an array was passed in, assume that it is an array of form elements.
- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
- } );
-
- } else {
-
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
- }
- }
-
- // Return the resulting serialization
- return s.join( "&" ).replace( r20, "+" );
-};
-
-jQuery.fn.extend( {
- serialize: function() {
- return jQuery.param( this.serializeArray() );
- },
- serializeArray: function() {
- return this.map( function() {
-
- // Can add propHook for "elements" to filter or add form elements
- var elements = jQuery.prop( this, "elements" );
- return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
- var type = this.type;
-
- // Use .is( ":disabled" ) so that fieldset[disabled] works
- return this.name && !jQuery( this ).is( ":disabled" ) &&
- rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
- ( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( i, elem ) {
- var val = jQuery( this ).val();
-
- return val == null ?
- null :
- jQuery.isArray( val ) ?
- jQuery.map( val, function( val ) {
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- } ) :
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- } ).get();
- }
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/support.js b/libs/bower_components/jquery/src/support.js
deleted file mode 100644
index 71ac60f19a..0000000000
--- a/libs/bower_components/jquery/src/support.js
+++ /dev/null
@@ -1,63 +0,0 @@
-define( [
- "./core",
- "./var/support",
- "./var/document",
- "./core/init", // Needed for hasOwn support test
- // This is listed as a dependency for build order, but it's still optional in builds
- "./core/ready"
-], function( jQuery, support, document ) {
-
-// Support: IE<9
-// Iteration over object's inherited properties before its own
-var i;
-for ( i in jQuery( support ) ) {
- break;
-}
-support.ownFirst = i === "0";
-
-// Note: most support tests are defined in their respective modules.
-// false until the test is run
-support.inlineBlockNeedsLayout = false;
-
-// Execute ASAP in case we need to set body.style.zoom
-jQuery( function() {
-
- // Minified: var a,b,c,d
- var val, div, body, container;
-
- body = document.getElementsByTagName( "body" )[ 0 ];
- if ( !body || !body.style ) {
-
- // Return for frameset docs that don't have a body
- return;
- }
-
- // Setup
- div = document.createElement( "div" );
- container = document.createElement( "div" );
- container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
- body.appendChild( container ).appendChild( div );
-
- if ( typeof div.style.zoom !== "undefined" ) {
-
- // Support: IE<8
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
-
- support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
- if ( val ) {
-
- // Prevent IE 6 from affecting layout for positioned elements #11048
- // Prevent IE from shrinking the body in IE 7 mode #12869
- // Support: IE<8
- body.style.zoom = 1;
- }
- }
-
- body.removeChild( container );
-} );
-
-return support;
-} );
diff --git a/libs/bower_components/jquery/src/traversing.js b/libs/bower_components/jquery/src/traversing.js
deleted file mode 100644
index 0d4c1c4c36..0000000000
--- a/libs/bower_components/jquery/src/traversing.js
+++ /dev/null
@@ -1,175 +0,0 @@
-define( [
- "./core",
- "./var/indexOf",
- "./traversing/var/dir",
- "./traversing/var/siblings",
- "./traversing/var/rneedsContext",
- "./core/init",
- "./traversing/findFilter",
- "./selector"
-], function( jQuery, indexOf, dir, siblings, rneedsContext ) {
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
- // Methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend( {
- has: function( target ) {
- var targets = jQuery( target, this ),
- l = targets.length;
-
- return this.filter( function() {
- var i = 0;
- for ( ; i < l; i++ ) {
- if ( jQuery.contains( this, targets[ i ] ) ) {
- return true;
- }
- }
- } );
- },
-
- closest: function( selectors, context ) {
- var cur,
- i = 0,
- l = this.length,
- matched = [],
- pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( ; i < l; i++ ) {
- for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
- // Always skip document fragments
- if ( cur.nodeType < 11 && ( pos ?
- pos.index( cur ) > -1 :
-
- // Don't pass non-elements to Sizzle
- cur.nodeType === 1 &&
- jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
- matched.push( cur );
- break;
- }
- }
- }
-
- return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
- },
-
- // Determine the position of an element within the set
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
- }
-
- // Index in selector
- if ( typeof elem === "string" ) {
- return indexOf.call( jQuery( elem ), this[ 0 ] );
- }
-
- // Locate the position of the desired element
- return indexOf.call( this,
-
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[ 0 ] : elem
- );
- },
-
- add: function( selector, context ) {
- return this.pushStack(
- jQuery.uniqueSort(
- jQuery.merge( this.get(), jQuery( selector, context ) )
- )
- );
- },
-
- addBack: function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter( selector )
- );
- }
-} );
-
-function sibling( cur, dir ) {
- while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
- return cur;
-}
-
-jQuery.each( {
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return sibling( elem, "nextSibling" );
- },
- prev: function( elem ) {
- return sibling( elem, "previousSibling" );
- },
- nextAll: function( elem ) {
- return dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return siblings( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return siblings( elem.firstChild );
- },
- contents: function( elem ) {
- return elem.contentDocument || jQuery.merge( [], elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var matched = jQuery.map( this, fn, until );
-
- if ( name.slice( -5 ) !== "Until" ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- matched = jQuery.filter( selector, matched );
- }
-
- if ( this.length > 1 ) {
-
- // Remove duplicates
- if ( !guaranteedUnique[ name ] ) {
- jQuery.uniqueSort( matched );
- }
-
- // Reverse order for parents* and prev-derivatives
- if ( rparentsprev.test( name ) ) {
- matched.reverse();
- }
- }
-
- return this.pushStack( matched );
- };
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jquery/src/traversing/findFilter.js b/libs/bower_components/jquery/src/traversing/findFilter.js
deleted file mode 100644
index 7d4b2cab9e..0000000000
--- a/libs/bower_components/jquery/src/traversing/findFilter.js
+++ /dev/null
@@ -1,100 +0,0 @@
-define( [
- "../core",
- "../var/indexOf",
- "./var/rneedsContext",
- "../selector"
-], function( jQuery, indexOf, rneedsContext ) {
-
-var risSimple = /^.[^:#\[\.,]*$/;
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep( elements, function( elem, i ) {
- /* jshint -W018 */
- return !!qualifier.call( elem, i, elem ) !== not;
- } );
-
- }
-
- if ( qualifier.nodeType ) {
- return jQuery.grep( elements, function( elem ) {
- return ( elem === qualifier ) !== not;
- } );
-
- }
-
- if ( typeof qualifier === "string" ) {
- if ( risSimple.test( qualifier ) ) {
- return jQuery.filter( qualifier, elements, not );
- }
-
- qualifier = jQuery.filter( qualifier, elements );
- }
-
- return jQuery.grep( elements, function( elem ) {
- return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
- } );
-}
-
-jQuery.filter = function( expr, elems, not ) {
- var elem = elems[ 0 ];
-
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 && elem.nodeType === 1 ?
- jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
- jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
- return elem.nodeType === 1;
- } ) );
-};
-
-jQuery.fn.extend( {
- find: function( selector ) {
- var i,
- len = this.length,
- ret = [],
- self = this;
-
- if ( typeof selector !== "string" ) {
- return this.pushStack( jQuery( selector ).filter( function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- } ) );
- }
-
- for ( i = 0; i < len; i++ ) {
- jQuery.find( selector, self[ i ], ret );
- }
-
- // Needed because $( selector, context ) becomes $( context ).find( selector )
- ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
- ret.selector = this.selector ? this.selector + " " + selector : selector;
- return ret;
- },
- filter: function( selector ) {
- return this.pushStack( winnow( this, selector || [], false ) );
- },
- not: function( selector ) {
- return this.pushStack( winnow( this, selector || [], true ) );
- },
- is: function( selector ) {
- return !!winnow(
- this,
-
- // If this is a positional/relative selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- typeof selector === "string" && rneedsContext.test( selector ) ?
- jQuery( selector ) :
- selector || [],
- false
- ).length;
- }
-} );
-
-} );
diff --git a/libs/bower_components/jquery/src/traversing/var/dir.js b/libs/bower_components/jquery/src/traversing/var/dir.js
deleted file mode 100644
index b98fdca0e9..0000000000
--- a/libs/bower_components/jquery/src/traversing/var/dir.js
+++ /dev/null
@@ -1,20 +0,0 @@
-define( [
- "../../core"
-], function( jQuery ) {
-
-return function( elem, dir, until ) {
- var matched = [],
- truncate = until !== undefined;
-
- while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
- if ( elem.nodeType === 1 ) {
- if ( truncate && jQuery( elem ).is( until ) ) {
- break;
- }
- matched.push( elem );
- }
- }
- return matched;
-};
-
-} );
diff --git a/libs/bower_components/jquery/src/traversing/var/rneedsContext.js b/libs/bower_components/jquery/src/traversing/var/rneedsContext.js
deleted file mode 100644
index f57fd9de2f..0000000000
--- a/libs/bower_components/jquery/src/traversing/var/rneedsContext.js
+++ /dev/null
@@ -1,6 +0,0 @@
-define( [
- "../../core",
- "../../selector"
-], function( jQuery ) {
- return jQuery.expr.match.needsContext;
-} );
diff --git a/libs/bower_components/jquery/src/traversing/var/siblings.js b/libs/bower_components/jquery/src/traversing/var/siblings.js
deleted file mode 100644
index 8a8880bf74..0000000000
--- a/libs/bower_components/jquery/src/traversing/var/siblings.js
+++ /dev/null
@@ -1,15 +0,0 @@
-define( function() {
-
-return function( n, elem ) {
- var matched = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- matched.push( n );
- }
- }
-
- return matched;
-};
-
-} );
diff --git a/libs/bower_components/jquery/src/var/arr.js b/libs/bower_components/jquery/src/var/arr.js
deleted file mode 100644
index 3fd3640001..0000000000
--- a/libs/bower_components/jquery/src/var/arr.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return [];
-} );
diff --git a/libs/bower_components/jquery/src/var/class2type.js b/libs/bower_components/jquery/src/var/class2type.js
deleted file mode 100644
index 3a6932e11b..0000000000
--- a/libs/bower_components/jquery/src/var/class2type.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( function() {
-
- // [[Class]] -> type pairs
- return {};
-} );
diff --git a/libs/bower_components/jquery/src/var/concat.js b/libs/bower_components/jquery/src/var/concat.js
deleted file mode 100644
index 9787bead63..0000000000
--- a/libs/bower_components/jquery/src/var/concat.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "./arr"
-], function( arr ) {
- return arr.concat;
-} );
diff --git a/libs/bower_components/jquery/src/var/deletedIds.js b/libs/bower_components/jquery/src/var/deletedIds.js
deleted file mode 100644
index 3fd3640001..0000000000
--- a/libs/bower_components/jquery/src/var/deletedIds.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return [];
-} );
diff --git a/libs/bower_components/jquery/src/var/document.js b/libs/bower_components/jquery/src/var/document.js
deleted file mode 100644
index bb94284846..0000000000
--- a/libs/bower_components/jquery/src/var/document.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return window.document;
-} );
diff --git a/libs/bower_components/jquery/src/var/documentElement.js b/libs/bower_components/jquery/src/var/documentElement.js
deleted file mode 100644
index e0c0aea6bb..0000000000
--- a/libs/bower_components/jquery/src/var/documentElement.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "./document"
-], function( document ) {
- return document.documentElement;
-} );
diff --git a/libs/bower_components/jquery/src/var/hasOwn.js b/libs/bower_components/jquery/src/var/hasOwn.js
deleted file mode 100644
index 92f323e046..0000000000
--- a/libs/bower_components/jquery/src/var/hasOwn.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "./class2type"
-], function( class2type ) {
- return class2type.hasOwnProperty;
-} );
diff --git a/libs/bower_components/jquery/src/var/indexOf.js b/libs/bower_components/jquery/src/var/indexOf.js
deleted file mode 100644
index 5283841b23..0000000000
--- a/libs/bower_components/jquery/src/var/indexOf.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "./arr"
-], function( arr ) {
- return arr.indexOf;
-} );
diff --git a/libs/bower_components/jquery/src/var/pnum.js b/libs/bower_components/jquery/src/var/pnum.js
deleted file mode 100644
index 7fd9f66774..0000000000
--- a/libs/bower_components/jquery/src/var/pnum.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-} );
diff --git a/libs/bower_components/jquery/src/var/push.js b/libs/bower_components/jquery/src/var/push.js
deleted file mode 100644
index bca1a58ed0..0000000000
--- a/libs/bower_components/jquery/src/var/push.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "./arr"
-], function( arr ) {
- return arr.push;
-} );
diff --git a/libs/bower_components/jquery/src/var/rcssNum.js b/libs/bower_components/jquery/src/var/rcssNum.js
deleted file mode 100644
index 408f5e26d0..0000000000
--- a/libs/bower_components/jquery/src/var/rcssNum.js
+++ /dev/null
@@ -1,7 +0,0 @@
-define( [
- "../var/pnum"
-], function( pnum ) {
-
-return new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-} );
diff --git a/libs/bower_components/jquery/src/var/rnotwhite.js b/libs/bower_components/jquery/src/var/rnotwhite.js
deleted file mode 100644
index 6067728ee0..0000000000
--- a/libs/bower_components/jquery/src/var/rnotwhite.js
+++ /dev/null
@@ -1,3 +0,0 @@
-define( function() {
- return ( /\S+/g );
-} );
diff --git a/libs/bower_components/jquery/src/var/slice.js b/libs/bower_components/jquery/src/var/slice.js
deleted file mode 100644
index d8206d30a8..0000000000
--- a/libs/bower_components/jquery/src/var/slice.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "./arr"
-], function( arr ) {
- return arr.slice;
-} );
diff --git a/libs/bower_components/jquery/src/var/support.js b/libs/bower_components/jquery/src/var/support.js
deleted file mode 100644
index 3db9b67bca..0000000000
--- a/libs/bower_components/jquery/src/var/support.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( function() {
-
- // All support tests are defined in their respective modules.
- return {};
-} );
diff --git a/libs/bower_components/jquery/src/var/toString.js b/libs/bower_components/jquery/src/var/toString.js
deleted file mode 100644
index 80ac7f13f2..0000000000
--- a/libs/bower_components/jquery/src/var/toString.js
+++ /dev/null
@@ -1,5 +0,0 @@
-define( [
- "./class2type"
-], function( class2type ) {
- return class2type.toString;
-} );
diff --git a/libs/bower_components/jquery/src/wrap.js b/libs/bower_components/jquery/src/wrap.js
deleted file mode 100644
index 4d2c3b2044..0000000000
--- a/libs/bower_components/jquery/src/wrap.js
+++ /dev/null
@@ -1,79 +0,0 @@
-define( [
- "./core",
- "./core/init",
- "./manipulation", // clone
- "./traversing" // parent, contents
-], function( jQuery ) {
-
-jQuery.fn.extend( {
- wrapAll: function( html ) {
- var wrap;
-
- if ( jQuery.isFunction( html ) ) {
- return this.each( function( i ) {
- jQuery( this ).wrapAll( html.call( this, i ) );
- } );
- }
-
- if ( this[ 0 ] ) {
-
- // The elements to wrap the target around
- wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
- if ( this[ 0 ].parentNode ) {
- wrap.insertBefore( this[ 0 ] );
- }
-
- wrap.map( function() {
- var elem = this;
-
- while ( elem.firstElementChild ) {
- elem = elem.firstElementChild;
- }
-
- return elem;
- } ).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each( function( i ) {
- jQuery( this ).wrapInner( html.call( this, i ) );
- } );
- }
-
- return this.each( function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- } );
- },
-
- wrap: function( html ) {
- var isFunction = jQuery.isFunction( html );
-
- return this.each( function( i ) {
- jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
- } );
- },
-
- unwrap: function() {
- return this.parent().each( function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- } ).end();
- }
-} );
-
-return jQuery;
-} );
diff --git a/libs/bower_components/jqueryui-touch-punch/.bower.json b/libs/bower_components/jqueryui-touch-punch/.bower.json
new file mode 100644
index 0000000000..d003eeb236
--- /dev/null
+++ b/libs/bower_components/jqueryui-touch-punch/.bower.json
@@ -0,0 +1,19 @@
+{
+ "name": "jqueryui-touch-punch",
+ "main": "jquery.ui.touch-punch.min.js",
+ "ignore": [],
+ "dependencies": {
+ "jquery": ">=1.6",
+ "jquery-ui": ">=1.8"
+ },
+ "homepage": "https://github.com/furf/jquery-ui-touch-punch",
+ "_release": "4bc0091452",
+ "_resolution": {
+ "type": "branch",
+ "branch": "master",
+ "commit": "4bc009145202d9c7483ba85f3a236a8f3470354d"
+ },
+ "_source": "https://github.com/furf/jquery-ui-touch-punch.git",
+ "_target": "master",
+ "_originalSource": "jqueryui-touch-punch"
+} \ No newline at end of file
diff --git a/libs/bower_components/jqueryui-touch-punch/README.md b/libs/bower_components/jqueryui-touch-punch/README.md
new file mode 100644
index 0000000000..cff7baad70
--- /dev/null
+++ b/libs/bower_components/jqueryui-touch-punch/README.md
@@ -0,0 +1,41 @@
+# jQuery UI Touch Punch
+## Touch Event Support for jQuery UI
+
+> **jQuery UI Touch Punch is a small hack that enables the use of touch events on sites using the jQuery UI user interface library.**
+
+_[Visit the official Touch Punch website](http://touchpunch.furf.com)._
+
+Currently, [jQuery UI](http://jqueryui.com/) user interface library does not support the use of touch events in their widgets and interactions. This means that the slick UI you designed and tested in your desktop browser will fail on most, if not all, touch-enabled mobile devices, because jQuery UI listens to mouse events—mouseover, mousemove and mouseout—not touch events—touchstart, touchmove and touchend.
+
+That's where jQuery UI Touch Punch comes in. Touch Punch works by using [simulated events](https://developer.mozilla.org/en/DOM/document.createEvent) to map [touch events](http://www.html5rocks.com/en/mobile/touch/) to their mouse event analogs. Simply include the script on your page and your touch events will be turned into their corresponding mouse events to which jQuery UI will respond as expected.
+
+As I said, Touch Punch is a hack. It [duck punches](http://en.wikipedia.org/wiki/Monkey_patch) some of jQuery UI's core functionality to handle the mapping of touch events. Touch Punch works with all basic implementations of jQuery UI's interactions and widgets. However, you may find more complex cases where Touch Punch fails. If so, scroll down to learn how you can file and/or fix issues.
+
+This code is dual licensed under the MIT or GPL Version 2 licenses and is therefore free to use, modify and/or distribute, but if you include Touch Punch in other software packages or plugins, please include an attribution to the original software and a link to [this Touch Punch website](http://touchpunch.furf.com/).
+
+## Using Touch Punch is as easy as 1, 2…
+
+Just follow these simple steps to enable touch events in your jQuery UI app:
+
+1. Include jQuery and jQuery UI on your page.
+
+ ```html
+ <script src="http://code.jquery.com/jquery.min.js"></script>
+ <script src="http://code.jquery.com/ui/1.8.17/jquery-ui.min.js"></script>
+ ```
+
+2. Include Touch Punch after jQuery UI and before its first use.
+
+ Please note that if you are using jQuery UI's components, Touch Punch must be included after jquery.ui.mouse.js, as Touch Punch modifies its behavior.
+
+ ```html
+ <script src="jquery.ui.touch-punch.min.js"></script>
+ ```
+
+3. There is no 3. Just use jQuery UI as expected and watch it work at the touch of a finger.
+
+ ```html
+ <script>$('#widget').draggable();</script>
+ ```
+
+_Tested on iPad, iPhone, Android and other touch-enabled mobile devices._
diff --git a/libs/bower_components/jqueryui-touch-punch/bower.json b/libs/bower_components/jqueryui-touch-punch/bower.json
new file mode 100644
index 0000000000..ffc6b89f9a
--- /dev/null
+++ b/libs/bower_components/jqueryui-touch-punch/bower.json
@@ -0,0 +1,10 @@
+{
+ "name": "jqueryui-touch-punch",
+ "version": "0.2.3",
+ "main": "jquery.ui.touch-punch.min.js",
+ "ignore": [],
+ "dependencies": {
+ "jquery": ">=1.6",
+ "jquery-ui": ">=1.8"
+ }
+}
diff --git a/libs/bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.js b/libs/bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.js
new file mode 100644
index 0000000000..16ce41d1ed
--- /dev/null
+++ b/libs/bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.js
@@ -0,0 +1,180 @@
+/*!
+ * jQuery UI Touch Punch 0.2.3
+ *
+ * Copyright 2011–2014, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ */
+(function ($) {
+
+ // Detect touch support
+ $.support.touch = 'ontouchend' in document;
+
+ // Ignore browsers without touch support
+ if (!$.support.touch) {
+ return;
+ }
+
+ var mouseProto = $.ui.mouse.prototype,
+ _mouseInit = mouseProto._mouseInit,
+ _mouseDestroy = mouseProto._mouseDestroy,
+ touchHandled;
+
+ /**
+ * Simulate a mouse event based on a corresponding touch event
+ * @param {Object} event A touch event
+ * @param {String} simulatedType The corresponding mouse event
+ */
+ function simulateMouseEvent (event, simulatedType) {
+
+ // Ignore multi-touch events
+ if (event.originalEvent.touches.length > 1) {
+ return;
+ }
+
+ event.preventDefault();
+
+ var touch = event.originalEvent.changedTouches[0],
+ simulatedEvent = document.createEvent('MouseEvents');
+
+ // Initialize the simulated mouse event using the touch event's coordinates
+ simulatedEvent.initMouseEvent(
+ simulatedType, // type
+ true, // bubbles
+ true, // cancelable
+ window, // view
+ 1, // detail
+ touch.screenX, // screenX
+ touch.screenY, // screenY
+ touch.clientX, // clientX
+ touch.clientY, // clientY
+ false, // ctrlKey
+ false, // altKey
+ false, // shiftKey
+ false, // metaKey
+ 0, // button
+ null // relatedTarget
+ );
+
+ // Dispatch the simulated event to the target element
+ event.target.dispatchEvent(simulatedEvent);
+ }
+
+ /**
+ * Handle the jQuery UI widget's touchstart events
+ * @param {Object} event The widget element's touchstart event
+ */
+ mouseProto._touchStart = function (event) {
+
+ var self = this;
+
+ // Ignore the event if another widget is already being handled
+ if (touchHandled || !self._mouseCapture(event.originalEvent.changedTouches[0])) {
+ return;
+ }
+
+ // Set the flag to prevent other widgets from inheriting the touch event
+ touchHandled = true;
+
+ // Track movement to determine if interaction was a click
+ self._touchMoved = false;
+
+ // Simulate the mouseover event
+ simulateMouseEvent(event, 'mouseover');
+
+ // Simulate the mousemove event
+ simulateMouseEvent(event, 'mousemove');
+
+ // Simulate the mousedown event
+ simulateMouseEvent(event, 'mousedown');
+ };
+
+ /**
+ * Handle the jQuery UI widget's touchmove events
+ * @param {Object} event The document's touchmove event
+ */
+ mouseProto._touchMove = function (event) {
+
+ // Ignore event if not handled
+ if (!touchHandled) {
+ return;
+ }
+
+ // Interaction was not a click
+ this._touchMoved = true;
+
+ // Simulate the mousemove event
+ simulateMouseEvent(event, 'mousemove');
+ };
+
+ /**
+ * Handle the jQuery UI widget's touchend events
+ * @param {Object} event The document's touchend event
+ */
+ mouseProto._touchEnd = function (event) {
+
+ // Ignore event if not handled
+ if (!touchHandled) {
+ return;
+ }
+
+ // Simulate the mouseup event
+ simulateMouseEvent(event, 'mouseup');
+
+ // Simulate the mouseout event
+ simulateMouseEvent(event, 'mouseout');
+
+ // If the touch interaction did not move, it should trigger a click
+ if (!this._touchMoved) {
+
+ // Simulate the click event
+ simulateMouseEvent(event, 'click');
+ }
+
+ // Unset the flag to allow other widgets to inherit the touch event
+ touchHandled = false;
+ };
+
+ /**
+ * A duck punch of the $.ui.mouse _mouseInit method to support touch events.
+ * This method extends the widget with bound touch event handlers that
+ * translate touch events to mouse events and pass them to the widget's
+ * original mouse event handling methods.
+ */
+ mouseProto._mouseInit = function () {
+
+ var self = this;
+
+ // Delegate the touch handlers to the widget's element
+ self.element.bind({
+ touchstart: $.proxy(self, '_touchStart'),
+ touchmove: $.proxy(self, '_touchMove'),
+ touchend: $.proxy(self, '_touchEnd')
+ });
+
+ // Call the original $.ui.mouse init method
+ _mouseInit.call(self);
+ };
+
+ /**
+ * Remove the touch event handlers
+ */
+ mouseProto._mouseDestroy = function () {
+
+ var self = this;
+
+ // Delegate the touch handlers to the widget's element
+ self.element.unbind({
+ touchstart: $.proxy(self, '_touchStart'),
+ touchmove: $.proxy(self, '_touchMove'),
+ touchend: $.proxy(self, '_touchEnd')
+ });
+
+ // Call the original $.ui.mouse destroy method
+ _mouseDestroy.call(self);
+ };
+
+})(jQuery); \ No newline at end of file
diff --git a/libs/bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.min.js b/libs/bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.min.js
new file mode 100644
index 0000000000..31272ce6fd
--- /dev/null
+++ b/libs/bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.min.js
@@ -0,0 +1,11 @@
+/*!
+ * jQuery UI Touch Punch 0.2.3
+ *
+ * Copyright 2011–2014, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ */
+!function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); \ No newline at end of file
diff --git a/libs/bower_components/mousetrap/plugins/record/tests/index.html b/libs/bower_components/mousetrap/plugins/record/tests/index.html
deleted file mode 100644
index 5608f09e67..0000000000
--- a/libs/bower_components/mousetrap/plugins/record/tests/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-
- <head>
- <title>Jelly</title>
- <meta charset=utf-8>
- <link href="jelly.css" rel="stylesheet">
- </head>
-
- <body>
- <h1>Jelly</h1>
-
- <h2>For testing the <strong>record</strong> extension</h2>
-
- <p>Click "Record" to test recording a sequence.</p>
- <button class="test-record">Record</button>
- <div class="test-record-result"></div>
-
- <script type="text/javascript" src="../../../tests/libs/jquery-1.7.2.min.js"></script>
- <script type="text/javascript" src="../../../mousetrap.js"></script>
- <script type="text/javascript" src="../mousetrap-record.js"></script>
- <script type="text/javascript" src="jelly.js"></script>
-
- <script type="text/javascript">
- Jelly.spread();
- </script>
- </body>
-
-</html>
diff --git a/libs/bower_components/mousetrap/plugins/record/tests/jelly.css b/libs/bower_components/mousetrap/plugins/record/tests/jelly.css
deleted file mode 100644
index a071c77c98..0000000000
--- a/libs/bower_components/mousetrap/plugins/record/tests/jelly.css
+++ /dev/null
@@ -1,18 +0,0 @@
-body {
- font-family: helvetica, arial, sans-serif;
- line-height: 20px;
-}
-
-kbd {
- background-color: #ccc;
- display: inline-block;
- padding: 0.5ex 1em;
-}
-
-.test-record-result {
- margin-top: 20px;
-}
-
-.test-record-result span:nth-child(n+2) {
- margin-left: 10px;
-}
diff --git a/libs/bower_components/mousetrap/plugins/record/tests/jelly.js b/libs/bower_components/mousetrap/plugins/record/tests/jelly.js
deleted file mode 100644
index 57ff01a028..0000000000
--- a/libs/bower_components/mousetrap/plugins/record/tests/jelly.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Peanut butter goes great with jelly.
- *
- * @author Dan Tao <daniel.tao@gmail.com>
- */
-var Jelly = (function() {
- var recordButton = $("button.test-record"),
- recordResult = $("div.test-record-result");
-
- function _formatSequenceAsHtml(sequence) {
- var combos = [],
- i;
-
- for (i = 0; i < sequence.length; ++i) {
- combos.push('<span>' + _formatKeysAsHtml(sequence[i].split('+')) + '</span>');
- }
-
- return combos.join(' ');
- }
-
- function _formatKeysAsHtml(keys) {
- var htmlKeys = [],
- i;
-
- for (i = 0; i < keys.length; ++i) {
- htmlKeys.push('<kbd>' + keys[i] + '</kbd>');
- }
-
- return htmlKeys.join('+');
- }
-
- function _prepareRecordTest() {
- recordButton.prop('disabled', true);
- recordButton.text('Recording');
-
- Mousetrap.record(function(sequence) {
- recordResult.html(_formatSequenceAsHtml(sequence));
- recordButton.prop('disabled', false);
- recordButton.text('Record');
- });
-
- // take focus away from the button so that Mousetrap will actually
- // capture keystrokes
- recordButton.blur();
- }
-
- return {
- spread: function() {
- recordButton.click(_prepareRecordTest);
- }
- };
-
-})();
diff --git a/misc/cron/archive.php b/misc/cron/archive.php
index 0bc4daa1f1..e95e01ea8d 100644
--- a/misc/cron/archive.php
+++ b/misc/cron/archive.php
@@ -9,8 +9,12 @@
* @package Piwik
*/
+if (!defined('PIWIK_DOCUMENT_ROOT')) {
+ define('PIWIK_DOCUMENT_ROOT', realpath(dirname(__FILE__) . "/../.."));
+}
+
if (!defined('PIWIK_INCLUDE_PATH')) {
- define('PIWIK_INCLUDE_PATH', realpath(dirname(__FILE__) . "/../.."));
+ define('PIWIK_INCLUDE_PATH', PIWIK_DOCUMENT_ROOT);
}
if (!defined('PIWIK_USER_PATH')) {
diff --git a/misc/internal-docs/content-tracking.md b/misc/internal-docs/content-tracking.md
index 7b854a3d53..903ed32c8c 100644
--- a/misc/internal-docs/content-tracking.md
+++ b/misc/internal-docs/content-tracking.md
@@ -9,7 +9,7 @@ This is the technical concept for implementing content tracking. We won't plan a
| ------------- | ------------- |
| Plugin name | Contents |
| Content block | Is a container which consists of a content name, piece, target and an interaction. |
-| Content name | A name that represents a content block. The name will be visible in reports. One name can belong to differnt content pieces. |
+| Content name | A name that represents a content block. The name will be visible in reports. One name can belong to different content pieces. |
| Content piece | This is the actual content that was displayed, eg a path to a video/image/audio file, a text, ... |
| Content target | For instance the URL of a landing page where the user was led to after interacting with the content block. |
| Content impression | Any content block that was displayed on a page, such as a banner or an ad. Optionally you can tell Piwik to track only impressions for content blocks that were actually visible. |
@@ -494,7 +494,7 @@ There would be two reports:
Nested content makes sense (users will do this). How would it work when several contents are nested?
Note: we don't need to handle this case in MVP but maybe worth thinking about it.
-6. FYI: We would probably also need an attribute like data-target="$target" and/or the possiblity for data-trackclick="$target" since not all links might be defined via href but onclick javascript links. See next section
+6. FYI: We would probably also need an attribute like data-target="$target" and/or the possibility for data-trackclick="$target" since not all links might be defined via href but onclick javascript links. See next section
+1
@@ -520,7 +520,7 @@ Yes.
Sounds good: this would make Contents plugin more generic.
- * We'd probably have to offer a mode to rescan all banners again at a certain time and only track those content pieces now that were not visibile before but are now
+ * We'd probably have to offer a mode to rescan all banners again at a certain time and only track those content pieces now that were not visible before but are now
In ticket I wrote `function trackContentPieces() that will let users re-scan the page for Content pieces when DOM has changed.` but maybe instead the function should be called `rescanPageForContents` ?
@@ -535,7 +535,7 @@ so +1
I think that should be the default mode, ie. on page load we detect impressions, and then we also attach to events like scrolling to check ie. every 500ms whether a given Contents is visible. Would that be work?
10. FYI: "you may add a CSS class or attribute to the link element to track" => It could be also a span, a div or something else
-11. FYI: There is way to much magic how content-name is found and it is neither predicatble nor understandable by users, I will simplify this and rather require users to set specific attributes! See next section
+11. FYI: There is way to much magic how content-name is found and it is neither predictable nor understandable by users, I will simplify this and rather require users to set specific attributes! See next section
OK
diff --git a/misc/log-analytics b/misc/log-analytics
-Subproject 6fd24921b3e9ce4b46861ae12528ad91e85583b
+Subproject 2878508f66c10d998c9e4e0bc276988b3755cde
diff --git a/misc/others/iframeWidget.htm b/misc/others/iframeWidget.htm
deleted file mode 100644
index 9b7c4261f1..0000000000
--- a/misc/others/iframeWidget.htm
+++ /dev/null
@@ -1,13 +0,0 @@
-<html>
-<body>
-<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'></script>
-<h3 style="color:#143974">Embedding the Piwik Country widget in an Iframe</h3>
-
-<div id="widgetIframe">
- <iframe width="500" height="350"
- src="http://demo.piwik.org/index.php?module=Widgetize&action=iframe&moduleToWidgetize=UserCountry&actionToWidgetize=getCountry&idSite=1&period=month&date=2010-08-31&disableLink=1&token_auth=960d9a24b89ba4feb99be754c5aac15bx"
- scrolling="no" frameborder="0" marginheight="0" marginwidth="0"></iframe>
-</div>
-
-</body>
-</html>
diff --git a/piwik.js b/piwik.js
index b0d1b1abbe..002e4cb757 100644
--- a/piwik.js
+++ b/piwik.js
@@ -18,49 +18,54 @@ var I="000000";var t=function(ac,ad){return(I+(ad||0)).slice(-ac)};var z="\\u00"
}else{at=null}}else{if(typeof at.toJSON=="function"&&((ae!=N&&ae!=O&&ae!=E)||r.call(at,"toJSON"))){at=at.toJSON(ai)}}}if(ag){at=ag.call(aA,ai,at)}if(at===null){return"null"}ae=u.call(at);if(ae==A){return""+at}else{if(ae==N){return at>-1/0&&at<1/0?""+at:"null"}else{if(ae==O){return C(""+at)}}}if(typeof at=="object"){for(af=aj.length;af--;){if(aj[af]===at){throw aa()}}aj.push(at);ar=[];av=ac;ac+=ax;if(ae==E){for(ah=0,af=at.length;ah<af;ah++){ad=p(ah,at,ag,al,ax,ac,aj);ar.push(ad===L?"null":ad)}ao=ar.length?(ax?"[\n"+ac+ar.join(",\n"+ac)+"\n"+av+"]":("["+ar.join(",")+"]")):"[]"}else{m(al||at,function(aC){var aB=p(aC,at,ag,al,ax,ac,aj);if(aB!==L){ar.push(C(aC)+":"+(ax?" ":"")+aB)}});ao=ar.length?(ax?"{\n"+ac+ar.join(",\n"+ac)+"\n"+av+"}":("{"+ar.join(",")+"}")):"{}"}aj.pop();return ao}};V.stringify=function(ac,ae,af){var ad,al,aj,ai;if(e[typeof ae]&&ae){if((ai=u.call(ae))==U){al=ae}else{if(ai==E){aj={};for(var ah=0,ag=ae.length,ak;ah<ag;ak=ae[ah++],((ai=u.call(ak)),ai==O||ai==N)&&(aj[ak]=1)){}}}}if(af){if((ai=u.call(af))==N){if((af-=af%1)>0){for(ad="",af>10&&(af=10);
ad.length<af;ad+=" "){}}}else{if(ai==O){ad=af.length<=10?af:af.slice(0,10)}}}return p("",(ak={},ak[""]=ac,ak),al,aj,ad,"",[])}}if(!o("json-parse")){var M=R.fromCharCode;var l={92:"\\",34:'"',47:"/",98:"\b",116:"\t",110:"\n",102:"\f",114:"\r"};var G,X;var H=function(){G=X=null;throw T()};var y=function(){var ah=X,af=ah.length,ag,ae,ac,ai,ad;while(G<af){ad=ah.charCodeAt(G);switch(ad){case 9:case 10:case 13:case 32:G++;break;case 123:case 125:case 91:case 93:case 58:case 44:ag=F?ah.charAt(G):ah[G];G++;return ag;case 34:for(ag="@",G++;G<af;){ad=ah.charCodeAt(G);if(ad<32){H()}else{if(ad==92){ad=ah.charCodeAt(++G);switch(ad){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:ag+=l[ad];G++;break;case 117:ae=++G;for(ac=G+4;G<ac;G++){ad=ah.charCodeAt(G);if(!(ad>=48&&ad<=57||ad>=97&&ad<=102||ad>=65&&ad<=70)){H()}}ag+=M("0x"+ah.slice(ae,G));break;default:H()}}else{if(ad==34){break}ad=ah.charCodeAt(G);ae=G;while(ad>=32&&ad!=92&&ad!=34){ad=ah.charCodeAt(++G)}ag+=ah.slice(ae,G)}}}if(ah.charCodeAt(G)==34){G++;
return ag}H();default:ae=G;if(ad==45){ai=true;ad=ah.charCodeAt(++G)}if(ad>=48&&ad<=57){if(ad==48&&((ad=ah.charCodeAt(G+1)),ad>=48&&ad<=57)){H()}ai=false;for(;G<af&&((ad=ah.charCodeAt(G)),ad>=48&&ad<=57);G++){}if(ah.charCodeAt(G)==46){ac=++G;for(;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}ad=ah.charCodeAt(G);if(ad==101||ad==69){ad=ah.charCodeAt(++G);if(ad==43||ad==45){G++}for(ac=G;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}return +ah.slice(ae,G)}if(ai){H()}if(ah.slice(G,G+4)=="true"){G+=4;return true}else{if(ah.slice(G,G+5)=="false"){G+=5;return false}else{if(ah.slice(G,G+4)=="null"){G+=4;return null}}}H()}}return"$"};var W=function(ad){var ac,ae;if(ad=="$"){H()}if(typeof ad=="string"){if((F?ad.charAt(0):ad[0])=="@"){return ad.slice(1)}if(ad=="["){ac=[];for(;;ae||(ae=true)){ad=y();if(ad=="]"){break}if(ae){if(ad==","){ad=y();if(ad=="]"){H()}}else{H()}}if(ad==","){H()}ac.push(W(ad))}return ac}else{if(ad=="{"){ac={};for(;;ae||(ae=true)){ad=y();
-if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON2=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Piwik=(function(){var l,a={},x=document,f=navigator,N=screen,J=window,g=J.performance||J.mozPerformance||J.msPerformance||J.webkitPerformance,n=J.encodeURIComponent,I=J.decodeURIComponent,i=unescape,O,w,d;
-function k(Y){try{return I(Y)}catch(Z){return unescape(Y)}}function z(Z){var Y=typeof Z;return Y!=="undefined"}function s(Y){return typeof Y==="function"}function M(Y){return typeof Y==="object"}function q(Y){return typeof Y==="string"||Y instanceof String}function t(Z){if(!Z){return true}var Y;var aa=true;for(Y in Z){if(Object.prototype.hasOwnProperty.call(Z,Y)){aa=false}}return aa}function T(){var Y,aa,Z;for(Y=0;Y<arguments.length;Y+=1){Z=arguments[Y];aa=Z.shift();if(q(aa)){O[aa].apply(O,Z)}else{aa.apply(O,Z)}}}function W(ab,aa,Z,Y){if(ab.addEventListener){ab.addEventListener(aa,Z,Y);return true}if(ab.attachEvent){return ab.attachEvent("on"+aa,Z)}ab["on"+aa]=Z}function R(Z,ac){var Y="",ab,aa;for(ab in a){if(Object.prototype.hasOwnProperty.call(a,ab)){aa=a[ab][Z];if(s(aa)){Y+=aa(ac)}}}return Y}function U(){var Y;R("unload");if(l){do{Y=new Date()}while(Y.getTimeAlias()<l)}}function j(aa,Z){var Y=x.createElement("script");Y.type="text/javascript";Y.src=aa;if(Y.readyState){Y.onreadystatechange=function(){var ab=this.readyState;
-if(ab==="loaded"||ab==="complete"){Y.onreadystatechange=null;Z()}}}else{Y.onload=Z}x.getElementsByTagName("head")[0].appendChild(Y)}function A(){var Y="";try{Y=J.top.document.referrer}catch(aa){if(J.parent){try{Y=J.parent.document.referrer}catch(Z){Y=""}}}if(Y===""){Y=x.referrer}return Y}function m(Y){var aa=new RegExp("^([a-z]+):"),Z=aa.exec(Y);return Z?Z[1]:null}function c(Y){var aa=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),Z=aa.exec(Y);return Z?Z[1]:Y}function L(aa,Z){var Y="[\\?&#]"+Z+"=([^&#]*)";var ac=new RegExp(Y);var ab=ac.exec(aa);return ab?I(ab[1]):""}function v(Y){return unescape(n(Y))}function V(an){var aa=function(au,at){return(au<<at)|(au>>>(32-at))},ao=function(aw){var au="",av,at;for(av=7;av>=0;av--){at=(aw>>>(av*4))&15;au+=at.toString(16)}return au},ad,aq,ap,Z=[],ah=1732584193,af=4023233417,ae=2562383102,ac=271733878,ab=3285377520,am,al,ak,aj,ai,ar,Y,ag=[];an=v(an);Y=an.length;for(aq=0;aq<Y-3;aq+=4){ap=an.charCodeAt(aq)<<24|an.charCodeAt(aq+1)<<16|an.charCodeAt(aq+2)<<8|an.charCodeAt(aq+3);
-ag.push(ap)}switch(Y&3){case 0:aq=2147483648;break;case 1:aq=an.charCodeAt(Y-1)<<24|8388608;break;case 2:aq=an.charCodeAt(Y-2)<<24|an.charCodeAt(Y-1)<<16|32768;break;case 3:aq=an.charCodeAt(Y-3)<<24|an.charCodeAt(Y-2)<<16|an.charCodeAt(Y-1)<<8|128;break}ag.push(aq);while((ag.length&15)!==14){ag.push(0)}ag.push(Y>>>29);ag.push((Y<<3)&4294967295);for(ad=0;ad<ag.length;ad+=16){for(aq=0;aq<16;aq++){Z[aq]=ag[ad+aq]}for(aq=16;aq<=79;aq++){Z[aq]=aa(Z[aq-3]^Z[aq-8]^Z[aq-14]^Z[aq-16],1)}am=ah;al=af;ak=ae;aj=ac;ai=ab;for(aq=0;aq<=19;aq++){ar=(aa(am,5)+((al&ak)|(~al&aj))+ai+Z[aq]+1518500249)&4294967295;ai=aj;aj=ak;ak=aa(al,30);al=am;am=ar}for(aq=20;aq<=39;aq++){ar=(aa(am,5)+(al^ak^aj)+ai+Z[aq]+1859775393)&4294967295;ai=aj;aj=ak;ak=aa(al,30);al=am;am=ar}for(aq=40;aq<=59;aq++){ar=(aa(am,5)+((al&ak)|(al&aj)|(ak&aj))+ai+Z[aq]+2400959708)&4294967295;ai=aj;aj=ak;ak=aa(al,30);al=am;am=ar}for(aq=60;aq<=79;aq++){ar=(aa(am,5)+(al^ak^aj)+ai+Z[aq]+3395469782)&4294967295;ai=aj;aj=ak;ak=aa(al,30);al=am;am=ar}ah=(ah+am)&4294967295;
-af=(af+al)&4294967295;ae=(ae+ak)&4294967295;ac=(ac+aj)&4294967295;ab=(ab+ai)&4294967295}ar=ao(ah)+ao(af)+ao(ae)+ao(ac)+ao(ab);return ar.toLowerCase()}function Q(aa,Y,Z){if(!aa){aa=""}if(!Y){Y=""}if(aa==="translate.googleusercontent.com"){if(Z===""){Z=Y}Y=L(Y,"u");aa=c(Y)}else{if(aa==="cc.bingj.com"||aa==="webcache.googleusercontent.com"||aa.slice(0,5)==="74.6."){Y=x.links[0].href;aa=c(Y)}}return[aa,Y,Z]}function B(Z){var Y=Z.length;if(Z.charAt(--Y)==="."){Z=Z.slice(0,Y)}if(Z.slice(0,2)==="*."){Z=Z.slice(1)}if(Z.indexOf("/")!==-1){Z=Z.substr(0,Z.indexOf("/"))}return Z}function X(Z){Z=Z&&Z.text?Z.text:Z;if(!q(Z)){var Y=x.getElementsByTagName("title");if(Y&&z(Y[0])){Z=Y[0].text}}return Z}function F(Y){if(!Y){return[]}if(!z(Y.children)&&z(Y.childNodes)){return Y.children}if(z(Y.children)){return Y.children}return[]}function K(Z,Y){if(!Z||!Y){return false}if(Z.contains){return Z.contains(Y)}if(Z===Y){return true}if(Z.compareDocumentPosition){return !!(Z.compareDocumentPosition(Y)&16)}return false
-}function C(aa,ab){if(aa&&aa.indexOf){return aa.indexOf(ab)}if(!z(aa)||aa===null){return -1}if(!aa.length){return -1}var Y=aa.length;if(Y===0){return -1}var Z=0;while(Z<Y){if(aa[Z]===ab){return Z}Z++}return -1}function H(Z,Y){Z=String(Z);return Z.indexOf(Y,Z.length-Y.length)!==-1}function r(Z,Y){Z=String(Z);return Z.indexOf(Y)!==-1}function e(Z,Y){Z=String(Z);return Z.substr(0,Z.length-Y)}function h(aa){if(!aa){return false}function Y(ac,ad){if(J.getComputedStyle){return x.defaultView.getComputedStyle(ac,null)[ad]}if(ac.currentStyle){return ac.currentStyle[ad]}}function ab(ac){ac=ac.parentNode;while(ac){if(ac===x){return true}ac=ac.parentNode}return false}function Z(ae,ak,ac,ah,af,ai,ag){var ad=ae.parentNode,aj=1;if(!ab(ae)){return false}if(9===ad.nodeType){return true}if("0"===Y(ae,"opacity")||"none"===Y(ae,"display")||"hidden"===Y(ae,"visibility")){return false}if(!z(ak)||!z(ac)||!z(ah)||!z(af)||!z(ai)||!z(ag)){ak=ae.offsetTop;af=ae.offsetLeft;ah=ak+ae.offsetHeight;ac=af+ae.offsetWidth;
-ai=ae.offsetWidth;ag=ae.offsetHeight}if(aa===ae&&(0===ag||0===ai)&&"hidden"===Y(ae,"overflow")){return false}if(ad){if(("hidden"===Y(ad,"overflow")||"scroll"===Y(ad,"overflow"))){if(af+aj>ad.offsetWidth+ad.scrollLeft||af+ai-aj<ad.scrollLeft||ak+aj>ad.offsetHeight+ad.scrollTop||ak+ag-aj<ad.scrollTop){return false}}if(ae.offsetParent===ad){af+=ad.offsetLeft;ak+=ad.offsetTop}return Z(ad,ak,ac,ah,af,ai,ag)}return true}return Z(aa)}var S={htmlCollectionToArray:function(aa){var Y=[],Z;if(!aa||!aa.length){return Y}for(Z=0;Z<aa.length;Z++){Y.push(aa[Z])}return Y},find:function(Y){if(!document.querySelectorAll||!Y){return[]}var Z=document.querySelectorAll(Y);return this.htmlCollectionToArray(Z)},findMultiple:function(aa){if(!aa||!aa.length){return[]}var Z,ab;var Y=[];for(Z=0;Z<aa.length;Z++){ab=this.find(aa[Z]);Y=Y.concat(ab)}Y=this.makeNodesUnique(Y);return Y},findNodesByTagName:function(Z,Y){if(!Z||!Y||!Z.getElementsByTagName){return[]}var aa=Z.getElementsByTagName(Y);return this.htmlCollectionToArray(aa)
-},makeNodesUnique:function(Y){var ad=[].concat(Y);Y.sort(function(af,ae){if(af===ae){return 0}var ah=C(ad,af);var ag=C(ad,ae);if(ah===ag){return 0}return ah>ag?-1:1});if(Y.length<=1){return Y}var Z=0;var ab=0;var ac=[];var aa;aa=Y[Z++];while(aa){if(aa===Y[Z]){ab=ac.push(Z)}aa=Y[Z++]||null}while(ab--){Y.splice(ac[ab],1)}return Y},getAttributeValueFromNode:function(ac,aa){if(!this.hasNodeAttribute(ac,aa)){return}if(ac&&ac.getAttribute){return ac.getAttribute(aa)}if(!ac||!ac.attributes){return}var ab=(typeof ac.attributes[aa]);if("undefined"===ab){return}if(ac.attributes[aa].value){return ac.attributes[aa].value}if(ac.attributes[aa].nodeValue){return ac.attributes[aa].nodeValue}var Z;var Y=ac.attributes;if(!Y){return}for(Z=0;Z<Y.length;Z++){if(Y[Z].nodeName===aa){return Y[Z].nodeValue}}return null},hasNodeAttributeWithValue:function(Z,Y){var aa=this.getAttributeValueFromNode(Z,Y);return !!aa},hasNodeAttribute:function(aa,Y){if(aa&&aa.hasAttribute){return aa.hasAttribute(Y)}if(aa&&aa.attributes){var Z=(typeof aa.attributes[Y]);
-return"undefined"!==Z}return false},hasNodeCssClass:function(aa,Y){if(aa&&Y&&aa.className){var Z=typeof aa.className==="string"?aa.className.split(" "):[];if(-1!==C(Z,Y)){return true}}return false},findNodesHavingAttribute:function(ac,aa,Y){if(!Y){Y=[]}if(!ac||!aa){return Y}var ab=F(ac);if(!ab||!ab.length){return Y}var Z,ad;for(Z=0;Z<ab.length;Z++){ad=ab[Z];if(this.hasNodeAttribute(ad,aa)){Y.push(ad)}Y=this.findNodesHavingAttribute(ad,aa,Y)}return Y},findFirstNodeHavingAttribute:function(aa,Z){if(!aa||!Z){return}if(this.hasNodeAttribute(aa,Z)){return aa}var Y=this.findNodesHavingAttribute(aa,Z);if(Y&&Y.length){return Y[0]}},findFirstNodeHavingAttributeWithValue:function(ab,aa){if(!ab||!aa){return}if(this.hasNodeAttributeWithValue(ab,aa)){return ab}var Y=this.findNodesHavingAttribute(ab,aa);if(!Y||!Y.length){return}var Z;for(Z=0;Z<Y.length;Z++){if(this.getAttributeValueFromNode(Y[Z],aa)){return Y[Z]}}},findNodesHavingCssClass:function(ac,ab,Y){if(!Y){Y=[]}if(!ac||!ab){return Y}if(ac.getElementsByClassName){var ad=ac.getElementsByClassName(ab);
-return this.htmlCollectionToArray(ad)}var aa=F(ac);if(!aa||!aa.length){return[]}var Z,ae;for(Z=0;Z<aa.length;Z++){ae=aa[Z];if(this.hasNodeCssClass(ae,ab)){Y.push(ae)}Y=this.findNodesHavingCssClass(ae,ab,Y)}return Y},findFirstNodeHavingClass:function(aa,Z){if(!aa||!Z){return}if(this.hasNodeCssClass(aa,Z)){return aa}var Y=this.findNodesHavingCssClass(aa,Z);if(Y&&Y.length){return Y[0]}},isLinkElement:function(Z){if(!Z){return false}var Y=String(Z.nodeName).toLowerCase();var ab=["a","area"];var aa=C(ab,Y);return aa!==-1},setAnyAttribute:function(Z,Y,aa){if(!Z||!Y){return}if(Z.setAttribute){Z.setAttribute(Y,aa)}else{Z[Y]=aa}}};var p={CONTENT_ATTR:"data-track-content",CONTENT_CLASS:"piwikTrackContent",CONTENT_NAME_ATTR:"data-content-name",CONTENT_PIECE_ATTR:"data-content-piece",CONTENT_PIECE_CLASS:"piwikContentPiece",CONTENT_TARGET_ATTR:"data-content-target",CONTENT_TARGET_CLASS:"piwikContentTarget",CONTENT_IGNOREINTERACTION_ATTR:"data-content-ignoreinteraction",CONTENT_IGNOREINTERACTION_CLASS:"piwikContentIgnoreInteraction",location:undefined,findContentNodes:function(){var Z="."+this.CONTENT_CLASS;
-var Y="["+this.CONTENT_ATTR+"]";var aa=S.findMultiple([Z,Y]);return aa},findContentNodesWithinNode:function(ab){if(!ab){return[]}var Z=S.findNodesHavingCssClass(ab,this.CONTENT_CLASS);var Y=S.findNodesHavingAttribute(ab,this.CONTENT_ATTR);if(Y&&Y.length){var aa;for(aa=0;aa<Y.length;aa++){Z.push(Y[aa])}}if(S.hasNodeAttribute(ab,this.CONTENT_ATTR)){Z.push(ab)}else{if(S.hasNodeCssClass(ab,this.CONTENT_CLASS)){Z.push(ab)}}Z=S.makeNodesUnique(Z);return Z},findParentContentNode:function(Z){if(!Z){return}var aa=Z;var Y=0;while(aa&&aa!==x&&aa.parentNode){if(S.hasNodeAttribute(aa,this.CONTENT_ATTR)){return aa}if(S.hasNodeCssClass(aa,this.CONTENT_CLASS)){return aa}aa=aa.parentNode;if(Y>1000){break}Y++}},findPieceNode:function(Z){var Y;Y=S.findFirstNodeHavingAttribute(Z,this.CONTENT_PIECE_ATTR);if(!Y){Y=S.findFirstNodeHavingClass(Z,this.CONTENT_PIECE_CLASS)}if(Y){return Y}return Z},findTargetNodeNoDefault:function(Y){if(!Y){return}var Z=S.findFirstNodeHavingAttributeWithValue(Y,this.CONTENT_TARGET_ATTR);
-if(Z){return Z}Z=S.findFirstNodeHavingAttribute(Y,this.CONTENT_TARGET_ATTR);if(Z){return Z}Z=S.findFirstNodeHavingClass(Y,this.CONTENT_TARGET_CLASS);if(Z){return Z}},findTargetNode:function(Y){var Z=this.findTargetNodeNoDefault(Y);if(Z){return Z}return Y},findContentName:function(Z){if(!Z){return}var ac=S.findFirstNodeHavingAttributeWithValue(Z,this.CONTENT_NAME_ATTR);if(ac){return S.getAttributeValueFromNode(ac,this.CONTENT_NAME_ATTR)}var Y=this.findContentPiece(Z);if(Y){return this.removeDomainIfIsInLink(Y)}if(S.hasNodeAttributeWithValue(Z,"title")){return S.getAttributeValueFromNode(Z,"title")}var aa=this.findPieceNode(Z);if(S.hasNodeAttributeWithValue(aa,"title")){return S.getAttributeValueFromNode(aa,"title")}var ab=this.findTargetNode(Z);if(S.hasNodeAttributeWithValue(ab,"title")){return S.getAttributeValueFromNode(ab,"title")}},findContentPiece:function(Z){if(!Z){return}var ab=S.findFirstNodeHavingAttributeWithValue(Z,this.CONTENT_PIECE_ATTR);if(ab){return S.getAttributeValueFromNode(ab,this.CONTENT_PIECE_ATTR)
-}var Y=this.findPieceNode(Z);var aa=this.findMediaUrlInNode(Y);if(aa){return this.toAbsoluteUrl(aa)}},findContentTarget:function(aa){if(!aa){return}var ab=this.findTargetNode(aa);if(S.hasNodeAttributeWithValue(ab,this.CONTENT_TARGET_ATTR)){return S.getAttributeValueFromNode(ab,this.CONTENT_TARGET_ATTR)}var Z;if(S.hasNodeAttributeWithValue(ab,"href")){Z=S.getAttributeValueFromNode(ab,"href");return this.toAbsoluteUrl(Z)}var Y=this.findPieceNode(aa);if(S.hasNodeAttributeWithValue(Y,"href")){Z=S.getAttributeValueFromNode(Y,"href");return this.toAbsoluteUrl(Z)}},isSameDomain:function(Y){if(!Y||!Y.indexOf){return false}if(0===Y.indexOf(this.getLocation().origin)){return true}var Z=Y.indexOf(this.getLocation().host);if(8>=Z&&0<=Z){return true}return false},removeDomainIfIsInLink:function(aa){var Z="^https?://[^/]+";var Y="^.*//[^/]+";if(aa&&aa.search&&-1!==aa.search(new RegExp(Z))&&this.isSameDomain(aa)){aa=aa.replace(new RegExp(Y),"");if(!aa){aa="/"}}return aa},findMediaUrlInNode:function(ac){if(!ac){return
-}var aa=["img","embed","video","audio"];var Y=ac.nodeName.toLowerCase();if(-1!==C(aa,Y)&&S.findFirstNodeHavingAttributeWithValue(ac,"src")){var ab=S.findFirstNodeHavingAttributeWithValue(ac,"src");return S.getAttributeValueFromNode(ab,"src")}if(Y==="object"&&S.hasNodeAttributeWithValue(ac,"data")){return S.getAttributeValueFromNode(ac,"data")}if(Y==="object"){var ad=S.findNodesByTagName(ac,"param");if(ad&&ad.length){var Z;for(Z=0;Z<ad.length;Z++){if("movie"===S.getAttributeValueFromNode(ad[Z],"name")&&S.hasNodeAttributeWithValue(ad[Z],"value")){return S.getAttributeValueFromNode(ad[Z],"value")}}}var ae=S.findNodesByTagName(ac,"embed");if(ae&&ae.length){return this.findMediaUrlInNode(ae[0])}}},trim:function(Y){if(Y&&String(Y)===Y){return Y.replace(/^\s+|\s+$/g,"")}return Y},isOrWasNodeInViewport:function(ad){if(!ad||!ad.getBoundingClientRect||ad.nodeType!==1){return true}var ac=ad.getBoundingClientRect();var ab=x.documentElement||{};var aa=ac.top<0;if(aa&&ad.offsetTop){aa=(ad.offsetTop+ac.height)>0
-}var Z=ab.clientWidth;if(J.innerWidth&&Z>J.innerWidth){Z=J.innerWidth}var Y=ab.clientHeight;if(J.innerHeight&&Y>J.innerHeight){Y=J.innerHeight}return((ac.bottom>0||aa)&&ac.right>0&&ac.left<Z&&((ac.top<Y)||aa))},isNodeVisible:function(Z){var Y=h(Z);var aa=this.isOrWasNodeInViewport(Z);return Y&&aa},buildInteractionRequestParams:function(Y,Z,aa,ab){var ac="";if(Y){ac+="c_i="+n(Y)}if(Z){if(ac){ac+="&"}ac+="c_n="+n(Z)}if(aa){if(ac){ac+="&"}ac+="c_p="+n(aa)}if(ab){if(ac){ac+="&"}ac+="c_t="+n(ab)}return ac},buildImpressionRequestParams:function(Y,Z,aa){var ab="c_n="+n(Y)+"&c_p="+n(Z);if(aa){ab+="&c_t="+n(aa)}return ab},buildContentBlock:function(aa){if(!aa){return}var Y=this.findContentName(aa);var Z=this.findContentPiece(aa);var ab=this.findContentTarget(aa);Y=this.trim(Y);Z=this.trim(Z);ab=this.trim(ab);return{name:Y||"Unknown",piece:Z||"Unknown",target:ab||""}},collectContent:function(ab){if(!ab||!ab.length){return[]}var aa=[];var Y,Z;for(Y=0;Y<ab.length;Y++){Z=this.buildContentBlock(ab[Y]);
-if(z(Z)){aa.push(Z)}}return aa},setLocation:function(Y){this.location=Y},getLocation:function(){var Y=this.location||J.location;if(!Y.origin){Y.origin=Y.protocol+"//"+Y.hostname+(Y.port?":"+Y.port:"")}return Y},toAbsoluteUrl:function(Z){if((!Z||String(Z)!==Z)&&Z!==""){return Z}if(""===Z){return this.getLocation().href}if(Z.search(/^\/\//)!==-1){return this.getLocation().protocol+Z}if(Z.search(/:\/\//)!==-1){return Z}if(0===Z.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+Z}if(0===Z.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+Z}if(0===Z.search("^[a-zA-Z]{2,11}:")){return Z}if(Z.search(/^\//)!==-1){return this.getLocation().origin+Z}var Y="(.*/)";var aa=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(Y))[0];return aa+Z},isUrlToCurrentDomain:function(Z){var aa=this.toAbsoluteUrl(Z);if(!aa){return false}var Y=this.getLocation().origin;if(Y===aa){return true}if(0===String(aa).indexOf(Y)){if(":"===String(aa).substr(Y.length,1)){return false
-}return true}return false},setHrefAttribute:function(Z,Y){if(!Z||!Y){return}S.setAnyAttribute(Z,"href",Y)},shouldIgnoreInteraction:function(aa){var Z=S.hasNodeAttribute(aa,this.CONTENT_IGNOREINTERACTION_ATTR);var Y=S.hasNodeCssClass(aa,this.CONTENT_IGNOREINTERACTION_CLASS);return Z||Y}};function E(Z,ac){if(ac){return ac}if(r(Z,"?")){var ab=Z.indexOf("?");Z=Z.slice(0,ab)}if(H(Z,"piwik.php")){Z=e(Z,"piwik.php".length)}else{if(H(Z,".php")){var Y=Z.lastIndexOf("/");var aa=1;Z=Z.slice(0,Y+aa)}}if(H(Z,"/js/")){Z=e(Z,"js/".length)}return Z}function D(ae){var ag="Piwik_Overlay";var Z=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aa=Z.exec(x.referrer);if(aa){var ac=aa[1];if(ac!==String(ae)){return false}var ad=aa[2],Y=aa[3],ab=aa[4];if(!ab){ab=""}else{if(ab.indexOf("&segment=")===0){ab=ab.substr("&segment=".length)}}J.name=ag+"###"+ad+"###"+Y+"###"+ab}var af=J.name.split("###");return af.length===4&&af[0]===ag
-}function P(Z,af,ab){var ae=J.name.split("###"),ad=ae[1],Y=ae[2],ac=ae[3],aa=E(Z,af);j(aa+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aa,ab,ad,Y,ac)})}function o(){if(z(J.frameElement)){return(J.frameElement&&String(J.frameElement.nodeName).toLowerCase()==="iframe")}try{return J.self!==J.top}catch(Y){return true}}function G(bG,bA){var bw=Q(x.domain,J.location.href,A()),ce=B(bw[0]),bg=k(bw[1]),aV=k(bw[2]),cc=false,bK="GET",cq=bK,am="application/x-www-form-urlencoded; charset=UTF-8",bW=am,ai=bG||"",bb="",ci="",by=bA||"",a4="",bh="",aG,aR=x.title,cn=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ae=[ce],a5=[],be=[],aJ=[],bc=500,b5,aH,bk,bi,Y,bS=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],ba=["pk_kwd","piwik_kwd","utm_term"],aS="_pk_",cg,aX,aT=false,ca,aP,a1,b6=33955200000,bQ=1800000,cm=15768000000,aE=true,bO=0,bj=false,at=false,bD,bo={},bN={},aU={},a0=200,cj={},co={},bC=[],bH=false,bZ=false,Z=false,cp=false,aq=false,aO=o(),ch=null,bE,au,a6,bz=V,aW;
-function ct(cD,cA,cz,cC,cy,cB){if(aT){return}var cx;if(cz){cx=new Date();cx.setTime(cx.getTime()+cz)}x.cookie=cD+"="+n(cA)+(cz?";expires="+cx.toGMTString():"")+";path="+(cC||"/")+(cy?";domain="+cy:"")+(cB?";secure":"")}function ah(cz){if(aT){return 0}var cx=new RegExp("(^|;)[ ]*"+cz+"=([^;]*)"),cy=cx.exec(x.cookie);return cy?I(cy[2]):0}function bu(cx){var cy;if(bi){cy=new RegExp("#.*");return cx.replace(cy,"")}return cx}function bn(cz,cx){var cA=m(cx),cy;if(cA){return cx}if(cx.slice(0,1)==="/"){return m(cz)+"://"+c(cz)+cx}cz=bu(cz);cy=cz.indexOf("?");if(cy>=0){cz=cz.slice(0,cy)}cy=cz.lastIndexOf("/");if(cy!==cz.length-1){cz=cz.slice(0,cy+1)}return cz+cx}function b3(cz,cx){var cy;cz=String(cz).toLowerCase();cx=String(cx).toLowerCase();if(cz===cx){return true}if(cx.slice(0,1)==="."){if(cz===cx.slice(1)){return true}cy=cz.length-cx.length;if((cy>0)&&(cz.slice(cy)===cx)){return true}}return false}function bM(cx){var cy=document.createElement("a");if(cx.indexOf("//")!==0&&cx.indexOf("http")!==0){cx="http://"+cx
-}cy.href=p.toAbsoluteUrl(cx);if(cy.pathname){return cy.pathname}return""}function aF(cy,cx){var cz=(!cx||cx==="/"||cx==="/*");if(cz){return true}if(cy===cx){return true}if(!cy){return false}cx=String(cx).toLowerCase();cy=String(cy).toLowerCase();if(H(cx,"*")){cx=cx.slice(0,-1);cz=(!cx||cx==="/");if(cz){return true}if(cy===cx){return true}return cy.indexOf(cx)===0}if(!H(cy,"/")){cy+="/"}if(!H(cx,"/")){cx+="/"}return cy.indexOf(cx)===0}function ab(cB,cD){var cy,cx,cz,cA,cC;for(cy=0;cy<ae.length;cy++){cA=B(ae[cy]);cC=bM(ae[cy]);if(b3(cB,cA)&&aF(cD,cC)){return true}}return false}function ay(cA){var cy,cx,cz;for(cy=0;cy<ae.length;cy++){cx=B(ae[cy].toLowerCase());if(cA===cx){return true}if(cx.slice(0,1)==="."){if(cA===cx.slice(1)){return true}cz=cA.length-cx.length;if((cz>0)&&(cA.slice(cz)===cx)){return true}}}return false}function bR(cx,cz){var cy=new Image(1,1);cy.onload=function(){w=0;if(typeof cz==="function"){cz()}};cy.src=ai+(ai.indexOf("?")<0?"?":"&")+cx}function cl(cy,cB,cx){if(!z(cx)||null===cx){cx=true
-}try{var cA=J.XMLHttpRequest?new J.XMLHttpRequest():J.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;cA.open("POST",ai,true);cA.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)&&cx){bR(cy,cB)}else{if(typeof cB==="function"){cB()}}};cA.setRequestHeader("Content-Type",bW);cA.send(cy)}catch(cz){if(cx){bR(cy,cB)}}}function bI(cy){var cx=new Date();var cz=cx.getTime()+cy;if(!l||cz>l){l=cz}}function bP(cx){if(bE||!aH){return}bE=setTimeout(function cy(){bE=null;if(!aO){aO=(!x.hasFocus||x.hasFocus())}if(!aO){bP(aH);return}if(bk()){return}var cz=new Date(),cA=aH-(cz.getTime()-ch);cA=Math.min(aH,cA);bP(cA)},cx||aH)}function bd(){if(!bE){return}clearTimeout(bE);bE=null}function aL(){aO=true;if(bk()){return}bP()}function af(){bd()}function cv(){if(aq||!aH){return}aq=true;W(J,"focus",aL);W(J,"blur",af);bP()}function b0(cB){var cy=new Date();var cx=cy.getTime();ch=cx;if(bZ&&cx<bZ){var cz=bZ-cx;setTimeout(cB,cz);bI(cz+50);bZ+=50;return}if(bZ===false){var cA=800;
-bZ=cx+cA}cB()}function a9(cy,cx,cz){if(!ca&&cy){b0(function(){if(cq==="POST"){cl(cy,cz)}else{bR(cy,cz)}bI(cx)})}if(!aq){cv()}else{bP()}}function bL(cx){if(ca){return false}return(cx&&cx.length)}function cu(cz,cx){if(!bL(cz)){return}var cy='{"requests":["?'+cz.join('","?')+'"]}';b0(function(){cl(cy,null,false);bI(cx)})}function aw(cx){return aS+cx+"."+by+"."+aW}function bx(){if(aT){return"0"}if(!z(f.cookieEnabled)){var cx=aw("testcookie");ct(cx,"1");return ah(cx)==="1"?"1":"0"}return f.cookieEnabled?"1":"0"}function aQ(){aW=bz((cg||ce)+(aX||"/")).slice(0,4)}function bp(){var cy=aw("cvar"),cx=ah(cy);if(cx.length){cx=JSON2.parse(cx);if(M(cx)){return cx}}return{}}function b1(){if(at===false){at=bp()}}function cb(){return bz((f.userAgent||"")+(f.platform||"")+JSON2.stringify(co)+(new Date()).getTime()+Math.random()).slice(0,16)}function b8(){var cz=new Date(),cx=Math.round(cz.getTime()/1000),cy=aw("id"),cC=ah(cy),cB,cA;if(cC){cB=cC.split(".");cB.unshift("0");if(bh.length){cB[1]=bh}return cB}if(bh.length){cA=bh
-}else{if("0"===bx()){cA=""}else{cA=cb()}}cB=["1",cA,cx,0,cx,"",""];return cB}function aA(){var cE=b8(),cA=cE[0],cB=cE[1],cy=cE[2],cx=cE[3],cC=cE[4],cz=cE[5];if(!z(cE[6])){cE[6]=""}var cD=cE[6];return{newVisitor:cA,uuid:cB,createTs:cy,visitCount:cx,currentVisitTs:cC,lastVisitTs:cz,lastEcommerceOrderTs:cD}}function al(){var cA=new Date(),cy=cA.getTime(),cB=aA().createTs;var cx=parseInt(cB,10);var cz=(cx*1000)+b6-cy;return cz}function ao(cx){if(!by){return}var cz=new Date(),cy=Math.round(cz.getTime()/1000);if(!z(cx)){cx=aA()}var cA=cx.uuid+"."+cx.createTs+"."+cx.visitCount+"."+cy+"."+cx.lastVisitTs+"."+cx.lastEcommerceOrderTs;ct(aw("id"),cA,al(),aX,cg)}function bf(){var cx=ah(aw("ref"));if(cx.length){try{cx=JSON2.parse(cx);if(M(cx)){return cx}}catch(cy){}}return["","",0,""]}function bq(cz,cy,cx){ct(cz,"",-86400,cy,cx)}function a2(cy){var cx="testvalue";ct("test",cx,10000,null,cy);if(ah("test")===cx){bq("test",null,cy);return true}return false}function aj(){var cz=aT;aT=false;var cx=["id","ses","cvar","ref"];
-var cy,cA;for(cy=0;cy<cx.length;cy++){cA=aw(cx[cy]);if(0!==ah(cA)){bq(cA,aX,cg)}}aT=cz}function bv(cx){by=cx;ao()}function cw(cB){if(!cB||!M(cB)){return}var cA=[];var cz;for(cz in cB){if(Object.prototype.hasOwnProperty.call(cB,cz)){cA.push(cz)}}var cC={};cA.sort();var cx=cA.length;var cy;for(cy=0;cy<cx;cy++){cC[cA[cy]]=cB[cA[cy]]}return cC}function bF(){ct(aw("ses"),"*",bQ,aX,cg)}function bT(cz,cU,cV,cA){var cT,cy=new Date(),cH=Math.round(cy.getTime()/1000),cE,cS,cB=1024,c0,cI,cQ=at,cC=aw("ses"),cO=aw("ref"),cL=aw("cvar"),cM=ah(cC),cR=bf(),cX=aG||bg,cF,cx;if(aT){aj()}if(ca){return""}var cN=aA();if(!z(cA)){cA=""}var cK=x.characterSet||x.charset;if(!cK||cK.toLowerCase()==="utf-8"){cK=null}cF=cR[0];cx=cR[1];cE=cR[2];cS=cR[3];if(!cM){var cW=bQ/1000;if(!cN.lastVisitTs||(cH-cN.lastVisitTs)>cW){cN.visitCount++;cN.lastVisitTs=cN.currentVisitTs}if(!a1||!cF.length){for(cT in bS){if(Object.prototype.hasOwnProperty.call(bS,cT)){cF=L(cX,bS[cT]);if(cF.length){break}}}for(cT in ba){if(Object.prototype.hasOwnProperty.call(ba,cT)){cx=L(cX,ba[cT]);
-if(cx.length){break}}}}c0=c(aV);cI=cS.length?c(cS):"";if(c0.length&&!ay(c0)&&(!a1||!cI.length||ay(cI))){cS=aV}if(cS.length||cF.length){cE=cH;cR=[cF,cx,cE,bu(cS.slice(0,cB))];ct(cO,JSON2.stringify(cR),cm,aX,cg)}}cz+="&idsite="+by+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+cy.getHours()+"&m="+cy.getMinutes()+"&s="+cy.getSeconds()+"&url="+n(bu(cX))+(aV.length?"&urlref="+n(bu(aV)):"")+((a4&&a4.length)?"&uid="+n(a4):"")+"&_id="+cN.uuid+"&_idts="+cN.createTs+"&_idvc="+cN.visitCount+"&_idn="+cN.newVisitor+(cF.length?"&_rcn="+n(cF):"")+(cx.length?"&_rck="+n(cx):"")+"&_refts="+cE+"&_viewts="+cN.lastVisitTs+(String(cN.lastEcommerceOrderTs).length?"&_ects="+cN.lastEcommerceOrderTs:"")+(String(cS).length?"&_ref="+n(bu(cS.slice(0,cB))):"")+(cK?"&cs="+n(cK):"")+"&send_image=0";for(cT in co){if(Object.prototype.hasOwnProperty.call(co,cT)){cz+="&"+cT+"="+co[cT]}}var cZ=[];if(cU){for(cT in cU){if(Object.prototype.hasOwnProperty.call(cU,cT)&&/^dimension\d+$/.test(cT)){var cD=cT.replace("dimension","");
-cZ.push(parseInt(cD,10));cZ.push(String(cD));cz+="&"+cT+"="+cU[cT];delete cU[cT]}}}if(cU&&t(cU)){cU=null}for(cT in aU){if(Object.prototype.hasOwnProperty.call(aU,cT)){var cJ=(-1===cZ.indexOf(cT));if(cJ){cz+="&dimension"+cT+"="+aU[cT]}}}if(cU){cz+="&data="+n(JSON2.stringify(cU))}else{if(Y){cz+="&data="+n(JSON2.stringify(Y))}}function cG(c1,c2){var c3=JSON2.stringify(c1);if(c3.length>2){return"&"+c2+"="+n(c3)}return""}var cY=cw(bo);var cP=cw(bN);cz+=cG(cY,"cvar");cz+=cG(cP,"e_cvar");if(at){cz+=cG(at,"_cvar");for(cT in cQ){if(Object.prototype.hasOwnProperty.call(cQ,cT)){if(at[cT][0]===""||at[cT][1]===""){delete at[cT]}}}if(bj){ct(cL,JSON2.stringify(at),bQ,aX,cg)}}if(aE){if(bO){cz+="&gt_ms="+bO}else{if(g&&g.timing&&g.timing.requestStart&&g.timing.responseEnd){cz+="&gt_ms="+(g.timing.responseEnd-g.timing.requestStart)}}}cN.lastEcommerceOrderTs=z(cA)&&String(cA).length?cA:cN.lastEcommerceOrderTs;ao(cN);bF();cz+=R(cV);if(ci.length){cz+="&"+ci}if(s(bD)){cz=bD(cz)}return cz}bk=function aI(){var cx=new Date();
-if(ch+aH<=cx.getTime()){var cy=bT("ping=1",null,"ping");a9(cy,bc);return true}return false};function aY(cA,cz,cE,cB,cx,cH){var cC="idgoal=0",cD,cy=new Date(),cF=[],cG;if(String(cA).length){cC+="&ec_id="+n(cA);cD=Math.round(cy.getTime()/1000)}cC+="&revenue="+cz;if(String(cE).length){cC+="&ec_st="+cE}if(String(cB).length){cC+="&ec_tx="+cB}if(String(cx).length){cC+="&ec_sh="+cx}if(String(cH).length){cC+="&ec_dt="+cH}if(cj){for(cG in cj){if(Object.prototype.hasOwnProperty.call(cj,cG)){if(!z(cj[cG][1])){cj[cG][1]=""}if(!z(cj[cG][2])){cj[cG][2]=""}if(!z(cj[cG][3])||String(cj[cG][3]).length===0){cj[cG][3]=0}if(!z(cj[cG][4])||String(cj[cG][4]).length===0){cj[cG][4]=1}cF.push(cj[cG])}}cC+="&ec_items="+n(JSON2.stringify(cF))}cC=bT(cC,Y,"ecommerce",cD);a9(cC,bc)}function br(cx,cB,cA,cz,cy,cC){if(String(cx).length&&z(cB)){aY(cx,cB,cA,cz,cy,cC)}}function aZ(cx){if(z(cx)){aY("",cx,"","","","")}}function bs(cy,cz){var cx=bT("action_name="+n(X(cy||aR)),cz,"log");a9(cx,bc)}function aC(cz,cy){var cA,cx="(^| )(piwik[_-]"+cy;
-if(cz){for(cA=0;cA<cz.length;cA++){cx+="|"+cz[cA]}}cx+=")( |$)";return new RegExp(cx)}function ax(cx){return(ai&&cx&&0===String(cx).indexOf(ai))}function bU(cB,cx,cC,cy){if(ax(cx)){return 0}var cA=aC(be,"download"),cz=aC(aJ,"link"),cD=new RegExp("\\.("+cn.join("|")+")([?&#]|$)","i");if(cz.test(cB)){return"link"}if(cy||cA.test(cB)||cD.test(cx)){return"download"}if(cC){return 0}return"link"}function ac(cy){var cx;cx=cy.parentNode;while(cx!==null&&z(cx)){if(S.isLinkElement(cy)){break}cy=cx;cx=cy.parentNode}return cy}function cr(cC){cC=ac(cC);if(!S.hasNodeAttribute(cC,"href")){return}if(!z(cC.href)){return}var cB=S.getAttributeValueFromNode(cC,"href");if(ax(cB)){return}var cy=cC.pathname||bM(cC.href);var cD=cC.hostname||c(cC.href);var cE=cD.toLowerCase();var cz=cC.href.replace(cD,cE);var cA=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!cA.test(cz)){var cx=bU(cC.className,cz,ab(cE,cy),S.hasNodeAttribute(cC,"download"));if(cx){return{type:cx,href:cz}
-}}}function ar(cx,cy,cz,cA){var cB=p.buildInteractionRequestParams(cx,cy,cz,cA);if(!cB){return}return bT(cB,null,"contentInteraction")}function b7(cz,cA,cE,cx,cy){if(!z(cz)){return}if(ax(cz)){return cz}var cC=p.toAbsoluteUrl(cz);var cB="redirecturl="+n(cC)+"&";cB+=ar(cA,cE,cx,(cy||cz));var cD="&";if(ai.indexOf("?")<0){cD="?"}return ai+cD+cB}function aM(cx,cy){if(!cx||!cy){return false}var cz=p.findTargetNode(cx);if(p.shouldIgnoreInteraction(cz)){return false}cz=p.findTargetNodeNoDefault(cx);if(cz&&!K(cz,cy)){return false}return true}function bV(cz,cy,cB){if(!cz){return}var cx=p.findParentContentNode(cz);if(!cx){return}if(!aM(cx,cz)){return}var cA=p.buildContentBlock(cx);if(!cA){return}if(!cA.target&&cB){cA.target=cB}return p.buildInteractionRequestParams(cy,cA.name,cA.piece,cA.target)}function az(cy){if(!bC||!bC.length){return false}var cx,cz;for(cx=0;cx<bC.length;cx++){cz=bC[cx];if(cz&&cz.name===cy.name&&cz.piece===cy.piece&&cz.target===cy.target){return true}}return false}function a8(cA){if(!cA){return false
-}var cD=p.findTargetNode(cA);if(!cD||p.shouldIgnoreInteraction(cD)){return false}var cE=cr(cD);if(cp&&cE&&cE.type){return false}if(S.isLinkElement(cD)&&S.hasNodeAttributeWithValue(cD,"href")){var cx=String(S.getAttributeValueFromNode(cD,"href"));if(0===cx.indexOf("#")){return false}if(ax(cx)){return true}if(!p.isUrlToCurrentDomain(cx)){return false}var cB=p.buildContentBlock(cA);if(!cB){return}var cz=cB.name;var cF=cB.piece;var cC=cB.target;if(!S.hasNodeAttributeWithValue(cD,p.CONTENT_TARGET_ATTR)||cD.wasContentTargetAttrReplaced){cD.wasContentTargetAttrReplaced=true;cC=p.toAbsoluteUrl(cx);S.setAnyAttribute(cD,p.CONTENT_TARGET_ATTR,cC)}var cy=b7(cx,"click",cz,cF,cC);p.setHrefAttribute(cD,cy);return true}return false}function ap(cy){if(!cy||!cy.length){return}var cx;for(cx=0;cx<cy.length;cx++){a8(cy[cx])}}function aB(cx){return function(cy){if(!cx){return}var cB=p.findParentContentNode(cx);var cC;if(cy){cC=cy.target||cy.srcElement}if(!cC){cC=cx}if(!aM(cB,cC)){return}bI(bc);if(S.isLinkElement(cx)&&S.hasNodeAttributeWithValue(cx,"href")&&S.hasNodeAttributeWithValue(cx,p.CONTENT_TARGET_ATTR)){var cz=S.getAttributeValueFromNode(cx,"href");
-if(!ax(cz)&&cx.wasContentTargetAttrReplaced){S.setAnyAttribute(cx,p.CONTENT_TARGET_ATTR,"")}}var cG=cr(cx);if(Z&&cG&&cG.type){return cG.type}if(a8(cB)){return"href"}var cD=p.buildContentBlock(cB);if(!cD){return}var cA=cD.name;var cH=cD.piece;var cF=cD.target;var cE=ar("click",cA,cH,cF);a9(cE,bc);return cE}}function bt(cz){if(!cz||!cz.length){return}var cx,cy;for(cx=0;cx<cz.length;cx++){cy=p.findTargetNode(cz[cx]);if(cy&&!cy.contentInteractionTrackingSetupDone){cy.contentInteractionTrackingSetupDone=true;W(cy,"click",aB(cy))}}}function a3(cz,cA){if(!cz||!cz.length){return[]}var cx,cy;for(cx=0;cx<cz.length;cx++){if(az(cz[cx])){cz.splice(cx,1);cx--}else{bC.push(cz[cx])}}if(!cz||!cz.length){return[]}ap(cA);bt(cA);var cB=[];for(cx=0;cx<cz.length;cx++){cy=bT(p.buildImpressionRequestParams(cz[cx].name,cz[cx].piece,cz[cx].target),undefined,"contentImpressions");if(cy){cB.push(cy)}}return cB}function bY(cy){var cx=p.collectContent(cy);return a3(cx,cy)}function aK(cy){if(!cy||!cy.length){return[]
-}var cx;for(cx=0;cx<cy.length;cx++){if(!p.isNodeVisible(cy[cx])){cy.splice(cx,1);cx--}}if(!cy||!cy.length){return[]}return bY(cy)}function ak(cz,cx,cy){var cA=p.buildImpressionRequestParams(cz,cx,cy);return bT(cA,null,"contentImpression")}function cs(cA,cy){if(!cA){return}var cx=p.findParentContentNode(cA);var cz=p.buildContentBlock(cx);if(!cz){return}if(!cy){cy="Unknown"}return ar(cy,cz.name,cz.piece,cz.target)}function b9(cy,cA,cx,cz){return"e_c="+n(cy)+"&e_a="+n(cA)+(z(cx)?"&e_n="+n(cx):"")+(z(cz)?"&e_v="+n(cz):"")}function ad(cz,cB,cx,cA,cC){if(String(cz).length===0||String(cB).length===0){return false}var cy=bT(b9(cz,cB,cx,cA),cC,"event");a9(cy,bc)}function bB(cx,cA,cy,cB){var cz=bT("search="+n(cx)+(cA?"&search_cat="+n(cA):"")+(z(cy)?"&search_count="+cy:""),cB,"sitesearch");a9(cz,bc)}function cd(cx,cA,cz){var cy=bT("idgoal="+cx+(cA?"&revenue="+cA:""),cz,"goal");a9(cy,bc)}function ck(cA,cx,cE,cD,cz){var cC=cx+"="+n(bu(cA));var cy=bV(cz,"click",cA);if(cy){cC+="&"+cy}var cB=bT(cC,cE,"link");
-a9(cB,(cD?0:bc),cD)}function bl(cy,cx){if(cy!==""){return cy+cx.charAt(0).toUpperCase()+cx.slice(1)}return cx}function bJ(cC){var cB,cx,cA=["","webkit","ms","moz"],cz;if(!aP){for(cx=0;cx<cA.length;cx++){cz=cA[cx];if(Object.prototype.hasOwnProperty.call(x,bl(cz,"hidden"))){if(x[bl(cz,"visibilityState")]==="prerender"){cB=true}break}}}if(cB){W(x,cz+"visibilitychange",function cy(){x.removeEventListener(cz+"visibilitychange",cy,false);cC()});return}cC()}function an(cx){if(x.readyState==="complete"){cx()}else{if(J.addEventListener){J.addEventListener("load",cx)}else{if(J.attachEvent){J.attachEvent("onload",cx)}}}}function aN(cA){var cx=false;if(x.attachEvent){cx=x.readyState==="complete"}else{cx=x.readyState!=="loading"}if(cx){cA();return}var cz;if(x.addEventListener){W(x,"DOMContentLoaded",function cy(){x.removeEventListener("DOMContentLoaded",cy,false);if(!cx){cx=true;cA()}})}else{if(x.attachEvent){x.attachEvent("onreadystatechange",function cy(){if(x.readyState==="complete"){x.detachEvent("onreadystatechange",cy);
-if(!cx){cx=true;cA()}}});if(x.documentElement.doScroll&&J===J.top){(function cy(){if(!cx){try{x.documentElement.doScroll("left")}catch(cB){setTimeout(cy,0);return}cx=true;cA()}}())}}}W(J,"load",function(){if(!cx){cx=true;cA()}},false)}function b4(cx){var cy=cr(cx);if(cy&&cy.type){cy.href=k(cy.href);ck(cy.href,cy.type,undefined,null,cx)}}function bX(){return x.all&&!x.addEventListener}function cf(cx){var cz=cx.which;var cy=(typeof cx.button);if(!cz&&cy!=="undefined"){if(bX()){if(cx.button&1){cz=1}else{if(cx.button&2){cz=3}else{if(cx.button&4){cz=2}}}}else{if(cx.button===0||cx.button==="0"){cz=1}else{if(cx.button&1){cz=2}else{if(cx.button&2){cz=3}}}}}return cz}function bm(cx){switch(cf(cx)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function aD(cx){return cx.target||cx.srcElement}function ag(cx){return function(cA){cA=cA||J.event;var cz=bm(cA);var cB=aD(cA);if(cA.type==="click"){var cy=false;if(cx&&cz==="middle"){cy=true}if(cB&&!cy){b4(cB)}}else{if(cA.type==="mousedown"){if(cz==="middle"&&cB){au=cz;
-a6=cB}else{au=a6=null}}else{if(cA.type==="mouseup"){if(cz===au&&cB===a6){b4(cB)}au=a6=null}else{if(cA.type==="contextmenu"){b4(cB)}}}}}}function aa(cy,cx){W(cy,"click",ag(cx),false);if(cx){W(cy,"mouseup",ag(cx),false);W(cy,"mousedown",ag(cx),false);W(cy,"contextmenu",ag(cx),false)}}function a7(cy){if(!Z){Z=true;var cz,cx=aC(a5,"ignore"),cA=x.links;if(cA){for(cz=0;cz<cA.length;cz++){if(!cx.test(cA[cz].className)){aa(cA[cz],cy)}}}}}function av(cz,cB,cC){if(bH){return true}bH=true;var cD=false;var cA,cy;function cx(){cD=true}an(function(){function cE(cG){setTimeout(function(){if(!bH){return}cD=false;cC.trackVisibleContentImpressions();cE(cG)},cG)}function cF(cG){setTimeout(function(){if(!bH){return}if(cD){cD=false;cC.trackVisibleContentImpressions()}cF(cG)},cG)}if(cz){cA=["scroll","resize"];for(cy=0;cy<cA.length;cy++){if(x.addEventListener){x.addEventListener(cA[cy],cx)}else{J.attachEvent("on"+cA[cy],cx)}}cF(100)}if(cB&&cB>0){cB=parseInt(cB,10);cE(cB)}})}function b2(){var cz,cB,cC={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"},cy=J.devicePixelRatio||1;
-if(!((new RegExp("MSIE")).test(f.userAgent))){if(f.mimeTypes&&f.mimeTypes.length){for(cz in cC){if(Object.prototype.hasOwnProperty.call(cC,cz)){cB=f.mimeTypes[cC[cz]];co[cz]=(cB&&cB.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unknown"&&z(f.javaEnabled)&&f.javaEnabled()){co.java="1"}if(s(J.GearsFactory)){co.gears="1"}co.cookie=bx()}var cA=parseInt(N.width,10)*cy;var cx=parseInt(N.height,10)*cy;co.res=parseInt(cA,10)+"x"+parseInt(cx,10)}b2();aQ();ao();return{getVisitorId:function(){return aA().uuid},getVisitorInfo:function(){return b8()},getAttributionInfo:function(){return bf()},getAttributionCampaignName:function(){return bf()[0]},getAttributionCampaignKeyword:function(){return bf()[1]},getAttributionReferrerTimestamp:function(){return bf()[2]},getAttributionReferrerUrl:function(){return bf()[3]},setTrackerUrl:function(cx){ai=cx},getTrackerUrl:function(){return ai},getSiteId:function(){return by},setSiteId:function(cx){bv(cx)},setUserId:function(cx){if(!z(cx)||!cx.length){return
-}a4=cx;bh=bz(a4).substr(0,16)},getUserId:function(){return a4},setCustomData:function(cx,cy){if(M(cx)){Y=cx}else{if(!Y){Y={}}Y[cx]=cy}},getCustomData:function(){return Y},setCustomRequestProcessing:function(cx){bD=cx},appendToTrackingUrl:function(cx){ci=cx},getRequest:function(cx){return bT(cx)},addPlugin:function(cx,cy){a[cx]=cy},setCustomDimension:function(cx,cy){cx=parseInt(cx,10);if(cx>0){if(!z(cy)){cy=""}if(!q(cy)){cy=String(cy)}aU[cx]=cy}},getCustomDimension:function(cx){cx=parseInt(cx,10);if(cx>0&&Object.prototype.hasOwnProperty.call(aU,cx)){return aU[cx]}},deleteCustomDimension:function(cx){cx=parseInt(cx,10);if(cx>0){delete aU[cx]}},setCustomVariable:function(cy,cx,cB,cz){var cA;if(!z(cz)){cz="visit"}if(!z(cx)){return}if(!z(cB)){cB=""}if(cy>0){cx=!q(cx)?String(cx):cx;cB=!q(cB)?String(cB):cB;cA=[cx.slice(0,a0),cB.slice(0,a0)];if(cz==="visit"||cz===2){b1();at[cy]=cA}else{if(cz==="page"||cz===3){bo[cy]=cA}else{if(cz==="event"){bN[cy]=cA}}}}},getCustomVariable:function(cy,cz){var cx;
-if(!z(cz)){cz="visit"}if(cz==="page"||cz===3){cx=bo[cy]}else{if(cz==="event"){cx=bN[cy]}else{if(cz==="visit"||cz===2){b1();cx=at[cy]}}}if(!z(cx)||(cx&&cx[0]==="")){return false}return cx},deleteCustomVariable:function(cx,cy){if(this.getCustomVariable(cx,cy)){this.setCustomVariable(cx,"","",cy)}},storeCustomVariablesInCookie:function(){bj=true},setLinkTrackingTimer:function(cx){bc=cx},setDownloadExtensions:function(cx){if(q(cx)){cx=cx.split("|")}cn=cx},addDownloadExtensions:function(cy){var cx;if(q(cy)){cy=cy.split("|")}for(cx=0;cx<cy.length;cx++){cn.push(cy[cx])}},removeDownloadExtensions:function(cz){var cy,cx=[];if(q(cz)){cz=cz.split("|")}for(cy=0;cy<cn.length;cy++){if(C(cz,cn[cy])===-1){cx.push(cn[cy])}}cn=cx},setDomains:function(cx){ae=q(cx)?[cx]:cx;var cz=false,cy;for(cy in ae){if(Object.prototype.hasOwnProperty.call(ae,cy)&&b3(ce,B(String(ae[cy])))){cz=true}}if(!cz){ae.push(ce)}},setIgnoreClasses:function(cx){a5=q(cx)?[cx]:cx},setRequestMethod:function(cx){cq=cx||bK},setRequestContentType:function(cx){bW=cx||am
-},setReferrerUrl:function(cx){aV=cx},setCustomUrl:function(cx){aG=bn(bg,cx)},setDocumentTitle:function(cx){aR=cx},setAPIUrl:function(cx){bb=cx},setDownloadClasses:function(cx){be=q(cx)?[cx]:cx},setLinkClasses:function(cx){aJ=q(cx)?[cx]:cx},setCampaignNameKey:function(cx){bS=q(cx)?[cx]:cx},setCampaignKeywordKey:function(cx){ba=q(cx)?[cx]:cx},discardHashTag:function(cx){bi=cx},setCookieNamePrefix:function(cx){aS=cx;at=bp()},setCookieDomain:function(cx){var cy=B(cx);if(a2(cy)){cg=cy;aQ()}},setCookiePath:function(cx){aX=cx;aQ()},setVisitorCookieTimeout:function(cx){b6=cx*1000},setSessionCookieTimeout:function(cx){bQ=cx*1000},setReferralCookieTimeout:function(cx){cm=cx*1000},setConversionAttributionFirstReferrer:function(cx){a1=cx},disableCookies:function(){aT=true;co.cookie="0";if(by){aj()}},deleteCookies:function(){aj()},setDoNotTrack:function(cy){var cx=f.doNotTrack||f.msDoNotTrack;ca=cy&&(cx==="yes"||cx==="1");if(ca){this.disableCookies()}},addListener:function(cy,cx){aa(cy,cx)},enableLinkTracking:function(cx){cp=true;
-bJ(function(){aN(function(){a7(cx)})})},enableJSErrorTracking:function(){if(cc){return}cc=true;var cx=J.onerror;J.onerror=function(cC,cA,cz,cB,cy){bJ(function(){var cD="JavaScript Errors";var cE=cA+":"+cz;if(cB){cE+=":"+cB}ad(cD,cE,cC)});if(cx){return cx(cC,cA,cz,cB,cy)}return false}},disablePerformanceTracking:function(){aE=false},setGenerationTimeMs:function(cx){bO=parseInt(cx,10)},enableHeartBeatTimer:function(cx){cx=Math.max(cx,1);aH=(cx||15)*1000;if(ch!==null){cv()}},killFrame:function(){if(J.location!==J.top.location){J.top.location=J.location}},redirectFile:function(cx){if(J.location.protocol==="file:"){J.location=cx}},setCountPreRendered:function(cx){aP=cx},trackGoal:function(cx,cz,cy){bJ(function(){cd(cx,cz,cy)})},trackLink:function(cy,cx,cA,cz){bJ(function(){ck(cy,cx,cA,cz)})},trackPageView:function(cx,cy){bC=[];if(D(by)){bJ(function(){P(ai,bb,by)})}else{bJ(function(){bs(cx,cy)})}},trackAllContentImpressions:function(){if(D(by)){return}bJ(function(){aN(function(){var cx=p.findContentNodes();
-var cy=bY(cx);cu(cy,bc)})})},trackVisibleContentImpressions:function(cx,cy){if(D(by)){return}if(!z(cx)){cx=true}if(!z(cy)){cy=750}av(cx,cy,this);bJ(function(){an(function(){var cz=p.findContentNodes();var cA=aK(cz);cu(cA,bc)})})},trackContentImpression:function(cz,cx,cy){if(D(by)){return}if(!cz){return}cx=cx||"Unknown";bJ(function(){var cA=ak(cz,cx,cy);a9(cA,bc)})},trackContentImpressionsWithinNode:function(cx){if(D(by)||!cx){return}bJ(function(){if(bH){an(function(){var cy=p.findContentNodesWithinNode(cx);var cz=aK(cy);cu(cz,bc)})}else{aN(function(){var cy=p.findContentNodesWithinNode(cx);var cz=bY(cy);cu(cz,bc)})}})},trackContentInteraction:function(cz,cA,cx,cy){if(D(by)){return}if(!cz||!cA){return}cx=cx||"Unknown";bJ(function(){var cB=ar(cz,cA,cx,cy);a9(cB,bc)})},trackContentInteractionNode:function(cy,cx){if(D(by)||!cy){return}bJ(function(){var cz=cs(cy,cx);a9(cz,bc)})},logAllContentBlocksOnPage:function(){var cy=p.findContentNodes();var cx=p.collectContent(cy);if(console!==undefined&&console&&console.log){console.log(cx)
-}},trackEvent:function(cy,cA,cx,cz,cB){bJ(function(){ad(cy,cA,cx,cz,cB)})},trackSiteSearch:function(cx,cz,cy,cA){bJ(function(){bB(cx,cz,cy,cA)})},setEcommerceView:function(cA,cx,cz,cy){if(!z(cz)||!cz.length){cz=""}else{if(cz instanceof Array){cz=JSON2.stringify(cz)}}bo[5]=["_pkc",cz];if(z(cy)&&String(cy).length){bo[2]=["_pkp",cy]}if((!z(cA)||!cA.length)&&(!z(cx)||!cx.length)){return}if(z(cA)&&cA.length){bo[3]=["_pks",cA]}if(!z(cx)||!cx.length){cx=""}bo[4]=["_pkn",cx]},addEcommerceItem:function(cB,cx,cz,cy,cA){if(cB.length){cj[cB]=[cB,cx,cz,cy,cA]}},trackEcommerceOrder:function(cx,cB,cA,cz,cy,cC){br(cx,cB,cA,cz,cy,cC)},trackEcommerceCartUpdate:function(cx){aZ(cx)}}}function y(){return{push:T}}function b(ad,ac){var ae={};var aa,ab;for(aa=0;aa<ac.length;aa++){var Y=ac[aa];ae[Y]=1;for(ab=0;ab<ad.length;ab++){if(ad[ab]&&ad[ab][0]){var Z=ad[ab][0];if(Y===Z){T(ad[ab]);delete ad[ab];if(ae[Z]>1){if(console!==undefined&&console&&console.error){console.error("The method "+Z+' is registered more than once in "paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')
-}}ae[Z]++}}}}return ad}W(J,"beforeunload",U,false);Date.prototype.getTimeAlias=Date.prototype.getTime;O=new G();var u=["disableCookies","setTrackerUrl","setAPIUrl","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","enableLinkTracking"];_paq=b(_paq,u);for(w=0;w<_paq.length;w++){if(_paq[w]){T(_paq[w])}}_paq=new y();d={addPlugin:function(Y,Z){a[Y]=Z},getTracker:function(Y,Z){if(!z(Z)){Z=this.getAsyncTracker().getSiteId()}if(!z(Y)){Y=this.getAsyncTracker().getTrackerUrl()}return new G(Y,Z)},getAsyncTracker:function(){return O}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return d})}return d}())}if(window&&window.piwikAsyncInit){window.piwikAsyncInit()}(function(){var a=(typeof AnalyticsTracker);if(a==="undefined"){AnalyticsTracker=window.Piwik}}());if(typeof piwik_log!=="function"){piwik_log=function(b,f,d,g){function a(h){try{if(window["piwik_"+h]){return window["piwik_"+h]}}catch(i){}return}var c,e=window.Piwik.getTracker(d,f);e.setDocumentTitle(b);
-e.setCustomData(g);c=a("tracker_pause");if(c){e.setLinkTrackingTimer(c)}c=a("download_extensions");if(c){e.setDownloadExtensions(c)}c=a("hosts_alias");if(c){e.setDomains(c)}c=a("ignore_classes");if(c){e.setIgnoreClasses(c)}e.trackPageView();if(a("install_tracker")){piwik_track=function(i,k,j,h){e.setSiteId(k);e.setTrackerUrl(j);e.trackLink(i,h)};e.enableLinkTracking()}};
+if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON2=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Piwik=(function(){var l,a={},r={},y=document,f=navigator,P=screen,L=window,g=L.performance||L.mozPerformance||L.msPerformance||L.webkitPerformance,n=L.encodeURIComponent,K=L.decodeURIComponent,i=unescape,A=[],x,d;
+function k(ac){try{return K(ac)}catch(ad){return unescape(ac)}}function B(ad){var ac=typeof ad;return ac!=="undefined"}function t(ac){return typeof ac==="function"}function O(ac){return typeof ac==="object"}function q(ac){return typeof ac==="string"||ac instanceof String}function u(ad){if(!ad){return true}var ac;var ae=true;for(ac in ad){if(Object.prototype.hasOwnProperty.call(ad,ac)){ae=false}}return ae}function Y(ac){if(console!==undefined&&console&&console.error){console.error(ac)}}function V(){var ag,af,ai,ac;for(ag=0;ag<arguments.length;ag+=1){ac=arguments[ag];ai=ac.shift();for(af=0;af<A.length;af++){if(q(ai)){var ad=A[af];var ah;var ae=ai.indexOf("::")>0;if(ae){ah=ai.split("::");ad=ah[0];ai=ah[1];if("object"===typeof d[ad]&&"function"===typeof d[ad][ai]){d[ad][ai].apply(d[ad],ac)}return}var aj=ai.indexOf(".")>0;if(aj){ah=ai.split(".");ad=ad[ah[0]];ai=ah[1]}if(ad[ai]){ad[ai].apply(ad,ac)}else{var ak="The method '"+ai+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: http://developer.piwik.org/api-reference/tracking-javascript';
+Y(ak);if(!aj){throw new TypeError(ak)}}if(ai==="addTracker"){break}if(ai==="setTrackerUrl"||ai==="setSiteId"){break}}else{ai.apply(A[af],ac)}}}}function aa(af,ae,ad,ac){if(af.addEventListener){af.addEventListener(ae,ad,ac);return true}if(af.attachEvent){return af.attachEvent("on"+ae,ad)}af["on"+ae]=ad}function S(ad,ah){var ac="",af,ae,ag;for(af in a){if(Object.prototype.hasOwnProperty.call(a,af)){ae=a[af][ad];if(t(ae)){ag=ae(ah);if(ag){ac+=ag}}}}return ac}function W(){var ac;S("unload");if(l){do{ac=new Date()}while(ac.getTimeAlias()<l)}}function j(ae,ad){var ac=y.createElement("script");ac.type="text/javascript";ac.src=ae;if(ac.readyState){ac.onreadystatechange=function(){var af=this.readyState;if(af==="loaded"||af==="complete"){ac.onreadystatechange=null;ad()}}}else{ac.onload=ad}y.getElementsByTagName("head")[0].appendChild(ac)}function C(){var ac="";try{ac=L.top.document.referrer}catch(ae){if(L.parent){try{ac=L.parent.document.referrer}catch(ad){ac=""}}}if(ac===""){ac=y.referrer}return ac
+}function m(ac){var ae=new RegExp("^([a-z]+):"),ad=ae.exec(ac);return ad?ad[1]:null}function c(ac){var ae=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),ad=ae.exec(ac);return ad?ad[1]:ac}function N(ae,ad){var ac="[\\?&#]"+ad+"=([^&#]*)";var ag=new RegExp(ac);var af=ag.exec(ae);return af?K(af[1]):""}function w(ac){return unescape(n(ac))}function Z(ar){var ae=function(ay,ax){return(ay<<ax)|(ay>>>(32-ax))},at=function(aA){var ay="",az,ax;for(az=7;az>=0;az--){ax=(aA>>>(az*4))&15;ay+=ax.toString(16)}return ay},ah,av,au,ad=[],al=1732584193,aj=4023233417,ai=2562383102,ag=271733878,af=3285377520,aq,ap,ao,an,am,aw,ac,ak=[];ar=w(ar);ac=ar.length;for(av=0;av<ac-3;av+=4){au=ar.charCodeAt(av)<<24|ar.charCodeAt(av+1)<<16|ar.charCodeAt(av+2)<<8|ar.charCodeAt(av+3);ak.push(au)}switch(ac&3){case 0:av=2147483648;break;case 1:av=ar.charCodeAt(ac-1)<<24|8388608;break;case 2:av=ar.charCodeAt(ac-2)<<24|ar.charCodeAt(ac-1)<<16|32768;break;case 3:av=ar.charCodeAt(ac-3)<<24|ar.charCodeAt(ac-2)<<16|ar.charCodeAt(ac-1)<<8|128;
+break}ak.push(av);while((ak.length&15)!==14){ak.push(0)}ak.push(ac>>>29);ak.push((ac<<3)&4294967295);for(ah=0;ah<ak.length;ah+=16){for(av=0;av<16;av++){ad[av]=ak[ah+av]}for(av=16;av<=79;av++){ad[av]=ae(ad[av-3]^ad[av-8]^ad[av-14]^ad[av-16],1)}aq=al;ap=aj;ao=ai;an=ag;am=af;for(av=0;av<=19;av++){aw=(ae(aq,5)+((ap&ao)|(~ap&an))+am+ad[av]+1518500249)&4294967295;am=an;an=ao;ao=ae(ap,30);ap=aq;aq=aw}for(av=20;av<=39;av++){aw=(ae(aq,5)+(ap^ao^an)+am+ad[av]+1859775393)&4294967295;am=an;an=ao;ao=ae(ap,30);ap=aq;aq=aw}for(av=40;av<=59;av++){aw=(ae(aq,5)+((ap&ao)|(ap&an)|(ao&an))+am+ad[av]+2400959708)&4294967295;am=an;an=ao;ao=ae(ap,30);ap=aq;aq=aw}for(av=60;av<=79;av++){aw=(ae(aq,5)+(ap^ao^an)+am+ad[av]+3395469782)&4294967295;am=an;an=ao;ao=ae(ap,30);ap=aq;aq=aw}al=(al+aq)&4294967295;aj=(aj+ap)&4294967295;ai=(ai+ao)&4294967295;ag=(ag+an)&4294967295;af=(af+am)&4294967295}aw=at(al)+at(aj)+at(ai)+at(ag)+at(af);return aw.toLowerCase()}function R(ae,ac,ad){if(!ae){ae=""}if(!ac){ac=""}if(ae==="translate.googleusercontent.com"){if(ad===""){ad=ac
+}ac=N(ac,"u");ae=c(ac)}else{if(ae==="cc.bingj.com"||ae==="webcache.googleusercontent.com"||ae.slice(0,5)==="74.6."){ac=y.links[0].href;ae=c(ac)}}return[ae,ac,ad]}function D(ad){var ac=ad.length;if(ad.charAt(--ac)==="."){ad=ad.slice(0,ac)}if(ad.slice(0,2)==="*."){ad=ad.slice(1)}if(ad.indexOf("/")!==-1){ad=ad.substr(0,ad.indexOf("/"))}return ad}function ab(ad){ad=ad&&ad.text?ad.text:ad;if(!q(ad)){var ac=y.getElementsByTagName("title");if(ac&&B(ac[0])){ad=ac[0].text}}return ad}function H(ac){if(!ac){return[]}if(!B(ac.children)&&B(ac.childNodes)){return ac.children}if(B(ac.children)){return ac.children}return[]}function M(ad,ac){if(!ad||!ac){return false}if(ad.contains){return ad.contains(ac)}if(ad===ac){return true}if(ad.compareDocumentPosition){return !!(ad.compareDocumentPosition(ac)&16)}return false}function E(ae,af){if(ae&&ae.indexOf){return ae.indexOf(af)}if(!B(ae)||ae===null){return -1}if(!ae.length){return -1}var ac=ae.length;if(ac===0){return -1}var ad=0;while(ad<ac){if(ae[ad]===af){return ad
+}ad++}return -1}function X(ad,ac){ad=String(ad);return ad.lastIndexOf(ac,0)===0}function J(ad,ac){ad=String(ad);return ad.indexOf(ac,ad.length-ac.length)!==-1}function s(ad,ac){ad=String(ad);return ad.indexOf(ac)!==-1}function e(ad,ac){ad=String(ad);return ad.substr(0,ad.length-ac)}function h(ae){if(!ae){return false}function ac(ag,ah){if(L.getComputedStyle){return y.defaultView.getComputedStyle(ag,null)[ah]}if(ag.currentStyle){return ag.currentStyle[ah]}}function af(ag){ag=ag.parentNode;while(ag){if(ag===y){return true}ag=ag.parentNode}return false}function ad(ai,ao,ag,al,aj,am,ak){var ah=ai.parentNode,an=1;if(!af(ai)){return false}if(9===ah.nodeType){return true}if("0"===ac(ai,"opacity")||"none"===ac(ai,"display")||"hidden"===ac(ai,"visibility")){return false}if(!B(ao)||!B(ag)||!B(al)||!B(aj)||!B(am)||!B(ak)){ao=ai.offsetTop;aj=ai.offsetLeft;al=ao+ai.offsetHeight;ag=aj+ai.offsetWidth;am=ai.offsetWidth;ak=ai.offsetHeight}if(ae===ai&&(0===ak||0===am)&&"hidden"===ac(ai,"overflow")){return false
+}if(ah){if(("hidden"===ac(ah,"overflow")||"scroll"===ac(ah,"overflow"))){if(aj+an>ah.offsetWidth+ah.scrollLeft||aj+am-an<ah.scrollLeft||ao+an>ah.offsetHeight+ah.scrollTop||ao+ak-an<ah.scrollTop){return false}}if(ai.offsetParent===ah){aj+=ah.offsetLeft;ao+=ah.offsetTop}return ad(ah,ao,ag,al,aj,am,ak)}return true}return ad(ae)}var U={htmlCollectionToArray:function(ae){var ac=[],ad;if(!ae||!ae.length){return ac}for(ad=0;ad<ae.length;ad++){ac.push(ae[ad])}return ac},find:function(ac){if(!document.querySelectorAll||!ac){return[]}var ad=document.querySelectorAll(ac);return this.htmlCollectionToArray(ad)},findMultiple:function(ae){if(!ae||!ae.length){return[]}var ad,af;var ac=[];for(ad=0;ad<ae.length;ad++){af=this.find(ae[ad]);ac=ac.concat(af)}ac=this.makeNodesUnique(ac);return ac},findNodesByTagName:function(ad,ac){if(!ad||!ac||!ad.getElementsByTagName){return[]}var ae=ad.getElementsByTagName(ac);return this.htmlCollectionToArray(ae)},makeNodesUnique:function(ac){var ah=[].concat(ac);ac.sort(function(aj,ai){if(aj===ai){return 0
+}var al=E(ah,aj);var ak=E(ah,ai);if(al===ak){return 0}return al>ak?-1:1});if(ac.length<=1){return ac}var ad=0;var af=0;var ag=[];var ae;ae=ac[ad++];while(ae){if(ae===ac[ad]){af=ag.push(ad)}ae=ac[ad++]||null}while(af--){ac.splice(ag[af],1)}return ac},getAttributeValueFromNode:function(ag,ae){if(!this.hasNodeAttribute(ag,ae)){return}if(ag&&ag.getAttribute){return ag.getAttribute(ae)}if(!ag||!ag.attributes){return}var af=(typeof ag.attributes[ae]);if("undefined"===af){return}if(ag.attributes[ae].value){return ag.attributes[ae].value}if(ag.attributes[ae].nodeValue){return ag.attributes[ae].nodeValue}var ad;var ac=ag.attributes;if(!ac){return}for(ad=0;ad<ac.length;ad++){if(ac[ad].nodeName===ae){return ac[ad].nodeValue}}return null},hasNodeAttributeWithValue:function(ad,ac){var ae=this.getAttributeValueFromNode(ad,ac);return !!ae},hasNodeAttribute:function(ae,ac){if(ae&&ae.hasAttribute){return ae.hasAttribute(ac)}if(ae&&ae.attributes){var ad=(typeof ae.attributes[ac]);return"undefined"!==ad}return false
+},hasNodeCssClass:function(ae,ac){if(ae&&ac&&ae.className){var ad=typeof ae.className==="string"?ae.className.split(" "):[];if(-1!==E(ad,ac)){return true}}return false},findNodesHavingAttribute:function(ag,ae,ac){if(!ac){ac=[]}if(!ag||!ae){return ac}var af=H(ag);if(!af||!af.length){return ac}var ad,ah;for(ad=0;ad<af.length;ad++){ah=af[ad];if(this.hasNodeAttribute(ah,ae)){ac.push(ah)}ac=this.findNodesHavingAttribute(ah,ae,ac)}return ac},findFirstNodeHavingAttribute:function(ae,ad){if(!ae||!ad){return}if(this.hasNodeAttribute(ae,ad)){return ae}var ac=this.findNodesHavingAttribute(ae,ad);if(ac&&ac.length){return ac[0]}},findFirstNodeHavingAttributeWithValue:function(af,ae){if(!af||!ae){return}if(this.hasNodeAttributeWithValue(af,ae)){return af}var ac=this.findNodesHavingAttribute(af,ae);if(!ac||!ac.length){return}var ad;for(ad=0;ad<ac.length;ad++){if(this.getAttributeValueFromNode(ac[ad],ae)){return ac[ad]}}},findNodesHavingCssClass:function(ag,af,ac){if(!ac){ac=[]}if(!ag||!af){return ac}if(ag.getElementsByClassName){var ah=ag.getElementsByClassName(af);
+return this.htmlCollectionToArray(ah)}var ae=H(ag);if(!ae||!ae.length){return[]}var ad,ai;for(ad=0;ad<ae.length;ad++){ai=ae[ad];if(this.hasNodeCssClass(ai,af)){ac.push(ai)}ac=this.findNodesHavingCssClass(ai,af,ac)}return ac},findFirstNodeHavingClass:function(ae,ad){if(!ae||!ad){return}if(this.hasNodeCssClass(ae,ad)){return ae}var ac=this.findNodesHavingCssClass(ae,ad);if(ac&&ac.length){return ac[0]}},isLinkElement:function(ad){if(!ad){return false}var ac=String(ad.nodeName).toLowerCase();var af=["a","area"];var ae=E(af,ac);return ae!==-1},setAnyAttribute:function(ad,ac,ae){if(!ad||!ac){return}if(ad.setAttribute){ad.setAttribute(ac,ae)}else{ad[ac]=ae}}};var p={CONTENT_ATTR:"data-track-content",CONTENT_CLASS:"piwikTrackContent",CONTENT_NAME_ATTR:"data-content-name",CONTENT_PIECE_ATTR:"data-content-piece",CONTENT_PIECE_CLASS:"piwikContentPiece",CONTENT_TARGET_ATTR:"data-content-target",CONTENT_TARGET_CLASS:"piwikContentTarget",CONTENT_IGNOREINTERACTION_ATTR:"data-content-ignoreinteraction",CONTENT_IGNOREINTERACTION_CLASS:"piwikContentIgnoreInteraction",location:undefined,findContentNodes:function(){var ad="."+this.CONTENT_CLASS;
+var ac="["+this.CONTENT_ATTR+"]";var ae=U.findMultiple([ad,ac]);return ae},findContentNodesWithinNode:function(af){if(!af){return[]}var ad=U.findNodesHavingCssClass(af,this.CONTENT_CLASS);var ac=U.findNodesHavingAttribute(af,this.CONTENT_ATTR);if(ac&&ac.length){var ae;for(ae=0;ae<ac.length;ae++){ad.push(ac[ae])}}if(U.hasNodeAttribute(af,this.CONTENT_ATTR)){ad.push(af)}else{if(U.hasNodeCssClass(af,this.CONTENT_CLASS)){ad.push(af)}}ad=U.makeNodesUnique(ad);return ad},findParentContentNode:function(ad){if(!ad){return}var ae=ad;var ac=0;while(ae&&ae!==y&&ae.parentNode){if(U.hasNodeAttribute(ae,this.CONTENT_ATTR)){return ae}if(U.hasNodeCssClass(ae,this.CONTENT_CLASS)){return ae}ae=ae.parentNode;if(ac>1000){break}ac++}},findPieceNode:function(ad){var ac;ac=U.findFirstNodeHavingAttribute(ad,this.CONTENT_PIECE_ATTR);if(!ac){ac=U.findFirstNodeHavingClass(ad,this.CONTENT_PIECE_CLASS)}if(ac){return ac}return ad},findTargetNodeNoDefault:function(ac){if(!ac){return}var ad=U.findFirstNodeHavingAttributeWithValue(ac,this.CONTENT_TARGET_ATTR);
+if(ad){return ad}ad=U.findFirstNodeHavingAttribute(ac,this.CONTENT_TARGET_ATTR);if(ad){return ad}ad=U.findFirstNodeHavingClass(ac,this.CONTENT_TARGET_CLASS);if(ad){return ad}},findTargetNode:function(ac){var ad=this.findTargetNodeNoDefault(ac);if(ad){return ad}return ac},findContentName:function(ad){if(!ad){return}var ag=U.findFirstNodeHavingAttributeWithValue(ad,this.CONTENT_NAME_ATTR);if(ag){return U.getAttributeValueFromNode(ag,this.CONTENT_NAME_ATTR)}var ac=this.findContentPiece(ad);if(ac){return this.removeDomainIfIsInLink(ac)}if(U.hasNodeAttributeWithValue(ad,"title")){return U.getAttributeValueFromNode(ad,"title")}var ae=this.findPieceNode(ad);if(U.hasNodeAttributeWithValue(ae,"title")){return U.getAttributeValueFromNode(ae,"title")}var af=this.findTargetNode(ad);if(U.hasNodeAttributeWithValue(af,"title")){return U.getAttributeValueFromNode(af,"title")}},findContentPiece:function(ad){if(!ad){return}var af=U.findFirstNodeHavingAttributeWithValue(ad,this.CONTENT_PIECE_ATTR);if(af){return U.getAttributeValueFromNode(af,this.CONTENT_PIECE_ATTR)
+}var ac=this.findPieceNode(ad);var ae=this.findMediaUrlInNode(ac);if(ae){return this.toAbsoluteUrl(ae)}},findContentTarget:function(ae){if(!ae){return}var af=this.findTargetNode(ae);if(U.hasNodeAttributeWithValue(af,this.CONTENT_TARGET_ATTR)){return U.getAttributeValueFromNode(af,this.CONTENT_TARGET_ATTR)}var ad;if(U.hasNodeAttributeWithValue(af,"href")){ad=U.getAttributeValueFromNode(af,"href");return this.toAbsoluteUrl(ad)}var ac=this.findPieceNode(ae);if(U.hasNodeAttributeWithValue(ac,"href")){ad=U.getAttributeValueFromNode(ac,"href");return this.toAbsoluteUrl(ad)}},isSameDomain:function(ac){if(!ac||!ac.indexOf){return false}if(0===ac.indexOf(this.getLocation().origin)){return true}var ad=ac.indexOf(this.getLocation().host);if(8>=ad&&0<=ad){return true}return false},removeDomainIfIsInLink:function(ae){var ad="^https?://[^/]+";var ac="^.*//[^/]+";if(ae&&ae.search&&-1!==ae.search(new RegExp(ad))&&this.isSameDomain(ae)){ae=ae.replace(new RegExp(ac),"");if(!ae){ae="/"}}return ae},findMediaUrlInNode:function(ag){if(!ag){return
+}var ae=["img","embed","video","audio"];var ac=ag.nodeName.toLowerCase();if(-1!==E(ae,ac)&&U.findFirstNodeHavingAttributeWithValue(ag,"src")){var af=U.findFirstNodeHavingAttributeWithValue(ag,"src");return U.getAttributeValueFromNode(af,"src")}if(ac==="object"&&U.hasNodeAttributeWithValue(ag,"data")){return U.getAttributeValueFromNode(ag,"data")}if(ac==="object"){var ah=U.findNodesByTagName(ag,"param");if(ah&&ah.length){var ad;for(ad=0;ad<ah.length;ad++){if("movie"===U.getAttributeValueFromNode(ah[ad],"name")&&U.hasNodeAttributeWithValue(ah[ad],"value")){return U.getAttributeValueFromNode(ah[ad],"value")}}}var ai=U.findNodesByTagName(ag,"embed");if(ai&&ai.length){return this.findMediaUrlInNode(ai[0])}}},trim:function(ac){if(ac&&String(ac)===ac){return ac.replace(/^\s+|\s+$/g,"")}return ac},isOrWasNodeInViewport:function(ah){if(!ah||!ah.getBoundingClientRect||ah.nodeType!==1){return true}var ag=ah.getBoundingClientRect();var af=y.documentElement||{};var ae=ag.top<0;if(ae&&ah.offsetTop){ae=(ah.offsetTop+ag.height)>0
+}var ad=af.clientWidth;if(L.innerWidth&&ad>L.innerWidth){ad=L.innerWidth}var ac=af.clientHeight;if(L.innerHeight&&ac>L.innerHeight){ac=L.innerHeight}return((ag.bottom>0||ae)&&ag.right>0&&ag.left<ad&&((ag.top<ac)||ae))},isNodeVisible:function(ad){var ac=h(ad);var ae=this.isOrWasNodeInViewport(ad);return ac&&ae},buildInteractionRequestParams:function(ac,ad,ae,af){var ag="";if(ac){ag+="c_i="+n(ac)}if(ad){if(ag){ag+="&"}ag+="c_n="+n(ad)}if(ae){if(ag){ag+="&"}ag+="c_p="+n(ae)}if(af){if(ag){ag+="&"}ag+="c_t="+n(af)}return ag},buildImpressionRequestParams:function(ac,ad,ae){var af="c_n="+n(ac)+"&c_p="+n(ad);if(ae){af+="&c_t="+n(ae)}return af},buildContentBlock:function(ae){if(!ae){return}var ac=this.findContentName(ae);var ad=this.findContentPiece(ae);var af=this.findContentTarget(ae);ac=this.trim(ac);ad=this.trim(ad);af=this.trim(af);return{name:ac||"Unknown",piece:ad||"Unknown",target:af||""}},collectContent:function(af){if(!af||!af.length){return[]}var ae=[];var ac,ad;for(ac=0;ac<af.length;
+ac++){ad=this.buildContentBlock(af[ac]);if(B(ad)){ae.push(ad)}}return ae},setLocation:function(ac){this.location=ac},getLocation:function(){var ac=this.location||L.location;if(!ac.origin){ac.origin=ac.protocol+"//"+ac.hostname+(ac.port?":"+ac.port:"")}return ac},toAbsoluteUrl:function(ad){if((!ad||String(ad)!==ad)&&ad!==""){return ad}if(""===ad){return this.getLocation().href}if(ad.search(/^\/\//)!==-1){return this.getLocation().protocol+ad}if(ad.search(/:\/\//)!==-1){return ad}if(0===ad.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ad}if(0===ad.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ad}if(0===ad.search("^[a-zA-Z]{2,11}:")){return ad}if(ad.search(/^\//)!==-1){return this.getLocation().origin+ad}var ac="(.*/)";var ae=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ac))[0];return ae+ad},isUrlToCurrentDomain:function(ad){var ae=this.toAbsoluteUrl(ad);if(!ae){return false}var ac=this.getLocation().origin;
+if(ac===ae){return true}if(0===String(ae).indexOf(ac)){if(":"===String(ae).substr(ac.length,1)){return false}return true}return false},setHrefAttribute:function(ad,ac){if(!ad||!ac){return}U.setAnyAttribute(ad,"href",ac)},shouldIgnoreInteraction:function(ae){var ad=U.hasNodeAttribute(ae,this.CONTENT_IGNOREINTERACTION_ATTR);var ac=U.hasNodeCssClass(ae,this.CONTENT_IGNOREINTERACTION_CLASS);return ad||ac}};function G(ad,ag){if(ag){return ag}if(s(ad,"?")){var af=ad.indexOf("?");ad=ad.slice(0,af)}if(J(ad,"piwik.php")){ad=e(ad,"piwik.php".length)}else{if(J(ad,".php")){var ac=ad.lastIndexOf("/");var ae=1;ad=ad.slice(0,ac+ae)}}if(J(ad,"/js/")){ad=e(ad,"js/".length)}return ad}function F(ai){var ak="Piwik_Overlay";var ad=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var ae=ad.exec(y.referrer);if(ae){var ag=ae[1];if(ag!==String(ai)){return false}var ah=ae[2],ac=ae[3],af=ae[4];if(!af){af=""}else{if(af.indexOf("&segment=")===0){af=af.substr("&segment=".length)
+}}L.name=ak+"###"+ah+"###"+ac+"###"+af}var aj=L.name.split("###");return aj.length===4&&aj[0]===ak}function Q(ad,aj,af){var ai=L.name.split("###"),ah=ai[1],ac=ai[2],ag=ai[3],ae=G(ad,aj);j(ae+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(ae,af,ah,ac,ag)})}function o(){var ae;try{ae=L.frameElement}catch(ad){return true}if(B(ae)){return(ae&&String(ae.nodeName).toLowerCase()==="iframe")?true:false}try{return L.self!==L.top}catch(ac){return true}}function I(bK,bE){var bA=R(y.domain,L.location.href,C()),cj=D(bA[0]),bk=k(bA[1]),aZ=k(bA[2]),ch=false,bO="GET",cv=bO,aq="application/x-www-form-urlencoded; charset=UTF-8",b0=aq,am=bK||"",bf="",cn="",bC=bE||"",a8="",bl="",aK,aV="",cs=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ai=[cj],a9=[],bi=[],aN=[],bg=500,ca,aL,bo,bm,ac,bW=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],be=["pk_kwd","piwik_kwd","utm_term"],aW="_pk_",cl,a1,aX=false,cf,aT,a5,cb=33955200000,bU=1800000,cr=15768000000,aI=true,bS=0,bn=false,ax=false,bH,bs={},bR={},aY={},a4=200,co={},ct={},bG=[],bL=false,b4=false,ad=false,cu=false,av=false,aS=o(),cm=null,bI,ay,ba,bD=Z,a0;
+try{aV=y.title}catch(b2){aV=""}function cy(cI,cF,cE,cH,cD,cG){if(aX){return}var cC;if(cE){cC=new Date();cC.setTime(cC.getTime()+cE)}y.cookie=cI+"="+n(cF)+(cE?";expires="+cC.toGMTString():"")+";path="+(cH||"/")+(cD?";domain="+cD:"")+(cG?";secure":"")}function al(cE){if(aX){return 0}var cC=new RegExp("(^|;)[ ]*"+cE+"=([^;]*)"),cD=cC.exec(y.cookie);return cD?K(cD[2]):0}function by(cC){var cD;if(bm){cD=new RegExp("#.*");return cC.replace(cD,"")}return cC}function br(cE,cC){var cF=m(cC),cD;if(cF){return cC}if(cC.slice(0,1)==="/"){return m(cE)+"://"+c(cE)+cC}cE=by(cE);cD=cE.indexOf("?");if(cD>=0){cE=cE.slice(0,cD)}cD=cE.lastIndexOf("/");if(cD!==cE.length-1){cE=cE.slice(0,cD+1)}return cE+cC}function b8(cE,cC){var cD;cE=String(cE).toLowerCase();cC=String(cC).toLowerCase();if(cE===cC){return true}if(cC.slice(0,1)==="."){if(cE===cC.slice(1)){return true}cD=cE.length-cC.length;if((cD>0)&&(cE.slice(cD)===cC)){return true}}return false}function bQ(cC){var cD=document.createElement("a");if(cC.indexOf("//")!==0&&cC.indexOf("http")!==0){if(cC.indexOf("*")===0){cC=cC.substr(1)
+}if(cC.indexOf(".")===0){cC=cC.substr(1)}cC="http://"+cC}cD.href=p.toAbsoluteUrl(cC);if(cD.pathname){return cD.pathname}return""}function aJ(cD,cC){if(!X(cC,"/")){cC="/"+cC}if(!X(cD,"/")){cD="/"+cD}var cE=(cC==="/"||cC==="/*");if(cE){return true}if(cD===cC){return true}cC=String(cC).toLowerCase();cD=String(cD).toLowerCase();if(J(cC,"*")){cC=cC.slice(0,-1);cE=(!cC||cC==="/");if(cE){return true}if(cD===cC){return true}return cD.indexOf(cC)===0}if(!J(cD,"/")){cD+="/"}if(!J(cC,"/")){cC+="/"}return cD.indexOf(cC)===0}function af(cG,cI){var cD,cC,cE,cF,cH;for(cD=0;cD<ai.length;cD++){cF=D(ai[cD]);cH=bQ(ai[cD]);if(b8(cG,cF)&&aJ(cI,cH)){return true}}return false}function aC(cF){var cD,cC,cE;for(cD=0;cD<ai.length;cD++){cC=D(ai[cD].toLowerCase());if(cF===cC){return true}if(cC.slice(0,1)==="."){if(cF===cC.slice(1)){return true}cE=cF.length-cC.length;if((cE>0)&&(cF.slice(cE)===cC)){return true}}}return false}function bV(cC,cE){var cD=new Image(1,1);cD.onload=function(){x=0;if(typeof cE==="function"){cE()
+}};cC=cC.replace("send_image=0","send_image=1");cD.src=am+(am.indexOf("?")<0?"?":"&")+cC}function cq(cD,cG,cC){if(!B(cC)||null===cC){cC=true}try{var cF=L.XMLHttpRequest?new L.XMLHttpRequest():L.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;cF.open("POST",am,true);cF.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)&&cC){bV(cD,cG)}else{if(this.readyState===4&&(typeof cG==="function")){cG()}}};cF.setRequestHeader("Content-Type",b0);cF.send(cD)}catch(cE){if(cC){bV(cD,cG)}}}function bM(cD){var cC=new Date();var cE=cC.getTime()+cD;if(!l||cE>l){l=cE}}function bT(cC){if(bI||!aL){return}bI=setTimeout(function cD(){bI=null;if(!aS){aS=(!y.hasFocus||y.hasFocus())}if(!aS){bT(aL);return}if(bo()){return}var cE=new Date(),cF=aL-(cE.getTime()-cm);cF=Math.min(aL,cF);bT(cF)},cC||aL)}function bh(){if(!bI){return}clearTimeout(bI);bI=null}function aP(){aS=true;if(bo()){return}bT()}function aj(){bh()}function cA(){if(av||!aL){return}av=true;aa(L,"focus",aP);
+aa(L,"blur",aj);bT()}function b5(cG){var cD=new Date();var cC=cD.getTime();cm=cC;if(b4&&cC<b4){var cE=b4-cC;setTimeout(cG,cE);bM(cE+50);b4+=50;return}if(b4===false){var cF=800;b4=cC+cF}cG()}function bd(cD,cC,cE){if(!cf&&cD){b5(function(){if(cv==="POST"){cq(cD,cE)}else{bV(cD,cE)}bM(cC)})}if(!av){cA()}else{bT()}}function bP(cC){if(cf){return false}return(cC&&cC.length)}function cz(cE,cC){if(!bP(cE)){return}var cD='{"requests":["?'+cE.join('","?')+'"]}';b5(function(){cq(cD,null,false);bM(cC)})}function aA(cC){return aW+cC+"."+bC+"."+a0}function bB(){if(aX){return"0"}if(!B(f.cookieEnabled)){var cC=aA("testcookie");cy(cC,"1");return al(cC)==="1"?"1":"0"}return f.cookieEnabled?"1":"0"}function aU(){a0=bD((cl||cj)+(a1||"/")).slice(0,4)}function bt(){var cD=aA("cvar"),cC=al(cD);if(cC.length){cC=JSON2.parse(cC);if(O(cC)){return cC}}return{}}function b6(){if(ax===false){ax=bt()}}function cg(){return bD((f.userAgent||"")+(f.platform||"")+JSON2.stringify(ct)+(new Date()).getTime()+Math.random()).slice(0,16)
+}function cd(){var cE=new Date(),cC=Math.round(cE.getTime()/1000),cD=aA("id"),cH=al(cD),cG,cF;if(cH){cG=cH.split(".");cG.unshift("0");if(bl.length){cG[1]=bl}return cG}if(bl.length){cF=bl}else{if("0"===bB()){cF=""}else{cF=cg()}}cG=["1",cF,cC,0,cC,"",""];return cG}function aE(){var cJ=cd(),cF=cJ[0],cG=cJ[1],cD=cJ[2],cC=cJ[3],cH=cJ[4],cE=cJ[5];if(!B(cJ[6])){cJ[6]=""}var cI=cJ[6];return{newVisitor:cF,uuid:cG,createTs:cD,visitCount:cC,currentVisitTs:cH,lastVisitTs:cE,lastEcommerceOrderTs:cI}}function ap(){var cF=new Date(),cD=cF.getTime(),cG=aE().createTs;var cC=parseInt(cG,10);var cE=(cC*1000)+cb-cD;return cE}function at(cC){if(!bC){return}var cE=new Date(),cD=Math.round(cE.getTime()/1000);if(!B(cC)){cC=aE()}var cF=cC.uuid+"."+cC.createTs+"."+cC.visitCount+"."+cD+"."+cC.lastVisitTs+"."+cC.lastEcommerceOrderTs;cy(aA("id"),cF,ap(),a1,cl)}function bj(){var cC=al(aA("ref"));if(cC.length){try{cC=JSON2.parse(cC);if(O(cC)){return cC}}catch(cD){}}return["","",0,""]}function bu(cE,cD,cC){cy(cE,"",-86400,cD,cC)
+}function a6(cD){var cC="testvalue";cy("test",cC,10000,null,cD);if(al("test")===cC){bu("test",null,cD);return true}return false}function an(){var cE=aX;aX=false;var cC=["id","ses","cvar","ref"];var cD,cF;for(cD=0;cD<cC.length;cD++){cF=aA(cC[cD]);if(0!==al(cF)){bu(cF,a1,cl)}}aX=cE}function bz(cC){bC=cC;at()}function cB(cG){if(!cG||!O(cG)){return}var cF=[];var cE;for(cE in cG){if(Object.prototype.hasOwnProperty.call(cG,cE)){cF.push(cE)}}var cH={};cF.sort();var cC=cF.length;var cD;for(cD=0;cD<cC;cD++){cH[cF[cD]]=cG[cF[cD]]}return cH}function bJ(){cy(aA("ses"),"*",bU,a1,cl)}function bX(cE,cZ,c0,cF){var cY,cD=new Date(),cM=Math.round(cD.getTime()/1000),cJ,cX,cG=1024,c5,cN,cV=ax,cH=aA("ses"),cT=aA("ref"),cQ=aA("cvar"),cR=al(cH),cW=bj(),c2=aK||bk,cK,cC;if(aX){an()}if(cf){return""}var cS=aE();if(!B(cF)){cF=""}var cP=y.characterSet||y.charset;if(!cP||cP.toLowerCase()==="utf-8"){cP=null}cK=cW[0];cC=cW[1];cJ=cW[2];cX=cW[3];if(!cR){var c1=bU/1000;if(!cS.lastVisitTs||(cM-cS.lastVisitTs)>c1){cS.visitCount++;
+cS.lastVisitTs=cS.currentVisitTs}if(!a5||!cK.length){for(cY in bW){if(Object.prototype.hasOwnProperty.call(bW,cY)){cK=N(c2,bW[cY]);if(cK.length){break}}}for(cY in be){if(Object.prototype.hasOwnProperty.call(be,cY)){cC=N(c2,be[cY]);if(cC.length){break}}}}c5=c(aZ);cN=cX.length?c(cX):"";if(c5.length&&!aC(c5)&&(!a5||!cN.length||aC(cN))){cX=aZ}if(cX.length||cK.length){cJ=cM;cW=[cK,cC,cJ,by(cX.slice(0,cG))];cy(cT,JSON2.stringify(cW),cr,a1,cl)}}cE+="&idsite="+bC+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+cD.getHours()+"&m="+cD.getMinutes()+"&s="+cD.getSeconds()+"&url="+n(by(c2))+(aZ.length?"&urlref="+n(by(aZ)):"")+((a8&&a8.length)?"&uid="+n(a8):"")+"&_id="+cS.uuid+"&_idts="+cS.createTs+"&_idvc="+cS.visitCount+"&_idn="+cS.newVisitor+(cK.length?"&_rcn="+n(cK):"")+(cC.length?"&_rck="+n(cC):"")+"&_refts="+cJ+"&_viewts="+cS.lastVisitTs+(String(cS.lastEcommerceOrderTs).length?"&_ects="+cS.lastEcommerceOrderTs:"")+(String(cX).length?"&_ref="+n(by(cX.slice(0,cG))):"")+(cP?"&cs="+n(cP):"")+"&send_image=0";
+for(cY in ct){if(Object.prototype.hasOwnProperty.call(ct,cY)){cE+="&"+cY+"="+ct[cY]}}var c4=[];if(cZ){for(cY in cZ){if(Object.prototype.hasOwnProperty.call(cZ,cY)&&/^dimension\d+$/.test(cY)){var cI=cY.replace("dimension","");c4.push(parseInt(cI,10));c4.push(String(cI));cE+="&"+cY+"="+cZ[cY];delete cZ[cY]}}}if(cZ&&u(cZ)){cZ=null}for(cY in aY){if(Object.prototype.hasOwnProperty.call(aY,cY)){var cO=(-1===E(c4,cY));if(cO){cE+="&dimension"+cY+"="+aY[cY]}}}if(cZ){cE+="&data="+n(JSON2.stringify(cZ))}else{if(ac){cE+="&data="+n(JSON2.stringify(ac))}}function cL(c6,c7){var c8=JSON2.stringify(c6);if(c8.length>2){return"&"+c7+"="+n(c8)}return""}var c3=cB(bs);var cU=cB(bR);cE+=cL(c3,"cvar");cE+=cL(cU,"e_cvar");if(ax){cE+=cL(ax,"_cvar");for(cY in cV){if(Object.prototype.hasOwnProperty.call(cV,cY)){if(ax[cY][0]===""||ax[cY][1]===""){delete ax[cY]}}}if(bn){cy(cQ,JSON2.stringify(ax),bU,a1,cl)}}if(aI){if(bS){cE+="&gt_ms="+bS}else{if(g&&g.timing&&g.timing.requestStart&&g.timing.responseEnd){cE+="&gt_ms="+(g.timing.responseEnd-g.timing.requestStart)
+}}}cS.lastEcommerceOrderTs=B(cF)&&String(cF).length?cF:cS.lastEcommerceOrderTs;at(cS);bJ();cE+=S(c0);if(cn.length){cE+="&"+cn}if(t(bH)){cE=bH(cE)}return cE}bo=function aM(){var cC=new Date();if(cm+aL<=cC.getTime()){var cD=bX("ping=1",null,"ping");bd(cD,bg);return true}return false};function a2(cF,cE,cK,cG,cC,cN){var cI="idgoal=0",cJ,cD=new Date(),cL=[],cM,cH=String(cF).length;if(cH){cI+="&ec_id="+n(cF);cJ=Math.round(cD.getTime()/1000)}cI+="&revenue="+cE;if(String(cK).length){cI+="&ec_st="+cK}if(String(cG).length){cI+="&ec_tx="+cG}if(String(cC).length){cI+="&ec_sh="+cC}if(String(cN).length){cI+="&ec_dt="+cN}if(co){for(cM in co){if(Object.prototype.hasOwnProperty.call(co,cM)){if(!B(co[cM][1])){co[cM][1]=""}if(!B(co[cM][2])){co[cM][2]=""}if(!B(co[cM][3])||String(co[cM][3]).length===0){co[cM][3]=0}if(!B(co[cM][4])||String(co[cM][4]).length===0){co[cM][4]=1}cL.push(co[cM])}}cI+="&ec_items="+n(JSON2.stringify(cL))}cI=bX(cI,ac,"ecommerce",cJ);bd(cI,bg);if(cH){co={}}}function bv(cC,cG,cF,cE,cD,cH){if(String(cC).length&&B(cG)){a2(cC,cG,cF,cE,cD,cH)
+}}function a3(cC){if(B(cC)){a2("",cC,"","","","")}}function bw(cD,cF,cE){var cC=bX("action_name="+n(ab(cD||aV)),cF,"log");bd(cC,bg,cE)}function aG(cE,cD){var cF,cC="(^| )(piwik[_-]"+cD;if(cE){for(cF=0;cF<cE.length;cF++){cC+="|"+cE[cF]}}cC+=")( |$)";return new RegExp(cC)}function aB(cC){return(am&&cC&&0===String(cC).indexOf(am))}function bY(cG,cC,cH,cD){if(aB(cC)){return 0}var cF=aG(bi,"download"),cE=aG(aN,"link"),cI=new RegExp("\\.("+cs.join("|")+")([?&#]|$)","i");if(cE.test(cG)){return"link"}if(cD||cF.test(cG)||cI.test(cC)){return"download"}if(cH){return 0}return"link"}function ag(cD){var cC;cC=cD.parentNode;while(cC!==null&&B(cC)){if(U.isLinkElement(cD)){break}cD=cC;cC=cD.parentNode}return cD}function cw(cH){cH=ag(cH);if(!U.hasNodeAttribute(cH,"href")){return}if(!B(cH.href)){return}var cG=U.getAttributeValueFromNode(cH,"href");if(aB(cG)){return}var cD=cH.pathname||bQ(cH.href);var cI=cH.hostname||c(cH.href);var cJ=cI.toLowerCase();var cE=cH.href.replace(cI,cJ);var cF=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");
+if(!cF.test(cE)){var cC=bY(cH.className,cE,af(cJ,cD),U.hasNodeAttribute(cH,"download"));if(cC){return{type:cC,href:cE}}}}function aw(cC,cD,cE,cF){var cG=p.buildInteractionRequestParams(cC,cD,cE,cF);if(!cG){return}return bX(cG,null,"contentInteraction")}function cc(cE,cF,cJ,cC,cD){if(!B(cE)){return}if(aB(cE)){return cE}var cH=p.toAbsoluteUrl(cE);var cG="redirecturl="+n(cH)+"&";cG+=aw(cF,cJ,cC,(cD||cE));var cI="&";if(am.indexOf("?")<0){cI="?"}return am+cI+cG}function aQ(cC,cD){if(!cC||!cD){return false}var cE=p.findTargetNode(cC);if(p.shouldIgnoreInteraction(cE)){return false}cE=p.findTargetNodeNoDefault(cC);if(cE&&!M(cE,cD)){return false}return true}function bZ(cE,cD,cG){if(!cE){return}var cC=p.findParentContentNode(cE);if(!cC){return}if(!aQ(cC,cE)){return}var cF=p.buildContentBlock(cC);if(!cF){return}if(!cF.target&&cG){cF.target=cG}return p.buildInteractionRequestParams(cD,cF.name,cF.piece,cF.target)}function aD(cD){if(!bG||!bG.length){return false}var cC,cE;for(cC=0;cC<bG.length;cC++){cE=bG[cC];
+if(cE&&cE.name===cD.name&&cE.piece===cD.piece&&cE.target===cD.target){return true}}return false}function bc(cF){if(!cF){return false}var cI=p.findTargetNode(cF);if(!cI||p.shouldIgnoreInteraction(cI)){return false}var cJ=cw(cI);if(cu&&cJ&&cJ.type){return false}if(U.isLinkElement(cI)&&U.hasNodeAttributeWithValue(cI,"href")){var cC=String(U.getAttributeValueFromNode(cI,"href"));if(0===cC.indexOf("#")){return false}if(aB(cC)){return true}if(!p.isUrlToCurrentDomain(cC)){return false}var cG=p.buildContentBlock(cF);if(!cG){return}var cE=cG.name;var cK=cG.piece;var cH=cG.target;if(!U.hasNodeAttributeWithValue(cI,p.CONTENT_TARGET_ATTR)||cI.wasContentTargetAttrReplaced){cI.wasContentTargetAttrReplaced=true;cH=p.toAbsoluteUrl(cC);U.setAnyAttribute(cI,p.CONTENT_TARGET_ATTR,cH)}var cD=cc(cC,"click",cE,cK,cH);p.setHrefAttribute(cI,cD);return true}return false}function au(cD){if(!cD||!cD.length){return}var cC;for(cC=0;cC<cD.length;cC++){bc(cD[cC])}}function aF(cC){return function(cD){if(!cC){return}var cG=p.findParentContentNode(cC);
+var cH;if(cD){cH=cD.target||cD.srcElement}if(!cH){cH=cC}if(!aQ(cG,cH)){return}bM(bg);if(U.isLinkElement(cC)&&U.hasNodeAttributeWithValue(cC,"href")&&U.hasNodeAttributeWithValue(cC,p.CONTENT_TARGET_ATTR)){var cE=U.getAttributeValueFromNode(cC,"href");if(!aB(cE)&&cC.wasContentTargetAttrReplaced){U.setAnyAttribute(cC,p.CONTENT_TARGET_ATTR,"")}}var cL=cw(cC);if(ad&&cL&&cL.type){return cL.type}if(bc(cG)){return"href"}var cI=p.buildContentBlock(cG);if(!cI){return}var cF=cI.name;var cM=cI.piece;var cK=cI.target;var cJ=aw("click",cF,cM,cK);bd(cJ,bg);return cJ}}function bx(cE){if(!cE||!cE.length){return}var cC,cD;for(cC=0;cC<cE.length;cC++){cD=p.findTargetNode(cE[cC]);if(cD&&!cD.contentInteractionTrackingSetupDone){cD.contentInteractionTrackingSetupDone=true;aa(cD,"click",aF(cD))}}}function a7(cE,cF){if(!cE||!cE.length){return[]}var cC,cD;for(cC=0;cC<cE.length;cC++){if(aD(cE[cC])){cE.splice(cC,1);cC--}else{bG.push(cE[cC])}}if(!cE||!cE.length){return[]}au(cF);bx(cF);var cG=[];for(cC=0;cC<cE.length;
+cC++){cD=bX(p.buildImpressionRequestParams(cE[cC].name,cE[cC].piece,cE[cC].target),undefined,"contentImpressions");if(cD){cG.push(cD)}}return cG}function b3(cD){var cC=p.collectContent(cD);return a7(cC,cD)}function aO(cD){if(!cD||!cD.length){return[]}var cC;for(cC=0;cC<cD.length;cC++){if(!p.isNodeVisible(cD[cC])){cD.splice(cC,1);cC--}}if(!cD||!cD.length){return[]}return b3(cD)}function ao(cE,cC,cD){var cF=p.buildImpressionRequestParams(cE,cC,cD);return bX(cF,null,"contentImpression")}function cx(cF,cD){if(!cF){return}var cC=p.findParentContentNode(cF);var cE=p.buildContentBlock(cC);if(!cE){return}if(!cD){cD="Unknown"}return aw(cD,cE.name,cE.piece,cE.target)}function ce(cD,cF,cC,cE){return"e_c="+n(cD)+"&e_a="+n(cF)+(B(cC)?"&e_n="+n(cC):"")+(B(cE)?"&e_v="+n(cE):"")}function ah(cE,cG,cC,cF,cH){if(String(cE).length===0||String(cG).length===0){return false}var cD=bX(ce(cE,cG,cC,cF),cH,"event");bd(cD,bg)}function bF(cC,cF,cD,cG){var cE=bX("search="+n(cC)+(cF?"&search_cat="+n(cF):"")+(B(cD)?"&search_count="+cD:""),cG,"sitesearch");
+bd(cE,bg)}function ci(cC,cF,cE){var cD=bX("idgoal="+cC+(cF?"&revenue="+cF:""),cE,"goal");bd(cD,bg)}function cp(cF,cC,cJ,cI,cE){var cH=cC+"="+n(by(cF));var cD=bZ(cE,"click",cF);if(cD){cH+="&"+cD}var cG=bX(cH,cJ,"link");bd(cG,(cI?0:bg),cI)}function bp(cD,cC){if(cD!==""){return cD+cC.charAt(0).toUpperCase()+cC.slice(1)}return cC}function bN(cH){var cG,cC,cF=["","webkit","ms","moz"],cE;if(!aT){for(cC=0;cC<cF.length;cC++){cE=cF[cC];if(Object.prototype.hasOwnProperty.call(y,bp(cE,"hidden"))){if(y[bp(cE,"visibilityState")]==="prerender"){cG=true}break}}}if(cG){aa(y,cE+"visibilitychange",function cD(){y.removeEventListener(cE+"visibilitychange",cD,false);cH()});return}cH()}function ar(cC){if(y.readyState==="complete"){cC()}else{if(L.addEventListener){L.addEventListener("load",cC)}else{if(L.attachEvent){L.attachEvent("onload",cC)}}}}function aR(cF){var cC=false;if(y.attachEvent){cC=y.readyState==="complete"}else{cC=y.readyState!=="loading"}if(cC){cF();return}var cE;if(y.addEventListener){aa(y,"DOMContentLoaded",function cD(){y.removeEventListener("DOMContentLoaded",cD,false);
+if(!cC){cC=true;cF()}})}else{if(y.attachEvent){y.attachEvent("onreadystatechange",function cD(){if(y.readyState==="complete"){y.detachEvent("onreadystatechange",cD);if(!cC){cC=true;cF()}}});if(y.documentElement.doScroll&&L===L.top){(function cD(){if(!cC){try{y.documentElement.doScroll("left")}catch(cG){setTimeout(cD,0);return}cC=true;cF()}}())}}}aa(L,"load",function(){if(!cC){cC=true;cF()}},false)}function b9(cC){var cD=cw(cC);if(cD&&cD.type){cD.href=k(cD.href);cp(cD.href,cD.type,undefined,null,cC)}}function b1(){return y.all&&!y.addEventListener}function ck(cC){var cE=cC.which;var cD=(typeof cC.button);if(!cE&&cD!=="undefined"){if(b1()){if(cC.button&1){cE=1}else{if(cC.button&2){cE=3}else{if(cC.button&4){cE=2}}}}else{if(cC.button===0||cC.button==="0"){cE=1}else{if(cC.button&1){cE=2}else{if(cC.button&2){cE=3}}}}}return cE}function bq(cC){switch(ck(cC)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function aH(cC){return cC.target||cC.srcElement}function ak(cC){return function(cF){cF=cF||L.event;
+var cE=bq(cF);var cG=aH(cF);if(cF.type==="click"){var cD=false;if(cC&&cE==="middle"){cD=true}if(cG&&!cD){b9(cG)}}else{if(cF.type==="mousedown"){if(cE==="middle"&&cG){ay=cE;ba=cG}else{ay=ba=null}}else{if(cF.type==="mouseup"){if(cE===ay&&cG===ba){b9(cG)}ay=ba=null}else{if(cF.type==="contextmenu"){b9(cG)}}}}}}function ae(cD,cC){aa(cD,"click",ak(cC),false);if(cC){aa(cD,"mouseup",ak(cC),false);aa(cD,"mousedown",ak(cC),false);aa(cD,"contextmenu",ak(cC),false)}}function bb(cD){if(!ad){ad=true;var cE,cC=aG(a9,"ignore"),cF=y.links;if(cF){for(cE=0;cE<cF.length;cE++){if(!cC.test(cF[cE].className)){ae(cF[cE],cD)}}}}}function az(cE,cG,cH){if(bL){return true}bL=true;var cI=false;var cF,cD;function cC(){cI=true}ar(function(){function cJ(cL){setTimeout(function(){if(!bL){return}cI=false;cH.trackVisibleContentImpressions();cJ(cL)},cL)}function cK(cL){setTimeout(function(){if(!bL){return}if(cI){cI=false;cH.trackVisibleContentImpressions()}cK(cL)},cL)}if(cE){cF=["scroll","resize"];for(cD=0;cD<cF.length;cD++){if(y.addEventListener){y.addEventListener(cF[cD],cC)
+}else{L.attachEvent("on"+cF[cD],cC)}}cK(100)}if(cG&&cG>0){cG=parseInt(cG,10);cJ(cG)}})}function b7(){var cD,cF,cG={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(f.userAgent))){if(f.mimeTypes&&f.mimeTypes.length){for(cD in cG){if(Object.prototype.hasOwnProperty.call(cG,cD)){cF=f.mimeTypes[cG[cD]];ct[cD]=(cF&&cF.enabledPlugin)?"1":"0"}}}if(typeof navigator.javaEnabled!=="unknown"&&B(f.javaEnabled)&&f.javaEnabled()){ct.java="1"}if(t(L.GearsFactory)){ct.gears="1"}ct.cookie=bB()}var cE=parseInt(P.width,10);var cC=parseInt(P.height,10);ct.res=parseInt(cE,10)+"x"+parseInt(cC,10)}b7();aU();at();this.getVisitorId=function(){return aE().uuid};this.getVisitorInfo=function(){return cd()};this.getAttributionInfo=function(){return bj()};this.getAttributionCampaignName=function(){return bj()[0]
+};this.getAttributionCampaignKeyword=function(){return bj()[1]};this.getAttributionReferrerTimestamp=function(){return bj()[2]};this.getAttributionReferrerUrl=function(){return bj()[3]};this.setTrackerUrl=function(cC){am=cC};this.getTrackerUrl=function(){return am};this.addTracker=function(cC,cE){if(!cE){throw new Error("A siteId must be given to add a new tracker")}if(!B(cC)||null===cC){cC=this.getTrackerUrl()}var cD=new I(cC,cE);A.push(cD);return cD};this.getSiteId=function(){return bC};this.setSiteId=function(cC){bz(cC)};this.setUserId=function(cC){if(!B(cC)||!cC.length){return}a8=cC;bl=bD(a8).substr(0,16)};this.getUserId=function(){return a8};this.setCustomData=function(cC,cD){if(O(cC)){ac=cC}else{if(!ac){ac={}}ac[cC]=cD}};this.getCustomData=function(){return ac};this.setCustomRequestProcessing=function(cC){bH=cC};this.appendToTrackingUrl=function(cC){cn=cC};this.getRequest=function(cC){return bX(cC)};this.addPlugin=function(cC,cD){a[cC]=cD};this.setCustomDimension=function(cC,cD){cC=parseInt(cC,10);
+if(cC>0){if(!B(cD)){cD=""}if(!q(cD)){cD=String(cD)}aY[cC]=cD}};this.getCustomDimension=function(cC){cC=parseInt(cC,10);if(cC>0&&Object.prototype.hasOwnProperty.call(aY,cC)){return aY[cC]}};this.deleteCustomDimension=function(cC){cC=parseInt(cC,10);if(cC>0){delete aY[cC]}};this.setCustomVariable=function(cD,cC,cG,cE){var cF;if(!B(cE)){cE="visit"}if(!B(cC)){return}if(!B(cG)){cG=""}if(cD>0){cC=!q(cC)?String(cC):cC;cG=!q(cG)?String(cG):cG;cF=[cC.slice(0,a4),cG.slice(0,a4)];if(cE==="visit"||cE===2){b6();ax[cD]=cF}else{if(cE==="page"||cE===3){bs[cD]=cF}else{if(cE==="event"){bR[cD]=cF}}}}};this.getCustomVariable=function(cD,cE){var cC;if(!B(cE)){cE="visit"}if(cE==="page"||cE===3){cC=bs[cD]}else{if(cE==="event"){cC=bR[cD]}else{if(cE==="visit"||cE===2){b6();cC=ax[cD]}}}if(!B(cC)||(cC&&cC[0]==="")){return false}return cC};this.deleteCustomVariable=function(cC,cD){if(this.getCustomVariable(cC,cD)){this.setCustomVariable(cC,"","",cD)}};this.storeCustomVariablesInCookie=function(){bn=true};this.setLinkTrackingTimer=function(cC){bg=cC
+};this.setDownloadExtensions=function(cC){if(q(cC)){cC=cC.split("|")}cs=cC};this.addDownloadExtensions=function(cD){var cC;if(q(cD)){cD=cD.split("|")}for(cC=0;cC<cD.length;cC++){cs.push(cD[cC])}};this.removeDownloadExtensions=function(cE){var cD,cC=[];if(q(cE)){cE=cE.split("|")}for(cD=0;cD<cs.length;cD++){if(E(cE,cs[cD])===-1){cC.push(cs[cD])}}cs=cC};this.setDomains=function(cC){ai=q(cC)?[cC]:cC;var cG=false,cE=0,cD;for(cE;cE<ai.length;cE++){cD=String(ai[cE]);if(b8(cj,D(cD))){cG=true;break}var cF=bQ(cD);if(cF&&cF!=="/"&&cF!=="/*"){cG=true;break}}if(!cG){ai.push(cj)}};this.setIgnoreClasses=function(cC){a9=q(cC)?[cC]:cC};this.setRequestMethod=function(cC){cv=cC||bO};this.setRequestContentType=function(cC){b0=cC||aq};this.setReferrerUrl=function(cC){aZ=cC};this.setCustomUrl=function(cC){aK=br(bk,cC)};this.setDocumentTitle=function(cC){aV=cC};this.setAPIUrl=function(cC){bf=cC};this.setDownloadClasses=function(cC){bi=q(cC)?[cC]:cC};this.setLinkClasses=function(cC){aN=q(cC)?[cC]:cC};this.setCampaignNameKey=function(cC){bW=q(cC)?[cC]:cC
+};this.setCampaignKeywordKey=function(cC){be=q(cC)?[cC]:cC};this.discardHashTag=function(cC){bm=cC};this.setCookieNamePrefix=function(cC){aW=cC;ax=bt()};this.setCookieDomain=function(cC){var cD=D(cC);if(a6(cD)){cl=cD;aU()}};this.setCookiePath=function(cC){a1=cC;aU()};this.setVisitorCookieTimeout=function(cC){cb=cC*1000};this.setSessionCookieTimeout=function(cC){bU=cC*1000};this.setReferralCookieTimeout=function(cC){cr=cC*1000};this.setConversionAttributionFirstReferrer=function(cC){a5=cC};this.disableCookies=function(){aX=true;ct.cookie="0";if(bC){an()}};this.deleteCookies=function(){an()};this.setDoNotTrack=function(cD){var cC=f.doNotTrack||f.msDoNotTrack;cf=cD&&(cC==="yes"||cC==="1");if(cf){this.disableCookies()}};this.addListener=function(cD,cC){ae(cD,cC)};this.enableLinkTracking=function(cC){cu=true;bN(function(){aR(function(){bb(cC)})})};this.enableJSErrorTracking=function(){if(ch){return}ch=true;var cC=L.onerror;L.onerror=function(cH,cF,cE,cG,cD){bN(function(){var cI="JavaScript Errors";
+var cJ=cF+":"+cE;if(cG){cJ+=":"+cG}ah(cI,cJ,cH)});if(cC){return cC(cH,cF,cE,cG,cD)}return false}};this.disablePerformanceTracking=function(){aI=false};this.setGenerationTimeMs=function(cC){bS=parseInt(cC,10)};this.enableHeartBeatTimer=function(cC){cC=Math.max(cC,1);aL=(cC||15)*1000;if(cm!==null){cA()}};this.killFrame=function(){if(L.location!==L.top.location){L.top.location=L.location}};this.redirectFile=function(cC){if(L.location.protocol==="file:"){L.location=cC}};this.setCountPreRendered=function(cC){aT=cC};this.trackGoal=function(cC,cE,cD){bN(function(){ci(cC,cE,cD)})};this.trackLink=function(cD,cC,cF,cE){bN(function(){cp(cD,cC,cF,cE)})};this.trackPageView=function(cC,cE,cD){bG=[];if(F(bC)){bN(function(){Q(am,bf,bC)})}else{bN(function(){bw(cC,cE,cD)})}};this.trackAllContentImpressions=function(){if(F(bC)){return}bN(function(){aR(function(){var cC=p.findContentNodes();var cD=b3(cC);cz(cD,bg)})})};this.trackVisibleContentImpressions=function(cC,cD){if(F(bC)){return}if(!B(cC)){cC=true}if(!B(cD)){cD=750
+}az(cC,cD,this);bN(function(){ar(function(){var cE=p.findContentNodes();var cF=aO(cE);cz(cF,bg)})})};this.trackContentImpression=function(cE,cC,cD){if(F(bC)){return}if(!cE){return}cC=cC||"Unknown";bN(function(){var cF=ao(cE,cC,cD);bd(cF,bg)})};this.trackContentImpressionsWithinNode=function(cC){if(F(bC)||!cC){return}bN(function(){if(bL){ar(function(){var cD=p.findContentNodesWithinNode(cC);var cE=aO(cD);cz(cE,bg)})}else{aR(function(){var cD=p.findContentNodesWithinNode(cC);var cE=b3(cD);cz(cE,bg)})}})};this.trackContentInteraction=function(cE,cF,cC,cD){if(F(bC)){return}if(!cE||!cF){return}cC=cC||"Unknown";bN(function(){var cG=aw(cE,cF,cC,cD);bd(cG,bg)})};this.trackContentInteractionNode=function(cD,cC){if(F(bC)||!cD){return}bN(function(){var cE=cx(cD,cC);bd(cE,bg)})};this.logAllContentBlocksOnPage=function(){var cD=p.findContentNodes();var cC=p.collectContent(cD);if(console!==undefined&&console&&console.log){console.log(cC)}};this.trackEvent=function(cD,cF,cC,cE,cG){bN(function(){ah(cD,cF,cC,cE,cG)
+})};this.trackSiteSearch=function(cC,cE,cD,cF){bN(function(){bF(cC,cE,cD,cF)})};this.setEcommerceView=function(cF,cC,cE,cD){if(!B(cE)||!cE.length){cE=""}else{if(cE instanceof Array){cE=JSON2.stringify(cE)}}bs[5]=["_pkc",cE];if(B(cD)&&String(cD).length){bs[2]=["_pkp",cD]}if((!B(cF)||!cF.length)&&(!B(cC)||!cC.length)){return}if(B(cF)&&cF.length){bs[3]=["_pks",cF]}if(!B(cC)||!cC.length){cC=""}bs[4]=["_pkn",cC]};this.addEcommerceItem=function(cG,cC,cE,cD,cF){if(cG.length){co[cG]=[cG,cC,cE,cD,cF]}};this.trackEcommerceOrder=function(cC,cG,cF,cE,cD,cH){bv(cC,cG,cF,cE,cD,cH)};this.trackEcommerceCartUpdate=function(cC){a3(cC)};this.trackRequest=function(cC,cE,cD){bN(function(){var cF=bX(cC,cE);bd(cF,bg,cD)})};d.trigger("TrackerSetup",[this])}function z(){return{push:V}}function b(ah,ag){var ai={};var ae,af;for(ae=0;ae<ag.length;ae++){var ac=ag[ae];ai[ac]=1;for(af=0;af<ah.length;af++){if(ah[af]&&ah[af][0]){var ad=ah[af][0];if(ac===ad){V(ah[af]);delete ah[af];if(ai[ad]>1){Y("The method "+ad+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: http://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')
+}ai[ad]++}}}}return ah}var v=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","enableLinkTracking"];function T(ac,ae){var ad=new I(ac,ae);A.push(ad);_paq=b(_paq,v);for(x=0;x<_paq.length;x++){if(_paq[x]){V(_paq[x])}}_paq=new z();return ad}aa(L,"beforeunload",W,false);Date.prototype.getTimeAlias=Date.prototype.getTime;d={initialized:false,on:function(ad,ac){if(!r[ad]){r[ad]=[]}r[ad].push(ac)},off:function(ae,ad){if(!r[ae]){return}var ac=0;for(ac;ac<r[ae].length;ac++){if(r[ae][ac]===ad){delete r[ae][ac]}}},trigger:function(ae,af,ad){if(!r[ae]){return}var ac=0;for(ac;ac<r[ae].length;ac++){r[ae][ac].apply(ad||L,af)}},addPlugin:function(ac,ad){a[ac]=ad},getTracker:function(ac,ad){if(!B(ad)){ad=this.getAsyncTracker().getSiteId()}if(!B(ac)){ac=this.getAsyncTracker().getTrackerUrl()}return new I(ac,ad)},getAsyncTrackers:function(){return A},addTracker:function(ac,ad){if(!A.length){T(ac,ad)}else{A[0].addTracker(ac,ad)
+}},getAsyncTracker:function(ad,ag){var af;if(A&&A[0]){af=A[0]}if(!ag&&!ad){return af}if((!B(ag)||null===ag)&&af){ag=af.getSiteId()}if((!B(ad)||null===ad)&&af){ad=af.getTrackerUrl()}var ae,ac=0;for(ac;ac<A.length;ac++){ae=A[ac];if(ae&&String(ae.getSiteId())===String(ag)&&ae.getTrackerUrl()===ad){return ae}}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return d})}return d}());
+/*!!! pluginTrackerHook */
+}(function(){if(window&&"object"===typeof window.piwikPluginAsyncInit&&window.piwikPluginAsyncInit.length){var a=0;for(a;a<window.piwikPluginAsyncInit.length;a++){if(typeof window.piwikPluginAsyncInit[a]==="function"){window.piwikPluginAsyncInit[a]()}}}window.Piwik.addTracker();window.Piwik.trigger("PiwikInitialized",[]);window.Piwik.initialized=true}());if(window&&window.piwikAsyncInit){window.piwikAsyncInit()}(function(){var a=(typeof AnalyticsTracker);if(a==="undefined"){AnalyticsTracker=window.Piwik}}());if(typeof piwik_log!=="function"){piwik_log=function(b,f,d,g){function a(h){try{if(window["piwik_"+h]){return window["piwik_"+h]
+}}catch(i){}return}var c,e=window.Piwik.getTracker(d,f);e.setDocumentTitle(b);e.setCustomData(g);c=a("tracker_pause");if(c){e.setLinkTrackingTimer(c)}c=a("download_extensions");if(c){e.setDownloadExtensions(c)}c=a("hosts_alias");if(c){e.setDomains(c)}c=a("ignore_classes");if(c){e.setIgnoreClasses(c)}e.trackPageView();if(a("install_tracker")){piwik_track=function(i,k,j,h){e.setSiteId(k);e.setTrackerUrl(j);e.trackLink(i,h)};e.enableLinkTracking()}};
/*!! @license-end */
}; \ No newline at end of file
diff --git a/piwik.php b/piwik.php
index f3e0ba934a..29237a8e33 100644
--- a/piwik.php
+++ b/piwik.php
@@ -31,6 +31,7 @@ require_once PIWIK_INCLUDE_PATH . '/core/bootstrap.php';
@ignore_user_abort(true);
require_once PIWIK_INCLUDE_PATH . '/core/Plugin/Controller.php';
+require_once PIWIK_INCLUDE_PATH . '/core/Exception/NotYetInstalledException.php';
require_once PIWIK_INCLUDE_PATH . '/core/Plugin/ControllerAdmin.php';
require_once PIWIK_INCLUDE_PATH . '/core/Singleton.php';
require_once PIWIK_INCLUDE_PATH . '/core/Plugin/Manager.php';
@@ -49,11 +50,14 @@ require_once PIWIK_INCLUDE_PATH . '/core/Tracker/Cache.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/Request.php';
require_once PIWIK_INCLUDE_PATH . '/core/Cookie.php';
-// TODO should move to Tracker application class later. currently needed for environment validation.
SettingsServer::setIsTrackerApiRequest();
$environment = new \Piwik\Application\Environment('tracker');
-$environment->init();
+try {
+ $environment->init();
+} catch(\Piwik\Exception\NotYetInstalledException $e) {
+ die($e->getMessage());
+}
Tracker::loadTrackerEnvironment();
diff --git a/plugins/API/API.php b/plugins/API/API.php
index beb330fd07..a3a9b4fb02 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -83,7 +83,7 @@ class API extends \Piwik\Plugin\API
}
/**
- * Returns the most accurate IP address availble for the current user, in
+ * Returns the most accurate IP address available for the current user, in
* IPv4 format. This could be the proxy client's IP address.
*
* @return string IP address in presentation format.
diff --git a/plugins/API/Renderer/Console.php b/plugins/API/Renderer/Console.php
index 40794ef8e9..98e3d01d1f 100644
--- a/plugins/API/Renderer/Console.php
+++ b/plugins/API/Renderer/Console.php
@@ -16,7 +16,12 @@ use Piwik\DataTable;
class Console extends ApiRenderer
{
- public function renderException($message, \Exception $exception)
+ /**
+ * @param $message
+ * @param Exception|\Throwable $exception
+ * @return string
+ */
+ public function renderException($message, $exception)
{
self::sendHeader();
diff --git a/plugins/API/Renderer/Csv.php b/plugins/API/Renderer/Csv.php
index 468a3a2588..77caa50bce 100644
--- a/plugins/API/Renderer/Csv.php
+++ b/plugins/API/Renderer/Csv.php
@@ -23,7 +23,12 @@ class Csv extends ApiRenderer
return "message\n" . $message;
}
- public function renderException($message, \Exception $exception)
+ /**
+ * @param $message
+ * @param Exception|\Throwable $exception
+ * @return string
+ */
+ public function renderException($message, $exception)
{
Common::sendHeader('Content-Type: text/html; charset=utf-8', true);
return 'Error: ' . $message;
diff --git a/plugins/API/Renderer/Html.php b/plugins/API/Renderer/Html.php
index 4037c35b4e..48acbb355f 100644
--- a/plugins/API/Renderer/Html.php
+++ b/plugins/API/Renderer/Html.php
@@ -16,7 +16,12 @@ use Piwik\DataTable;
class Html extends ApiRenderer
{
- public function renderException($message, \Exception $exception)
+ /**
+ * @param $message
+ * @param Exception|\Throwable $exception
+ * @return string
+ */
+ public function renderException($message, $exception)
{
Common::sendHeader('Content-Type: text/plain; charset=utf-8', true);
diff --git a/plugins/API/Renderer/Json.php b/plugins/API/Renderer/Json.php
index 1dffa1f45f..5037b30fbe 100644
--- a/plugins/API/Renderer/Json.php
+++ b/plugins/API/Renderer/Json.php
@@ -31,7 +31,12 @@ class Json extends ApiRenderer
return $this->applyJsonpIfNeeded($result);
}
- public function renderException($message, \Exception $exception)
+ /**
+ * @param $message
+ * @param Exception|\Throwable $exception
+ * @return string
+ */
+ public function renderException($message, $exception)
{
$exceptionMessage = str_replace(array("\r\n", "\n"), "", $message);
diff --git a/plugins/API/Renderer/Original.php b/plugins/API/Renderer/Original.php
index a0730acf2b..96895b8012 100644
--- a/plugins/API/Renderer/Original.php
+++ b/plugins/API/Renderer/Original.php
@@ -18,7 +18,13 @@ class Original extends ApiRenderer
return true;
}
- public function renderException($message, \Exception $exception)
+ /**
+ * @param $message
+ * @param \Exception|\Throwable $exception
+ * @throws \Exception|\Throwable
+ * @return void
+ */
+ public function renderException($message, $exception)
{
throw $exception;
}
diff --git a/plugins/API/Renderer/Php.php b/plugins/API/Renderer/Php.php
index 81a512122d..5823137569 100644
--- a/plugins/API/Renderer/Php.php
+++ b/plugins/API/Renderer/Php.php
@@ -23,7 +23,12 @@ class Php extends ApiRenderer
return $this->serializeIfNeeded($success);
}
- public function renderException($message, \Exception $exception)
+ /**
+ * @param $message
+ * @param Exception|\Throwable $exception
+ * @return string
+ */
+ public function renderException($message, $exception)
{
$message = array('result' => 'error', 'message' => $message);
diff --git a/plugins/API/Renderer/Rss.php b/plugins/API/Renderer/Rss.php
index 3ee1c287bc..5bbcac78aa 100644
--- a/plugins/API/Renderer/Rss.php
+++ b/plugins/API/Renderer/Rss.php
@@ -16,7 +16,12 @@ use Piwik\DataTable;
class Rss extends ApiRenderer
{
- public function renderException($message, \Exception $exception)
+ /**
+ * @param $message
+ * @param \Exception|\Throwable $exception
+ * @return string
+ */
+ public function renderException($message, $exception)
{
self::sendHeader('plain');
diff --git a/plugins/API/Renderer/Xml.php b/plugins/API/Renderer/Xml.php
index 99092ee057..4a1f0247d7 100644
--- a/plugins/API/Renderer/Xml.php
+++ b/plugins/API/Renderer/Xml.php
@@ -24,7 +24,12 @@ class Xml extends ApiRenderer
"</result>";
}
- public function renderException($message, \Exception $exception)
+ /**
+ * @param $message
+ * @param \Exception|\Throwable $exception
+ * @return string
+ */
+ public function renderException($message, $exception)
{
return '<?xml version="1.0" encoding="utf-8" ?>' . "\n" .
"<result>\n" .
diff --git a/plugins/API/RowEvolution.php b/plugins/API/RowEvolution.php
index b8afec8e39..f7af6b93b1 100644
--- a/plugins/API/RowEvolution.php
+++ b/plugins/API/RowEvolution.php
@@ -209,7 +209,7 @@ class RowEvolution
$result = str_replace(LabelFilter::SEPARATOR_RECURSIVE_LABEL, ' - ', $label);
}
- // remove @ terminal operator occurances
+ // remove @ terminal operator occurrences
return str_replace(LabelFilter::TERMINAL_OPERATOR, '', $result);
}
diff --git a/plugins/API/lang/es.json b/plugins/API/lang/es.json
index ee7308033f..e35219972b 100644
--- a/plugins/API/lang/es.json
+++ b/plugins/API/lang/es.json
@@ -1,6 +1,6 @@
{
"API": {
- "GenerateVisits": "Si no tiene los datos de hoy puede generar primero algunos datos mediante el complemento %1$s. Puede habilitar el complemento %2$s, a continuación, haga clic en el menú 'Generador de Visitas' en la area Administrativa de Piwik.",
+ "GenerateVisits": "Si no tiene los datos de hoy puede generar primero algunos datos mediante el complemento %1$s. Puede habilitar el complemento %2$s, a continuación, haga clic en el menú 'Generador de Visitas' en el área Administrativa de Piwik.",
"KeepTokenSecret": "Este token_auth es tan secreto como su nombre de usuario y contraseña, %1$s no lo comparta %2$s!",
"LoadedAPIs": "Se han cargado %s APIs exitosamente",
"MoreInformation": "Para mayor información acerca de las APIs de Piwik, por favor lea la %1$s Introducción a las API Piwik %2$s y la %3$s Referencia de las API Piwik %4$s.",
@@ -8,6 +8,7 @@
"ReportingApiReference": "Informando Referencia API",
"TopLinkTooltip": "Acceda a sus datos de análisis de internet programáticamente, a través de una sencilla API en json, xml, etc.",
"UserAuthentication": "Autenticación de usuario",
- "UsingTokenAuth": "Si quieres %1$s solicitar datos dentro de un script, un crontab, etc. %2$s tiene que agregar el parámetro %3$s a las llamadas a la URL de la API que requieren autenticación."
+ "UsingTokenAuth": "Si quieres %1$s solicitar datos dentro de un script, un crontab, etc. %2$s tiene que agregar el parámetro %3$s a las llamadas a la URL de la API que requieren autenticación.",
+ "Glossary": "Glosario"
}
} \ No newline at end of file
diff --git a/plugins/API/lang/is.json b/plugins/API/lang/is.json
index 2c830e748b..46ede8ec71 100644
--- a/plugins/API/lang/is.json
+++ b/plugins/API/lang/is.json
@@ -1,11 +1,10 @@
{
"API": {
- "GenerateVisits": "Ef þú hefur ekki gögn dagsins í dag verður þú fyrst að búa til gögn með að nota %s íbótina. Virkjaðu %s íbótina og smelltu síðan á valmyndinni 'Gesta framleiðni' í Piwik umsjónarmanns svæðinu.",
- "KeepTokenSecret": "Þessi tókar auðkenning er eins leynd og þitt notendanafn og lykilorð %s deilið því ekki%s!",
+ "GenerateVisits": "Ef þú hefur ekki gögn dagsins í dag verður þú fyrst að búa til gögn með að nota %1$s íbótina. Virkjaðu %2$s íbótina og smelltu síðan á valmyndinni 'Gesta framleiðni' í Piwik umsjónarmanns svæðinu.",
+ "KeepTokenSecret": "Þessi tókar auðkenning er eins leynd og þitt notendanafn og lykilorð %1$s deilið því ekki%2$s!",
"LoadedAPIs": "Tókst að hlaða %s API",
- "MoreInformation": "Fyrir frekari upplýsingar um Piwik API, Vinsamlegast skoðið %s Inngangur að Piwik API %s og %s Piwik API Tilvísunir %s.",
- "QuickDocumentationTitle": "API hraðskjöl.",
+ "MoreInformation": "Fyrir frekari upplýsingar um Piwik API, Vinsamlegast skoðið %1$s Inngangur að Piwik API %2$s og %3$s Piwik API Tilvísunir %4$s.",
"UserAuthentication": "Notenda auðkenning",
- "UsingTokenAuth": "Ef þú vilt að %s biðji um gögn inn í skriftu eða crontab færslu osfv. %s verður þú að bæta við færibreytu %s til API kalls vefslóðir sem krefst auðkenningar."
+ "UsingTokenAuth": "Ef þú vilt að %1$s biðji um gögn inn í skriftu eða crontab færslu osfv. %2$s verður þú að bæta við færibreytu %3$s til API kalls vefslóðir sem krefst auðkenningar."
}
} \ No newline at end of file
diff --git a/plugins/API/lang/ka.json b/plugins/API/lang/ka.json
index 4d0e64c558..36947fd91e 100644
--- a/plugins/API/lang/ka.json
+++ b/plugins/API/lang/ka.json
@@ -1,11 +1,10 @@
{
"API": {
- "GenerateVisits": "თუ დღეისთვის არ გაქვთ მონაცემები, შეგიძლიათ ჯერ %s პლაგინის გამოყენებით დააგენერიროთ რამდენიმე მონაცემი. შეგიძლიათ ჩართოთ პლაგინი %s, შემდეგ Piwik ადმინისტრირების ზონაში დააწკაპუნოთ \"ვიზიტორების გენერატორი\" მენიუზე.",
- "KeepTokenSecret": "ეს token_auth ისევე საიდუმლოა, როგორც თქვენი მომხმარებლის სახელი და პაროლი, %s არავის გაუზიაროთ ის%s!",
+ "GenerateVisits": "თუ დღეისთვის არ გაქვთ მონაცემები, შეგიძლიათ ჯერ %1$s პლაგინის გამოყენებით დააგენერიროთ რამდენიმე მონაცემი. შეგიძლიათ ჩართოთ პლაგინი %2$s, შემდეგ Piwik ადმინისტრირების ზონაში დააწკაპუნოთ \"ვიზიტორების გენერატორი\" მენიუზე.",
+ "KeepTokenSecret": "ეს token_auth ისევე საიდუმლოა, როგორც თქვენი მომხმარებლის სახელი და პაროლი, %1$s არავის გაუზიაროთ ის%2$s!",
"LoadedAPIs": "%s API ფუნქციები წარმატებით ჩაიტვირთა",
- "MoreInformation": "Piwik API ფუნქციების შესახებ დამატებითი ინფორმაციისთვის გთხოვთ, გადახედოთ მასალებს %s Piwik API ფუნქციბის გამოყენების ინსტრუქცია %s და %s Piwik API ფუნქციების ცნობარი %s.",
- "QuickDocumentationTitle": "API ფუნქციების მოკლე დოკუმენტაცია",
+ "MoreInformation": "Piwik API ფუნქციების შესახებ დამატებითი ინფორმაციისთვის გთხოვთ, გადახედოთ მასალებს %1$s Piwik API ფუნქციბის გამოყენების ინსტრუქცია %2$s და %3$s Piwik API ფუნქციების ცნობარი %4$s.",
"UserAuthentication": "მომხმარებლის აუტენთიფიკაცია",
- "UsingTokenAuth": "თუ გსურთ %s გააკეთოთ მონაცემების მოთხოვნა სკრიპტიდან, crontab ფაილიდან და სხვ. %s თქვენ უნდა დაამატოთ %s პარამეტრი API ფუნქციის გამოძახების URL–ებს, რაც მოითხოვს აუტენთიფიკაციას."
+ "UsingTokenAuth": "თუ გსურთ %1$s გააკეთოთ მონაცემების მოთხოვნა სკრიპტიდან, crontab ფაილიდან და სხვ. %2$s თქვენ უნდა დაამატოთ %3$s პარამეტრი API ფუნქციის გამოძახების URL–ებს, რაც მოითხოვს აუტენთიფიკაციას."
}
} \ No newline at end of file
diff --git a/plugins/API/lang/sq.json b/plugins/API/lang/sq.json
index 2a364fc617..5c7bcb0f25 100644
--- a/plugins/API/lang/sq.json
+++ b/plugins/API/lang/sq.json
@@ -4,9 +4,12 @@
"KeepTokenSecret": "Ky token_auth është po aq i fshehtë sa të dhënat tuaja për hyrjen dhe fjalëkalimi juaj, %1$s mos ia jepni kujt%2$s!",
"LoadedAPIs": "U ngarkua me sukses API %s",
"MoreInformation": "Për më tepër të dhëna rreth API-ve të Piwik-ut, ju lutem, hidhini një sy %1$s Hyrje në API-t e Piwik-ut %2$s dhe %3$s Referencë API-sh Piwik-u %4$s.",
+ "PluginDescription": "Në Piwik krejt të dhënat janë të passhme përmes API-sh të thjeshta. Kjo shtojcë është pika e hyrjes për një shërbim web, të cilin mund ta vini në punë për të patur të dhënat tuaja të Analizës Web në format xml, json, php, csv, etj.",
+ "ReportingApiReference": "Referencë API Raportimesh",
"TopLinkTooltip": "Hyni programatikisht te të dhënat tuaja të Analizave Web përmes një API-je të thjeshtë json, xml, etj.",
"UserAuthentication": "Mirëfilltësim përdoruesi",
"UsingTokenAuth": "Nëse doni të %1$s kërkoni të dhëna brenda një programthi, një crontab-i, etj. %2$s lypset të shtoni parametrin %3$s te URL-të për thirrje API që lypin mirëfilltësim.",
- "Glossary": "Fjalorth"
+ "Glossary": "Fjalorth",
+ "LearnAboutCommonlyUsedTerms": "Mësoni rreth termave që përdoren zakonisht, për të përfituar maksimumin prej Analizave Piwik Analytics: %1$s dhe %2$s."
}
} \ No newline at end of file
diff --git a/plugins/API/lang/sv.json b/plugins/API/lang/sv.json
index bdd60c8c23..45fe763927 100644
--- a/plugins/API/lang/sv.json
+++ b/plugins/API/lang/sv.json
@@ -5,9 +5,11 @@
"LoadedAPIs": "Laddade in %s API'er utan problem",
"MoreInformation": "För mer information om Piwiks API'er, ta en titt i %1$s Introduction to Piwik API %2$s och %3$s Piwik API Reference %4$s.",
"PluginDescription": "Allt data i Piwik finns tillgängligt genom enkla API:er. Denna plugin är en web service entry point, vilken du kan använda för att hämta ditt Piwik-data i formaten xml, json, php, csv, etc.",
+ "ReportingApiReference": "Rapporterings-API referens",
"TopLinkTooltip": "Få åtkomst till webbanalysdata programmatiskt genom ett enkelt API i t.ex. json, xml etc.",
"UserAuthentication": "Användarautentisering",
"UsingTokenAuth": "Om du vill %1$s begära uppgifter inom ett skript, ett crontab-jobb, etc. %2$s måste du lägga till parametern %3$s till API-anrop webbadresser som kräver autentisering.",
- "Glossary": "Ordbok"
+ "Glossary": "Ordbok",
+ "LearnAboutCommonlyUsedTerms": "Lär dig mer om de vanligaste termerna för att få ut mest av Piwik Analytics: %1$s och %2$s."
}
} \ No newline at end of file
diff --git a/plugins/API/lang/uk.json b/plugins/API/lang/uk.json
index 20e3eae228..c3784384ec 100644
--- a/plugins/API/lang/uk.json
+++ b/plugins/API/lang/uk.json
@@ -4,7 +4,12 @@
"KeepTokenSecret": "token_auth є секретним, на рівні з логіном та паролем, тож %1$s тримайте цю інформацію секреті%2$s!",
"LoadedAPIs": "%s API успішно завантажено",
"MoreInformation": "Для отримання детальнішої інформації про API Piwik, перегляньте %1$s Вступ до Piwik API %2$s та %3$s Довідковий матеріал по Piwik API %4$s.",
+ "PluginDescription": "Всі дані з Piwik доступні через прості API. Цей плагін є вхідною точкою для веб сервісу, який можна викликати щоб отримати дані веб аналітики в xml, json, php, csv та інше.",
+ "ReportingApiReference": "Повідомлення довідкової інформації по API",
+ "TopLinkTooltip": "Отримуйте доступ до вашої веб-аналітиці за допомогою простого API з використанням json, xml та іншого.",
"UserAuthentication": "Аутентифікація користоувача",
- "UsingTokenAuth": "Для %1$sдоступу до інформації скриптом, програмою і т.д.%2$s треба додавати параметр %3$s до кожного виклику API якищо використовуваний URL вимагає аутентифікації."
+ "UsingTokenAuth": "Для %1$sдоступу до інформації скриптом, програмою і т.д.%2$s треба додавати параметр %3$s до кожного виклику API якищо використовуваний URL вимагає аутентифікації.",
+ "Glossary": "Глосарій",
+ "LearnAboutCommonlyUsedTerms": "Вивчіть часто використовувані терміни, щоб витягти максимум користі з Piwik Analytics: %1$s і %2$s."
}
} \ No newline at end of file
diff --git a/plugins/API/lang/vi.json b/plugins/API/lang/vi.json
index 05c908db9a..cc21a27a28 100644
--- a/plugins/API/lang/vi.json
+++ b/plugins/API/lang/vi.json
@@ -8,6 +8,7 @@
"ReportingApiReference": "Tham chiếu API báo cáo",
"TopLinkTooltip": "Truy cập dữ liệu lập trình Web Analytics của bạn thông qua một API đơn giản trong JSON, xml, vv",
"UserAuthentication": "Xác thực người dùng",
- "UsingTokenAuth": "Nếu bạn muốn %1$s truy vấn dữ liệu trong script hoặc crontab, ... %2$s bạn cần phải thêm tham số %3$s vào các API call URL yêu cầu xác thực."
+ "UsingTokenAuth": "Nếu bạn muốn %1$s truy vấn dữ liệu trong script hoặc crontab, ... %2$s bạn cần phải thêm tham số %3$s vào các API call URL yêu cầu xác thực.",
+ "Glossary": "Thuật ngữ"
}
} \ No newline at end of file
diff --git a/plugins/Actions/javascripts/actionsDataTable.js b/plugins/Actions/javascripts/actionsDataTable.js
index 1921916340..6adfe62cbd 100644
--- a/plugins/Actions/javascripts/actionsDataTable.js
+++ b/plugins/Actions/javascripts/actionsDataTable.js
@@ -54,12 +54,13 @@
var self = this;
self.cleanParams();
+ self.preBindEventsAndApplyStyleHook(domElem, rows);
if (!rows) {
rows = $('tr', domElem);
}
- // we dont display the link on the row with subDataTable when we are already
+ // we don't display the link on the row with subDataTable when we are already
// printing all the subTables (case of recursive search when the content is
// including recursively all the subtables
if (!self.param.filter_pattern_recursive) {
@@ -91,6 +92,7 @@
self.setFixWidthToMakeEllipsisWork(domElem);
self.handleSummaryRow(domElem);
self.openSubtableFromLevel0IfOnlyOneSubtableGiven(domElem);
+ self.postBindEventsAndApplyStyleHook(domElem, rows);
},
openSubtableFromLevel0IfOnlyOneSubtableGiven: function (domElem) {
diff --git a/plugins/Actions/lang/ar.json b/plugins/Actions/lang/ar.json
index a6de6924bf..549a6642d9 100644
--- a/plugins/Actions/lang/ar.json
+++ b/plugins/Actions/lang/ar.json
@@ -2,6 +2,7 @@
"Actions": {
"AvgGenerationTimeTooltip": "متوسط على أساس %1$s كبسة %2$s ما بين %3$s و %4$s",
"ColumnClickedURL": "الرابط المتبوع",
+ "ColumnActionURL": "رابط الأمر",
"ColumnClicks": "النقرات",
"ColumnClicksDocumentation": "عدد مرات النقر على هذا الرابط.",
"ColumnDownloadURL": "رابط التحميل",
@@ -60,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "الصفحات بعد بحث بالموقع",
"WidgetSearchCategories": "فئات البحث",
"WidgetSearchKeywords": "كلمات البحث الدلالية",
- "WidgetSearchNoResultKeywords": "كلمات البحث الدلالية بلا نتائج"
+ "WidgetSearchNoResultKeywords": "كلمات البحث الدلالية بلا نتائج",
+ "ActionType": "نوع الأمر"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/da.json b/plugins/Actions/lang/da.json
index f7bb0dd234..92ce7c09f3 100644
--- a/plugins/Actions/lang/da.json
+++ b/plugins/Actions/lang/da.json
@@ -2,6 +2,7 @@
"Actions": {
"AvgGenerationTimeTooltip": "Gennemsnit baseret på %1$s hits %2$s mellem %3$s og %4$s",
"ColumnClickedURL": "Klikkede URL",
+ "ColumnActionURL": "Handlings URL",
"ColumnClicks": "Klik",
"ColumnClicksDocumentation": "Antal gange linket blev klikket på.",
"ColumnDownloadURL": "Hentet URL",
@@ -60,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "Sider efter en webstedssøgning",
"WidgetSearchCategories": "Søge kategorier",
"WidgetSearchKeywords": "Websted søgeord",
- "WidgetSearchNoResultKeywords": "Søgeord uden nogen resultater"
+ "WidgetSearchNoResultKeywords": "Søgeord uden nogen resultater",
+ "ActionType": "Handlings type"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/fa.json b/plugins/Actions/lang/fa.json
index 7937515a3d..f1d16838e3 100644
--- a/plugins/Actions/lang/fa.json
+++ b/plugins/Actions/lang/fa.json
@@ -2,6 +2,7 @@
"Actions": {
"AvgGenerationTimeTooltip": "میانگین بر اساس %1$s کلیک %2$s بین %3$s و %4$s",
"ColumnClickedURL": "آدرس کلیک شده",
+ "ColumnActionURL": "آدرس فعالیت",
"ColumnClicks": "کلیک ها",
"ColumnClicksDocumentation": "تعداد دفعاتی که بر روی این لینک کلیک شده است.",
"ColumnDownloadURL": "آدرس دانلود شده",
@@ -36,6 +37,7 @@
"PagesReportDocumentation": "این گزارش شامل اطلاعاتی درباره URLهای صفحه هایی است که بازدید شده اند. %s جدول به صورت سلسله مراتبی سازماندهی شده است و URLها به عنوان پوشه نمایش داده شده اند.",
"PageTitlesReportDocumentation": "این گزارش شامل اطلاعاتی درباره عنوان صفحه هایی است که بازدید شده اند. %1$s عنوان صفحه تگ %2$s HTML است که اغلب مرورگرها در عنوان پنجره هایشان نمایش می دهند.",
"PageUrls": "آدرس صفحات",
+ "PluginDescription": "گزارش‌ها درباره بازدید صفحات و عنوان صفحات. شما می‌توانید با استفاده از این بخش موتور جستجوی داخلی وبسایت را ارزیابی کنید. به صورت خودکار کلیک‌های لینک‌های خارجی و دانلود فایل را رهگیری می‌کند.",
"SiteSearchCategories1": "این گزارش مجموعه هایی را فهرست می کند که بازدیدکنندگان هنگام جستجو در سایت شما , آن را انتخاب نموده اند.",
"SiteSearchCategories2": "برای نمونه , وبسایت های تجاری معمولا \"مجموعه\"هایی برای انتخاب دارند که به بازدیدکنندگان اجازه می دهد جستجوهایشان را از تمام محصولات به مجموعه ای از محصولات محدود کنند.",
"SiteSearchFollowingPagesDoc": "هنگامی که بازدیدکنندگان در سایت شما جستجو می کنند , آنها به دنبال صفحه ,محتوی ,محصول و یا سرویس خاصی هستند. این گزارش صفحاتی را فهرست می کند که بیشترین کلیک را بعد از جستجوی داخلی داشته اند. به عبارت دیگر ,فهرست صفحه هایی که بیشترین جستجو را توسط بازدیدکنندگان سایت شما داشته اند.",
@@ -56,6 +58,7 @@
"WidgetPageUrlsFollowingSearch": "عنوان های صفحه پیرو جستجوی سایت",
"WidgetSearchCategories": "جستجوی بخش ها",
"WidgetSearchKeywords": "کلیدواژه های جستجوی سایت",
- "WidgetSearchNoResultKeywords": "جستجوی کلیدواژه ها بدون نتیجه بود"
+ "WidgetSearchNoResultKeywords": "جستجوی کلیدواژه ها بدون نتیجه بود",
+ "ActionType": "نوع فعالیت"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/fr.json b/plugins/Actions/lang/fr.json
index 38fc3bd071..e63293a2b0 100644
--- a/plugins/Actions/lang/fr.json
+++ b/plugins/Actions/lang/fr.json
@@ -1,5 +1,6 @@
{
"Actions": {
+ "AvgGenerationTimeTooltip": "Moyenne basée sur %1$s entrée(s) %2$s entre %3$s et %4$s",
"ColumnClickedURL": "URL cliquées",
"ColumnActionURL": "URL d'action",
"ColumnClicks": "Clics",
diff --git a/plugins/Actions/lang/sq.json b/plugins/Actions/lang/sq.json
index 7ba920bc2a..8bb5f58157 100644
--- a/plugins/Actions/lang/sq.json
+++ b/plugins/Actions/lang/sq.json
@@ -61,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "Faqe Në Vijim të një Kërkimi në Sajt",
"WidgetSearchCategories": "Kategori Kërkimesh",
"WidgetSearchKeywords": "Fjalëkyçe Kërkimi në Sajt",
- "WidgetSearchNoResultKeywords": "Fjalëkyça Kërkimesh me Pa Përfundime"
+ "WidgetSearchNoResultKeywords": "Fjalëkyça Kërkimesh me Pa Përfundime",
+ "ActionType": "Lloj Veprimi"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/tr.json b/plugins/Actions/lang/tr.json
index 0c65af530a..59fc65d1b6 100644
--- a/plugins/Actions/lang/tr.json
+++ b/plugins/Actions/lang/tr.json
@@ -1,23 +1,23 @@
{
"Actions": {
- "AvgGenerationTimeTooltip": "Ortalama %1$s hit, %2$s arasında %3$s \/ %4$s 'e dayalı",
- "ColumnClickedURL": "Tıklanan Sayfa Adresleri",
- "ColumnActionURL": "Aksiyon Adresi",
- "ColumnClicks": "Tıklamalar",
- "ColumnClicksDocumentation": "Tıklama sayısı",
- "ColumnDownloadURL": "İndirme Sayfa Adresleri",
+ "AvgGenerationTimeTooltip": "Ortalama %1$s %2$s ortalama tıklamaya göre %3$s ile %4$s arasında",
+ "ColumnClickedURL": "Tıklanan Adres",
+ "ColumnActionURL": "İşlem Adresi",
+ "ColumnClicks": "Tıklanma",
+ "ColumnClicksDocumentation": "Bu bağlantıya tıklanma sayısı.",
+ "ColumnDownloadURL": "İndirme İnternet Adresi",
"ColumnEntryPageTitle": "Giriş Sayfası Başlığı",
- "ColumnEntryPageURL": "Giriş Sayfa Adresi",
+ "ColumnEntryPageURL": "Giriş Sayfası Adresi",
"ColumnExitPageTitle": "Çıkış Sayfası Başlığı",
- "ColumnExitPageURL": "Çıkış Sayfa Adresi",
- "ColumnNoResultKeyword": "Arama sonucu olmayan Anahtar Kelime",
- "ColumnPageName": "Sayfa İsmi",
- "ColumnPagesPerSearch": "Arama Sonuç Sayfaları",
- "ColumnPagesPerSearchDocumentation": "Ziyaretçiler sitenizde arama yaptıklarında \"İleri\" tıklayarak daha fazla sonuç görebilirler. Bu sayı, bu anahtar kelime için görüntülenen ortalama arama sonuç sayfalarının sayısıdır.",
+ "ColumnExitPageURL": "Çıkış Sayfası Adresi",
+ "ColumnNoResultKeyword": "Arama sonucu olmayan Anahtar Sözcük",
+ "ColumnPageName": "Sayfa Adı",
+ "ColumnPagesPerSearch": "Arama Sonuçları Sayfaları",
+ "ColumnPagesPerSearchDocumentation": "Ziyaretçiler sitenizde arama yaptıklarında \"Sonraki\" üzerine tıklayarak daha fazla sonuç görüntüleyebilir. Bu sayı, bu anahtar sözcük için görüntülenen ortalama arama sonuç sayfalarının sayısıdır.",
"ColumnPageURL": "Sayfa Adresi",
"ColumnSearchCategory": "Arama Kategorisi",
"ColumnSearches": "Aramalar",
- "ColumnSearchesDocumentation": "Bu anahtar kelime ile sitenizde yapılan aramaların sayısı",
+ "ColumnSearchesDocumentation": "Bu anahtar sözcük ile web sitenizin arama motorunda yapılan aramaların sayısı.",
"ColumnSearchExits": "Arama Çıkış Yüzdesi",
"ColumnSearchExitsDocumentation": "Bu Anahtar Kelimeyi sitenizin Arama Motorunda aradıktan sonra siteden ayrılanların yüzdesi.",
"ColumnSearchResultsCount": "Arama Sonucu Sayısı",
@@ -51,17 +51,17 @@
"SubmenuPagesEntry": "Giriş sayfaları",
"SubmenuPagesExit": "Çıkış sayfaları",
"SubmenuPageTitles": "Sayfa başlıkları",
- "SubmenuSitesearch": "Arama",
+ "SubmenuSitesearch": "Site Araması",
"WidgetEntryPageTitles": "Giriş Sayfası Başlıkları",
"WidgetExitPageTitles": "Çıkış Sayfası Başlıkları",
"WidgetPagesEntry": "Giriş Sayfaları",
"WidgetPagesExit": "Çıkış Sayfaları",
"WidgetPageTitles": "Sayfa Başlıkları",
- "WidgetPageTitlesFollowingSearch": "Site Aramasını Takip Eden Sayfa Başlıkları",
- "WidgetPageUrlsFollowingSearch": "Site Aramasını Takip eden Sayfalar",
+ "WidgetPageTitlesFollowingSearch": "Site Aramasını İzleyen Sayfa Başlıkları",
+ "WidgetPageUrlsFollowingSearch": "Site Aramasını İzleyen Sayfalar",
"WidgetSearchCategories": "Arama Kategorileri",
- "WidgetSearchKeywords": "Arama Kelimeleri",
- "WidgetSearchNoResultKeywords": "Sonuç dönmeyen Arama Kelimeleri",
- "ActionType": "Aksiyon Tipi"
+ "WidgetSearchKeywords": "Site Arama Anahtar Sözcükleri",
+ "WidgetSearchNoResultKeywords": "Sonuç Vermeyen Arama Anahtar Sözcükleri",
+ "ActionType": "Eylem Türü"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/uk.json b/plugins/Actions/lang/uk.json
index 9dcb09dc63..e33457c73b 100644
--- a/plugins/Actions/lang/uk.json
+++ b/plugins/Actions/lang/uk.json
@@ -1,14 +1,67 @@
{
"Actions": {
- "ColumnClickedURL": "URL по якому клацнули",
- "ColumnClicks": "Клацання",
- "ColumnDownloadURL": "URL завантаження",
- "ColumnPageName": "Назва сторінки",
- "ColumnPageURL": "URL сторінки",
- "ColumnUniqueClicks": "Унікальні клацання",
+ "AvgGenerationTimeTooltip": "В середньому по %1$s хіт (ів) %2$s між %3$s і %4$s",
+ "ColumnClickedURL": "URL кліків",
+ "ColumnActionURL": "URL дій",
+ "ColumnClicks": "Кліків",
+ "ColumnClicksDocumentation": "Кількість кліків по цьому посиланню.",
+ "ColumnDownloadURL": "Посилання для завантаження",
+ "ColumnEntryPageTitle": "Заголовок початкової сторінки",
+ "ColumnEntryPageURL": "URL початкової сторінки",
+ "ColumnExitPageTitle": "заголовок сторінки виходу",
+ "ColumnExitPageURL": "URL сторінки виходу",
+ "ColumnNoResultKeyword": "Ключове слово без результатів в пошуку",
+ "ColumnPageName": "Заголовок сторінки",
+ "ColumnPagesPerSearch": "Сторінки результатів пошуку",
+ "ColumnPagesPerSearchDocumentation": "Відвідувачі будуть користуватися пошуком на вашому сайті і іноді натискати \"next\" (наступна сторінка), щоб переглянути більше результатів. Це середнє число сторінок з результатами пошуку для цього ключового слова.",
+ "ColumnPageURL": "URL сторінок",
+ "ColumnSearchCategory": "Шукати категорію",
+ "ColumnSearches": "Пошуки",
+ "ColumnSearchesDocumentation": "Число відвідувань, коли відвідувач шукав саме це ключове слово через пошук на сайті.",
+ "ColumnSearchExits": "% виходів з пошуку",
+ "ColumnSearchExitsDocumentation": "Відсоток відвідувань, коли відвідувач пішов з сайту після пошуку на вашому сайті саме цього ключового слова.",
+ "ColumnSearchResultsCount": "Лічильник результатів",
+ "ColumnSiteSearchKeywords": "Унікальні ключові слова",
+ "ColumnUniqueClicks": "Унікальні кліки",
+ "ColumnUniqueClicksDocumentation": "Кількість відвідувань, коли було відкрито це посилання. Якщо посилання була відкрито кілька разів протягом одного і того ж відвідування, це враховується лише раз.",
"ColumnUniqueDownloads": "Унікальні завантаження",
+ "ColumnUniqueOutlinks": "Унікальні вихідні посилання",
+ "DownloadsReportDocumentation": "У цьому звіті ви можете бачити файли, які завантажували ваші відвідувачі. %s За завантаження вважається клік на відповідне посилання. Однак чи закінчив відвідувач завантаження залишається невідомим. За завантаження вважається також відкриття картинок і інших розширень файлів.",
+ "EntryPagesReportDocumentation": "Цей звіт містить інформацію про сторінки входу за певний період. Вхідна сторінка – це перша сторінка сайту, яку користувач переглядає за відвідування. %s Вхідні посилання відображаються в папочном вигляді.",
+ "EntryPageTitles": "Заголовки сторінок входу",
+ "EntryPageTitlesReportDocumentation": "Цей звіт містить інформацію про заголовки вхідних сторінок, на які потрапляли відвідувачі в конкретний період.",
+ "ExitPagesReportDocumentation": "Цей звіт містить інформацію про сторінки виходу за певний період. Сторінка виходу – це остання сторінка сайту, на якій побував відвідувач. %s Посилання цих сторінок відображаються у вигляді дерева.",
+ "ExitPageTitles": "Заголовки сторінок виходу",
+ "ExitPageTitlesReportDocumentation": "Цей звіт містить інформацію про заголовки вихідних сторінок, з яких відвідувач пішов з сайту в конкретний період.",
+ "LearnMoreAboutSiteSearchLink": "Дізнайтеся більше про відстеження використання пошуку на вашому сайті.",
+ "OneSearch": "1 пошук",
+ "OutlinkDocumentation": "Вихідне посилання – посилання, яка виводить відвідувача з вашого сайту (на інший домен).",
+ "OutlinksReportDocumentation": "Цей звіт показує ієрархічний список вихідних посилань, на які користувач натиснув.",
+ "PagesReportDocumentation": "Цей звіт містить інформацію про адреси сторінок, на яких побували відвідувачі вашого сайту. %s Таблицю організовано ієрархічно – URL-и відображаються тековою структурою.",
+ "PageTitlesReportDocumentation": "Цей звіт містить інформацію про заголовки відвіданих сторінок. %1$s Заголовок сторінки це HTML-тег %2$s, який браузери відображають в заголовку вікна (вкладки).",
+ "PageUrls": "URL-и сторінок",
+ "PluginDescription": "Звіти про перегляди і заголовки сторінок. Дозволяють оцінити внутрішню пошукову систему сайту. Автоматично відстежує кліки по зовнішніх посиланнях і скачуванню файлів.",
+ "SiteSearchCategories1": "Цей звіт показує список категорій, які вибрали відвідувачі при пошуку на вашому сайті.",
+ "SiteSearchCategories2": "Наприклад, сайти електронної комерції зазвичай мають вибір «Категорій», щоб відвідувачам було зручно їх сортувати і шукати.",
+ "SiteSearchFollowingPagesDoc": "Коли відвідувачі шукають щось на вашому сайті, вони хочуть знайти певну сторінку, контент, продукт або послугу. Цей звіт відображає сторінки, за якими відвідувачі клацають найбільш часто при пошуку. Іншими словами, це список сторінок, які шукаються найчастіше на вашому сайті.",
+ "SiteSearchIntro": "Відстеження пошуку на вашому сайті – ефективний спосіб дізнатися, чим саме цікавиться ваша аудиторія. Це може допомогти знайти ідеї для нового контенту, нових продуктів і поліпшити взаємодію відвідувачів з вашим сайту в цілому.",
+ "SiteSearchKeyword": "Ключове слово (пошук по сайту)",
+ "SiteSearchKeywordsDocumentation": "Ці звіт показує список ключових слів, які відвідувачі шукали на вашому сайті через ваш пошук.",
+ "SiteSearchKeywordsNoResultDocumentation": "Цей звіт відображає список ключових слів, за якими не було нічого знайдено на вашому сайті: можливо, варто поліпшити пошуковий алгоритм на вашому сайті або відвідувачі шукають те, чого на вашому сайті немає?",
"SubmenuPagesEntry": "Сторінки входу",
"SubmenuPagesExit": "Сторінки виходу",
- "SubmenuPageTitles": "Заголовки сторінок"
+ "SubmenuPageTitles": "Заголовки",
+ "SubmenuSitesearch": "Пошук по сайту",
+ "WidgetEntryPageTitles": "Заголовки сторінок входу",
+ "WidgetExitPageTitles": "Заголовки сторінки виходу",
+ "WidgetPagesEntry": "Сторінки входу",
+ "WidgetPagesExit": "Сторінки виходу",
+ "WidgetPageTitles": "Заголовки сторінок",
+ "WidgetPageTitlesFollowingSearch": "Заголовки сторінок, які знайшлися в пошуку",
+ "WidgetPageUrlsFollowingSearch": "Сторінки, які знайшлися в пошуку",
+ "WidgetSearchCategories": "Категорії пошуку",
+ "WidgetSearchKeywords": "Пошукові ключові слова сайту",
+ "WidgetSearchNoResultKeywords": "Пошукові ключові слова без результатів",
+ "ActionType": "Тип дії"
}
} \ No newline at end of file
diff --git a/plugins/Actions/lang/vi.json b/plugins/Actions/lang/vi.json
index d68aeeeed3..cfb9ca13ca 100644
--- a/plugins/Actions/lang/vi.json
+++ b/plugins/Actions/lang/vi.json
@@ -2,6 +2,7 @@
"Actions": {
"AvgGenerationTimeTooltip": "Trung bình dựa trên %1$s lần(s) %2$s giữa %3$s và %4$s",
"ColumnClickedURL": "URL đã truy cập",
+ "ColumnActionURL": "URL hành động",
"ColumnClicks": "Clicks",
"ColumnClicksDocumentation": "Số lần đường dẫn này đã được click",
"ColumnDownloadURL": "Đường dẫn tải về",
@@ -39,6 +40,7 @@
"PagesReportDocumentation": "Báo cáo này chứa thông tin về các URLs của trang đã được xem. %s Bảng này được tổ chức dưới dạng cây, Các URL được hiển thị dưới cấu trúc folder.",
"PageTitlesReportDocumentation": "Báo cáo này chứa thông tin về tiêu đề các trang đã được truy cập. %1$s Tiêu đề trang là thẻ HTML %2$s mà các trình duyệt hiển thị trên thanh tiêu đề của cửa sổ trình duyệt.",
"PageUrls": "Đường dẫn trang",
+ "PluginDescription": "Các báo cáo về lượt xem trang và tiêu đề trang. Cho phép bạn đo lường công cụ tìm kiếm của trang web nội bộ của bạn. Tự động theo dõi các lượt nhấp chuột vào liên kết bên ngoài và lượt tải về tập tin.",
"SiteSearchCategories1": "Báo cáo này liệt kê các hạng mục cho người truy cập lựa chọn khi họ thực hiện một tìm kiếm trên trang web của bạn",
"SiteSearchCategories2": "Ví dụ, một trang thương mại điện tử (e-commerce) thường có chức năng \"Lựa chọn Phân mục\" để khách truy cập giới hạn phạm vi tìm kiếm đối với các sản phẩm trong một phân mục quy định.",
"SiteSearchFollowingPagesDoc": "Khi khách tìm kiếm trên trang web của bạn, họ tìm kiếm một trang, nội dung, sản phẩm hoặc một dịch vụ cụ thể. Báo cáo này liệt kê các trang đã được click nhiều nhất sau khi thực hiện phép tìm kiếm (nội bộ). Nói cách khác, danh sách này chứa các trang được tìm kiếm nhiều nhất được thực hiện bởi khách trên trang web của bạn.",
@@ -59,6 +61,7 @@
"WidgetPageUrlsFollowingSearch": "Các trang ghé thăm sau trang tìm kiếm",
"WidgetSearchCategories": "Số danh mục tìm kiếm",
"WidgetSearchKeywords": "Số từ khóa trang tìm kiếm",
- "WidgetSearchNoResultKeywords": "Các từ khóa tìm kiếm không có kết quả"
+ "WidgetSearchNoResultKeywords": "Các từ khóa tìm kiếm không có kết quả",
+ "ActionType": "Loại hành động"
}
} \ No newline at end of file
diff --git a/plugins/Annotations/lang/de.json b/plugins/Annotations/lang/de.json
index a962c4de29..f3fd1e64e6 100644
--- a/plugins/Annotations/lang/de.json
+++ b/plugins/Annotations/lang/de.json
@@ -9,12 +9,12 @@
"ClickToStarOrUnstar": "Klicken Sie um die Markierung dieser Anmerkung zu setzen oder zu entfernen.",
"CreateNewAnnotation": "Neue Anmerkung anlegen...",
"EnterAnnotationText": "Geben Sie Ihre Notiz ein...",
- "HideAnnotationsFor": "Markierungen für %s verbergen...",
+ "HideAnnotationsFor": "Anmerkungen für %s verbergen...",
"IconDesc": "Notizen für diesen Zeitraum anzeigen.",
"IconDescHideNotes": "Notizen für diesen Zeitraum verbergen.",
- "InlineQuickHelp": "Sie können Markierungen erstellen um spezielle Ereignisse (wie einen Blog-Eintrag, oder eine Neugestaltung der Website) zu markieren, Stichtage für die Datenanalyse zu speichern oder einfach alles zu speichern was Ihnen wichtig erscheint.",
+ "InlineQuickHelp": "Sie können Anmerkungen erstellen um spezielle Ereignisse (wie einen Blog-Eintrag, oder eine Neugestaltung der Website) zu markieren, Stichtage für die Datenanalyse zu speichern oder einfach alles zu speichern was Ihnen wichtig erscheint.",
"LoginToAnnotate": "Sie müssen sich einloggen um eine Anmerkung hinzufügen zu können.",
- "NoAnnotations": "Für diesen Zeitraum sind keine Notizen vorhanden.",
+ "NoAnnotations": "Für diesen Zeitraum sind keine Anmerkungen vorhanden.",
"PluginDescription": "Erlaubt Ihnen Hinweise zu verschiedenen Tagen hinzuzufügen um Änderungen zu markieren die an der Website gemacht wurden, Analysen zu speichern die bezüglich Ihrer Daten gemacht wurden und um Ihre Gedanken mit Ihren Kollegen zu teilen. Durch das Hinzufügen von Hinweisen stellen Sie sicher, dass Sie sich daran erinnern warum die Daten so sind wie sie sind.",
"ViewAndAddAnnotations": "Anmerkungen zu %s ansehen und hinzufügen...",
"YouCannotModifyThisNote": "Sie können diese Anmerkung nicht ändern, da Sie sie weder erstellt haben noch administrativen Zugang für diese Seite besitzen."
diff --git a/plugins/Annotations/lang/tr.json b/plugins/Annotations/lang/tr.json
index dc3ba67ba7..9c29b5e23b 100644
--- a/plugins/Annotations/lang/tr.json
+++ b/plugins/Annotations/lang/tr.json
@@ -1,20 +1,20 @@
{
"Annotations": {
- "AddAnnotationsFor": "%s için not ekle",
+ "AddAnnotationsFor": "%s için notlar ekle...",
"AnnotationOnDate": "%1$s için not: %2$s",
"Annotations": "Notlar",
- "ClickToDelete": "Bu notu silmek için tıklayınız.",
- "ClickToEdit": "Bu notu düzenlemek için tıklayınız.",
- "ClickToEditOrAdd": "Yorum eklemek veya düzenlemek icin buraya tıklayın",
- "ClickToStarOrUnstar": "Bu not işaretlemek veya işaretlemeyi kaldırmak için tıklayın",
- "CreateNewAnnotation": "Yeni not ekle...",
- "EnterAnnotationText": "Notunuzu giriniz...",
+ "ClickToDelete": "Bu notu silmek için tıklayın.",
+ "ClickToEdit": "Bu notu düzenlemek için tıklayın.",
+ "ClickToEditOrAdd": "Not eklemek ya da düzenlemek icin buraya tıklayın.",
+ "ClickToStarOrUnstar": "Bu nota işaret koymak ya da kaldırmak için tıklayın.",
+ "CreateNewAnnotation": "Not ekle...",
+ "EnterAnnotationText": "Notunuzu yazın...",
"HideAnnotationsFor": "%s için notları gizle...",
- "IconDesc": "Bu tarih aralığı için notları göster",
- "IconDescHideNotes": "Bu tarih aralığı için notları gizle",
- "InlineQuickHelp": "Önemli olduğunu düşündüğünüz yada veri analizleriniz için özel anonslar oluşturabilirsiniz (yeni yazılar yada site yenilenmesi gibi)",
- "LoginToAnnotate": "Not eklemek için giriş yapmalısınız.",
- "NoAnnotations": "Bu tarih aralığı için not yok.",
+ "IconDesc": "Bu tarih aralığındaki notları görüntüle.",
+ "IconDescHideNotes": "Bu tarih aralığındaki notları gizle",
+ "InlineQuickHelp": "Önemli etkinlikleri (yeni blog iletileri ya da web sitesi tasarım değişiklikleri gibi), veri incelemelerinizi ya da önemli olduğunu düşündüğünüz konuları kaydetmek için notlar oluşturabilirsiniz.",
+ "LoginToAnnotate": "Not eklemek için oturum açın.",
+ "NoAnnotations": "Bu tarih aralığında bir not yok.",
"PluginDescription": "Websiteniz de yaptığınız değişiklikleri farklı günlerde belirtmek için not eklemeye izin verir, veriniz ile ilgili analizleri saklar ve bunları meslektaşlarınız ile birlikte paylaşmanıza izn verir. Neden o veriye baktığınızı hatırlamanızdan emin olmak için veriye dipnot koyar.",
"ViewAndAddAnnotations": "%s için notları göster ve yeni not ekle...",
"YouCannotModifyThisNote": "Bunu değiştiremezsiniz. Bunun için bu siteye yönetici erişiminiz olması gerekli."
diff --git a/plugins/Annotations/lang/uk.json b/plugins/Annotations/lang/uk.json
new file mode 100644
index 0000000000..5a6c97a553
--- /dev/null
+++ b/plugins/Annotations/lang/uk.json
@@ -0,0 +1,22 @@
+{
+ "Annotations": {
+ "AddAnnotationsFor": "Додати замітки для %s...",
+ "AnnotationOnDate": "Замітка на %1$s: %2$s",
+ "Annotations": "Замітки",
+ "ClickToDelete": "Видалити цю замітку.",
+ "ClickToEdit": "Редагувати замітку.",
+ "ClickToEditOrAdd": "Змінити або додати нові замітки.",
+ "ClickToStarOrUnstar": "Поставити або зняти позначку.",
+ "CreateNewAnnotation": "Створити замітку",
+ "EnterAnnotationText": "Введіть свою замітку",
+ "HideAnnotationsFor": "Приховати замітки для %s...",
+ "IconDesc": "Переглянути нотатки для даного діапазону дат.",
+ "IconDescHideNotes": "Приховати замітки для даного діапазону дат.",
+ "InlineQuickHelp": "Ви можете створювати нотатки для того, щоб відзначати важливі події в історії вашого сайту (такі як новий пост в блозі або редизайн).",
+ "LoginToAnnotate": "Увійдіть для створення заміток.",
+ "NoAnnotations": "Ні заміток в даному діапазоні дат.",
+ "PluginDescription": "Дозволяє прикріпити замітки до різних днів, щоб відзначити зміни, внесені в ваш сайт. Створюючи замітки, ви будете знати, чому відвідування змінилися саме так.",
+ "ViewAndAddAnnotations": "Переглянути та додати замітки для %s...",
+ "YouCannotModifyThisNote": "Ви не можете змінити цю замітку, так як ви не є її автором. Також у вас немає прав адміністратора."
+ }
+} \ No newline at end of file
diff --git a/plugins/BulkTracking/tests/Framework/Mock/Tracker/Response.php b/plugins/BulkTracking/tests/Framework/Mock/Tracker/Response.php
index e514745ddb..c595a278c6 100644
--- a/plugins/BulkTracking/tests/Framework/Mock/Tracker/Response.php
+++ b/plugins/BulkTracking/tests/Framework/Mock/Tracker/Response.php
@@ -13,7 +13,7 @@ use Exception;
class Response extends \Piwik\Plugins\BulkTracking\Tracker\Response
{
- protected function logExceptionToErrorLog(Exception $e)
+ protected function logExceptionToErrorLog($e)
{
// prevent from writing to console in tests
}
diff --git a/plugins/BulkTracking/tests/Unit/ResponseTest.php b/plugins/BulkTracking/tests/Unit/ResponseTest.php
index 38c3c0cce1..91dbfc2079 100644
--- a/plugins/BulkTracking/tests/Unit/ResponseTest.php
+++ b/plugins/BulkTracking/tests/Unit/ResponseTest.php
@@ -15,7 +15,7 @@ use Exception;
class TestResponse extends Response {
- protected function logExceptionToErrorLog(Exception $e)
+ protected function logExceptionToErrorLog($e)
{
// prevent console from outputting the error_log message
}
diff --git a/plugins/Contents/lang/da.json b/plugins/Contents/lang/da.json
index aaef05b252..2644ffcc27 100644
--- a/plugins/Contents/lang/da.json
+++ b/plugins/Contents/lang/da.json
@@ -1,5 +1,6 @@
{
"Contents": {
+ "PluginDescription": "Indhold og banner sporing gør dig i stand til at måle effektiviteten (besøg, klik, CTR) af ethvert indhold på dine sider (bannerreklamer, billeder, hvad som helst).",
"Impressions": "Indtryk",
"Interactions": "Interaktioner",
"Interaction": "Interaktion",
@@ -7,6 +8,9 @@
"ContentName": "Indholdsnavn",
"ContentPiece": "Indholdsstykke",
"ContentTarget": "Indholdsmål",
- "Contents": "Indhold"
+ "Contents": "Indhold",
+ "InteractionsMetricDocumentation": "Antal gange der er blevet interageret på et indhold (f.eks. et klik på et banner eller en reklame).",
+ "ImpressionsMetricDocumentation": "Antal gange et indhold, som f.eks. et banner eller en reklame er vist på en side.",
+ "InteractionRateMetricDocumentation": "Forholdet mellem indholdsvisninger til interaktioner."
}
} \ No newline at end of file
diff --git a/plugins/Contents/lang/nl.json b/plugins/Contents/lang/nl.json
index 77a8001874..4fd4c3a882 100644
--- a/plugins/Contents/lang/nl.json
+++ b/plugins/Contents/lang/nl.json
@@ -1,13 +1,16 @@
{
"Contents": {
- "PluginDescription": "Met content en banner tracking meet je de prestaties (bezoeken, kliks, CTR) van elk stuk content op je website pagina (Banner ad, plaatje)",
- "Impressions": "Impressies",
+ "PluginDescription": "Met content- en bannertracking meet je de prestaties (bezoeken, kliks, ctr) van elk stukje content op je webpagina (banner, tekstadvertentie, plaatje).",
+ "Impressions": "Vertoningen",
"Interactions": "Interacties",
"Interaction": "Interactie",
- "InteractionRate": "Interactie aantal",
+ "InteractionRate": "Aantal interacties",
"ContentName": "Content naam",
- "ContentPiece": "Content onderdeel",
- "ContentTarget": "Content doel",
- "Contents": "Inhoudsopgave"
+ "ContentPiece": "Contentonderdeel",
+ "ContentTarget": "Contentdoel",
+ "Contents": "Contentbronnen",
+ "InteractionsMetricDocumentation": "Het aantal keer dat er interactie was met een contentbron (bijvoorbeeld een klik op een banner of advertentie).",
+ "ImpressionsMetricDocumentation": "Het aantal keer dat een contentbron, zoals een banner of een advertentie, was getoond op een pagina.",
+ "InteractionRateMetricDocumentation": "De verhouding tussen vertoningen en kliks."
}
} \ No newline at end of file
diff --git a/plugins/Contents/lang/sq.json b/plugins/Contents/lang/sq.json
index 42cdafe8c3..6c63ba16a0 100644
--- a/plugins/Contents/lang/sq.json
+++ b/plugins/Contents/lang/sq.json
@@ -8,6 +8,8 @@
"ContentName": "Emër Lënde",
"ContentPiece": "Copëz Lënde",
"ContentTarget": "Lëndë e Synuar",
- "Contents": "Lëndë"
+ "Contents": "Lëndë",
+ "InteractionsMetricDocumentation": "Numri i herëve që për një bllok lënde ka patur ndërveprime (p.sh., një 'klikim' mbi një banderolë apo reklamë).",
+ "ImpressionsMetricDocumentation": "Numri i herëve që një bllok lënde, i tillë si banderolë apo reklamë, është shfaqur në një faqe."
}
} \ No newline at end of file
diff --git a/plugins/Contents/lang/sv.json b/plugins/Contents/lang/sv.json
index b17e6fb890..889fe3ef12 100644
--- a/plugins/Contents/lang/sv.json
+++ b/plugins/Contents/lang/sv.json
@@ -8,6 +8,9 @@
"ContentName": "Namn på innehåll",
"ContentPiece": "Innehållsdel",
"ContentTarget": "Innehållsmål",
- "Contents": "Innehåll"
+ "Contents": "Innehåll",
+ "InteractionsMetricDocumentation": "Antalet gånger ett innehållsblock har interagerats med (t.ex. ett \"klick\" på en banner eller annons).",
+ "ImpressionsMetricDocumentation": "Antalet gånger ett innehållsblock såsom en banner eller en annons har visats på en sida.",
+ "InteractionRateMetricDocumentation": "Förhållandet mellan innehållsvisningar och interaktioner."
}
} \ No newline at end of file
diff --git a/plugins/Contents/lang/tr.json b/plugins/Contents/lang/tr.json
index 6549aa9b32..06428bc52b 100644
--- a/plugins/Contents/lang/tr.json
+++ b/plugins/Contents/lang/tr.json
@@ -1,16 +1,16 @@
{
"Contents": {
- "PluginDescription": "İçerik ve reklam izleme sayfandaki herhangi bir içeriğin (reklam, resim, herhangi bir öğenin) yerinin performansını (görünme, tıklamalar, CTR) izlemene yarar.",
- "Impressions": "Gösterimler",
- "Interactions": "Etkileşimler",
+ "PluginDescription": "İçerik ve reklam izleme, sayfalarınızdaki herhangi bir içeriğin (reklam, görsel, herhangi bir öge) başarımının (görülme, tıklanma, CTR) izlenmesini sağlar.",
+ "Impressions": "Görülme",
+ "Interactions": "Etkileşim",
"Interaction": "Etkileşim",
"InteractionRate": "Etkileşim Oranı",
- "ContentName": "İçerik İsmi",
+ "ContentName": "İçerik Adı",
"ContentPiece": "İçerik Parçası",
"ContentTarget": "İçerik Hedefi",
"Contents": "İçerikler",
- "InteractionsMetricDocumentation": "İçeriğin kaç kere engellendiği (banner veya reklamdaki 'click' ler gibi)",
- "ImpressionsMetricDocumentation": "Banner ve reklamlar gibi içeriklerin kaç kere gösterildiği",
- "InteractionRateMetricDocumentation": "İçeriğin gösterimi ile etkileşim oranı"
+ "InteractionsMetricDocumentation": "İçerik bloğu ile kaç kere etkileşime geçildiği (afiş ya da reklama 'tıklanma' gibi).",
+ "ImpressionsMetricDocumentation": "Afiş ya da reklam gibi bir içerik bloğunun bir sayfada kaç kere görüntülendiği .",
+ "InteractionRateMetricDocumentation": "İçeriğin görüntülenmesi ile etkileşime geçilme oranı."
}
} \ No newline at end of file
diff --git a/plugins/Contents/lang/uk.json b/plugins/Contents/lang/uk.json
new file mode 100644
index 0000000000..3398c327e0
--- /dev/null
+++ b/plugins/Contents/lang/uk.json
@@ -0,0 +1,16 @@
+{
+ "Contents": {
+ "PluginDescription": "Відстеження контенту і банерів дозволяє вам вимірювати ефективність (перегляди, кліки, CTR) в будь-якій частині контенту на ваших сторінках (рекламний банер, зображення, будь-який елемент).",
+ "Impressions": "Покази",
+ "Interactions": "Взаємодія",
+ "Interaction": "Взаємодія",
+ "InteractionRate": "Коефіцієнт взаємодії",
+ "ContentName": "Назва публікації",
+ "ContentPiece": "Частина публікації",
+ "ContentTarget": "Ціль публікації",
+ "Contents": "Публікації",
+ "InteractionsMetricDocumentation": "Скільки разів з блоком контенту відбувалося взаємодія (наприклад, 'клік' по банеру або рекламі).",
+ "ImpressionsMetricDocumentation": "Скільки разів блок контенту, такий як банер або реклама, був показаний на сторінці.",
+ "InteractionRateMetricDocumentation": "Співвідношення подання контенту і взаємодій."
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/ar.json b/plugins/CoreAdminHome/lang/ar.json
index 7177c24bfa..88382dfa4e 100644
--- a/plugins/CoreAdminHome/lang/ar.json
+++ b/plugins/CoreAdminHome/lang/ar.json
@@ -37,6 +37,7 @@
"OptOutExplanationBis": "سيقوم هذا الكود بعرض iFrame يحتوي رابطاً لزوارك لإلغاء اشتراكهم في Piwik من خلال ضبط كوكيز في متصفحهم. %1$s انقر هنا %2$s لمشاهدة المحتويات التي سيتم عرضها في النافذة الفرعية iFrame.",
"OptOutForYourVisitors": "إلغاء الاشتراك في Piwik لزوارك",
"PiwikIsInstalledAt": "بايويك مثبت في المسار",
+ "SendPluginUpdateCommunication": "أرسل بريداً عند توفر تحديث للإضافة",
"TrackAGoal": "تتبع هدف",
"TrackingCode": "كود التتبع",
"TrustedHostConfirm": "هل ترغب حقاً في تغيير اسم المُضيف الموثوق لدى بايويك؟",
diff --git a/plugins/CoreAdminHome/lang/da.json b/plugins/CoreAdminHome/lang/da.json
index 21619f6dc1..3102fccccc 100644
--- a/plugins/CoreAdminHome/lang/da.json
+++ b/plugins/CoreAdminHome/lang/da.json
@@ -1,8 +1,10 @@
{
"CoreAdminHome": {
+ "AddNewTrustedHost": "Tilføj en ny betroet host",
"Administration": "Administration",
"ArchivingSettings": "Arkivering indstillinger",
"BrandingSettings": "Branding indstillinger",
+ "ReleaseChannel": "Frigiv kanal",
"ClickHereToOptIn": "Klik her for at vælge.",
"ClickHereToOptOut": "Klik her for at fravælge.",
"CustomLogoFeedbackInfo": "Hvis du tilpasser Piwik logoet, kan du også være interesseret i at skjule %1$s linket i topmenuen. For at gøre dette, kan du deaktivere tilbagemeldingsmodulet på %2$sUdvidelsesmodul administration%3$s siden.",
@@ -22,6 +24,7 @@
"JavaScriptTracking": "Sporing med JavaScript",
"JSTracking_CampaignKwdParam": "Kampagne nøgleord parameter",
"JSTracking_CampaignNameParam": "Kampagnenavn parameter",
+ "JSTracking_CodeNoteBeforeClosingHead": "Sørg for, at denne kode er på alle side på dit website. Vi anbefaler at indsætte koden lige før det afsluttende %1$s tag.",
"JSTracking_CustomCampaignQueryParam": "Brug brugerdefineret forespørgsel parameternavne for kampagnenavnet & søgeord",
"JSTracking_CustomCampaignQueryParamDesc": "Note: %1$sPiwik registrerer automatisk Google Analytics parametre.%2$s",
"JSTracking_DisableCookies": "Deaktivere alle sporingscookies",
@@ -46,6 +49,7 @@
"JSTrackingIntro5": "Hvis du vil gøre mere end at spore sidevisninger, kan du checke %1$sPiwik Javascript sporingsdokumentation%2$s for listen over tilgængelige funktioner. Ved hjælp af disse funktioner kan du spore mål, brugerdefinerede variabler, e-handels ordrer, afbrudte ordrer og meget mere.",
"LogoNotWriteableInstruction": "Hvis du vil bruge din brugerdefinerede logo i stedet for standard Piwik logoet, giver skriverettigheder til denne mappe: %1$s Piwik brug skriveadgang til dine logoer gemt i filer %2$s.",
"FileUploadDisabled": "Overførelse af filer er ikke aktiveret i PHP-konfiguration. For at overføre dit brugerdefinerede logo skal du indstille %s i php.ini og genstarte webserveren.",
+ "LogoUploadFailed": "Den uploadede fil kunne ikke behandles. Kontroller at filen har et gyldigt format.",
"LogoUpload": "Vælg et logo til overførelse",
"FaviconUpload": "Vælg Favicon til overførelse",
"LogoUploadHelp": "Overfør en fil i %1$s formater med en højde på mindst %2$s pixels.",
@@ -67,8 +71,10 @@
"PluginSettingsIntro": "Her kan du ændre indstillingerne for følgende 3. parts udvidelsesmoduler:",
"PluginSettingsValueNotAllowed": "Værdien for feltet \"%1$s\" i udvidelsen \"%2$s\" er ikke tilladt",
"PluginSettingsSaveFailed": "Kunne ikke gemme udvidelsesmodul indstillinger",
+ "SendPluginUpdateCommunication": "Send en e-mail når der er en opdatering til et plugin",
"SendPluginUpdateCommunicationHelp": "En e-mail vil blive sendt til Superbrugere, når der er en ny version tilgængelig for denne programudvidelse.",
"StableReleases": "Hvis Piwik er en kritisk del af virksomheden, anbefaler vi at man bruger den nyeste stabile udgave. Hvis man bruger den nyeste beta, og finder en fejl eller har et forslag, %1$sse her%2$s.",
+ "LtsReleases": "LTS (Long Term Support) versioner modtager kun sikkerheds- og fejlrettelser.",
"SystemPluginSettings": "Indstillinger for system udvidelsesmoduler",
"TrackAGoal": "Spor et mål",
"TrackingCode": "Sporingskode",
@@ -81,6 +87,9 @@
"YouAreOptedIn": "Du er i øjeblikket tilmeldt.",
"YouAreOptedOut": "Du har i øjeblikket frameldt.",
"YouMayOptOut": "Du kan vælge ikke at have en unik web analyse cookie identifikationsnummer tildelt til computeren for at undgå aggregering og analyse af data indsamlet på denne hjemmesider.",
- "YouMayOptOutBis": "Vælg muligheden, klik nedenfor for at modtage en opt out-cookie."
+ "YouMayOptOutBis": "Vælg muligheden, klik nedenfor for at modtage en opt out-cookie.",
+ "OptingYouOut": "Vælger dig fra, vent venligst.....",
+ "ProtocolNotDetectedCorrectly": "Du ser Piwik over a sikker SSL forbindelse (med https) men Piwik kan kun finde en usikker forbindelse på serveren.",
+ "ProtocolNotDetectedCorrectlySolution": "For at sikre at Piwik behandler anmodninger og dit indhold over HTTPS, skal du måske redigere din %1$s fil og enten konfigurere dine proxy indstillinger, eller du kan tilføje linjen %2$s under sektionen %3$s. %4$sLæs mere%5$s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/de.json b/plugins/CoreAdminHome/lang/de.json
index ac9cac47d6..ea85f65019 100644
--- a/plugins/CoreAdminHome/lang/de.json
+++ b/plugins/CoreAdminHome/lang/de.json
@@ -24,6 +24,7 @@
"JavaScriptTracking": "Tracking mit JavaScript",
"JSTracking_CampaignKwdParam": "Kampagnen Suchbegriff Parameter",
"JSTracking_CampaignNameParam": "Parameter für Kampagnenname",
+ "JSTracking_CodeNoteBeforeClosingHead": "Stellen Sie sicher, dass sich dieser Code auf jeder Seite Ihrer Webseite befindet. Wir empfehlen, ihn direkt vor dem schliessenden %1$s Tag zu positionieren.",
"JSTracking_CustomCampaignQueryParam": "Eigene Anfrage-Parameter für Kampagnen Name & Suchbegriff verwenden",
"JSTracking_CustomCampaignQueryParamDesc": "Hinweis: %1$sPiwik erkennt Parameter von Google Analytics automatisch.%2$s",
"JSTracking_DisableCookies": "Alle Tracking Cookies deaktivieren",
diff --git a/plugins/CoreAdminHome/lang/es.json b/plugins/CoreAdminHome/lang/es.json
index 70e8a505db..9ff7c4b667 100644
--- a/plugins/CoreAdminHome/lang/es.json
+++ b/plugins/CoreAdminHome/lang/es.json
@@ -22,6 +22,7 @@
"JavaScriptTracking": "Seguimiento con JavaScript",
"JSTracking_CampaignKwdParam": "Parámetro palabra clave de la campaña",
"JSTracking_CampaignNameParam": "Parámetro Nombre de la campaña",
+ "JSTracking_CodeNoteBeforeClosingHead": "Asegúrese que éste código se encuentre en cada página de su sitio web. Recomendamos copiarlo inmediatamente antes de cerrar la etiqueta %1$s",
"JSTracking_CustomCampaignQueryParam": "Utiliza nombres de parámetros de consulta personalizados para el nombre de la campaña y la palabra clave",
"JSTracking_CustomCampaignQueryParamDesc": "Nota: %1$sPiwik detectará automáticamente los parámetros de Google Analytics.%2$s",
"JSTracking_DisableCookies": "Desactivar todas las cookies de rastreo",
@@ -46,6 +47,7 @@
"JSTrackingIntro5": "Si desea hacer más que rastrear vistas de páginas, revise la %1$sDocumentación de Javascript de Piwik%2$s acerca de las funciones disponibles. Utilizando estas funciones puede rastrear objetivos, variables personalizadas, órdenes de comercio electrónico, carritos abandonados y más.",
"LogoNotWriteableInstruction": "Para utilizar su logo personalizado en lugar del logo estándar de Piwik puede conceder permisos de escritura a este directorio: %1$s Piwik necesita el permiso de escritura para sus logos guardados en los archivos %2$s.",
"FileUploadDisabled": "La carga de archivos no está habilitada en su configuración de PHP. Para cargar su logotipo personalizado, por favor ingrese %s en el php.ini y reinicie su servidor de internet.",
+ "LogoUploadFailed": "El fichero no ha podido subirse de forma correcta. Por favor, comprueba si el fichero tiene un formato correcto.",
"LogoUpload": "Seleccione un logo para subir",
"FaviconUpload": "Selecciona un Favicon para subir",
"LogoUploadHelp": "Sube un archivo en formato %1$s con una altura mínima de %2$s píxeles.",
@@ -70,6 +72,7 @@
"SendPluginUpdateCommunication": "Envíe un correo electrónico cuando la actualización del complemento esté disponible",
"SendPluginUpdateCommunicationHelp": "Se enviará un correo electrónico a los Super Usuarios cuando haya disponible una nueva versión de un complemento.",
"StableReleases": "Si Piwik es una parte crítica de su negocio, le recomendamos que utilice la última versión estable. Si usa la última versión beta y encuentra un error o tiene alguna sugerencia, por favor %1$sver aquí%2$s.",
+ "LtsReleases": "Las versiones LTS (Soporte de larga duración) reciben solo correcciones de seguridad y errores.",
"SystemPluginSettings": "Ajustes de complemento del sistema",
"TrackAGoal": "Seguimiento de un objetivo",
"TrackingCode": "Código de seguimiento",
@@ -83,6 +86,7 @@
"YouAreOptedOut": "Actualmente no hay optado.",
"YouMayOptOut": "Puede escojer no tener un único número de identificación de la cookie de análisis de internet asignado a su ordenador para prevenir la agregación y el análisis de datos recogidos en este sitio de internet.",
"YouMayOptOutBis": "Para escoger esto, por favor haga clic debajo para recibir una cookie opt-out (para no ser seguido).",
- "OptingYouOut": "Opción a salir, por favor espere..."
+ "OptingYouOut": "Opción a salir, por favor espere...",
+ "ProtocolNotDetectedCorrectly": "Actualmente estás usando Piwik sobre una conexión SSL (usando HTTPs), pero Piwik solo puede detectar una conexión insegura en el servidor."
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/fr.json b/plugins/CoreAdminHome/lang/fr.json
index 98bf55ee02..016168de64 100644
--- a/plugins/CoreAdminHome/lang/fr.json
+++ b/plugins/CoreAdminHome/lang/fr.json
@@ -24,6 +24,7 @@
"JavaScriptTracking": "Suivi par JavaScript",
"JSTracking_CampaignKwdParam": "Paramètre de la campagne de mot-clé",
"JSTracking_CampaignNameParam": "Paramètre nom de la campagne",
+ "JSTracking_CodeNoteBeforeClosingHead": "Vérifiez que ce code est présent sur l'ensemble des pages de votre site. Nous vous recommandons de le placer immédiatement avant la balise de fermeture %1$s.",
"JSTracking_CustomCampaignQueryParam": "Utilisez des paramètres de requête personnalisés pour le nom et le mot-clé de la campagne",
"JSTracking_CustomCampaignQueryParamDesc": "Note : %1$sPiwik détectera automatiquement les paramètres de Google Analytics.%2$s",
"JSTracking_DisableCookies": "Désactiver tous les cookies de suivi",
diff --git a/plugins/CoreAdminHome/lang/it.json b/plugins/CoreAdminHome/lang/it.json
index 3db3978f69..39f3c15d56 100644
--- a/plugins/CoreAdminHome/lang/it.json
+++ b/plugins/CoreAdminHome/lang/it.json
@@ -7,9 +7,9 @@
"ReleaseChannel": "Canale release",
"ClickHereToOptIn": "Clicca qui per accettare (opt-in).",
"ClickHereToOptOut": "Clicca qui per rifiutare (opt-out).",
- "CustomLogoFeedbackInfo": "Se si personalizza il logo Piwik, si potrebbe anche essere interessati a nascondere il link %1$s nel menu in alto. A tale scopo, è possibile disattivare il plugin Feedback nella pagina %2$sGestione Plugin%3$s.",
+ "CustomLogoFeedbackInfo": "Se si personalizza il logo Piwik, si potrebbe anche essere interessati a nascondere il link %1$s nel menu in alto. A tale scopo, è possibile disattivare il plugin Feedback nella pagina di %2$sGestione Plugin%3$s.",
"CustomLogoHelpText": "È possibile personalizzare il logo Piwik che verrà visualizzato nell'interfaccia utente e nei reports e-mail.",
- "DevelopmentProcess": "Poichè il nostro %1$sprocesso di sviluppo%2$s include migliaia di test automatizzati, i Beta Tester giocano un ruolo chiave nel raggiungimento in Piwik della \"Politica no bug\".",
+ "DevelopmentProcess": "Poiché il nostro %1$sprocesso di sviluppo%2$s include migliaia di test automatizzati, i Beta Tester giocano un ruolo chiave nel raggiungimento in Piwik della \"Politica no bug\".",
"EmailServerSettings": "Impostazioni server e-mail",
"ForBetaTestersOnly": "Solo per beta tester",
"ImageTracking": "Tracking Immagini",
@@ -24,7 +24,7 @@
"JavaScriptTracking": "Tracciamento JavaScript",
"JSTracking_CampaignKwdParam": "Parametro Keyword Campagna",
"JSTracking_CampaignNameParam": "Parametro Nome Campagna",
- "JSTracking_CodeNoteBeforeClosingHead": "Assicurati che questo codice sia presente su ogni pagina del tuo sito. Ti raccomandiamo di incollarlo subito prima del tag %1$s di chiusura.",
+ "JSTracking_CodeNoteBeforeClosingHead": "Assicurati che questo codice sia presente in ogni pagina del tuo sito. Ti raccomandiamo di incollarlo subito prima del tag %1$s di chiusura.",
"JSTracking_CustomCampaignQueryParam": "Utilizza i nomi dei parametri di query personalizzati per il nome della campagna e parola chiave",
"JSTracking_CustomCampaignQueryParamDesc": "Nota: %1$sPiwik rivelerà automaticamente i parametri di Google Analytics.%2$s",
"JSTracking_DisableCookies": "Disabilita tutti i cookies di tracking",
@@ -49,10 +49,10 @@
"JSTrackingIntro5": "Se volete fare altro oltre che tracciare le viste pagina, preghiamo di controllare la %1$sDocumentazione Piwik Javascript Tracking%2$s per l'elenco delle funzioni disponibili. Utilizzando queste funzioni potrete tracciare obiettivi, variabili personalizzate, ordini ecommerce, carrelli abbandonati e altro.",
"LogoNotWriteableInstruction": "Per utilizzare il tuo logo personalizzato al posto del logo di Piwik, da' i permessi di scrittura a questa directory: %1$s Piwik necessita dell'accesso in scrittura per i tuoi loghi conservati nei files %2$s.",
"FileUploadDisabled": "Il caricamento dei files non è abilitato nella configurazione del tuo PHP. Per caricare il tuo logo personalizzato devi impostare %s nel php.ini e riavviare il server.",
- "LogoUploadFailed": "E' stato impossibile leggere il file caricato. Assicurati che il file abbia un formato valido.",
+ "LogoUploadFailed": "È stato impossibile leggere il file caricato. Assicurati che esso abbia un formato valido.",
"LogoUpload": "Seleziona un logo da caricare",
"FaviconUpload": "Seleziona una Favicon da caricare",
- "LogoUploadHelp": "Caricate un file nei formati %1$s con un'altezza minima di %2$s pixels",
+ "LogoUploadHelp": "Caricate un file nei formati %1$s con un'altezza minima di %2$s pixel",
"MenuDiagnostic": "Diagnostica",
"MenuGeneralSettings": "Impostazioni generali",
"MenuManage": "Gestione",
@@ -61,7 +61,7 @@
"OptOutCompleteBis": "Nota che se cancelli i tuoi cookie, cancelli anche il cookie di opt-out, e se cambi computer o browser web, devi fare la procedura di opt-out nuovamente.",
"OptOutDntFound": "Non vieni tracciato poiché il tuo browser comunica che non lo desideri. Questa è un'impostazione del tuo browser, dunque non potrai effettuare l'opt-in finchè non disabiliti la funzionalità \"Non Tracciare\".",
"OptOutExplanation": "Piwik è impegnato ad assicurare la riservatezza su Internet. Per dare ai tuoi ospiti la possibilità di escludersi dalle Statistiche Web Piwik, è possibile aggiungere il seguente codice HTML in una pagina del tuo sito web, ad esempio in una pagina sulla privacy.",
- "OptOutExplanationBis": "Questo codice serve per mostrare un iFrame contenente un link per i tuoi visitatori per opt-out per le impostazioni di Piwik, tramite un opt-out cookie nei loro browser. %1$s Clicca qui%2$s per vedere il contenuto che sarà mostrato nell'iFrame.",
+ "OptOutExplanationBis": "Questo codice serve per visualizzare un iframe contenente un link, perché i tuoi visitatori possano effettuare un opt-out da Piwik mediante un apposito cookie nei loro browser. %1$sClicca qui%2$s per vedere il contenuto che sarà mostrato nell'iframe.",
"OptOutForYourVisitors": "Piwik opt-out per i tuoi visitatori",
"PiwikIsInstalledAt": "Piwik è installato su",
"PersonalPluginSettings": "Impostazioni Personali Plugin",
@@ -69,7 +69,7 @@
"PluginSettingReadNotAllowed": "Non sei abilitato a leggere il valore dell'impostazione \"%1$s\" nel plugin \"%2$s\"",
"PluginSettings": "Impostazioni plugin",
"PluginSettingsIntro": "Qui puoi cambiare le impostazioni dei seguenti plugin di terze parti:",
- "PluginSettingsValueNotAllowed": "Il valore del campo \"%1$s\" nel plugin \"%2$s\" non è consentito",
+ "PluginSettingsValueNotAllowed": "Il valore contenuto nel campo \"%1$s\" nel plugin \"%2$s\" non è consentito",
"PluginSettingsSaveFailed": "Salvataggio delle impostazioni del plugin fallito",
"SendPluginUpdateCommunication": "Manda un'email quando è disponibile l'aggiornamento di un plugin",
"SendPluginUpdateCommunicationHelp": "Verrà inviata una email ai Super User quando è disponibile una nuova versione di un plugin.",
@@ -90,6 +90,6 @@
"YouMayOptOutBis": "Per fare questa scelta, clicca qui di seguito per ricevere un cookie di opt-out.",
"OptingYouOut": "Sto acquisendo la tua rinuncia, attendi...",
"ProtocolNotDetectedCorrectly": "Al momento stai guardando Piwik tramite una connessione sicura SSL (uso di https) ma Piwik ha potuto rilevare sul server solo una connessione non protetta.",
- "ProtocolNotDetectedCorrectlySolution": "Per assicurarti che Piwik richieda e offra con sicurezza il tuo contenuto tramite HTTPS, puoi modificare il file %1$s e configurare le impostazioni del proxy, o puoi aggiungere la riga %2$s sotto la sezione %3$s. %4$sLeggi di più%5$s"
+ "ProtocolNotDetectedCorrectlySolution": "Per assicurarti che Piwik richieda e offra con sicurezza il tuo contenuto tramite HTTPS, puoi modificare il file %1$s e configurare le impostazioni del proxy, o puoi aggiungere la riga %2$s nella sezione %3$s. %4$sLeggi di più%5$s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/ka.json b/plugins/CoreAdminHome/lang/ka.json
index 8e349f84f9..f7eaf8ee2e 100644
--- a/plugins/CoreAdminHome/lang/ka.json
+++ b/plugins/CoreAdminHome/lang/ka.json
@@ -6,7 +6,7 @@
"OptOutComplete": "უარი დაფიქსირდა; ამ საიტზე თქვენი ვიზიტები არ ჩაიწერება ვებ ანალიზატორის ინსტრუმენტით.",
"OptOutCompleteBis": "მიაქციეთ ყურადღება, რომ თუ თქვენ გაასუფთავებთ ქუქიებს, წაიშლება უარის ქუქი, ან თუ შეიცვლით კომპიუტერს ან ვებ ბრაუზერს უარის დაფიქსირების პროცედურა თავიდან უნდა განახორციელოთ.",
"OptOutExplanation": "Piwik გამიზნულია ინტერნეტში კონფიდენციალურობის დაცვისთვის. რათა თქვენს ვიზიტორებს ქონდეთ საშუალება უარი თქვან Piwik Web Analytics მონაწილეობაზე, თქვენ შეგიძლიათ შემდეგი HTML კოდი ჩაამატოთ თქვენი ვებ საიტის ერთ–ერთ გვერდზე, მაგალითად კონფიდენციალურობის გვერდზე.",
- "OptOutExplanationBis": "ტეგი აჩვენებს Iframe, რომელიც შეიცავს ბმულს თქვენი ვიზიტორებისთვის, რომელზე დაწკაპუნებითაც ისინი უარს იტყვიან Piwik–ზე მათ ბრაუზერში უარის ქუქის ჩამატებით. %s დააწკაპუნეთ აქ%s, რომ იხილოთ მასალა, რომელიც გამოჩნდება iFrame–ით.",
+ "OptOutExplanationBis": "ტეგი აჩვენებს Iframe, რომელიც შეიცავს ბმულს თქვენი ვიზიტორებისთვის, რომელზე დაწკაპუნებითაც ისინი უარს იტყვიან Piwik–ზე მათ ბრაუზერში უარის ქუქის ჩამატებით. %1$s დააწკაპუნეთ აქ%2$s, რომ იხილოთ მასალა, რომელიც გამოჩნდება iFrame–ით.",
"OptOutForYourVisitors": "თქვენი ვიზიტორების უარი Piwik–ზე",
"YouAreOptedIn": "ამჟამად თქვენ მონაწილეობთ ანალიზში",
"YouAreOptedOut": "ამჟამად თქვენ არ მონაწილეობთ ანალიზში",
diff --git a/plugins/CoreAdminHome/lang/nl.json b/plugins/CoreAdminHome/lang/nl.json
index 5814095c64..e12c716c73 100644
--- a/plugins/CoreAdminHome/lang/nl.json
+++ b/plugins/CoreAdminHome/lang/nl.json
@@ -2,8 +2,9 @@
"CoreAdminHome": {
"AddNewTrustedHost": "Voeg een nieuwe betrouwbare server toe",
"Administration": "Administratie",
- "ArchivingSettings": "Archivering instellingen",
- "BrandingSettings": "Logo instellingen",
+ "ArchivingSettings": "Archiveringsinstellingen",
+ "BrandingSettings": "Logo-instellingen",
+ "ReleaseChannel": "Versiekanaal",
"ClickHereToOptIn": "Klik hier om u aan te melden.",
"ClickHereToOptOut": "Klik hier om u af te melden.",
"CustomLogoFeedbackInfo": "Als u het Piwik logo bijwerkt, heeft u wellicht ook interesse om de %1$s link te verbergen in het menu bovenaan. Om dit te doen, kunt u de feedback plugin uitschakelen in de pagina van de %2$sManage Plugins%3$s.",
@@ -23,6 +24,7 @@
"JavaScriptTracking": "JavaScript Tracking",
"JSTracking_CampaignKwdParam": "Campagne sleutelwoord parameter",
"JSTracking_CampaignNameParam": "Campagna naam parameter",
+ "JSTracking_CodeNoteBeforeClosingHead": "Zorg dat deze code op elke pagina van uw website is geplaatst. We raden aan hem direct vóór de afsluitende %1$s tag te plakken.",
"JSTracking_CustomCampaignQueryParam": "Gebruik aangepaste query parameter namen voor de campagne naam & sleutelwoorden",
"JSTracking_CustomCampaignQueryParamDesc": "Opmerking: %1$s Piwik detecteert automatisch Google Analytics parameters.%2$s",
"JSTracking_DisableCookies": "Schakel alle tracking cookies uit",
@@ -47,6 +49,7 @@
"JSTrackingIntro5": "Indien je meer wilt bijhouden dan paginaweergaves, lees dan de %1$sPiwik Javascript Tracking documentatie%2$s voor de lijst van beschikbare functies. Via deze functies kun je doelen, eigen variabelen, ecommerce bestellingen, afgebroken bestellingen en meer.",
"LogoNotWriteableInstruction": "Om je eigen logo te gebruiken in plaats van het standaard Piwik logo, zijn er schrijf rechten nodig tot de volgende bestandmap: %1$s Piwik heeft schrijfrechten nodig voor de jouw logo's opgeslagen in de bestanden %2$s",
"FileUploadDisabled": "Het uploaden van documenten is niet geactiveerd in je PHP configuratie. Om een aangepast logo up te loaden pas %s aan in php.ini en herstart de webserver.",
+ "LogoUploadFailed": "Het geüploade bestand kon niet worden verwerkt. Controleer of het bestand een geldig bestandsformaat heeft.",
"LogoUpload": "Selecteer een logo om te uploaden",
"FaviconUpload": "Selecteer een favicon om up te loaden",
"LogoUploadHelp": "Upload een bestand in %1$s formaten met een minimum hoogte van %2$s pixels.",
diff --git a/plugins/CoreAdminHome/lang/sv.json b/plugins/CoreAdminHome/lang/sv.json
index 6cb5fc8127..9d70b5bfc4 100644
--- a/plugins/CoreAdminHome/lang/sv.json
+++ b/plugins/CoreAdminHome/lang/sv.json
@@ -89,6 +89,7 @@
"YouMayOptOut": "Du kan välja att inte ha ett unikt identifieringsnummer i en cookie tilldelad till din dator för att undvika analys av uppgifter som samlats in på denna webbplats.",
"YouMayOptOutBis": "För att göra det valet, vänligen klicka nedan för att lagra en cookie för exkludering.",
"OptingYouOut": "Undantar dig, vänligen vänta...",
- "ProtocolNotDetectedCorrectly": "Du använder just nu Piwik över en säker SSL-anslutning (via HTTPS), men Piwik kan bara upptäcka en osäker anslutning på servern."
+ "ProtocolNotDetectedCorrectly": "Du använder just nu Piwik över en säker SSL-anslutning (via HTTPS), men Piwik kan bara upptäcka en osäker anslutning på servern.",
+ "ProtocolNotDetectedCorrectlySolution": "För att säkerställa att Piwik gör förfrågningar och visar ditt innehållet säkert så görs detta över HTTPS, du kan ändra detta i filen %1$s och antingen konfigurera dina proxyinställningar eller lägga till raden %2$s nedanför sektionen %3$s. %4$sLäs mer%5$s"
}
} \ No newline at end of file
diff --git a/plugins/CoreAdminHome/lang/tr.json b/plugins/CoreAdminHome/lang/tr.json
index 69657dffcc..d811a2a762 100644
--- a/plugins/CoreAdminHome/lang/tr.json
+++ b/plugins/CoreAdminHome/lang/tr.json
@@ -1,9 +1,11 @@
{
"CoreAdminHome": {
- "Administration": "Yönetici",
+ "AddNewTrustedHost": "Güvenilir sunucu ekle",
+ "Administration": "Yönetim",
"ArchivingSettings": "Arşivleme ayarları",
- "BrandingSettings": "Marka ayarları",
- "ClickHereToOptIn": "İzin vermek için tıklayınız.",
+ "BrandingSettings": "Markalama ayarları",
+ "ReleaseChannel": "Dağıtım kanalı",
+ "ClickHereToOptIn": "İzin vermek için tıklayın.",
"ClickHereToOptOut": "İzni iptal etmek için tıklayınız.",
"CustomLogoFeedbackInfo": "Eğer Piwik logosunu değiştirdiyseniz, üst menüden %1$s bağlantısını da kaldırmak isteyebilirsiniz. Bunun için, %2$sManage Plugins%3$s sayfasından Geribildirim ( Feedback ) eklentisini iptal edebilirsiniz.",
"CustomLogoHelpText": "E-posta raporlarında ve kullanıcı arayüzünde kullanılacak olan Piwik logosunu değiştirebilirsiniz.",
@@ -55,7 +57,7 @@
"PluginSettingsSaveFailed": "Eklenti ayarları kaydedilemedi",
"SendPluginUpdateCommunication": "Eklenti güncellemesi olduğunda e-posta gönder",
"StableReleases": "Eğer Piwik işiniz için kritik bir parçaysa, son ve stabil olan versiyonu kullanmanızı öneririz. Eğer en son güncel betayı kullanıyorsanız ve bir hata bulur ya da öneriniz olursa, lütfen şuraya%1$s bakın%2$s.",
- "SystemPluginSettings": "Sistem Eklenti Ayarları",
+ "SystemPluginSettings": "Sistem Uygulama Eki Ayarları",
"TrackAGoal": "Bir hedef izleme",
"TrackingCode": "İzleme Kodu",
"TrustedHostConfirm": "Güvenilir alan adınızı değiştirmek istediğinizden emin misiniz?",
diff --git a/plugins/CoreAdminHome/lang/uk.json b/plugins/CoreAdminHome/lang/uk.json
index 63711249da..df0b5a552f 100644
--- a/plugins/CoreAdminHome/lang/uk.json
+++ b/plugins/CoreAdminHome/lang/uk.json
@@ -1,16 +1,95 @@
{
"CoreAdminHome": {
+ "AddNewTrustedHost": "Додати новий довірений хост",
"Administration": "Адміністрування",
- "EmailServerSettings": "Налаштування поштового сервера",
- "MenuGeneralSettings": "Загальні налаштування",
- "OptOutComplete": "Відмову прийнято; ваші заходи на цей сайт не буде записано в базу даних веб-аналітики.",
- "OptOutCompleteBis": "Зверніть увагу, що при очищенні всіх файлів cookie, видаленні конкретного файлу cookie чи зміни веб-переглядача необхідно буде знову пройти процедуру відмови.",
- "OptOutExplanation": "Piwik турбується про конфіденціальність в Інтернеті. Щоб надати вашим відвідувачам можливість відмовитися від включення інфомації про них до бази даних веб-аналітики Piwik, додайте наступний HTML код на одну з ваших сторінок - для прикладу на сторінку \"Політика конфіденційності\".",
+ "ArchivingSettings": "Налаштування архівації",
+ "BrandingSettings": "Налаштування логотипу",
+ "ReleaseChannel": "Канал випуску",
+ "ClickHereToOptIn": "Натисніть, щоб ви враховувалися в аналітиці.",
+ "ClickHereToOptOut": "Натисніть, щоб відмовитися від обліку вас в аналітиці.",
+ "CustomLogoFeedbackInfo": "Якщо ви іспользуйете свій логотип, вам, можливо, також знадобиться приховати посилання %1$s в верхньому меню. Для цього просто відключіть плагін Feedback (зворотний зв'язок) на сторінці %2$sУправління плагінами%3$s.",
+ "CustomLogoHelpText": "Ви можете додати свій логотип, який буде відображатися звітах.",
+ "DevelopmentProcess": "У той час як наш %1$sпроцес розробки%2$s включає в себе тисячі автоматизованих тестів, бета-тестери грають ключову роль в досягненні \"No bug policy\" в Piwik.",
+ "EmailServerSettings": "Налаштування серверу електронної пошти",
+ "ForBetaTestersOnly": "Тільки для бета-тестерів",
+ "ImageTracking": "Відстеження через зображення",
+ "ImageTrackingIntro1": "Коли відвідувач відключив JavaScript, або коли JavaScript не може бути використано, ви можете використовувати посилання на зображення для відстеження відвідувачів.",
+ "ImageTrackingIntro2": "Створіть посилання нижче і розмістіть згенерований на сторінках HTML. Якщо ви використовуєте це в якості запасного варіанту для відстеження без JavaScript, ви можете його оточити його в тег %1$s.",
+ "ImageTrackingIntro3": "Весь список опцій, які можна використовувати з зображенням-посиланням відстеження дивіться в %1$sTracking API Documentation%2$s.",
+ "ImageTrackingLink": "Посилання на зображення для відстеження",
+ "ImportingServerLogs": "Імпорт логів сервера",
+ "ImportingServerLogsDesc": "Альтернативою відстеження відвідувачів через браузер (замість JavaScript або посилання на зображення) є постійне імпортування логів сервера. дізнатися більше про %1$sServer Log File Analytics%2$s.",
+ "InvalidPluginsWarning": "Такий модуль не сумісні з %1$s і не можуть бути завантажені: %2$s.",
+ "InvalidPluginsYouCanUninstall": "Ви можете оновити або видалити ці плагіни на сторінці %1$sУправління плагінами%2$s.",
+ "JavaScriptTracking": "JavaScript-відстеження",
+ "JSTracking_CampaignKwdParam": "Параметр Ключового слова кампанії",
+ "JSTracking_CampaignNameParam": "Параметр Імені кампанії",
+ "JSTracking_CodeNoteBeforeClosingHead": "Переконайтеся, що цей код знаходиться на кожній сторінці вашого веб сайту. Ми рекомендуємо вставляти його відразу перед закриттям тега %1$s.",
+ "JSTracking_CustomCampaignQueryParam": "Використовувати для користувача імена параметрів в запиті для назви кампанії та ключового слова",
+ "JSTracking_CustomCampaignQueryParamDesc": "Примітка: %1$sPiwik автоматично визначить параметри Google Analytics.%2$s",
+ "JSTracking_DisableCookies": "Відключити всі відстеження cookies",
+ "JSTracking_DisableCookiesDesc": "відключення всіх first party cookies. існуючі cookies Piwik для цього веб-сайту будуть видалені при наступному перегляді сторінки.",
+ "JSTracking_EnableDoNotTrack": "Активувати виявлення DoNotTrack на стороні користувача.",
+ "JSTracking_EnableDoNotTrack_AlreadyEnabled": "Примітка: на стороні сервера підтримка DoNotTrack була увімкнена, так що ця опція не матиме ніякого ефекту.",
+ "JSTracking_EnableDoNotTrackDesc": "Користувач не буде відслідковуватися, якщо він цього не хоче.",
+ "JSTracking_GroupPageTitlesByDomain": "Підставляти домен сайту перед назвою сторінки при відстеженні",
+ "JSTracking_GroupPageTitlesByDomainDesc1": "Так що, якщо хтось відвідує сторінку 'Про нас' на піддомені blog.%1$s він буде записаний як 'blog \/ Про нас'. Це найпростіший спосіб отримати огляд вашого трафіку по піддоменах.",
+ "JSTracking_MergeAliases": "У звіті «Зовнішні посилання» приховати кліки відомих псевдонімів сайту",
+ "JSTracking_MergeAliasesDesc": "Переходи по посиланнях на псевдоніми домену (наприклад, %s) не враховуватимуться як «Зовнішні посилання».",
+ "JSTracking_MergeSubdomains": "Відстежувати відвідувачів через все піддомени сайту",
+ "JSTracking_MergeSubdomainsDesc": "Якщо один відвідувач заходив на %1$s і %2$s, то відвідування будуть враховуватися як унікальний відвідувач.",
+ "JSTracking_PageCustomVars": "Відстежувати змінні для кожного виду сторінки",
+ "JSTracking_PageCustomVarsDesc": "Наприклад, ім'я змінної «Категорія», а значення – «Офіційні документи».",
+ "JSTracking_VisitorCustomVars": "Відстежувати змінні для відвідувача",
+ "JSTracking_VisitorCustomVarsDesc": "Наприклад, ім'я змінної «Тип», а значення – «Клієнт».",
+ "JSTrackingIntro1": "Ви можете відстежувати відвідувачів різними способами. Ми рекомендуємо використовувати для цього JavaScript. Щоб використовувати цей метод ви повинні переконатися, що цей код розміщений на кожній сторінці.",
+ "JSTrackingIntro2": "Як тільки ви отримали Javascript код для вашого сайту, скопіюйте і вставте його на всі сторінки вашого сайту, на яких ви хочете відслідковувати відвідувачів.",
+ "JSTrackingIntro3": "У більшості CMS, блогах, сайтах і т.д. ви можете використовувати готовий плагін, щоб зробити технічні правки на сайті замість вас. (Дивіться %1$sсписок плагінів для інтеграції з Piwik%2$s.) Якщо поки немає відповідного плагіна - ви можете відредагувати шаблон сайту і додати цей код в \"footer\" файлу.",
+ "JSTrackingIntro4": "Якщо ви не хочете або не можете використовувати JavaScript, %1$sскористайтеся відстеженням відвідувачів через зображення%2$s.",
+ "JSTrackingIntro5": "Якщо ви хочете більше, ніж просте відстеження сторінок, будь ласка, ознайомтеся з %1$sPiwik Javascript Tracking documentation%2$s для перегляду всіх функцій. За допомогою цих функцій ви можете відстежувати цілі, призначені для користувача змінні, замовлення електронної комерції, неоформлені замовлення і багато іншого.",
+ "LogoNotWriteableInstruction": "Щоб використовувати власне лого замість стандартного Piwik, відкрийте для запису цю папку: %1$s Piwik потрібен доступ на запис вашого лого, що зберігається в файлах %2$s.",
+ "FileUploadDisabled": "Завантаження файлів не включене у вашій конфігурації PHP. Для завантаження іншого логотипу вставите %s в php.ini і перезапустіть веб-сервер.",
+ "LogoUploadFailed": "Завантажений файл не може бути оброблений. Будь ласка, перевірте, що файл має потрібний формат.",
+ "LogoUpload": "Виберіть лого для завантаження",
+ "FaviconUpload": "вибрати Favicon для завантаження",
+ "LogoUploadHelp": "Будь ласка, закачуйте файли в %1$s форматах, мінімальне обмеження по висоті – %2$s пікселів.",
+ "MenuDiagnostic": "Діагностика",
+ "MenuGeneralSettings": "Основні налаштування",
+ "MenuManage": "Управління",
+ "MenuDevelopment": "Розробка",
+ "OptOutComplete": "Виняток з політики конфіденційності завершено; ваші відвідування на даний сайт не враховуватимуться системою веб аналітики. Ми поважаємо ваш вибір.",
+ "OptOutCompleteBis": "Зауважте, що якщо ви очистите cookies браузера, то, швидше за все, видалитсья і винятковий cookie, або якщо ви поміняєте комп'ютер або браузер, то необхідно буде пройти процедуру виключення знову.",
+ "OptOutDntFound": "Ваші дії не відстежувалися, так як ваш браузер повідомляє, що ви не хочете цього. Це настройка вашого браузера, тому у вас не буде можливості включити її до тих пір, поки ви не відключите опцію \"Не відстежувати\".",
+ "OptOutExplanation": "Piwik – за збереження особистих даних в мережі. Тому дана система може запропонувати вашим користувачам вибір виключення з політики конфіденційності (відмова від подальшого збору статистики про користувача). Ви можете вставити наступний HTML-код на одну з ваших сторінок сайту, наприклад на сторінку про гарантії конфіденційності.",
"OptOutExplanationBis": "Тег покаже \"iframe\", в якому міститиметься посилання для ваших відвідувачів, клацнувши на яке, вони зможуть відмовитися від потрапляння в веб-аналітику через отримання відповідного файлу cookie. %1$s Клацніть тут%2$s, щоб переглянути вміст що буде показано в \"iframe\".",
- "OptOutForYourVisitors": "Відмова від включення в аналітику для відвідувачів.",
- "YouAreOptedIn": "Наразі статистика записується в базу даних",
- "YouAreOptedOut": "Наразі статистика не записується в базу даних",
- "YouMayOptOut": "Ви можете вибрати варіант, щоб не отримувати унікального ідентифікатора cookie призначеного для вашого компютера, щоб уникнути агрегації та аналізу даних, зібраних цим веб-сайтом.",
- "YouMayOptOutBis": "Клацніть нижче для отримання файлу cookie для виключення даних з статистики."
+ "OptOutForYourVisitors": "Виняток з політики конфіденційності Piwik для відвідувачів",
+ "PiwikIsInstalledAt": "Piwik встановлений в",
+ "PersonalPluginSettings": "Персональні налаштування плагінів",
+ "PluginSettingChangeNotAllowed": "Вам не дозволено змінювати значення \"%1$s\" для плагіну \"%2$s\"",
+ "PluginSettingReadNotAllowed": "Ви не дозволено читати значення \"%1$s\" плагіну \"%2$s\"",
+ "PluginSettings": "Налаштування плагінів",
+ "PluginSettingsIntro": "Тут ви можете змінити налаштування для наступних плагінів:",
+ "PluginSettingsValueNotAllowed": "Значення для поля \"%1$s\" в плагіні \"%2$s\" не дозволено",
+ "PluginSettingsSaveFailed": "Помилка при збереженні налаштувань плагіна",
+ "SendPluginUpdateCommunication": "Відправити email з повідомленням, коли для плагіна буде доступна нова версія",
+ "SendPluginUpdateCommunicationHelp": "Лист буде відправлено суперкористувачеві коли буде доступна нова версія плагіна.",
+ "StableReleases": "Якщо Piwik є важливою частиною вашого бізнесу, ми рекомендуємо використовувати останню стабільну версію. Якщо ви використовуєте останню бета версію, і ви знайшли помилку або є пропозиція, будь ласка, %1$sперейдіть за посиланням%2$s.",
+ "LtsReleases": "Версії LTS (довгострокова підтримка) отримують тільки виправлення, що стосуються безпеки і помилок.",
+ "SystemPluginSettings": "Системні налаштування плагінів",
+ "TrackAGoal": "Відстежувати ціль",
+ "TrackingCode": "Код відстеження",
+ "TrustedHostConfirm": "Ви впевнені, що хочете змінити ім'я довіреного хоста Piwik?",
+ "TrustedHostSettings": "Довірені хости Piwik",
+ "UpdateSettings": "Налаштування оновлення",
+ "UseCustomLogo": "Використовувати свій логотип",
+ "ValidPiwikHostname": "Домен для Piwik",
+ "WithOptionalRevenue": "з додатковим доходом",
+ "YouAreOptedIn": "Про вас збирається статистичні дані.",
+ "YouAreOptedOut": "Ви відмовилися від збору статистичних даних.",
+ "YouMayOptOut": "Ви можете відмовитися від унікального cookie, прив'язаному до вашого браузеру, що ідентифікує вас в системі аналітики даного сайту, тим самим відмовившись від будь-якого збору відомостей про вас і їх аналізу на даному сайті.",
+ "YouMayOptOutBis": "Зніміть галочку і отримаєте виключення cookie для відмови збору даних.",
+ "OptingYouOut": "Відписуємо вас, будь ласка, зачекайте...",
+ "ProtocolNotDetectedCorrectly": "В даний момент ви переглядаєте Piwik через безпечне з'єднання SSL (використовуючи https), але Piwik зміг виявити тільки небезпечне з'єднання на сервері.",
+ "ProtocolNotDetectedCorrectlySolution": "Щоб упевнитися, что Piwik безпечно запитує і обробляє ваш контент через HTTPS, ви можете відредагувати свій файл %1$s або налаштувати ваші настройки проксі, або ви можете додати лінію %2$s під розділом %3$s. %4$sДізнатися більше%5$s"
}
} \ No newline at end of file
diff --git a/plugins/CoreConsole/Commands/GenerateVisualizationPlugin.php b/plugins/CoreConsole/Commands/GenerateVisualizationPlugin.php
index 83a4863396..92a5027716 100644
--- a/plugins/CoreConsole/Commands/GenerateVisualizationPlugin.php
+++ b/plugins/CoreConsole/Commands/GenerateVisualizationPlugin.php
@@ -25,6 +25,7 @@ class GenerateVisualizationPlugin extends GeneratePlugin
->addOption('visualizationname', null, InputOption::VALUE_REQUIRED, 'Visualization name ([a-Z0-9])')
->addOption('description', null, InputOption::VALUE_REQUIRED, 'Plugin description, max 150 characters')
->addOption('pluginversion', null, InputOption::VALUE_OPTIONAL, 'Plugin version')
+ ->addOption('overwrite', null, InputOption::VALUE_NONE, 'Generate even if plugin directory already exists.')
->addOption('full', null, InputOption::VALUE_OPTIONAL, 'If a value is set, an API and a Controller will be created as well. Option is only available for creating plugins, not for creating themes.');
}
diff --git a/plugins/CoreConsole/Commands/GitCommit.php b/plugins/CoreConsole/Commands/GitCommit.php
index 451ecb72ff..31d5e62bce 100644
--- a/plugins/CoreConsole/Commands/GitCommit.php
+++ b/plugins/CoreConsole/Commands/GitCommit.php
@@ -59,7 +59,7 @@ class GitCommit extends ConsoleCommand
if (!$this->hasChangesToBeCommitted()) {
$dialog = $this->getHelperSet()->get('dialog');
- $question = '<question>There are no changes to be commited in the super repo, do you just want to commit and converge submodules?</question>';
+ $question = '<question>There are no changes to be committed in the super repo, do you just want to commit and converge submodules?</question>';
if (!$dialog->askConfirmation($output, $question, false)) {
$output->writeln('<info>Cool, nothing done. Stage files using "git add" and try again.</info>');
return;
diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php
index e7d8c52185..2e74c243ef 100644
--- a/plugins/CoreHome/CoreHome.php
+++ b/plugins/CoreHome/CoreHome.php
@@ -110,6 +110,7 @@ class CoreHome extends \Piwik\Plugin
$jsFiles[] = "libs/bower_components/angular-animate/angular-animate.js";
$jsFiles[] = "libs/bower_components/angular-cookies/angular-cookies.js";
$jsFiles[] = "libs/bower_components/ngDialog/js/ngDialog.min.js";
+ $jsFiles[] = "libs/bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.min.js";
$jsFiles[] = "plugins/Morpheus/javascripts/piwikHelper.js";
$jsFiles[] = "plugins/Morpheus/javascripts/ajaxHelper.js";
$jsFiles[] = "plugins/Morpheus/javascripts/layout.js";
diff --git a/plugins/CoreHome/DataTableRowAction/RowEvolution.php b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
index 6c69019e05..2e3632d69e 100644
--- a/plugins/CoreHome/DataTableRowAction/RowEvolution.php
+++ b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
@@ -305,7 +305,7 @@ class RowEvolution
ob_end_clean();
// undo header change by sparkline renderer
- header('Content-type: text/html');
+ Common::sendHeader('Content-type: text/html');
// base64 encode the image and put it in an img tag
$spark = base64_encode($spark);
diff --git a/plugins/CoreHome/Tracker/LogTable/Action.php b/plugins/CoreHome/Tracker/LogTable/Action.php
new file mode 100644
index 0000000000..fdb69e5ec6
--- /dev/null
+++ b/plugins/CoreHome/Tracker/LogTable/Action.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreHome\Tracker\LogTable;
+
+use Piwik\Tracker\LogTable;
+
+class Action extends LogTable
+{
+ public function getName()
+ {
+ return 'log_action';
+ }
+
+ public function getColumnToJoinOnIdAction()
+ {
+ return 'idaction';
+ }
+
+ public function getLinkTableToBeAbleToJoinOnVisit()
+ {
+ return 'log_link_visit_action';
+ }
+
+}
diff --git a/plugins/CoreHome/Tracker/LogTable/Conversion.php b/plugins/CoreHome/Tracker/LogTable/Conversion.php
new file mode 100644
index 0000000000..e920864088
--- /dev/null
+++ b/plugins/CoreHome/Tracker/LogTable/Conversion.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreHome\Tracker\LogTable;
+
+use Piwik\Tracker\LogTable;
+
+class Conversion extends LogTable
+{
+ public function getName()
+ {
+ return 'log_conversion';
+ }
+
+ public function getColumnToJoinOnIdVisit()
+ {
+ return 'idvisit';
+ }
+} \ No newline at end of file
diff --git a/plugins/CoreHome/Tracker/LogTable/ConversionItem.php b/plugins/CoreHome/Tracker/LogTable/ConversionItem.php
new file mode 100644
index 0000000000..566841b4fa
--- /dev/null
+++ b/plugins/CoreHome/Tracker/LogTable/ConversionItem.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreHome\Tracker\LogTable;
+
+use Piwik\Tracker\LogTable;
+
+class ConversionItem extends LogTable
+{
+ public function getName()
+ {
+ return 'log_conversion_item';
+ }
+
+ public function getColumnToJoinOnIdVisit()
+ {
+ return 'idvisit';
+ }
+
+}
diff --git a/plugins/CoreHome/Tracker/LogTable/LinkVisitAction.php b/plugins/CoreHome/Tracker/LogTable/LinkVisitAction.php
new file mode 100644
index 0000000000..cb102d407c
--- /dev/null
+++ b/plugins/CoreHome/Tracker/LogTable/LinkVisitAction.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreHome\Tracker\LogTable;
+
+use Piwik\Tracker\LogTable;
+
+class LinkVisitAction extends LogTable
+{
+ public function getName()
+ {
+ return 'log_link_visit_action';
+ }
+
+ public function getColumnToJoinOnIdAction()
+ {
+ return 'idaction_url';
+ }
+
+ public function getColumnToJoinOnIdVisit()
+ {
+ return 'idvisit';
+ }
+}
diff --git a/plugins/CoreHome/Tracker/LogTable/Visit.php b/plugins/CoreHome/Tracker/LogTable/Visit.php
new file mode 100644
index 0000000000..f403c37697
--- /dev/null
+++ b/plugins/CoreHome/Tracker/LogTable/Visit.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CoreHome\Tracker\LogTable;
+
+use Piwik\Tracker\LogTable;
+
+class Visit extends LogTable
+{
+ public function getName()
+ {
+ return 'log_visit';
+ }
+
+ public function getColumnToJoinOnIdVisit()
+ {
+ return 'idvisit';
+ }
+
+ public function shouldJoinWithSubSelect()
+ {
+ return true;
+ }
+
+} \ No newline at end of file
diff --git a/plugins/CoreHome/images/applogo_128.png b/plugins/CoreHome/images/applogo_128.png
new file mode 100644
index 0000000000..65414dcc7a
--- /dev/null
+++ b/plugins/CoreHome/images/applogo_128.png
Binary files differ
diff --git a/plugins/CoreHome/images/applogo_144.png b/plugins/CoreHome/images/applogo_144.png
new file mode 100644
index 0000000000..9db6030351
--- /dev/null
+++ b/plugins/CoreHome/images/applogo_144.png
Binary files differ
diff --git a/plugins/CoreHome/images/applogo_192.png b/plugins/CoreHome/images/applogo_192.png
new file mode 100644
index 0000000000..ad223db3ff
--- /dev/null
+++ b/plugins/CoreHome/images/applogo_192.png
Binary files differ
diff --git a/plugins/CoreHome/images/applogo_256.png b/plugins/CoreHome/images/applogo_256.png
new file mode 100644
index 0000000000..152922a254
--- /dev/null
+++ b/plugins/CoreHome/images/applogo_256.png
Binary files differ
diff --git a/plugins/CoreHome/images/applogo_32.png b/plugins/CoreHome/images/applogo_32.png
new file mode 100644
index 0000000000..174c8ecbf0
--- /dev/null
+++ b/plugins/CoreHome/images/applogo_32.png
Binary files differ
diff --git a/plugins/CoreHome/images/applogo_72.png b/plugins/CoreHome/images/applogo_72.png
new file mode 100644
index 0000000000..d9493feed9
--- /dev/null
+++ b/plugins/CoreHome/images/applogo_72.png
Binary files differ
diff --git a/plugins/CoreHome/images/applogo_732.png b/plugins/CoreHome/images/applogo_732.png
new file mode 100644
index 0000000000..3f40298650
--- /dev/null
+++ b/plugins/CoreHome/images/applogo_732.png
Binary files differ
diff --git a/plugins/CoreHome/javascripts/broadcast.js b/plugins/CoreHome/javascripts/broadcast.js
index 30b21f46af..dde45058ed 100644
--- a/plugins/CoreHome/javascripts/broadcast.js
+++ b/plugins/CoreHome/javascripts/broadcast.js
@@ -365,7 +365,7 @@ var broadcast = {
valFromUrl = getQuotedRegex(valFromUrl);
var regToBeReplace = new RegExp(paramName + '=' + valFromUrl, 'ig');
if (newParamValue == '') {
- // if new value is empty remove leading &, aswell
+ // if new value is empty remove leading &, as well
regToBeReplace = new RegExp('[\&]?' + paramName + '=' + valFromUrl, 'ig');
}
urlStr = urlStr.replace(regToBeReplace, newParamValue);
diff --git a/plugins/CoreHome/javascripts/dataTable.js b/plugins/CoreHome/javascripts/dataTable.js
index e1a0693d8c..e3e6cf456f 100644
--- a/plugins/CoreHome/javascripts/dataTable.js
+++ b/plugins/CoreHome/javascripts/dataTable.js
@@ -311,6 +311,7 @@ $.extend(DataTable.prototype, UIControl.prototype, {
bindEventsAndApplyStyle: function (domElem) {
var self = this;
self.cleanParams();
+ self.preBindEventsAndApplyStyleHook(domElem);
self.handleSort(domElem);
self.handleLimit(domElem);
self.handleOffsetInformation(domElem);
@@ -329,6 +330,14 @@ $.extend(DataTable.prototype, UIControl.prototype, {
self.handleColumnHighlighting(domElem);
self.setFixWidthToMakeEllipsisWork(domElem);
self.handleSummaryRow(domElem);
+ self.postBindEventsAndApplyStyleHook(domElem);
+ },
+
+ preBindEventsAndApplyStyleHook: function (domElem) {
+
+ },
+ postBindEventsAndApplyStyleHook: function (domElem) {
+
},
isWidgetized: function () {
@@ -611,7 +620,7 @@ $.extend(DataTable.prototype, UIControl.prototype, {
var tableRowLimits = piwik.config.datatable_row_limits,
evolutionLimits =
{
- day: [30, 60, 90, 180, 365, 500],
+ day: [8, 30, 60, 90, 180, 365, 500],
week: [4, 12, 26, 52, 104, 500],
month: [3, 6, 12, 24, 36, 120],
year: [3, 5, 10]
@@ -885,7 +894,7 @@ $.extend(DataTable.prototype, UIControl.prototype, {
if (self.param.keep_summary_row == 1) --totalRows;
- if (offsetEnd > totalRows) offsetEndDisp = totalRows;
+ if (offsetEnd > totalRows || Number(self.param.filter_limit) == -1) offsetEndDisp = totalRows;
// only show this string if there is some rows in the datatable
if (totalRows != 0) {
@@ -1665,16 +1674,21 @@ $.extend(DataTable.prototype, UIControl.prototype, {
tooltip.next().hover(function () {
var left = (-1 * tooltip.outerWidth() / 2) + th.width() / 2;
- var top = -1 * (tooltip.outerHeight() + 10);
+ var top = -1 * tooltip.outerHeight();
if (th.next().size() == 0) {
left = (-1 * tooltip.outerWidth()) + th.width() +
parseInt(th.css('padding-right'), 10);
}
+ if (th.offset().top + top < 0) {
+ top = th.outerHeight();
+ }
+
tooltip.css({
marginLeft: left,
- marginTop: top
+ marginTop: top,
+ top: 0
});
tooltip.stop(true, true).fadeIn(250);
diff --git a/plugins/CoreHome/javascripts/dataTable_rowactions.js b/plugins/CoreHome/javascripts/dataTable_rowactions.js
index e7308fb93f..8e337fb9fa 100644
--- a/plugins/CoreHome/javascripts/dataTable_rowactions.js
+++ b/plugins/CoreHome/javascripts/dataTable_rowactions.js
@@ -221,6 +221,11 @@ DataTable_RowAction.prototype.getLabelFromTr = function (tr) {
return value;
};
+/** Get row metadata object */
+DataTable_RowAction.prototype.getRowMetadata = function (tr) {
+ return tr.data('row-metadata') || {};
+};
+
/**
* Base method for opening popovers.
* This method will remember the parameter in the url and call doOpenPopover().
diff --git a/plugins/CoreHome/javascripts/manifest.json b/plugins/CoreHome/javascripts/manifest.json
index 93a1399678..829fa0f62f 100644
--- a/plugins/CoreHome/javascripts/manifest.json
+++ b/plugins/CoreHome/javascripts/manifest.json
@@ -3,9 +3,34 @@
"name": "Piwik - Open Source Analytics",
"icons": [
{
- "src": "../images/favicon.png",
+ "src": "../images/applogo_32.png",
"sizes": "32x32",
"type": "image/png"
+ },
+ {
+ "src": "../images/applogo_72.png",
+ "sizes": "72x72",
+ "type": "image/png"
+ },
+ {
+ "src": "../images/applogo_128.png",
+ "sizes": "128x128",
+ "type": "image/png"
+ },
+ {
+ "src": "../images/applogo_144.png",
+ "sizes": "144x144",
+ "type": "image/png"
+ },
+ {
+ "src": "../images/applogo_192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "../images/applogo_256.png",
+ "sizes": "256x256",
+ "type": "image/png"
}
],
"start_url": "../../../",
diff --git a/plugins/CoreHome/javascripts/notification.js b/plugins/CoreHome/javascripts/notification.js
index 527c845d87..3fde49bdc2 100644
--- a/plugins/CoreHome/javascripts/notification.js
+++ b/plugins/CoreHome/javascripts/notification.js
@@ -38,7 +38,7 @@
* @param {object} [options.style] Optional style/css dictionary. For instance {'display': 'inline-block'}
* @param {string} [options.placeat] By default, the notification will be displayed in the "stats bar".
* You can specify any other CSS selector to place the notifications
- * whereever you want.
+ * wherever you want.
*/
Notification.prototype.show = function (message, options) {
if (!message) {
diff --git a/plugins/CoreHome/lang/ar.json b/plugins/CoreHome/lang/ar.json
index 8cf85b39d0..5e2c16522a 100644
--- a/plugins/CoreHome/lang/ar.json
+++ b/plugins/CoreHome/lang/ar.json
@@ -29,7 +29,6 @@
"MakeOneTimeDonation": "بديلاً عن ذلك، قم بالتبرع مرة واحدة",
"Menu": "القائمة",
"NoPrivilegesAskPiwikAdmin": "لقد سجلت الدخول بصفتك '%1$s' ولكن يبدو أنه لا توجد أي صلاحيات لك في Piwik. %2$s اسأل مدير Piwik (انقر لمراسلته)%3$s gلمنحك صلاحيات \"المشاهدة\" لموقع ما.",
- "OnlyForSuperUserAccess": "عنصر الواجهة هذا يُعرَض للمستخدمين من فئة المستخدم الفائق فقط.",
"PageOf": "%1$s من %2$s",
"PeriodRange": "نطاق",
"ReportGeneratedOn": "تم إنشاء التقرير في %s",
diff --git a/plugins/CoreHome/lang/cs.json b/plugins/CoreHome/lang/cs.json
index 7bb0c2602b..1707c1e886 100644
--- a/plugins/CoreHome/lang/cs.json
+++ b/plugins/CoreHome/lang/cs.json
@@ -29,7 +29,7 @@
"MakeOneTimeDonation": "Provést jednorázový dar.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Jste přihlášen jako '%1$s' ale zdá se, že nemáte v Piwiku žádná práva. %2$s Zeptejte se Vašeho Piwik administrátora (klikem na email)%3$s aby Vám dal 'view' přístup na stránku.",
- "OnlyForSuperUserAccess": "Tento widget je zobrazován pouze uživatelům se super-uživatelským přístupem.",
+ "OnlyForSuperUserAccess": "Tento widget je na výchozí nástěnce zobrazen pouze pro uživatele se super uživatelským přístupem",
"PageOf": "%1$s z %2$s",
"PeriodRange": "Rozsah",
"ReportGeneratedOn": "Hlášení vygenerované %s",
diff --git a/plugins/CoreHome/lang/da.json b/plugins/CoreHome/lang/da.json
index 7c65699d10..4fe64216fb 100644
--- a/plugins/CoreHome/lang/da.json
+++ b/plugins/CoreHome/lang/da.json
@@ -24,11 +24,11 @@
"InjectedHostSuperUserWarning": "Piwik kan være konfigureret forkert (f.eks. Hvis Piwik for nylig blev flyttet til en ny server eller en URL-adresse). Du kan enten %1$sklikke her og føje %2$s som gyldigt Piwik værtsnavn (hvis du har tillid til det) %3$s eller %4$sklikke her og få %5$s adgang til Piwik sikkert %6$s.",
"InjectedHostWarningIntro": "Du tilgår Piwik fra %1$s, men Piwik er konfigureret til at køre på denne adresse: %2$s.",
"JavascriptDisabled": "JavaSript skal være aktiveret for at Piwik kan bruges i standardvisning. JavaScript er enten deaktiveret eller ikke understøttet i netlæseren.<br \/>For at bruge standardvisning, aktiver JavaScript i indstillingerne for netlæseren, og %1$s prøv igen %2$s.<br \/>",
+ "MainNavigation": "Hovednavigation",
"MakeADifference": "Gør en forskel: %1$sGiv et bidrag nu%2$s og støt Piwik 2.0!",
"MakeOneTimeDonation": "Foretag engangsdonation, i stedet.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Du er logget på som '%1$s' men det ser ikke ud som du har adgang til Piwik. %2$s Spørg Piwik administratoren (klik for at sende e-mail)%3$s for at give dig 'se' adgang til et websted.",
- "OnlyForSuperUserAccess": "Modulet vises kun til brugere, der har superbruger adgang.",
"PageOf": "%1$s af %2$s",
"PeriodRange": "Interval",
"ReportGeneratedOn": "Rapport genereret på %s",
@@ -48,6 +48,11 @@
"YouAreUsingTheLatestVersion": "Du bruger den seneste version af Piwik!",
"ClickRowToExpandOrContract": "Klik på rækken for at udvide eller sammentrække undertabelen.",
"UndoPivotBySubtable": "Rapporten er blevet pivoteret %s Fortryd pivot.",
- "PivotBySubtable": "Rapporten er ikke pivoteret %1$s Pivoter med %2$s."
+ "PivotBySubtable": "Rapporten er ikke pivoteret %1$s Pivoter med %2$s.",
+ "QuickAccessTitle": "Søg efter %s. Brug pil-tasterne for at navigere igennem søgeresultaterne. Genvej: Tryk 'f' for at søge.",
+ "MenuEntries": "Menu indgange",
+ "Segments": "Segmenter",
+ "AdblockIsMaybeUsed": "Hvis du bruger en annonce blokering skal du deaktivere denne for at sikre, at Piwik arbejder uden problemer.",
+ "ChangeCurrentWebsite": "Vælg et website. Det aktuelle website er: %s"
}
} \ No newline at end of file
diff --git a/plugins/CoreHome/lang/de.json b/plugins/CoreHome/lang/de.json
index 8b6b841b84..0b360898bf 100644
--- a/plugins/CoreHome/lang/de.json
+++ b/plugins/CoreHome/lang/de.json
@@ -29,7 +29,7 @@
"MakeOneTimeDonation": "Stattdessen einmalig spenden.",
"Menu": "Menü",
"NoPrivilegesAskPiwikAdmin": "Sie sind angemeldet als '%1$s', aber es wurden keine Berechtigungen für diesen Benutzer in Piwik gesetzt. %2$s Bitte fragen Sie Ihren Piwik Administrator (klicken für E-Mail)%3$s um Zugriff auf die Webseite zu erhalten.",
- "OnlyForSuperUserAccess": "Dieses Widget wird nur Benutzern mit Hauptadministrator-Berechtigung angezeigt.",
+ "OnlyForSuperUserAccess": "Dieses Widget wird im Standard-Dashboard nur Benutzern mit Hauptadministrator-Berechtigung angezeigt.",
"PageOf": "%1$s von %2$s",
"PeriodRange": "Zeitspanne",
"ReportGeneratedOn": "Bericht erzeugt am %s",
diff --git a/plugins/CoreHome/lang/el.json b/plugins/CoreHome/lang/el.json
index 955ccf536d..70c240687e 100644
--- a/plugins/CoreHome/lang/el.json
+++ b/plugins/CoreHome/lang/el.json
@@ -29,7 +29,7 @@
"MakeOneTimeDonation": "Εναλλακτικά, κάντε μια εφάπαξ δωρεά.",
"Menu": "Μενού",
"NoPrivilegesAskPiwikAdmin": "Έχετε κάνει είσοδο ως '%1$s', αλλά φαίνεται ότι δεν σας έχει δοθεί κάποιο δικαίωμα από το Piwik. %2$s Ζητήστε από το διαχειριστή του Piwik σας (κλικ για αποστολή e-mail)%3$s να σας δώσει δικαίωμα 'ανάγνωσης' στον ιστοτόπο.",
- "OnlyForSuperUserAccess": "Το γραφικό συστατικό εμφανίζεται μόνο σε χρήστες με δικαίωμα Υπερ-Χρήστη.",
+ "OnlyForSuperUserAccess": "Το συστατικό εμφανίζεται στον προκαθορισμένο πίνακα εργαλείων μόνο σε χρήστες με δικαίωμα Υπερ Χρήστη.",
"PageOf": "%1$s από %2$s",
"PeriodRange": "Εύρος",
"ReportGeneratedOn": "Η αναφορά δημιουργήθηκε στις %s",
diff --git a/plugins/CoreHome/lang/en.json b/plugins/CoreHome/lang/en.json
index bfe6056eee..1fb4542be3 100644
--- a/plugins/CoreHome/lang/en.json
+++ b/plugins/CoreHome/lang/en.json
@@ -32,7 +32,7 @@
"MakeOneTimeDonation": "Make a one time donation, instead.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "You are logged in as '%1$s' but it seems you don't have any permission set in Piwik. %2$s Ask your Piwik administrator (click to email)%3$s to give you 'view' access to a website.",
- "OnlyForSuperUserAccess": "This widget is only displayed to users having Super User access.",
+ "OnlyForSuperUserAccess": "This widget is displayed in the default dashboard only to users having Super User access.",
"PageOf": "%1$s of %2$s",
"PeriodRange": "Range",
"ReportGeneratedOn": "Report generated on %s",
diff --git a/plugins/CoreHome/lang/es.json b/plugins/CoreHome/lang/es.json
index 189f1b485c..9ef4b121ed 100644
--- a/plugins/CoreHome/lang/es.json
+++ b/plugins/CoreHome/lang/es.json
@@ -24,11 +24,12 @@
"InjectedHostSuperUserWarning": "Piwik puede estar desconfigurado (por ejemplo, si Piwik fue mudado recientemente a un nuevo servidor o cambió su dirección de internet). Puede %1$scliquear aquí y agregar %2$s como servidores válidos Piwik (si los considera confiables)%3$s, o %4$s cliquee aquí y vaya a %5$s para acceder de forma segura a Piwik%6$s.",
"InjectedHostWarningIntro": "Está accediendo a Piwik desde %1$s, pero Piwik ha sido configurado para ejecutarse en esta dirección: %2$s.",
"JavascriptDisabled": "JavaScript debe estar habilitado para que pueda utilizar la vista estándar de Piwik .<br \/>Sin embargo, para ser que JavaScript está deshabilitado o no es respaldado por su navegador. <br \/>Para usar la vista estándar, habilite JavaScript cambiando las opciones de su navegador, luego%1$sintente nuevamente%2$s.<br \/>",
+ "MainNavigation": "Menú de navegación",
"MakeADifference": "Marque la diferencia: %1$sDone ahora%2$s para financiar Piwik 2.0!",
"MakeOneTimeDonation": "Entonces, haga una sola donación",
"Menu": "Menú",
"NoPrivilegesAskPiwikAdmin": "Ha iniciado sesión como '%1$s', pero parece que no posee ningún permiso configurado en Piwik. %2$s Consulta al administrador de su Piwik (clic para enviar correo electrónico)%3$s para que le otorgue acceso para 'ver' en el sitio de internet.",
- "OnlyForSuperUserAccess": "Este reproductor sólo se muestra a los usuarios con acceso Super User.",
+ "OnlyForSuperUserAccess": "Este reproductor es mostrado a los usuarios que poseen los atributos de Super Usuarioen el panel de control predeterminado.",
"PageOf": "%1$s de %2$s",
"PeriodRange": "Rango",
"ReportGeneratedOn": "Informe generado el %s",
@@ -48,6 +49,11 @@
"YouAreUsingTheLatestVersion": "¡Está utilizando la última versión de Piwik!",
"ClickRowToExpandOrContract": "Clic en esta fila para expandir o contraer la subtabla.",
"UndoPivotBySubtable": "Este informe ha sido girado %s Deshacer giro",
- "PivotBySubtable": "Este informe no es girado %1$s Giro por %2$s"
+ "PivotBySubtable": "Este informe no es girado %1$s Giro por %2$s",
+ "QuickAccessTitle": "Buscar por %s. Utilice las teclas de dirección para navegar a través de los resultados. Atajo de teclado: Click 'f' para buscar.",
+ "MenuEntries": "Menú de entrada",
+ "Segments": "Segmentos",
+ "AdblockIsMaybeUsed": "En caso de que esté utilizando Ad Blocker, por favor deshabilitelo para que Piwik pueda trabajar sin problemas y de forma más segura.",
+ "ChangeCurrentWebsite": "Elige un sitio web, actualmente el sitio web seleccionado es: %s"
}
} \ No newline at end of file
diff --git a/plugins/CoreHome/lang/fa.json b/plugins/CoreHome/lang/fa.json
index b6e80d44f7..a7883a0f5b 100644
--- a/plugins/CoreHome/lang/fa.json
+++ b/plugins/CoreHome/lang/fa.json
@@ -17,7 +17,6 @@
"MakeADifference": "یک تفاوت ایجاد کنید: %1$sبه پیویک هدیه بدهید%2$s تا در پیویک 2.0 سرمایه گذاری کنیم!",
"MakeOneTimeDonation": "یک بار کمک مالی انجام دهید.",
"NoPrivilegesAskPiwikAdmin": "شما به عنوان %1$s وارد شده اید , اما به نظر می رسد که شما اجازه دسترسی به هیچ بخشی از پیویک را ندارید. %2$s از مدیریت پیویک تان بخواهید (برای ارسال ایمیل کلیک کنید)%3$s تا به شما دسترسی \"مشاهده\" یک وبسایت را بدهد.",
- "OnlyForSuperUserAccess": "این ویجت فقط برای کاربران با دسترسی ابرکاربر قابل مشاهده است.",
"PageOf": "%1$s از %2$s",
"PeriodRange": "بازه",
"ReportGeneratedOn": "گزارش تولید شده است در %s",
diff --git a/plugins/CoreHome/lang/fi.json b/plugins/CoreHome/lang/fi.json
index 401eb9fdfc..c95c884d4d 100644
--- a/plugins/CoreHome/lang/fi.json
+++ b/plugins/CoreHome/lang/fi.json
@@ -29,7 +29,6 @@
"MakeOneTimeDonation": "Lahjoita kertasumma.",
"Menu": "Valikko",
"NoPrivilegesAskPiwikAdmin": "Olet kirjautuneena sisään käyttäjänä '%1$s', mutta sinulla ei ole mitään oikeuksia Piwikissä. %2$sPyydä Piwikin ylläpitäjää (klikkaa avataksesi sähköpostin)%3$s antamaan katseluoikeudet verkkosivuun.",
- "OnlyForSuperUserAccess": "Tämä widget näkyy ainoastaan käyttäjille, joilla on Superkäyttäjän oikeudet.",
"PageOf": "%1$s of %2$s",
"PeriodRange": "Alue",
"ReportGeneratedOn": "Raportti luotu %s",
diff --git a/plugins/CoreHome/lang/fr.json b/plugins/CoreHome/lang/fr.json
index ff41959551..e000f700ca 100644
--- a/plugins/CoreHome/lang/fr.json
+++ b/plugins/CoreHome/lang/fr.json
@@ -29,7 +29,7 @@
"MakeOneTimeDonation": "Faire un don unique à la place.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Vous êtes connecté en tant que '%1$s' mais il semble que nous n'ayez aucune permission définie dans Piwik. %2$s Demandez à votre administrateur (cliquez pour envoyer un e-mail)%3$s de vous donner l'accès 'Consultation' à un site web.",
- "OnlyForSuperUserAccess": "Ce widget est uniquement affiché aux utilisateurs possédant un accès de type super utilisateur.",
+ "OnlyForSuperUserAccess": "Ce gadget est affiché dans le tableau de bord par défaut uniquement aux utilisateurs possédant un accès de type super utilisateur.",
"PageOf": "%1$s de %2$s",
"PeriodRange": "Etendue",
"ReportGeneratedOn": "Rapport généré le %s",
@@ -50,6 +50,7 @@
"ClickRowToExpandOrContract": "Cliquez sur cette rangée pour afficher ou masquer le sous-tableau",
"UndoPivotBySubtable": "Ce rapport a été pivoté %s Annuler le pivot",
"PivotBySubtable": "Ce rapport n'a pas été pivoté %1$s Pivoter par %2$s",
+ "QuickAccessTitle": "Recherche pour %s. Utilisez les flèches de navigation pour parcourir les résultats de recherche. Raccourci : appuyez sur 'f' pour rechercher.",
"MenuEntries": "Entrées de menu",
"Segments": "Segments",
"AdblockIsMaybeUsed": "Dans le cas où vous utiliseriez un bloqueur de publicités, veuillez le désactiver pour ce site afin de vous assurer que Piwik fonctionne correctement.",
diff --git a/plugins/CoreHome/lang/is.json b/plugins/CoreHome/lang/is.json
index 45e6b7e82d..b4d653a4f9 100644
--- a/plugins/CoreHome/lang/is.json
+++ b/plugins/CoreHome/lang/is.json
@@ -1,14 +1,6 @@
{
"CoreHome": {
"PageOf": "%1$s of %2$s",
- "PeriodDay": "Dagur",
- "PeriodDays": "daga",
- "PeriodMonth": "Mánuður",
- "PeriodMonths": "mánuði",
- "PeriodWeek": "Vika",
- "PeriodWeeks": "vikur",
- "PeriodYear": "Ár",
- "PeriodYears": "ár",
"ShowJSCode": "Sýna JavaScript kóða til að setja inn",
"ThereIsNoDataForThisReport": "Það eru eingin gögn til fyrir þessa skýrslu"
}
diff --git a/plugins/CoreHome/lang/it.json b/plugins/CoreHome/lang/it.json
index 913208c21e..982758714a 100644
--- a/plugins/CoreHome/lang/it.json
+++ b/plugins/CoreHome/lang/it.json
@@ -28,8 +28,8 @@
"MakeADifference": "Fa' la differenza: %1$sDona adesso%2$s per finanziare Piwik 2.0!",
"MakeOneTimeDonation": "Fa' una donazione unica.",
"Menu": "Menu",
- "NoPrivilegesAskPiwikAdmin": "Sei stato registrato come '%1$s', ma a quanto pare non si dispone di alcuna autorizzazione in Piwik. %2$s Contattare l'amministratore Piwik (clicca per e-mail) %3$s per consentire la visualizzazione di un sito web.",
- "OnlyForSuperUserAccess": "Questo widget è visualizzato solo dagli utenti che hanno un accesso Super User.",
+ "NoPrivilegesAskPiwikAdmin": "Ti sei registrato come '%1$s', ma a quanto pare non disponi di alcuna autorizzazione in Piwik. %2$sContatta l'amministratore Piwik (clicca per e-mail)%3$s per avere un accesso che ti consenta di 'vedere' un sito web.",
+ "OnlyForSuperUserAccess": "Questo widget è visualizzato sulla dashboard predefinita solo per gli utenti che hanno accesso come Super User.",
"PageOf": "%1$s di %2$s",
"PeriodRange": "Intervallo",
"ReportGeneratedOn": "Report generato il %s",
@@ -50,7 +50,7 @@
"ClickRowToExpandOrContract": "Clicca su questa riga per espandere o restringere la sotto-tabella.",
"UndoPivotBySubtable": "Questo report è stato imperniato al Pivot %s Undo",
"PivotBySubtable": "Questo report non è imperniato al Pivot %1$s da %2$s",
- "QuickAccessTitle": "Ricerca per %s. Utilizza i tasti freccia per navigare tra i risultati di ricerca. Scorciatoia: premi 'f' per cercare.",
+ "QuickAccessTitle": "Ricerca per %s. Utilizza i tasti freccia per navigare tra i risultati della ricerca. Scorciatoia: premi 'f' per cercare.",
"MenuEntries": "Ingressi da menù",
"Segments": "Segmenti",
"AdblockIsMaybeUsed": "Se stai utilizzando un plugin di blocco della pubblicità, disabilitalo per questo sito, per essere sicuro che Piwik lavori senza problemi.",
diff --git a/plugins/CoreHome/lang/ja.json b/plugins/CoreHome/lang/ja.json
index 83d636991e..aaef3cb874 100644
--- a/plugins/CoreHome/lang/ja.json
+++ b/plugins/CoreHome/lang/ja.json
@@ -28,7 +28,6 @@
"MakeOneTimeDonation": "代わりに寄与をする",
"Menu": "メニュー",
"NoPrivilegesAskPiwikAdmin": "'%1$s'としてログインしていますが、権限が設定されていないようです。 %2$s Piwikの管理者(クリックしてEメール)%3$s に'表示'の権限を与えてもらってください。",
- "OnlyForSuperUserAccess": "このウィジェットは、スーパーユーザのアクセス権を持つユーザにのみ表示されます",
"PageOf": "%1$s \/ %2$s",
"PeriodRange": "期間",
"ReportGeneratedOn": "%s に生成されたリポート",
diff --git a/plugins/CoreHome/lang/ka.json b/plugins/CoreHome/lang/ka.json
index 2492065340..eca1881e8b 100644
--- a/plugins/CoreHome/lang/ka.json
+++ b/plugins/CoreHome/lang/ka.json
@@ -3,14 +3,6 @@
"CategoryNoData": "ამ კატეგორიაში მონაცემები არ არის. ცადეთ \"ყველა მონაწილის ჩართვა\"",
"JavascriptDisabled": "JavaScript ჩართული უნდა იყოს, რომ თქვენ შეძლოთ Piwik–ის გამოყენება სტანდარტული გზით.<br \/>თუმცა, როგორც ჩანს JavaScript ან გამორთულია ან თქვენს ბრაუზერს მისი მხარდაჭერა არ აქვს.<br \/>სტანდარტული ხედის გამოყენებისთვის ჩართეთ JavaScript თქვენი ბრაუზერის ოფციებიდან, შემდეგ %1$sცადეთ კიდევ%2$s.<br \/>",
"PageOf": "%1$s, სულ %2$s",
- "PeriodDay": "დღე",
- "PeriodDays": "დღე",
- "PeriodMonth": "თვე",
- "PeriodMonths": "თვე",
- "PeriodWeek": "კვირა",
- "PeriodWeeks": "კვირა",
- "PeriodYear": "წელი",
- "PeriodYears": "წელი",
"ShowJSCode": "JavaScript კოდის ნახვა, რომელიც უნდა ჩაისვას ვებ გვერდზე",
"ThereIsNoDataForThisReport": "რეპორტისთვის მონაცემები არ არის.",
"WebAnalyticsReports": "ვებ ანალიზატორის რეპორტები"
diff --git a/plugins/CoreHome/lang/ko.json b/plugins/CoreHome/lang/ko.json
index 1288435bf2..ab5ea33ff9 100644
--- a/plugins/CoreHome/lang/ko.json
+++ b/plugins/CoreHome/lang/ko.json
@@ -28,7 +28,6 @@
"MakeOneTimeDonation": "또는, 한 번만 기부합니다.",
"Menu": "메뉴",
"NoPrivilegesAskPiwikAdmin": "'%1$s'로 로그인되었지만 권한이 설정되어 있지 않습니다. %2$s Piwik 관리자(클릭 이메일) %3$s에 '보기'권한을 부여 받으세요.",
- "OnlyForSuperUserAccess": "해당 위젯은 유저가 수퍼 유저일 경우에만 나타납니다.",
"PageOf": "%1$s \/ %2$s",
"PeriodRange": "기간",
"ReportGeneratedOn": "%s에 생성된 보고서",
diff --git a/plugins/CoreHome/lang/nb.json b/plugins/CoreHome/lang/nb.json
index e8d177486d..1930bab3d0 100644
--- a/plugins/CoreHome/lang/nb.json
+++ b/plugins/CoreHome/lang/nb.json
@@ -7,7 +7,7 @@
"CloseWidgetDirections": "Du kan lukke dette elementet ved å klikke på X-ikonet over widgeten.",
"DataForThisReportHasBeenPurged": "Dataene for denne rapporten er mer enn %s måneder gamle og har blitt fjernet.",
"DataTableExcludeAggregateRows": "Aggregerte rader vises %s Skjul dem",
- "DataTableIncludeAggregateRows": "Aggregerte rader er skjult %s Vi dem",
+ "DataTableIncludeAggregateRows": "Aggregerte rader er skjult %s Vis dem",
"Default": "standard",
"DonateCall1": "Det vil aldri koste noe å bruke Piwik, men det betyr ikke at det ikke koster oss noe å lage.",
"DonateCall2": "Piwik trenger din fortsatte støtte for å vokse og blomstre.",
@@ -29,7 +29,7 @@
"MakeOneTimeDonation": "Bidra med en engangsdonasjon i stedet.",
"Menu": "Meny",
"NoPrivilegesAskPiwikAdmin": "Du er logget inn som «%1$s», men det ser ut til at du ikke har noen rettigheter satt i Piwik. %2$s Be din Piwik-administrator (klikk for å sende e-post)%3$s å gi deg «vis»-tilgang til et nettsted.",
- "OnlyForSuperUserAccess": "Denne widgeten vises kun til brukere som har superbruker-tilgang.",
+ "OnlyForSuperUserAccess": "Denne widgeten vises kun i standardoversikten for brukere som har superbruker-tilgang.",
"PageOf": "%1$s av %2$s",
"PeriodRange": "Periode",
"ReportGeneratedOn": "Rapport generert %s",
diff --git a/plugins/CoreHome/lang/nl.json b/plugins/CoreHome/lang/nl.json
index a82520ae65..1b0dbf8d48 100644
--- a/plugins/CoreHome/lang/nl.json
+++ b/plugins/CoreHome/lang/nl.json
@@ -24,11 +24,11 @@
"InjectedHostSuperUserWarning": "Piwik is waarschijnlijk verkeerd geconfigureerd (bijv. Piwik werd verplaatst naar een nieuwe server of URL). %1$sKlik hier en voeg %2$s toe als een toegestane Piwik hostnaam indien je die vertrouwd%3$s, of %4$sklik hier en ga naar %5$s om Piwik veilig te banaderen%6$s.",
"InjectedHostWarningIntro": "Je bezoekt nu Piwik van %1$s, maar Piwik is geconfigureerd om op dit adres te draaien: %2$s.",
"JavascriptDisabled": "JavaScript moet ingeschakeld zijn om Piwik in standaard weergave te bekijken. <br\/> Het lijkt erop dat JavaScript is uitgeschakeld of niet ondersteund wordt door uw browser.<br\/> Om de standaard weergave te gebruiken, schakel JavaScript in door uw browser instellingen te wijzigen, probeer het daarna %1$s opnieuw %2$s.<br\/>",
+ "MainNavigation": "Hoofd navigatie",
"MakeADifference": "Maak een verschil: %1$sDoneer nu%2$s om Piwik 2.0 te steunen!",
"MakeOneTimeDonation": "Doe een eennmalige donatie in de plaats.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "U bent aangemeld as '%1$s'. Maar het lijkt er op dat u geen rechten hebt op Piwik te bezoeken. %2$sVraag aan uw webmaster (klik hier voor e-mail)%3$s of hij u de juiste rechten wilt geven om de statistieken te bekijken.",
- "OnlyForSuperUserAccess": "Deze widget wordt alleen getoond aan superusers.",
"PageOf": "%1$s of %2$s",
"PeriodRange": "Datumbereik",
"ReportGeneratedOn": "Rapport aangemaakt op %s",
@@ -48,6 +48,11 @@
"YouAreUsingTheLatestVersion": "Je gebruikt de laatste versie van Piwik!",
"ClickRowToExpandOrContract": "Klik deze regel om de tabel te openen of te sluiten.",
"UndoPivotBySubtable": "Dit rapport wordt als een draaitabel getoond, %s schakel de draaitabel uit.",
- "PivotBySubtable": "Dit rapport wordt niet als een draaitabel getoond, %1$s maak een draaitabel op basis van %2$s"
+ "PivotBySubtable": "Dit rapport wordt niet als een draaitabel getoond, %1$s maak een draaitabel op basis van %2$s",
+ "QuickAccessTitle": "Zoeken naar %s. Gebruik de pijltjestoetsen om door de zoekopdrachten te navigeren. Shortcut: Druk 'f' om te zoeken.",
+ "MenuEntries": "Menu-items",
+ "Segments": "Segmenten",
+ "AdblockIsMaybeUsed": "Als je gebruik maakt van een reclame blokker, schakel deze a.u.b. uit zodat je zeker weet dat Piwik werkt zonder problemen.",
+ "ChangeCurrentWebsite": "Kies een website, de nu geselecteerde website is: %s"
}
} \ No newline at end of file
diff --git a/plugins/CoreHome/lang/pl.json b/plugins/CoreHome/lang/pl.json
index ac7fbac176..dfee5d49d0 100644
--- a/plugins/CoreHome/lang/pl.json
+++ b/plugins/CoreHome/lang/pl.json
@@ -25,7 +25,6 @@
"MakeOneTimeDonation": "Zamiast, przekaż jednorazową dotację.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Jesteś zalogowany jako '%1$s' ale wygląda na to, że nie masz nadanych żadnych uprawnień w Piwik'u. %2$s Poproś swojego administratora Piwik'a (kliknij aby wysłąć email)%3$s aby nadał Ci uprawnienia 'przeglądania' strony.",
- "OnlyForSuperUserAccess": "Ten widżet widzą tylko użytkownych z prawami dostępu Super User.",
"PageOf": "%1$s z %2$s",
"PeriodRange": "Zakres",
"ReportGeneratedOn": "Raport wygenerowany %s",
diff --git a/plugins/CoreHome/lang/pt-br.json b/plugins/CoreHome/lang/pt-br.json
index b2215af4dd..2727c13cc2 100644
--- a/plugins/CoreHome/lang/pt-br.json
+++ b/plugins/CoreHome/lang/pt-br.json
@@ -29,7 +29,6 @@
"MakeOneTimeDonation": "Em vez disso, faça uma doação.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Você está logado como '%1$s', mas parece que você não tem nenhuma permissão definida no Piwik. %2$s Pergunte ao seu administrador Piwik (clique para e-mail) %3$s para lhe dar acesso de 'visão' para um site.",
- "OnlyForSuperUserAccess": "Este widget só é exibido para os usuários com privilégios de Super Usuário.",
"PageOf": "%1$s de %2$s",
"PeriodRange": "Alcance",
"ReportGeneratedOn": "Relatório gerado em %s",
diff --git a/plugins/CoreHome/lang/ro.json b/plugins/CoreHome/lang/ro.json
index bc8707c590..b9b620bd85 100644
--- a/plugins/CoreHome/lang/ro.json
+++ b/plugins/CoreHome/lang/ro.json
@@ -26,7 +26,6 @@
"MakeADifference": "Fa o diferenta: %1$sDoneaza acum%2$s pentru a sponsoriza Piwik 2.0!",
"MakeOneTimeDonation": "În schimb, donează o dată (fără subscriere).",
"NoPrivilegesAskPiwikAdmin": "Sunteti logat ca '%1$s' dar se pare ca nu aveti nici o permisiune setata in Piwik. %2$s Solicitati administratorului dvs al Piwik (click pentru email)%3$s sa va permita accesul tip 'vizualizare' pentru un site.",
- "OnlyForSuperUserAccess": "Acest widget este afișat numai pentru utilizatorii care au acces la Super utilizator.",
"PageOf": "%1$s din %2$s",
"PeriodRange": "Perioadă",
"ReportGeneratedOn": "Raport creat la %s",
diff --git a/plugins/CoreHome/lang/ru.json b/plugins/CoreHome/lang/ru.json
index 7fdd19b854..a47c8f93df 100644
--- a/plugins/CoreHome/lang/ru.json
+++ b/plugins/CoreHome/lang/ru.json
@@ -29,7 +29,6 @@
"MakeOneTimeDonation": "Сделать только пожертвование (без подписки).",
"Menu": "Меню",
"NoPrivilegesAskPiwikAdmin": "Вы авторизованы как '%1$s', но, кажется, для вас не установлены права в Piwik. %2$s Попросите вашего администратора (кликните, чтобы написать письмо)%3$s дать вам доступ на \"просмотр\" к статистике сайта.",
- "OnlyForSuperUserAccess": "Этот виджет отображается только у суперпользователя.",
"PageOf": "%1$s из %2$s",
"PeriodRange": "Период",
"ReportGeneratedOn": "Отчет был составлен %s",
diff --git a/plugins/CoreHome/lang/sk.json b/plugins/CoreHome/lang/sk.json
index 784221d728..28e1f15b83 100644
--- a/plugins/CoreHome/lang/sk.json
+++ b/plugins/CoreHome/lang/sk.json
@@ -28,7 +28,6 @@
"MakeOneTimeDonation": "Jednorázovo finančne podporiť.",
"Menu": "Menu",
"NoPrivilegesAskPiwikAdmin": "Ste prihlásený ako '%1$s' ale vyzerá to tak , že nemáte žiadne povolenie do Piwiku. %2$s Spýtajte sa Vášho Piwik administrátora (Kliknite pre email)%3$s aby Vám dal 'prezerací' prístup na webstránku.",
- "OnlyForSuperUserAccess": "Táto miniaplikácia je zobrazená iba užívateľom ktorý majú prístup ako Super-užívatelia.",
"PageOf": "%1$s z %2$s",
"PeriodRange": "Rozsah",
"ReportGeneratedOn": "Report vygenerovaný %s",
diff --git a/plugins/CoreHome/lang/sr.json b/plugins/CoreHome/lang/sr.json
index 100389f22b..08b2322557 100644
--- a/plugins/CoreHome/lang/sr.json
+++ b/plugins/CoreHome/lang/sr.json
@@ -28,7 +28,6 @@
"MakeOneTimeDonation": "Možete izvršiti i jednokratnu donaciju.",
"Menu": "Meni",
"NoPrivilegesAskPiwikAdmin": "Prijavljeni ste kao '%1$s' ali izgleda da nemate postavljena nikakva ovlašćenja. %2$s Tražite od Piwik administratora (kliknite za poruku)%3$s da vam dozvoli 'prikaz' na sajtu.",
- "OnlyForSuperUserAccess": "Ovaj vidžet se prikazuje samo superkorisnicima.",
"PageOf": "%1$s od %2$s",
"PeriodRange": "Period",
"ReportGeneratedOn": "Izveštaj generisan %s",
diff --git a/plugins/CoreHome/lang/sv.json b/plugins/CoreHome/lang/sv.json
index e8390e8122..499c815014 100644
--- a/plugins/CoreHome/lang/sv.json
+++ b/plugins/CoreHome/lang/sv.json
@@ -24,11 +24,11 @@
"InjectedHostSuperUserWarning": "Piwik kan vara felkonfigurerat (t.ex. om Pwiwik nyligen har flyttats till en ny server eller URL). Du kan antigen %1$sklicka här och lägga till %2$s som ett giltigt värdnamn för Piwik (om det är giltigt)%3$s, eller %4$sklicka här för att gå till %5$s och ansluta till Piwik säkert%6$s.",
"InjectedHostWarningIntro": "Du ansluter till Piwik från %1$s, men Piwik har konfigurerats att köras från den här adressen: %2$s.",
"JavascriptDisabled": "JavaScript måste vara aktiverat för att du ska kunna använda Piwik i standardläge.<br \/>Det verkar dock som att JavaScript antingen är inaktiverat eller att det inte stöds av din webbläsare..<br \/>För att använda standardläget, aktivera JavaScript genom att ändra din webbläsares inställningar, %1$sförsök sen igen%2$s.<br \/>",
+ "MainNavigation": "Huvudmenu",
"MakeADifference": "Gör skillnad: %1$sDonera nu%2$s för att finansiera Piwik 2.0!",
"MakeOneTimeDonation": "Donera en engångssumma istället.",
"Menu": "Meny",
"NoPrivilegesAskPiwikAdmin": "Du är inloggad som '%1$s' men det verkar som om du inte har några rättigheter satta i Piwik. %2$s Fråga din Piwik administratör (klicka för att e-posta)%3$s för att få läsrättighet till en webbplats.",
- "OnlyForSuperUserAccess": "Den här widgeten visas bara för användare som har Superanvändare access.",
"PageOf": "%1$s av %2$s",
"PeriodRange": "Intervall",
"ReportGeneratedOn": "Rapporten genererades på %s",
@@ -49,6 +49,10 @@
"ClickRowToExpandOrContract": "Klicka på denna rad för att visa eller dölja undertabeller.",
"UndoPivotBySubtable": "Denna rapport har pivoterats %s Ångra pivotering",
"PivotBySubtable": "Denna rapport är inte pivoterad %1$s Pivotera med %2$s",
- "Segments": "Segment"
+ "QuickAccessTitle": "Sök efter %s. Använd piltangenterna för att navigera i sökresultatet. Genväg: Tryck på 'f' för att söka.",
+ "MenuEntries": "Menyposter",
+ "Segments": "Segment",
+ "AdblockIsMaybeUsed": "Om du blockerar annonser vänligen inaktivera blockeringen på den här webbplatsen för att Piwik ska fungera utan några problem.",
+ "ChangeCurrentWebsite": "Välj en webbplats, vald webbplats just nu: %s"
}
} \ No newline at end of file
diff --git a/plugins/CoreHome/lang/tl.json b/plugins/CoreHome/lang/tl.json
index ce6c22a538..edfa0e610f 100644
--- a/plugins/CoreHome/lang/tl.json
+++ b/plugins/CoreHome/lang/tl.json
@@ -26,7 +26,6 @@
"MakeADifference": "Gumawa ng isang pagkakaiba: %1$sMagbigay ng donasyon ngayon%2$s upang pondohan ang Piwik 2.0!",
"MakeOneTimeDonation": "Ang widget na ito ay ipinapakita lamang sa mga user na may Super User na access.",
"NoPrivilegesAskPiwikAdmin": "Ikaw ay naka-log-in bilang '%1$s' ngunit mukhang wala kang anumang pahintulot na naka-set sa Piwik. %2$s Tanungin ang iyong Piwik administrator (i-click upang i-email) %3$s upang bigyan ka ng 'view' access sa website.",
- "OnlyForSuperUserAccess": "Ang widget na ito ay ipanapakita lamang sa mga user na mayroong Super User access",
"PageOf": "%1$s ng %2$s",
"PeriodRange": "Pagitan",
"ReportGeneratedOn": "Ang ulat ay ginawa sa %s",
diff --git a/plugins/CoreHome/lang/tr.json b/plugins/CoreHome/lang/tr.json
index 88dbbe2e7b..82b6af072d 100644
--- a/plugins/CoreHome/lang/tr.json
+++ b/plugins/CoreHome/lang/tr.json
@@ -1,28 +1,29 @@
{
"CoreHome": {
- "CategoryNoData": "Bu kategoride veri yok. \"Eklenmiş tüm populasyon\" deneyiniz.",
- "CheckForUpdates": "Güncellemeleri kontrol et",
+ "CategoryNoData": "Bu kategoride henüz bir veri yok. \"Tüm dağılımlar katılsın\" seçeneğini deneyin.",
+ "CheckForUpdates": "Güncellemeleri denetle",
"CheckPiwikOut": "Piwik'e göz atın!",
- "CloseWidgetDirections": "Widget üstündeki 'X' simgesine tıklayarak bu widgeti kapatabilirsiniz.",
- "DataForThisReportHasBeenPurged": "Bu raporda yer alan veriler %s aydan öncesine ait ve rapora dahil edilmemiştir.",
- "DataTableExcludeAggregateRows": "Tüm satırlar gösteriliyor %s Gizle",
- "DataTableIncludeAggregateRows": "Bütün satırlar gizlendi %s Göster",
+ "ClickToEditX": "%s ögesini düzenlemek için tıklayın",
+ "CloseWidgetDirections": "Gereç üzerindeki 'X' simgesine tıklayarak bu gereci kapatabilirsiniz.",
+ "DataForThisReportHasBeenPurged": "Bu raporda bulunan veriler %s aydan eski ve temizlenmiş.",
+ "DataTableExcludeAggregateRows": "Tüm satırlar görüntüleniyor %s Gizle",
+ "DataTableIncludeAggregateRows": "Tüm satırlar gizlenmiş %s Görüntüle",
"Default": "varsayılan",
- "DonateCall1": "Piwik'i kullanmak için hiçbir maliyetiniz olmayacak, ama bu bize bu ürünü geliştirmek için hiçbir maliyeti olmadığı anlamına gelmiyor.",
- "DonateCall2": "Piwikin gelişmesi ve ilerlemesi için size sürekli ihtiyacı var",
- "DonateFormInstructions": "Miktar seçmek için kaydırıcıyı tıklayın, sonra bağış düğmesini tıklatın.",
- "ExcludeRowsWithLowPopulation": "Tüm satırlar gösteriliyor %s Az veri olanları çıkart",
+ "DonateCall1": "Piwik her zaman ücretsiz kullanılabilecek ancak bu durum geliştirmenin ücretsiz olduğu anlamına gelmiyor.",
+ "DonateCall2": "Gelişip ilerleyebilmesi için Piwik projesi sürekli desteğinize gerek duyuyor.",
+ "DonateCall3": "Piwik işiniz için önemliyse ya da harcanan emeğe değiyorsa %1$slütfen bağış yapmayı düşünün%2$s",
+ "DonateFormInstructions": "Bağış tutarını seçmek için kaydırıcıya kullanın ve Bağış Yap düğmesine tıklayın.",
+ "ExcludeRowsWithLowPopulation": "Tüm satırlar görüntüleniyor %s Düşük dağılımlar katılmasın",
"ExternalHelp": "Yardım (yeni sekmede açılır)",
"FlattenDataTable": "Rapor hiyerarşik yapıda %s Düz yap",
"HowMuchIsPiwikWorth": "Piwikin değeri sizin için ne kadar?",
- "IncludeRowsWithLowPopulation": "Az veriye sahip satırlar gizlendi %s Satırları göster",
+ "IncludeRowsWithLowPopulation": "Düşük dağılımlı satırlar gizlendi %s Tüm satırları görüntüle",
"InjectedHostEmailBody": "Merhaba, bugün Piwik'e erişmeye çalıştım ve bilinmeyen host uyarısı ile karşılaştım.",
"InjectedHostEmailSubject": "Bilinmeyen bir sunucu Piwik'e erişti: %s",
"InjectedHostWarningIntro": "Şu anda Piwik'e %1$s 'den giriş yapıyorsunuz ama Piwik şu adreste çalışması için ayarlandı: %2$s.",
"MakeADifference": "Farklılık yarat: Piwik 2.0'ı finanse etmek için şimdi %1$s bağışla %2$s",
"MakeOneTimeDonation": "Onun yerine bir defalık bağış yapın",
"Menu": "Menü",
- "OnlyForSuperUserAccess": "Bu widget sadece Super User seviyesinde olan kullanıcılara görüntülenir.",
"PageOf": "%1$s nin %2$s",
"PeriodRange": "Aralık",
"ReportGeneratedOn": "%s tarihinde oluşturulan Rapor",
diff --git a/plugins/CoreHome/lang/uk.json b/plugins/CoreHome/lang/uk.json
index 4007acca13..54ec682b22 100644
--- a/plugins/CoreHome/lang/uk.json
+++ b/plugins/CoreHome/lang/uk.json
@@ -1,10 +1,58 @@
{
"CoreHome": {
- "CategoryNoData": "В цій категорії немає даних. Спробуйте \"Виключити всі групи людей\"",
- "JavascriptDisabled": "JavaScript повинен бути увімкнений щоб користовуватися Piwik в стандартному режимі. <br \/> Нажаль, JavaScript вимкнено або не підтримується вашим веб-оглядачем.<br \/> Щоб використовувати стандартний режим, увімкніть JavaScript змінивши налаштування вашого веб-оглядача, а тоді %1$sспробуйте ще раз%2$s.<br \/>",
- "PageOf": "%1$s із %2$s",
- "ShowJSCode": "Показати код вставки javascript",
- "ThereIsNoDataForThisReport": "Відсутні дані для даного звіту",
- "WebAnalyticsReports": "Звіти Веб-Аналітики"
+ "CategoryNoData": "Немає даних в цій категорії. Спробуйте \"Увімкнути усі показники\".",
+ "CheckForUpdates": "Перевірити на оновлення",
+ "CheckPiwikOut": "Перевірити Piwik на оновлення!",
+ "ClickToEditX": "Редагувати %s",
+ "CloseWidgetDirections": "Ви можете закрити цей віджет, натиснувши на значок 'X' у верхній частині віджета.",
+ "DataForThisReportHasBeenPurged": "Дані для цього звіту зберігалися понад %s місяців і були видалені.",
+ "DataTableExcludeAggregateRows": "Вибрані рядки відображені %s Приховати їх",
+ "DataTableIncludeAggregateRows": "Вибрані рядки приховані %s Показати їх",
+ "Default": "за замовчуванням",
+ "DonateCall1": "Piwik завжди буде безкоштовним для використання, але це не означає, що нам це нічого не коштує.",
+ "DonateCall2": "Piwik потребує вашої постійної підтримки, щоб рости і процвітати.",
+ "DonateCall3": "Якщо ви думаєте, що Piwik додав істотне значення для вашого бізнесу або діяльності, %1$sбудь ласка, зробіть пожертву!%2$s",
+ "DonateFormInstructions": "Виберіть повзунком потрібну суму, а потім натисніть Subscribe для пожертвування і передплати.",
+ "ExcludeRowsWithLowPopulation": "Всі рядки відображені %s Крім низьких показників",
+ "ExternalHelp": "Допомога (відкриється в новій вкладці)",
+ "FlattenDataTable": "Звіт побудований за ієрархією %s Зробити його більш конкретним",
+ "HowMuchIsPiwikWorth": "Визначте вартість Piwik для вас",
+ "IncludeRowsWithLowPopulation": "Рядки з низькими показниками відображені %s Показати всі",
+ "InjectedHostEmailBody": "Привіт, спробував зайти в Piwik сьогодні і зіткнувся з проблемою невідомого хоста.",
+ "InjectedHostEmailSubject": "В Piwik був наданий доступ по невідомому хосту: %s",
+ "InjectedHostNonSuperUserWarning": "%1$sНатисніть тут, щоб безпечно увійти в Piwik%2$s і прибрати це попередження. Ви також можете зв'язатися з адміністратором Piwik і повідомити його про проблему (%3$sвідправити йому email%4$s).",
+ "InjectedHostSuperUserWarning": "Piwik може бути неправильно налаштований (наприклад, якщо Piwik був недавно переміщений на новий сервер або переїхав на нову адресу). Ви також можете %1$sнатиснути сюди і додати %2$s в якості довіреного імені хоста Piwik (якщо ви довіряєте йому)%3$s, або %4$sнатисніть сюди і перейдіть %5$s для безпечного доступу до Piwik%6$s.",
+ "InjectedHostWarningIntro": "Зараз ви заходите в Piwik на %1$s, але Piwik був налаштований на цю адресу: %2$s.",
+ "JavascriptDisabled": "JavaScript Вам необхідно включити для коректного стандартного відображення Piwik.<br \/>Якщо Ви читаєте це повідомлення, значить JavaScript заборонений, або не підтримується вашим браузером.<br \/>Для використання стандартного виду, активуйте JavaScript в налаштуваннях вашого браузера, потім %1$sспробуйте оновити сторінку%2$s.<br \/>",
+ "MainNavigation": "Основна навігація",
+ "MakeADifference": "Зробіть свій внесок: %1$sЗробіть внесок зараз%2$s для фінансування Piwik 2.0!",
+ "MakeOneTimeDonation": "Зробити тільки пожертвування (без передплати).",
+ "Menu": "Меню",
+ "NoPrivilegesAskPiwikAdmin": "Ви авторизовані як '%1$s', але, здається, для вас не встановлені права в Piwik. %2$s Попросіть вашого адміністратора (натисніть, щоб написати лист)%3$s надати вам доступ для \"перегляду\" до статистики сайту.",
+ "PageOf": "%1$s з %2$s",
+ "PeriodRange": "Період",
+ "ReportGeneratedOn": "Звіт було складено %s",
+ "ReportGeneratedXAgo": "Звіт було складено %s назад",
+ "SharePiwikLong": "Привіт! Я тільки що знайшов цікавий проект з відкритим вихідним кодом: Piwik! Piwik дозволить відслідковувати відвідувачів на вашому сайті безкоштовно. Ви безперечно повинні це подивитися!",
+ "SharePiwikShort": "Piwik! Вільне та відкрите програмне веб-аналітики. Володійте вашими даними.",
+ "ShareThis": "Поділитися",
+ "ShowJSCode": "Показати JavaScript код для вставки",
+ "SkipToContent": "Перейти до вмісту",
+ "SubscribeAndBecomePiwikSupporter": "Приступити до безпечної оплаті кредитною картою (Paypal), щоб стати прихильником Piwik!",
+ "SupportPiwik": "Підтримайте Piwik!",
+ "TableNoData": "Немає даних для цієї таблиці.",
+ "ThereIsNoDataForThisReport": "Не існує даних для складання звіту.",
+ "UnFlattenDataTable": "Конкретніший звіт %s Побудувати його по ієрархії",
+ "ViewAllPiwikVideoTutorials": "Переглянути всі навчальні ролики про Piwik",
+ "WebAnalyticsReports": "Звіти веб аналітики",
+ "YouAreUsingTheLatestVersion": "У вас остання версія Piwik!",
+ "ClickRowToExpandOrContract": "Натисніть на цей рядок, щоб розширити або скоротити підтаблиці.",
+ "UndoPivotBySubtable": "Цей звіт був згенерований %s Відмінити генерацію",
+ "PivotBySubtable": "Цей звіт не згенерований %1$s Згенеровано %2$s",
+ "QuickAccessTitle": "Пошук %s. Використовуйте клавіші зі стрілками для переходів в межах результатів пошуку. Швидкий доступ: натисніть 'f' для пошуку.",
+ "MenuEntries": "Пункти меню",
+ "Segments": "Сегменти",
+ "AdblockIsMaybeUsed": "У разі, якщо ви використовуєте блокувальник реклами, будь ласка, вимкніть його, щоб переконатися, що Piwik працює без проблем.",
+ "ChangeCurrentWebsite": "Вибір веб-сайту, зараз обраний вебсайт: %s"
}
} \ No newline at end of file
diff --git a/plugins/CoreHome/lang/zh-cn.json b/plugins/CoreHome/lang/zh-cn.json
index 2d2a82c414..b479dcbb37 100644
--- a/plugins/CoreHome/lang/zh-cn.json
+++ b/plugins/CoreHome/lang/zh-cn.json
@@ -29,7 +29,6 @@
"MakeOneTimeDonation": "一次性捐款",
"Menu": "菜单",
"NoPrivilegesAskPiwikAdmin": "您当前登录用户是 '%1$s' 但是没有 Piwik 权限。%2$s 联系 Piwik 管理员 (点击发送邮件)%3$s 获得 '查看' 权限。",
- "OnlyForSuperUserAccess": "这个小工具只对超级用户开放。",
"PageOf": "%1$s,总共 %2$s",
"PeriodRange": "时间段",
"ReportGeneratedOn": "本报表生成时间 %s",
diff --git a/plugins/CoreHome/templates/_topBar.twig b/plugins/CoreHome/templates/_topBar.twig
index 74500aadcf..42582f0dc1 100644
--- a/plugins/CoreHome/templates/_topBar.twig
+++ b/plugins/CoreHome/templates/_topBar.twig
@@ -38,4 +38,4 @@
{% endfor %}
</ul>
<a href="javascript:;" data-activates="mobile-left-menu" class="activateLeftMenu hide-on-large-only button-collapse" style="display:none;"><span class="icon-menu-hamburger"></span></a>
-<a href="javascript:;" data-activates="mobile-top-menu" class="activateTopMenu hide-on-large-only button-collapse"><span class="icon-more-verti"></span></a> \ No newline at end of file
+<a href="javascript:;" data-activates="mobile-top-menu" class="activateTopMenu hide-on-large-only button-collapse"><span class="icon-more-verti"></span></a>
diff --git a/plugins/CoreHome/templates/getDefaultIndexView.twig b/plugins/CoreHome/templates/getDefaultIndexView.twig
index 97fae5e996..f5626eeda2 100644
--- a/plugins/CoreHome/templates/getDefaultIndexView.twig
+++ b/plugins/CoreHome/templates/getDefaultIndexView.twig
@@ -10,7 +10,7 @@
{% endblock %}
{% block content %}
- {{ ajax.requestErrorDiv(emailSuperUser|default(''), arePiwikProAdsEnabled) }}
+ {{ ajax.requestErrorDiv(emailSuperUser|default(''), areAdsForProfessionalServicesEnabled, currentModule) }}
{{ ajax.loadingDiv() }}
<div id="content" class="home">
diff --git a/plugins/CorePluginsAdmin/lang/da.json b/plugins/CorePluginsAdmin/lang/da.json
index 7dbeeb966c..324326c7d7 100644
--- a/plugins/CorePluginsAdmin/lang/da.json
+++ b/plugins/CorePluginsAdmin/lang/da.json
@@ -15,6 +15,7 @@
"BeCarefulUsingPlugins": "Programudvidelser, der ikke er forfattet af Piwik holdet skal anvendes med forsigtighed: vi har ikke kontrolleret dem.",
"BeCarefulUsingThemes": "Temaer, der ikke er forfattet af Piwik holdet skal anvendes med forsigtighed: vi har ikke kontrolleret dem.",
"ByXDevelopers": "af %s udviklere",
+ "CannotInstall": "Kan ikke installere (hjælp)",
"Changelog": "Ændringslog",
"ChangeSettingsPossible": "Du kan ændre %1$sindstillinger%2$s for denne programudvidelse",
"CorePluginTooltip": "Kerne programudvidelser har ingen version, da de distribuereter med Piwik.",
@@ -37,6 +38,10 @@
"LastCommitTime": "(last bidrag %s)",
"LastUpdated": "Sidst opdateret",
"LicenseHomepage": "Licens hjemmeside",
+ "LikeThisPlugin": "Kan du lide dette plugin?",
+ "ConsiderDonating": "Overvej donation",
+ "CommunityContributedPlugin": "Dette er et community plugin, givet til dig gratis.",
+ "ConsiderDonatingCreatorOf": "Overvej venligst at donere et beløb til skaberne af %s",
"PluginsExtendPiwik": "Programudvidelser udbygger og udvider funktionaliteten af Piwik.",
"OncePluginIsInstalledYouMayActivateHere": "Når en udvidelse er installeret, kan den aktiveres eller deaktiveres her.",
"Marketplace": "Markedsplads",
@@ -44,6 +49,7 @@
"MenuPlatform": "Platform",
"MissingRequirementsNotice": "Husk at opdatere %1$s %2$s til en nyere version, %1$s %3$s er påkrævet.",
"MissingRequirementsPleaseInstallNotice": "Installer %1$s %2$s, da det kræves af %3$s.",
+ "NewVersion": "ny version",
"NoPluginsFound": "Ingen udvidelsesmoduler fundet",
"NotAllowedToBrowseMarketplacePlugins": "Du kan gennemse listen over programudvidelser, der kan installeres for at tilpasse eller udvide din Piwik platform. Kontakt din administrator, hvis du har brug for nogen af ​​disse installeret.",
"NotAllowedToBrowseMarketplaceThemes": "Du kan gennemse listen over temaer, der kan installeres for at tilpasse udseendet af Piwik platformen. Kontakt din administrator for at få nogen af ​​disse installeret.",
diff --git a/plugins/CorePluginsAdmin/lang/it.json b/plugins/CorePluginsAdmin/lang/it.json
index 1a30966cc4..880e44ca4b 100644
--- a/plugins/CorePluginsAdmin/lang/it.json
+++ b/plugins/CorePluginsAdmin/lang/it.json
@@ -21,7 +21,7 @@
"CorePluginTooltip": "I plugins di base non hanno versione dato che sono distribuiti con Piweik.",
"Deactivate": "Disattiva",
"Developer": "Sviluppatore",
- "DevelopersLearnHowToDevelopPlugins": "Sviluppatori: Impara come ampliare e personalizzare Piwik %1$ssviluppando plugins e temi%2$s.",
+ "DevelopersLearnHowToDevelopPlugins": "Per gli sviluppatori: Imparate come ampliare e personalizzare Piwik %1$ssviluppando plugins e temi%2$s.",
"DoMoreContactPiwikAdmins": "Per installare un nuovo plugin o un nuovo tema, rimani in contatto con il tuo amministratore di Piwik.",
"EmailToEnquireUpdatedVersion": "Manda un'email a %1$s per informarti su una versione aggiornata di %2$s.",
"FeaturedPlugin": "Plugin rappresentativo",
diff --git a/plugins/CorePluginsAdmin/lang/sv.json b/plugins/CorePluginsAdmin/lang/sv.json
index 4d1491d8ed..ee558cc58b 100644
--- a/plugins/CorePluginsAdmin/lang/sv.json
+++ b/plugins/CorePluginsAdmin/lang/sv.json
@@ -40,6 +40,7 @@
"LicenseHomepage": "Licens Hemsida",
"LikeThisPlugin": "Gilla följande plugin?",
"ConsiderDonating": "Överväg att donera",
+ "CommunityContributedPlugin": "Detta är ett gemensamt utvecklat plugin som är gratis för dig att använda.",
"ConsiderDonatingCreatorOf": "Vänlig överväg att donera till upphovsman av %s",
"PluginsExtendPiwik": "Plugins breddar och utökar funktionerna i Piwik.",
"OncePluginIsInstalledYouMayActivateHere": "När en plugin är installerad kan du aktivera eller inaktivera den här.",
diff --git a/plugins/CorePluginsAdmin/lang/uk.json b/plugins/CorePluginsAdmin/lang/uk.json
index 86fc25a9bc..4ac19ce28c 100644
--- a/plugins/CorePluginsAdmin/lang/uk.json
+++ b/plugins/CorePluginsAdmin/lang/uk.json
@@ -1,19 +1,106 @@
{
"CorePluginsAdmin": {
+ "ActionActivatePlugin": "Активувати плагін",
+ "ActionActivateTheme": "Активувати тему",
+ "ActionInstall": "Встановити",
+ "ActionUninstall": "Видалити",
"Activate": "Активувати",
"Activated": "Активовано",
"Active": "Активний",
- "AuthorHomepage": "Сторінки автора",
+ "Activity": "Активність",
+ "AllowedUploadFormats": "Ви можете завантажити плагін або тему у форматі .zip на цій сторінці.",
+ "AuthorHomepage": "Сторінка автора",
+ "Authors": "Автори",
+ "BackToExtendPiwik": "Повернутися до Маркету",
+ "BeCarefulUsingPlugins": "Плагіни, які не розроблені командою Piwik повинні використовуватися з обережністю: ми не переглядаємо їх.",
+ "BeCarefulUsingThemes": "Теми, які розроблені не командою Piwik повинні використовуватися з обережністю: ми не переглядаємо їх.",
+ "ByXDevelopers": "розробниками %s",
+ "CannotInstall": "Неможливо встановити (допомога)",
+ "Changelog": "Історія змін",
+ "ChangeSettingsPossible": "Ви можете %1$sзмінити налаштування%2$s для цього плагіна.",
+ "CorePluginTooltip": "Основні плагіни не мають версії, так як вони поширюються з Piwik.",
"Deactivate": "Деактивувати",
+ "Developer": "Розробник",
+ "DevelopersLearnHowToDevelopPlugins": "Розробникам: Вивчіть, як ви можете розширити та персоналізувати Piwik за допомогою плагінів для %1$sрозробки або тем%2$s.",
+ "DoMoreContactPiwikAdmins": "Для встановлення нового плагіну або нової темм, будь ласка зв'яжіться з вашим Piwik-адміністратором",
+ "EmailToEnquireUpdatedVersion": "Будь ласка, напишіть на електронну пошту %1$s і запросіть оновлену версію %2$s.",
+ "FeaturedPlugin": "Плагін що набирає популярність",
+ "ChangeLookByManageThemes": "Ви можете змінити зовнішній вигляд Piwik: %1$sВибір Теми%2$s.",
+ "GetEarlyAccessForPaidPlugins": "Примітка: в даний час всі плагіни доступні безкоштовно, в майбутньому ми включимо платні плагіни до Маркету (%1$sЗв'яжіться з нами%2$s для раннього доступу).",
+ "History": "Історія",
"Inactive": "Неактивний",
- "LicenseHomepage": "Сторінка ліцензії",
- "PluginsExtendPiwik": "Плагіни розширюють та примножують функціонал Piwik.",
- "OncePluginIsInstalledYouMayActivateHere": "Як тільки плагін встановлено його можна автивувати або деактивувати тут.",
- "PluginHomepage": "Домашня сторінка плагіна",
+ "InfoPluginUpdateIsRecommended": "Оновіть плагін що б скористатися останніми поліпшеннями.",
+ "InfoThemeIsUsedByOtherUsersAsWell": "Примітка: інші зареєстровані користувачі (%1$s) використовують цю ж тему: %2$s.",
+ "InfoThemeUpdateIsRecommended": "Оновіть тему що б насолодитися останніми поліпшеннями.",
+ "InstallingPlugin": "Встановлення %s",
+ "InstallNewPlugins": "Встановити нові плагіни",
+ "InstallNewThemes": "Встановити нові теми",
+ "LastCommitTime": "(останній комміт %s)",
+ "LastUpdated": "Останнє оновлення",
+ "LicenseHomepage": "Дом. сторінка ліцензії",
+ "LikeThisPlugin": "Подобається цей плагін?",
+ "ConsiderDonating": "Розглянути можливість пожертвування",
+ "CommunityContributedPlugin": "Це плагін, зроблений за сприяння спільноти, доставлений до вас безкоштовно.",
+ "ConsiderDonatingCreatorOf": "Будь ласка, розгляньте можливість пожертвування автору %s",
+ "PluginsExtendPiwik": "Плагіни розширюють функціональність Piwik.",
+ "OncePluginIsInstalledYouMayActivateHere": "Після встановлення плагіну Ви можете активувати або деактивувати його тут.",
+ "Marketplace": "Маркет",
+ "MarketplaceSellPluginSubject": "Маркет – продати плагін",
+ "MenuPlatform": "Платформа",
+ "MissingRequirementsNotice": "Будь ласка, поновіть %1$s %2$s до більш нової версії, необхідна версія %1$s %3$s.",
+ "MissingRequirementsPleaseInstallNotice": "Будь ласка, встановіть %1$s %2$s так як воно потрібне для %3$s.",
+ "NewVersion": "нова версія",
+ "NoPluginsFound": "Плагіни не знайдені",
+ "NotAllowedToBrowseMarketplacePlugins": "Можете подивитися список плагінів, які можуть бути встановлені для підстроювання або розширення вашої платформи Piwik. Зв'яжіться з адміністратором якщо вам буде потрібно встановити один з них.",
+ "NotAllowedToBrowseMarketplaceThemes": "Ви можете подивитися список тем, які можуть бути встановлені для налаштування зовнішнього вигляду платформи Piwik. Будь ласка, зв'яжіть з вашим адміністратором, щоб встановити будь-яку з них.",
+ "NoThemesFound": "Теми не знайдені",
+ "NoZipFileSelected": "Ви берете ZIP файл",
+ "NumDownloadsLatestVersion": "Остання версія завантажена: %s разів",
+ "NumUpdatesAvailable": "%s оновлення доступні",
+ "Origin": "Походження",
+ "OriginCore": "Основні",
+ "OriginThirdParty": "Сторонні",
+ "PluginHomepage": "Дом. сторінка плагіна",
"PluginKeywords": "Ключові слова",
- "PluginsManagement": "Керування плагінами",
+ "PluginNotCompatibleWith": "Плагін %1$s несумісний з %2$s.",
+ "PluginNotWorkingAlternative": "Якщо ви використовуєте цей плагін, можливо ви зможете знайти більш нові версії в Маркеті. Якщо ні - можете видалити його.",
+ "PluginRequirement": "%1$s потрібно %2$s.",
+ "PluginsManagement": "Управління плагінами",
+ "PluginUpdateAvailable": "Ви використовуєте версію %1$s остання доступна %2$s",
+ "PluginVersionInfo": "%1$s – %2$s",
+ "PluginWebsite": "Сайт плагіну",
+ "Screenshots": "Скріншоти",
+ "SortByAlpha": "за назвою",
+ "SortByNewest": "по новизні",
+ "SortByPopular": "за популярністю",
"Status": "Статус",
+ "StepDownloadingPluginFromMarketplace": "Завантажити плагін з Маркету",
+ "StepDownloadingThemeFromMarketplace": "Завантажити тему з Маркету",
+ "StepPluginSuccessfullyInstalled": "Ви успішно встановили плагін %1$s %2$s.",
+ "StepPluginSuccessfullyUpdated": "Ви успішно оновили плагін %1$s %2$s.",
+ "StepReplaceExistingPlugin": "Заміна існуючого плагіна",
+ "StepReplaceExistingTheme": "Заміна існуючої теми",
+ "StepThemeSuccessfullyInstalled": "Ви успішно встановили тему %1$s %2$s.",
+ "StepThemeSuccessfullyUpdated": "Ви успішно оновили тему %1$s %2$s.",
+ "StepUnzippingPlugin": "Розпакування плагіна",
+ "StepUnzippingTheme": "Розпакування теми",
+ "SuccessfullyActicated": "Ви успішно активували <strong>%s<\/strong>.",
+ "Support": "Підтримка",
+ "TeaserExtendPiwik": "Поліпшення Piwik за допомогою Плагінів і Тим",
+ "TeaserExtendPiwikByPlugin": "Поліпшення Piwik установкою нового плагіна",
+ "TeaserExtendPiwikByTheme": "Насолоджуйтеся іншим зовнішнім виглядом встановивши нову тему",
+ "TeaserExtendPiwikByUpload": "Поліпшення Piwik закачуванням ZIP файла",
+ "InstallingNewPluginViaMarketplaceOrUpload": "Ви автоматично можете встановити плагіни з Маркету або %1$sзавантажити плагін%2$s в форматі zip.",
+ "Theme": "Тема",
+ "Themes": "Теми",
+ "ThemesDescription": "Теми можуть змінити зовнішній вигляд Piwik призначеного для користувача інтерфейсу, а також забезпечити абсолютно нове візуальне сприйняття, щоб насолоджуватися звітами аналітики.",
+ "ThemesManagement": "Управління темами",
+ "UninstallConfirm": "Ви збираєтеся видалити плагін %s. Плагін буде безповоротно видалений з системи. Ви впевнені, що хочете зробити це?",
+ "Updated": "Оновлено",
+ "UpdatingPlugin": "Оновлення %s",
+ "UploadZipFile": "Завантажити ZIP файл",
"Version": "Версія",
+ "ViewRepositoryChangelog": "Подивитися зміни",
"Websites": "Сайти"
}
} \ No newline at end of file
diff --git a/plugins/CoreUpdater/Commands/Update.php b/plugins/CoreUpdater/Commands/Update.php
index 694b38b288..4c579ad211 100644
--- a/plugins/CoreUpdater/Commands/Update.php
+++ b/plugins/CoreUpdater/Commands/Update.php
@@ -8,6 +8,8 @@
*/
namespace Piwik\Plugins\CoreUpdater\Commands;
+use Piwik\Filechecks;
+use Piwik\SettingsServer;
use Piwik\Version;
use Piwik\Config;
use Piwik\DbHelper;
@@ -68,6 +70,9 @@ class Update extends ConsoleCommand
$this->writeSuccessMessage($output, array('Database upgrade not executed.'));
}
+ $this->writeAlertMessageWhenCommandExecutedWithUnexpectedUser($output);
+
+
} catch(NoUpdatesFoundException $e) {
// Do not fail if no updates were found
$this->writeSuccessMessage($output, array($e->getMessage()));
@@ -153,6 +158,11 @@ class Update extends ConsoleCommand
{
$migrationQueries = $this->getMigrationQueriesToExecute($updater);
+ if(empty($migrationQueries)) {
+ $output->writeln(array(" *** Note: There are no SQL queries to execute. ***", ""));
+ return;
+ }
+
$output->writeln(array(" *** Note: this is a Dry Run ***", ""));
foreach ($migrationQueries as $query) {
@@ -334,4 +344,31 @@ class Update extends ConsoleCommand
return $updater;
}
+
+ /**
+ * @param OutputInterface $output
+ */
+ protected function writeAlertMessageWhenCommandExecutedWithUnexpectedUser(OutputInterface $output)
+ {
+ if(SettingsServer::isWindows()) {
+ // does not work on windows
+ return;
+ }
+
+ $processUserAndGroup = Filechecks::getUserAndGroup();
+ $fileOwnerUserAndGroup = Filechecks::getOwnerOfPiwikFiles();
+
+ if($processUserAndGroup == $fileOwnerUserAndGroup) {
+ // current process user/group appear to be same as the Piwik filesystem user/group -> OK
+ return;
+ }
+ $output->writeln(
+
+ sprintf("<comment>It appears you have executed this update with user %s, while your Piwik files are owned by %s. \n\nTo ensure that the Piwik files are readable by the correct user, you may need to run the following command (or a similar command depending on your server configuration):\n\n$ %s</comment>",
+ $processUserAndGroup,
+ $fileOwnerUserAndGroup,
+ Filechecks::getCommandToChangeOwnerOfPiwikFiles()
+ )
+ );
+ }
}
diff --git a/plugins/CoreUpdater/Test/Mock/UpdaterMock.php b/plugins/CoreUpdater/Test/Mock/UpdaterMock.php
index 09ecf7f8ae..c72510e006 100644
--- a/plugins/CoreUpdater/Test/Mock/UpdaterMock.php
+++ b/plugins/CoreUpdater/Test/Mock/UpdaterMock.php
@@ -26,7 +26,7 @@ class UpdaterMock extends Updater
public function getLatestVersion()
{
- return '4.0.0';
+ return '40.0.0';
}
public function isNewVersionAvailable()
diff --git a/plugins/CoreUpdater/UpdateCommunication.php b/plugins/CoreUpdater/UpdateCommunication.php
index 27f253eed4..d39f44c111 100644
--- a/plugins/CoreUpdater/UpdateCommunication.php
+++ b/plugins/CoreUpdater/UpdateCommunication.php
@@ -24,7 +24,7 @@ class UpdateCommunication
{
/**
- * Checks whether update communciation in general is enabled or not.
+ * Checks whether update communication in general is enabled or not.
*
* @return bool
*/
diff --git a/plugins/CoreUpdater/lang/cs.json b/plugins/CoreUpdater/lang/cs.json
index e8558c4db1..47ed4fff6c 100644
--- a/plugins/CoreUpdater/lang/cs.json
+++ b/plugins/CoreUpdater/lang/cs.json
@@ -57,7 +57,7 @@
"ThankYouUpdatePiwik": "Děkujeme, že používáte Piwik vždy v nejaktuálnější verzi!",
"PostUpdateMessage": "Piwik bude vždy zdarma ke stažení a použití, ale potřebuje pro svůj růst a zlepšení vaši neustálou podporu .",
"PostUpdateSupport": "Pokud potřebujete pomoc s použitím aplikace Piwik, můžete ji obdržet od jejích tvůrců:",
- "EnterpriseSolutions": "Firemní řešení",
+ "ProfessionalServices": "Profesionální služby",
"CloudHosting": "Hostování v Cloudu",
"Updating": "Aktualizuji",
"UpdateUsingHttpsFailed": "Stažení nejnovější verze Piwik pomocí zabezpečeného HTTPS připojení se nezdařilo kvůli následující chybě:",
diff --git a/plugins/CoreUpdater/lang/da.json b/plugins/CoreUpdater/lang/da.json
index cb351c649d..5b3fe4d0db 100644
--- a/plugins/CoreUpdater/lang/da.json
+++ b/plugins/CoreUpdater/lang/da.json
@@ -25,6 +25,11 @@
"HighTrafficPiwikServerEnableMaintenance": "Hvis du administrerer en Piwik server med høj trafik, anbefaler vi at du %1$s midlertidigt deaktivere sporing af besøgende og sætte Piwik brugergrænseflade i vedligeholdelsestilstand%2$s",
"IncompatbilePluginsWillBeDisabledInfo": "Bemærk: Nogle udvidelsesmoduler er ikke kompatible med Piwik %s. De vil blive deaktiveret, når du opgraderer:",
"InstallingTheLatestVersion": "Installerer den seneste version",
+ "LatestBetaRelease": "Den seneste beta release",
+ "LatestStableRelease": "Den seneste stabile udgave",
+ "Latest2XStableRelease": "Den seneste stabile 2.X",
+ "Latest2XBetaRelease": "Den seneste beta 2.X",
+ "LtsSupportVersion": "Long Term Support version",
"MajorUpdateWarning1": "Dette er en stor opdatering! Den vil tage længere tid end normalt.",
"MajorUpdateWarning2": "Det følgende råd er især vigtigt for store installationer.",
"NoteForLargePiwikInstances": "Vigtig bemærkning til store Piwik installationer",
@@ -48,6 +53,17 @@
"UpdateHasBeenCancelledExplanation": "Piwik ét klik-opdatering er blevet annulleret. Kan ovenstående fejlmeddelelse ikke løses, anbefales det at opdatere Piwik manuelt. %1$s Læs %2$sOpdaterings dokumentationen%3$s for at komme i gang!",
"UpdateTitle": "Opdatering",
"UpdateSuccessTitle": "Piwik blev opdateret!",
+ "UpdateErrorTitle": "Opdaterings fejl",
+ "ThankYouUpdatePiwik": "Tak fordi du benytter Piwik og holder den opdateret!",
+ "PostUpdateMessage": "Piwik vil altid være gratis at downloade, men den behøver din fortsatte støtte for at vokse og blive bedre.",
+ "PostUpdateSupport": "If du behøver hjælp til at bruge Piwik, kan du få support fra skaberne:",
+ "CloudHosting": "Cloud hosting",
+ "Updating": "Opdaterer",
+ "UpdateUsingHttpsFailed": "Downloader den seneste Piwik version over en sikker HTTPS forbindelse lykkedes ikke, på grund af følgende fejl:",
+ "UpdateUsingHttpsFailedHelp": "Hvorfor gik det galt? Download af den nyeste Piwik version (over sikker HTTPS forbindelse) kan fejle af flere årsager. F.eks. på grund af en netværksfejl, langsomt netværk eller forkert system konfiguration. Bemærk at det også kan skyldes at din server er under MITM angreb og nogen prøver at erstatte opdateringen med en ondsindet version af Piwik.",
+ "UpdateUsingHttpsFailedHelpWhatToDo": "Det anbefales at prøve at downloade igen ved at bruge den sikre HTTPS forbindelse, da den forhindrer MITM angreb.",
+ "UsingHttps": "bruger den sikre HTTPS forbindelse (anbefalet)",
+ "UsingHttp": "bruger den ikke sikre HTTP forbindelse",
"UpgradeComplete": "Opgradering fuldført!",
"UpgradePiwik": "Opgrader Piwik",
"VerifyingUnpackedFiles": "Kontrollerer filer",
diff --git a/plugins/CoreUpdater/lang/de.json b/plugins/CoreUpdater/lang/de.json
index c4397dd0e5..6a70623792 100644
--- a/plugins/CoreUpdater/lang/de.json
+++ b/plugins/CoreUpdater/lang/de.json
@@ -57,7 +57,7 @@
"ThankYouUpdatePiwik": "Vielen Dank, dass Sie Piwik nutzen und es aktuell halten!",
"PostUpdateMessage": "Piwik wird immer frei herunterzuladen und zu nutzen sein, aber es braucht Ihre dauerhafte Unterstützung um zu wachsen und zu gedeihen.",
"PostUpdateSupport": "Wenn Sie beim Einsatz von Piwik Hilfe benötigen, holen Sie sich Support von dessen Schöpfer:",
- "EnterpriseSolutions": "Enterprise-Lösungen",
+ "ProfessionalServices": "Professionelle Dienste",
"CloudHosting": "Cloud-Hosting",
"Updating": "Aktualisiere",
"UpdateUsingHttpsFailed": "Das Herunterladen der neuesten Piwik Version über eine sichere HTTPS-Verbindung war aufgrund des folgenden Fehlers nicht erfolgreich:",
diff --git a/plugins/CoreUpdater/lang/el.json b/plugins/CoreUpdater/lang/el.json
index ce9c300041..695a3c5519 100644
--- a/plugins/CoreUpdater/lang/el.json
+++ b/plugins/CoreUpdater/lang/el.json
@@ -57,7 +57,7 @@
"ThankYouUpdatePiwik": "Ευχαριστούμε που χρησιμοποιείτε το Piwik και το κρατάτε ενημερωμένο!",
"PostUpdateMessage": "Το Piwik θα είναι πάντα ελεύθερο για κατέβασμα και χρήση, αλλά χρειάζεται τη διαρκή υποστήριξή σας για να αναπτύσσεται και να βελτιώνεται.",
"PostUpdateSupport": "Αν χρειάζεστε βοήθεια στη χρήση του Piwik, μπορείτε να λάβετε υποστήριξη από τους δημιουργούς του:",
- "EnterpriseSolutions": "Λύσεις για επιχειρήσεις",
+ "ProfessionalServices": "Επαγγελματικές Υπηρεσίες",
"CloudHosting": "Φιλοξενία στο σύννεφο",
"Updating": "Γίνεται ενημέρωση",
"UpdateUsingHttpsFailed": "Το κατέβασμα της τελευταίας έκδοσης Piwik πάνω από σύνδεση HTTPS δεν έγινε με επιτυχία, λόγω του ακόλουθου σφάλματος:",
diff --git a/plugins/CoreUpdater/lang/en.json b/plugins/CoreUpdater/lang/en.json
index 5186315310..8086f16b36 100644
--- a/plugins/CoreUpdater/lang/en.json
+++ b/plugins/CoreUpdater/lang/en.json
@@ -57,7 +57,7 @@
"ThankYouUpdatePiwik": "Thank you for using Piwik and keeping it up to date!",
"PostUpdateMessage": "Piwik will always be free to download and use, but it needs your continued support to grow and improve.",
"PostUpdateSupport": "If you need help using Piwik, you can get support from its creators:",
- "EnterpriseSolutions": "Enterprise solutions",
+ "ProfessionalServices": "Professional Services",
"CloudHosting": "Cloud hosting",
"Updating": "Updating",
"UpdateUsingHttpsFailed": "Downloading the latest Piwik version over secure HTTPS connection did not succeed, because of the following error:",
diff --git a/plugins/CoreUpdater/lang/es.json b/plugins/CoreUpdater/lang/es.json
index d3b9111aa3..d97e404a48 100644
--- a/plugins/CoreUpdater/lang/es.json
+++ b/plugins/CoreUpdater/lang/es.json
@@ -25,6 +25,11 @@
"HighTrafficPiwikServerEnableMaintenance": "Si administra un servidor de Piwik con tráfico elevado, le recomendamos %1$sdesactivar momentáneamente el seguimento de los visitantes y disponer la interfaz de usuario de Piwik en modo mantenimiento%2$s.",
"IncompatbilePluginsWillBeDisabledInfo": "Nota: algunos complementos no son compatibles con Piwik %s. Serán desactivados cuando actualice:",
"InstallingTheLatestVersion": "Instalando la última versión",
+ "LatestBetaRelease": "Ultima versión beta estable",
+ "LatestStableRelease": "Ultima liberación de versión estable",
+ "Latest2XStableRelease": "Ultima versión estable 2.X",
+ "Latest2XBetaRelease": "Ultima versión beta 2.X",
+ "LtsSupportVersion": "Versión de apoyo más extensa",
"MajorUpdateWarning1": "¡Esta es una actualización importante! Tardará más de lo usual.",
"MajorUpdateWarning2": "El siguiente consejo es especialmente importante para instalaciones voluminosas.",
"NoteForLargePiwikInstances": "Nota importante para grandes instalaciones de Piwik",
@@ -52,7 +57,7 @@
"ThankYouUpdatePiwik": "¡Gracias por utilizar Piwik y mantenerlo actualizado!",
"PostUpdateMessage": "Piwik siempre será gratuita tanto su descarga y uso, pero necesitamos su continuo apoyo para crecer y mejorar.",
"PostUpdateSupport": "Si necesita ayuda utilizando Piwik, puede obtener apoyo de sus creadores:",
- "EnterpriseSolutions": "Soluciones empresariales",
+ "ProfessionalServices": "Servicios profesionales",
"CloudHosting": "Alojamiento en la nube",
"Updating": "Actualizando",
"UpdateUsingHttpsFailed": "La descarga de la más reciente versión de Piwik sobre una conexión segura HTTPS no fue exitosa, debido al siguiente error:",
diff --git a/plugins/CoreUpdater/lang/fr.json b/plugins/CoreUpdater/lang/fr.json
index 51996305d8..e988e51340 100644
--- a/plugins/CoreUpdater/lang/fr.json
+++ b/plugins/CoreUpdater/lang/fr.json
@@ -57,7 +57,7 @@
"ThankYouUpdatePiwik": "Merci d'utiliser Piwik et de le garder à jour !",
"PostUpdateMessage": "Piwik sera toujours gratuit à télécharger et utiliser, mais il a besoin de votre support continu pour grandir et s'améliorer.",
"PostUpdateSupport": "Si vous avez besoin d'aide pour utiliser Piwik, vous pouvez obtenir du support de la part de ses créateurs :",
- "EnterpriseSolutions": "Solutions d'entreprise",
+ "ProfessionalServices": "Services professionnels",
"CloudHosting": "Hébergement Cloud",
"Updating": "Mise à jour en cours",
"UpdateUsingHttpsFailed": "Le téléchargement de la dernière version de Piwik via une connexion HTTPS sécurisée a échoué pour la raison suivante :",
diff --git a/plugins/CoreUpdater/lang/it.json b/plugins/CoreUpdater/lang/it.json
index 0695373153..a8b10cc92e 100644
--- a/plugins/CoreUpdater/lang/it.json
+++ b/plugins/CoreUpdater/lang/it.json
@@ -57,7 +57,7 @@
"ThankYouUpdatePiwik": "Grazie per l'utilizzo di Piwik e per tenerlo aggiornato!",
"PostUpdateMessage": "Piwik sarà sempre gratuito da scaricare e utilizzare, ma necessita del tuo continuo sostegno per crescere e migliorare.",
"PostUpdateSupport": "Se hai bisogno di aiuto per utilizzare Piwik, puoi averlo dai suoi creatori:",
- "EnterpriseSolutions": "Soluzioni per le aziende",
+ "ProfessionalServices": "Servizi Professionali",
"CloudHosting": "Cloud hosting",
"Updating": "Aggiornamento",
"UpdateUsingHttpsFailed": "Il download dell'ultima versione di Piwik tramite connessione sicura HTTPS non ha avuto successo a causa del seguente errore:",
diff --git a/plugins/CoreUpdater/lang/ja.json b/plugins/CoreUpdater/lang/ja.json
index 5b9e6c99f7..cb276d1566 100644
--- a/plugins/CoreUpdater/lang/ja.json
+++ b/plugins/CoreUpdater/lang/ja.json
@@ -57,7 +57,6 @@
"ThankYouUpdatePiwik": "Piwik を利用し、最新の状態を維持して頂きありがとうございます!",
"PostUpdateMessage": "Piwik は、常に無料でダウンロードして自由に使用できますが、成長し、改善するためには皆様のご支援が必要です。",
"PostUpdateSupport": "Piwik の使い方で助けが必要な場合は、そのクリエイターからサポートを得ることができます:",
- "EnterpriseSolutions": "エンタープライズソリューション",
"CloudHosting": "クラウドホスティング",
"Updating": "アップデート",
"UpdateUsingHttpsFailed": "以下のエラーにより、セキュリティで保護された HTTPS 接続で Piwik の最新バージョンをダウンロードできませんでした。",
diff --git a/plugins/CoreUpdater/lang/nb.json b/plugins/CoreUpdater/lang/nb.json
index e47c271de6..975b2eb501 100644
--- a/plugins/CoreUpdater/lang/nb.json
+++ b/plugins/CoreUpdater/lang/nb.json
@@ -57,7 +57,7 @@
"ThankYouUpdatePiwik": "Takk for at du bruker Piwik og holder den oppdatert!",
"PostUpdateMessage": "Piwik vil alltid være gratis å laste ned og bruke, men det trenger din fortsatte støtte for å vokse og bli bedre.",
"PostUpdateSupport": "Hvis du trenger hjelp til å bruke Piwik, kan du få støtte fra utviklerne:",
- "EnterpriseSolutions": "Bedriftsløsninger",
+ "ProfessionalServices": "Profesjonelle tjenester",
"CloudHosting": "Cloud-hosting",
"Updating": "Oppdaterer",
"UpdateUsingHttpsFailed": "Klarte ikke laste ned siste versjon av Piwik over en sikker HTTPS-forbindelse på grunn av følgende feil:",
diff --git a/plugins/CoreUpdater/lang/nl.json b/plugins/CoreUpdater/lang/nl.json
index 0113f6ff60..331d80c3ea 100644
--- a/plugins/CoreUpdater/lang/nl.json
+++ b/plugins/CoreUpdater/lang/nl.json
@@ -52,7 +52,6 @@
"ThankYouUpdatePiwik": "Dank voor het gebruiken van Piwik en het up-to-date houden!",
"PostUpdateMessage": "Piwik zal altijd gratis te downloaden zijn, maar het heeft je voortdurende support nodig om te groeien en beter te worden.",
"PostUpdateSupport": "Als je hulp nodig hebt, kun je support krijgen bij de makers:",
- "EnterpriseSolutions": "Enterprise oplossingen",
"CloudHosting": "Cloud hosting",
"Updating": "Bijwerken",
"UpdateUsingHttpsFailed": "Het downloaden van de laatste Piwik versie over een beveiligde HTTPS verbinding was niet succesvol, door de volgende fout:",
diff --git a/plugins/CoreUpdater/lang/pt-br.json b/plugins/CoreUpdater/lang/pt-br.json
index 80ba61911f..c9741637c6 100644
--- a/plugins/CoreUpdater/lang/pt-br.json
+++ b/plugins/CoreUpdater/lang/pt-br.json
@@ -57,7 +57,6 @@
"ThankYouUpdatePiwik": "Obrigado por usar o Piwik e mantê-lo atualizado!",
"PostUpdateMessage": "Piwik será sempre gratuito para baixar e usar, mas ele precisa de seu apoio para continuar a crescer e melhorar.",
"PostUpdateSupport": "Se você precisar de ajuda para usar Piwik, você pode obter o apoio de seus criadores:",
- "EnterpriseSolutions": "Soluções corporativas",
"CloudHosting": "Nuvem de hospedagem",
"Updating": "Atualizando",
"UpdateUsingHttpsFailed": "Fazendo o download da versão mais recente do Piwik sobre conexão segura HTTPS não teve sucesso, devido ao seguinte erro:",
diff --git a/plugins/CoreUpdater/lang/ru.json b/plugins/CoreUpdater/lang/ru.json
index 768fc2b8bc..4b63c6e4a3 100644
--- a/plugins/CoreUpdater/lang/ru.json
+++ b/plugins/CoreUpdater/lang/ru.json
@@ -57,7 +57,6 @@
"ThankYouUpdatePiwik": "Спасибо за то, что пользуетесь Piwik и обновляете его!",
"PostUpdateMessage": "Piwik всегда будет свободным для скачивания и использования, но ему нужна постоянная поддержка чтобы расти и улучшаться.",
"PostUpdateSupport": "Если вам нужна помощь в использовании Piwik, то вы сможете получить поддержку от его создателей:",
- "EnterpriseSolutions": "Решения для предприятия",
"CloudHosting": "Облачный хостинг",
"Updating": "Обновление",
"UpdateUsingHttpsFailed": "Не удалось скачать последнюю версию Piwik по безопасному HTTPS, возникла следующая ошибка:",
diff --git a/plugins/CoreUpdater/lang/sk.json b/plugins/CoreUpdater/lang/sk.json
index 49899599e9..c9ea15ceac 100644
--- a/plugins/CoreUpdater/lang/sk.json
+++ b/plugins/CoreUpdater/lang/sk.json
@@ -57,7 +57,6 @@
"ThankYouUpdatePiwik": "Ďakujeme za to, že používate Piwik a že ho udržiavate aktualizovaný!",
"PostUpdateMessage": "Piwik bude vždy voľne dostupný na stiahnutie a používanie, ale potrebuje Vašu neustálu podporu, aby rástol a zlepšoval sa.",
"PostUpdateSupport": "Ak potrebujete pomoc pri používaní projektu Piwik, môžete získať podporu od jeho tvorcov:",
- "EnterpriseSolutions": "Podnikové riešenia",
"CloudHosting": "Cloud hosting",
"Updating": "Aktualizovanie",
"UpdateUsingHttpsFailed": "Stiahnutie najnovšej Piwik-verzie cez bezpečné HTTPS spojenie nebolo úspešné kvôli nasledujúcej chybe:",
diff --git a/plugins/CoreUpdater/lang/sq.json b/plugins/CoreUpdater/lang/sq.json
index 7630feb265..4704abcab7 100644
--- a/plugins/CoreUpdater/lang/sq.json
+++ b/plugins/CoreUpdater/lang/sq.json
@@ -18,17 +18,33 @@
"ExceptionArchiveEmpty": "Arkivë bosh.",
"ExceptionArchiveIncompatible": "Arkivë e papërputhshme: %s",
"ExceptionArchiveIncomplete": "Arkiva nuk është e plotë: mungojnë disa kartela (p.sh. %s).",
+ "FeedbackRequest": "Mos ngurroni të ndani me Ekipin e Piwik-ut idetë dhë sugjerimet tuaja, këtu:",
"HelpMessageContent": "Hidhini një sy %1$s Piwik FAQ %2$s që shpjegojnë gabimet më të rëndomta gjatë përditësimesh. %3$s Pyesni përgjegjësin e sistemit tuaj - ai mund të jetë në gjendje të t’ju ndihmojë për gabimin, i cili ka shumë të ngjarë të ketë lidhje me rregullimet e shërbyesit tuaj ose ato të MySQL-së.",
"HelpMessageIntroductionWhenError": "Sa më sipër, është thelbi i mesazhit të gabimit. Do të ndihmonte të shpjegohej shkaku, por nëse keni nevojë për ndihmë të mëtejshme, ju lutem:",
"HelpMessageIntroductionWhenWarning": "Përditësimi u plotësua me sukses, sidoqoftë pati ca kleçka gjatë procesit. Ju lutem, lexoni përshkrimet më sipër për hollësi. Për më tepër ndihmë:",
+ "HighTrafficPiwikServerEnableMaintenance": "Nëse administroni një shërbyes Piwik me trafik të madh, këshillojmë ta %1$sçaktivizoni përkohësisht Gjurmimin e vizitorëve dhe ta kaloni Ndërfaqen e Përdoruesit të Piwik-ut nën mënyrën mirëmbajtje%2$s.",
+ "IncompatbilePluginsWillBeDisabledInfo": "Shënim: disa shtojca s’janë të përputhshme me Piwik %s. Ato do të çaktivizohen, kur ta përditësoni:",
"InstallingTheLatestVersion": "Po instalohet versioni më i fundit",
+ "LatestBetaRelease": "Hedhja beta më e re në qarkullim",
+ "LatestStableRelease": "Hedhja e qëndrueshme më e re në qarkullim",
+ "Latest2XStableRelease": "Hedhja e qëndrueshme 2.X më e re në qarkullim",
+ "Latest2XBetaRelease": "Hedhja beta 2.X më e re në qarkullim",
+ "LtsSupportVersion": "Version me Mbulim Afatgjatë",
+ "MajorUpdateWarning1": "Ky është një përditësim i rëndësishëm! Do të hajë më tepër kohë se zakonisht.",
+ "MajorUpdateWarning2": "Këshilla vijuese është veçanërisht e rëndësishme për instalime të mëdha.",
"NoteForLargePiwikInstances": "Shënime të rëndësishme për instalime Piwik me shumë ngarkesë",
"NoteItIsExpectedThatQueriesFail": "Shënim: nëse këto kërkesa i ekzekutoni dorazi, pritet që ndonjëra, ose disa, prej tyre edhe të dështojë. Në një rast të tillë, thjesht shpërfillini gabimet, dhe vazhdoni me pasueset në listë.",
+ "NotificationClickToUpdatePlugins": "Klikoni këtu që të përditësoni shtojcat tuaja tani:",
+ "NotificationClickToUpdateThemes": "Klikoni këtu që të përditësoni temat tuaja tani:",
+ "NotificationSubjectAvailableCoreUpdate": "Është gati Piwik %s i ri",
+ "NotificationSubjectAvailablePluginUpdate": "Ka gati përditësime për shtojcat tuaja Piwik",
"PiwikHasBeenSuccessfullyUpgraded": "Piwik-u u përmirësua me sukses!",
"PiwikUpdatedSuccessfully": "Piwik-u u përditësua me sukses!",
"PiwikWillBeUpgradedFromVersionXToVersionY": "Baza e të dhënave për Piwik-un do të përmirësohet prej versionit %1$s te versioni i ri %2$s.",
"ReadyToGo": "Gati për t’ia filluar?",
"TheFollowingPluginsWillBeUpgradedX": "Shtojcat vijuese do të përditësohen: %s.",
+ "TheFollowingDimensionsWillBeUpgradedX": "Përmasat vijuese do të përditësohen: %s.",
+ "ThereIsNewPluginVersionAvailableForUpdate": "Disa nga shtojcat që keni, janë përditësuar te Marketplace:",
"ThereIsNewVersionAvailableForUpdate": "Mund të kihet një version i ri, i përmirësuar, i Piwik-ut",
"TheUpgradeProcessMayFailExecuteCommand": "Nëse keni një bazë të dhënash Piwik të madhe, përditësimet mund të zgjasin shumë në shfletues. Në të tilla raste, mund t’i bëni përditësimet që nga rresht urdhrash: %s",
"TheUpgradeProcessMayTakeAWhilePleaseBePatient": "Procesi i përditësimit të bazës së të dhënave mund të zgjasë ca, ndaj bëni durim.",
@@ -37,6 +53,17 @@
"UpdateHasBeenCancelledExplanation": "Përditësimi Piwik Me Një Klik u anulua. Nëse s’ndreqni dot gabimin me mesazhin e mësipërm, këshillohet ta përditësoni Piwik-un dorazi. %1$s Ju lutem, shihni %2$sdokumentimin e Përditësimeve%3$s për t’ia filluar!",
"UpdateTitle": "Piwik › Përditësim",
"UpdateSuccessTitle": "Piwik-u u përmirësua me sukses!",
+ "UpdateErrorTitle": "Gabim në përditësim",
+ "ThankYouUpdatePiwik": "Faleminderit për përdorimin dhe mbajtjen e Piwik-ut të përditësuar!",
+ "PostUpdateMessage": "Shkarkimi dhe përdorimi i Piwik-ut do të jenë gjithnjë të lirë, por i duhet përkrahja juaj e vazhdueshme për t’u rritur dhe përmirësuar.",
+ "PostUpdateSupport": "Nëse ju duhet ndihmë mbi përdorimin e Piwik-ut, mund të merrni asistencë nga krijuesit e tij:",
+ "CloudHosting": "Strehim në re",
+ "Updating": "Përditësim",
+ "UpdateUsingHttpsFailed": "Shkarkimi i versionit më të ri të Piwik-ut përmes një lidhje të sigurt HTTPS nuk pati sukses, për shkak të gabimit vijues:",
+ "UpdateUsingHttpsFailedHelp": "Pse dështoi? Shkarkimi i versionit më të ri të Piwik-ut (përmes një lidhjeje HTTPS të sigurt) mund të dështojë për shkak të një numri arsyesh, për shembull, për shkak të një gabimi rrjeti, shpejtësie të ulët në rrjet ose formësim të gabuar sistemi. Mbani parasysh që kjo mund të dojë të thotë edhe se shërbyesi juaj është objektiv i një sulmi MITM dhe se dikush po përpiqet të zëvendësojë përditësimin me një version dashakeq të Piwik-ut.",
+ "UpdateUsingHttpsFailedHelpWhatToDo": "Këshillohet të riprovohet shkarkimi duke përdorur lidhje të sigurt HTTPS, ngaqë ajo i parandalon sulmet MITM.",
+ "UsingHttps": "duke përdorur lidhje HTTPS të sigurt (e këshillueshme)",
+ "UsingHttp": "duke përdorur lidhje HTTPS jo të sigurt",
"UpgradeComplete": "Përmirësim i plotësuar!",
"UpgradePiwik": "Përmirësojeni Piwik-un",
"VerifyingUnpackedFiles": "Po verifikohen kartelat e shpaketuara",
@@ -45,6 +72,7 @@
"YouCanUpgradeAutomaticallyOrDownloadPackage": "Mund ta përmirësoni automatikisht me versionin %s, ose të shkarkoni paketën dhe ta instaloni atë dorazi:",
"YouCouldManuallyExecuteSqlQueries": "Nëse nuk jeni në gjendje të xhironi përditësuesin nga rresht urdhrash dhe Piwik-u nuk arrin të përmirësohet (për shkak mbarimi kohe për bazën e të dhënave, mbarimi kohe për shfletuesin, ose çfarëdo çështje tjetër), mundeni të ekzekutoni kërkesa SQL dorazi që të përditësoni Piwik-un.",
"YouMustDownloadPackageOrFixPermissions": "Piwik-u është i pazoti të mbishkruajë instalimin tuaj të tanishëm. Mundeni ose të ndreqni lejet mbi drejtorira\/kartela, ose të shkarkoni paketën dhe instaloni versionin %s dorazi:",
- "YourDatabaseIsOutOfDate": "Baza juaj e të dhënave për Piwik-un është e vjetruar, dhe duhet përmirësuar përpara se të mund të vazhdoni."
+ "YourDatabaseIsOutOfDate": "Baza juaj e të dhënave për Piwik-un është e vjetruar, dhe duhet përmirësuar përpara se të mund të vazhdoni.",
+ "ViewVersionChangelog": "Shihni regjistër ndryshimesh për këtë version:"
}
} \ No newline at end of file
diff --git a/plugins/CoreUpdater/lang/sr.json b/plugins/CoreUpdater/lang/sr.json
index 5f18c9813a..c199b6c3fb 100644
--- a/plugins/CoreUpdater/lang/sr.json
+++ b/plugins/CoreUpdater/lang/sr.json
@@ -52,7 +52,6 @@
"ThankYouUpdatePiwik": "Hvala vam što koristite Piwik i što ga držite uvek ažurnim!",
"PostUpdateMessage": "Piwik će uvek biti besplatan za preuzimanje i korišćenje ali on zahteva vašu neprestanu podršku kako bi rastao i razvijao se.",
"PostUpdateSupport": "Ukoliko vam je potrebna pomoć oko korišćenja Piwik-a, možete je dobiti od njegovih tvoraca:",
- "EnterpriseSolutions": "Poslovna rešenja",
"CloudHosting": "Hosting u oblacima",
"Updating": "Ažuriranje",
"UpdateUsingHttpsFailed": "Preuzimanje poslednje verzije Piwik-a preko HTTPS-a nije uspelo zbog sledeće greške:",
diff --git a/plugins/CoreUpdater/lang/sv.json b/plugins/CoreUpdater/lang/sv.json
index 4b2a7c5e4e..d752241e64 100644
--- a/plugins/CoreUpdater/lang/sv.json
+++ b/plugins/CoreUpdater/lang/sv.json
@@ -56,7 +56,6 @@
"ThankYouUpdatePiwik": "Tack för att du använder Piwik och håller den uppdaterad!",
"PostUpdateMessage": "Piwik kommer alltid att vara fri att använda men behöver ditt stöd för att växa och utvecklas.",
"PostUpdateSupport": "Om du behöver hjälp att använda Piwik kan du få stöd från utvecklarna:",
- "EnterpriseSolutions": "Enterpriselösningar",
"CloudHosting": "Molntjänst",
"Updating": "Uppdateringar",
"UpdateUsingHttpsFailed": "Nedladdning ac den senaste versionen av Piwik över HTTPS fungerade inte på grund av följande fel:",
diff --git a/plugins/CoreUpdater/lang/tr.json b/plugins/CoreUpdater/lang/tr.json
index 5db9786d12..1fcd436d79 100644
--- a/plugins/CoreUpdater/lang/tr.json
+++ b/plugins/CoreUpdater/lang/tr.json
@@ -1,11 +1,14 @@
{
"CoreUpdater": {
- "ClickHereToViewSqlQueries": "Çalıştırılacak olan SQL sorgularının listesini görmek ve kopyalamak için tıklayın",
- "DatabaseUpgradeRequired": "Veritabanı güncellemesi gerekiyor",
- "DownloadingUpdateFromX": "Güncelleme %sdan indiriliyor",
- "DownloadX": "İndir %s",
- "EmptyDatabaseError": "Veritabanı %s boş. Yapılandırma dosyanızı değiştirmeniz veya silmeniz gerekmektedir.",
- "ErrorDIYHelp": "Eğer gelişmiş bir kullanıcı iseniz ve veritabanı yükseltmesinde bir hata ile karşılaşırsanız:",
+ "ClickHereToViewSqlQueries": "Yürütülecek SQL sorgularının listesini görmek ve kopyalamak için tıklayın",
+ "CriticalErrorDuringTheUpgradeProcess": "Güncelleme sırasında önemli bir sorun çıktı:",
+ "DatabaseUpgradeRequired": "Veritabanı Güncellemesi Gerekli",
+ "DisablingIncompatiblePlugins": "Uyumsuz uygulama ekleri devre dışı bırakılıyor: %s",
+ "DownloadingUpdateFromX": "Güncelleme %s üzerinden indiriliyor",
+ "DownloadX": "%s İndir",
+ "EmptyDatabaseError": "%s veritabanı boş. Piwik ayar dosyanızı değiştirmeniz ya da silmeniz gerekli.",
+ "ErrorDIYHelp": "İleri düzey bir kullanıcıysanız ve veritabanı güncellemesinde bir sorun ile karşılaşırsanız:",
+ "ErrorDIYHelp_1": "Sorunun kaynağını bulup düzeltin (memory_limit ya da max_execution_time gibi)",
"ErrorDIYHelp_2": "Başarız olan güncellemedeki kalan sorguları çalıştır",
"ErrorDuringPluginsUpdates": "Eklenti güncellenirken hata meydana geldi:",
"ExceptionAlreadyLatestVersion": "Piwik versiyonunuz %s günceldir.",
diff --git a/plugins/CoreUpdater/lang/uk.json b/plugins/CoreUpdater/lang/uk.json
index f54a44fb5d..e0b1b50c05 100644
--- a/plugins/CoreUpdater/lang/uk.json
+++ b/plugins/CoreUpdater/lang/uk.json
@@ -3,6 +3,7 @@
"ClickHereToViewSqlQueries": "Клацніть тут для перегляду та копіювання пеерліку SQL запитів що повинні бути виконані.",
"CriticalErrorDuringTheUpgradeProcess": "Критична помилка протягом процесу поновлення:",
"DatabaseUpgradeRequired": "Необхідно поновити базу даних",
+ "DisablingIncompatiblePlugins": "Відключення несумісних плагінів: %s",
"DownloadingUpdateFromX": "Завантажити поновлення від %s",
"DownloadX": "Завантажити %s",
"EmptyDatabaseError": "База даних %s порожня. Відредагуйте або видаліть файл конфігурації Piwik.",
@@ -17,18 +18,34 @@
"ExceptionArchiveEmpty": "Порожній архів",
"ExceptionArchiveIncompatible": "Несумісний формат архіву: %s",
"ExceptionArchiveIncomplete": "Архів не повний: деякі файли відсутні (напр. %s).",
+ "FeedbackRequest": "Не соромтеся поділитися своїми ідеями і пропозиціями з командою з Piwik тут:",
"HelpMessageContent": "Гляньте на %1$s Piwik FAQ %2$s де є пояснення найтиповіших помилок що виникають протягом поновлення. %3$s Зверніться за допомогою до системного адміністратора, - що може допомогти вирішити помилки пов’язані з сервером або налаштуванням бази даних.",
"HelpMessageIntroductionWhenError": "Вище знаходиться повідомлення про помилку рівня ядра. Це повинно допомогти у виявлення причини, але якщо потрібна подальша допомога, будьласка:",
"HelpMessageIntroductionWhenWarning": "Поновлення завершено успішно, однак були інциденти протягом проходження процесу. Будь-ласка прочитайте опис щоб дізнатися деталі. Для подальшої допомоги:",
+ "HighTrafficPiwikServerEnableMaintenance": "Якщо ви керуєте сервером Piwik з великим обсягом трафіку, ми рекомендуємо %1$sна мить вимкнути Відстеження відвідувачів і перемкнути Інтерфейс Piwik в режим%2$s підтримки.",
+ "IncompatbilePluginsWillBeDisabledInfo": "Примітка: деякі плагіни не сумісні з Piwik %s. Вони будуть відключені при оновленні:",
"InstallingTheLatestVersion": "Встановлення останньої версії",
- "NoteForLargePiwikInstances": "Важливе зауваження для великих інсталяцій Piwik",
+ "LatestBetaRelease": "Останній тестовий випуск",
+ "LatestStableRelease": "Останній стабільний випуск",
+ "Latest2XStableRelease": "Останній стабільний 2.X",
+ "Latest2XBetaRelease": "Останній тестовий 2.X",
+ "LtsSupportVersion": "Версія Довгострокової підтримки",
+ "MajorUpdateWarning1": "Це велике оновлення! Може знадобитися більше часу, ніж зазвичай.",
+ "MajorUpdateWarning2": "Наступна порада особливо важлива для великих оновлень!",
+ "NoteForLargePiwikInstances": "Важліве зауваження для великих інсталяцій Piwik",
"NoteItIsExpectedThatQueriesFail": "Примітка: якщо ці запити виконано вручну, є ймовірність що деякі з них завершаться з помилками. В такому випадку ігноруйте помилки та виконуйте наступний запит з переліку.",
+ "NotificationClickToUpdatePlugins": "Для оновлення плагінів, натисніть сюди:",
+ "NotificationClickToUpdateThemes": "Для поновлення тем натисніть сюди:",
+ "NotificationSubjectAvailableCoreUpdate": "Доступна новая версия Piwik %s",
+ "NotificationSubjectAvailablePluginUpdate": "Доступні оновлення плагінів Piwik",
"PiwikHasBeenSuccessfullyUpgraded": "Piwik успішно поновлено!",
"PiwikUpdatedSuccessfully": "Piwik успішно поновлено!",
"PiwikWillBeUpgradedFromVersionXToVersionY": "База даних Piwik буде поновлена з версії %1$s до нової версії %2$s.",
"ReadyToGo": "Готові розпочати?",
- "TheFollowingPluginsWillBeUpgradedX": "Наступні плагіни буде поновлено: %s.",
- "ThereIsNewVersionAvailableForUpdate": "Є нова версія Piwik доступна до поновлення",
+ "TheFollowingPluginsWillBeUpgradedX": "Наступні плагіни будуть оновлені: %s.",
+ "TheFollowingDimensionsWillBeUpgradedX": "Наступні розміри будуть оновлені: %s.",
+ "ThereIsNewPluginVersionAvailableForUpdate": "Деякі плагіни були оновлені в Маркеті:",
+ "ThereIsNewVersionAvailableForUpdate": "Доступна нова версія Piwik",
"TheUpgradeProcessMayFailExecuteCommand": "Якщо у вас велика база даних Piwik, поновлення можуть забирати надто багато часу для запуску їх з браузера. В такому випадку, ви можете виконати поновлення з командного рядка: %s",
"TheUpgradeProcessMayTakeAWhilePleaseBePatient": "Процес поновлення бази даних може забрати трохи часу, зачекайте будь-ласка.",
"UnpackingTheUpdate": "Розпаковування поновлення",
@@ -36,6 +53,17 @@
"UpdateHasBeenCancelledExplanation": "Поновлення Piwik Одним Клацанням було скасовано. Якщо неможливо виправити повідомлення про помилку вище, рекомендується поновити Piwik вручну. %1$s Гляньте %2$sДокументацію про поновлення%3$s щоб розпочати!",
"UpdateTitle": "Piwik › Поновлення",
"UpdateSuccessTitle": "Piwik успішно поновлено!",
+ "UpdateErrorTitle": "Помилка при оновленні",
+ "ThankYouUpdatePiwik": "Спасибі за те, що користуєтеся Piwik і оновлюєте його!",
+ "PostUpdateMessage": "Piwik завжди буде вільним для скачування і використання, але йому потрібна постійна підтримка щоб рости і поліпшуватися.",
+ "PostUpdateSupport": "Якщо вам потрібна допомога у використанні Piwik, то ви зможете отримати підтримку від його творців:",
+ "CloudHosting": "Хмарний хостинг",
+ "Updating": "Оновлення",
+ "UpdateUsingHttpsFailed": "Не вдалося завантажити останню версію Piwik з безпечного HTTPS, виникла наступна помилка:",
+ "UpdateUsingHttpsFailedHelp": "Чому це не вдалося? Завантаження останньої версії Piwik (через безпечне HTTPS з'єднання) може потерпіти невдачу з різних причин, наприклад, через помилку з'єднання, повільній швидкості з'єднання або неправильного налаштування системи. Зверніть увагу, що це також може означати, що ваш сервер піддається атаці MITM, і хтось намагається замінити оновлення на шкідливу версію Piwik.",
+ "UpdateUsingHttpsFailedHelpWhatToDo": "Рекомендується потворити завантаження, використовуючи безпечне з'єднання HTTPS, так як воно запобігає атаки MITM.",
+ "UsingHttps": "використовується захищене HTTPS-соединение (рекомендується)",
+ "UsingHttp": "використовується незахищене HTTP-з'єднання",
"UpgradeComplete": "Поновлення завершено!",
"UpgradePiwik": "Поновити Piwik",
"VerifyingUnpackedFiles": "Перевірка розпакованих файлів",
@@ -44,6 +72,7 @@
"YouCanUpgradeAutomaticallyOrDownloadPackage": "Можна поновити до версії %s автоматично або завантажити пакунок та встановити в ручну:",
"YouCouldManuallyExecuteSqlQueries": "Якщо немає можливості використовувати поновлювач з командного рядка або якщо не вдається здійснити поновлення Piwik (через розрив підєднання до бази даних, тайм-аут веб-оглядача чи з іншої причини) є можливість виконати SQL запити в ручну для поновлення бази даних до останньої версії.",
"YouMustDownloadPackageOrFixPermissions": "Неможливо перезаписати поточну інсталяцію. Виправте права доступу на директорії\/файли, або завантажте архів та встановіть %s версію вручну:",
- "YourDatabaseIsOutOfDate": "База даних Piwik застаріла, і повинна бути поновлена перед наступним кроком."
+ "YourDatabaseIsOutOfDate": "База даних Piwik застаріла, і повинна бути поновлена перед наступним кроком.",
+ "ViewVersionChangelog": "Перегляд змін для цієї версії:"
}
} \ No newline at end of file
diff --git a/plugins/CoreUpdater/lang/zh-cn.json b/plugins/CoreUpdater/lang/zh-cn.json
index dfc4f5b57f..01f231928c 100644
--- a/plugins/CoreUpdater/lang/zh-cn.json
+++ b/plugins/CoreUpdater/lang/zh-cn.json
@@ -57,7 +57,6 @@
"ThankYouUpdatePiwik": "感谢您使用Piwik并保持及时更新!",
"PostUpdateMessage": "Piwik将永远是免费下载和使用,但它需要你们继续支持增长和提高。",
"PostUpdateSupport": "如果你需要使用Piwik帮助,您可以从它的创造者那里获取支持:",
- "EnterpriseSolutions": "企业解决方案",
"CloudHosting": "云主机",
"Updating": "更新中",
"UpdateUsingHttpsFailed": "下载最新版本的Piwik通过安全的HTTPS连接没有成功,因为以下错误:",
diff --git a/plugins/CoreUpdater/lang/zh-tw.json b/plugins/CoreUpdater/lang/zh-tw.json
index 82de574c81..e866d7f3ff 100644
--- a/plugins/CoreUpdater/lang/zh-tw.json
+++ b/plugins/CoreUpdater/lang/zh-tw.json
@@ -52,7 +52,6 @@
"ThankYouUpdatePiwik": "感謝您使用Piwik並保持更新!",
"PostUpdateMessage": "Piwik將永遠是免費下載並使用,但它需要你們繼續的支持成長及茁壯。",
"PostUpdateSupport": "如果你需要幫助使用Piwik,你可以從作者那邊獲得支持:",
- "EnterpriseSolutions": "企業解決方案",
"CloudHosting": "雲端代管",
"Updating": "更新中",
"UpdateUsingHttpsFailed": "在安全的HTTPS連線中下載最新的Piwik版本並沒有成功,因為下面的錯誤:",
diff --git a/plugins/CoreUpdater/templates/updateSuccess.twig b/plugins/CoreUpdater/templates/updateSuccess.twig
index 3c930e0f42..a075e35730 100644
--- a/plugins/CoreUpdater/templates/updateSuccess.twig
+++ b/plugins/CoreUpdater/templates/updateSuccess.twig
@@ -24,10 +24,10 @@
<div class="row">
<div class="col s5 offset-s1">
- <a href="https://piwik.pro/enterprise?pk_medium=App_Enterprise_button&pk_source=Piwik_App&pk_campaign=App_Updated" class="btn btn-block">{{ 'CoreUpdater_EnterpriseSolutions'|translate }}</a>
+ <a href="https://piwik.org/support/?pk_medium=Update_Success_button&pk_source=Piwik_App&pk_campaign=App_Updated" class="btn btn-block">{{ 'CoreUpdater_ProfessionalServices'|translate }}</a>
</div>
<div class="col s5">
- <a href="https://piwik.pro/cloud?pk_medium=App_Cloud_button&pk_source=Piwik_App&pk_campaign=App_Updated" class="btn btn-block">{{ 'CoreUpdater_CloudHosting'|translate }}</a>
+ <a href="https://piwik.org/hosting/?pk_medium=App_Cloud_button&pk_source=Piwik_App&pk_campaign=App_Updated" class="btn btn-block">{{ 'CoreUpdater_CloudHosting'|translate }}</a>
</div>
</div>
diff --git a/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php b/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php
index 4065fd10f7..ef6ad37ea8 100644
--- a/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php
+++ b/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php
@@ -26,7 +26,6 @@ class AllColumns extends HtmlTable
public function beforeRender()
{
$this->config->show_extra_columns = true;
- $this->config->datatable_css_class = 'dataTableVizAllColumns';
$this->config->show_exclude_low_population = true;
parent::beforeRender();
@@ -34,6 +33,8 @@ class AllColumns extends HtmlTable
public function beforeGenericFiltersAreAppliedToLoadedDataTable()
{
+ $this->config->datatable_css_class = 'dataTableVizAllColumns';
+
$this->dataTable->filter('AddColumnsProcessedMetrics');
$properties = $this->config;
@@ -67,7 +68,8 @@ class AllColumns extends HtmlTable
public function beforeLoadDataTable()
{
- $this->requestConfig->request_parameters_to_modify['pivotBy'] = null; // always unset pivotBy
+ unset($this->requestConfig->request_parameters_to_modify['pivotBy']);
+ unset($this->requestConfig->request_parameters_to_modify['pivotByColumn']);
}
protected function isPivoted()
diff --git a/plugins/CoreVisualizations/Visualizations/JqplotGraph/Bar.php b/plugins/CoreVisualizations/Visualizations/JqplotGraph/Bar.php
index 94cfa60050..a31a88d190 100644
--- a/plugins/CoreVisualizations/Visualizations/JqplotGraph/Bar.php
+++ b/plugins/CoreVisualizations/Visualizations/JqplotGraph/Bar.php
@@ -20,10 +20,10 @@ class Bar extends JqplotGraph
const ID = 'graphVerticalBar';
const FOOTER_ICON = 'icon-chart-bar';
const FOOTER_ICON_TITLE = 'General_VBarGraph';
-
- public function beforeRender()
+
+ public function beforeLoadDataTable()
{
- parent::beforeRender();
+ parent::beforeLoadDataTable();
$this->config->datatable_js_type = 'JqplotBarGraphDataTable';
}
diff --git a/plugins/CoreVisualizations/javascripts/jqplot.js b/plugins/CoreVisualizations/javascripts/jqplot.js
index 5f51e7e341..e840a71537 100644
--- a/plugins/CoreVisualizations/javascripts/jqplot.js
+++ b/plugins/CoreVisualizations/javascripts/jqplot.js
@@ -282,7 +282,7 @@
* creating span elements with ticks and adding their width.
* Rendered ticks have to be visible to get their real width. But it
* is too fast for user to notice it. If total ticks width is bigger
- * than container width then half of ticks is beeing cut out and their
+ * than container width then half of ticks is being cut out and their
* width is tested again. Until their total width is smaller than chart
* div. There is a failsafe so check will be performed no more than 20
* times, which is I think more than enough. Each tick have its own
diff --git a/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig b/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig
index 1fbbf6517f..a85ee66852 100644
--- a/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig
+++ b/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig
@@ -20,6 +20,7 @@
{% else %}
{%- for rowId, row in dataTable.getRows() -%}
{%- set rowHasSubtable = not subtablesAreDisabled and row.getIdSubDataTable() and properties.subtable_controller_action is not null -%}
+ {%- set rowSubtableId = row.getMetadata('idsubdatatable_in_db')|default(row.getIdSubDataTable()) -%}
{%- set isSummaryRow = rowId == constant('Piwik\\DataTable::ID_SUMMARY_ROW') -%}
{%- set shouldHighlightRow = isSummaryRow and properties.highlight_summary_row -%}
@@ -30,9 +31,10 @@
or not properties.replace_row_with_subtable|default(false) -%}
{% if showRow %}
- <tr {% if rowHasSubtable %}id="{{ row.getIdSubDataTable() }}"{% endif %}
+ <tr {% if rowHasSubtable %}id="{{ rowSubtableId }}"{% endif %}
{% if row.getMetadata('segment') is not false %} data-segment-filter="{{ row.getMetadata('segment')|e('html_attr') }}"{% endif %}
{% if row.getMetadata('url') is not false %} data-url-label="{{ row.getMetadata('url')|rawSafeDecoded }}"{% endif %}
+ data-row-metadata="{{ row.getMetadata|json_encode|e('html_attr') }}"
class="{{ row.getMetadata('css_class') }} {% if rowHasSubtable %}subDataTable{% endif %}{% if shouldHighlightRow %} highlight{% endif %}{% if isSummaryRow %} summaryRow{% endif %}"
{% if rowHasSubtable %}title="{{ 'CoreHome_ClickRowToExpandOrContract'|translate }}"{% endif %}>
{% for column in properties.columns_to_display %}
@@ -45,7 +47,7 @@
{# display subtable if present and showing expanded datatable #}
{% if properties.show_expanded|default(false) and rowHasSubtable %}
- {% include "@CoreVisualizations/_dataTableViz_htmlTable.twig" with {'dataTable': row.getSubtable(), 'idSubtable': row.getIdSubDataTable()} %}
+ {% include "@CoreVisualizations/_dataTableViz_htmlTable.twig" with {'dataTable': row.getSubtable(), 'idSubtable': rowSubtableId} %}
{% endif %}
{%- endfor -%}
{% endif %}
diff --git a/plugins/CustomPiwikJs/.gitignore b/plugins/CustomPiwikJs/.gitignore
new file mode 100644
index 0000000000..c8c9480010
--- /dev/null
+++ b/plugins/CustomPiwikJs/.gitignore
@@ -0,0 +1 @@
+tests/System/processed/*xml \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/Commands/UpdateTracker.php b/plugins/CustomPiwikJs/Commands/UpdateTracker.php
new file mode 100644
index 0000000000..70754bc20f
--- /dev/null
+++ b/plugins/CustomPiwikJs/Commands/UpdateTracker.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs\Commands;
+
+use Piwik\Plugin\ConsoleCommand;
+use Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
+use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class UpdateTracker extends ConsoleCommand
+{
+ protected function configure()
+ {
+ $this->setName('custom-piwik-js:update');
+ $this->addOption('source-file', null, InputOption::VALUE_REQUIRED, 'Absolute path to source PiwikJS file.', $this->getPathOriginalPiwikJs());
+ $this->addOption('target-file', null, InputOption::VALUE_REQUIRED, 'Absolute path to target file. Useful if your /piwik.js is not writable and you want to replace the file manually', PIWIK_DOCUMENT_ROOT . TrackerUpdater::TARGET_PIWIK_JS);
+ $this->addOption('ignore-minified', null, InputOption::VALUE_NONE, 'Ignore minified tracker files, useful during development so the original source file can be debugged');
+ $this->setDescription('Update the Javascript Tracker with plugin tracker additions');
+ }
+
+ private function getPathOriginalPiwikJs()
+ {
+ return PIWIK_DOCUMENT_ROOT . TrackerUpdater::ORIGINAL_PIWIK_JS;
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $sourceFile = $input->getOption('source-file');
+ $targetFile = $input->getOption('target-file');
+ $ignoreMinified = $input->hasOption('ignore-minified');
+
+ $this->updateTracker($sourceFile, $targetFile, $ignoreMinified);
+
+ $output->writeln('<info>The Javascript Tracker has been updated</info>');
+ }
+
+ public function updateTracker($sourceFile, $targetFile, $ignoreMinified)
+ {
+ $pluginTrackerFiles = new PluginTrackerFiles();
+
+ if ($ignoreMinified) {
+ if (empty($sourceFile) || $sourceFile === $this->getPathOriginalPiwikJs()) {
+ // no custom source file was requested
+ $sourceFile = PIWIK_DOCUMENT_ROOT . TrackerUpdater::DEVELOPMENT_PIWIK_JS;
+ }
+ $pluginTrackerFiles->ignoreMinified();
+ }
+
+ $updater = new TrackerUpdater($sourceFile, $targetFile);
+ $updater->setTrackerFiles($pluginTrackerFiles);
+ $updater->checkWillSucceed();
+ $updater->update();
+ }
+}
diff --git a/plugins/CustomPiwikJs/CustomPiwikJs.php b/plugins/CustomPiwikJs/CustomPiwikJs.php
new file mode 100644
index 0000000000..4089f8cba8
--- /dev/null
+++ b/plugins/CustomPiwikJs/CustomPiwikJs.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs;
+
+use Piwik\Log;
+use Piwik\Plugin;
+
+class CustomPiwikJs extends Plugin
+{
+ public function getListHooksRegistered()
+ {
+ return array(
+ 'CoreUpdater.update.end' => 'updateTracker',
+ 'PluginManager.pluginDeactivated' => 'updateTracker',
+ 'PluginManager.pluginActivated' => 'updateTracker',
+ 'CronArchive.end' => 'updateTracker',
+ );
+ }
+
+ public function updateTracker()
+ {
+ try {
+ $trackerUpdater = new TrackerUpdater();
+ $trackerUpdater->update();
+ } catch (\Exception $e) {
+ Log::error('There was an error while updating the javascript tracker: ' . $e->getMessage());
+ }
+ }
+}
diff --git a/plugins/CustomPiwikJs/Diagnostic/PiwikJsCheck.php b/plugins/CustomPiwikJs/Diagnostic/PiwikJsCheck.php
new file mode 100644
index 0000000000..3766dc650b
--- /dev/null
+++ b/plugins/CustomPiwikJs/Diagnostic/PiwikJsCheck.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Plugins\CustomPiwikJs\Diagnostic;
+
+use Piwik\Filechecks;
+use Piwik\Filesystem;
+use Piwik\Plugins\CustomPiwikJs\File;
+use Piwik\Plugins\Diagnostics\Diagnostic\Diagnostic;
+use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResult;
+use Piwik\SettingsServer;
+use Piwik\Translation\Translator;
+
+/**
+ * Check Piwik JS is writable
+ */
+class PiwikJsCheck implements Diagnostic
+{
+ /**
+ * @var Translator
+ */
+ private $translator;
+
+ public function __construct(Translator $translator)
+ {
+ $this->translator = $translator;
+ }
+
+ public function execute()
+ {
+ $label = $this->translator->translate('CustomPiwikJs_DiagnosticPiwikJsWritable');
+
+ $file = new File(PIWIK_DOCUMENT_ROOT . '/piwik.js');
+
+ if ($file->hasWriteAccess()) {
+ return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK, ''));
+ }
+
+ $comment = $this->translator->translate('CustomPiwikJs_DiagnosticPiwikJsNotWritable');
+
+ if(!SettingsServer::isWindows()) {
+ $realpath = Filesystem::realpath(PIWIK_INCLUDE_PATH . '/piwik.js');
+ $command = "<br/><code> chmod +w $realpath<br/> chown ". Filechecks::getUserAndGroup() ." " . $realpath . "</code><br />";
+ $comment .= $this->translator->translate('CustomPiwikJs_DiagnosticPiwikJsMakeWritable', $command);
+ }
+
+ return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
+ }
+
+}
diff --git a/plugins/CustomPiwikJs/Exception/AccessDeniedException.php b/plugins/CustomPiwikJs/Exception/AccessDeniedException.php
new file mode 100644
index 0000000000..356e63e7be
--- /dev/null
+++ b/plugins/CustomPiwikJs/Exception/AccessDeniedException.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs\Exception;
+
+use Exception;
+
+class AccessDeniedException extends Exception
+{
+}
diff --git a/plugins/CustomPiwikJs/File.php b/plugins/CustomPiwikJs/File.php
new file mode 100644
index 0000000000..79a93e7437
--- /dev/null
+++ b/plugins/CustomPiwikJs/File.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs;
+
+use Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException;
+
+class File
+{
+ /**
+ * @var string
+ */
+ private $file;
+
+ public function __construct($file)
+ {
+ $this->file = $file;
+ }
+
+ public function checkReadable()
+ {
+ if (!$this->hasReadAccess()) {
+ throw new AccessDeniedException(sprintf('The file %s is not readable', $this->file));
+ }
+ }
+
+ public function checkWritable()
+ {
+ if (!$this->hasWriteAccess()) {
+ throw new AccessDeniedException(sprintf('The file %s is not writable', $this->file));
+ }
+ }
+
+ public function save($content)
+ {
+ file_put_contents($this->file, $content);
+ }
+
+ public function getContent()
+ {
+ if (!$this->hasReadAccess()) {
+ return null;
+ }
+
+ return file_get_contents($this->file);
+ }
+
+ public function getName()
+ {
+ return basename($this->file);
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasWriteAccess()
+ {
+ return $this->hasReadAccess() && is_writable($this->file);
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasReadAccess()
+ {
+ return file_exists($this->file) && is_readable($this->file);
+ }
+
+
+}
diff --git a/plugins/CustomPiwikJs/Tasks.php b/plugins/CustomPiwikJs/Tasks.php
new file mode 100644
index 0000000000..1bb1bae384
--- /dev/null
+++ b/plugins/CustomPiwikJs/Tasks.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs;
+
+class Tasks extends \Piwik\Plugin\Tasks
+{
+ public function schedule()
+ {
+ $this->hourly('updateTracker');
+ }
+
+ public function updateTracker()
+ {
+ $updater = new TrackerUpdater();
+ $updater->update();
+ }
+}
diff --git a/plugins/CustomPiwikJs/TrackerUpdater.php b/plugins/CustomPiwikJs/TrackerUpdater.php
new file mode 100644
index 0000000000..6370287882
--- /dev/null
+++ b/plugins/CustomPiwikJs/TrackerUpdater.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs;
+
+use Piwik\Plugins\CustomPiwikJs\TrackingCode\PiwikJsManipulator;
+use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
+
+/**
+ * Updates the Javascript file containing the Tracker.
+ */
+class TrackerUpdater
+{
+ const DEVELOPMENT_PIWIK_JS = '/js/piwik.js';
+ const ORIGINAL_PIWIK_JS = '/js/piwik.min.js';
+ const TARGET_PIWIK_JS = '/piwik.js';
+
+ /**
+ * @var File
+ */
+ private $fromFile;
+
+ /**
+ * @var File
+ */
+ private $toFile;
+
+ private $trackerFiles = array();
+
+ /**
+ * @param string|null $fromFile If null then the minified JS tracker file in /js fill be used
+ * @param string|null $toFile If null then the minified JS tracker will be updated.
+ */
+ public function __construct($fromFile = null, $toFile = null)
+ {
+ if (!isset($fromFile)) {
+ $fromFile = PIWIK_DOCUMENT_ROOT . self::ORIGINAL_PIWIK_JS;
+ }
+
+ if (!isset($toFile)) {
+ $toFile = PIWIK_DOCUMENT_ROOT . self::TARGET_PIWIK_JS;
+ }
+
+ $this->fromFile = new File($fromFile);
+ $this->toFile = new File($toFile);
+ $this->trackerFiles = new PluginTrackerFiles();
+ }
+
+ public function setTrackerFiles(PluginTrackerFiles $trackerFiles)
+ {
+ $this->trackerFiles = $trackerFiles;
+ }
+
+ public function checkWillSucceed()
+ {
+ $this->fromFile->checkReadable();
+ $this->toFile->checkWritable();
+ }
+
+ public function update()
+ {
+ if (!$this->toFile->hasWriteAccess() || !$this->fromFile->hasReadAccess()) {
+ return;
+ }
+
+ $trackingCode = new PiwikJsManipulator($this->fromFile->getContent(), $this->trackerFiles);
+ $newContent = $trackingCode->manipulateContent();
+
+ if ($newContent !== $this->toFile->getContent()) {
+ $this->toFile->save($newContent);
+ }
+ }
+}
diff --git a/plugins/CustomPiwikJs/TrackingCode/JsTestPluginTrackerFiles.php b/plugins/CustomPiwikJs/TrackingCode/JsTestPluginTrackerFiles.php
new file mode 100644
index 0000000000..773ac03286
--- /dev/null
+++ b/plugins/CustomPiwikJs/TrackingCode/JsTestPluginTrackerFiles.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Plugins\CustomPiwikJs\TrackingCode;
+
+/**
+ * Used for when running Piwik tracker tests. We simply include all custom tracker files there.
+ */
+class JsTestPluginTrackerFiles extends PluginTrackerFiles
+{
+
+ public function __construct()
+ {
+ parent::__construct();
+ $this->ignoreMinified = true;
+ }
+
+ protected function isPluginActivated($pluginName)
+ {
+ return true;
+ }
+
+}
diff --git a/plugins/CustomPiwikJs/TrackingCode/PiwikJsManipulator.php b/plugins/CustomPiwikJs/TrackingCode/PiwikJsManipulator.php
new file mode 100644
index 0000000000..affac1fd46
--- /dev/null
+++ b/plugins/CustomPiwikJs/TrackingCode/PiwikJsManipulator.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs\TrackingCode;
+
+class PiwikJsManipulator
+{
+ const HOOK = '/*!!! pluginTrackerHook */';
+ /**
+ * @var string
+ */
+ private $content;
+
+ /** @var PluginTrackerFiles */
+ private $pluginTrackerFiles;
+
+ public function __construct($content, PluginTrackerFiles $pluginTrackerFiles)
+ {
+ $this->content = $content;
+ $this->pluginTrackerFiles = $pluginTrackerFiles;
+ }
+
+ public function manipulateContent()
+ {
+ $files = $this->pluginTrackerFiles->find();
+
+ foreach ($files as $file) {
+ $trackerExtension = $this->getSignatureWithContent($file->getName(), $file->getContent());
+
+ // for some reasons it is /*!!! in piwik.js minified and /*!! in js/piwik.js unminified
+ $this->content = str_replace(array(self::HOOK, '/*!! pluginTrackerHook */'), self::HOOK . $trackerExtension, $this->content);
+ }
+
+ return $this->content;
+ }
+
+ /**
+ * @param string $name
+ * @param string $content
+ * @return string
+ */
+ private function getSignatureWithContent($name, $content)
+ {
+ return sprintf(
+ "\n\n/* GENERATED: %s */\n%s\n/* END GENERATED: %s */\n",
+ $name,
+ $content,
+ $name
+ );
+ }
+
+}
diff --git a/plugins/CustomPiwikJs/TrackingCode/PluginTrackerFiles.php b/plugins/CustomPiwikJs/TrackingCode/PluginTrackerFiles.php
new file mode 100644
index 0000000000..f114565990
--- /dev/null
+++ b/plugins/CustomPiwikJs/TrackingCode/PluginTrackerFiles.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Plugins\CustomPiwikJs\TrackingCode;
+
+use Piwik\Filesystem;
+use Piwik\Plugin;
+use Piwik\Plugins\CustomPiwikJs\File;
+
+class PluginTrackerFiles
+{
+ const TRACKER_FILE = 'tracker.js';
+ const MIN_TRACKER_FILE = 'tracker.min.js';
+
+ /**
+ * @var string
+ */
+ protected $dir;
+
+ /**
+ * @var Plugin\Manager
+ */
+ private $pluginManager;
+
+ /**
+ * @var bool
+ */
+ protected $ignoreMinified = false;
+
+ public function __construct()
+ {
+ $this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/';
+ $this->pluginManager = Plugin\Manager::getInstance();
+ }
+
+ public function ignoreMinified()
+ {
+ $this->ignoreMinified = true;
+ }
+
+ /**
+ * @return File[]
+ */
+ public function find()
+ {
+ $jsFiles = array();
+
+ if (!$this->ignoreMinified) {
+ $trackerFiles = \_glob($this->dir . '*/' . self::MIN_TRACKER_FILE);
+
+ foreach ($trackerFiles as $trackerFile) {
+ $plugin = $this->getPluginNameFromFile($trackerFile);
+ if ($this->isPluginActivated($plugin)) {
+ $jsFiles[$plugin] = new File($trackerFile);
+ }
+ }
+ }
+
+ $trackerFiles = \_glob($this->dir . '*/' . self::TRACKER_FILE);
+
+ foreach ($trackerFiles as $trackerFile) {
+ $plugin = $this->getPluginNameFromFile($trackerFile);
+ if (!isset($jsFiles[$plugin])) {
+ if ($this->isPluginActivated($plugin)) {
+ $jsFiles[$plugin] = new File($trackerFile);
+ }
+ }
+ }
+
+ return $jsFiles;
+ }
+
+ protected function isPluginActivated($pluginName)
+ {
+ return $this->pluginManager->isPluginActivated($pluginName);
+ }
+
+ protected function getPluginNameFromFile($file)
+ {
+ $file = str_replace(array($this->dir, self::TRACKER_FILE, self::MIN_TRACKER_FILE), '', $file);
+ return trim($file, '/');
+ }
+}
diff --git a/plugins/CustomPiwikJs/config/config.php b/plugins/CustomPiwikJs/config/config.php
new file mode 100644
index 0000000000..cafd3336ac
--- /dev/null
+++ b/plugins/CustomPiwikJs/config/config.php
@@ -0,0 +1,7 @@
+<?php
+
+return array(
+ 'diagnostics.optional' => DI\add(array(
+ DI\get('Piwik\Plugins\CustomPiwikJs\Diagnostic\PiwikJsCheck'),
+ )),
+);
diff --git a/plugins/CustomPiwikJs/lang/en.json b/plugins/CustomPiwikJs/lang/en.json
new file mode 100644
index 0000000000..57dbea22a6
--- /dev/null
+++ b/plugins/CustomPiwikJs/lang/en.json
@@ -0,0 +1,7 @@
+{
+ "CustomPiwikJs": {
+ "DiagnosticPiwikJsWritable": "Writable JavaScript Tracker (\"/piwik.js\")",
+ "DiagnosticPiwikJsNotWritable": "The Piwik JavaScript tracker file \"/piwik.js\" is not writable which means other plugins cannot extend the JavaScript tracker. In the future even some core features might not work as expected. ",
+ "DiagnosticPiwikJsMakeWritable": "We recommend to Piwik.js writable by running this command: %s"
+ }
+} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php b/plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php
new file mode 100644
index 0000000000..2503353ec0
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs\tests\Framework\Mock;
+
+use Piwik\Plugins\CustomPiwikJs\File;
+use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
+
+class PluginTrackerFilesMock extends PluginTrackerFiles
+{
+ /**
+ * @var array
+ */
+ private $files;
+
+ public function __construct($files)
+ {
+ $this->files = $files;
+ }
+
+ public function find()
+ {
+ $files = array();
+ foreach ($this->files as $file) {
+ $files[] = new File(PIWIK_DOCUMENT_ROOT . $file);
+ }
+ return $files;
+ }
+
+
+}
diff --git a/plugins/CustomPiwikJs/tests/Integration/FileTest.php b/plugins/CustomPiwikJs/tests/Integration/FileTest.php
new file mode 100644
index 0000000000..4d96bd6478
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/Integration/FileTest.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs\tests\Integration;
+
+use Piwik\Plugins\CustomPiwikJs\File;
+use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
+
+/**
+ * @group CustomPiwikJs
+ * @group FileTest
+ * @group File
+ * @group Plugins
+ */
+class FileTest extends IntegrationTestCase
+{
+ const NOT_EXISTING_FILE = 'notExisTinGFile.js';
+
+ /**
+ * @var string
+ */
+ private $dir = '';
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/CustomPiwikJs/tests/resources/';
+ }
+
+ public function tearDown()
+ {
+ if (file_exists($this->dir . self::NOT_EXISTING_FILE)) {
+ unlink($this->dir . self::NOT_EXISTING_FILE);
+ }
+
+ parent::tearDown();
+ }
+
+ private function makeFile($fileName = 'test.js')
+ {
+ return new File($this->dir . $fileName);
+ }
+
+ private function makeNotReadableFile()
+ {
+ return $this->makeFile(self::NOT_EXISTING_FILE);
+ }
+
+ public function test_getName()
+ {
+ $this->assertSame('test.js', $this->makeFile()->getName());
+ $this->assertSame('notExisTinGFile.js', $this->makeNotReadableFile()->getName());
+ }
+
+ public function test_hasReadAccess()
+ {
+ $this->assertTrue($this->makeFile()->hasReadAccess());
+ $this->assertFalse($this->makeNotReadableFile()->hasReadAccess());
+ }
+
+ public function test_hasWriteAccess()
+ {
+ $this->assertTrue($this->makeFile()->hasWriteAccess());
+ $this->assertFalse($this->makeNotReadableFile()->hasWriteAccess());
+ }
+
+ public function test_checkReadable_shouldNotThrowException_IfIsReadable()
+ {
+ $this->makeFile()->checkReadable();
+ $this->assertTrue(true);
+ }
+
+ public function test_checkWritable_shouldNotThrowException_IfIsWritable()
+ {
+ $this->makeFile()->checkWritable();
+ $this->assertTrue(true);
+ }
+
+ /**
+ * @expectedException \Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException
+ * @expectedExceptionMessage not readable
+ */
+ public function test_checkReadable_shouldThrowException_IfNotIsReadable()
+ {
+ $this->makeNotReadableFile()->checkReadable();
+ }
+
+ /**
+ * @expectedException \Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException
+ * @expectedExceptionMessage not writable
+ */
+ public function test_checkWritable_shouldThrowException_IfNotIsWritable()
+ {
+ $this->makeNotReadableFile()->checkWritable();
+ }
+
+ public function test_getContent()
+ {
+ $this->assertSame("// Hello world\nvar fooBar = 'test';", $this->makeFile()->getContent());
+ }
+
+ public function test_getContent_returnsNull_IfFileIsNotReadableOrNotExists()
+ {
+ $this->assertNull($this->makeNotReadableFile()->getContent());
+ }
+
+ public function test_save()
+ {
+ $notExistingFile = $this->makeNotReadableFile();
+ $this->assertFalse($notExistingFile->hasReadAccess());
+ $this->assertFalse($notExistingFile->hasWriteAccess());
+
+ $notExistingFile->save('myTestContent');
+
+ $this->assertEquals('myTestContent', $notExistingFile->getContent());
+ $this->assertTrue($notExistingFile->hasReadAccess());
+ $this->assertTrue($notExistingFile->hasWriteAccess());
+ }
+
+}
diff --git a/plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php b/plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php
new file mode 100644
index 0000000000..75c66b73f7
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs\tests\Integration;
+
+use Piwik\Plugins\CustomPiwikJs\tests\Framework\Mock\PluginTrackerFilesMock;
+use Piwik\Plugins\CustomPiwikJs\TrackingCode\PiwikJsManipulator;
+use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
+
+/**
+ * @group CustomPiwikJs
+ * @group PiwikJsManipulatorTest
+ * @group PiwikJsManipulator
+ * @group Plugins
+ */
+class PiwikJsManipulatorTest extends IntegrationTestCase
+{
+ private $content = 'var Piwik.js = "mytest";
+/*!!! pluginTrackerHook */
+
+var myArray = [];
+';
+
+ public function test_manipulateContent_shouldAddCodeOfTrackerPlugins()
+ {
+ $manipulator = $this->makeManipulator(array(
+ '/plugins/CustomPiwikJs/tests/resources/tracker.js',
+ '/plugins/CustomPiwikJs/tests/resources/tracker.min.js',
+ ));
+
+ $updatedContent = $manipulator->manipulateContent();
+
+ $this->assertSame('var Piwik.js = "mytest";
+/*!!! pluginTrackerHook */
+
+/* GENERATED: tracker.min.js */
+/* my license header */
+var mySecondCustomTracker = \'test\';
+/* END GENERATED: tracker.min.js */
+
+
+/* GENERATED: tracker.js */
+/** my license header*/
+var myCustomTracker = \'test\';
+
+var fooBar = \'baz\';
+/* END GENERATED: tracker.js */
+
+
+var myArray = [];
+', $updatedContent);
+ }
+
+ public function test_manipulateContent_shouldNotAddCodeOfTrackerPlugins_IfThereAreNoTrackerFiles()
+ {
+ $manipulator = $this->makeManipulator(array());
+
+ $updatedContent = $manipulator->manipulateContent();
+
+ $this->assertSame($this->content, $updatedContent);
+ }
+
+ private function makeManipulator($files)
+ {
+ return new PiwikJsManipulator($this->content, new PluginTrackerFilesMock($files));
+ }
+
+}
diff --git a/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php b/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php
new file mode 100644
index 0000000000..8c0cd2ee01
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs\tests\Integration;
+
+use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
+use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
+
+class CustomPluginTrackerFiles extends PluginTrackerFiles {
+
+ private $pluginNamesForFile = array();
+
+ public function __construct($pluginNameForRegularTrackerFile = 'CustomPiwikJs', $pluginNameForMinifiedTracker = 'CustomPiwikJs')
+ {
+ parent::__construct();
+
+ $this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/CustomPiwikJs/tests/';
+
+ $this->pluginNamesForFile = array(
+ 'tracker.js' => $pluginNameForRegularTrackerFile,
+ 'tracker.min.js' => $pluginNameForMinifiedTracker
+ );
+ }
+
+ protected function getPluginNameFromFile($file)
+ {
+ $fileName = basename($file);
+ return $this->pluginNamesForFile[$fileName];
+ }
+}
+
+class CustomPluginTrackerFiles2 extends PluginTrackerFiles {
+
+ public function getPluginNameFromFile($file)
+ {
+ return parent::getPluginNameFromFile($file);
+ }
+}
+
+/**
+ * @group CustomPiwikJs
+ * @group PluginTrackerFilesTest
+ * @group PluginTrackerFiles
+ * @group Plugins
+ */
+class PluginTrackerFilesTest extends IntegrationTestCase
+{
+ public function test_find_ifAPluginDefinesAMinifiedAndARegularTrackerItShouldPreferTheMinifiedVersion()
+ {
+ $trackerFiles = new CustomPluginTrackerFiles();
+ $foundFiles = $trackerFiles->find();
+
+ $this->assertCount(1, $foundFiles);
+ $this->assertTrue(isset($foundFiles['CustomPiwikJs']));
+ $this->assertEquals('tracker.min.js', $foundFiles['CustomPiwikJs']->getName());
+ }
+
+ public function test_find_shouldIgnoreMinifiedVersion_IfRequested()
+ {
+ $trackerFiles = new CustomPluginTrackerFiles();
+ $trackerFiles->ignoreMinified();
+ $foundFiles = $trackerFiles->find();
+
+ $this->assertCount(1, $foundFiles);
+ $this->assertTrue(isset($foundFiles['CustomPiwikJs']));
+ $this->assertEquals('tracker.js', $foundFiles['CustomPiwikJs']->getName());
+ }
+
+ public function test_find_ifMultiplePluginsImplementATracker_ShouldReturnEachOfThem()
+ {
+ $trackerFiles = new CustomPluginTrackerFiles('CustomPiwikJs', 'Goals');
+ $foundFiles = $trackerFiles->find();
+
+ $this->assertCount(2, $foundFiles);
+ $this->assertTrue(isset($foundFiles['CustomPiwikJs']));
+ $this->assertTrue(isset($foundFiles['Goals']));
+ $this->assertEquals('tracker.js', $foundFiles['CustomPiwikJs']->getName());
+ $this->assertEquals('tracker.min.js', $foundFiles['Goals']->getName());
+ }
+
+ public function test_find_shouldNotReturnATrackerFile_IfPluginIsNotActivatedOrLoaded()
+ {
+ $trackerFiles = new CustomPluginTrackerFiles('MyNotExistingPlugin', 'Goals');
+ $foundFiles = $trackerFiles->find();
+
+ $this->assertCount(1, $foundFiles);
+ $this->assertTrue(isset($foundFiles['Goals']));
+ $this->assertEquals('tracker.min.js', $foundFiles['Goals']->getName());
+
+ $trackerFiles = new CustomPluginTrackerFiles('Goals', 'MyNotExistingPlugin');
+ $foundFiles = $trackerFiles->find();
+
+ $this->assertCount(1, $foundFiles);
+ $this->assertTrue(isset($foundFiles['Goals']));
+ $this->assertEquals('tracker.js', $foundFiles['Goals']->getName());
+ }
+
+ public function test_find_shouldNotReturnFileIfNoPluginActivated()
+ {
+ $trackerFiles = new CustomPluginTrackerFiles('MyNotExistingPlugin', 'MyNotExistingPlugin2');
+ $foundFiles = $trackerFiles->find();
+
+ $this->assertSame(array(), $foundFiles);
+ }
+
+ public function test_getPluginNameFromFile_shouldDetectPluginName()
+ {
+ $trackerFiles = new CustomPluginTrackerFiles2();
+ $pluginName = $trackerFiles->getPluginNameFromFile(PIWIK_DOCUMENT_ROOT . '/plugins/MyFooBarPlugin/tracker.js');
+ $this->assertSame('MyFooBarPlugin', $pluginName);
+
+ $pluginName = $trackerFiles->getPluginNameFromFile(PIWIK_DOCUMENT_ROOT . '/plugins//MyFooBarPlugin//tracker.js');
+ $this->assertSame('MyFooBarPlugin', $pluginName);
+
+ $pluginName = $trackerFiles->getPluginNameFromFile(PIWIK_DOCUMENT_ROOT . '/plugins//MyFooBarPlugin//tracker.min.js');
+ $this->assertSame('MyFooBarPlugin', $pluginName);
+ }
+
+}
diff --git a/plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php b/plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php
new file mode 100644
index 0000000000..240638c5e9
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs\tests\Integration;
+
+use Piwik\Plugins\CustomPiwikJs\tests\Framework\Mock\PluginTrackerFilesMock;
+use Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
+use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
+
+/**
+ * @group CustomPiwikJs
+ * @group PiwikJsManipulatorTest
+ * @group PiwikJsManipulator
+ * @group Plugins
+ */
+class TrackerUpdaterTest extends IntegrationTestCase
+{
+ private $dir;
+
+ public function setUp()
+ {
+ parent::setUp();
+ $this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/CustomPiwikJs/tests/resources/';
+
+ $this->cleanUp();
+ }
+
+ public function tearDown()
+ {
+ parent::tearDown();
+
+ $this->cleanUp();
+ }
+
+ private function cleanUp()
+ {
+ $target = $this->dir . 'MyTestTarget.js';
+ if (file_exists($target)) {
+ unlink($target);
+ }
+ }
+
+ private function makeUpdater($from = null, $to = null)
+ {
+ return new TrackerUpdater($from, $to);
+ }
+
+ public function test_checkWillSucceed_shouldNotThrowExceptionIfPiwikJsTargetIsWritable()
+ {
+ $updater = $this->makeUpdater();
+ $updater->checkWillSucceed();
+
+ $this->assertTrue(true);
+ }
+
+ /**
+ * @expectedException \Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException
+ * @expectedExceptionMessage not writable
+ */
+ public function test_checkWillSucceed_shouldThrowExceptionIfTargetIsNotWritable()
+ {
+ $updater = $this->makeUpdater(null, $this->dir . 'MyNotExisIngFilessss.js');
+ $updater->checkWillSucceed();
+ }
+
+ public function test_update_shouldNotThrowAnError_IfTargetFileIsNotWritable()
+ {
+ $updater = $this->makeUpdater(null, $this->dir . 'MyNotExisIngFilessss.js');
+ $updater->update();
+ $this->assertTrue(true);
+ }
+
+ public function test_update_shouldNotWriteToFileIfThereIsNothingToChange()
+ {
+ $source = $this->dir . 'testpiwik.js';
+ $target = $this->dir . 'MyTestTarget.js';
+ file_put_contents($target, file_get_contents($source));
+ $updater = $this->makeUpdater($this->dir . 'testpiwik.js', $target);
+ $updater->setTrackerFiles(new PluginTrackerFilesMock(array()));
+ // mock that does not find any files . therefore there is nothing to di
+ $updater->update();
+
+ $this->assertSame(file_get_contents($source), file_get_contents($target));
+ }
+
+ public function test_update_targetFileIfPluginsDefineDifferentFiles()
+ {
+ $target = $this->dir . 'MyTestTarget.js';
+ file_put_contents($target, ''); // file has to exist in order to work
+
+ $updater = $this->makeUpdater($this->dir . 'testpiwik.js', $target);
+ $updater->setTrackerFiles(new PluginTrackerFilesMock(array(
+ $this->dir . 'tracker.js', $this->dir . 'tracker.min.js'
+ )));
+ $updater->update();
+
+ $this->assertSame('/** MyHeader*/
+var PiwikJs = "mytest";
+
+/*!!! pluginTrackerHook */
+
+/* GENERATED: tracker.min.js */
+
+/* END GENERATED: tracker.min.js */
+
+
+/* GENERATED: tracker.js */
+
+/* END GENERATED: tracker.js */
+
+
+var myArray = [];
+', file_get_contents($target));
+ }
+
+}
diff --git a/plugins/CustomPiwikJs/tests/System/PiwikJsContentTest.php b/plugins/CustomPiwikJs/tests/System/PiwikJsContentTest.php
new file mode 100644
index 0000000000..dd3f08ab3a
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/System/PiwikJsContentTest.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CustomPiwikJs\tests\System;
+
+use Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
+use Piwik\Plugins\CustomPiwikJs\TrackingCode\PiwikJsManipulator;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+
+/**
+ * @group CustomPiwikJs
+ * @group PiwikJsContentTest
+ * @group PiwikJsContent
+ * @group Plugins
+ */
+class PiwikJsContentTest extends SystemTestCase
+{
+ public function test_piwikJsAndPiwikMinJsMustHaveSameContent()
+ {
+ $piwikMin = PIWIK_DOCUMENT_ROOT . TrackerUpdater::ORIGINAL_PIWIK_JS;
+ $piwikJs = PIWIK_DOCUMENT_ROOT . TrackerUpdater::TARGET_PIWIK_JS;
+
+ $this->assertSame(file_get_contents($piwikMin), file_get_contents($piwikJs));
+ }
+
+ public function test_piwikJsContainsHook()
+ {
+ $piwikMin = PIWIK_DOCUMENT_ROOT . '/js/piwik.min.js';
+ $content = file_get_contents($piwikMin);
+
+ $this->assertContains(PiwikJsManipulator::HOOK, $content);
+ }
+
+} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/tests/resources/MyTestTarget2.js b/plugins/CustomPiwikJs/tests/resources/MyTestTarget2.js
new file mode 100644
index 0000000000..258c2d3e11
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/resources/MyTestTarget2.js
@@ -0,0 +1,16 @@
+/** MyHeader*/
+var PiwikJs = "mytest";
+
+/*!!! pluginTrackerHook */
+
+/* GENERATED: tracker.min.js */
+
+/* END GENERATED: tracker.min.js */
+
+
+/* GENERATED: tracker.js */
+
+/* END GENERATED: tracker.js */
+
+
+var myArray = [];
diff --git a/plugins/CustomPiwikJs/tests/resources/test.js b/plugins/CustomPiwikJs/tests/resources/test.js
new file mode 100644
index 0000000000..0ea6fcc24a
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/resources/test.js
@@ -0,0 +1,2 @@
+// Hello world
+var fooBar = 'test'; \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/tests/resources/testpiwik.js b/plugins/CustomPiwikJs/tests/resources/testpiwik.js
new file mode 100644
index 0000000000..02b60f8bcd
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/resources/testpiwik.js
@@ -0,0 +1,6 @@
+/** MyHeader*/
+var PiwikJs = "mytest";
+
+/*!!! pluginTrackerHook */
+
+var myArray = [];
diff --git a/plugins/CustomPiwikJs/tests/resources/tracker.js b/plugins/CustomPiwikJs/tests/resources/tracker.js
new file mode 100644
index 0000000000..ae4d228f39
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/resources/tracker.js
@@ -0,0 +1,4 @@
+/** my license header*/
+var myCustomTracker = 'test';
+
+var fooBar = 'baz'; \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/tests/resources/tracker.min.js b/plugins/CustomPiwikJs/tests/resources/tracker.min.js
new file mode 100644
index 0000000000..587ee0464d
--- /dev/null
+++ b/plugins/CustomPiwikJs/tests/resources/tracker.min.js
@@ -0,0 +1,2 @@
+/* my license header */
+var mySecondCustomTracker = 'test'; \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/da.json b/plugins/CustomVariables/lang/da.json
index cf635d0330..625048d59b 100644
--- a/plugins/CustomVariables/lang/da.json
+++ b/plugins/CustomVariables/lang/da.json
@@ -5,6 +5,8 @@
"CustomVariables": "Brugerdefinerede variabler",
"CustomVariablesReportDocumentation": "Rapporten indeholder oplysninger om brugerdefinerede variabler. Klik på et variabelnavn se fordeling af værdier. %1$s Yderligere oplysninger om brugerdefinerede variabler generelt, læs %2$sBrugerdefinerede variabel dokumentation på piwik.org%3$s",
"ScopePage": "virkefelt side",
- "ScopeVisit": "virkefelt besøg"
+ "ScopeVisit": "virkefelt besøg",
+ "Index": "Indeks",
+ "Unused": "Ubrugt"
}
} \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/fr.json b/plugins/CustomVariables/lang/fr.json
index 04febeefd6..8f7dea60ee 100644
--- a/plugins/CustomVariables/lang/fr.json
+++ b/plugins/CustomVariables/lang/fr.json
@@ -18,6 +18,7 @@
"CurrentAvailableCustomVariables": "Pour l'instant vous pouvez utiliser jusqu'à %s Variables personnalisées par site.",
"ToCreateCustomVarExecute": "Pour créer un nouvel emplacement de variable personnalisée exécutez la commande suivante dans votre installation de Piwik :",
"SlotsReportIsGeneratedOverTime": "Les données pour ce rapport vont être peuplées avec le temps. Il se peut que cela prenne un jour ou deux pour voir des informations et quelques semaines avant que le rapport ne soit précis.",
+ "MetricsAreOnlyAvailableForVisitScope": "Note: %1$s les métriques sont disponibles pour les variables personnalisées de la portée %2$s uniquement.",
"MetricsNotAvailableForPageScope": "Pour les variables personnalisées de la portée %1$s, la valeur de colonne pour ces métriques est %2$s"
}
} \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/it.json b/plugins/CustomVariables/lang/it.json
index c23021e8a6..f3899ac0d2 100644
--- a/plugins/CustomVariables/lang/it.json
+++ b/plugins/CustomVariables/lang/it.json
@@ -3,7 +3,7 @@
"ColumnCustomVariableName": "Nome Variabile Personalizzata",
"ColumnCustomVariableValue": "Valore Variabile Personalizzata",
"CustomVariables": "Variabile Personalizzata",
- "CustomVariablesReportDocumentation": "Questo report contiene le informazioni sulle variabili personalizzate. Clicca su un nome di variabile per visualizzarne la distribuzione dei valori. %1$s Per ulteriori informazioni sulle variabili personalizzate in generale, leggere la %2$sDocumentazione Variabili Personalizzatesu piwik.org %3$s",
+ "CustomVariablesReportDocumentation": "Questo report contiene le informazioni sulle variabili personalizzate. Clicca su un nome di variabile per visualizzarne la distribuzione dei valori. %1$s Per ulteriori informazioni sulle variabili personalizzate in generale, leggere la %2$sDocumentazione Variabili Personalizzate su piwik.org%3$s",
"PluginDescription": "Le variabili personalizzate sono coppie (nome, valore) che puoi assegnare ai visitatori o a una qualunque loro azione tramite API Javascript. Poi Piwik riporterà le visite, le pagine e le conversioni per questi nomi e valori. Guarda nel dettaglio le Variabili Personalizzate per ciascun utente nel Log Visitatori.<br>Necessario per utilizzare la funzione <a href=\"http:\/\/piwik.org\/docs\/ecommerce-analytics\/\">Statistiche Ecommerce<\/a>",
"ScopePage": "ambito pagina",
"ScopeVisit": "ambito visita",
@@ -17,6 +17,8 @@
"CreatingCustomVariableTakesTime": "La creazione di un nuovo slot di variabili personali può richiedere un tempo lungo che dipende dalla dimensione del tuo database. Pertanto è possibile fare ciò solo tramite un comando che deve essere eseguito da riga di comando.",
"CurrentAvailableCustomVariables": "Attualmente puoi utilizzare fino a %s variabili personali per sito.",
"ToCreateCustomVarExecute": "Per creare un nuovo slot di variabili personali esegui il comando seguente nella tua installazione di Piwik.",
- "SlotsReportIsGeneratedOverTime": "I dati per questo report saranno popolati nel tempo. Ciò può richiedere un giorno o due per vedere dei dati, e qualche settimana perché il report sia totalmente accurato."
+ "SlotsReportIsGeneratedOverTime": "I dati per questo report saranno popolati nel tempo. Ciò può richiedere un giorno o due per vedere dei dati, e qualche settimana perché il report sia totalmente accurato.",
+ "MetricsAreOnlyAvailableForVisitScope": "Nota: Sono disponibili %1$s metriche per le Variabili Speciali solo per l'ambito %2$s.",
+ "MetricsNotAvailableForPageScope": "Per le Variabili Speciali dell'ambito %1$s, il valore colonna è %2$s"
}
} \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/nl.json b/plugins/CustomVariables/lang/nl.json
index 4ba6ced08e..221ab25576 100644
--- a/plugins/CustomVariables/lang/nl.json
+++ b/plugins/CustomVariables/lang/nl.json
@@ -6,6 +6,11 @@
"CustomVariablesReportDocumentation": "Dit rapport bevat informatie over uw aangepaste variabelen. Klik op de naam van een variabele om de verdeling van de waarden te zien. %1$s voor meer informatie over aangepaste variabelen in het algemeen, lees de %2$sCustom variabelen documentatie over piwik.org%3$s",
"PluginDescription": "Aangepaste variabelen zijn (naam, waarde) paren dat je kunt toewijzen via de Javascript API aan bezoekers of aan één van hun acties. Piwik zal dan het aantal bezoeken, pagina's, conversies voor elk van deze aangepaste namen en waarden rapporteren. Bekijk de gedetailleerde Aangepaste variabelen voor elke gebruik en actie in het Bezoekerslogboek. <br\/>Het is vereist gebruik te maken van de<a href=\"http:\/\/piwik.org\/docs\/ecommerce-analytics\/\">Ecommerce Analyses<\/a> functie!",
"ScopePage": "omvang pagina",
- "ScopeVisit": "omvang bezoek"
+ "ScopeVisit": "omvang bezoek",
+ "Index": "Index",
+ "Usages": "Gebruikt",
+ "Unused": "Ongebruikt",
+ "UsageDetails": "%1$s bezoeken en %2$s acties sinds het maken van deze website.",
+ "SlotsReportIsGeneratedOverTime": "De data voor dit verslag wordt na verloop van tijd gegenereerd. Het kan een dag of twee duren voordat je de data ziet en een paar weken tot het rapport helemaal nauwkeurig is."
}
} \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/sv.json b/plugins/CustomVariables/lang/sv.json
index d037379c7f..9e254774ca 100644
--- a/plugins/CustomVariables/lang/sv.json
+++ b/plugins/CustomVariables/lang/sv.json
@@ -4,13 +4,21 @@
"ColumnCustomVariableValue": "Anpassat variabelvärde",
"CustomVariables": "Anpassade variabler",
"CustomVariablesReportDocumentation": "Denna rapport innehåller information om din anpassade variabler. Klicka på ett variabelnamn för att se fördelningen av värdena. %1$s För mer information om anpassade variabler i allmänhet, läs %2$sdokumentationen om anpassade variabler på piwik.org%3$s",
+ "PluginDescription": "Anpassade Variabler är (namn, värde) par som du kan tilldela genom Javascript API't till besökare eller någon av deras händelser. Piwik kommer sedan rapportera hur många besök, sidor, konverteringar för varje anpassat namn och värde. Kolla de detaljerade Anpassade Variablerna för varje användare och händelse i Besöksloggen.<br \/>Detta kräver att du använder <a href=\"http:\/\/piwik.org\/docs\/ecommerce-analytics\/\">E-handelsspårningen<\/a>!",
"ScopePage": "omfattning sida",
"ScopeVisit": "omfattning besök",
+ "ManageDescription": "Denna översikt visar alla anpassade variabler och dess användande för webbplatsen '%s'. Namnen för varje slot sorteras på hur ofta dom har använts totalt.",
"ScopeX": "Omfattning %s",
"Index": "Index",
"Usages": "Användningar",
"Unused": "Oanvänd",
"CreateNewSlot": "Öka antalet tillgängliga anpassade variabelspår",
- "CurrentAvailableCustomVariables": "För tillfället kan du använda upp till %s anpassade variabler per webbsida."
+ "UsageDetails": "%1$s besök och %2$s händelser sedan webbplatsen skapandet av denna webbplats.",
+ "CreatingCustomVariableTakesTime": "Att skapa en ny anpassad variabel kan ta lång tid beroende på storleken på din databas. Därför är det bara möjligt att göra detta via ett kommando som måste köras genom kommandoraden.",
+ "CurrentAvailableCustomVariables": "För tillfället kan du använda upp till %s anpassade variabler per webbsida.",
+ "ToCreateCustomVarExecute": "För att skapa en ny anpassad variabel använd följande kommando i din Piwik miljö:",
+ "SlotsReportIsGeneratedOverTime": "Data för den här rapporten kommer att samlas in allt eftersom. Det kan ta en dag eller två innan du ser någon data och ett par veckor innan rapporten är helt tillförlitlig.",
+ "MetricsAreOnlyAvailableForVisitScope": "Notering: %1$s mätvärden finns endast tillgängliga för Anpassade Variabler av omfattningen %2$s.",
+ "MetricsNotAvailableForPageScope": "För Anpassade Variabler av omfattningen %1$s är kolumnvärdet för dessa mätvärden %2$s"
}
} \ No newline at end of file
diff --git a/plugins/CustomVariables/lang/uk.json b/plugins/CustomVariables/lang/uk.json
new file mode 100644
index 0000000000..dc02b2396d
--- /dev/null
+++ b/plugins/CustomVariables/lang/uk.json
@@ -0,0 +1,24 @@
+{
+ "CustomVariables": {
+ "ColumnCustomVariableName": "Ім'я користувача змінної",
+ "ColumnCustomVariableValue": "Значення для користувцької змінної",
+ "CustomVariables": "Користувальницькі змінні",
+ "CustomVariablesReportDocumentation": "Цей звіт відображає інформацію по вашим Користувацьким змінним. Натисніть по змінній, щоб побачити розподіл значень. %1$s Для більшої інформації про користувальницькі змінні в загальних рисах ознайомтеся з %2$sдокументацією по Користувацьким змінним на сайті Piwik%3$s",
+ "PluginDescription": "Користувальницькі змінні - це пари (ім'я, значення), які ви можете призначити для користувачів або будь-яких їх дії за допомогою Javascript API. Тоді Piwik буде повідомляти, скільки відвідувань, сторінок, перетворень для кожного з цих користувальницьких імен і значень. Дивіться деталізацію користувальницьких змінних для кожного користувача і дії в Журналі відвідувань.<br \/>Потрібно для використання опції <a href=\"http:\/\/piwik.org\/docs\/ecommerce-analytics\/\">Аналітика електронної торгівлі<\/a>!",
+ "ScopePage": "область видимості сторінки",
+ "ScopeVisit": "область видимості візиту",
+ "ManageDescription": "Цей огляд показує всі слоти для користувальницьких змінних і їх використання для вебсайту '%s'. Назви в межах одного слота розподілені по загальній частоті використання.",
+ "ScopeX": "Вибірка %s",
+ "Index": "Індекс",
+ "Usages": "Використання",
+ "Unused": "Не використано",
+ "CreateNewSlot": "Збільшити кількість доступних слотів для користувальницьких змінних",
+ "UsageDetails": "%1$s відвідувань і %2$s дій з моменту створення цього вебсайту.",
+ "CreatingCustomVariableTakesTime": "Створення нового слоту для користувальницьких змінних може зайняти тривалий час в залежності від розміру вашої бази даних. Тому, це можливо зробити тільки за допомогою команди, яка повинна виконуватися в командному рядку на сервері.",
+ "CurrentAvailableCustomVariables": "В даний момент ви можете використовувати до %s користувальницьких змінних на сайт.",
+ "ToCreateCustomVarExecute": "Щоб створити новий слот для користувальницьких змінних, введіть наступну команду під час установки Piwik:",
+ "SlotsReportIsGeneratedOverTime": "Інформація для цього звіту буде заповнена з часом. Це може зайняти день або два, щоб побачити будь-яку інформацію, і кілька тижнів, щоб отримати точний звіт.",
+ "MetricsAreOnlyAvailableForVisitScope": "Увага: %1$s метрика доступна тільки для користувальницьких змінних вибірки %2$s.",
+ "MetricsNotAvailableForPageScope": "Для вибірки користувальницьких змінних %1$s, значення стовпця для цих метрик - %2$s"
+ }
+} \ No newline at end of file
diff --git a/plugins/DBStats/Reports/GetIndividualMetricsSummary.php b/plugins/DBStats/Reports/GetIndividualMetricsSummary.php
index a36f742c66..be0cbb90db 100644
--- a/plugins/DBStats/Reports/GetIndividualMetricsSummary.php
+++ b/plugins/DBStats/Reports/GetIndividualMetricsSummary.php
@@ -14,7 +14,7 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
/**
- * Shows a datatable that displays how many occurances there are of each individual
+ * Shows a datatable that displays how many occurrences there are of each individual
* metric type stored in the MySQL database.
*
* Goal metrics, metrics of the format .*_[0-9]+ and 'done...' metrics are grouped together.
diff --git a/plugins/DBStats/Reports/GetIndividualReportsSummary.php b/plugins/DBStats/Reports/GetIndividualReportsSummary.php
index 7f224c7909..f589cbb094 100644
--- a/plugins/DBStats/Reports/GetIndividualReportsSummary.php
+++ b/plugins/DBStats/Reports/GetIndividualReportsSummary.php
@@ -14,7 +14,7 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
/**
- * Shows a datatable that displays how many occurances there are of each individual
+ * Shows a datatable that displays how many occurrences there are of each individual
* report type stored in the MySQL database.
*
* Goal reports and reports of the format: .*_[0-9]+ are grouped together.
diff --git a/plugins/DBStats/lang/sq.json b/plugins/DBStats/lang/sq.json
index 83d23ab402..0e338133c6 100644
--- a/plugins/DBStats/lang/sq.json
+++ b/plugins/DBStats/lang/sq.json
@@ -10,10 +10,12 @@
"MetricDataByYear": "Tabela Matjesh Sipas Vitesh",
"MetricTables": "Tabela Matjesh",
"OtherTables": "Tabela të Tjera",
+ "PluginDescription": "Furnizon raporte të hollësishëm përdorimi baze të dhënash MySQL. Gjendet nën Diagnostikimet, për Superpërdoruesit.",
"ReportDataByYear": "Tabela Raportesh Sipas Vitit",
"ReportTables": "Tabela Raportesh",
"RowCount": "Numërim rreshtash",
"Table": "Tabelë",
- "TotalSize": "Madhësi gjithsej"
+ "TotalSize": "Madhësi gjithsej",
+ "TrackerTables": "Tabela Gjurmuesi"
}
} \ No newline at end of file
diff --git a/plugins/DBStats/lang/sv.json b/plugins/DBStats/lang/sv.json
index 576bbd4d2a..a0ef6b0b02 100644
--- a/plugins/DBStats/lang/sv.json
+++ b/plugins/DBStats/lang/sv.json
@@ -10,6 +10,7 @@
"MetricDataByYear": "Variabler per år",
"MetricTables": "Variabeltabeller",
"OtherTables": "Övriga tabeller",
+ "PluginDescription": "Ger detaljerade rapporter över användning av MySQL databasen. Finns tillgängligt för Administratörer under Diagnostik.",
"ReportDataByYear": "Raporttabeller per år",
"ReportTables": "Rapporttabeller",
"RowCount": "Radantal",
diff --git a/plugins/DBStats/lang/tr.json b/plugins/DBStats/lang/tr.json
index 0f90459844..4d7a35a51a 100644
--- a/plugins/DBStats/lang/tr.json
+++ b/plugins/DBStats/lang/tr.json
@@ -3,14 +3,14 @@
"DatabaseUsage": "Veritabanı kullanımı",
"DataSize": "Veri boyutu",
"DBSize": "Veritabanı boyutu",
- "EstimatedSize": "Tahmin edilen boyut",
+ "EstimatedSize": "Öngörülen boyut",
"IndexSize": "Dizin boyutu",
- "LearnMore": "Piwik'in verileri nasıl işlediğini ve orta ve yüksek trafiğe sahip sitelerde nasıl iyi çalıştığını öğrenmek için şu dokümana bakın: %s.",
- "MainDescription": "Piwik tüm web istatistiklerinizi MySQL veritabanında saklar. Piwik tabloları %s kullanıyor.",
- "MetricDataByYear": "Yıla Göre Metrik Tablosu",
- "MetricTables": "Metrik Tabloları",
+ "LearnMore": "Verilerin Piwik tarafından nasıl işlendiğini ile orta ve yüksek trafiğe sahip sitelerde nasıl iyi çalışacağını öğrenmek için şu belgeye bakın: %s.",
+ "MainDescription": "Piwik tüm web istatistiklerinizi MySQL veritabanında saklar. Şu anda Piwik tabloları %s alan kullanıyor.",
+ "MetricDataByYear": "Yıla Göre Ölçün Tabloları",
+ "MetricTables": "Ölçüm Tabloları",
"OtherTables": "Diğer Tablolar",
- "PluginDescription": "Detaylı MySQL veritabanı kullanım raporu sağlar. Super Kullanıcı için Teşhis bölümünün altından ulaşılabilir.",
+ "PluginDescription": "Ayrıntılı MySQL veritabanı kullanım raporu oluşturur. Süper Kullanıcılar Tanılama bölümünün altından ulaşabilir.",
"ReportDataByYear": "Yıla Göre Rapor Tabloları",
"ReportTables": "Rapor Tabloları",
"RowCount": "Satır sayısı",
diff --git a/plugins/DBStats/lang/uk.json b/plugins/DBStats/lang/uk.json
index 08ad26e9e2..541e3cfdc6 100644
--- a/plugins/DBStats/lang/uk.json
+++ b/plugins/DBStats/lang/uk.json
@@ -1,12 +1,21 @@
{
"DBStats": {
- "DatabaseUsage": "Використання бази даних",
+ "DatabaseUsage": "Використання БД",
"DataSize": "Розмір даних",
- "IndexSize": "Розмір індексів",
- "LearnMore": "Щоб зрозуміти більше як Piwik обробляє дані та як покращити роботу Piwik для сайтів з середнім та високим трафіком, перегляньте документацію %s.",
- "MainDescription": "Piwik зберігає всі дані для веб-аналітики в MySQL базі даних. На даний час, таблиці з даними Piwik займають %s",
- "RowCount": "Перелік рядків",
+ "DBSize": "Розмір бази даних",
+ "EstimatedSize": "Очікуваний розмір",
+ "IndexSize": "Розмір індексу",
+ "LearnMore": "Щоб дізнатися більше про те, як веб-аналітика обробляє дані і як їх оптимізувати для сайтів з середнім і високим навантаженням, дивіться документацію %s.",
+ "MainDescription": "Веб-аналітику зберігає всю вашу статистику в базі даних MySQL. Розмір таблиць на даний момент становить %s.",
+ "MetricDataByYear": "Таблиці показників за рік",
+ "MetricTables": "Таблиці показників",
+ "OtherTables": "Інші таблиці",
+ "PluginDescription": "Надає докладні звіти про використання бази даних MySQL. Доступно для супер-користувачів з метою діагностики.",
+ "ReportDataByYear": "Таблиці звітів за рік",
+ "ReportTables": "Таблиці звітів",
+ "RowCount": "Кількість записів",
"Table": "Таблиця",
- "TotalSize": "Розмір таблиці"
+ "TotalSize": "Загальний розмір",
+ "TrackerTables": "Таблиці трекеру"
}
} \ No newline at end of file
diff --git a/plugins/Dashboard/Dashboard.php b/plugins/Dashboard/Dashboard.php
index da7a8507d9..56f65e8fb9 100644
--- a/plugins/Dashboard/Dashboard.php
+++ b/plugins/Dashboard/Dashboard.php
@@ -136,10 +136,10 @@ class Dashboard extends \Piwik\Plugin
if (empty($defaultLayout)) {
$topWidget = '';
- $advertising = StaticContainer::get('Piwik\PiwikPro\Advertising');
- if ($advertising->arePiwikProAdsEnabled() && Plugin\Manager::getInstance()->isPluginActivated('PiwikPro')) {
- $topWidget .= '{"uniqueId":"widgetPiwikPropromoPiwikPro",'
- . '"parameters":{"module":"PiwikPro","action":"promoPiwikPro"}},';
+ $advertising = StaticContainer::get('Piwik\ProfessionalServices\Advertising');
+ if ($advertising->areAdsForProfessionalServicesEnabled() && Plugin\Manager::getInstance()->isPluginActivated('ProfessionalServices')) {
+ $topWidget .= '{"uniqueId":"widgetProfessionalServicespromoServices",'
+ . '"parameters":{"module":"ProfessionalServices","action":"promoServices"}},';
}
if (Piwik::hasUserSuperUserAccess()) {
diff --git a/plugins/Dashboard/lang/da.json b/plugins/Dashboard/lang/da.json
index c77a36895c..63bfe426f9 100644
--- a/plugins/Dashboard/lang/da.json
+++ b/plugins/Dashboard/lang/da.json
@@ -21,6 +21,7 @@
"PluginDescription": "Webanalyse kontrolpanel. Tilpas dit kontrolpanel ved at tilføje nye moduler, træk og slip dem rundt, og ændre kontrolpanelets kolonnelayout. Hver bruger kan styre deres eget brugerdefinerede kontrolpanel.",
"RemoveDashboard": "Fjern kontrolpanel",
"RemoveDashboardConfirm": "Bekræft fjernelse af kontrolpanel \"%s\"?",
+ "RemoveDefaultDashboardNotPossible": "Standard kontrolpanel kan ikke fjernes",
"RenameDashboard": "Omdøb kontrolpanel",
"ResetDashboard": "Nulstil kontrolpanel",
"ResetDashboardConfirm": "Nulstil kontrolpanel til standard?",
diff --git a/plugins/Dashboard/lang/de.json b/plugins/Dashboard/lang/de.json
index 35cc204fec..28f3ff58cc 100644
--- a/plugins/Dashboard/lang/de.json
+++ b/plugins/Dashboard/lang/de.json
@@ -28,7 +28,7 @@
"SelectDashboardLayout": "Bitte wählen Sie ein neues Dashboardlayout",
"SelectWidget": "Wählen Sie hier das Widget aus, welches zum Dashboard hinzugefügt werden soll",
"SetAsDefaultWidgets": "Als Standard Widgetauswahl speichern",
- "SetAsDefaultWidgetsConfirm": "Sind Sie sicher, dass Sie die aktuelle Widgetauswahl und das Layout als das Standard Dashboardtemplate speichern möchten?",
+ "SetAsDefaultWidgetsConfirm": "Sind Sie sicher, dass Sie die aktuelle Widgetauswahl und das Layout als das Standard Dashboardvorlage speichern möchten?",
"SetAsDefaultWidgetsConfirmHelp": "Diese Widgetauswahl und das aktuelle Spaltenlayout werden verwendet, wenn ein neues Dashboard erstellt wird oder wenn \"%s\" verwendet wird.",
"TopLinkTooltip": "Zeige Webanalytik Berichte für %s.",
"WidgetNotFound": "Widget nicht gefunden",
diff --git a/plugins/Dashboard/lang/es.json b/plugins/Dashboard/lang/es.json
index c3681743d3..a52aa679d6 100644
--- a/plugins/Dashboard/lang/es.json
+++ b/plugins/Dashboard/lang/es.json
@@ -21,6 +21,7 @@
"PluginDescription": "Su tablero de análisis de internet. Personalize su tablero agregando nuevos reproductores, arrastre y suéltelos; cambie la disposición de las columnas del tablero. Cada usuario puede administrar su propio tablero personalizado.",
"RemoveDashboard": "Elimina el tablero",
"RemoveDashboardConfirm": "¿Está seguro que desea eliminar el tablero \"%s\"?",
+ "RemoveDefaultDashboardNotPossible": "El cuadro de mando por defecto no puede ser eliminado",
"RenameDashboard": "Renombrar el tablero",
"ResetDashboard": "Reinicia el tablero",
"ResetDashboardConfirm": "¿Realmente desea reiniciar la distribución del tablero y regresar a la selección de reproductores por defecto?",
diff --git a/plugins/Dashboard/lang/sq.json b/plugins/Dashboard/lang/sq.json
index 2c17ddc435..0b9a887d1f 100644
--- a/plugins/Dashboard/lang/sq.json
+++ b/plugins/Dashboard/lang/sq.json
@@ -7,13 +7,20 @@
"CreateNewDashboard": "Krijoni pult të ri",
"Dashboard": "Pulti",
"DashboardCopied": "Pulti i tanishëm u kopjua me sukses te përdoruesi i përzgjedhur.",
+ "DashboardEmptyNotification": "Pulti juaj nuk përmban ndonjë widget. Fillojani duke shtuar ndonjë të tillë ose thjesht rikthejeni pultin te përzgjedhja parazgjedhje për widget-et.",
"DashboardName": "Emër pulti:",
"DashboardOf": "Pulti i %s",
+ "DefaultDashboard": "Pulti parazgjedhje - Përdorim i parazgjedhjeve për përzgjedhje widget-sh dhe skema shtyllash",
"DeleteWidgetConfirm": "Jeni i sigurt se doni të fshihet ky \"widget\" prej pulti?",
+ "EmptyDashboard": "Pult i zbrazët - Zgjidhni widget-et tuaj të parapëlqyer",
"LoadingWidget": "Widget-i po ngarkohet, ju lutemi, pritni...",
"ManageDashboard": "Administroni pultin",
"Maximise": "Maksimizoje",
"Minimise": "Minimizoje",
+ "NotUndo": "Nuk do të jeni në gjendje ta zhbëni këtë veprim.",
+ "PluginDescription": "Pulti Juaj i Analizave Web. Përshtateni pultin tuaj duke shtuar widget-e të rinj, merrini dhe vërini atje ku doni, dhe ndryshoni skemën e shtyllave të pultit. Çdo përdorues mund ta administrojë pultin e vet ashtu si do.",
+ "RemoveDashboard": "Hiqe pultin",
+ "RemoveDashboardConfirm": "Jeni i sigurt se doni të hiqet pulti \"%s\"?",
"RemoveDefaultDashboardNotPossible": "Pulti parazgjedhje s’mund të hiqet",
"RenameDashboard": "Riemërtoni pultin",
"ResetDashboard": "Riktheje pultin te parazgjedhjet",
@@ -21,6 +28,9 @@
"SelectDashboardLayout": "Ju lutemi, përzgjidhni skemën e re për pultin tuaj",
"SelectWidget": "Përzgjidhni widget-in që doni të shtohet te pulti",
"SetAsDefaultWidgets": "Caktojeni si përzgjedhje widget-esh parazgjedhje",
+ "SetAsDefaultWidgetsConfirm": "Jeni i sigurt se doni të caktohet përzgjedhja e tanishme e widget-eve dhe e skemës për shtyllat si gjedhja parazgjedhje e pultit?",
+ "SetAsDefaultWidgetsConfirmHelp": "Kjo përzgjedhje widget-sh dhe shtyllash për pultin do të përdoret kur cilido përdorues krijon një pult të ri, ose kur përdoret veçoria \"%s\".",
+ "TopLinkTooltip": "Shihni raporte Analizash Web për %s.",
"WidgetNotFound": "Nuk u gjet \"widget\"",
"WidgetPreview": "Paraparje widget-i"
}
diff --git a/plugins/Dashboard/lang/tr.json b/plugins/Dashboard/lang/tr.json
index b69bbc0900..e0be7372aa 100644
--- a/plugins/Dashboard/lang/tr.json
+++ b/plugins/Dashboard/lang/tr.json
@@ -1,37 +1,37 @@
{
"Dashboard": {
- "AddAWidget": "Rapor kutusu ekle",
- "AddPreviewedWidget": "Görüntülenen Bileşenı panoya ekleyin.",
- "ChangeDashboardLayout": "Panel düzenini değiştir",
- "CopyDashboardToUser": "Paneli kullanıcı için kopyala",
- "CreateNewDashboard": "Yeni panel ekle",
+ "AddAWidget": "Gereç ekle",
+ "AddPreviewedWidget": "Gereci panoya eklemek için tıklayın",
+ "ChangeDashboardLayout": "Pano düzenini değiştir",
+ "CopyDashboardToUser": "Panoyu kullanıcıya kopyala",
+ "CreateNewDashboard": "Pano ekle",
"Dashboard": "Pano",
- "DashboardCopied": "Panel başarılı şekilde seçilen kullanıcı için kopyalandı",
- "DashboardEmptyNotification": "Kontrol Panelin hiçbir widget içermiyor. Widget ekleyerek veya kontrol panelini resetleyerek varsayılan widget seçimi ile başlayabilirsin.",
- "DashboardName": "Panel adı:",
- "DashboardOf": "Kontrol paneli %s",
- "DefaultDashboard": "Varsayılan panel - Varsayılan widget seçimleri ve sütunları kullanın",
- "DeleteWidgetConfirm": "Bu Bileşenı panodan silmek istediğinize emin misiniz?",
- "EmptyDashboard": "Boş panel - Favori widgetlarınızı seçin",
- "LoadingWidget": "Bileşen yükleniyor, lütfen bekleyin...",
- "ManageDashboard": "Paneli düzenle",
- "Maximise": "Maksimize",
+ "DashboardCopied": "Geçerli pano seçilmiş kullanıcıya kopyalandı.",
+ "DashboardEmptyNotification": "Panoda herhangi bir gereç yok. Başlamak için bazı gereçler ekleyin ya da panoyu varsayılan gereç seçimine sıfırlayın.",
+ "DashboardName": "Pano adı:",
+ "DashboardOf": "%s panosu",
+ "DefaultDashboard": "Varsayılan pano - Varsayılan gereç seçimlerini ve sütun düzenini kullanır",
+ "DeleteWidgetConfirm": "Bu gereci panodan silmek istediğinize emin misiniz?",
+ "EmptyDashboard": "Boş panı - Kullanmak istediğiniz gereçleri seçin",
+ "LoadingWidget": "Lütfen gereç yüklenirken bekleyin...",
+ "ManageDashboard": "Pano yönetimi",
+ "Maximise": "Büyüt",
"Minimise": "Küçült",
- "NotUndo": "Bu eylemi geri alamazsınız.",
- "PluginDescription": "Web Analitik ve Gösterge Tablon. Yeni widget ekleyerek, onları sürükle bırak yaparak ve gösterge paneli sütun düzgisini değiştirerek gösterge panelini özelleştirebilirsin. Her kullanıcı kendi özelleşmiş gösterge panelini yönetebilir.",
- "RemoveDashboard": "Paneli kaldır",
- "RemoveDashboardConfirm": "\"%s\" panelini kaldırmak istediğinize emin misiniz?",
+ "NotUndo": "Bu işlem geri alınamaz.",
+ "PluginDescription": "Web İstatistikleri Panonuz. Panonuzu, yeni gereçler ekleyerek, varolan gereçleri sürükleyip bırakarak ve sütun düzenini değiştirerek isteğinize göre düzenleyebilirsiniz. Her kullanıcı kendine özel bir pano oluşturabilir.",
+ "RemoveDashboard": "Panoyu sil",
+ "RemoveDashboardConfirm": "\"%s\" panosunu silmek istediğinize emin misiniz?",
"RemoveDefaultDashboardNotPossible": "Varsayılan pano silinemez",
- "RenameDashboard": "Panel yeniden adlandır",
- "ResetDashboard": "Paneli sıfırla",
- "ResetDashboardConfirm": "Kontrol paneli şablonunuzu varsayılan widget seçimlerine sıfırlamak istediğinizden emin misiniz?",
- "SelectDashboardLayout": "Lütfen yeni panel düzenini seçiniz.",
- "SelectWidget": "Panoya eklemek için bileşen seçiniz.",
- "SetAsDefaultWidgets": "Varsayılan widget seçimi olarak ata",
- "SetAsDefaultWidgetsConfirm": "Mevcut widget seçimini ve kontrol paneli düzenini varsayılan kontrol paneli teması olarak atamak istediğinizden emin misiniz?",
- "SetAsDefaultWidgetsConfirmHelp": "Bu widgetlerin seçimi ve gösterge panelinin sütun dizgisi herhangi bir kullanıcı yeni gösterge paneli yarattığında veya \"%s\" özellii kullanıldığında kullanılabilir.",
- "TopLinkTooltip": "%s için Web Analatik raporunu görüntüle.",
- "WidgetNotFound": "Bileşen bulunamadı",
- "WidgetPreview": "Bileşen görünümü"
+ "RenameDashboard": "Panoyu yeniden adlandırın",
+ "ResetDashboard": "Panoyu sıfırla",
+ "ResetDashboardConfirm": "Pano düzeninizi varsayılan gereç seçimlerine göre sıfırlamak istediğinize emin misiniz?",
+ "SelectDashboardLayout": "Lütfen yeni pano düzenini seçin",
+ "SelectWidget": "Panoya eklemek istesiğiniz gereci seçin",
+ "SetAsDefaultWidgets": "Varsayılan gereç seçimi olarak ata",
+ "SetAsDefaultWidgetsConfirm": "Geçerli gereç seçimi ve pano düzenini varsayılan pano teması olarak atamak istediğinize emin misiniz?",
+ "SetAsDefaultWidgetsConfirmHelp": "Başka bir kullanıcı yeni bir pano eklediğinde ya da \"%s\" özelliği kullanıldığında, varsayılan olarak bu gereç seçimi ve sütun düzeni kullanılır.",
+ "TopLinkTooltip": "%s için web istatistikleri raporunu görüntüle.",
+ "WidgetNotFound": "Gereç bulunamadı",
+ "WidgetPreview": "Gereç önizlemesi"
}
} \ No newline at end of file
diff --git a/plugins/Dashboard/lang/uk.json b/plugins/Dashboard/lang/uk.json
index 5b2d6ba172..5cabace93a 100644
--- a/plugins/Dashboard/lang/uk.json
+++ b/plugins/Dashboard/lang/uk.json
@@ -1,12 +1,37 @@
{
"Dashboard": {
- "AddPreviewedWidget": "Додати переглянутий віджет до панелі керування",
- "Dashboard": "Панель Керування",
- "DeleteWidgetConfirm": "Видалити цей віджет з панелі керування?",
- "LoadingWidget": "Завантаження віджету, зачекайте...",
+ "AddAWidget": "Додати віджет",
+ "AddPreviewedWidget": "Додати віджет на панель інструментів",
+ "ChangeDashboardLayout": "Виберіть вид панелі інструментів",
+ "CopyDashboardToUser": "Копіювати панель інструментів користувачеві",
+ "CreateNewDashboard": "Створити нову панель інструментів",
+ "Dashboard": "Панель інструментів",
+ "DashboardCopied": "Поточна панель інструментів успішно скопійовано вибраному користувачеві.",
+ "DashboardEmptyNotification": "Ваша панель інструментів не містить жодного елемента. Додайте якісь віджети або просто скиньте панель інструментів до налаштувань за замовчуванням.",
+ "DashboardName": "Ім'я панелі інструментів:",
+ "DashboardOf": "Панель інструментів %s",
+ "DefaultDashboard": "Панель інструментів за замовчуванням використовує набір віджетів та розташування колонок за замовчуванням.",
+ "DeleteWidgetConfirm": "Ви впевнені, що хочете видалити цей віджет з інформаційної панелі?",
+ "EmptyDashboard": "Порожня панель інструментів - виберіть ваші улюблені віджети",
+ "LoadingWidget": "Завантаження віджету, будь ласка почекайте...",
+ "ManageDashboard": "Налаштування панелі інструментів",
"Maximise": "Розгорнути",
- "SelectWidget": "Оберіть віджет для розміщення в панелі керування",
- "WidgetNotFound": "Віджет не знайдено",
- "WidgetPreview": "Перегляд віджету"
+ "Minimise": "Згорнути",
+ "NotUndo": "Дана операція не зворотна.",
+ "PluginDescription": "Ваша панель управління веб-аналітикою. Налаштуйте свою панель керування, додавайте нові віджети, переміщуйте їх і змінюйте розташування стовпців панелі управління. Кожен користувач може керувати своєю власною панеллю керування.",
+ "RemoveDashboard": "Видалити панель інструментів",
+ "RemoveDashboardConfirm": "Ви впевнені, що хочете видалити цю панель інструментів: '%s'?",
+ "RemoveDefaultDashboardNotPossible": "Панель управління за замовчуванням не може бути видалена",
+ "RenameDashboard": "Перейменувати панель інструментів",
+ "ResetDashboard": "Скинути панель інструментів",
+ "ResetDashboardConfirm": "Ви впевнені, що хочете скинути вид панелі інструментів до виду за замовчуванням?",
+ "SelectDashboardLayout": "Будь ласка, виберіть ваш новий вид панелі інструментів.",
+ "SelectWidget": "Виберіть віджет для додавання на панелі інструментів",
+ "SetAsDefaultWidgets": "Встановити набір віджетів за замовчуванням",
+ "SetAsDefaultWidgetsConfirm": "Ви впевнені, що хочете встановити поточний набір віджетів панелі інструментів як набір віджетів за замовчуванням?",
+ "SetAsDefaultWidgetsConfirmHelp": "Вибір віджетів і розташування колонок панелі інструментів буде використовуватися, коли користувач створює нову панель інструментів або коли використовується '%s'.",
+ "TopLinkTooltip": "Подивитися звіт веб-аналітики для %s.",
+ "WidgetNotFound": "Віджет не найден",
+ "WidgetPreview": "Попередній перегляд віджету"
}
} \ No newline at end of file
diff --git a/plugins/DevicePlugins/lang/da.json b/plugins/DevicePlugins/lang/da.json
index 0291ba6e2c..8ecf600ac9 100644
--- a/plugins/DevicePlugins/lang/da.json
+++ b/plugins/DevicePlugins/lang/da.json
@@ -3,6 +3,7 @@
"BrowserWithNoPluginsEnabled": "%1$s med ingen aktiverede udvidelsesmoduler",
"BrowserWithPluginsEnabled": "%1$s med udvidelsesmoduler %2$s aktiveret",
"PluginDescription": "Viseren liste over udvidelser, der understøttes i besøgendes browsere.",
+ "PluginDetectionDoesNotWorkInIE": "Bemærk: Plugins detektering virker ikke i Internet Explorer før version 11. Denne rapport er kun baseret på ikke-IE browsere og nyere versioner af IE.",
"WidgetPlugins": "Udvidelsesmoduler",
"WidgetPluginsDocumentation": "Rapporten viser, hvilke browserudvidelser de besøgende havde aktiveret. Oplysningerne kan være vigtigt for at vælge den rigtige måde at levere indholdet på."
}
diff --git a/plugins/DevicePlugins/lang/fr.json b/plugins/DevicePlugins/lang/fr.json
index 1faa74e338..cebf99a020 100644
--- a/plugins/DevicePlugins/lang/fr.json
+++ b/plugins/DevicePlugins/lang/fr.json
@@ -3,6 +3,7 @@
"BrowserWithNoPluginsEnabled": "%1$s avec aucun plugin activé",
"BrowserWithPluginsEnabled": "%1$s avec les plugins %2$s activés",
"PluginDescription": "Rapporte la liste des composants supportés par les navigateurs des visiteurs.",
+ "PluginDetectionDoesNotWorkInIE": "Note: la détections de plugins ne fonctionne pas avec Internet Explorer d'une version inférieure à 11. Ce Rapport est basé uniquement sur les utilsateurs non IE et les versions récentes d'IE.",
"WidgetPlugins": "Liste de Plugins",
"WidgetPluginsDocumentation": "Ce rapport montre quels plugins du navigateur vos visiteurs ont activés. Cette information peut être importante pour choisir le bon moyen de délivrer le contenu."
}
diff --git a/plugins/DevicePlugins/lang/is.json b/plugins/DevicePlugins/lang/is.json
index af396fe27e..939a0b07f8 100644
--- a/plugins/DevicePlugins/lang/is.json
+++ b/plugins/DevicePlugins/lang/is.json
@@ -1,6 +1,5 @@
{
"DevicePlugins": {
- "PluginDetectionDoesNotWorkInIE": "Ath: uppgötvun á íbótum virkar ekki með Internet Explorer. Þessi skýrsla er aðeins unnin út frá öðrum vöfrum en IE.",
"WidgetPlugins": "Listi yfir íbætur"
}
} \ No newline at end of file
diff --git a/plugins/DevicePlugins/lang/ka.json b/plugins/DevicePlugins/lang/ka.json
index 2452d64099..7482e8bf9c 100644
--- a/plugins/DevicePlugins/lang/ka.json
+++ b/plugins/DevicePlugins/lang/ka.json
@@ -1,6 +1,5 @@
{
"DevicePlugins": {
- "PluginDetectionDoesNotWorkInIE": "შენიშვნა: პლაგინების ამოცნობა არ ხდება ინტერნეტ ექსპლორერში. ეს რეპორტი მუშაოაბს მხოლოდ არა–IE ბრაუზერებზე.",
"WidgetPlugins": "პლაგინების სია"
}
} \ No newline at end of file
diff --git a/plugins/DevicePlugins/lang/sq.json b/plugins/DevicePlugins/lang/sq.json
index 61aa87f22c..477e2a2f77 100644
--- a/plugins/DevicePlugins/lang/sq.json
+++ b/plugins/DevicePlugins/lang/sq.json
@@ -2,6 +2,8 @@
"DevicePlugins": {
"BrowserWithNoPluginsEnabled": "%1$s pa shtojca të aktivizuara",
"BrowserWithPluginsEnabled": "%1$s me shtojca %2$s të aktivizuara",
+ "PluginDescription": "Raporton listën e shtojcave që mbulohen nga shfletuesit e përdoruesve.",
+ "PluginDetectionDoesNotWorkInIE": "Shënim: Zbulimi i shtojcave nuk funksionon nën Internet Explorer më të hershëm se 11. Ky raport bazohet vetëm në shfletues jo-IE dhe versione IE më të rinj.",
"WidgetPlugins": "Listë e Shtojcave",
"WidgetPluginsDocumentation": "Ky raport tregon se cilat shtojca shfletuesi kanë të aktivizuara vizitorët tuaj. Ky informacion mund të jetë i vlefshëm për zgjedhjen e mënyrës më të përshtatshme për ofrimin e lëndës suaj."
}
diff --git a/plugins/DevicePlugins/lang/sv.json b/plugins/DevicePlugins/lang/sv.json
index b5b98eced9..33a23fdd73 100644
--- a/plugins/DevicePlugins/lang/sv.json
+++ b/plugins/DevicePlugins/lang/sv.json
@@ -3,6 +3,7 @@
"BrowserWithNoPluginsEnabled": "%1$s med inga plugins är aktiverad",
"BrowserWithPluginsEnabled": "%1$s med plugins %2$s är aktiverad",
"PluginDescription": "Visar en lista av plugins som stöds i besökarnas webbläsare.",
+ "PluginDetectionDoesNotWorkInIE": "Notering: Detektering av tillägg fungerar inte i Internet Explorer med versioner före 11. Denna rapport baseras endast på icke-IE webbläsare och nyare versioner av IE.",
"WidgetPlugins": "Lista över plugins",
"WidgetPluginsDocumentation": "Denna rapport visar vilka plugins i webbläsaren som besökarna hade aktiverat. Denna information kan vara viktig för att välja rätt sätt att leverera ditt innehåll."
}
diff --git a/plugins/DevicePlugins/lang/uk.json b/plugins/DevicePlugins/lang/uk.json
index 1f2acce1e5..ebbc0548ac 100644
--- a/plugins/DevicePlugins/lang/uk.json
+++ b/plugins/DevicePlugins/lang/uk.json
@@ -1,5 +1,10 @@
{
"DevicePlugins": {
- "WidgetPlugins": "Список плагінів"
+ "BrowserWithNoPluginsEnabled": "%1$s без активованих плагінів",
+ "BrowserWithPluginsEnabled": "%1$s з плагінами %2$s включено",
+ "PluginDescription": "Повідомляє список плагінів, доступних в браузерах відвідувачів.",
+ "PluginDetectionDoesNotWorkInIE": "Увага: Визначення плагінів не працює в Internet Explorer до 11. Цей звіт базується тільки на не-IE браузерах і новітніх версіях IE.",
+ "WidgetPlugins": "Список плагінів",
+ "WidgetPluginsDocumentation": "Цей звіт показується які плагіни відвідувачі використовують в своїх браузерах. Ця інформація може бути важлива для того, щоб відвідувачі змогли побачити ваш контент належним чином."
}
} \ No newline at end of file
diff --git a/plugins/DevicesDetection/Reports/GetBrowserVersions.php b/plugins/DevicesDetection/Reports/GetBrowserVersions.php
index 0c71c602f2..13c47984f5 100644
--- a/plugins/DevicesDetection/Reports/GetBrowserVersions.php
+++ b/plugins/DevicesDetection/Reports/GetBrowserVersions.php
@@ -22,7 +22,6 @@ class GetBrowserVersions extends Base
$this->name = Piwik::translate('DevicesDetection_BrowserVersion');
$this->documentation = ''; // TODO
$this->order = 6;
-
$this->subcategoryId = 'DevicesDetection_Software';
}
diff --git a/plugins/DevicesDetection/Reports/GetBrowsers.php b/plugins/DevicesDetection/Reports/GetBrowsers.php
index b1a2f936d0..7d8959d1e6 100644
--- a/plugins/DevicesDetection/Reports/GetBrowsers.php
+++ b/plugins/DevicesDetection/Reports/GetBrowsers.php
@@ -22,7 +22,6 @@ class GetBrowsers extends Base
$this->name = Piwik::translate('DevicesDetection_Browsers');
$this->documentation = Piwik::translate('DevicesDetection_WidgetBrowsersDocumentation', '<br />');
$this->order = 5;
-
$this->subcategoryId = 'DevicesDetection_Software';
}
diff --git a/plugins/DevicesDetection/functions.php b/plugins/DevicesDetection/functions.php
index 0feafaebca..e7ef1fe893 100644
--- a/plugins/DevicesDetection/functions.php
+++ b/plugins/DevicesDetection/functions.php
@@ -72,7 +72,7 @@ function getBrowserName($label)
*
* First try to find a logo for the given short code
* If none can be found try to find a logo for the browser family
- * Return unkown logo otherwise
+ * Return unknown logo otherwise
*
* @param string $short Shortcode or name of browser
*
diff --git a/plugins/DevicesDetection/images/browsers/TS.gif b/plugins/DevicesDetection/images/browsers/TS.gif
new file mode 100644
index 0000000000..ca411126a3
--- /dev/null
+++ b/plugins/DevicesDetection/images/browsers/TS.gif
Binary files differ
diff --git a/plugins/DevicesDetection/lang/ar.json b/plugins/DevicesDetection/lang/ar.json
index 4089486f81..666791fe41 100644
--- a/plugins/DevicesDetection/lang/ar.json
+++ b/plugins/DevicesDetection/lang/ar.json
@@ -1,13 +1,44 @@
{
"DevicesDetection": {
- "BrowserEngine": "المتصفح",
+ "BrowserEngine": "محرّك المتصفح",
+ "BrowserEngineDocumentation": "يظهر هذا التقرير مستعرضات زوارك مقسمة حسب محركاتها. %s أكثر المعلومات أهمية لمطوري الوب هي نوع محرك التصيير الذي يستخدمه الزوار. إن المسميات تحوي أسماء المحركات متبوعة بأكثر المستعرضات شعبية الذي يستخدم هذا المحرك بين قوسين.",
+ "BrowserEngines": "محرّكات المتصفح",
"BrowserFamily": "عائلة المتصفح",
"Browsers": "المتصفحات",
"BrowserVersion": "إصدار المتصفح",
+ "BrowserVersions": "إصدارات المتصفح",
+ "Camera": "الكاميرا",
+ "CarBrowser": "متصفح سيارة",
+ "Software": "برنامج",
"ColumnBrowser": "المتصفح",
"ColumnOperatingSystem": "نظام التشغيل",
+ "ColumnOperatingSystemVersion": "إصدار نظام التشغيل",
+ "Console": "وحدة التحكُّم",
+ "dataTableLabelBrands": "العلامة",
+ "dataTableLabelModels": "الطراز",
+ "dataTableLabelSystemVersion": "إصدار نظام التشغيل",
"dataTableLabelTypes": "النوع",
+ "Device": "الجهاز",
+ "DeviceBrand": "صانع الجهاز",
+ "DeviceDetection": "اكتشاف الجهاز",
+ "DeviceModel": "طراز الجهاز",
+ "DevicesDetection": "أجهزة الزائر",
+ "DeviceType": "نوع الجهاز",
+ "FeaturePhone": "هاتف مميزات",
+ "OperatingSystemFamilies": "عوائل أنظمة التشغيل",
+ "OperatingSystemFamily": "عائلة نظام التشغيل",
"OperatingSystems": "أنظمة التشغيل",
- "WidgetBrowsers": "متصفحات الزوار"
+ "OperatingSystemVersions": "إصدارات نظام التشغيل",
+ "PluginDescription": "يزودك بمعلومات تفصيلية عن أجهزة الزائر ، مثل العلامة التجارية (الصانع) والطراز (إصدار الجهاز) و نوع الجهاز (تلفاز، وحدة متخصصة ، هاتف ذكي ، حاسب مكتبي ...الخ) والمزيد من المعلومات.",
+ "SmartDisplay": "شاشة ذكية",
+ "Smartphone": "هاتف ذكي",
+ "PortableMediaPlayer": "مشغل وسائط محمول",
+ "Devices": "الأجهزة",
+ "Tablet": "لوحي",
+ "Phablet": "هاتف لوحي",
+ "TV": "تلفاز",
+ "UserAgent": "وكيل-المستخدم",
+ "WidgetBrowsers": "متصفحات الزوار",
+ "WidgetBrowsersDocumentation": "يحوي هذا التقرير معلومات عن ماهية نوع المستعرض الذي استخدمه زوارك. يُذكَر كل إصدار من المستعرض لوحده."
}
} \ No newline at end of file
diff --git a/plugins/DevicesDetection/lang/da.json b/plugins/DevicesDetection/lang/da.json
index 11ab896275..c3689437c9 100644
--- a/plugins/DevicesDetection/lang/da.json
+++ b/plugins/DevicesDetection/lang/da.json
@@ -35,6 +35,7 @@
"PortableMediaPlayer": "Bærbar medieafspiller",
"Devices": "Enheder",
"Tablet": "Tablet",
+ "Phablet": "Phablet",
"TV": "TV",
"UserAgent": "Brugeragent",
"WidgetBrowsers": "Besøgendes browser",
diff --git a/plugins/DevicesDetection/lang/tr.json b/plugins/DevicesDetection/lang/tr.json
index 0328ee866b..0e9e8a6f55 100644
--- a/plugins/DevicesDetection/lang/tr.json
+++ b/plugins/DevicesDetection/lang/tr.json
@@ -1,28 +1,28 @@
{
"DevicesDetection": {
- "BrowserEngine": "Tarayıcı",
- "BrowserEngines": "Tarayıcı Motorları",
+ "BrowserEngine": "Tarayıcı motoru",
+ "BrowserEngines": "Tarayıcı motorları",
"BrowserFamily": "Tarayıcı ailesi",
"Browsers": "Tarayıcılar",
"BrowserVersion": "Tarayıcı sürümü",
- "BrowserVersions": "Tarayıcı versiyonları",
+ "BrowserVersions": "Tarayıcı sürümleri",
"Camera": "Kamera",
- "CarBrowser": "Araba tarayıcısı",
+ "CarBrowser": "Araç tarayıcısı",
"Software": "Yazılım",
"ColumnBrowser": "Tarayıcı",
"ColumnOperatingSystem": "İşletim sistemi",
- "ColumnOperatingSystemVersion": "İşletim Sistemi Versiyonu",
+ "ColumnOperatingSystemVersion": "İşletim sistemi sürümü",
"Console": "Konsol",
"dataTableLabelBrands": "Marka",
"dataTableLabelModels": "Model",
- "dataTableLabelSystemVersion": "İşletim Sistemi versiyonu",
+ "dataTableLabelSystemVersion": "İşletim Sistemi Sürümü",
"dataTableLabelTypes": "Tür",
- "Device": "Cihaz",
- "DeviceBrand": "Cihaz markası",
- "DeviceDetection": "Cihaz algılama",
- "DeviceModel": "Cihaz modeli",
- "DevicesDetection": "Ziyaretçi Cihazları",
- "DeviceType": "Cihaz tipi",
+ "Device": "Aygıt",
+ "DeviceBrand": "Aygıt markası",
+ "DeviceDetection": "Aygıt algılama",
+ "DeviceModel": "Aygıt modeli",
+ "DevicesDetection": "Ziyaretçi Aygıtları",
+ "DeviceType": "Aygıt türü",
"FeaturePhone": "Özellikli Telefon",
"OperatingSystemFamilies": "İşletim Sistemi aileleri",
"OperatingSystemFamily": "İşletim Sistemi Ailesi",
diff --git a/plugins/DevicesDetection/lang/uk.json b/plugins/DevicesDetection/lang/uk.json
index 48bdce15db..492de683ed 100644
--- a/plugins/DevicesDetection/lang/uk.json
+++ b/plugins/DevicesDetection/lang/uk.json
@@ -1,12 +1,44 @@
{
"DevicesDetection": {
- "BrowserEngine": "Веб-оглядач",
- "BrowserFamily": "Родина веб-оглядача",
- "Browsers": "Веб-оглядачі",
- "ColumnBrowser": "Веб-оглядач",
+ "BrowserEngine": "Движок браузера",
+ "BrowserEngineDocumentation": "Цей графік показує інформацію про браузери відвідувачів, розбиту на кшталт сімейства. %s Найбільш важлива інформація для веб-розробників - на якому движку працюють браузери відвідувачів. Значки містять ім'я движка в залежності від найбільш популярного браузера, який працює на цьому движку.",
+ "BrowserEngines": "Браузерні движки",
+ "BrowserFamily": "Сімейство браузерів",
+ "Browsers": "По браузерам",
+ "BrowserVersion": "Версія браузера",
+ "BrowserVersions": "Версії браузерів",
+ "Camera": "Камера",
+ "CarBrowser": "Автомобільний браузер",
+ "Software": "Програми",
+ "ColumnBrowser": "Браузер",
"ColumnOperatingSystem": "Операційна система",
+ "ColumnOperatingSystemVersion": "Версія операційної системи",
+ "Console": "Консоль",
+ "dataTableLabelBrands": "Фірма виробник",
+ "dataTableLabelModels": "Модель",
+ "dataTableLabelSystemVersion": "Версія операційної системи",
"dataTableLabelTypes": "Тип",
- "OperatingSystems": "Операційні системи",
- "WidgetBrowsers": "Веб-оглядачі відвідувачів"
+ "Device": "Пристрій",
+ "DeviceBrand": "Фірма-виробник пристрою",
+ "DeviceDetection": "Визначення пристроїв",
+ "DeviceModel": "Модель пристрою",
+ "DevicesDetection": "Пристрої відвідувачів",
+ "DeviceType": "Тип пристрою",
+ "FeaturePhone": "Особливість телефону",
+ "OperatingSystemFamilies": "Сімейства операційних систем",
+ "OperatingSystemFamily": "Тип операційної системи",
+ "OperatingSystems": "По операційним системам",
+ "OperatingSystemVersions": "Версії операційних систем",
+ "PluginDescription": "Надає розширену інформацію про пристрої користувача: бренд (виробник), модель (версія пристрою), тип пристрою (тв, консолі, смартфони, робоча станція та ін.) та ін.",
+ "SmartDisplay": "Смарт-дисплей",
+ "Smartphone": "Смартфон",
+ "PortableMediaPlayer": "Портативний медіа-плеєр",
+ "Devices": "Пристрої",
+ "Tablet": "Планшет",
+ "Phablet": "Фаблет",
+ "TV": "ТВ",
+ "UserAgent": "User-Agent",
+ "WidgetBrowsers": "Браузери відвідувачів",
+ "WidgetBrowsersDocumentation": "Цей звіт містить інформацію по браузерам, які використовують ваші відвідувачі. Кожна версія браузера відображається окремо."
}
} \ No newline at end of file
diff --git a/plugins/DevicesDetection/plugin.json b/plugins/DevicesDetection/plugin.json
deleted file mode 100644
index 5a522126b8..0000000000
--- a/plugins/DevicesDetection/plugin.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "authors": [
- {
- "name": "Piwik PRO",
- "homepage": "http://piwik.pro"
- }
- ]
-}
diff --git a/plugins/Diagnostics/Test/Integration/Commands/AnalyzeArchiveTableTest.php b/plugins/Diagnostics/Test/Integration/Commands/AnalyzeArchiveTableTest.php
index a60f0c0a19..6202bd22af 100644
--- a/plugins/Diagnostics/Test/Integration/Commands/AnalyzeArchiveTableTest.php
+++ b/plugins/Diagnostics/Test/Integration/Commands/AnalyzeArchiveTableTest.php
@@ -41,12 +41,12 @@ Statistics for the archive_numeric_2010_03 and archive_blob_2010_03 tables:
+-------------------------------------------+------------+---------------+-------------+---------+-----------+----------------+-------------+
| Group | # Archives | # Invalidated | # Temporary | # Error | # Segment | # Numeric Rows | # Blob Rows |
+-------------------------------------------+------------+---------------+-------------+---------+-----------+----------------+-------------+
-| week[2010-03-01 - 2010-03-07] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 36 | 63 |
-| month[2010-03-01 - 2010-03-31] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 36 | 63 |
+| week[2010-03-01 - 2010-03-07] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 36 | 64 |
+| month[2010-03-01 - 2010-03-31] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 36 | 64 |
| day[2010-03-03 - 2010-03-03] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 0 | 0 |
| day[2010-03-04 - 2010-03-04] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 0 | 0 |
| day[2010-03-05 - 2010-03-05] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 0 | 0 |
-| day[2010-03-06 - 2010-03-06] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 36 | 51 |
+| day[2010-03-06 - 2010-03-06] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 36 | 52 |
| day[2010-03-07 - 2010-03-07] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 0 | 0 |
| day[2010-03-08 - 2010-03-08] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 0 | 0 |
| week[2010-03-08 - 2010-03-14] idSite = 1 | 3 | 0 | 0 | 0 | 2 | 0 | 0 |
diff --git a/plugins/Diagnostics/lang/fr.json b/plugins/Diagnostics/lang/fr.json
index ffd3cffae6..5050b5a996 100644
--- a/plugins/Diagnostics/lang/fr.json
+++ b/plugins/Diagnostics/lang/fr.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "Fichier de configuration",
+ "ConfigFileIntroduction": "Ici vous pouvez visualiser la configuration de Piwik. Si vous exécutez Piwik depuis un environnement où la charge est répartie, la page peut être différente dépedamment du serveur depuis lequel la page est chargée. Les lignes avec une couleur de fond différentes représentent les valeurs de configuration modifiées qui sont spécifiées par exemple dans le fichier %1$s.",
+ "HideUnchanged": "Si vous souhaitez afficher uniquement les valeurs modifiées, vous pouvez cliquer sur %1$smasquer toutes les valeurs inchangées%2$s.",
"Sections": "Sections"
}
} \ No newline at end of file
diff --git a/plugins/Diagnostics/lang/nb.json b/plugins/Diagnostics/lang/nb.json
index 47a69e3d91..4360976279 100644
--- a/plugins/Diagnostics/lang/nb.json
+++ b/plugins/Diagnostics/lang/nb.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "Konfigurasjonsfil",
+ "ConfigFileIntroduction": "Her kan du se konfigurasjonen til Piwik. Hvis du kjører Piwik i et lastbalansert servermiljø, kan denne siden se ulik ut avhengig av hvilken server siden lastes fra. Rader med ulik bakgrunnsfarge er endrede konfigurasjonsverdier som er spesifisert i for eksempel %1$s.",
+ "HideUnchanged": "Hvis du kun vil se de endrede verdiene, kan du %1$sskjule alle uendrede verdier%2$s.",
"Sections": "Seksjoner"
}
} \ No newline at end of file
diff --git a/plugins/Diagnostics/lang/nl.json b/plugins/Diagnostics/lang/nl.json
new file mode 100644
index 0000000000..15f12486b5
--- /dev/null
+++ b/plugins/Diagnostics/lang/nl.json
@@ -0,0 +1,6 @@
+{
+ "Diagnostics": {
+ "ConfigFileTitle": "Configuratiebestand",
+ "Sections": "Secties"
+ }
+} \ No newline at end of file
diff --git a/plugins/Diagnostics/lang/sv.json b/plugins/Diagnostics/lang/sv.json
index 25fe2ba0c6..aa04dc4e7b 100644
--- a/plugins/Diagnostics/lang/sv.json
+++ b/plugins/Diagnostics/lang/sv.json
@@ -1,5 +1,8 @@
{
"Diagnostics": {
- "ConfigFileTitle": "Konfigurationsfil"
+ "ConfigFileTitle": "Konfigurationsfil",
+ "ConfigFileIntroduction": "Här kan du se Piwiks konfiguration. Om du kör Piwik i en lastbalanserad miljö så kan sidan se annorlunda ut beroende på vilken server som sidan laddas ifrån. De rader som har en annorlunda bakgrundsfärg är ändrade konfigurationsvärden som specificeras i exempelvis filen %1$s.",
+ "HideUnchanged": "Om du vill se endast ändrade värden så kan du %1$s dölja alla oförändrade värden%2$s.",
+ "Sections": "Sektioner"
}
} \ No newline at end of file
diff --git a/plugins/Diagnostics/lang/uk.json b/plugins/Diagnostics/lang/uk.json
new file mode 100644
index 0000000000..41ff95413c
--- /dev/null
+++ b/plugins/Diagnostics/lang/uk.json
@@ -0,0 +1,8 @@
+{
+ "Diagnostics": {
+ "ConfigFileTitle": "Файл конфігурації",
+ "ConfigFileIntroduction": "Тут ви можете подивитися конфігурацію Piwik. Якщо ви запускаєте Piwik в середовищі зі збалансованим навантаження, сторінка може бути різною в залежності від сервера, з якого ця сторінка завантажується. Ряди з різними кольорами фону - це змінені значення конфігурації, які описані, наприклад в файлі %1$s.",
+ "HideUnchanged": "Якщо ви хочете бачити тільки змінені значення, ви можете %1$sзаховати всі незмінені значення%2$s.",
+ "Sections": "Розділи"
+ }
+} \ No newline at end of file
diff --git a/plugins/Ecommerce/lang/da.json b/plugins/Ecommerce/lang/da.json
index 4d27481ba7..7db3b0c5cd 100644
--- a/plugins/Ecommerce/lang/da.json
+++ b/plugins/Ecommerce/lang/da.json
@@ -1,5 +1,8 @@
{
"Ecommerce": {
- "Sales": "Salg"
+ "PluginDescription": "E-handel lader dig registrere når en kunde tilføjer en vare til kurven og når de udfører et køb. Man kan også registrere når der bliver set på varer og kategorier og når en handel afbrydes.",
+ "Sales": "Salg",
+ "SalesBy": "Salg af %s",
+ "SalesAdjective": "Salg %s"
}
} \ No newline at end of file
diff --git a/plugins/Ecommerce/lang/ru.json b/plugins/Ecommerce/lang/ru.json
index 8a35e7800e..98a46f81fa 100644
--- a/plugins/Ecommerce/lang/ru.json
+++ b/plugins/Ecommerce/lang/ru.json
@@ -1,5 +1,6 @@
{
"Ecommerce": {
+ "PluginDescription": "Ecommerce позволяет вам отслеживать, когда пользователи добавляют продукты в корзины, и когда они преобразовываются в распродажу ecommerce. Также отслеживайте просмотр продуктов и категорий продуктов, и оставленные корзины.",
"Sales": "Продажи"
}
} \ No newline at end of file
diff --git a/plugins/Ecommerce/lang/sq.json b/plugins/Ecommerce/lang/sq.json
index 005f58ccb9..0b7be266d9 100644
--- a/plugins/Ecommerce/lang/sq.json
+++ b/plugins/Ecommerce/lang/sq.json
@@ -1,6 +1,8 @@
{
"Ecommerce": {
+ "PluginDescription": "Etregtia ju lejon të ndiqni se kur përdoruesit shtojnë produkte në shporta, dhe kur ato shndërrohen në shitje etregtie. Ajo ndjek gjithashtu parje produktesh dhe kategorish produktesh dhe shporta të braktisura.",
"Sales": "Shitje",
+ "SalesBy": "Shitje nga %s",
"SalesAdjective": "Shitje %s"
}
} \ No newline at end of file
diff --git a/plugins/Ecommerce/lang/sv.json b/plugins/Ecommerce/lang/sv.json
index 9289b96b23..0e43f8601d 100644
--- a/plugins/Ecommerce/lang/sv.json
+++ b/plugins/Ecommerce/lang/sv.json
@@ -1,5 +1,6 @@
{
"Ecommerce": {
+ "PluginDescription": "E-handel möjliggör för dig att spåra när en användare lägger till produkter i varukorgen och när de konverterar till en e-handelsförsäljning. Du kan även spåra visningar av produkter och produktkategorier samt övergivna varukorgar.",
"Sales": "Försäljning",
"SalesBy": "Försäljning genom %s",
"SalesAdjective": "Försäljning %s"
diff --git a/plugins/Ecommerce/lang/tr.json b/plugins/Ecommerce/lang/tr.json
new file mode 100644
index 0000000000..5892238eae
--- /dev/null
+++ b/plugins/Ecommerce/lang/tr.json
@@ -0,0 +1,8 @@
+{
+ "Ecommerce": {
+ "PluginDescription": "E-ticaret kullanıcıların ürünleri sepete atmalarının ve satın almalarının izlenmesini sağlar. Ayrıca ürün, ürün kategorileri görünümü ve iptal edilen sepetleri de izler.",
+ "Sales": "Satışlar",
+ "SalesBy": "%s bazında satışlar",
+ "SalesAdjective": "Satışlar %s"
+ }
+} \ No newline at end of file
diff --git a/plugins/Ecommerce/lang/uk.json b/plugins/Ecommerce/lang/uk.json
new file mode 100644
index 0000000000..9ada208f27
--- /dev/null
+++ b/plugins/Ecommerce/lang/uk.json
@@ -0,0 +1,8 @@
+{
+ "Ecommerce": {
+ "PluginDescription": "Електронна комерція дозволяє відстежувати, коли користувачі додали товар у кошик, і що вони хочуть придбати. Також відстежуються продукти і категорії продуктів і кинуті кошики.",
+ "Sales": "Продажі",
+ "SalesBy": "Продано %s",
+ "SalesAdjective": "Продажів %s"
+ }
+} \ No newline at end of file
diff --git a/plugins/Events/lang/ar.json b/plugins/Events/lang/ar.json
new file mode 100644
index 0000000000..55b9583283
--- /dev/null
+++ b/plugins/Events/lang/ar.json
@@ -0,0 +1,8 @@
+{
+ "Events": {
+ "Event": "حَدَث",
+ "TotalEventsDocumentation": "عدد الأحداث الإجمالي",
+ "TotalValueDocumentation": "مجموع قيم الأحداث",
+ "ViewEvents": "عرض الأحداث"
+ }
+} \ No newline at end of file
diff --git a/plugins/Events/lang/da.json b/plugins/Events/lang/da.json
index 6ba733e87c..fa44cc16f8 100644
--- a/plugins/Events/lang/da.json
+++ b/plugins/Events/lang/da.json
@@ -1,5 +1,6 @@
{
"Events": {
+ "PluginDescription": "Spor begivenheder og få rapporter om dine besøgendes aktiviteter.",
"AvgEventValue": "Genomsnitlig værdi for hændelsen er: %s",
"AvgValue": "Gennemsnitsværdi",
"AvgValueDocumentation": "Gennemsnittet af alle værdier for denne hændelse",
diff --git a/plugins/Events/lang/it.json b/plugins/Events/lang/it.json
index da44c8b0b3..8c47835461 100644
--- a/plugins/Events/lang/it.json
+++ b/plugins/Events/lang/it.json
@@ -15,7 +15,7 @@
"EventsWithValue": "Eventi con un valore",
"EventsWithValueDocumentation": "Numero di eventi dove è stato impostato un valore Evento",
"EventValue": "Valore Evento",
- "EventValueTooltip": "Il valore totale Evento è la somma dei %1$s valori eventi %2$s tra un minimo di %3$s e un massimo di %4$s.",
+ "EventValueTooltip": "Il valore totale Evento è la somma dei %1$s valori degli eventi %2$s tra un minimo di %3$s e un massimo di %4$s.",
"MaxValue": "Valore massimo",
"MaxValueDocumentation": "Valore massimo per questo evento",
"MinValue": "Valore minimo",
diff --git a/plugins/Events/lang/uk.json b/plugins/Events/lang/uk.json
new file mode 100644
index 0000000000..d6d23a28aa
--- /dev/null
+++ b/plugins/Events/lang/uk.json
@@ -0,0 +1,32 @@
+{
+ "Events": {
+ "PluginDescription": "Відстежуйте події і отримуйте звіти про активність своїх відвідувачів.",
+ "AvgEventValue": "Середнє значення події: %s",
+ "AvgValue": "Середнє значення",
+ "AvgValueDocumentation": "Середнє всіх значень для цієї події",
+ "Event": "Подія",
+ "EventAction": "Дія події",
+ "EventActions": "Дії подій",
+ "EventCategories": "Категорії подій",
+ "EventCategory": "Категорія події",
+ "EventName": "Назва події",
+ "EventNames": "Назви подій",
+ "Events": "Події",
+ "EventsWithValue": "Події зі значенням",
+ "EventsWithValueDocumentation": "Кількість подій, де було встановлено значення для Події",
+ "EventValue": "Значення події",
+ "EventValueTooltip": "Загальні значення подій дорівнюють сумі %1$s значенням (подій) %2$s між мінімумом %3$s і максимумом %4$s.",
+ "MaxValue": "Максимальне значення",
+ "MaxValueDocumentation": "Максимальна значення для цієї події",
+ "MinValue": "Мінімальне значення",
+ "MinValueDocumentation": "Мінімальне значення для цієї події",
+ "SecondaryDimension": "Вторичний вимір %s.",
+ "SwitchToSecondaryDimension": "Переключитися на %s",
+ "TopEvents": "Топ подій",
+ "TotalEvents": "Усього подій",
+ "TotalEventsDocumentation": "Загальна кількість подій",
+ "TotalValue": "Загальне значення",
+ "TotalValueDocumentation": "Сума значень подій",
+ "ViewEvents": "Перегляд подій"
+ }
+} \ No newline at end of file
diff --git a/plugins/ExamplePlugin/README.md b/plugins/ExamplePlugin/README.md
index f7d91416bb..c9c3266859 100644
--- a/plugins/ExamplePlugin/README.md
+++ b/plugins/ExamplePlugin/README.md
@@ -13,7 +13,3 @@ My answer
## Changelog
Here goes the changelog text.
-
-## Support
-
-Please direct any feedback to ...
diff --git a/plugins/ExamplePlugin/Updates/0.0.2.php b/plugins/ExamplePlugin/Updates/0.0.2.php
index 31f8dd192a..817d37d66e 100644
--- a/plugins/ExamplePlugin/Updates/0.0.2.php
+++ b/plugins/ExamplePlugin/Updates/0.0.2.php
@@ -56,7 +56,7 @@ class Updates_0_0_2 extends PiwikUpdates
/**
* Perform the incremental version update.
*
- * This method should preform all updating logic. If you define queries in the `getMigrations()` method,
+ * This method should perform all updating logic. If you define queries in the `getMigrations()` method,
* you must call {@link Updater::executeMigrations()} here.
*
* @param Updater $updater
diff --git a/plugins/ExamplePlugin/plugin.json b/plugins/ExamplePlugin/plugin.json
index 71f81fb70d..fa71469815 100644
--- a/plugins/ExamplePlugin/plugin.json
+++ b/plugins/ExamplePlugin/plugin.json
@@ -4,7 +4,7 @@
"description": "Piwik Platform showcase: how to create widgets, menus, scheduled tasks, a custom archiver, plugin tests, and a AngularJS component.",
"theme": false,
"require": {
- "piwik": ">=PIWIK_VERSION"
+ "piwik": ">=PIWIK_VERSION,<3.0.0-b1"
},
"authors": [
{
@@ -13,7 +13,17 @@
"homepage": ""
}
],
+ "support": {
+ "email": "",
+ "issues": "",
+ "forum": "",
+ "irc": "",
+ "wiki": "",
+ "source": "",
+ "docs": "",
+ "rss": ""
+ },
"homepage": "",
"license": "GPL v3+",
"keywords": []
-} \ No newline at end of file
+}
diff --git a/plugins/ExampleTheme/README.md b/plugins/ExampleTheme/README.md
index 8dce581531..de7cfecaa1 100644
--- a/plugins/ExampleTheme/README.md
+++ b/plugins/ExampleTheme/README.md
@@ -12,8 +12,3 @@ My answer
## Changelog
Here goes the changelog text.
-
-## Support
-
-Please direct any feedback to ...
-
diff --git a/plugins/ExampleTheme/plugin.json b/plugins/ExampleTheme/plugin.json
index 7f486d6ddf..92b17918ec 100644
--- a/plugins/ExampleTheme/plugin.json
+++ b/plugins/ExampleTheme/plugin.json
@@ -3,10 +3,23 @@
"description": "Piwik Platform showcase: example of how to create a simple Theme.",
"version": "0.1.0",
"theme": true,
+ "require": {
+ "piwik": ">=PIWIK_VERSION,<3.0.0-b1"
+ },
"stylesheet": "stylesheets/theme.less",
"homepage": "",
"license": "GPL v3+",
"keywords": [],
+ "support": {
+ "email": "",
+ "issues": "",
+ "forum": "",
+ "irc": "",
+ "source": "",
+ "docs": "",
+ "wiki": "",
+ "rss": ""
+ },
"authors": [
{
"name": "",
@@ -14,4 +27,4 @@
"homepage": ""
}
]
-} \ No newline at end of file
+}
diff --git a/plugins/ExampleTracker/Columns/ExampleConversionDimension.php b/plugins/ExampleTracker/Columns/ExampleConversionDimension.php
index 3e24008449..ea780abbd3 100644
--- a/plugins/ExampleTracker/Columns/ExampleConversionDimension.php
+++ b/plugins/ExampleTracker/Columns/ExampleConversionDimension.php
@@ -20,7 +20,7 @@ use Piwik\Tracker\GoalManager;
/**
* This example dimension counts achievement points for each user. A user gets one achievement point for each action
* plus five extra achievement points for each conversion. This would allow you to create a ranking showing the most
- * active/valueable users. It is just an example, you can log pretty much everything and even just store any custom
+ * active/valuable users. It is just an example, you can log pretty much everything and even just store any custom
* request url property. Please note that dimension instances are usually cached during one tracking request so they
* should be stateless (meaning an instance of this dimension will be reused if requested multiple times).
*
diff --git a/plugins/ExampleTracker/Columns/ExampleVisitDimension.php b/plugins/ExampleTracker/Columns/ExampleVisitDimension.php
index d47d98eb59..f0d28b66da 100644
--- a/plugins/ExampleTracker/Columns/ExampleVisitDimension.php
+++ b/plugins/ExampleTracker/Columns/ExampleVisitDimension.php
@@ -18,7 +18,7 @@ use Piwik\Tracker\Action;
/**
* This example dimension counts achievement points for each user. A user gets one achievement point for each action
* plus five extra achievement points for each conversion. This would allow you to create a ranking showing the most
- * active/valueable users. It is just an example, you can log pretty much everything and even just store any custom
+ * active/valuable users. It is just an example, you can log pretty much everything and even just store any custom
* request url property. Please note that dimension instances are usually cached during one tracking request so they
* should be stateless (meaning an instance of this dimension will be reused if requested multiple times).
*
diff --git a/plugins/Feedback/lang/cs.json b/plugins/Feedback/lang/cs.json
index bda47c8959..3cd43a1eb8 100644
--- a/plugins/Feedback/lang/cs.json
+++ b/plugins/Feedback/lang/cs.json
@@ -19,15 +19,11 @@
"ViewUserGuides": "Naučte se, jak konfigurovat Piwik a efektivně analyzovat data s našimi %1$suživatelskými příručkami%2$s",
"CommunityHelp": "Komunitní pomoc",
"ProfessionalHelp": "Profesionální pomoc",
- "PiwikProIntro": "Piwik Pro poskytuje konzultace s experty pro ty, kteří hostují Piwik na vlastní infrastruktuře.",
- "PiwikProOfferIntro": "Naše nabídka obsahuje",
- "PiwikProReviewPiwikSetup": "Kontrolu vašeho nastavení Piwik",
- "PiwikProOptimizationMaintenance": "Služby optimalizace a údržby Piwiku",
- "PiwikProPhoneEmailSupport": "Telefonická a e-mailová podpora",
- "PiwikProTraining": "Uživatelská, technická a vývojářská školení",
- "PiwikProPremiumFeatures": "Prémiové funkce",
- "PiwikProCustomDevelopment": "Služby vlastního vývoje",
- "PiwikProAnalystConsulting": "Služby analytického konzultanta",
+ "ProfessionalServicesReviewPiwikSetup": "Kontrola vaší instalace Piwiku",
+ "ProfessionalServicesPhoneEmailSupport": "Telefonická a e-mailová podpora",
+ "ProfessionalServicesTraining": "Školení uživatelů, techniků a vývoářů",
+ "ProfessionalServicesPremiumFeatures": "Prémiové funkce",
+ "ProfessionalServicesAnalystConsulting": "Služby konzultace analytika",
"ContactUs": "Kontaktujte nás",
"VisitTheForums": "Navštivte %1$s fóra%2$s a nechte si pomoci komunitou uživatelů aplikace Piwik"
}
diff --git a/plugins/Feedback/lang/de.json b/plugins/Feedback/lang/de.json
index 8d40755793..4e815199e5 100644
--- a/plugins/Feedback/lang/de.json
+++ b/plugins/Feedback/lang/de.json
@@ -19,15 +19,15 @@
"ViewUserGuides": "Lernen Sie mithilfe unseres %1$sBenutzerhandbuches%2$s, wie Sie Piwik konfigurieren können und wie Sie effektiv Ihre Daten analysieren.",
"CommunityHelp": "Hilfe aus der Community",
"ProfessionalHelp": "Profesionelle Hilfe",
- "PiwikProIntro": "Piwik PRO bietet professionellen Support und Beratung an für Kunden, welche Piwik auf deren eigenen Infrastruktur hosten.",
- "PiwikProOfferIntro": "Unser Angebot umfasst",
- "PiwikProReviewPiwikSetup": "Eine Überprüfung Ihrer Piwik-Installation",
- "PiwikProOptimizationMaintenance": "Piwik-Optimierung & -Wartung",
- "PiwikProPhoneEmailSupport": "Telefon und E-Mail-Support",
- "PiwikProTraining": "Benutzer-, Technik- und Entwickler-Schulungen",
- "PiwikProPremiumFeatures": "Premiumfeatures",
- "PiwikProCustomDevelopment": "Individuelle Programmierung",
- "PiwikProAnalystConsulting": "Analysenberatung",
+ "ProfessionalServicesIntro": "Unser weltweites Netzwerk von professionellen Beratern für Piwik unterstützt Kunden die Piwik auf ihrer eigenen Infrastruktur betreiben wollen.",
+ "ProfessionalServicesOfferIntro": "Von welchen Diensten können Sie profitieren?",
+ "ProfessionalServicesReviewPiwikSetup": "Eine Überprüfung Ihrer Piwik-Installation",
+ "ProfessionalServicesOptimizationMaintenance": "Piwik-Optimierung & -Wartung",
+ "ProfessionalServicesPhoneEmailSupport": "Telefon und E-Mail-Support",
+ "ProfessionalServicesTraining": "Benutzer-, Technik- und Entwickler-Schulungen",
+ "ProfessionalServicesPremiumFeatures": "Premium Funktionen",
+ "ProfessionalServicesCustomDevelopment": "Individuelle Programmierung",
+ "ProfessionalServicesAnalystConsulting": "Analysenberatung",
"ContactUs": "Kontaktieren Sie uns",
"VisitTheForums": "Besuchen Sie die %1$s Foren%2$s und erhalten Sie Hilfe von der Piwik Community"
}
diff --git a/plugins/Feedback/lang/el.json b/plugins/Feedback/lang/el.json
index d8a6176309..7156100142 100644
--- a/plugins/Feedback/lang/el.json
+++ b/plugins/Feedback/lang/el.json
@@ -19,15 +19,15 @@
"ViewUserGuides": "Μάθετε πως να παραμετροποιείτε το Piwik και να αναλύετε αποτελεσματικά τα δεδομένα σας με τους %1$sοδηγούς χρήση μας%2$s.",
"CommunityHelp": "Βοήθεια από την κοινότητα",
"ProfessionalHelp": "Βοήθεια από επαγγελματίες",
- "PiwikProIntro": "Το Piwik PRO παρέχει υποστήριξη από ειδικούς και συμβουλές σε πελάτες που τρέχουν το Piwik στη δική τους υποδομή.",
- "PiwikProOfferIntro": "Η προσφορά μας καλύπτει",
- "PiwikProReviewPiwikSetup": "Μια σύνοψη της εγκατάστασης του Piwik σας",
- "PiwikProOptimizationMaintenance": "Βελτιστοποίηση του Piwik και υπηρεσίες συντήρησης",
- "PiwikProPhoneEmailSupport": "Τηλεφωνική και με e-mail υποστήριξη",
- "PiwikProTraining": "Εκπαίδευση για χρήστες, τεχνικούς και προγραμματιστές",
- "PiwikProPremiumFeatures": "Χαρακτηριστικά έκδοσης επί πληρωμή",
- "PiwikProCustomDevelopment": "Προσαρμοσμένες υπηρεσίες ανάπτυξης",
- "PiwikProAnalystConsulting": "Υπηρεσίες συμβουλευτικής από αναλυτές",
+ "ProfessionalServicesIntro": "Το παγκόσμιο δίκτυό μας επαγγελματιών συμβούλων για υποστήριξη των πελατών του Piwik που φιλοξενούν το Piwik στη δική τους υποδομή.",
+ "ProfessionalServicesOfferIntro": "Από ποιές υπηρεσίες μπορείτε να κερδίσετε;",
+ "ProfessionalServicesReviewPiwikSetup": "Μια σύνοψη της εγκατάστασής σας του Piwik",
+ "ProfessionalServicesOptimizationMaintenance": "Βελτιστοποίηση του Piwik και υπηρεσίες συντήρησης",
+ "ProfessionalServicesPhoneEmailSupport": "Τηλεφωνική και μέσω e-mail υποστήριξη",
+ "ProfessionalServicesTraining": "Εκπαίδευση σε χρηστικό, τεχνικό και προγραμματιστικό επίπεδο",
+ "ProfessionalServicesPremiumFeatures": "Πρόσθετα χαρακτηριστικά",
+ "ProfessionalServicesCustomDevelopment": "Προσαρμοσμένες υπηρεσίες ανάπτυξης",
+ "ProfessionalServicesAnalystConsulting": "Υπηρεσίες συμβουλευτικής αναλυτικών",
"ContactUs": "Επικοινωνήστε μαζί μας",
"VisitTheForums": "Δείτε τα %1$sΦόρουμ%2$s και λάβετε βοήθεια από την κοινότητα χρηστών του Piwik"
}
diff --git a/plugins/Feedback/lang/en.json b/plugins/Feedback/lang/en.json
index 4d55bcfe7a..d16f70a86b 100644
--- a/plugins/Feedback/lang/en.json
+++ b/plugins/Feedback/lang/en.json
@@ -19,15 +19,15 @@
"ViewUserGuides": "Learn how to configure Piwik and how to effectively analyze your data with our %1$suser guides%2$s",
"CommunityHelp": "Community Help",
"ProfessionalHelp": "Professional Help",
- "PiwikProIntro": "Piwik PRO provides expert support and consulting to clients who host Piwik on their own infrastructure.",
- "PiwikProOfferIntro": "Our offer includes",
- "PiwikProReviewPiwikSetup": "A review of your Piwik setup",
- "PiwikProOptimizationMaintenance": "Piwik optimization & maintenance services",
- "PiwikProPhoneEmailSupport": "Phone and Email support",
- "PiwikProTraining": "User, Technical and Developer training",
- "PiwikProPremiumFeatures": "Premium features",
- "PiwikProCustomDevelopment": "Custom Development services",
- "PiwikProAnalystConsulting": "Analyst consulting services",
+ "ProfessionalServicesIntro": "Our worldwide network of professional consultants for Piwik support clients who host Piwik on their own infrastructure.",
+ "ProfessionalServicesOfferIntro": "What services can you benefit from?",
+ "ProfessionalServicesReviewPiwikSetup": "A review of your Piwik setup",
+ "ProfessionalServicesOptimizationMaintenance": "Piwik optimization & maintenance services",
+ "ProfessionalServicesPhoneEmailSupport": "Phone and Email support",
+ "ProfessionalServicesTraining": "User, Technical and Developer training",
+ "ProfessionalServicesPremiumFeatures": "Premium features",
+ "ProfessionalServicesCustomDevelopment": "Custom Development services",
+ "ProfessionalServicesAnalystConsulting": "Analyst consulting services",
"ContactUs": "Contact us",
"VisitTheForums": "Visit the %1$s Forums%2$s and get help from the community of Piwik users"
}
diff --git a/plugins/Feedback/lang/es.json b/plugins/Feedback/lang/es.json
index 1dc66dfd09..043c642780 100644
--- a/plugins/Feedback/lang/es.json
+++ b/plugins/Feedback/lang/es.json
@@ -19,15 +19,14 @@
"ViewUserGuides": "Aprende a configurar Piwik y analizar sus datos de modo eficaz con nuestras %1$sguías de usuario%2$s",
"CommunityHelp": "Ayuda comunitaria",
"ProfessionalHelp": "Ayuda profesional",
- "PiwikProIntro": "Piwik PRO proporciona soporte de calidad y consultas a clientes que alojan Piwik en su propia infraestructura.",
- "PiwikProOfferIntro": "Nuestra oferta incluye",
- "PiwikProReviewPiwikSetup": "Una reseña de tu instalación de Piwik",
- "PiwikProOptimizationMaintenance": "Servicios de optimización y mantenimiento de Piwik",
- "PiwikProPhoneEmailSupport": "Soporte por teléfono y correo electrónico",
- "PiwikProTraining": "Entrenamiento del usuario, técnico y desarrollador",
- "PiwikProPremiumFeatures": "Funcionalidades premium",
- "PiwikProCustomDevelopment": "Servicios de desarrollo personalizado",
- "PiwikProAnalystConsulting": "Servicios de consultoría de análisis",
+ "ProfessionalServicesIntro": "Nuestra red mundial de consultores profesionales que brindan asistencia a todos los clientes que hospedan Piwik en su propia infraestructura.",
+ "ProfessionalServicesOfferIntro": "¿Qué servicios puede beneficiarse?",
+ "ProfessionalServicesReviewPiwikSetup": "Reseña de su instalación Piwik",
+ "ProfessionalServicesPhoneEmailSupport": "Asistencia por teléfono y correo electrónico",
+ "ProfessionalServicesTraining": "Usuario, técnico y entrenamiento del desarrollador",
+ "ProfessionalServicesPremiumFeatures": "Funciones premium",
+ "ProfessionalServicesCustomDevelopment": "Servicios de desarrollo personalizado",
+ "ProfessionalServicesAnalystConsulting": "Servicios de consultoría de análisis",
"ContactUs": "Contáctanos",
"VisitTheForums": "Visita el %1$sForo%2$s y obtenga ayuda de la comuniad de usuarios Piwik"
}
diff --git a/plugins/Feedback/lang/fi.json b/plugins/Feedback/lang/fi.json
index f665cbf2da..a75edab6ab 100644
--- a/plugins/Feedback/lang/fi.json
+++ b/plugins/Feedback/lang/fi.json
@@ -13,9 +13,6 @@
"TopLinkTooltip": "Kerro meille mitä ajattelet, tai osta tukipalveluita (englanniksi).",
"CommunityHelp": "Yhteisön apu",
"ProfessionalHelp": "Ammattilaisapu",
- "PiwikProReviewPiwikSetup": "Piwik-asennuksesi arviointi",
- "PiwikProPhoneEmailSupport": "Puhelin- ja sähköpostituki",
- "PiwikProPremiumFeatures": "Premium-ominaisuudet",
"ContactUs": "Ota yhteyttä"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/fr.json b/plugins/Feedback/lang/fr.json
index 0df0bf5e6b..a24c577888 100644
--- a/plugins/Feedback/lang/fr.json
+++ b/plugins/Feedback/lang/fr.json
@@ -19,15 +19,16 @@
"ViewUserGuides": "Apprenez comment configurer Piwik et comment analyser de manière efficaces vos données avec notre %1$sguide utilisateur%2$s",
"CommunityHelp": "Aide de la communauté",
"ProfessionalHelp": "Aide professionnelle",
- "PiwikProIntro": "Piwik PRO fournit un service expert de support et de consultation aux clients qui hébergent Piwik sur leurs propres infrastructures.",
- "PiwikProOfferIntro": "Notre offre inclut",
- "PiwikProReviewPiwikSetup": "Une revue de votre installation Piwik",
- "PiwikProOptimizationMaintenance": "Services d'optimisation et de maintenance",
- "PiwikProPhoneEmailSupport": "Support courriel et téléphonique",
- "PiwikProTraining": "Formation d'utilisation, technique et en développement",
- "PiwikProPremiumFeatures": "Fonctionnalités premium",
- "PiwikProCustomDevelopment": "Services de développement personnalisés",
- "PiwikProAnalystConsulting": "Services de consultation en analyse",
- "ContactUs": "Nous contacter"
+ "ProfessionalServicesIntro": "Notre réseau mondial de consultants professionnels Piwik supporte nos clients qui hébergent Piwik sur leurs propres infrastructures.",
+ "ProfessionalServicesOfferIntro": "De quel services pouvez vous bénéficier?",
+ "ProfessionalServicesReviewPiwikSetup": "Une revue de votre installation Piwik",
+ "ProfessionalServicesOptimizationMaintenance": "Services d'optimisation et de maintenance pour Piwik",
+ "ProfessionalServicesPhoneEmailSupport": "Support courriel et téléphonique",
+ "ProfessionalServicesTraining": "Formation d'utilisation, technique et en développement",
+ "ProfessionalServicesPremiumFeatures": "Fonctionnalités premium",
+ "ProfessionalServicesCustomDevelopment": "Services de développement personnalisés",
+ "ProfessionalServicesAnalystConsulting": "Services de consultation en analyse",
+ "ContactUs": "Nous contacter",
+ "VisitTheForums": "Visitez les %1$sForums%2$s et obtenez de l'aide de la communauté d'utilisateurs Piwik."
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/it.json b/plugins/Feedback/lang/it.json
index 19028736b1..744d638340 100644
--- a/plugins/Feedback/lang/it.json
+++ b/plugins/Feedback/lang/it.json
@@ -19,16 +19,16 @@
"ViewUserGuides": "Impara a configurare Piwik e ad analizzare efficacemente i tuoi dati con le nostre %1$sguide utente%2$s",
"CommunityHelp": "Aiuto dalla comunità",
"ProfessionalHelp": "Aiuto professionale",
- "PiwikProIntro": "Piwik PRO fornisce il supporto di esperti e consulenza ai clienti che installano Piwik nella propria infrastruttura",
- "PiwikProOfferIntro": "La nostra offerta include",
- "PiwikProReviewPiwikSetup": "Analisi della tua installazione Piwik",
- "PiwikProOptimizationMaintenance": "Servizi di manutenzione e ottimizzazione di Piwik",
- "PiwikProPhoneEmailSupport": "Supporto telefonico ed email",
- "PiwikProTraining": "Corsi per utenti, tecnici e sviluppatori",
- "PiwikProPremiumFeatures": "Funzionalità esclusive",
- "PiwikProCustomDevelopment": "Sviluppo personalizzato su commissione",
- "PiwikProAnalystConsulting": "Consulenza di analisti",
+ "ProfessionalServicesIntro": "La nostra rete mondiale di consulenti professionali per l'assistenza a Piwik ai clienti che ospitano Piwik in infrastrutture proprie.",
+ "ProfessionalServicesOfferIntro": "Di quali servizi potete beneficiare?",
+ "ProfessionalServicesReviewPiwikSetup": "Un'analisi della configurazione di Piwik",
+ "ProfessionalServicesOptimizationMaintenance": "Servizi per l'ottimizzazione e la manutenzione di Piwik",
+ "ProfessionalServicesPhoneEmailSupport": "Assistenza Telefonica ed Email",
+ "ProfessionalServicesTraining": "Formazione per Utenti, Tecnici e Sviluppatori",
+ "ProfessionalServicesPremiumFeatures": "Funzionalità Premium",
+ "ProfessionalServicesCustomDevelopment": "Servizi di sviluppo per il cliente",
+ "ProfessionalServicesAnalystConsulting": "Servizi di Consulenza per analisti",
"ContactUs": "Contattaci",
- "VisitTheForums": "Visita i %1$s Forum%2$s e ottieni aiuto dalla comunità degli utenti Piwik"
+ "VisitTheForums": "Visita il %1$s Forum%2$s e ottieni aiuto dalla comunità degli utenti Piwik"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/ja.json b/plugins/Feedback/lang/ja.json
index f43ceade9a..e4362e0eac 100644
--- a/plugins/Feedback/lang/ja.json
+++ b/plugins/Feedback/lang/ja.json
@@ -19,15 +19,6 @@
"ViewUserGuides": "Piwik の設定方法と、効果的なデータ分析方法は、%1$s user guides %2$s をご確認ください。",
"CommunityHelp": "コミュニティヘルプ",
"ProfessionalHelp": "プロフェッショナルヘルプ",
- "PiwikProIntro": "Piwik PRO は、専門家のサポートと Piwik 独自のインフラストラクチャ上でホストするクライアントへのコンサルティングを提供します。",
- "PiwikProOfferIntro": "当社オファーには以下が含まれます",
- "PiwikProReviewPiwikSetup": "Piwik セットアップのレビュー",
- "PiwikProOptimizationMaintenance": "Piwikiの最適化と保守のサービス",
- "PiwikProPhoneEmailSupport": "電話とEメールのサポート",
- "PiwikProTraining": "ユーザー及び技術開発者のトレーニング",
- "PiwikProPremiumFeatures": "プレミア機能",
- "PiwikProCustomDevelopment": "カスタム開発サービス",
- "PiwikProAnalystConsulting": "アナリストのコンサルティングサービス",
"ContactUs": "お問い合わせ",
"VisitTheForums": "%1$s フォーラム %2$s にアクセスし、Piwik ユーザーのコミュニティから助けを得る"
}
diff --git a/plugins/Feedback/lang/ka.json b/plugins/Feedback/lang/ka.json
index b4a46d99ed..478c9a605b 100644
--- a/plugins/Feedback/lang/ka.json
+++ b/plugins/Feedback/lang/ka.json
@@ -2,10 +2,10 @@
"Feedback": {
"DoYouHaveBugReportOrFeatureRequest": "არ გაქვთ შეცდომის რეპორტი ან მახასიათებლების მოთხოვნა?",
"IWantTo": "მე მინდა:",
- "LearnWaysToParticipate": "გაეცანით ინფორმაციას %s მონაწილეობის%s მიღების ყველა გზის შესახებ",
+ "LearnWaysToParticipate": "გაეცანით ინფორმაციას %1$s მონაწილეობის%2$s მიღების ყველა გზის შესახებ",
"ManuallySendEmailTo": "გთხოვთ, ხელით გამოაგზავნეთ წერილი მისამართზე",
"SendFeedback": "გამოხმაურების გაგზავნა",
"ThankYou": "გმადლობთ, რომ გვეხმარებით Piwik გახდეს უკეთესი!",
- "VisitTheForums": "იხილეთ %s ფორუმები%s"
+ "VisitTheForums": "იხილეთ %1$s ფორუმები%2$s"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/ko.json b/plugins/Feedback/lang/ko.json
index d7e0c317ed..f77068beac 100644
--- a/plugins/Feedback/lang/ko.json
+++ b/plugins/Feedback/lang/ko.json
@@ -19,15 +19,6 @@
"ViewUserGuides": "%1$s사용자 가이드%2$s에서 효율적으로 당신의 데이터를 분석하는 방법과 Piwik를 구성하는 법에 대해서 알 수 있습니다.",
"CommunityHelp": "커뮤니티에서의 도움",
"ProfessionalHelp": "전문가의 도움",
- "PiwikProIntro": "Piwik PRO는 전문가들이 구축한 인프라에서 그들의 지원과 컨설팅을 받을 수 있는 서비스입니다.",
- "PiwikProOfferIntro": "제공되는 것들",
- "PiwikProReviewPiwikSetup": "Piwik 셋업",
- "PiwikProOptimizationMaintenance": "Piwik 최적화 및 관리 보수",
- "PiwikProPhoneEmailSupport": "전화 및 이메일",
- "PiwikProTraining": "사용자, 기술자 및 개발자",
- "PiwikProPremiumFeatures": "프리미엄",
- "PiwikProCustomDevelopment": "맞춤 개발",
- "PiwikProAnalystConsulting": "전문가 컨설팅",
"ContactUs": "연락주세요"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/nb.json b/plugins/Feedback/lang/nb.json
index d9d4847674..f268816761 100644
--- a/plugins/Feedback/lang/nb.json
+++ b/plugins/Feedback/lang/nb.json
@@ -10,11 +10,6 @@
"ThankYou": "Takk for at du hjelper oss å lage Piwik bedre!",
"TopLinkTooltip": "Fortell oss hva du synes eller be om profesjonell støtte.",
"ProfessionalHelp": "Profesjonell hjelp",
- "PiwikProOfferIntro": "Vårt tilbud inkluderer",
- "PiwikProOptimizationMaintenance": "Piwik optimalisering- og vedlikeholdstjenester",
- "PiwikProPhoneEmailSupport": "Telefon og e-post-støtte",
- "PiwikProTraining": "Bruker, teknisk- og utviklertrening",
- "PiwikProPremiumFeatures": "Premium-funksjoner",
"ContactUs": "Kontakt oss"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/nl.json b/plugins/Feedback/lang/nl.json
index 6ce9e37d18..1c675ed085 100644
--- a/plugins/Feedback/lang/nl.json
+++ b/plugins/Feedback/lang/nl.json
@@ -19,15 +19,6 @@
"ViewUserGuides": "Leer hoe je Piwik moet configureren en hoe je data te analyseren met onze %1$sgebruikers handleidingen%2$s",
"CommunityHelp": "Hulp van de community",
"ProfessionalHelp": "Professionele Hulp",
- "PiwikProIntro": "Piwik Pro biedt je expert ondersteuning en consultants aan klanten die Piwik hosten op hun eigen infrastructuur.",
- "PiwikProOfferIntro": "Ons aanbod omvat",
- "PiwikProReviewPiwikSetup": "Een beoordeling van je Piwik omgeving",
- "PiwikProOptimizationMaintenance": "Piwik optimilaisatie & onderhoud diensten",
- "PiwikProPhoneEmailSupport": "Telefoon en e-mail ondersteuning",
- "PiwikProTraining": "Gebruikers- Technische en Ontwikkelaars training",
- "PiwikProPremiumFeatures": "Premium functies",
- "PiwikProCustomDevelopment": "Eigen Ontwikkel diensten",
- "PiwikProAnalystConsulting": "Analyst consultatie diensten",
"ContactUs": "Contacteer ons"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/pt-br.json b/plugins/Feedback/lang/pt-br.json
index a2d46aee7b..5200835190 100644
--- a/plugins/Feedback/lang/pt-br.json
+++ b/plugins/Feedback/lang/pt-br.json
@@ -19,15 +19,6 @@
"ViewUserGuides": "Saiba como configurar o Piwik e como efetivamente analisar seus dados com o nosso %1$sguias do usuário%2$s",
"CommunityHelp": "Ajuda da Comunidade",
"ProfessionalHelp": "Suporte Profissional",
- "PiwikProIntro": "Piwik PRO fornece suporte especializado e consultoria para clientes que hospedam Piwik em suas próprias infra-estruturas.",
- "PiwikProOfferIntro": "Nossa oferta inclui",
- "PiwikProReviewPiwikSetup": "Um exame da sua configuração Piwik",
- "PiwikProOptimizationMaintenance": "Serviços de otimização & manutenção Piwik",
- "PiwikProPhoneEmailSupport": "Suporte por telefone e e-mail",
- "PiwikProTraining": "Treinamento de Desenvolvedores, Técnicos e Usuários",
- "PiwikProPremiumFeatures": "Características Premium",
- "PiwikProCustomDevelopment": "Serviços de Desenvolvimento Personalizados",
- "PiwikProAnalystConsulting": "Serviços de Consulturia Analítica",
"ContactUs": "Contato",
"VisitTheForums": "Visite o %1$s Fóruns%2$s e obtenha ajuda da comunidade de usuários Piwik"
}
diff --git a/plugins/Feedback/lang/ru.json b/plugins/Feedback/lang/ru.json
index 941b17f2d9..f77cb215ee 100644
--- a/plugins/Feedback/lang/ru.json
+++ b/plugins/Feedback/lang/ru.json
@@ -18,15 +18,6 @@
"ViewUserGuides": "Узнайте, как настроить Piwik и эффективно анализировать Ваши данные, используя %1$s руководства пользователя%2$s",
"CommunityHelp": "Помощь сообщества",
"ProfessionalHelp": "Помощь профессионала",
- "PiwikProIntro": "Piwik PRO предоставляет экспертную поддержку и консультирование клиентам, которые размещают Piwik в своей собственной инфраструктуре.",
- "PiwikProOfferIntro": "Наше предложение включает",
- "PiwikProReviewPiwikSetup": "Просмотр Вашей установки Piwik",
- "PiwikProOptimizationMaintenance": "Услуги оптимизации и обслуживания Piwik",
- "PiwikProPhoneEmailSupport": "Поддержку по телефону и электронной почте",
- "PiwikProTraining": "Обучение пользователей, технических специалистов и разработчиков",
- "PiwikProPremiumFeatures": "Премиальные возможности",
- "PiwikProCustomDevelopment": "Услуги разработки",
- "PiwikProAnalystConsulting": "Услуги аналитика-консультанта",
"ContactUs": "Свяжитесь с нами",
"VisitTheForums": "Посетите %1$s Форумы%2$s и получите помощь от сообщества пользователей Piwik"
}
diff --git a/plugins/Feedback/lang/sq.json b/plugins/Feedback/lang/sq.json
index e8ff0ace6d..bac0ae015e 100644
--- a/plugins/Feedback/lang/sq.json
+++ b/plugins/Feedback/lang/sq.json
@@ -19,15 +19,7 @@
"ViewUserGuides": "Mësoni përmes %1$sudhërëfyesit tonë për përdoruesit%2$s se si ta formësoni Piwik-un dhe si të analizoni me efektshmëri të dhënat tuaja",
"CommunityHelp": "Ndihmë nga Bashkësia",
"ProfessionalHelp": "Ndihmë Profesionale",
- "PiwikProIntro": "Piwik PRO ofron për klientë që e kanë Piwik-un të strehuar në infrastrukturë të tyre asistencë dhe konsulencë.",
- "PiwikProOfferIntro": "Në ofertën tonë përfshihet",
- "PiwikProReviewPiwikSetup": "Një përmbledhje e rregullimeve tuaja për Piwik-un",
- "PiwikProOptimizationMaintenance": "Shërbime optimizimi & mirëmbajtjeje Piwik-u",
- "PiwikProPhoneEmailSupport": "Asistencë Telefonike dhe me Email",
- "PiwikProTraining": "Trajnim Teknik, Përdoruesi, Zhvilluesi",
- "PiwikProPremiumFeatures": "Veçori Me Pagesë",
- "PiwikProCustomDevelopment": "Shërbime Personalizimesh",
- "PiwikProAnalystConsulting": "Shërbime konsulence analizash",
- "ContactUs": "Lidhuni me ne"
+ "ContactUs": "Lidhuni me ne",
+ "VisitTheForums": "Vizitoni %1$s Forumet%2$s dhe merrni ndihmë prej bashkësisë së përdoruesve të Piwik-ut"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/sr.json b/plugins/Feedback/lang/sr.json
index 274d669e6c..95c6c01682 100644
--- a/plugins/Feedback/lang/sr.json
+++ b/plugins/Feedback/lang/sr.json
@@ -19,15 +19,6 @@
"ViewUserGuides": "Naučite kako da podesite Piwik i kako da efikasno analizirate vaše podatke prateći %1$skorisničko uputstvo%2$s",
"CommunityHelp": "Pomoć zajednice",
"ProfessionalHelp": "Profesionalna pomoć",
- "PiwikProIntro": "Piwik PRO omogućuje podršku i konsalting eksperata klijentima koji hostuju Piwik na sopstvenim platformama.",
- "PiwikProOfferIntro": "Naša ponuda uključuje",
- "PiwikProReviewPiwikSetup": "Proveru vaše Piwik instalacije",
- "PiwikProOptimizationMaintenance": "Usluge optimizacije i održavanja Piwik-a",
- "PiwikProPhoneEmailSupport": "Telefonsku i podršku putem mejla",
- "PiwikProTraining": "Korisnički, tehnički i razvojni trening",
- "PiwikProPremiumFeatures": "Premium sadržaje",
- "PiwikProCustomDevelopment": "Razvoj usluga po vašoj želji",
- "PiwikProAnalystConsulting": "Usluge analitičkog konsaltinga",
"ContactUs": "Kontaktirajte nas"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/sv.json b/plugins/Feedback/lang/sv.json
index 80fab4cfc4..8fe41ed208 100644
--- a/plugins/Feedback/lang/sv.json
+++ b/plugins/Feedback/lang/sv.json
@@ -19,14 +19,6 @@
"ViewUserGuides": "Lär dig att konfigurera Piwik och hur man på ett effektivt sätt analyserar data med våra %1$sanvändarguider%2$s",
"CommunityHelp": "Community Hjälp",
"ProfessionalHelp": "Professionell hjälp",
- "PiwikProOfferIntro": "Vårt erbjudande inkluderar",
- "PiwikProReviewPiwikSetup": "En recension av din Piwik-installation",
- "PiwikProOptimizationMaintenance": "Piwik optimering & underhållstjänster",
- "PiwikProPhoneEmailSupport": "Telefon och e-postsupport",
- "PiwikProTraining": "Användar-, teknisk och utvecklarutbildning",
- "PiwikProPremiumFeatures": "Premium-funktioner",
- "PiwikProCustomDevelopment": "Anpassad utvecklingstjänster",
- "PiwikProAnalystConsulting": "Konsulttjänster för analyser",
"ContactUs": "Kontakta oss",
"VisitTheForums": "Besök %1$s forumet%2$s och få hjälp av Piwik-användare"
}
diff --git a/plugins/Feedback/templates/index.twig b/plugins/Feedback/templates/index.twig
index 04d3811e7d..f3c36bc06e 100644
--- a/plugins/Feedback/templates/index.twig
+++ b/plugins/Feedback/templates/index.twig
@@ -35,18 +35,18 @@
</div>
<div piwik-content-block content-title="{{ 'Feedback_ProfessionalHelp'|translate|e('html_attr') }}">
- <p>{{ 'Feedback_PiwikProIntro'|translate }}</p>
+ <p>{{ 'Feedback_ProfessionalServicesIntro'|translate }}</p>
- <p>{{ 'Feedback_PiwikProOfferIntro'|translate }}:</p>
- <p> &bull; {{ 'Feedback_PiwikProReviewPiwikSetup'|translate }}</p>
- <p> &bull; {{ 'Feedback_PiwikProOptimizationMaintenance'|translate }}</p>
- <p> &bull; {{ 'Feedback_PiwikProPhoneEmailSupport'|translate }}</p>
- <p> &bull; {{ 'Feedback_PiwikProTraining'|translate }}</p>
- <p> &bull; {{ 'Feedback_PiwikProPremiumFeatures'|translate }}</p>
- <p> &bull; {{ 'Feedback_PiwikProCustomDevelopment'|translate }}</p>
- <p> &bull; {{ 'Feedback_PiwikProAnalystConsulting'|translate }}</p>
+ <p>{{ 'Feedback_ProfessionalServicesOfferIntro'|translate }}</p>
+ <p> &bull; {{ 'Feedback_ProfessionalServicesReviewPiwikSetup'|translate }}</p>
+ <p> &bull; {{ 'Feedback_ProfessionalServicesOptimizationMaintenance'|translate }}</p>
+ <p> &bull; {{ 'Feedback_ProfessionalServicesPhoneEmailSupport'|translate }}</p>
+ <p> &bull; {{ 'Feedback_ProfessionalServicesTraining'|translate }}</p>
+ <p> &bull; {{ 'Feedback_ProfessionalServicesPremiumFeatures'|translate }}</p>
+ <p> &bull; {{ 'Feedback_ProfessionalServicesCustomDevelopment'|translate }}</p>
+ <p> &bull; {{ 'Feedback_ProfessionalServicesAnalystConsulting'|translate }}</p>
- <form target="_blank" action="https://piwik.pro/contact#contact-form">
+ <form target="_blank" action="https://piwik.org/support/">
<input type="hidden" name="pk_campaign" value="App_Help">
<input type="hidden" name="pk_source" value="Piwik_App">
<input type="hidden" name="pk_medium" value="App_ContactUs_button">
diff --git a/plugins/Goals/API.php b/plugins/Goals/API.php
index e1db0d187c..dedc555fc7 100644
--- a/plugins/Goals/API.php
+++ b/plugins/Goals/API.php
@@ -54,6 +54,24 @@ class API extends \Piwik\Plugin\API
const AVG_PRICE_VIEWED = 'avg_price_viewed';
/**
+ * Return a single goal.
+ *
+ * @param int $idSite
+ * @param int $idGoal
+ * @return array An array of goal attributes.
+ */
+ public function getGoal($idSite, $idGoal)
+ {
+ Piwik::checkUserHasViewAccess($idSite);
+
+ $goal = $this->getModel()->getActiveGoal($idSite, $idGoal);
+
+ if (!empty($goal)) {
+ return $this->formatGoal($goal);
+ }
+ }
+
+ /**
* Returns all Goals for a given website, or list of websites
*
* @param string|array $idSite Array or Comma separated list of website IDs to request the goals for
@@ -76,12 +94,7 @@ class API extends \Piwik\Plugin\API
$cleanedGoals = array();
foreach ($goals as &$goal) {
- if ($goal['match_attribute'] == 'manually') {
- unset($goal['pattern']);
- unset($goal['pattern_type']);
- unset($goal['case_sensitive']);
- }
- $cleanedGoals[$goal['idgoal']] = $goal;
+ $cleanedGoals[$goal['idgoal']] = $this->formatGoal($goal);
}
$cache->save($cacheId, $cleanedGoals);
@@ -90,6 +103,17 @@ class API extends \Piwik\Plugin\API
return $cache->fetch($cacheId);
}
+ private function formatGoal($goal)
+ {
+ if ($goal['match_attribute'] == 'manually') {
+ unset($goal['pattern']);
+ unset($goal['pattern_type']);
+ unset($goal['case_sensitive']);
+ }
+
+ return $goal;
+ }
+
/**
* Creates a Goal for a given website.
*
diff --git a/plugins/Goals/Controller.php b/plugins/Goals/Controller.php
index 3f649b9399..9009565158 100644
--- a/plugins/Goals/Controller.php
+++ b/plugins/Goals/Controller.php
@@ -290,7 +290,7 @@ class Controller extends \Piwik\Plugin\Controller
$dataRow = $datatable->getFirstRow();
$nbConversions = $dataRow->getColumn('nb_conversions');
$nbVisitsConverted = $dataRow->getColumn('nb_visits_converted');
- // Backward compatibilty before 1.3, this value was not processed
+ // Backward compatibility before 1.3, this value was not processed
if (empty($nbVisitsConverted)) {
$nbVisitsConverted = $nbConversions;
}
diff --git a/plugins/Goals/Model.php b/plugins/Goals/Model.php
index 2b35f7947d..66f0d91fea 100644
--- a/plugins/Goals/Model.php
+++ b/plugins/Goals/Model.php
@@ -64,6 +64,17 @@ class Model
Db::deleteAllRows($table, "WHERE idgoal = ? AND idsite = ?", "idvisit", 100000, array($idGoal, $idSite));
}
+ public function getActiveGoal($idSite, $idGoal)
+ {
+ $idSite = (int) $idSite;
+ $idGoal = (int) $idGoal;
+ $goals = Db::fetchRow("SELECT * FROM " . $this->table . "
+ WHERE idsite = $idSite AND idgoal = $idGoal
+ AND deleted = 0 LIMIT 1");
+
+ return $goals;
+ }
+
public function getActiveGoals($idSite)
{
$idSite = array_map('intval', $idSite);
diff --git a/plugins/Goals/lang/cs.json b/plugins/Goals/lang/cs.json
index e26bd7f11a..467dd8f4ef 100644
--- a/plugins/Goals/lang/cs.json
+++ b/plugins/Goals/lang/cs.json
@@ -77,6 +77,7 @@
"NewGoalIntro": "Sledování konverzního poměru cílů je jeden z nejefektivnějších způsobů měření a zlepšování podnikatelských zájmů.",
"NewVisitorsConversionRateIs": "Poměr konverze nové příchozích uživatelů je %s",
"NoGoalsNeedAccess": "Pouze administrátor nebo uživatel s právy super-uživatele může spravovat cíle pro daný web. Požádejte vašeho Piwik administrátora, aby cíl pro váš web vytvořil.<br>Sledování cílů je skvělý způsob, jak sledovat a maximalizovat výkonnost vašeho webu!",
+ "NoConversionsNoReportsMessage": "Reporty nejsou zobrazeny, protože nejsou dostupná převodní data pro vybrané cíle a období.",
"NeedAccess": "Pouze administrátor nebo uživatel s právy super-uživatele může spravovat cíle pro daný web.",
"Optional": "(volitelné)",
"OverallConversionRate": "%s celková frekvence konverzí (návštěv se splněným cílem)",
diff --git a/plugins/Goals/lang/da.json b/plugins/Goals/lang/da.json
index 55ae158edf..f5dde7af7b 100644
--- a/plugins/Goals/lang/da.json
+++ b/plugins/Goals/lang/da.json
@@ -11,6 +11,10 @@
"BestReferrers": "Bedste konverteringshjemmeside henvisning er:",
"CaseSensitive": "Forskel på små og store bogstaver",
"CancelAndReturnToGoals": "Annuller og %1$sog vend tilbage til listen over mål%2$s",
+ "CategoryTextGeneral_Visitors": "Bruger lokation",
+ "CategoryTextReferrers_Referrers": "Henvisninger",
+ "CategoryTextVisitsSummary_VisitsSummary": "Bruger attribute",
+ "CategoryTextGeneral_Visit": "engagement",
"ChooseGoal": "Vælg mål",
"ClickOutlink": "Klik på et link til en ekstern hjemmeside",
"SendEvent": "Send en hændelse",
@@ -72,6 +76,9 @@
"MatchesExpression": "matcher udtrykket %s",
"NewGoalIntro": "Sporing af målkonvertering er et af de mest effektive måder at måle og forbedre dine forretningsmæssige målsætninger.",
"NewVisitorsConversionRateIs": "Nye besøgendes konverteringsrate er %s",
+ "NoGoalsNeedAccess": "Kun en administrator eller en bruger med Super User adgang kan behandle mål for et givet website. Bed din Piwik administrator om at opsætte mål for dit website. <br>Sporing af mål er en god måde at forstå og maksimere dit websites ydeevne!",
+ "NoConversionsNoReportsMessage": "Rapporter bliver ikke vist fordi der ikke er nogen salgsdata for det valgte mål og periode.",
+ "NeedAccess": "Kun en administrator eller en bruger med Super User adgang kan behandle mål for et givet website.",
"Optional": "(valgfri)",
"OverallConversionRate": "%s samlet konverteringsrate (besøg med et færdigt mål)",
"OverallRevenue": "%s samlede indtægter",
@@ -88,6 +95,8 @@
"UpdateGoal": "Opdater mål",
"URL": "Netadresse",
"ViewAndEditGoals": "Vis og rediger mål",
+ "GoalsBy": "Mål for %s",
+ "GoalsAdjective": "Mål %s",
"VisitPageTitle": "Besøger en given sidetitel",
"VisitsUntilConv": "Besøg til konvertering",
"VisitUrl": "Besøger en bestemt hjemmeside (side eller en gruppe af sider)",
diff --git a/plugins/Goals/lang/el.json b/plugins/Goals/lang/el.json
index b2cce6c204..c57bb5aaa2 100644
--- a/plugins/Goals/lang/el.json
+++ b/plugins/Goals/lang/el.json
@@ -77,6 +77,7 @@
"NewGoalIntro": "Η παρακολούθηση για τη Μετατροπή Στόχων είναι ένας από τους αποτελεσματικότερους τρόπους για να μετρήσετε και να βελτιώσετε τους στόχους της επιχείρησής σας.",
"NewVisitorsConversionRateIs": "Ο βαθμός μετατροπής νέων επισκεπτών είναι %s",
"NoGoalsNeedAccess": "Μόνος ένας διαχειριστής ή χρήστης με δικαίωμα Υπερ Χρήστη μπορεί να διαχειριστεί τους Στόχους για ένα συγκεκριμένο ιστοτόπο. Παρακαλούμε ζητήστε από τον διαχειριστή του Piwik σας να ορίσει ένα Στόχο για τον ιστοτόπο σας.<br>Η Παρακολούθηση Στόχων είναι ένας πολύ καλός τρόπος για να σας βοηθήσει να κατανοήσετε και να μεγιστοποιήσετε την απόδοση του ιστοτόπου σας!",
+ "NoConversionsNoReportsMessage": "Οι αναφορές δεν εμφανίζεται επειδή δεν υπάρχουν δεδομένα για μετατροπή για τον επιλεγμένο στόχο και περίοδο.",
"NeedAccess": "Μόνος ένας διαχειριστής ή χρήστης με δικαίωμα Υπερ Χρήστη μπορεί να διαχειριστεί τους Στόχους για ένα συγκεκριμένο ιστοτόπο.",
"Optional": "(προαιρετικό)",
"OverallConversionRate": "%s καθολικός βαθμός προσόδου (επισκέψεις με έναν πλήρη στόχο)",
diff --git a/plugins/Goals/lang/fr.json b/plugins/Goals/lang/fr.json
index 3eb87a792b..32ae0f8271 100644
--- a/plugins/Goals/lang/fr.json
+++ b/plugins/Goals/lang/fr.json
@@ -77,6 +77,7 @@
"NewGoalIntro": "Le suivi de la conversion des objectifs et une des manières les plus efficaces de mesurer et améliorer vos objectifs d'affaires.",
"NewVisitorsConversionRateIs": "Le taux de conversion des nouveaux visiteurs est %s",
"NoGoalsNeedAccess": "Uniquement un Administrateur ou un utilisateur avec un accès Super Utilisateur peut gérer les Objectifs d'un site web donné. Veuillez demander à votre administrateur Piwik de mettre en place un Objectif pour votre site web. <br \/>Le suivi d'objectifs est une bonne manière de mieux comprendre et de maximiser les performances de votre site web!",
+ "NoConversionsNoReportsMessage": "Aucun rapport n'est affiché car il n'y a pas de données de conversion pour l'objectif et la période sélectionnée.",
"NeedAccess": "Uniquement un administrateur ou un utilisateur avec le rôle super utilisateur peut gérer les objectifs pour un site web.",
"Optional": "(optionnel)",
"OverallConversionRate": "%s taux de conversion global (visites avec un objectif rempli)",
diff --git a/plugins/Goals/lang/is.json b/plugins/Goals/lang/is.json
index 8be268026b..e14b3828fc 100644
--- a/plugins/Goals/lang/is.json
+++ b/plugins/Goals/lang/is.json
@@ -2,7 +2,7 @@
"Goals": {
"AddGoal": "Bæta Markmiði við",
"AddNewGoal": "Bæta nýju markmiði við",
- "AddNewGoalOrEditExistingGoal": "%sAdd a new Goal%s eða %sEdit%s núverandi Markmiðum",
+ "AddNewGoalOrEditExistingGoal": "%1$sAdd a new Goal%2$s eða %3$sEdit%4$s núverandi Markmiðum",
"CaseSensitive": "Skiptir máli hvort það eru hástafir eða lágstafir",
"ClickOutlink": "Smella á slóð fyrir utan vefinn",
"ColumnConversions": "Umbreytingar",
diff --git a/plugins/Goals/lang/it.json b/plugins/Goals/lang/it.json
index 377c1d1949..8f9c136be6 100644
--- a/plugins/Goals/lang/it.json
+++ b/plugins/Goals/lang/it.json
@@ -3,7 +3,7 @@
"AbandonedCart": "Ordini abbandonati",
"AddGoal": "Aggiungi un Goal",
"AddNewGoal": "Aggiungi un nuovo Goal",
- "AddNewGoalOrEditExistingGoal": "%1$sAggiungi un nuovo Goal%2$s o %3$sModificane%4$s uno esistente",
+ "AddNewGoalOrEditExistingGoal": "%1$sAggiungi un nuovo Goal%2$s o %3$sModifica%4$s i Goal esistenti",
"AllowGoalConvertedMoreThanOncePerVisit": "Consenti di convertire il Goal più di una volta per visita",
"AllowMultipleConversionsPerVisit": "Permetti conversioni multiple per visita",
"BestCountries": "Le tue nazioni che convertono meglio sono:",
@@ -33,7 +33,7 @@
"ColumnVisits": "Numero totale delle visite, indipendentemente dal fatto se un obiettivo sia stato attivato o meno.",
"ColumnVisitsProductDocumentation": "Numero di visite sulla pagina del Prodotto\/Categoria. Questo è anche utilizzato per elaborare la percentuale di conversioni %s. Questa metrica è nel report se è stato impostato nelle pagine Prodotto\/Categoria il view tracking Ecommerce.",
"Contains": "contiene %s",
- "ConversionByTypeReportDocumentation": "Questo report fornisce informazioni dettagliate sull'andamento degli obiettivi (conversioni, tassi di conversione ed entrate per visita), per ciascuna delle categorie disponibili nel pannello di sinistra. %1$s Si prega di cliccare su una delle categorie per visualizzare il report. %2$s Per ulteriori informazioni, leggere la %3$sDocumentazione Tracking Goals%4$s",
+ "ConversionByTypeReportDocumentation": "Questo report fornisce informazioni dettagliate sull'andamento degli obiettivi (conversioni, tassi di conversione ed entrate per visita), per ciascuna delle categorie disponibili nel pannello di sinistra. %1$s Si prega di cliccare su una delle categorie per visualizzare il report. %2$s Per ulteriori informazioni, leggere la %3$sDocumentazione sul Tracking dei Goal%4$s",
"ConversionRate": "%s rapporto di conversione",
"Conversions": "%s conversioni",
"ConversionsOverview": "Panoramica Conversioni",
@@ -68,7 +68,7 @@
"GoalX": "Goal %s",
"HelpOneConversionPerVisit": "Se una pagina corrispondente a un Obiettivo è aggiornata o visualizzata più di una volta in una visita, l'Obiettivo verrà registrato solo la prima volta che la pagina è stata caricata durante questa visita.",
"IsExactly": "è esattamente %s",
- "LearnMoreAboutGoalTrackingDocumentation": "Impara di più sul %1$sTracciamento Obiettivi in Piwik%2$s nella documentazione per l'utente.",
+ "LearnMoreAboutGoalTrackingDocumentation": "Impara di più sul %1$sTracciamento dei Goal in Piwik%2$s nella documentazione per l'utente.",
"LeftInCart": "%s lasciato nel carrello",
"ManageGoalsOrCreateANewGoal": "%1$sAmministra i Goal%2$s o creane ora uno nuovo!",
"Manually": "manualmente",
@@ -77,6 +77,7 @@
"NewGoalIntro": "Il tracciamento delle Conversioni Goal è uno dei modi più efficaci per misurare e migliorare i vostri obiettivi di business.",
"NewVisitorsConversionRateIs": "Il rapporto di conversione dei nuovi visitatori è %s",
"NoGoalsNeedAccess": "Solo un Amministratore con privilegi di Super User può gestire gli Obiettivi di un dato sito web. Chiedi al tuo amministratore di Piwik di impostare un Goal per il tuo sito. <br>Tracciare i Goal è un grande modo per aiutare a capire e a massimizzare le prestazioni del tuo sito web!",
+ "NoConversionsNoReportsMessage": "I report non vengono visualizzati perché non ci sono dati di conversione per il goal e il periodo selezionati.",
"NeedAccess": "Solo un Amministratore o un utente con privilegi di Super User può gestire gli Obiettivi di un dato sito.",
"Optional": "(opzionale)",
"OverallConversionRate": "%s rapporto di conversione complessivo (visite con un obiettivo completato)",
diff --git a/plugins/Goals/lang/ka.json b/plugins/Goals/lang/ka.json
index 1a2736fc3f..e7d6f0e4c9 100644
--- a/plugins/Goals/lang/ka.json
+++ b/plugins/Goals/lang/ka.json
@@ -2,7 +2,7 @@
"Goals": {
"AddGoal": "მიზნის დამატება",
"AddNewGoal": "დაამატეთ ახალი მიზანი",
- "AddNewGoalOrEditExistingGoal": "%sდაამატეთ ახალი მიზანი%s ან %sშეცვალეთ%s არსებული მიზნები",
+ "AddNewGoalOrEditExistingGoal": "%1$sდაამატეთ ახალი მიზანი%2$s ან %3$sშეცვალეთ%4$s არსებული მიზნები",
"BestCountries": "საუკეთესო კონვერციის ქვეყნებია:",
"BestKeywords": "საუკეთესო კონვერციის საკვანძო სიტყვებია:",
"BestReferrers": "საუკეთესო კინვერციის ვებ საიტების რეფერერებია:",
@@ -17,7 +17,7 @@
"DefaultRevenueHelp": "მაგალითად, კონტაქტების ფორმა, რომელსაც აგზავნის ვიზიტორი, შეიძლება ღირდეს საშუალოდ $10. Piwik დაგეხმარებათ გაიგოთ რამდენად კარგად არის წარმოდგენილნი თქვენი ვიზიტორების სეგმენტები.",
"DeleteGoalConfirm": "დარწმუნებული ხართ, რომ გსურთ %s მიზნის წაშლა?",
"Download": "ჩამოტვირთავს ფაილი",
- "ExceptionInvalidMatchingString": "თუ თქვენ აირჩევთ \"ზუსტი დამთხვევა\", შესადარებელი სტრიქონი უნდა იყოს URL დაწყებული %s. მაგალითად, '%s'.",
+ "ExceptionInvalidMatchingString": "თუ თქვენ აირჩევთ \"ზუსტი დამთხვევა\", შესადარებელი სტრიქონი უნდა იყოს URL დაწყებული %1$s. მაგალითად, '%2$s'.",
"ExternalWebsiteUrl": "გარე ვებ საიტის URL",
"Filename": "filename",
"GoalConversion": "მიზნის კონვერსია",
@@ -43,6 +43,6 @@
"VisitUrl": "ეწვევა მოცემულ URL–ს (გვერდი ან გვერდების ჯგუფი)",
"WhenVisitors": "როდესაც ვიზიტორი",
"WhereThe": "სადაც",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "როდესაც მონახულებული გვედი შეიცავს JavaScript piwikTracker.trackGoal() მეთოდის (%sდამატებითი ინფორმაცია%s) გამოძახებას"
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "როდესაც მონახულებული გვედი შეიცავს JavaScript 'trackGoal' მეთოდის (%1$sდამატებითი ინფორმაცია%2$s) გამოძახებას"
}
} \ No newline at end of file
diff --git a/plugins/Goals/lang/nl.json b/plugins/Goals/lang/nl.json
index a8b5d53fad..36b11c96f9 100644
--- a/plugins/Goals/lang/nl.json
+++ b/plugins/Goals/lang/nl.json
@@ -12,7 +12,7 @@
"CaseSensitive": "Hoofdletter gevoelig",
"CancelAndReturnToGoals": "Annuleren en %1$sterugkeren naar de lijst van doelen%2$s",
"CategoryTextGeneral_Visitors": "Gebruikers locatie",
- "CategoryTextReferrers_Referrers": "Herkomsten",
+ "CategoryTextReferrers_Referrers": "Herkomst",
"CategoryTextVisitsSummary_VisitsSummary": "Gebruikers eigenschap",
"CategoryTextGeneral_Visit": "engagement",
"ChooseGoal": "Kies het doel",
diff --git a/plugins/Goals/lang/pt-br.json b/plugins/Goals/lang/pt-br.json
index 9434023edc..8155ea125f 100644
--- a/plugins/Goals/lang/pt-br.json
+++ b/plugins/Goals/lang/pt-br.json
@@ -77,6 +77,7 @@
"NewGoalIntro": "O acompanhamento de conversões de metas é uma das maneiras mais eficientes para medir e melhorar seus objetivos de negócios.",
"NewVisitorsConversionRateIs": "Taxa de conversão de novos usuários é %s",
"NoGoalsNeedAccess": "Apenas um Administrador ou um usuário com acesso Super Usuário pode gerenciar Metas para um determinado website. Por favor, peça ao seu administrador Piwik para configurar uma Meta para o seu website. <br>Rastrear Metas é uma ótima maneira de ajudar a compreender e maximizar o desempenho do seu website!",
+ "NoConversionsNoReportsMessage": "Os relatórios não são exibidos porque não há dados de conversão para a meta e o período selecionados.",
"NeedAccess": "Apenas um Administrador ou um usuário com acesso Super Usuário pode gerenciar Metas para um determinado website.",
"Optional": "(opcional)",
"OverallConversionRate": "%s taxa total de conversão(visitas com uma meta completa)",
diff --git a/plugins/Goals/lang/sq.json b/plugins/Goals/lang/sq.json
index 1c5dfc173d..ed466ce0de 100644
--- a/plugins/Goals/lang/sq.json
+++ b/plugins/Goals/lang/sq.json
@@ -77,6 +77,7 @@
"NewGoalIntro": "Gjurmimi i Shndërrimeve të Objektivave është një rrugët më të efektshme për të matu dhe përmirësuar objektivat e biznesit tuaj.",
"NewVisitorsConversionRateIs": "Koeficienti i shndërrimit për vizitorë të rinj është %s",
"NoGoalsNeedAccess": "Objektivat për një sajt të dhënë mund t’i administrojë vetëm Përgjegjësi ose një përdorues me leje Superpërdoruesi. Ju lutemi, kërkojini përgjegjësit të Piwik-ut tuaj të caktojë një Objektiv për sajtin tuaj. <br>Gjurmimi i Objektivave është një rrugë e fuqishme për të ndihmuar të kuptohet dhe maksimizohet suksesshmëria e sajtit tuaj!",
+ "NoConversionsNoReportsMessage": "Raportet nuk shfaqen, ngaqë nuk ka të dhëna shndërrimesh për objektivin dhe periudhën e zgjedhur.",
"NeedAccess": "Objektivat për një sajt të dhënë mund t’i administrojë vetëm Përgjegjësi ose një përdorues me leje Superpërdoruesi.",
"Optional": "(opsionale)",
"OverallConversionRate": "Koeficient shndërrimesh %s gjithsej (vizita me objektiv të plotësuar)",
diff --git a/plugins/Goals/lang/sv.json b/plugins/Goals/lang/sv.json
index 5ba02ca36e..4bc94929f0 100644
--- a/plugins/Goals/lang/sv.json
+++ b/plugins/Goals/lang/sv.json
@@ -77,6 +77,7 @@
"NewGoalIntro": "Att använda mål för konvertering är ett av de mest effektiva sätten att mäta och förbättra din affärsverksamhet.",
"NewVisitorsConversionRateIs": "Nya besökares omvandlingsgrad är %s",
"NoGoalsNeedAccess": "Bara en administratör eller användare med Superbehörighet kan hantera mål för angiven hemsida. Var snäll och kontakta din administratör hos Piwik för att sätta upp dina mål för din hemsida. <br>Att ha mål är ett utmärkt sätt att få hjälp att förstå hur du maximerar din webbsidas resultat!",
+ "NoConversionsNoReportsMessage": "Rapporterna visas inte eftersom det inte finns någon konverteringsdata för det valda målet och perioden.",
"NeedAccess": "Bara en administratör eller användare med Superbehörighet kan hantera mål för angiven hemsida.",
"Optional": "(frivilligt)",
"OverallConversionRate": "%s total omvandlingsgrad (besök med ett uppnått mål)",
diff --git a/plugins/Goals/lang/uk.json b/plugins/Goals/lang/uk.json
index fda6fe3d41..ff668a5102 100644
--- a/plugins/Goals/lang/uk.json
+++ b/plugins/Goals/lang/uk.json
@@ -1,48 +1,108 @@
{
"Goals": {
- "AddGoal": "Додати Ціль",
- "AddNewGoal": "Додати нову Ціль",
- "AddNewGoalOrEditExistingGoal": "%1$sДодати нову Ціль%2$s або %3$sРедагувати%4$s існуючі Цілі",
- "BestCountries": "Країни з найкращою корверсією:",
- "BestKeywords": "Ключові слова з найкращоб конверсією:",
- "BestReferrers": "Джерела трафіку з найкращою конверсією:",
- "CaseSensitive": "співпадіння чутливе до регістру",
- "ClickOutlink": "Клацання по посиланню на зовнішній веб-сайт",
+ "AbandonedCart": "Кинуті кошики",
+ "AddGoal": "Додати ціль",
+ "AddNewGoal": "Додати нову ціль",
+ "AddNewGoalOrEditExistingGoal": "%1$sДодати нову ціль%2$s або %3$sредагувати%4$s вже існуючі",
+ "AllowGoalConvertedMoreThanOncePerVisit": "Дозволити зарахування цілі більш ніж один раз за відвідування",
+ "AllowMultipleConversionsPerVisit": "Дозволити множинну конверсію за відвідування",
+ "BestCountries": "Найбільш популярні країни:",
+ "BestKeywords": "Найбільш популярні ключові слова:",
+ "BestReferrers": "Найбільш популярні джерела входу:",
+ "CaseSensitive": "Збіги є чутливими до регістру",
+ "CancelAndReturnToGoals": "Скасування і %1$sповернення до списку цілей%2$s",
+ "CategoryTextGeneral_Visitors": "Місцезнаходження користувача",
+ "CategoryTextReferrers_Referrers": "Джерела",
+ "CategoryTextVisitsSummary_VisitsSummary": "Властивість користувача",
+ "CategoryTextGeneral_Visit": "Залученість",
+ "ChooseGoal": "Виберіть ціль",
+ "ClickOutlink": "Переходять по посиланню на зовнішній сайт",
+ "SendEvent": "Відправляють подію",
+ "ColumnAverageOrderRevenueDocumentation": "Середня ціна за замовлення - загальний прибуток за усі електронні замовлення, розділені на число замовлень.",
+ "ColumnAveragePriceDocumentation": "Середній прибуток для %s.",
+ "ColumnAverageQuantityDocumentation": "Середня кількість %s, проданих через електронні замовлення.",
+ "ColumnConversionRateDocumentation": "Відсоток відвідувань, коли було ініційовано виконання цілі %s.",
+ "ColumnConversionRateProductDocumentation": "Відсоток конверсії %s – це число замовлень, що містять цей товар і розділені на число відвідувань сторінки з товаром.",
"ColumnConversions": "Конверсії",
+ "ColumnConversionsDocumentation": "Кількість конверсій для %s.",
+ "ColumnOrdersDocumentation": "Загальна кількість електронних замовлень, які містили %s хоча б раз.",
+ "ColumnPurchasedProductsDocumentation": "Число куплених товарів - це сума числа товарів, проданих за допомогою електронних замовлень.",
+ "ColumnQuantityDocumentation": "Кількість - це загальне товарів, проданих для кожного %s.",
+ "ColumnRevenueDocumentation": "Загальний прибуток, отриманий %s.",
+ "ColumnRevenuePerVisitDocumentation": "Загальний прибуток, отриманий %s і розділений на число відвідувань.",
+ "ColumnVisits": "Загальна кількість відвідувань в незалежності від того, була виконана Ціль чи ні.",
+ "ColumnVisitsProductDocumentation": "Число відвідувань сторінки товарів\/категорії товарів. Це використовується для підрахунку відсотка конверсії %s. Цей показник потрапляє в звіт, якщо ви встановили відстеження електронної комерції на сторінку товарів\/категорії товарів.",
"Contains": "містить %s",
- "ConversionRate": "%s коефіцієнт конверсії",
- "Conversions": "%s конверсії",
- "ConversionsOverview": "Огляд конверсій",
- "DefaultRevenue": "Типовий прибуток Цілі",
- "DefaultRevenueHelp": "Для прикладу, надіслана відвідувачем Форма Контактів може в середньому вартувати $10. Piwik дозволить вам зрозуміти наскільки добре поводять себе різні сегменти ваших користувачів.",
- "DeleteGoalConfirm": "Впевнені що хочете видалити Ціль %s?",
- "Download": "Завантажено файл",
- "ExceptionInvalidMatchingString": "Якщо вибрати \"точне сіпвпадіння\" то стрічка для співставлення має бути коректним URL та починатися з %1$s. Наприклад '%2$s'.",
- "ExternalWebsiteUrl": "URL на зовнішній веб-сайт",
- "Filename": "ім’я файла",
+ "ConversionByTypeReportDocumentation": "Цей звіт містить детальну інформацію про цілі (конверсія, відсоток конверсії і прибуток за відвідування) по кожній доступній в лівій панелі категорії. %1$s Будь ласка, клікніть на одну з категорій, щоб побачити детальний звіт. %2$s Більше інформації у %3$sВідстеження цілей на piwik.org%4$s",
+ "ConversionRate": "%s коефіцієнт конверсій",
+ "Conversions": "%s конверсій",
+ "ConversionsOverview": "Огляд переходів",
+ "ConversionsOverviewBy": "Огляд конверсій за типами відвідування",
+ "DaysToConv": "Конверсія по днях",
+ "Details": "Детальніше про цілі",
+ "DefaultGoalConvertedOncePerVisit": "(за замовчуванням) Ціль може бути зарахована раз за відвідування",
+ "DefaultRevenue": "Вартість цілі за замовчуванням:",
+ "DefaultRevenueHelp": "Наприклад, форма замовлення, відправлена ​​відвідувачем, має середню ціну 10 грн.. Тоді веб-аналітика підрахує сумарний прибуток за вас",
+ "DeleteGoalConfirm": "Ви впевнені, що бажаєте видалити ціль %s?",
+ "DocumentationRevenueGeneratedByProductSales": "Продажі товарів. Без податків, ціни доставки і знижок",
+ "Download": "Завантажують файл",
+ "Ecommerce": "Ел. комерція",
+ "EcommerceAndGoalsMenu": "Електрона комерція & Цілі",
+ "EcommerceLog": "Лог ел. замовлень",
+ "EcommerceOrder": "Електронне замовлення",
+ "EcommerceOverview": "Огляд електронних замовлень",
+ "EcommerceReports": "Звіти по електронним замовленням",
+ "ExceptionInvalidMatchingString": "Якщо ви оберете «співпадає точно», рядок для порівняння повинен бути URL'ом, що починається з %1$s. Наприклад, \"%2$s\".",
+ "ExternalWebsiteUrl": "зовнішнє посилання виглядає наступним чином:",
+ "Filename": "ім'я файлу виглядає наступним чином:",
"GoalConversion": "Конверсія цілі",
- "GoalIsTriggered": "Ціль спрацьовує",
- "GoalIsTriggeredWhen": "Ціль спрацьовує коли",
+ "GoalConversions": "Конверсія цілей",
+ "GoalConversionsBy": "Конверсія цілі %s за типом відвідування",
+ "GoalIsTriggered": "Ціль зараховується, якщо:",
+ "GoalIsTriggeredWhen": "коли",
"GoalName": "Назва Цілі",
"Goals": "Цілі",
+ "ManageGoals": "Управління цілями",
"GoalsOverview": "Огляд цілей",
+ "GoalsOverviewDocumentation": "Це огляд конверсії ваших цілей. Графік показує суму всіх конверсій. %s Під графіком можна побачити звіт про переходи - по кожній з цілей. Графіки можуть бути збільшені при кліці на них.",
"GoalX": "Ціль %s",
- "IsExactly": "точно співпадає з %s",
- "Manually": "вручну",
- "ManuallyTriggeredUsingJavascriptFunction": "Ціль спрацьовує вручну використовуючи JavaScript API trackGoal()",
- "MatchesExpression": "підходить під вираз %s",
- "NewVisitorsConversionRateIs": "коефіцієнт коверсії нових користувачів дорівнює %s",
- "Optional": "(не обовязково)",
- "OverallConversionRate": "%s загальний коефіцієнт конверсії (відвідування з завершеними цілями)",
+ "HelpOneConversionPerVisit": "Якщо сторінка, що збігається з цією ціллю перезавантажується або проглядається більше одного разу за відвідування, ціль буде зараховано тільки один раз - при першому візиті користувача на цю сторінку.",
+ "IsExactly": "точно %s",
+ "LearnMoreAboutGoalTrackingDocumentation": "Дізнатися більше про %1$sвідстеження цілей в Piwik%2$s в інструкції користувача.",
+ "LeftInCart": "%s залишено в кошику",
+ "ManageGoalsOrCreateANewGoal": "%1$sУправляйте цілями%2$s або створіть нову прямо зараз!",
+ "Manually": "ручне налаштування",
+ "ManuallyTriggeredUsingJavascriptFunction": "Ціль вручну стала умовною через Javascript API trackGoal()",
+ "MatchesExpression": "збігається з виразом %s",
+ "NewGoalIntro": "Відстеження досягнутих переходів є одним з найбільш ефективних способів виміряти і поліпшити свої бізнес-завдання.",
+ "NewVisitorsConversionRateIs": "Коефіцієнт нових відвідувачів %s",
+ "NoGoalsNeedAccess": "Тільки адміністратор або користувач з правами суперкористувача може додавати цілі для даного сайту. Будь ласка, зверніться до адміністратора Piwik, щоб створити цілі для вашого сайту.<br>Відстеження цілей є відмінним способом, щоб допомогти зрозуміти як збільшити і максимізувати ефективність веб-сайту!",
+ "NoConversionsNoReportsMessage": "Звіти не показані, тому що дані перетворення для обраних цілей і періоду відсутні.",
+ "NeedAccess": "Тільки Адміністратор або користувач з доступом Суперкористувача може управляти цілями для даного сайту.",
+ "Optional": "(необов'язково)",
+ "OverallConversionRate": "%s загальний коефіцієнт конверсій (переходи з виконаної цілі)",
"OverallRevenue": "%s загальний прибуток",
+ "PageTitle": "Заголовок сторінки",
"Pattern": "Шаблон",
- "ReturningVisitorsConversionRateIs": "Коефіцієнт конверсії користувачів що повернулися дорівнює %s",
- "UpdateGoal": "Обновити Ціль",
- "URL": "URL",
- "ViewAndEditGoals": "Переглянути та Редагувати Цілі",
- "VisitUrl": "Відвідано заданий URL (сторінку або групу сторінок)",
- "WhenVisitors": "коли відвідувачі",
+ "PluginDescription": "Створіть Цілі і дивіться детальні звіти про цільові конверсії: зміна за часом, дохід від візиту, конверсії з посилання, з ключового слова та ін.",
+ "ProductCategory": "Категорія товарів",
+ "ProductName": "Найменування товару",
+ "Products": "Товари",
+ "ProductSKU": "Артикул",
+ "ReturningVisitorsConversionRateIs": "Коефіцієнт найбільш частих відвідувачів, що повернулися %s",
+ "SingleGoalOverviewDocumentation": "Це огляд конверсій по конкретній цілі. %s Графіки, показані нижче, можна збільшити, клікнувши по ним.",
+ "ThereIsNoGoalToManage": "Немає цілі для управління на сайті %s",
+ "UpdateGoal": "Оновити ціль",
+ "URL": "URL виглядає наступним чином:",
+ "ViewAndEditGoals": "Переглянути та редагувати цілі",
+ "GoalsBy": "Цілі по %s",
+ "GoalsAdjective": "Цілі %s",
+ "VisitPageTitle": "Відвідують даний Заголовок сторінки",
+ "VisitsUntilConv": "Зконвертовані відвідування",
+ "VisitUrl": "Відвідують даний URL (сторінку або групу сторінок)",
+ "WhenVisitors": "відвідувачі",
"WhereThe": "де",
- "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "де відвідана сторінка містить запит методу JavaScript 'trackGoal' (%1$sдізнатись більше%2$s)"
+ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "де ціль зараховується за допомогою установки виклику методу JavaScript 'trackGoal' (%1$sдізнатися більше%2$s)",
+ "YouCanEnableEcommerceReports": "Ви можете активувати %1$s для цього сайту на сторінці %2$s."
}
} \ No newline at end of file
diff --git a/plugins/Goals/tests/Integration/APITest.php b/plugins/Goals/tests/Integration/APITest.php
index 7dcb79eef5..b2a1d60e98 100644
--- a/plugins/Goals/tests/Integration/APITest.php
+++ b/plugins/Goals/tests/Integration/APITest.php
@@ -187,6 +187,42 @@ class APITest extends IntegrationTestCase
$this->assertHasNoGoals();
}
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage checkUserHasViewAccess Fake exception
+ */
+ public function test_getGoal_shouldThrowException_IfNotEnoughPermission()
+ {
+ $idGoal = $this->createAnyGoal();
+ $this->assertSame(1, $idGoal);
+ $this->setNonAdminUser();
+ $this->api->getGoal($this->idSite, $idGoal);
+ }
+
+ public function test_getGoal_shouldReturnNullIfItDoesNotExist()
+ {
+ $this->assertNull($this->api->getGoal($this->idSite, $idGoal = 99));
+ }
+
+ public function test_getGoal_shouldReturnExistingGoal()
+ {
+ $idGoal = $this->createAnyGoal();
+ $this->assertSame(1, $idGoal);
+ $goal = $this->api->getGoal($this->idSite, $idGoal);
+ $this->assertEquals(array(
+ 'idsite' => '1',
+ 'idgoal' => '1',
+ 'name' => 'MyName1',
+ 'match_attribute' => 'event_action',
+ 'pattern' => 'test',
+ 'pattern_type' => 'exact',
+ 'case_sensitive' => '0',
+ 'allow_multiple' => '0',
+ 'revenue' => '0',
+ 'deleted' => '0',
+ ), $goal);
+ }
+
private function assertHasGoals()
{
$goals = $this->getGoals();
diff --git a/plugins/ImageGraph/ImageGraph.php b/plugins/ImageGraph/ImageGraph.php
index 5cb1be2e61..9869d37081 100644
--- a/plugins/ImageGraph/ImageGraph.php
+++ b/plugins/ImageGraph/ImageGraph.php
@@ -95,7 +95,7 @@ class ImageGraph extends \Piwik\Plugin
$piwikSite
);
} else {
- // if graphs_show_evolution_within_selected_period=true, show the days withing the period
+ // if graphs_show_evolution_within_selected_period=true, show the days within the period
// (except if the period is day, see above)
$periodForMultiplePeriodGraph = 'day';
$period = PeriodFactory::build($info['period'], $info['date']);
diff --git a/plugins/ImageGraph/StaticGraph/GridGraph.php b/plugins/ImageGraph/StaticGraph/GridGraph.php
index 4ffde4c2c4..5d8365345a 100644
--- a/plugins/ImageGraph/StaticGraph/GridGraph.php
+++ b/plugins/ImageGraph/StaticGraph/GridGraph.php
@@ -194,7 +194,7 @@ abstract class GridGraph extends StaticGraph
// $legendTopLeftYValue = y coordinate of the top edge of the legend's icons
// Caution :
- // - pChart will silently add some value (see $paddingAddedByPChart) to $legendTopLeftYValue depending on multiple criterias
+ // - pChart will silently add some value (see $paddingAddedByPChart) to $legendTopLeftYValue depending on multiple criteria
// - pChart will not take into account the size of the text. Setting $legendTopLeftYValue = 0 will crop the legend's labels
// The following section of code determines the value of $legendTopLeftYValue while taking into account the following paremeters :
// - whether legend items have icons
diff --git a/plugins/ImageGraph/lang/sq.json b/plugins/ImageGraph/lang/sq.json
index 9038f453ef..a8a12c81e5 100644
--- a/plugins/ImageGraph/lang/sq.json
+++ b/plugins/ImageGraph/lang/sq.json
@@ -1,5 +1,6 @@
{
"ImageGraph": {
- "ColumnOrdinateMissing": "Në këtë raport s’u gjet shtylla '%1$s'. Provoni cilëndo nga %2$s"
+ "ColumnOrdinateMissing": "Në këtë raport s’u gjet shtylla '%1$s'. Provoni cilëndo nga %2$s",
+ "PluginDescription": "Prodhoni figura të hijshme Grafikësh statikë PNG për çfarëdo të dhënash të raportit tuaj."
}
} \ No newline at end of file
diff --git a/plugins/ImageGraph/lang/tr.json b/plugins/ImageGraph/lang/tr.json
new file mode 100644
index 0000000000..ca1532a1b0
--- /dev/null
+++ b/plugins/ImageGraph/lang/tr.json
@@ -0,0 +1,6 @@
+{
+ "ImageGraph": {
+ "ColumnOrdinateMissing": "'%1$s' sütunu bu raporda bulunamadı Herhangi bir %2$s deneyin",
+ "PluginDescription": "Veri raporlarınız için güzel PNG çizelgeleri oluşturur."
+ }
+} \ No newline at end of file
diff --git a/plugins/ImageGraph/lang/uk.json b/plugins/ImageGraph/lang/uk.json
new file mode 100644
index 0000000000..29c84f0562
--- /dev/null
+++ b/plugins/ImageGraph/lang/uk.json
@@ -0,0 +1,6 @@
+{
+ "ImageGraph": {
+ "ColumnOrdinateMissing": "Колонка ’%1$s’ була знайдена в цьому звіті. Спробуйте що-небудь з %2$s",
+ "PluginDescription": "Генеруйте красиві статичні зображення графіків PNG для будь-якого вашого інформаційного звіту."
+ }
+} \ No newline at end of file
diff --git a/plugins/Insights/lang/da.json b/plugins/Insights/lang/da.json
index 019a911178..e0fdf0d65e 100644
--- a/plugins/Insights/lang/da.json
+++ b/plugins/Insights/lang/da.json
@@ -1,5 +1,6 @@
{
"Insights": {
+ "PluginDescription": "Giver indsigt i din trafik. Indsigt findes som kontrolpanel widgets og som nyt ikon i rapporter for at lade dig se de vigtigste tendenser i dine data.",
"ControlComparedToDescription": "Vækst i forhold til",
"ControlFilterByDescription": "Vis alle, kun ændringer, kun nye eller kun forsvundne",
"DatePeriodCombinationNotSupported": "Det er ikke muligt at generere rapporter til disse datoer og kombination af perioder.",
diff --git a/plugins/Insights/lang/nb.json b/plugins/Insights/lang/nb.json
index 967feeb49e..3d9808c267 100644
--- a/plugins/Insights/lang/nb.json
+++ b/plugins/Insights/lang/nb.json
@@ -1,14 +1,33 @@
{
"Insights": {
+ "PluginDescription": "Gir innsikt om din trafikk. Innsikt er tilgjengelig som widgeter, i tillegg til et nytt ikon i rapporter, som lar deg se de viktigste trendene i dine data.",
"ControlComparedToDescription": "Vekst sammenlignet med",
+ "ControlFilterByDescription": "Vis alle, kun klatrere, kun nye eller kun forsvunne",
+ "DatePeriodCombinationNotSupported": "Det er ikke mulig å generere innsikt for denne dato- og periodekombinasjonen.",
"DayComparedToPreviousDay": "dagen før",
"DayComparedToPreviousWeek": "samme dag i forrige uke",
"DayComparedToPreviousYear": "samme dag året før",
"Filter": "Filter",
+ "FilterIncreaserAndDecreaser": "På vei opp & på vei ned",
+ "FilterOnlyDecreaser": "Kun på vei ned",
+ "FilterOnlyDisappeared": "Kun forsvunne",
+ "FilterOnlyIncreaser": "Kun på vei opp",
+ "FilterOnlyMovers": "Kun klatrere",
"FilterOnlyNew": "Bare nye",
+ "IgnoredChanges": "Endringer som påvirker mindre enn %s besøk ble ignorert.",
"MonthComparedToPreviousMonth": "måneden før",
"MonthComparedToPreviousYear": "samme måned året før",
+ "MoversAndShakersWidgetTitle": "Klatrere og stupere",
+ "NoResultMatchesCriteria": "Ingen rader passer til kriteriene",
+ "OverviewWidgetTitle": "Innsiktsoversikt",
+ "TitleConsideredInsightsChanges": "Radene økte eller minket med minst %1$s besøk (%2$s%% av totalt %3$s besøk).",
+ "TitleConsideredInsightsGrowth": "Følgende rader har en vekst på minst %1$s%% sammenliknet med %2$s.",
+ "TitleConsideredMoversAndShakersChanges": "Regnes som klatrere kun hvis de økte med mer enn %1$s%% besøk eller minket med mer enn %2$s%% besøk, nye oppføringer kun hvis de har økt med mer enn %3$s%% besøk (%4$s), og forsvunne rader hvis de minket med mer enn %5$s%% besøk (%6$s).",
+ "TitleConsideredMoversAndShakersGrowth": "%1$s gikk fra %2$s til %3$s sammenliknet med %4$s Basert på dette forventes en utvikling på %5$s%% for hver rad.",
"TitleRowChangeDetails": "«%1$s» endret fra %2$s (%3$s) til %4$s (%5$s) %6$s.",
+ "TitleRowDisappearedDetails": "«%1$s» minket med %2$s og forsvant i %3$s sammenliknet med %4$s.",
+ "TitleRowMoverAndShaker": "Denne raden hadde en større påvirkning enn gjennomsnittet.",
+ "TitleRowNewDetails": "«%1$s» økte med %2$s og er ny sammenliknet med %3$s.",
"WeekComparedToPreviousWeek": "uken før",
"WidgetCategory": "Innsikt",
"YearComparedToPreviousYear": "året før"
diff --git a/plugins/Insights/lang/sq.json b/plugins/Insights/lang/sq.json
index 46a17bb94b..bc6a485e1a 100644
--- a/plugins/Insights/lang/sq.json
+++ b/plugins/Insights/lang/sq.json
@@ -4,7 +4,9 @@
"DayComparedToPreviousDay": "dita e mëparshme",
"DayComparedToPreviousWeek": "e njëjta ditë javën e kaluar",
"DayComparedToPreviousYear": "e njëjta ditë vitin e kaluar",
+ "IgnoredChanges": "Janë shpërfillur ndryshimet që u takojnë më pak se %s vizitave.",
"MonthComparedToPreviousMonth": "muaji i mëparshëm",
+ "MonthComparedToPreviousYear": "i njëjti muaj vitin e shkuar",
"WeekComparedToPreviousWeek": "java e mëparshme",
"YearComparedToPreviousYear": "viti i mëparshëm"
}
diff --git a/plugins/Insights/lang/sv.json b/plugins/Insights/lang/sv.json
index 1e95d30eb6..653029c075 100644
--- a/plugins/Insights/lang/sv.json
+++ b/plugins/Insights/lang/sv.json
@@ -1,5 +1,6 @@
{
"Insights": {
+ "PluginDescription": "Ger tillgång till i insikter om din trafik. Insikter finns tillgänglig som en instrumentpanel men även som en ny ikon i rapporter för att du ska få tillgång till de viktigaste trenderna i din data.",
"ControlComparedToDescription": "Tillväxt jämfört med",
"ControlFilterByDescription": "Visa alla, endast förändringar, endast nya eller endast försvunna",
"DatePeriodCombinationNotSupported": "Det är inte möjligt att generera insikter för datum och tid tillsammans.",
diff --git a/plugins/Insights/lang/uk.json b/plugins/Insights/lang/uk.json
new file mode 100644
index 0000000000..6dda7742e6
--- /dev/null
+++ b/plugins/Insights/lang/uk.json
@@ -0,0 +1,35 @@
+{
+ "Insights": {
+ "PluginDescription": "Надає Вам прогнози вашого трафіку. Прогнози доступні як у вигляді віджетів панелі управління, так і у вигляді нової іконки в звітах, щоб дозволяти вам бачити найбільш важливі тенденції в ваших даних.",
+ "ControlComparedToDescription": "Приріст у порівнянні з",
+ "ControlFilterByDescription": "Показати всі, тільки рухомі, тільки нові або тільки зниклі",
+ "DatePeriodCombinationNotSupported": "Для комбінації цієї дати і періоду неможливо згенерувати прогнози.",
+ "DayComparedToPreviousDay": "попередній день",
+ "DayComparedToPreviousWeek": "того ж дня тижнем раніше",
+ "DayComparedToPreviousYear": "того ж дня в попередньому році",
+ "Filter": "Фільтр",
+ "FilterIncreaserAndDecreaser": "Зростаючі і спадаючі",
+ "FilterOnlyDecreaser": "Тільки спадаючі",
+ "FilterOnlyDisappeared": "Тільки зниклі",
+ "FilterOnlyIncreaser": "Тільки зростаючі",
+ "FilterOnlyMovers": "Тільки рухомі",
+ "FilterOnlyNew": "Тільки нові",
+ "IgnoredChanges": "Зміни, що зачіпають менше, ніж %s візитів, були пропущені.",
+ "MonthComparedToPreviousMonth": "попередній місяць",
+ "MonthComparedToPreviousYear": "той же місяць роком раніше",
+ "MoversAndShakersWidgetTitle": "Рухомі і тремтячі",
+ "NoResultMatchesCriteria": "Немає рядків, що відповідають критеріям",
+ "OverviewWidgetTitle": "Огляд Прогнозів",
+ "TitleConsideredInsightsChanges": "Ряди, що збільшилися або зменшилися принаймні на %1$s візитів (%2$s%% з %3$s візитів загалом).",
+ "TitleConsideredInsightsGrowth": "Наступні рядки мають приріст принаймні %1$s%% порівняно з %2$s.",
+ "TitleConsideredMoversAndShakersChanges": "Вважаються рухомими, тільки якщо вони збільшилися на більш ніж %1$s%% візитів або скоротилися на менш ніж %2$s%% візитів, нові записи, якщо вони збільшилися на більш ніж %3$s%% візитів (%4$s), і зниклі ряди, якщо вони скоротилися на менш ніж %5$s%% візитів (%6$s).",
+ "TitleConsideredMoversAndShakersGrowth": "%1$s змінився з %2$s до %3$s порівняно %4$s. Грунтуючись на цьому, очікується розвиток кожного ряду %5$s%%.",
+ "TitleRowChangeDetails": "'%1$s' змінилося з %2$s (%3$s) до %4$s (%5$s) %6$s.",
+ "TitleRowDisappearedDetails": "'%1$s' зменшилася на %2$s і пропало в %3$s порівняно з %4$s.",
+ "TitleRowMoverAndShaker": "Вплив цього рядка більше середнього.",
+ "TitleRowNewDetails": "'%1$s' збільшилось на %2$s і є новим у порівнянні з %3$s.",
+ "WeekComparedToPreviousWeek": "попередній тиждень",
+ "WidgetCategory": "Прогнози",
+ "YearComparedToPreviousYear": "минулий рік"
+ }
+} \ No newline at end of file
diff --git a/plugins/Installation/Controller.php b/plugins/Installation/Controller.php
index f201c15616..374acee4e3 100644
--- a/plugins/Installation/Controller.php
+++ b/plugins/Installation/Controller.php
@@ -280,8 +280,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
$email = $form->getSubmitValue('email');
$newsletterPiwikORG = $form->getSubmitValue('subscribe_newsletter_piwikorg');
- $newsletterPiwikPRO = $form->getSubmitValue('subscribe_newsletter_piwikpro');
- $this->registerNewsletter($email, $newsletterPiwikORG, $newsletterPiwikPRO);
+ $newsletterProfessionalServices = $form->getSubmitValue('subscribe_newsletter_professionalservices');
+ $this->registerNewsletter($email, $newsletterPiwikORG, $newsletterProfessionalServices);
$this->redirectToNextStep(__FUNCTION__);
} catch (Exception $e) {
@@ -301,6 +301,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
{
$this->checkPiwikIsNotInstalled();
+ ServerFilesGenerator::createFilesForSecurity();
+
$siteIdsCount = Access::doAsSuperUser(function () {
return count(APISitesManager::getInstance()->getAllSitesId());
});
@@ -426,6 +428,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
$view->addForm($form);
$view->showNextStep = false;
+ $view->linkToProfessionalServices = StaticContainer::get('Piwik\ProfessionalServices\Advertising')->getPromoUrlForProfessionalServices($medium = 'App_InstallationFinished');
$output = $view->render();
return $output;
@@ -713,16 +716,16 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
/**
* @param $email
* @param $newsletterPiwikORG
- * @param $newsletterPiwikPRO
+ * @param $newsletterProfessionalServices
*/
- protected function registerNewsletter($email, $newsletterPiwikORG, $newsletterPiwikPRO)
+ protected function registerNewsletter($email, $newsletterPiwikORG, $newsletterProfessionalServices)
{
$url = Config::getInstance()->General['api_service_url'];
$url .= '/1.0/subscribeNewsletter/';
$params = array(
'email' => $email,
'piwikorg' => $newsletterPiwikORG,
- 'piwikpro' => $newsletterPiwikPRO,
+ 'piwikpro' => $newsletterProfessionalServices,
'url' => Url::getCurrentUrlWithoutQueryString(),
'language' => StaticContainer::get('Piwik\Translation\Translator')->getCurrentLanguage(),
);
@@ -762,4 +765,5 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
return $result;
});
}
+
}
diff --git a/plugins/Installation/FormDatabaseSetup.php b/plugins/Installation/FormDatabaseSetup.php
index 90f563d9fc..2b1be5b089 100644
--- a/plugins/Installation/FormDatabaseSetup.php
+++ b/plugins/Installation/FormDatabaseSetup.php
@@ -34,12 +34,16 @@ class FormDatabaseSetup extends QuickForm2
function init()
{
HTML_QuickForm2_Factory::registerRule('checkValidFilename', 'Piwik\Plugins\Installation\FormDatabaseSetup_Rule_checkValidFilename');
+ HTML_QuickForm2_Factory::registerRule('checkValidDbname', 'Piwik\Plugins\Installation\FormDatabaseSetup_Rule_checkValidDbname');
HTML_QuickForm2_Factory::registerRule('checkUserPrivileges', 'Piwik\Plugins\Installation\Rule_checkUserPrivileges');
$availableAdapters = Adapter::getAdapters();
$adapters = array();
foreach ($availableAdapters as $adapter => $port) {
$adapters[$adapter] = $adapter;
+ if (Adapter::isRecommendedAdapter($adapter)) {
+ $adapters[$adapter] .= ' (' . Piwik::translate('General_Recommended') . ')';
+ }
}
$this->addElement('text', 'host')
@@ -60,7 +64,7 @@ class FormDatabaseSetup extends QuickForm2
$item = $this->addElement('text', 'dbname')
->setLabel(Piwik::translate('Installation_DatabaseSetupDatabaseName'));
$item->addRule('required', Piwik::translate('General_Required', Piwik::translate('Installation_DatabaseSetupDatabaseName')));
- $item->addRule('checkValidFilename', Piwik::translate('General_NotValid', Piwik::translate('Installation_DatabaseSetupDatabaseName')));
+ $item->addRule('checkValidDbname', Piwik::translate('General_NotValid', Piwik::translate('Installation_DatabaseSetupDatabaseName')));
$this->addElement('text', 'tables_prefix')
->setLabel(Piwik::translate('Installation_DatabaseSetupTablePrefix'))
@@ -302,7 +306,7 @@ class Rule_checkUserPrivileges extends HTML_QuickForm2_Rule
}
/**
- * Filename check for prefix/DB name
+ * Filename check for prefix
*
*/
class FormDatabaseSetup_Rule_checkValidFilename extends HTML_QuickForm2_Rule
@@ -315,3 +319,17 @@ class FormDatabaseSetup_Rule_checkValidFilename extends HTML_QuickForm2_Rule
}
}
+/**
+ * Filename check for DB name
+ *
+ */
+class FormDatabaseSetup_Rule_checkValidDbname extends HTML_QuickForm2_Rule
+{
+ function validateOwner()
+ {
+ $prefix = $this->owner->getValue();
+ return empty($prefix)
+ || DbHelper::isValidDbname($prefix);
+ }
+}
+
diff --git a/plugins/Installation/FormSuperUser.php b/plugins/Installation/FormSuperUser.php
index 8c14e13716..ff41d2f617 100644
--- a/plugins/Installation/FormSuperUser.php
+++ b/plugins/Installation/FormSuperUser.php
@@ -40,9 +40,8 @@ class FormSuperUser extends QuickForm2
->setLabel(Piwik::translate('Installation_Password'));
$password->addRule('required', Piwik::translate('General_Required', Piwik::translate('Installation_Password')));
$pwMinLen = UsersManager::PASSWORD_MIN_LENGTH;
- $pwMaxLen = UsersManager::PASSWORD_MAX_LENGTH;
- $pwLenInvalidMessage = Piwik::translate('UsersManager_ExceptionInvalidPassword', array($pwMinLen, $pwMaxLen));
- $password->addRule('length', $pwLenInvalidMessage, array('min' => $pwMinLen, 'max' => $pwMaxLen));
+ $pwLenInvalidMessage = Piwik::translate('UsersManager_ExceptionInvalidPassword', array($pwMinLen));
+ $password->addRule('length', $pwLenInvalidMessage, array('min' => $pwMinLen));
$passwordBis = $this->addElement('password', 'password_bis')
->setLabel(Piwik::translate('Installation_PasswordRepeat'));
@@ -59,22 +58,15 @@ class FormSuperUser extends QuickForm2
'content' => '&nbsp;&nbsp;' . Piwik::translate('Installation_PiwikOrgNewsletter'),
));
- $piwikProNewsletter = Piwik::translate('Installation_PiwikProNewsletter',
- array("<a href='http://piwik.pro?pk_medium=App_Newsletter_link&pk_source=Piwik_App&pk_campaign=App_Installation' style='color:#444;' rel='noreferrer' target='_blank'>", "</a>")
+ $professionalServicesNewsletter = Piwik::translate('Installation_ProfessionalServicesNewsletter',
+ array("<a href='http://piwik.org/consulting/?pk_medium=App_Newsletter_link&pk_source=Piwik_App&pk_campaign=App_Installation' style='color:#444;' rel='noreferrer' target='_blank'>", "</a>")
);
$currentLanguage = StaticContainer::get('Piwik\Translation\Translator')->getCurrentLanguage();
- if ($currentLanguage == 'de') {
- $piwikProNewsletter = Piwik::translate('Installation_PiwikProNewsletter',
- array("<a href='http://piwikpro.de?pk_medium=App_Newsletter_link&pk_source=Piwik_App&pk_campaign=App_Installation' style='color:#444;' rel='noreferrer' target='_blank'>", "</a>")
- );
- $piwikProNewsletter = preg_replace('(Piwik PRO(?! GmbH))', 'Piwik PRO GmbH', $piwikProNewsletter);
- }
-
- $this->addElement('checkbox', 'subscribe_newsletter_piwikpro', null,
+ $this->addElement('checkbox', 'subscribe_newsletter_professionalservices', null,
array(
- 'content' => '&nbsp;&nbsp;' . $piwikProNewsletter,
+ 'content' => '&nbsp;&nbsp;' . $professionalServicesNewsletter,
));
$this->addElement('submit', 'submit', array('value' => Piwik::translate('General_Next') . ' »', 'class' => 'btn'));
@@ -82,7 +74,7 @@ class FormSuperUser extends QuickForm2
// default values
$this->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
'subscribe_newsletter_piwikorg' => 1,
- 'subscribe_newsletter_piwikpro' => $currentLanguage == 'de' ? 0 : 1,
+ 'subscribe_newsletter_professionalservices' => $currentLanguage == 'de' ? 0 : 1,
)));
}
}
diff --git a/plugins/Installation/Installation.php b/plugins/Installation/Installation.php
index 46e6122f6a..023723c3b3 100644
--- a/plugins/Installation/Installation.php
+++ b/plugins/Installation/Installation.php
@@ -105,7 +105,7 @@ class Installation extends \Piwik\Plugin
if ($this->isAllowedAction($action)) {
echo FrontController::getInstance()->dispatch('Installation', $action, array($message));
} else {
- Piwik::exitWithErrorMessage(Piwik::translate('Installation_NoConfigFound'));
+ Piwik::exitWithErrorMessage($this->getMessageToInviteUserToInstallPiwik($message));
}
exit;
@@ -127,4 +127,22 @@ class Installation extends \Piwik\Plugin
return in_array($action, array_keys($controller->getInstallationSteps()))
|| $isActionWhiteListed;
}
+
+ /**
+ * @param $message
+ * @return string
+ */
+ private function getMessageToInviteUserToInstallPiwik($message)
+ {
+ $messageWhenPiwikSeemsNotInstalled =
+ $message .
+ "\n<br/>" .
+ Piwik::translate('Installation_NoConfigFileFound') .
+ "<br/><b>» " .
+ Piwik::translate('Installation_YouMayInstallPiwikNow', array("<a href='index.php'>", "</a></b>")) .
+ "<br/><small>" .
+ Piwik::translate('Installation_IfPiwikInstalledBeforeTablesCanBeKept') .
+ "</small>";
+ return $messageWhenPiwikSeemsNotInstalled;
+ }
}
diff --git a/plugins/Installation/ServerFilesGenerator.php b/plugins/Installation/ServerFilesGenerator.php
index c3c56f9a3c..19b7d8e903 100644
--- a/plugins/Installation/ServerFilesGenerator.php
+++ b/plugins/Installation/ServerFilesGenerator.php
@@ -13,6 +13,17 @@ use Piwik\SettingsServer;
class ServerFilesGenerator
{
+ public static function createFilesForSecurity()
+ {
+ self::deleteHtAccessFiles();
+ self::createHtAccessFiles();
+
+ self::deleteWebConfigFiles();
+ self::createWebConfigFiles();
+
+ self::createWebRootFiles();
+ }
+
/**
* Generate Apache .htaccess files to restrict access
* .htaccess files are created on all webservers even Nginx, as sometimes Nginx knows how to handle .htaccess files
@@ -64,11 +75,6 @@ class ServerFilesGenerator
}
}
- public static function createHtAccessDenyAll($path)
- {
- self::createHtAccess($path, $overwrite = false, self::getDenyAllHtaccessContent());
- }
-
/**
* Create .htaccess file in specified directory
*
@@ -83,6 +89,8 @@ class ServerFilesGenerator
protected static function createHtAccess($path, $overwrite = true, $content)
{
$file = $path . '/.htaccess';
+
+ $content = "# This file is auto generated by Piwik, do not edit directly\n# Please report any issue or improvement directly to the Piwik team.\n\n" . $content;
if ($overwrite || !file_exists($file)) {
@file_put_contents($file, $content);
}
@@ -93,7 +101,7 @@ class ServerFilesGenerator
*
* Note: for IIS 7 and above
*/
- public static function createWebConfigFiles()
+ protected static function createWebConfigFiles()
{
if (!SettingsServer::isIIS()) {
return;
@@ -183,7 +191,10 @@ class ServerFilesGenerator
'/favicon.ico',
);
foreach ($filesToCreate as $file) {
- @file_put_contents(PIWIK_DOCUMENT_ROOT . $file, '');
+ $path = PIWIK_DOCUMENT_ROOT . $file;
+ if(!file_exists($path)) {
+ @file_put_contents($path, '');
+ }
}
}
diff --git a/plugins/Installation/lang/am.json b/plugins/Installation/lang/am.json
index d99c074673..7cef031340 100644
--- a/plugins/Installation/lang/am.json
+++ b/plugins/Installation/lang/am.json
@@ -6,7 +6,6 @@
"GoBackAndDefinePrefix": "ወደኋላ ተመለስና ለፒዊክ ሰንጠረዦቹ ቅድም ቅጥያውን በይን",
"Installation": "መጫኛ",
"InstallationStatus": "የመጫኛ ሁኔታ",
- "NoConfigFound": "የፒዊክ ውቅረት ፋይል ሊገኝ አልቻለም እና እርስዎ የፒዊክ ገፅ ለመድረስ እየሞከሩ ነው። <br \/><b>  » እርስዎ <a href='index.php'>ፒዊክን አሁን መጫን ይችላሉ<\/a><\/b><br \/><small>ፒዊክን ከዚህ ቀደም ጭነው ከነበረ እና በዲቢዎ ላይ የተወሰኑ ሰንጠረዦች ካለዎ የነበሩትን ሰንጠረዦች ደግመው መጠቀምና የነበረዎትን ውሂብ ማስቀመጥ ይችላሉ!<\/small>",
"PasswordDoNotMatch": "የይለፍ ቃሉ አቻ አይደለም",
"PercentDone": "%s %% አልቋል",
"SetupWebsite": "ድር ጣቢያ ጫን",
diff --git a/plugins/Installation/lang/ar.json b/plugins/Installation/lang/ar.json
index 301db9879a..b62e05e02d 100644
--- a/plugins/Installation/lang/ar.json
+++ b/plugins/Installation/lang/ar.json
@@ -36,14 +36,11 @@
"NfsFilesystemWarning": "الخادم لديك يستخدم نظام ملفات NFS .",
"NfsFilesystemWarningSuffixAdmin": "هذا يعني أن Piwik سيكون بطيئاً جداً عند استخدام جلسات قائمة على الملفات.",
"NfsFilesystemWarningSuffixInstall": "استخدام الجلسات القائمة على الملفات في بيئة NFS شيئ بطيئ جداً ، ولهذا سيستخدم Piwik جلسات قواعد البيانات. قد تحتاج زيادة العدد الأقصى لاتصالات المستفيدين بخادم قاعدة البيانات إذا كان لديك العديد من مستخدمي لوحات المعلومات المتزامنين.",
- "NoConfigFound": "لم يمكن العثور على ملف إعدادات Piwik، وأنت تحاول الوصول لأحد صفحات Piwik. <br \/><b> يمكنك <a href='index.php'>تثبيت Piwik الآن<\/a><\/b><br \/><small> إذا كنت قد ثبته مسبقاً ولديك بعض الجداول في قاعدة البيانات. ولا داعي للقلق، فيمكنك إعادة استخدام الجداول القديمة والاحتفاظ ببياناتك القديمة!<\/small>",
"Optional": "اختياري",
"Password": "كلمة المرور",
"PasswordDoNotMatch": "كلمة المرور غير متطابقة",
"PasswordRepeat": "كلمة المرور(كرّرها)",
"PercentDone": "تم تنفيذ %s %%",
- "PiwikProAdTitle": "تحليلات وخدمات متقدمة",
- "PiwikProAdText": "أضف أعلى الإمكانات وأطلق عنان %1$sPiwik PRO On-Premises%2$s أو احصل على بيويك خاص بك دون عناء باستضافة سحابية على %3$sPiwik PRO Cloud%4$s .",
"PleaseFixTheFollowingErrors": "الرجاء إصلاح الأخطاء التالية",
"DefaultSettings": "إعدادات Piwik الافتراضية",
"DefaultSettingsHelp": "يأتي Piwik بإعدادات افتراضية. يمكنك تخصيصها الآن أو فعل ذلك لاحقاً في شاشة الإدارة.",
@@ -51,7 +48,6 @@
"RestartWebServer": "أعد تشغيل خادم الويب لديك بعد القيام بهذا التغيير.",
"ReusingTables": "إعادة استخدام الجداول",
"PiwikOrgNewsletter": "أرسل لي بريداً بآخر تحديثات مجتمع Piwik",
- "PiwikProNewsletter": "أرسل لي معلومات عن خدمات وعروض %1$sPiwik PRO%2$s",
"SeeBelowForMoreInfo": "أنظر أدناه لمزيد من المعلومات.",
"SetupWebsite": "إعداد موقع ويب",
"SetupWebsiteError": "حدث خطأ ما أثناء إضافة الموقع",
diff --git a/plugins/Installation/lang/be.json b/plugins/Installation/lang/be.json
index 6172c51b2e..53a73b88ea 100644
--- a/plugins/Installation/lang/be.json
+++ b/plugins/Installation/lang/be.json
@@ -19,7 +19,6 @@
"InstallationStatus": "Статут усталёўкі",
"LargePiwikInstances": "Дапамога для буйных усталёвак Piwik",
"Legend": "Легенда",
- "NoConfigFound": "Канфігурацыйны файл Piwik не можа быць знойдзены, аднак вы спрабуеце зайсці ў сістэму.<br \/><b>  » Вы можаце <a href='index.php'>усталяваць Piwik цяпер<\/a><\/b><br \/><small>. Калі Piwik ужо быў усталяваны і вы маеце дадзеныя ў БД, вы можаце выкарыстоўваць іх.<\/small>",
"Optional": "Апцыянальна",
"PasswordDoNotMatch": "пароль не супадае",
"PercentDone": "%s %% Завершана",
diff --git a/plugins/Installation/lang/bg.json b/plugins/Installation/lang/bg.json
index 32682099ec..4e93b6a1c6 100644
--- a/plugins/Installation/lang/bg.json
+++ b/plugins/Installation/lang/bg.json
@@ -30,7 +30,6 @@
"LoadDataInfileRecommended": "Ако Piwik събира статистика за сайтове с голям брой посещения (пример: > 100 000 страници на месец), препоръчваме да се опитате да оправите този проблем.",
"NfsFilesystemWarning": "Вашият сървър ползва NFS файлова система.",
"NfsFilesystemWarningSuffixAdmin": "Това означава, че Piwik ще бъде изключително бавен, когато използвате файлови базирани сесии.",
- "NoConfigFound": "Piwik конфигурационният файл не е открит.<br \/><b>  » Можете да <a href='index.php'>инсталирате Piwik сега<\/a><\/b><br \/><small>Ако преди това сте инсталирали Piwik и имате в базата от данни (БД) таблици - можете да запазите Вашите данни!<\/small>",
"Optional": "По избор",
"PasswordDoNotMatch": "паролата не съвпада",
"PercentDone": "%s %% развитие",
diff --git a/plugins/Installation/lang/ca.json b/plugins/Installation/lang/ca.json
index ae0d478900..c5f91612b5 100644
--- a/plugins/Installation/lang/ca.json
+++ b/plugins/Installation/lang/ca.json
@@ -27,7 +27,6 @@
"NfsFilesystemWarning": "El vostre servidor està utiltizant un sistema de fitxers NFS.",
"NfsFilesystemWarningSuffixAdmin": "Això vol dir que el Piwik serà extremadament lent quan utilitzi les sessions basades en fitxers.",
"NfsFilesystemWarningSuffixInstall": "Utilitzar sessions basades en fitxers amb NFS es extremadament lent, per això Piwik utilizarà les sessions de bases de dades. Si teniu molt usuaris concurrents, potser haureu d'incrementar el nombre de conexions concurrens al servidor de bases de dades.",
- "NoConfigFound": "No s'ha trobat el fitxer de configuració del Piwik i esteu intentant accedir una pàgina del Piwik.<br \/><strong>  »Podeu <a href='index.php'>instal·lar el Piwik ara<\/a><\/strong>.<br \/><small>Si heu instal·lat el Piwik abans i teniu algunes taules a la vostra base de dades, no us amoïneu; podeu continuar fent servir les mateixes taules i les dades existents es conservaran!<\/small>",
"Optional": "Opcional",
"PasswordDoNotMatch": "Les contrasenyes no coincideixen",
"PercentDone": "%s%% fet",
diff --git a/plugins/Installation/lang/cs.json b/plugins/Installation/lang/cs.json
index c7e657835d..70abe1a1b8 100644
--- a/plugins/Installation/lang/cs.json
+++ b/plugins/Installation/lang/cs.json
@@ -36,14 +36,15 @@
"NfsFilesystemWarning": "Váš server používá souborový systém NFS.",
"NfsFilesystemWarningSuffixAdmin": "To znamená, že Piwik bude při použití sessions založených na souborech velmi pomalý.",
"NfsFilesystemWarningSuffixInstall": "Sessions založené na souborech jsou na NFS velmi pomalé. Proto Piwik použije databázové sessions. Pokud bude k nástěnkám přistupovat současně hodně uživatelů, možná budete muset zvýšit maximální počet klientských databázových spojení v konfiguraci databázového serveru.",
- "NoConfigFound": "Konfigurační soubor Piwiku nebyl nalezen a snažíte se vstoupit na stránku Piwiku.<br \/><b> » Můžete <a href='index.php'>teď nainstalovat<\/a><\/b><br \/><small>Pokud jste Piwik již instalovali a máte v DB nějaké tabulky, nemějte obavy. Můžete je použít a zachovat jejich data.!<\/small>",
+ "NoConfigFileFound": "Konfigurační soubor pro Piwik nebyl nalezen a vy se snažíte otevřít stránku aplikace Piwik.",
+ "YouMayInstallPiwikNow": "Můžete %1$snyní nainstalovat Piwik%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Pokud jste Piwik nainstalovali již dříve a máte tabulky v databázi, nemějte strach, budete moci tyto tabulky dále používat a pracovat s existujícími daty!",
"Optional": "Volitelné",
"Password": "Heslo",
"PasswordDoNotMatch": "hesla si neodpovídají",
"PasswordRepeat": "Heslo (zopakujte)",
"PercentDone": "%s %% hotovo",
- "PiwikProAdTitle": "Pokročilé analýzy a služby",
- "PiwikProAdText": "Pořiďte si nadstandartní možnosti a odkryjte plnou sílu s %1$sPiwik PRO On-Premises%2$s, nebo si objednejte Piwik hostovaný bez starostí v %3$sPiwik PRO Cloud%4$s.",
+ "ProfessionalServicesAdTitle": "Pokročilá analytika & služby",
"PleaseFixTheFollowingErrors": "Prosím opravte následující chyby",
"DefaultSettings": "Výchozí nastavení Piwiku",
"DefaultSettingsHelp": "Piwik má výchozí nastavení. Můžete je změnit teď, nebo později z administračního rozhraní.",
@@ -51,7 +52,6 @@
"RestartWebServer": "Po uložení změn restartujte Vás web server.",
"ReusingTables": "Použití existujících tabulek",
"PiwikOrgNewsletter": "odesílat e-maily s důležitými událostmi v komunitě Piwiku",
- "PiwikProNewsletter": "Zasílejte mi informace o službách a nabídkách %1$sPiwik pro%2$s",
"SeeBelowForMoreInfo": "Pro více informací se podívejte níže.",
"SetupWebsite": "Nastavit Web",
"SetupWebsiteError": "Při přidávání Webu se vyskytla chyba",
diff --git a/plugins/Installation/lang/da.json b/plugins/Installation/lang/da.json
index a06a4585c8..fc8ce6e1e8 100644
--- a/plugins/Installation/lang/da.json
+++ b/plugins/Installation/lang/da.json
@@ -15,6 +15,7 @@
"DatabaseSetupLogin": "Brugernavn",
"DatabaseSetupServer": "Databaseserver",
"DatabaseSetupTablePrefix": "Tabel præfiks",
+ "Email": "E-mail",
"Extension": "udvidelse",
"Filesystem": "Filsystem",
"GetInvolved": "Hvis du kan lide hvad du ser, kan du %1$sblive involveret%2$s.",
@@ -34,9 +35,10 @@
"NfsFilesystemWarning": "Din server benytter et NFS filsystem.",
"NfsFilesystemWarningSuffixAdmin": "Det betyder at Piwik vil være ekstremt langsom når der benyttes filbaserede sessioner.",
"NfsFilesystemWarningSuffixInstall": "Brug af filbaserede sessioner på et NFS filsystem er ekstrem langsomt, så Piwik vil benytte database sessioner. Hvis du har mange samtidige kontrolpanelsbrugere, vil du muligvis være nødt til at hæve det maksimale antal af klient forbindelser til database serveren.",
- "NoConfigFound": "Piwik-konfigurationsfil blev ikke fundet og du prøver at få adgang til Piwik. <ul><li>Du kan <a href='index.php'>installere Piwik nu<\/a><\/b><small> Hvis du har installeret Piwik tidligere og har nogle tabeller i databasen, kan du genbruge tabellerne og holde dine eksisterende data!<\/small>",
"Optional": "Valgfri",
+ "Password": "Password",
"PasswordDoNotMatch": "adgangskoder stemmer ikke overens",
+ "PasswordRepeat": "Password (gentag)",
"PercentDone": "%s %% udført",
"PleaseFixTheFollowingErrors": "Ret følgende fejl",
"DefaultSettings": "Piwik standardindstillinger",
@@ -45,19 +47,22 @@
"RestartWebServer": "Efter ændringen er have foretaget - genstart webserveren.",
"ReusingTables": "Genbrug tabellerne",
"PiwikOrgNewsletter": "e-mail mig de vigtigste Piwik community opdateringer",
- "PiwikProNewsletter": "send mig information om %1$sPiwik PRO%2$s tjenester og tilbud",
"SeeBelowForMoreInfo": "Se nedenfor for mere information.",
"SetupWebsite": "Tilføj en hjemmeside",
"SetupWebsiteError": "Fejl ved tilføjelse af hjemmeside",
+ "SetupWebSiteName": "Website navn",
"SetupWebsiteSetupSuccess": "Hjemmeside %s oprettet!",
+ "SetupWebSiteURL": "Website URL",
"SiteSetup": "Opsæt den første hjemmeside, som du vil spore og analysere med Piwik:",
"SiteSetupFootnote": "Bemærk: når Piwik installationen er færdig, vil du have mulighed for at tilføje flere hjemmesider som du vil spore!",
"SuperUser": "Superbruger",
+ "SuperUserLogin": "Super user login",
"SuperUserSetupError": "Der opstod en fejl ved tilføjelse af superbruger",
"SuperUserSetupSuccess": "Superbruger oprettet.",
"SystemCheck": "Systemcheck",
"SystemCheckAutoUpdateHelp": "Note: Piwik's ét klik opdatering kræver skrive-tilladelser til Piwik mappen og dens indhold.",
"SystemCheckCreateFunctionHelp": "Piwik bruger anonyme funktioner til tilbagekald.",
+ "SystemCheckDatabaseExtensions": "MySQL udvidelser",
"SystemCheckDatabaseHelp": "Piwik behøver enten mysqli udvidelsen eller både PDO og pdo_mysql udvidelserne.",
"SystemCheckDebugBacktraceHelp": "View:: factory kan ikke oprette visninger for det modul.",
"SystemCheckError": "En fejl opstod - skal rettes før der fortsættes",
@@ -65,6 +70,7 @@
"SystemCheckExtensions": "Andre nødvendige udvidelser",
"SystemCheckFileIntegrity": "Filintegritet",
"SystemCheckFunctions": "Nødvendige funktioner",
+ "SystemCheckFunctionHelp": "Du skal aktivere denne indbyggede funktion.",
"SystemCheckGDFreeType": "GD > 2.x + Freetype (grafik)",
"SystemCheckGDHelp": "Mindre grafiske elementer (i Piwik Mobile app og e-mail-rapporter) vil ikke fungere som ønsket.",
"SystemCheckGlobHelp": "Den indbyggede funktion er blevet deaktiveret på din vært. Piwik vil forsøge at efterligne funktionen, men kan støde yderligere sikkerhedsrestriktioner. Funktionaliteten kan blive påvirket.",
@@ -95,6 +101,7 @@
"SystemCheckSummaryThereWereWarnings": "Der er nogle problemer med dit system. Piwik vil virke, men du kan opleve nogle mindre problemer.",
"SystemCheckTimeLimitHelp": "På en stærkt trafikeret hjemmeside, kan arkiveringsprocessen kræve mere tid end der tilladt.<br \/>Se på max_execution_time i php.ini filen hvis nødvendig.",
"SystemCheckTracker": "Sporingsstatus",
+ "SystemCheckTrackerHelp": "GET request til piwik.php fejlede. Prøv at hvidliste dette URL fra HTTP Authentication og deaktiver mod_secure (du skal nok spørge dit hostingfirma). For mere info om fejlen kan du læse web serverens log-fil.",
"SystemCheckWarnDomHelp": "Aktiver \"Dom\" udvidelsen (f.eks. installere \"php-dom\"og\/eller \"php-xml-pakken\").",
"SystemCheckWarning": "Piwik vil virke normalt, men nogle funktioner vil måske mangle",
"SystemCheckWarnJsonHelp": "Aktiver \"JSON\" udvidelsen (f.eks. installere \"php-JSON\" pakken) for bedre ydeevne.",
@@ -107,6 +114,8 @@
"SystemCheckCronArchiveProcess": "Arkiv Cron",
"SystemCheckCronArchiveProcessCLI": "Håndtering af processer via kommandolinie",
"SystemCheckPhpSetting": "For at undgå nogle kritiske punkter, skal følgende indstilles i php.ini filen: %s",
+ "SystemCheckUpdateHttps": "Opdater over HTTPS",
+ "SystemCheckUpdateHttpsNotSupported": "Piwik kan ikke bruge HTTPS til at opdatere, så den falder tilbage til HTTP opdatering. Tjek at CURL eller allow_url_fopen understøttes og at openssl PHP udvidelsen er installeret: http:\/\/piwik.org\/faq\/troubleshooting\/faq_177\/.",
"NotSupported": "Ikke supporteret",
"Tables": "Opretter tabeller",
"TablesCreatedSuccess": "Tabellerne blev oprettet!",
@@ -117,6 +126,7 @@
"TablesUpdatedSuccess": "Databasen er opdateret fra %1$s til %2$s!",
"TablesWarningHelp": "Vælg enten at genbruge de eksisterende tabeller eller vælg en ren installation for at slette alle eksisterende data.",
"TablesWithSameNamesFound": "Nogle %1$s tabeller i databasen %2$s har samme navn, som dem Piwik prøver at oprette",
+ "Timezone": "Websites tidszone",
"WeHopeYouWillEnjoyPiwik": "Vi håber du vil nyde at bruge Piwik så meget, som vi nyder at lave det.",
"Welcome": "Velkommen!",
"WelcomeHelp": "<p>Piwik er et Open Source statistik-program som gør det nemt at finde information om besøgende.<\/p><p> Processen er delt op i %s lette trin og vil tage ca. 5 minutter.<\/p>",
diff --git a/plugins/Installation/lang/de.json b/plugins/Installation/lang/de.json
index d46012b93e..28050912eb 100644
--- a/plugins/Installation/lang/de.json
+++ b/plugins/Installation/lang/de.json
@@ -35,13 +35,18 @@
"LoadDataInfileUnavailableHelp": "Die Benutzung von %1$s erhöht die Geschwindigkeit des Piwik Archivierungsprozesses erheblich. Um dies für Piwik verfügbar zu machen setzen Sie bitte eine neuere PHP & MySQL Software ein und stellen Sie sicher, dass der gewählte Datenbankbenutzer das %2$s Recht besitzt.",
"NfsFilesystemWarning": "Ihr Server nutzt ein NFS Dateisystem",
"NfsFilesystemWarningSuffixAdmin": "Dies bedeutet, dass Piwik extrem langsam arbeitet wenn Dateibasierte Sessions genutzt werden.",
- "NfsFilesystemWarningSuffixInstall": "Die Benutzung von dateibasierten Sessions auf NFS ist extrem langsam, deshalb wird Piwik datenbankbasierte Sessions nutzen. Falls es viele gleichzeitige Zugriffe auf das Dashboard gibt sollten Sie möglicherweise die maximal erlaubten Client-Zugriffe auf den Datenbankserver erhöhen.",
- "NoConfigFound": "Die Piwik-Konfigurationsdatei konnte nicht gefunden werden und es wird versucht, eine Piwik-Seite aufzurufen.<br \/><b>  » Sie können <a href='index.php'>Piwik jetzt installieren<\/a><\/b><br \/><small>Wenn Sie Piwik zuvor schon installiert haben und noch Tabellen in der Datenbank vorhanden sind: Keine Angst, Sie können diese Tabellen und die enthaltenen Daten weiterhin verwenden!<\/small>",
+ "NfsFilesystemWarningSuffixInstall": "Die Benutzung von dateibasierten Sessions auf NFS ist extrem langsam, deshalb wird Piwik datenbankbasierte Sessions nutzen. Falls es viele gleichzeitige Zugriffe auf das Dashboard gibt, sollten Sie möglicherweise die maximal erlaubten Client-Zugriffe auf den Datenbankserver erhöhen.",
+ "NoConfigFileFound": "Sie versuchen gerade auf eine Piwik-Seite zuzugreifen, die Konfigurationsdatei von Piwik konnte jedoch nicht gefunden werden.",
+ "YouMayInstallPiwikNow": "Sie können %1$sPiwik jetzt installieren%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Wenn Sie Piwik zuvor schon installiert haben und noch Tabellen in der Datenbank vorhanden sind: Keine Angst, Sie können diese Tabellen und die enthaltenen Daten weiterhin verwenden!",
"Optional": "Optional",
"Password": "Passwort",
"PasswordDoNotMatch": "Passwörter stimmen nicht überein",
"PasswordRepeat": "Passwort (wiederholen)",
"PercentDone": "%s %% Fertig",
+ "ProfessionalServicesAdTitle": "Erweiterte Analysen & Service",
+ "ProfessionalServicesfessionalServicesAdText": "Unser Expertennetzwerk hilft Ihrer Organisation die volle Kraft hinter Piwik analytics freizusetzen.",
+ "ProfessionalServicesfessionalDiscoverHow": "Erfahren Sie mehr über %1$szusätzliche Produkte und Dienstleistungen%2$s für Piwik und wie Sie Ihre Konversionen und Einnahmen steigern können.",
"PleaseFixTheFollowingErrors": "Bitte beheben Sie die folgenden Fehler",
"DefaultSettings": "Standard Piwik Einstellungen",
"DefaultSettingsHelp": "Piwik ist mit Standardeinstellungen vorkonfiguriert. Sie können diese nun personalisieren oder dies später im Adminbereich nachholen.",
@@ -49,7 +54,7 @@
"RestartWebServer": "Nach dieser Änderung müssen Sie den Webserver neu starten.",
"ReusingTables": "Tabellen werden wiederverwendet",
"PiwikOrgNewsletter": "Wichtige Piwik Community Updates per Mail zukommen lassen",
- "PiwikProNewsletter": "Lassen Sie mir Informationen über %1$sPiwik PRO%2$s Dienstleistungen und Angebote zukommen.",
+ "ProfessionalServicesNewsletter": "Lassen Sie mir Informationen über %1$sProfessional Dienstleistungen und Produkte%2$s für Piwik zukommen.",
"SeeBelowForMoreInfo": "Unterhalb können Sie weitere Informationen finden.",
"SetupWebsite": "Website hinzufügen",
"SetupWebsiteError": "Beim Hinzufügen der Website ist ein Fehler aufgetreten",
diff --git a/plugins/Installation/lang/el.json b/plugins/Installation/lang/el.json
index a2c6a6e5c5..95aa300268 100644
--- a/plugins/Installation/lang/el.json
+++ b/plugins/Installation/lang/el.json
@@ -36,14 +36,17 @@
"NfsFilesystemWarning": "Ο διακομιστής σας χρησιμοποιεί ένα σύστημα αρχείων NFS.",
"NfsFilesystemWarningSuffixAdmin": "Αυτό σημαίνει ότι το Piwik θα είναι εξαιρετικά αργό, όταν χρησιμοποιεί το αρχείο συνεδρίες σε αρχεία (file based sessions).",
"NfsFilesystemWarningSuffixInstall": "Οι συνεδρίες αρχείων (file based sessions) στο NFS είναι εξαιρετικά αργές, έτσι το Piwik θα χρησιμοποιήσει συνεδρίες με βάση δεδομένων. Εάν έχετε πολλούς ταυτόχρονους χρήστες, μπορεί να χρειαστεί να αυξήσετε τον μέγιστο αριθμό συνδέσεων προς τον εξυπηρετητή της βάσης δεδομένων.",
- "NoConfigFound": "Το αρχείο ρυθμίσεων του Piwik δεν βρέθηκε και προσπαθείτε να ανοίξετε μια σελίδα Piwik.<br \/><b>  » Μπορείτε να <a href=\"index.php\">εγκαταστήσετε το Piwik τώρα<\/a><\/b><br \/><small>αν έχετε εγκαταστήσει το Piwik προηγούμενα και έχετε κάποιους πίνακες στη βάση δεδομένων σας, μην ανησυχείτε, μπορείτε να χρησιμοποιήσετε ξανά τους ίδιους πίνακες και να διατηρήσετε τα υπάρχοντα δεδομένα σας!<\/small>",
+ "NoConfigFileFound": "Δεν ήταν δυνατή η εύρεση του αρχείου ρυθμίσεων του Piwik και προσπαθείτε να προσπελάσετε μια σελίδα του.",
+ "YouMayInstallPiwikNow": "Μπορείτε να %1$sεγκαταστήσετε το Piwik τώρα%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Αν εγκαταστήσατε το Piwik παλιότερα και υπάρχουν κάποιοι πίνακες στη βάση σας, μην ανησυχείτε, μπορείτε να χρησιμοποιήσετε πάλι τους ίδιους πίνακες και να διατηρήσετε τα υπάρχοντα δεδομένα σας!",
"Optional": "Προαιρετικά",
"Password": "Συνθηματικό",
"PasswordDoNotMatch": "ο κωδικός δεν ταιριάζει",
"PasswordRepeat": "Συνθηματικό (επιβεβαίωση)",
"PercentDone": "%s %% Ολοκληρώθηκε",
- "PiwikProAdTitle": "Αναλυτικά & Υπηρεσίες για Προχωρημένους",
- "PiwikProAdText": "Προσθέστε επιπλέον λειτουργικότητα και ξεκλειδώστε την πλήρη δύναμη με το %1$sPiwik PRO On-Premises%2$s, ή αποκτήστε το δικό σας Piwik φιλοξενούμενο σε εξωτερική υποδομή με το %3$sPiwik PRO Cloud%4$s.",
+ "ProfessionalServicesAdTitle": "Προχωρημένα Αναλυτικά & Υπηρεσίες",
+ "ProfessionalServicesfessionalServicesAdText": "Το δίκτυο των ειδικών μας μπορεί να βοηθήσει τον οργανισμό σας να ξεκλειδώσει την πλήρη δύναμη των αναλυτικών Piwik.",
+ "ProfessionalServicesfessionalDiscoverHow": "Δείτε περισσότερα σχετικά με %1$sπρόσθετα προϊόντα και υπηρεσίες%2$s για το Piwik και πως μπορείτε να αυξήσετε τις μετατροπές και τα κέρδη σας.",
"PleaseFixTheFollowingErrors": "Διορθώστε τα ακόλουθα σφάλματα",
"DefaultSettings": "Προκαθορισμένες ρυθμίσεις του Piwik",
"DefaultSettingsHelp": "Το Piwik έρχεται με προκαθορισμένες ρυθμίσεις. Μπορείτε να τις αλλάξετε τώρα ή αργότερα στην οθόνη διαχείρισης.",
@@ -51,7 +54,7 @@
"RestartWebServer": "Μετά από αυτή την αλλαγή, επανεκκινήστε τον διακομιστή σας.",
"ReusingTables": "Γίνεται χρήση των Πινάκων",
"PiwikOrgNewsletter": "στείλε μου e-mail για μεγάλες ενημερώσεις της κοινοτικής έκδοσης του Piwik",
- "PiwikProNewsletter": "στείλε μου πληροφορίες σχετικά με τις υπηρεσίες του %1$sPiwik PRO%2$s και τις προσφορές του",
+ "ProfessionalServicesNewsletter": "να μου σταλούν πληροφορίες σχετικά με %1$sΥπηρεσίες και προϊόντα επαγγελματικού επιπέδου%2$s για το Piwik",
"SeeBelowForMoreInfo": "Δείτε παρακάτω για περισσότερες πληροφορίες.",
"SetupWebsite": "Ρύθμιση μιας ιστοσελίδας",
"SetupWebsiteError": "Συνέβη ένα σφάλμα κατά της προσθήκη της ιστοσελίδας",
diff --git a/plugins/Installation/lang/en.json b/plugins/Installation/lang/en.json
index d4b2707162..6e13414628 100644
--- a/plugins/Installation/lang/en.json
+++ b/plugins/Installation/lang/en.json
@@ -36,14 +36,17 @@
"NfsFilesystemWarning": "Your server is using an NFS filesystem.",
"NfsFilesystemWarningSuffixAdmin": "This means Piwik will be extremely slow when using file based sessions.",
"NfsFilesystemWarningSuffixInstall": "Using file based sessions on NFS is extremely slow, so Piwik will use database sessions. If you have many concurrent dashboard users, you may need to increase the maximum number of client connections to the database server.",
- "NoConfigFound": "The Piwik configuration file couldn't be found and you are trying to access a Piwik page.<br \/><b>  » You can <a href='index.php'>install Piwik now<\/a><\/b><br \/><small>If you installed Piwik before and have some tables in your DB, don't worry, you can reuse the same tables and keep your existing data!<\/small>",
+ "NoConfigFileFound": "The Piwik configuration file couldn't be found and you are trying to access a Piwik page.",
+ "YouMayInstallPiwikNow": "You may %1$sinstall Piwik now%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "If you installed Piwik before and have some tables in your DB, don't worry, you can reuse the same tables and keep your existing data!",
"Optional": "Optional",
"Password": "Password",
"PasswordDoNotMatch": "password do not match",
"PasswordRepeat": "Password (repeat)",
"PercentDone": "%s %% Done",
- "PiwikProAdTitle": "Advanced Analytics & Services",
- "PiwikProAdText": "Add premium functionality and unlock the full power with %1$sPiwik PRO On-Premises%2$s, or get your own hassle-free Piwik hosted in the %3$sPiwik PRO Cloud%4$s.",
+ "ProfessionalServicesAdTitle": "Advanced Analytics & Services",
+ "ProfessionalServicesfessionalServicesAdText": "Our network of experts can help your organization unlock the full power of Piwik analytics. ",
+ "ProfessionalServicesfessionalDiscoverHow": "Learn about %1$sadditional products and services%2$s for Piwik and how to increase your conversions and revenue.",
"PleaseFixTheFollowingErrors": "Please fix the following errors",
"DefaultSettings": "Default Piwik settings",
"DefaultSettingsHelp": "Piwik comes with default settings. You can customize them now or do so later in the admin screen.",
@@ -51,7 +54,7 @@
"RestartWebServer": "After making this change, restart your web server.",
"ReusingTables": "Reusing the Tables",
"PiwikOrgNewsletter": "email me with major Piwik community updates",
- "PiwikProNewsletter": "send me information on %1$sPiwik PRO%2$s services and offers",
+ "ProfessionalServicesNewsletter": "send me information on %1$sProfessional services and products%2$s for Piwik",
"SeeBelowForMoreInfo": "See below for more information.",
"SetupWebsite": "Setup a Website",
"SetupWebsiteError": "There was an error when adding the website",
diff --git a/plugins/Installation/lang/es.json b/plugins/Installation/lang/es.json
index 58ad29cbea..997665001c 100644
--- a/plugins/Installation/lang/es.json
+++ b/plugins/Installation/lang/es.json
@@ -36,12 +36,17 @@
"NfsFilesystemWarning": "Su servidor está utilizando un sistema de archivos NFS.",
"NfsFilesystemWarningSuffixAdmin": "Esto significa que Piwik será extremadamente lento cuando se utilice sesiones basadas en archivos.",
"NfsFilesystemWarningSuffixInstall": "Utilizando sesiones basadas en archivos sobre NFS es extremadamente lento, por lo tanto Piwik utilizará sesiones basada en base de datos. Si tiene varios usuarios de tableros, puede que necesite incrementar el número máximo de conexiones de clientes al servidor de la base de datos.",
- "NoConfigFound": "El archivo de configuración de Piwik no se ha encontrado y está intentando acceder a una página de Piwik.<br \/><b>  » Puede <a href='index.php'>instalar Piwik ahora<\/a><\/b><br \/><small>¡Si ha instalado Piwik antes y tiene algunas tablas en su base de datos, no se preocupe, puede reutilizar las mismas tablas y mantener sus datos existentes!<\/small>",
+ "NoConfigFileFound": "El archivo de configuración de Piwik no pudo ser encontrado y está intentando acceder a la página de Piwik.",
+ "YouMayInstallPiwikNow": "Ahora puede %1$sinstalar Piwik%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Si ha instalado Piwik anteriormente y posee algunas tlas en su base de datos, no se preocupe, puede reusarlas y mantenerlas!",
"Optional": "Opcional",
"Password": "Contraseña",
"PasswordDoNotMatch": "contraseña no coincide",
"PasswordRepeat": "Contraseña (repetir)",
"PercentDone": "%s %% Hecho",
+ "ProfessionalServicesAdTitle": "Analíticas avanzadas y Servicios",
+ "ProfessionalServicesfessionalServicesAdText": "Nuestra red de expertos puede ayudar a su organización a liberar todo el potencial de las analíticas ofrecidas por Piwik.",
+ "ProfessionalServicesfessionalDiscoverHow": "Conozca más acerca de los %1$sproductos y servicios adicionales%2$s de Piwik y como incrementar sus conversiones e ingresos.",
"PleaseFixTheFollowingErrors": "Por favor solucione los siguientes errores",
"DefaultSettings": "Ajustes predeterminados Piwik",
"DefaultSettingsHelp": "Piwik ya incluye ajustes predeterminados. Puede personalizarlos ahora o llevarlos a cabo posteriormente en la pantalla de administración.",
@@ -49,7 +54,7 @@
"RestartWebServer": "Luego de realizar este cambio, reinicie su servidor de internet.",
"ReusingTables": "Reutilizando las Tablas",
"PiwikOrgNewsletter": "Enviarme un correo electrónico con las principales actualizaciones de la comunidad Piwik",
- "PiwikProNewsletter": "enviarme información sobre los servicios y ofertas de %1$sPiwik PRO%2$s",
+ "ProfessionalServicesNewsletter": "enviarme información sobre los servicios %1$sProfesional y productos%2$s de Piwik",
"SeeBelowForMoreInfo": "Véase más adelante para mayor información.",
"SetupWebsite": "Configurar un sitio de internet",
"SetupWebsiteError": "Se ha producido un error al añadir el sitio de internet",
@@ -73,6 +78,7 @@
"SystemCheckExtensions": "Otras extensiones requeridas",
"SystemCheckFileIntegrity": "Integridad de archivos",
"SystemCheckFunctions": "Funciones requeridas",
+ "SystemCheckFunctionHelp": "Necesita habilitar esta función incorporada.",
"SystemCheckGDFreeType": "GD > 2.x + Freetype (gráfica)",
"SystemCheckGDHelp": "Los minigráficos e imágenes de gráficos (en la aplicación móvil de Piwik y en los informes por correo electrónico) no funcionarán.",
"SystemCheckGlobHelp": "Esta función integrada se ha desactivado en su host. Piwik intentará emular esta función, pero puede encontrarse con restricciones de seguridad. La funcionalidad puede verse afectada.",
diff --git a/plugins/Installation/lang/et.json b/plugins/Installation/lang/et.json
index a56313263b..ad3ef6ee84 100644
--- a/plugins/Installation/lang/et.json
+++ b/plugins/Installation/lang/et.json
@@ -26,7 +26,6 @@
"LoadDataInfileRecommended": "Kui sinu Piwiku server kogub andmeid kõrge külastatavusega veebilehtede kohta (näiteks rohkem kui 100 000 külastust kuus), siis soovitame antud probleemi kõrvaldada.",
"NfsFilesystemWarning": "Sinu server kasutab NFS failisüsteemi",
"NfsFilesystemWarningSuffixAdmin": "See tähendab, et Piwik on väga aeglane faili põhiste sessioonidega töötamisel.",
- "NoConfigFound": "Piwiku konfguratsioonifaili ei leitud, kuid sa üritasid minna Piwiku lehele.<br \/><b>  » Võid <a href='index.php'>paigaldada Piwiku<\/a><\/b><br \/><small>Kui Piwik on varem installeeritud ja sul on andmebaasis tabeleid, siis ei ole põhjust muretsemiseks, sest saad taaskasutada ja säilitada olemasolevad andmed!<\/small>",
"Optional": "Valikuline",
"PasswordDoNotMatch": "salasõnad ei kattu",
"PercentDone": "%s %% Tehtud",
diff --git a/plugins/Installation/lang/eu.json b/plugins/Installation/lang/eu.json
index 33405b4a85..5924823a13 100644
--- a/plugins/Installation/lang/eu.json
+++ b/plugins/Installation/lang/eu.json
@@ -18,7 +18,6 @@
"InstallationStatus": "Instalazioaren egoera",
"LargePiwikInstances": "Laguntza Piwik-en instalazio handientzat",
"Legend": "Legenda",
- "NoConfigFound": "Piwik konfigurazio-fitxategia ezin izan da aurkitu eta Piwik orri bat atzitzen saiatzen ari zara.<br \/><b>  » <a href='index.php'>Piwik orain instalatu<\/a> dezakezu<\/b><br \/><small>Aurretik Piwik instalatu eta datu-basean taulak badituzu, ez kezkatu, taula berdinak berrerabil ditzakezu eta dauden datuak mantendu!<\/small>",
"Optional": "Aukerazkoa",
"PasswordDoNotMatch": "pasahitzak ez datoz bat",
"PercentDone": "%% %s eginda",
diff --git a/plugins/Installation/lang/fa.json b/plugins/Installation/lang/fa.json
index bdc3b293c5..b264eea2eb 100644
--- a/plugins/Installation/lang/fa.json
+++ b/plugins/Installation/lang/fa.json
@@ -27,7 +27,6 @@
"NfsFilesystemWarning": "سرور شما از فایل سیستم NFS استفاده می کند.",
"NfsFilesystemWarningSuffixAdmin": "این به آن معنا است که پیویک بسیار کند خواهد بود هنگامی که از فایل مبتنی بر نشست ها(session) استفاده می کند.",
"NfsFilesystemWarningSuffixInstall": "استفاده از نشست های مبتنی بر فایل با NFS بسیار کند است، بنابراین پیویک نشست های مبتنی بر پایگاه داده را به کار خواهد برد. اگر شما کاربران همزمان بسیاری دارید ، احتمالا نیاز به افزایش تعداد اتصالات کاربر(Client Connection) به پایگاه داده دارید.",
- "NoConfigFound": "Piwik فایل پیکربندی را می توان یافت نمی شود و شما در حال تلاش برای دسترسی به یک صفحه Piwik. <br\/><B> »می تواند href='index.php'> <a نصب Piwik در حال حاضر <\/a> <\/B> <br \/> <small> اگر شما نصب Piwik قبل و برخی از جداول در پایگاه داده خود را داشته باشند، نگران نباشید، شما می توانید جداول و استفاده مجدد از داده های موجود خود را حفظ کنید <\/small>",
"Optional": "اختیاری",
"PasswordDoNotMatch": "کلمه عبور یکی نیست",
"PercentDone": "%s %% انجام شده",
diff --git a/plugins/Installation/lang/fi.json b/plugins/Installation/lang/fi.json
index 25a3b390af..0ca63c3b51 100644
--- a/plugins/Installation/lang/fi.json
+++ b/plugins/Installation/lang/fi.json
@@ -36,13 +36,11 @@
"NfsFilesystemWarning": "Palvelimesi käyttää NFS:ää.",
"NfsFilesystemWarningSuffixAdmin": "Tämä tarkoittaa, että Piwik on todella hidas käytettäessä tiedostopohjaisia sessioita.",
"NfsFilesystemWarningSuffixInstall": "Tiedostopohjaisten sessioiden käyttäminen NFS:ssä on todella hidasta, joten Piwik käyttää tietokantasessioita. Jos sinulla on monia samanaikaisia ohjauspaneelin käyttäjiä, sinun tarvitsee ehkä lisätä tietokantaserverin käyttäjäyhteyksien maksimimäärää.",
- "NoConfigFound": "Piwikin asetustiedostoa ei löydy ja yrität siirtyä Piwikin sivuille.<br \/><b>  » Voit <a href='index.php'>asentaa Piwikin nyt<\/a><\/b><br \/><small>Jos asensit Piwikin aikaisemmin ja tietokannassa on jo tietoja, älä murehdi, tietoja ei hävitetä.<\/small>",
"Optional": "Optionaalinen",
"Password": "Salasana",
"PasswordDoNotMatch": "salasanat eivät täsmää",
"PasswordRepeat": "Salasana (uudelleen)",
"PercentDone": "%s %% valmiina",
- "PiwikProAdTitle": "Edistynyt analytiikka ja palvelut",
"PleaseFixTheFollowingErrors": "Korjaa seuraavat virheet",
"DefaultSettings": "Oletusasetukset",
"DefaultSettingsHelp": "Piwikissä on oletusasetukset. Voit muuttaa asetuksia nyt tai myöhemmin hallintasivulta.",
diff --git a/plugins/Installation/lang/fr.json b/plugins/Installation/lang/fr.json
index 24a88721f4..b58ea72ba5 100644
--- a/plugins/Installation/lang/fr.json
+++ b/plugins/Installation/lang/fr.json
@@ -36,13 +36,17 @@
"NfsFilesystemWarning": "Votre serveur utilise un système de fichier NFS.",
"NfsFilesystemWarningSuffixAdmin": "Cela signifie que Piwik va être très lent lors de l'utilisation des sessions en fichier.",
"NfsFilesystemWarningSuffixInstall": "Utiliser les sessions en fichier avec NFS est très lent, donc Piwik va utiliser des sessions en base de données. Si vous avez plusieurs utilisateurs de tableaux de bords en parallèle, vous pourriez avoir besoin d'augmenter le nombre maximal de connexions au serveur de base de données.",
- "NoConfigFound": "Le fichier de configuration de Piwik ne peut être trouvé et vous essayez d'accéder à une page de Piwik.<br> <b>  » Vous pouvez <a href='index.php'>installer Piwik maintenant<\/a><\/b><br><small>Si vous avez déjà installé Piwik ne vous inquiétez pas Piwik réutilisera ces tables et leurs données.<\/small>",
+ "NoConfigFileFound": "Le fichier de configuration Piwik n'a pu être trouvée et vous essayez d'accéder à une page Piwik.",
+ "YouMayInstallPiwikNow": "Vous pouvez %1$sinstaller Piwik maintenant%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Si vous avez installé Piwik avant et que vous avez quelques tables dans votre DB, ne vous inquiétez pas, vous pouvez réutiliser les mêmes tables et conserver vos données existantes!",
"Optional": "Optionnel",
"Password": "Mot de passe",
"PasswordDoNotMatch": "Le mot de passe ne concorde pas",
"PasswordRepeat": "Mot de passe (répétez)",
"PercentDone": "%s %% complété",
- "PiwikProAdTitle": "Services et statistiques avancés",
+ "ProfessionalServicesAdTitle": "Services et statistiques avancés",
+ "ProfessionalServicesfessionalServicesAdText": "Notre réseau d'experts peut aider votre organisation à exploiter tout le potentiel des statistiques Piwik.",
+ "ProfessionalServicesfessionalDiscoverHow": "Découvrez les %1$sproduits et services supplémentaires%2$s pour Piwik et comment augmenter vos conversions et revenus.",
"PleaseFixTheFollowingErrors": "Merci de corriger les erreurs suivantes",
"DefaultSettings": "Paramétrage par défaut",
"DefaultSettingsHelp": "Piwik est installé avec un paramétrage par défaut. Vous pouvez personnaliser ces réglages maintenant ou le faire plus tard dans l'espace d'administration.",
@@ -50,7 +54,7 @@
"RestartWebServer": "Après avoir effectué ces modifications, redémarrez votre serveur web.",
"ReusingTables": "Réutilisation des Tables",
"PiwikOrgNewsletter": "Envoyez moi des courriels pour les mises à jour importantes de Piwik",
- "PiwikProNewsletter": "envoyez-moi des informations à propos des services et offres de %1$sPiwik PRO%2$s",
+ "ProfessionalServicesNewsletter": "envoyez-moi des informations à propos %1$sdes services et produits%2$s pour Piwik",
"SeeBelowForMoreInfo": "Voir ci-dessous pour plus d'informations.",
"SetupWebsite": "Paramétrer un site",
"SetupWebsiteError": "Une erreur a été rencontrée pendant l'ajout du site",
diff --git a/plugins/Installation/lang/gl.json b/plugins/Installation/lang/gl.json
index c2910b9842..086f77743b 100644
--- a/plugins/Installation/lang/gl.json
+++ b/plugins/Installation/lang/gl.json
@@ -4,7 +4,6 @@
"CongratulationsHelp": "<p>Noraboa! A instalación de Piwik foi completada.<\/p><p>Asegúrese de inserir o código Javascript en todas as páxinas, e agora, agarde aos primeiros visitantes!<\/p>",
"Installation": "Instalación",
"InstallationStatus": "Estado da instalación",
- "NoConfigFound": "O ficheiro de configuración de Piwik non se atopou e vostede está tentando acceder a unha páxina de Piwik.<br><b>  » Pode <a href='index.php'>instalar Piwik agora<\/a><\/b><br><small>Se instalou Piwik con anterioridade e ten táboas na súa base de datos, non se preocupe, pode reutilizar ditas táboas e manter os datos que se atopan nelas!<\/small>",
"PercentDone": "%s %%Hecho",
"SetupWebsite": "Configurar unha páxina web",
"SetupWebsiteError": "Houbo un erro ao engadir o sitio",
diff --git a/plugins/Installation/lang/hi.json b/plugins/Installation/lang/hi.json
index 1c0b7684d3..38f8746790 100644
--- a/plugins/Installation/lang/hi.json
+++ b/plugins/Installation/lang/hi.json
@@ -33,7 +33,6 @@
"NfsFilesystemWarning": "आपका सर्वर एक NFS फाइल सिस्टम का उपयोग कर रहा है.",
"NfsFilesystemWarningSuffixAdmin": "इसका मतलब यह है Piwik अत्यंत धीमी हो जाएगा फ़ाइल आधारित सत्रों का उपयोग करते समय.",
"NfsFilesystemWarningSuffixInstall": "एनएफएस पर फ़ाइल आधारित सत्रों का प्रयोग अत्यंत धीमा है, तो Piwik डेटाबेस सत्र का उपयोग करेगा. आप कई समवर्ती डैशबोर्ड उपयोगकर्ताओं है, तो आप डेटाबेस सर्वर से ग्राहक कनेक्शन की अधिकतम संख्या में वृद्धि करने की आवश्यकता हो सकती है.",
- "NoConfigFound": "Piwik विन्यास फ़ाइल नहीं मिल सकता है और आप एक Piwik पृष्ठ का उपयोग करने की कोशिश कर रहे हैं. <br \/> <b> »आप <a href='index.php'> अब Piwik स्थापित कर सकते हैं <\/ a> <\/ b> <br \/> <small> आप पहले Piwik स्थापित और अपने DB में कुछ तालिकाएँ है, तो चिंता मत करो, तुम एक ही टेबल का पुनः उपयोग और अपने मौजूदा डेटा रख सकते हैं! <\/small>",
"Optional": "वैकल्पिक",
"PasswordDoNotMatch": "पासवर्ड मेल नहीं खाते",
"PercentDone": "%s %% समाप्त",
diff --git a/plugins/Installation/lang/hu.json b/plugins/Installation/lang/hu.json
index 15d8294e15..a4131cefa7 100644
--- a/plugins/Installation/lang/hu.json
+++ b/plugins/Installation/lang/hu.json
@@ -19,7 +19,6 @@
"InstallationStatus": "Telepítés állása",
"LargePiwikInstances": "Súgó nagyobb weboldalakra telepítéshez",
"Legend": "Magyarázó felirat",
- "NoConfigFound": "Megpróbáltál belépni a Piwik oldalra, de a konfigurációs fájl nem található.<br \/><b>  » <a href='index.php'>(Újra)telepítheted a Piwik-et most.<\/a><\/b><br \/><small>Ha már telepítetted a Piwik-et korábban és voltak már táblák az adatbázisodban, ne aggódj, tudod használni azokat a táblákat és így megmaradnak a meglévő adataid !<\/small>",
"Optional": "Opcionális",
"PasswordDoNotMatch": "jelszó nem egyezik",
"PercentDone": "%s %% kész",
diff --git a/plugins/Installation/lang/id.json b/plugins/Installation/lang/id.json
index 4714c95b69..2a750834e7 100644
--- a/plugins/Installation/lang/id.json
+++ b/plugins/Installation/lang/id.json
@@ -30,7 +30,6 @@
"NfsFilesystemWarning": "Peladen Anda menggunakan berkas sistem NFS.",
"NfsFilesystemWarningSuffixAdmin": "Ini berarti Piwik akan sangat lambat ketika menggunakan sesi berdasar berkas.",
"NfsFilesystemWarningSuffixInstall": "Menggunakan sesi berdasar berkas dalam sisten berkas dalam NFS sangat lambat, sehingga Piwik akan menggunakan sesi berdasar basisdata. Bila Anda memiliki pengguna panel kendali secara bersamaan, Anda munkin membutuhkan peningkatan jumlah sambungan pengguna ke peladen basisdata.",
- "NoConfigFound": "Berkas konfigurasi tak dapat ditemukan dan Anda mencoba untuk mengakses halaman Piwik. <br \/><strong>» Anda dapat <a href='index.php'>memasang Piwik sekarang<\/a><\/strong> <br \/><small>Jika Anda memasang Piwik sebelumnya dan memiliki beberapa tabel di basisdata Anda, jangan khawatir. Anda dapat menggunakan tabel lainnya dan menjaga data Anda saat ini!<\/small>",
"Optional": "Pilihan",
"PasswordDoNotMatch": "sandi tak sama",
"PercentDone": "%s%% Selesai",
diff --git a/plugins/Installation/lang/it.json b/plugins/Installation/lang/it.json
index b400e2b531..6bed04458a 100644
--- a/plugins/Installation/lang/it.json
+++ b/plugins/Installation/lang/it.json
@@ -35,14 +35,17 @@
"NfsFilesystemWarning": "Il tuo server utilizza un file system NFS.",
"NfsFilesystemWarningSuffixAdmin": "Questo significa che Piwik sarà estremamente lento quando utilizzerà delle sessioni basate sui file.",
"NfsFilesystemWarningSuffixInstall": "L'utilizzo di sessioni basate sui file è estremamente lento, così Piwik userà delle sessioni con database. Se hai molti utenti nella dashboard, potresti avere la necessità di aumentare il numero massimo di connessioni dei client al server del database.",
- "NoConfigFound": "Il file di configurazione di Piwik non è stato trovato e stai tentando l'accesso ad una pagina di Piwik.<br \/><b> » Puoi <a href='index.php'>installare Piwik ora.<\/a><\/b><br \/><small>Se hai già installato in precedenza Piwik e nel tuo Database sono presenti delle tabelle della vecchia installazione, non preoccuparti, puoi riutilizzarle e salvare i dati già esistenti!<\/small>",
+ "NoConfigFileFound": "I file di configurazione di Piwik non si trova e tu stai cercando di accedere a una pagina di Piwik.",
+ "YouMayInstallPiwikNow": "Ora puoi %1$sinstallare Piwik%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Se hai già installato Piwik in precedenza e hai delle tabelle nel database, non preoccuparti, puoi riutilizzare le stesse tabelle e conservare i dati esistenti!",
"Optional": "Opzionale",
"Password": "Password",
"PasswordDoNotMatch": "Le Password non coincidono",
"PasswordRepeat": "Password (ripeti)",
"PercentDone": "%s %% Fatto",
- "PiwikProAdTitle": "Statistiche & Servizi avanzati",
- "PiwikProAdText": "Aggiungi le funzionalità premium e sblocca l'intera potenza con %1$sPiwik PRO On-Premises%2$s o prendi Piwik senza fastidi ospitato nel %3$sClousd Piwik PRO%4$s.",
+ "ProfessionalServicesAdTitle": "Analisi Avanzate e Servizi",
+ "ProfessionalServicesfessionalServicesAdText": "La nostra rete di esperti può aiutare la tua organizzione a sbloccare l'intera potenza delle analisi di Piwik.",
+ "ProfessionalServicesfessionalDiscoverHow": "Impara altro sui %1$sprodotti supplementari e i servizi%2$s di Piwik e come su come incrementare conversioni e ricavi.",
"PleaseFixTheFollowingErrors": "Per favore, risolvi i seguenti errori",
"DefaultSettings": "Impostazioni predefinite di Piwik",
"DefaultSettingsHelp": "Piwik ha delle impostazioni predefinite. Puoi personalizzarle ora o farlo in seguito dalla schermata di amministrazione.",
@@ -50,7 +53,7 @@
"RestartWebServer": "Dopo aver fatto questa modifica, riavvia il server web.",
"ReusingTables": "Riutilizzo delle Tabelle",
"PiwikOrgNewsletter": "Inviami per email gli aggiornamenti importanti della comunità di Piwik",
- "PiwikProNewsletter": "inviami informazioni su servizi e offerte di %1$sPiwik PRO%2$s",
+ "ProfessionalServicesNewsletter": "inviami informazioni sui %1$sServizi professionali e i prodotti%2$s per Piwik",
"SeeBelowForMoreInfo": "Guarda sotto per altre informazioni.",
"SetupWebsite": "Configura un sito web",
"SetupWebsiteError": "C'è stato un errore durante l'aggiunta del sito web",
diff --git a/plugins/Installation/lang/ja.json b/plugins/Installation/lang/ja.json
index 3e65be17e8..c87dff8a20 100644
--- a/plugins/Installation/lang/ja.json
+++ b/plugins/Installation/lang/ja.json
@@ -36,7 +36,6 @@
"NfsFilesystemWarning": "あなたのサーバーは、NFS ファイルシステムを使用しています。",
"NfsFilesystemWarningSuffixAdmin": "これは、ファイルベースのセッションを利用する際、Piwik が極端に遅くなることを意味します。",
"NfsFilesystemWarningSuffixInstall": "NFS 上でファイルベースのセッションを利用すると極端に遅いので、Piwik はデータベースセッションを使用します。同時に多くのダッシュボードユーザーがいる場合、データベースサーバーへのクライアント接続の最大数を増やす必要があります。",
- "NoConfigFound": "Piwik の設定ファイルを見つけることができませんでしたが、あなたは Piwik ページにアクセスしようとしています。<br \/><b>  »<a href='index.php'>ただちに Piwik をインストール<\/a>することができます。<\/b><br \/><small>以前に Piwik をインストールしたことがあり、DB に多少のデータがある場合でも心配しないでください。 既存のデータを保持したまま、同じテーブルを再利用することができます!<\/small>",
"Optional": "オプション",
"Password": "パスワード",
"PasswordDoNotMatch": "パスワードが一致しませんでした",
@@ -49,7 +48,6 @@
"RestartWebServer": "この変更を行った後、ウェブサーバーを再起動してください。",
"ReusingTables": "表の再利用",
"PiwikOrgNewsletter": "私に Piwik コミュニティの最新情報をメールで送る",
- "PiwikProNewsletter": "%1$s Piwik PRO %2$s のサービスや最新情報を送ってください",
"SeeBelowForMoreInfo": "詳細は、以下をご確認ください。",
"SetupWebsite": "ウェブサイトのセットアップ",
"SetupWebsiteError": "ウェブサイトを追加する際にエラーが発生しました",
diff --git a/plugins/Installation/lang/ka.json b/plugins/Installation/lang/ka.json
index ccea04fd0c..4d888c5789 100644
--- a/plugins/Installation/lang/ka.json
+++ b/plugins/Installation/lang/ka.json
@@ -13,27 +13,20 @@
"DatabaseSetupLogin": "მომხმარებლის სახელი",
"DatabaseSetupServer": "მონაცემთა ბაზის სერვერი",
"DatabaseSetupTablePrefix": "ცხრილის წინსართი",
- "Email": "ელ.ფოსტა",
"Extension": "გაფართოება",
"GoBackAndDefinePrefix": "დაბრუნდით უკან და განსაზღვრეთ Piwik ცხრილების წინსართი",
"Installation": "ინსტალირება",
"InstallationStatus": "ინსტალაციის სტატუსი",
"LargePiwikInstances": "დახმარება Piwik–ის მსხვილი ობიექტებისთვის",
"Legend": "განმარტება",
- "NoConfigFound": "Piwik კონფიგურაციის ფაილი ვერ მოიძებნა და თქვენ Piwik გვერდის წვდომას ცდილობთ.<br \/><b>  » შეგიძლიათ <a href='index.php'>ახლა დააინსტალიროთ Piwik<\/a><\/b><br \/><small>თუ ადრე გქონდათ დაინსტალირებული Piwik და თქვენს მონაცემთა ბაზაში გაქვთ ცხრილები, არ ინერვიულოთ, თქვენ იმავე ცხრილების გამოყენებას კვლავ შეძლებთ და შეინარჩუნებთ არსებულ მონაცემებს!<\/small>",
"Optional": "ოფციონალური",
- "Password": "პაროლი",
"PasswordDoNotMatch": "პაროლი არ დაემთხვა",
- "PasswordRepeat": "პაროლი (განმეორებით)",
"PercentDone": "%s %% შესრულდა",
"PleaseFixTheFollowingErrors": "გთხოვთ, შეასწოროთ შემდეგი შეცდომები",
"Requirements": "Piwik მოთხოვნები",
"SetupWebsite": "ვებ საიტის მოწყობა",
"SetupWebsiteError": "ვებ საიტის დამატების დროს მოხდა შეცდომა",
- "SetupWebSiteName": "ვებ საიტის სახელი",
"SetupWebsiteSetupSuccess": "ვებ საიტი %s შეიქმნა წარმატებით!",
- "SetupWebSiteURL": "ვებ საიტის URL",
- "SuperUserLogin": "სუპერ მომხმარებლის სახელი",
"SystemCheck": "სისტემის შემოწმება",
"SystemCheckAutoUpdateHelp": "შენიშვნა: Piwik–ის ერთი დაწკაპუნებით განახლება მოითხოვს ჩაწერის უფლებას Piwik საქაღალდეზე და მის შიგთავსზე.",
"SystemCheckCreateFunctionHelp": "Piwik დაბრუნებისთვის იყენებს ანონიმურ ფუნქციებს.",
@@ -63,7 +56,6 @@
"SystemCheckSplHelp": "საჭირო იქნება PHP კონფიგურირება და აღდგენა სტანდარტული PHP ბიბლიოთეკის (SPL) ჩართვით (ნაგულისხმევი).",
"SystemCheckTimeLimitHelp": "მაღალი ტრაფიკის ვებ საიტებზე არქივირების პროცესის განხორციელებას შეიძლება ბევრი დრო დაჭირდეს ვიდრე დაშვებულია ახლა. თუ საჭირო იქნება, შეცვალეთ max_execution_time მნიშვნელობა თქვენს php.ini ფაილში.",
"SystemCheckTracker": "ტრეკერის სტატუსი",
- "SystemCheckTrackerHelp": "GET მოთხოვნა piwik.php ფაილზე ვერ განხორციელდა. ცადეთ ამ URL–ის whitelisting mod_security და HTTP აუტენთიფიკაციიდან.",
"SystemCheckWarnDomHelp": "სასურველია ჩართოთ \"dom\" გაფართოების გამოყენება (მაგ., დააინსტალირეთ \"php-dom\" და\/ან \"php-xml\" პაკეტი).",
"SystemCheckWarning": "Piwik ნორმალურად იმუშავებს მაგრამ შეიძლება ზოგიერთი ფუნქცია აკლდეს.",
"SystemCheckWarnJsonHelp": "სასურველია ჩართოთ \"json\" გაფართოების გამოყენება (მაგ., დააინსტალირეთ \"php-json\" პაკეტი) უკეთესი ეფექტიანობისთვის.",
@@ -81,7 +73,6 @@
"TablesReuse": "არსებული ცხრილების გამოყენება",
"TablesWarningHelp": "შეარჩიეთ ან მონაცემთა ბაზის არსებული ცხრილების ხელმეორედ გამოყენება ან მონიშნეთ სუფთა დაინსტალირება, რომელიც წაშლის მონაცემთა ბაზაში არსებულ მონაცემებს.",
"TablesWithSameNamesFound": "ზოგიერთ %1$s ცხრილს თქვენს მონაცემთა ბაზაში %2$s იგივე სახელი აქვს, რა სახელის ცხრილების შექმნასაც ცდილობს Piwik",
- "Timezone": "ვებ საიტის საათობრივი სარტყელი",
"Welcome": "მოგესალმებით!",
"WelcomeHelp": "<p>Piwik არის ღია კოდის ვებ ანალიზატორი პროგრამა, რომელიც ამარტივებს თქვენი ვიზიტორების შესახებ სასურველი ინფორმაციის მიღებას.<\/p><p>ეს პროცესი გაყოფილია %s მარტივ საფეხურად და დაახლოებით 5 წუთს გრძელდება.<\/p>"
}
diff --git a/plugins/Installation/lang/ko.json b/plugins/Installation/lang/ko.json
index b94e1d0bc1..67a9c2bdcd 100644
--- a/plugins/Installation/lang/ko.json
+++ b/plugins/Installation/lang/ko.json
@@ -36,14 +36,11 @@
"NfsFilesystemWarning": "서버에서 NFS 파일시스템을 사용하고 있습니다.",
"NfsFilesystemWarningSuffixAdmin": "파일 기반 세션을 사용하는 경우 Piwik이 매우 느려짐을 의미합니다.",
"NfsFilesystemWarningSuffixInstall": "NFS의 파일 기반 세션을 사용하면 매우 느립니다, 그래서 Piwik 데이터베이스 세션을 사용합니다. 대시보드 사용자가 많은 경우는, 데이터베이스 서버에 클라이언트 연결의 최대 수를 증가해야 할지도 모릅니다.",
- "NoConfigFound": "Piwik 설정 파일을 찾을 수 없으며 당신은 Piwik 페이지로 접근을 계속 시도하고 있습니다.<br \/><b>  » <a href='index.php'>지금 Piwik을 설치하세요.<\/a><\/b><br \/><small>만약 Piwik을 이전에 설치한 적이 있고 DB에 테이블이 좀 있다면 걱정하지마세요, 같은 테이블을 재사용할 수 있고 현재 데이터를 보존할 수 있습니다!<\/small>",
"Optional": "옵션",
"Password": "비밀번호",
"PasswordDoNotMatch": "비밀번호가 맞지 않습니다",
"PasswordRepeat": "비밀번호 (반복 입력)",
"PercentDone": "%s %% 완료",
- "PiwikProAdTitle": "고급 분석 및 서비스",
- "PiwikProAdText": "%1$sPiwik 프로 On-premise%2$s를 통해 최대의 프리미엄 기능을 사용하시거나, %3$sPiwik 프로 클라우드%4$s를 통해 당신만의 번거로움 없는 Piwik 호스트 서비스를 사용하실 수 있습니다.",
"PleaseFixTheFollowingErrors": "다음 오류를 수정하세요",
"DefaultSettings": "기본 Piwik 설정",
"DefaultSettingsHelp": "Piwik 기본 설정에 따릅니다. 이를 지금 혹은 후에 관리자 화면에서 변경할 수 있습니다.",
@@ -51,7 +48,6 @@
"RestartWebServer": "변경한 후 웹서버를 다시 시작하세요.",
"ReusingTables": "테이블",
"PiwikOrgNewsletter": "주요 Piwik 커뮤니티의 업데이트 이메일 구독",
- "PiwikProNewsletter": "%1$sPiwik PRO%2$s 서비스 및 신청과 관련한 정보 받기",
"SeeBelowForMoreInfo": "자세한 내용은 아래를 참조하세요.",
"SetupWebsite": "웹사이트 설정",
"SetupWebsiteError": "웹사이트 추가중에 에러가 있었습니다",
diff --git a/plugins/Installation/lang/lt.json b/plugins/Installation/lang/lt.json
index 61eb05852c..f4a6ebf49f 100644
--- a/plugins/Installation/lang/lt.json
+++ b/plugins/Installation/lang/lt.json
@@ -24,7 +24,6 @@
"InstallationStatus": "Įdiegimo būklė",
"LargePiwikInstances": "Pagalba dideliems Piwik pavyzdžiams",
"Legend": "Sutartinis ženklas",
- "NoConfigFound": "Jūs bandote pasiekti Piwik puslapį, tačiau negalima rasti Piwik konfigūracinio failo.<br \/><b>  » Galite <a href='index.php'>įdiegti Piwik dabar<\/a><\/b><br \/><small>Jei Piwik duombazėje liko lentelių iš ankstesnių diegimų, nesijaudinkite, nes galite naudoti tas pačias lenteles ir išsaugoti turimus duomenis!<\/small>",
"Optional": "Pasirenkama",
"Password": "Slaptažodis",
"PasswordDoNotMatch": "slaptažodis nesutampa",
diff --git a/plugins/Installation/lang/nb.json b/plugins/Installation/lang/nb.json
index 8a1eea35c6..c14b6c2cb5 100644
--- a/plugins/Installation/lang/nb.json
+++ b/plugins/Installation/lang/nb.json
@@ -36,14 +36,17 @@
"NfsFilesystemWarning": "Din tjeneren bruker et NFS-filsystem.",
"NfsFilesystemWarningSuffixAdmin": "Dette betyr Piwik vil være svært treg når du bruker filbaserte økter.",
"NfsFilesystemWarningSuffixInstall": "Å bruke filbaserte sesjoner på NFS er ekstremt tregt, så Piwik vil bruke databasesesjoner. Hvis det er mange som ser på kontrollpanelene samtidig, kan det tenkes at du må øke maks antall klienttilkoblinger som er tillatt på databaseserveren.",
- "NoConfigFound": "Klarte ikke finne konfigurasjonsfilen for Piwik, og du prøver å få tilgang til en Piwik-side. <br \/><b>  » Du kan <a href='index.php'>installere Piwik nå<\/a><\/b><br \/><small>Hvis du prøvde å installere Piwik tidligere og har noen tabeller i databasen, kan du ta det med ro. Du kan bruke de gamle tabellene og beholde dine eksisterende data!<\/small>",
+ "NoConfigFileFound": "Piwiks konfigurasjonsfil ble ikke funnet, og du prøver å få tilgang til en Piwik-side.",
+ "YouMayInstallPiwikNow": "Du kan %1$sinstallere Piwik nå%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Hvis du har installert Piwik fra før, og har noen tabeller i din database, ikke vær urolig: du kan gjenbruke de samme tabellene og beholde din eksisterende data!",
"Optional": "Valgfritt",
"Password": "Passord",
"PasswordDoNotMatch": "passordene stemmer ikke overens",
"PasswordRepeat": "Passord (gjenta)",
"PercentDone": "%s %% ferdig",
- "PiwikProAdTitle": "Avansert analyse og tjenester",
- "PiwikProAdText": "Legg til premium-funksjonalitet og lås opp høyeste gir med %1$sPiwik PRO On-Premises%2$s, eller få din egen Piwik drevet i %3$sPiwik PRO Cloud%4$s.",
+ "ProfessionalServicesAdTitle": "Avansert analyse og tjenester",
+ "ProfessionalServicesfessionalServicesAdText": "Vårt nettverk med eksperter kan hjelpe din virksomhet å bruke den fulle kraften i Piwik analytics.",
+ "ProfessionalServicesfessionalDiscoverHow": "Lær mer om %1$sflere produkter og tjenester%2$s for Piwik og hvordan du kan øke konverteringsraten og inntjeningen.",
"PleaseFixTheFollowingErrors": "Fiks følgende feil",
"DefaultSettings": "Standard Piwik-innstillinger",
"DefaultSettingsHelp": "Piwik kommer med standardinnstillinger. Du kan tilpasse dem nå eller gjøre det senere i administrasjonsskjermen.",
@@ -51,7 +54,7 @@
"RestartWebServer": "Etter å ha gjort denne endringen må du restarte webserveren.",
"ReusingTables": "Gjenbruker tabellene",
"PiwikOrgNewsletter": "Send meg e-poster med viktige oppdateringer om Piwik",
- "PiwikProNewsletter": "send meg informasjon om %1$sPiwik PRO%2$s tjenester og tilbud",
+ "ProfessionalServicesNewsletter": "send meg informasjon om %1$sProfesjonelle tjenester og produkter%2$s for Piwik",
"SeeBelowForMoreInfo": "Se nedenfor for mer informasjon.",
"SetupWebsite": "Legg til et nettsted",
"SetupWebsiteError": "Det skjedde en feil da nettstedet ble lagt til.",
diff --git a/plugins/Installation/lang/nl.json b/plugins/Installation/lang/nl.json
index 7b29cf0d51..a27f09e2cd 100644
--- a/plugins/Installation/lang/nl.json
+++ b/plugins/Installation/lang/nl.json
@@ -36,14 +36,11 @@
"NfsFilesystemWarning": "Je server gebruikt het NFS bestandssysteem",
"NfsFilesystemWarningSuffixAdmin": "Dit betekent dat Piwik extreem traag zal zijn bij gebruik van bestands gebaseerde sessies.",
"NfsFilesystemWarningSuffixInstall": "Gebruik maken van bestands gebaseerde sessies op NFS is extreem traag, dus zal Piwik gebruik maken van database sessies. Indien je veel gelijktijdige dashboard gebruikers hebt, zul je mogelijk het maximum aantal client connecties naar de database server moeten verhogen.",
- "NoConfigFound": "Het Piwik configuratiebestand werd niet gevonden.<br \/><b>  » U kunt <a href='index.php'>Piwik nu installeren<\/a><\/b><br \/><small>Wanneer u Piwik al eerder geïnstalleerd heeft en de Piwik tabellen reeds data bevatten: maakt u zich geen zorgen, u kunt dezelfde tabellen blijven gebruiken en uw bestaande data behouden!<\/small>',",
"Optional": "Optioneel",
"Password": "Wachtwoord",
"PasswordDoNotMatch": "wachtwoord komt niet overeen",
"PasswordRepeat": "Wachtwoord (herhalen)",
"PercentDone": "%s %% Gereed",
- "PiwikProAdTitle": "Geavanceerde Analytics & Services",
- "PiwikProAdText": "Voeg premium functionaliteit toe en ontgrendel de volledige kracht met %1$sPiwik PRO On-Premises%2$s, of maak gebruik van je eigen zorgeloze hosted Piwik ongeving in de %3$sPiwik PRO Cloud%4$s.",
"PleaseFixTheFollowingErrors": "Los de volgende problemen op",
"DefaultSettings": "Standaard Piwik instellingen",
"DefaultSettingsHelp": "Piwik komt met voorgedefinieerde instellingen. Je kunt deze nu aanpassen of dit later doen in het admin scherm.",
@@ -51,7 +48,6 @@
"RestartWebServer": "Herstart uw webserver na deze aanpassing.",
"ReusingTables": "Hergebruik de tabellen",
"PiwikOrgNewsletter": "email mij bij grote Piwik gemeenschap updates",
- "PiwikProNewsletter": "Stuur mij informatie over %1$sPiwik PRO%2$s diensten en aanbiedingen",
"SeeBelowForMoreInfo": "Zie hieronder voor meer informatie.",
"SetupWebsite": "Configureer een website",
"SetupWebsiteError": "Er heeft zich een fout voorgedaan tijdens het toevoegen van de website",
diff --git a/plugins/Installation/lang/nn.json b/plugins/Installation/lang/nn.json
index c4d62be286..96cb3da20b 100644
--- a/plugins/Installation/lang/nn.json
+++ b/plugins/Installation/lang/nn.json
@@ -17,7 +17,6 @@
"Installation": "Installasjon",
"InstallationStatus": "Installasjonstatus",
"LargePiwikInstances": "Hjelp for større Piwik-installasjonar",
- "NoConfigFound": "Du prøvar å nå ein Piwikside, men konfigurasjonen vart ikkje funnen.<br \/><b>  » Du kan <a href='index.php'>installera Piwik no<\/a><\/b><br \/><small>Om du allereie har hatt Piwik installert og har nokre tabellar i databasen, treng du ikkje bekymra deg. Du kan nytta dei same tabellane og data!<\/small>",
"Optional": "Valfri",
"PasswordDoNotMatch": "Passorda samsvarer ikkje",
"PercentDone": "%s %% Ferdig",
diff --git a/plugins/Installation/lang/pl.json b/plugins/Installation/lang/pl.json
index 8bcc0d9c8d..b1c63826db 100644
--- a/plugins/Installation/lang/pl.json
+++ b/plugins/Installation/lang/pl.json
@@ -24,7 +24,6 @@
"LargePiwikInstances": "Pomoc w przypadku dużych instalacji z Piwik",
"Legend": "Legenda",
"NfsFilesystemWarning": "Twój system używa systemu plików NFS",
- "NoConfigFound": "Plik konfiguracyjny Piwik nie został odnaleziony, a ty próbujesz uzyskać dostęp do strony Piwik.<br \/><b>  » Możesz <a href='index.php'>zainstalować statystyki Piwik teraz<\/a><\/b><br \/><small>Jeżeli zainstalowałeś Piwik poprzednio i masz swoje tabele w bazie danych, nie przejmuj się, możesz uzyć tych samych tabel i zachować istniejące w nich dane!<\/small>",
"Optional": "Opcionalnie",
"Password": "Hasło",
"PasswordDoNotMatch": "hasło jest nieprawidłowe",
diff --git a/plugins/Installation/lang/pt-br.json b/plugins/Installation/lang/pt-br.json
index 050420299e..8366493711 100644
--- a/plugins/Installation/lang/pt-br.json
+++ b/plugins/Installation/lang/pt-br.json
@@ -36,14 +36,14 @@
"NfsFilesystemWarning": "O servidor está usando um sistema de arquivos NFS.",
"NfsFilesystemWarningSuffixAdmin": "Isto significa que o Piwik será extremamente lento quando estiver se baseabdo em arquivos de sessão.",
"NfsFilesystemWarningSuffixInstall": "Em NFS, usando arquivos baseados em sessões fica extremamente lento, por isso que o Piwik irá utilizar sessões em banco. Se você tem muitos usuários do painel simultâneas, você pode precisar aumentar o número máximo de conexões do cliente para o servidor de banco de dados.",
- "NoConfigFound": "O arquivo de configuração de relatórios não pode ser encontrado e você está tentando acessar uma página do Piwik.<br \/><b>  » Você poderá <a href='index.php'>instalar o Piwik agora<\/a><\/b><br \/><small>Se você instalou o Piwik antes e possui algumas tabelas em seu banco de dados, não se preocupe, você poderá reutilizar as mesmas tabelas e manter os dados existentes!<\/small>",
+ "NoConfigFileFound": "O arquivo de configuração do Piwik não foi encontrado e você pode tentar acessar a página do Piwik.",
+ "YouMayInstallPiwikNow": "Você pode %1$sinstalar o Piwik agora%2$s",
+ "IfPiwikInstalledBeforeTablesCanBeKept": "Se você instalou o Piwik antes e tem algumas tabelas no seu BD, não se preocupe, pois pode reutilizar as mesmas tabelas e manter seus dados existentes!",
"Optional": "Opcional",
"Password": "Senha",
"PasswordDoNotMatch": "senha não confere",
"PasswordRepeat": "Senha (repetir)",
"PercentDone": "%s %% Completo",
- "PiwikProAdTitle": "Análises e Serviços Avançados",
- "PiwikProAdText": "Adicione funcionalidades premium e libere a força total com o %1$sPiwik PRO On-Premises%2$s, ou obtenha o seu próprio Piwik livre de problemas hospedado no %3$sPiwik PRO Cloud%4$s.",
"PleaseFixTheFollowingErrors": "Por favor, corrija os seguintes erros",
"DefaultSettings": "Configurações Piwik padrão",
"DefaultSettingsHelp": "Piwik vem com configurações padrão. Você pode personalizá-las agora ou posteriormente no painel de administração.",
@@ -51,7 +51,6 @@
"RestartWebServer": "Depois de fazer essa alteração, reinicie o seu servidor web.",
"ReusingTables": "Reutilizando as Tabelas",
"PiwikOrgNewsletter": "me enviar e-mail com as principais atualizações da comunidade Piwik",
- "PiwikProNewsletter": "envie-me informações sobre os serviços e ofertas do %1$sPiwik PRO%2$s",
"SeeBelowForMoreInfo": "Veja abaixo para mais informações.",
"SetupWebsite": "Configurar um website",
"SetupWebsiteError": "Ocorreu um erro ao tentar adicionar o website",
diff --git a/plugins/Installation/lang/pt.json b/plugins/Installation/lang/pt.json
index 0dea2e82a6..d025a5cd38 100644
--- a/plugins/Installation/lang/pt.json
+++ b/plugins/Installation/lang/pt.json
@@ -19,7 +19,6 @@
"InstallationStatus": "Estado da Instalação",
"LargePiwikInstances": "Ajuda para grandes instâncias Piwik",
"Legend": "Legenda",
- "NoConfigFound": "O ficheiro de configuração Piwik não foi encontrado e está a tentar aceder a uma página Piwik.<br \/><b>  » Pode <a href='index.php'>instalar o Piwik agora<\/a><\/b><br \/><small>Se instalou o Piwik antes e possui algumas tabelas na sua base de dados, não se preocupe, pode reutilizar as mesmas tabelas e manter os dados existentes!<\/small>",
"Optional": "Opcional",
"PasswordDoNotMatch": "palavras-passe não coincidem",
"PercentDone": "%s %% Completado",
diff --git a/plugins/Installation/lang/ro.json b/plugins/Installation/lang/ro.json
index ac25455db5..689122fad2 100644
--- a/plugins/Installation/lang/ro.json
+++ b/plugins/Installation/lang/ro.json
@@ -34,7 +34,6 @@
"NfsFilesystemWarning": "Server-ul dvs. foloseste ca si sistem de fisiere NFS.",
"NfsFilesystemWarningSuffixAdmin": "Acest lucru înseamnă că Piwik va fi extrem de lent atunci când se utilizează sesiuni bazate pe fișiere.",
"NfsFilesystemWarningSuffixInstall": "Folosind sesiuni bazate pe fișiere NFS sunt extrem de lente, astfel Piwik va folosi sesiuni de baze de date. Dacă aveți mai mulți utilizatori de tablou de bord, ar putea fi necesar sa se creasca numărul maxim de conexiuni client la serverul de baze de date.",
- "NoConfigFound": "Fișierul de configurare Piwik nu a putut fi găsit și se încearcă să se acceseze o pagină Piwik.<br \/><b> » Puteți a href='index.php'> instala Piwik acum <\/a><\/b><br \/><mic> Dacă ați instalat Piwik înainte și au aveti unele tabele din DB , nu vă faceți griji, aveți posibilitatea să reutilizați aceleași tabele și să se păstreze datele existente!<\/mic>",
"Optional": "Opţional",
"PasswordDoNotMatch": "Parola nu se potriveste",
"PercentDone": "%s %% Done",
diff --git a/plugins/Installation/lang/ru.json b/plugins/Installation/lang/ru.json
index 25a4b0b4bf..63018cf656 100644
--- a/plugins/Installation/lang/ru.json
+++ b/plugins/Installation/lang/ru.json
@@ -36,14 +36,11 @@
"NfsFilesystemWarning": "Ваш сервер использует NFS.",
"NfsFilesystemWarningSuffixAdmin": "Имеется ввиду, что Piwik будет очень медленным при использовании сессий на основе файлов.",
"NfsFilesystemWarningSuffixInstall": "Использование сессий на основе файлов по протоколу NFS чрезвычайно медленно, поэтому Piwik будет использовать сессии на основе базы данных. Если у вас может быть одновременно множество пользователей на панели управления, вам, возможно, потребуется увеличить максимальное число клиентских подключений к серверу базы данных.",
- "NoConfigFound": "Конфигурационный файл Piwik не может быть найден, однако вы пытаетесь зайти в систему.<br \/><b>  » Вы можете <a href='index.php'>установить Piwik сейчас.<\/a><\/b><br \/><small> Если Piwik уже был установлен и вы имеете данные в БД, вы можете использовать их.<\/small>",
"Optional": "Необязательно",
"Password": "Пароль",
"PasswordDoNotMatch": "Пароль не совпадает",
"PasswordRepeat": "Пароль (еще раз)",
"PercentDone": "%s %% Завершено",
- "PiwikProAdTitle": "Продвинутая аналитика и сервисы",
- "PiwikProAdText": "Добавьте премиумную функциональность и разблокируйте полную мощность с %1$sPiwik PRO On-Premises%2$s, или получите свой собственный беспроблемный Piwik, располагающийся в %3$sPiwik PRO Cloud%4$s.",
"PleaseFixTheFollowingErrors": "Пожалуйста, исправьте следующие ошибки",
"DefaultSettings": "Настройки Piwik по умолчанию",
"DefaultSettingsHelp": "Piwik поставляется с настройками по умолчанию. Вы можете настроить их сейчас или сделать это позже в настройках администратора.",
@@ -51,7 +48,6 @@
"RestartWebServer": "После этих изменений перезапустите браузер.",
"ReusingTables": "Переиспользование таблиц",
"PiwikOrgNewsletter": "послать мне email о новых обновления Piwik community",
- "PiwikProNewsletter": "пришлите мне информацию об услугах и предложениях %1$sPiwik PRO%2$s",
"SeeBelowForMoreInfo": "Смотрите ниже для получения дополнительной информации.",
"SetupWebsite": "Добавить сайт",
"SetupWebsiteError": "Возникла ошибка при добавлении сайта",
diff --git a/plugins/Installation/lang/sk.json b/plugins/Installation/lang/sk.json
index 7d02148ad6..33fea7cc0f 100644
--- a/plugins/Installation/lang/sk.json
+++ b/plugins/Installation/lang/sk.json
@@ -22,7 +22,6 @@
"Installation": "Inštalácia",
"InstallationStatus": "Stav inštalácie",
"Legend": "Legenda",
- "NoConfigFound": "Piwik konfiguračný súbor nie je možné nájsť a vy sa pokúšate pripojiť k Piwik stránke. <br \/><b>  » Môžete <a href='index.php'>teraz nainštalovať Piwik<\/a><\/b><br \/><small>Ak ste nainštalovali Piwik už skôr, a máte nejaké tabuľky s dátami v databáze, nemusíte sa báť, budete ich ďalej používať!<\/small>",
"Optional": "Voliteľné",
"PasswordDoNotMatch": "heslo nie je zhodné",
"PercentDone": "%s %% Dokončené",
diff --git a/plugins/Installation/lang/sq.json b/plugins/Installation/lang/sq.json
index 7e59ba7663..0cc67566bd 100644
--- a/plugins/Installation/lang/sq.json
+++ b/plugins/Installation/lang/sq.json
@@ -5,6 +5,7 @@
"ConfirmDeleteExistingTables": "Jeni i sigurt se doni të fshihen tabelat: %s prej bazës së të dhënave? KUJDES: NUK DO TË MUND TË RIKTHENI TË DHËNAT PREJ KËTYRE TABELAVE!",
"Congratulations": "Urime",
"CongratulationsHelp": "<p>Urime! Instalimi juaj i Piwik-ut u plotësua.<\/p><p>Sigurohuni që keni futur kodin JavaScript te faqet tuaja, dhe prisni për vizitorët e parë!<\/p>",
+ "DatabaseAbilities": "Aftësi baze të dhënash",
"DatabaseCreation": "Krijim baze të dhënash",
"DatabaseErrorConnect": "Gabim gjatë provës për t’u lidhur me shërbyesin e bazës së të dhënave",
"DatabaseServerVersion": "Version shërbyesi baze të dhënash",
@@ -14,26 +15,54 @@
"DatabaseSetupLogin": "hyrje",
"DatabaseSetupServer": "Shërbyes i bazës së të dhënave",
"DatabaseSetupTablePrefix": "parashtesë tabele",
+ "Email": "Email",
"Extension": "zgjerim",
+ "Filesystem": "Sistem kartelash",
+ "GetInvolved": "Nëse ju pëlqen ajo që shihni, mund %1$stë përfshiheni%2$s.",
"GoBackAndDefinePrefix": "Kthehuni mbrapsht dhe përcaktoni një Prefiks për Tabelat e Piwik-ut",
+ "HappyAnalysing": "Analiza të mbara!",
"Installation": "Instalim",
"InstallationStatus": "Gjendje instalimi",
+ "InsufficientPrivilegesHelp": "Këto privilegje mund t’i shtoni duke përdorur një mjet të tillë si phpMyAdmin ose duke kryer kërkesat e duhura SQL. Nëse nuk dini si t’i bëni këto gjëra, ju lutemi, kërkojini përgjegjësit të sistemit tuaj t’ju akordojë këto privilegje.",
+ "InsufficientPrivilegesMain": "Ose Baza e të Dhënave s’ekziston, (dhe s’krijohet dot), ose Përdoruesi i caktuar ka privilegje të pamjaftueshme. Përdoruesi i bazës së të dhënave duhet të ketë privilegjet vijuese: %s",
+ "InvalidStateError": "Gabim: Piwik-u është i instaluar tashmë. %1$s Rikthehuni %2$s te Piwik-u%3$s.",
+ "JsTagArchivingHelp1": "Për sajte me trafik mesatar ose të madh ka disa optimizime që duhen bërë për ta ndihmuar Piiwik-un të xhirojë më shpejt (të tillë si %1$srregullimi i vetëarkivimit%2$s).",
+ "JSTracking_EndNote": "Shënim: pas procesit të instalimit, te ndarja %1$sKod Gjurmimi%2$s e përgjegjësit mund të prodhoni kod vetjak gjurmimi.",
+ "JSTracking_Intro": "Që të ndiqni trafikun tuaj web me Piwik-un, duhet të siguroni shtimin e ca kodi shtesë te secila faqe web e juaja.",
"LargePiwikInstances": "Ndihmë për raste Piwik-u me ngarkesë",
"Legend": "Legjendë",
- "NoConfigFound": "S’u gjet dot kartela e formësimit të Piwik-ut dhe po provoni të hyni te një faqe Piwik-u.<br \/><b>  » Mund ta <a href='index.php'>instaloni Piwik-un tani<\/a><\/b><br \/><small>Nëse e kishit instaluar Piwik-un më parë dhe keni disa tabela te baza juaj e të dhënave, mos u shqetësoni, mund të ripërdorni po ato tabela dhe të mbani të dhënat tuaja ekzistuese!<\/small>",
+ "LoadDataInfileRecommended": "Nëse shërbyesi juaj Piwik ndjek sajte me trafik të madh (p.sh. > 100,000 faqe në muaj), këshillojmë të përpiqeni ta ndreqni këtë problem.",
+ "LoadDataInfileUnavailableHelp": "Përdorimi i %1$s do ta përshpejtojë mjaft procesin e arkivimit në Piwik. Që Piwik-u të mund ta përdorë, provoni të përditësoni software-in tuaj PHP & MySQL dhe sigurohuni që përdoruesi i bazës tuaj të të dhënave ka privilegje %2$s.",
+ "NfsFilesystemWarning": "Shërbyesi juaj përdor një sistemt NFS kartelash",
+ "NfsFilesystemWarningSuffixAdmin": "Kjo do të thotë që Piwik-u do të jetë tejet i ngadaltë kur të përdorë sesione të bazuar në kartela.",
+ "NfsFilesystemWarningSuffixInstall": "Përdorimi për NFS-në i sesioneve të bazuar në kartela është tejet i ngadaltë, ndaj Piwik-u do të përdorë sesione të bazuar në baza të dhënash. Nëse keni shumë përdorues të njëkohshëm të pultit, mund të keni nevojë të rritni numrin maksimum të lidhjeve nga klientët te shërbyesi i bazës së të dhënave.",
"Optional": "Opsionale",
+ "Password": "Fjalëkalim",
"PasswordDoNotMatch": "fjalëkalimet nuk përputhen",
+ "PasswordRepeat": "Fjalëkalim (rijepeni)",
"PercentDone": "Plotësuar %s %%",
"PleaseFixTheFollowingErrors": "Ju lutem, ndreqni gabimet vijuese",
+ "DefaultSettings": "Rregullimet parazgjedhje për Piwik-un",
+ "DefaultSettingsHelp": "Piwik-u instalohet me rregullime parazgjedhje. Ato mund t’i përshtatni tani ose këtë ta bëni më vonë që nga skena e përgjegjësit.",
"Requirements": "Të domosdoshme për Piwik-un",
+ "RestartWebServer": "Pas kryerjes së këtij ndryshimi, rinisni shërbyesin tuaj.",
+ "PiwikOrgNewsletter": "më njoftoni me email rreth përditësimesh të rëndësishme të Piwik-ut nga bashkësia",
+ "SeeBelowForMoreInfo": "Për më tepër informacion shihni më poshtë",
"SetupWebsite": "Rregulloni një Sajt",
"SetupWebsiteError": "Pati një gabim gjatë shtimit të një sajti",
+ "SetupWebSiteName": "Emër sajti",
"SetupWebsiteSetupSuccess": "Sajti %s u shtua me sukses!",
+ "SetupWebSiteURL": "URL sajti",
+ "SiteSetup": "Ju lutemi, caktoni sajtin e parë që dëshironi të ndiqet dhe analizohet me Piwik:",
+ "SiteSetupFootnote": "Shënim: pasi të përfundojë instalimi i Piwik-ut, do të jeni në gjendje të shtoni më tepër Sajte për ndjekje!",
"SuperUser": "Super Përdorues",
+ "SuperUserLogin": "Hyrje si superpërdorues",
+ "SuperUserSetupError": "Pati një gabim gjatë shtimit të Superpërdoruesit",
"SuperUserSetupSuccess": "Super Përdoruesi u krijua me sukses!",
"SystemCheck": "Kontroll sistemi",
"SystemCheckAutoUpdateHelp": "Shënim: përditësimi me Një Klikim i Piwik-ut lyp leje për shkrim te dosja Piwik dhe lënda e saj.",
"SystemCheckCreateFunctionHelp": "Piwik-u përdor funksione anonime për \"callbacks\".",
+ "SystemCheckDatabaseExtensions": "Zgjerime MySQL",
"SystemCheckDatabaseHelp": "Piwik-u lyp ose zgjerimin mysqli, ose që të dy zgjerimet PDO dhe pdo_mysql.",
"SystemCheckDebugBacktraceHelp": "View::factory nuk do të jetë në gjendje të krijojë parje për modulin thirrës.",
"SystemCheckError": "Ndodhi një gabim - duhet të ndreqet përpara se të ecni më tej",
@@ -41,27 +70,38 @@
"SystemCheckExtensions": "Të tjera zgjerime të domosdoshme",
"SystemCheckFileIntegrity": "Pacënueshmëri kartele",
"SystemCheckFunctions": "Funksione të domosdoshëm",
+ "SystemCheckFunctionHelp": "Lypset ta aktivizoni këtë funksion të brendshëm.",
+ "SystemCheckGDFreeType": "GD > 2.x + Freetype (grafikë)",
"SystemCheckGDHelp": "\"Sparklines\" (grafikë të veckël) nuk do të funksionojnë.",
"SystemCheckGlobHelp": "Ky funksion i trupëzuar është i çaktivizuar te streha juaj. Piwik-u do të përpiqet ta emulojë këtë funksion por mund të hasë kufizime të mëtejshme sigurie. Kjo mund të ketë ndikim te funksionimi.",
"SystemCheckGzcompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzcompress.",
"SystemCheckGzuncompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzuncompress.",
"SystemCheckIconvHelp": "Lypset të formësoni dhe rindërtoni PHP-në me aktivizim të mbulimit të \"iconv\", --with-iconv.",
+ "SystemCheckJsonHelp": "Zgjerimi php5-json është i domosdoshëm që Piwik-u të lexojë dhe shkruajë të dhëna JSON.",
"SystemCheckMailHelp": "Mesazhet mbi Përshtypjet dhe Fjalëkalim të Humbur nuk kanë për t’u dërguar pa mail().",
"SystemCheckMbstring": "mbstring",
+ "SystemCheckMbstringHelp": "Zgjerimi mbstring lypset për trajtimin e shenjave shumëbajtshe te ndërfaqja e përdoruesit dhe përgjigjet API. Shihni gjithashtu që mbstring.func_overload te php.ini i është dhënë vlera \"0\".",
"SystemCheckMemoryLimit": "Kufi kujtese",
"SystemCheckMemoryLimitHelp": "Në një sajt me shumë trafik, procesi i arkivimit mund të dojë më tepër kujtesë se sa i është dhënë tani. Në u dashtë, ndryshojeni parametrin memory_limit te kartela juaj php.ini.",
"SystemCheckOpenURL": "Hap URL",
"SystemCheckOpenURLHelp": "Pajtimet në buletine, njoftime përditësimesh, dhe përditësimet me një klikim e duan zgjerimin \"curl\", allow_url_fopen=On, ose fsockopen() të aktivizuar.",
"SystemCheckOtherExtensions": "Zgjerime të tjera",
"SystemCheckOtherFunctions": "Funksione të tjerë",
+ "SystemCheckPageSpeedDisabled": "PageSpeed e çaktivizuar",
+ "SystemCheckPageSpeedWarn": "Këshillojmë çaktivizimin e modulit PageSpeed Module te shërbyesi juaj web %s: Është raportuar se PageSpeed shkakton një numër problemesh me Piwik-un.",
"SystemCheckPackHelp": "Që të gjurmohen vizitorët me Piwik-un, funksioni pack() është i domosdoshëm.",
"SystemCheckParseIniFileHelp": "Ky funksion i trupëzuar është i çaktivizuar te streha juaj. Piwik-u do të përpiqet ta emulojë këtë funksion por mund të hasë kufizime të mëtejshme sigurie. Edhe punimi i gjurmuesit do të preket nga kjo.",
"SystemCheckPdoAndMysqliHelp": "Në një shërbyes Linux mund ta përpiloni php-në me mundësitë vijuese: %1$s te php.ini juaj, shtoni rreshtat vijues: %2$s",
"SystemCheckPhp": "Version PHP-je",
"SystemCheckPhpPdoAndMysqli": "Më tepër të dhëna te: %1$sPHP PDO%2$s dhe %3$sMYSQLI%4$s.",
"SystemCheckSplHelp": "Lypset të formësoni dhe krijoni PHP-në me Librarinë Standarde PHP të aktivizuar (si parazgjedhje).",
+ "SystemCheckSettings": "Formësim PHP-je i domosdoshëm (php.ini)",
+ "SystemCheckSummaryNoProblems": "Urraaaaa! S’ka probleme me rregullimin tuaj të Piwik-ut. Rrihini shpatullat vetes.",
+ "SystemCheckSummaryThereWereErrors": "Ah! Piwik-u ka zbuluar disa %1$sçështje kritike%2$s me rregullimin tuaj për të. %3$sKëto çështje duhen ndrequr menjëherë.%4$s",
+ "SystemCheckSummaryThereWereWarnings": "Ka disa probleme me sistemin tuaj. Piwik-u do të funksionojë, por mund të hasni ca probleme të vockla.",
"SystemCheckTimeLimitHelp": "Në sajt me shumë trafik, përmbushja e procesit të arkivimit mund të dojë më tepër kohë se sa i është dhënë tani. Në u dashtë, ndryshojeni parametrin max_execution_time te kartela juaj php.ini.",
"SystemCheckTracker": "Gjendje gjurmuesi",
+ "SystemCheckTrackerHelp": "Kërkesa GET te piwik.php dështoi. Provoni ta kaloni këtë URL si një të lejuar nga Mirëfilltësimi HTTP dhe çaktivizoni mod_security (mund t’ju duhet t’i kërkoni ndihmë strehuesit tuaj web).Për më tepër të dhëna mbi gabimin, shihni kartelën e regjistrimit të gabimeve të shërbyesit tuaj web.",
"SystemCheckWarnDomHelp": "Do të duhej të aktivizonit zgjerimin \"dom\" (p.sh., instaloni paketën \"php-dom\" dhe\/ose \"php-xml\").",
"SystemCheckWarning": "Piwik-u do të punojë normalisht por mund t’i mungojnë disa veçori",
"SystemCheckWarnJsonHelp": "Do të duhej të aktivizonit zgjerimin \"json\" (p.sh., instaloni paketën \"php-json\") për punim më të mirë.",
@@ -71,15 +111,26 @@
"SystemCheckWriteDirs": "Drejtori me hyrje për shkrim",
"SystemCheckWriteDirsHelp": "Për ndreqjen e këtij gabimi në sistemin tuaj Linux, provoni të shtypni urdhrin(at) vijues",
"SystemCheckZlibHelp": "Lypset të formësoni dhe rikrijoni PHP-në me mbulim të zlib-it të aktivizuar, --with-zlib.",
+ "SystemCheckCronArchiveProcessCLI": "Administrim procesesh përmes CLI-së",
+ "SystemCheckPhpSetting": "Që të parandaloni disa probleme kritike, duhet të rregulloni sa vijon te kartela juaj php.ini: %s",
+ "SystemCheckUpdateHttps": "Përditësoje përmes HTTPS-je",
+ "SystemCheckUpdateHttpsNotSupported": "Piwik-u s’mund të përdorë HTTPS për përditësim, ndaj do të kalojë te përditësimi i pasigurt përmes HTTP. Kujdesuni që të mbulohet CURL ose allow_url_fopen dhe që zgjerimi PHP openssl të jetë i instaluar: http:\/\/piwik.org\/faq\/troubleshooting\/faq_177\/.",
+ "NotSupported": "e pambuluar",
"Tables": "Krijim Tabelash",
"TablesCreatedSuccess": "Tabelat u krijuan me sukses!",
"TablesDelete": "Fshiji tabelat e pikasura",
"TablesDeletedSuccess": "Tabelat ekzistuese të Piwik-ut u fshinë me sukses",
"TablesFound": "Te baza e të dhënave u gjetën tabelat vijuese",
"TablesReuse": "Ripërdor tabelat ekzistuese",
+ "TablesUpdatedSuccess": "Baza e të dhënave u përditësua me sukses, nga %1$s në %2$s!",
"TablesWarningHelp": "Ose zgjidhni përdorimin sërish të tabelave ekzistuese të bazës së të dhënave, ose përzgjidhni instalimin nga e para për të fshirë tërë të dhënat ekzistuese te baza e të dhënave.",
"TablesWithSameNamesFound": "Disa tabela %1$s te baza juaj e të dhënave %2$s kanë të njëjtit emra si tabelat që Piwik-u po përpiqet të krijojë",
+ "Timezone": "Zonë kohore e sajtit",
+ "WeHopeYouWillEnjoyPiwik": "Shpresojmë t’ju shijojë Piwik-i po aq sa na shijon neve krijimi i tij.",
"Welcome": "Mirë se vini!",
- "WelcomeHelp": "<p>Piwik-u është një program analize web, me burim të hapët, që e bën të lehtë të kihen të dhëna që dëshironi rreth vizitorëve tuaj.<\/p><p>Ky proces është ndarë në %s hapa të kollajtë dhe do të zgjasë rreth 5 minuta.<\/p>"
+ "WelcomeHelp": "<p>Piwik-u është një program analize web, me burim të hapët, që e bën të lehtë të kihen të dhëna që dëshironi rreth vizitorëve tuaj.<\/p><p>Ky proces është ndarë në %s hapa të kollajtë dhe do të zgjasë rreth 5 minuta.<\/p>",
+ "WelcomeToCommunity": "Mirë se vini te bashkësia Piwik!",
+ "CannotConnectToDb": "S’lidhet dot me bazën e të dhënave",
+ "CannotConnectToDbResolvingExplanation": "Ky mund të jetë problem i përkohshëm, provoni %1$stë rifreskoni faqen%2$s. Nëse problemi vazhdon, ju lutemi lidhuni me përgjegjësin e Piwik-ut tuaj."
}
} \ No newline at end of file
diff --git a/plugins/Installation/lang/sr.json b/plugins/Installation/lang/sr.json
index ec4fab0a62..1468c49a30 100644
--- a/plugins/Installation/lang/sr.json
+++ b/plugins/Installation/lang/sr.json
@@ -36,7 +36,6 @@
"NfsFilesystemWarning": "Vaš server koristi NFS sistem datoteka.",
"NfsFilesystemWarningSuffixAdmin": "To znači da će Piwik biti jako spor ako koristite sesije bazirane na datotekama.",
"NfsFilesystemWarningSuffixInstall": "Korišćene sesija na bazi datoteka na NFS sistemu je jako sporo tako da će piwik koristiti sesije u bazi podataka. Ako imate puno istovremenih korisnika Konzole, možda ćete morati da povećate maksimalan broj klijentskih konekcija ka serveru sa bazom.",
- "NoConfigFound": "Piwik datoteka sa podešavanjima nije nađena u momentu dok vi pokušavate da pristupite Piwik stranici.<br \/><b>  » Kliknite ovde kako biste <a href='index.php'>instalirali Piwik<\/a><\/b><br \/><small>Ukoliko ste već ranije instalirali Piwik i imate neke tabele u bazi podataka, bez brige: možete nastaviti da ih koristite i zadržite postojeće podatke!<\/small>",
"Optional": "Opciono",
"Password": "Lozinka",
"PasswordDoNotMatch": "lozinke se ne podudaraju",
@@ -49,7 +48,6 @@
"RestartWebServer": "Nakon ovih izmena restartujte vaš web server",
"ReusingTables": "Ponovna upotreba tabela",
"PiwikOrgNewsletter": "pošalji mi mejl kada dođe do značajne Piwik izmene",
- "PiwikProNewsletter": "pošalji mi informacije o %1$sPiwik PRO%2$s uslugama i ponudama",
"SeeBelowForMoreInfo": "Pogledajte ispod za više informacija.",
"SetupWebsite": "Podešavanje sajta",
"SetupWebsiteError": "Došlo je do greške prilikom dodavanja sajta",
diff --git a/plugins/Installation/lang/sv.json b/plugins/Installation/lang/sv.json
index 0bbbd52ad8..1aaf0b810e 100644
--- a/plugins/Installation/lang/sv.json
+++ b/plugins/Installation/lang/sv.json
@@ -36,7 +36,6 @@
"NfsFilesystemWarning": "Din server använder NFS-filsystem.",
"NfsFilesystemWarningSuffixAdmin": "Det betyder att Piwik kommer att vara extremt långsamt när det använder filbaserade sessioner.",
"NfsFilesystemWarningSuffixInstall": "Att använda filbaserade sessioner och NFS är extremt långsamt, så Piwik kommer att använda databassessioner. Om du har många samtidiga användare av instrumentpanelen så är det möjligt att du behöver öka det maximala antalet anslutningar till databasservern.",
- "NoConfigFound": "Piwik's konfigurationsfil kunde inte hittas och du försöker komma åt en Piwik sida. <br \/><b> » Du kan <a href='index.php'> installera Piwik nu<\/a><\/b><br \/><small> Om du har installerat Piwik innan och har en del tabeller i databasen så oroa dig inte, du kan återanvända samma tabeller och behålla dina befintliga data!<\/small>",
"Optional": "Frivilligt",
"Password": "Lösenord",
"PasswordDoNotMatch": "Lösenorden matchar inte",
@@ -49,7 +48,6 @@
"RestartWebServer": "När du har gjort den här ändringen, starta om din webbserver.",
"ReusingTables": "Återanvänder tabellerna",
"PiwikOrgNewsletter": "maila mig vid större Piwik community uppdateringar",
- "PiwikProNewsletter": "skicka mer information om tjänster och erbjudanden från %1$sPiwik PRO%2$s",
"SeeBelowForMoreInfo": "Se nedan för mer information.",
"SetupWebsite": "Konfigurera en webbplats",
"SetupWebsiteError": "Det uppstod ett fel när webbplatsen försökte läggas till.",
@@ -104,6 +102,7 @@
"SystemCheckSummaryThereWereWarnings": "Det finns vissa problem med systemet. Piwik kommer att köras, men du kan uppleva vissa smärre problem.",
"SystemCheckTimeLimitHelp": "På en högtrafik webbplats, för att exekvera arkiveringsprocessen kan det krävas mer tid än vad som för tillfället är tillåtet. Om det är nödvändigt ändra max_execution_time direktivet i din php.ini fil.",
"SystemCheckTracker": "Spårningsstatus",
+ "SystemCheckTrackerHelp": "Hämtningsbegäran för piwik.php misslyckades. Testa med att vitlista denna URL från HTTP Autentiseringen och inaktivera mod_security (eventuellt kan du behöva kontakta ditt webbhotell). För mer information om felet kolla i din fellogg på webbservern.",
"SystemCheckWarnDomHelp": "Du bör aktivera tillägget \"dom\" (t.ex., installera paketet \"php-dom\" och\/eller \"php-xml\").",
"SystemCheckWarning": "Piwik kommer fungera som normalt men kommer sakna vissa funktioner",
"SystemCheckWarnJsonHelp": "Du bör aktivera tillägget \"json\" (t.ex., installera paketet \"php-json\") för bättre prestanda.",
@@ -117,6 +116,7 @@
"SystemCheckCronArchiveProcessCLI": "Hantering av processer via CLI",
"SystemCheckPhpSetting": "För att det inte ska uppstå problem måste du ställa in följande i din php.ini-fil: %s",
"SystemCheckUpdateHttps": "Uppdatera över HTTPS",
+ "SystemCheckUpdateHttpsNotSupported": "Piwik kan inte använda HTTPS för att uppdatera och kommer att köra på en osäker HTTP uppdatering. Kontrollera att du har stöd för CURL eller allow_url_fopen och att openssl PHP-tilläget är installerat: http:\/\/piwik.org\/faq\/troubleshooting\/faq_177\/.",
"NotSupported": "stöds inte",
"Tables": "Skapar tabellerna",
"TablesCreatedSuccess": "Tabeller skapades utan problem!",
diff --git a/plugins/Installation/lang/th.json b/plugins/Installation/lang/th.json
index f8f3553169..74eda2e4c4 100644
--- a/plugins/Installation/lang/th.json
+++ b/plugins/Installation/lang/th.json
@@ -21,7 +21,6 @@
"LargePiwikInstances": "ความช่วยเหลือสำหรับอินสแตนซ์ Piwik ขนาดใหญ่",
"Legend": "Legend",
"NfsFilesystemWarning": "เซิร์ฟเวอร์ของคุณใช้ระบบไฟล์แบบ NFS",
- "NoConfigFound": "ไม่พบแฟ้มการกำหนดค่า Piwik และคุณกำลังพยายามเข้าถึง Piwik<br \/><b>  » คุณสามารถ<a href='index.php'>ติดตั้ง Piwik ได้ที่นี่<\/a><\/b><br \/><small>ถ้าคุณติดตั้ง Piwik ก่อน และมีตารางบางตารางในฐานข้อมูลของคุณ ไม่ต้องกังวลใจไปครับ คุณสามารถนำมาใช้ใหม่ในตารางเดียวกันได้ และสามารถเก็บข้อมูลตัวเก่าที่มีอยู่ของคุณได้เช่นกัน!<\/small>",
"Optional": "ตัวเลือก",
"PasswordDoNotMatch": "รหัสผ่านไม่ถูกต้อง",
"PercentDone": "ติดตั้งเสร็จไปแล้ว %s %%",
diff --git a/plugins/Installation/lang/tl.json b/plugins/Installation/lang/tl.json
index 236c16296a..89ac7331c8 100644
--- a/plugins/Installation/lang/tl.json
+++ b/plugins/Installation/lang/tl.json
@@ -32,7 +32,6 @@
"NfsFilesystemWarning": "Ang iyong server ay gumagamit ng isang NFS filesystem",
"NfsFilesystemWarningSuffixAdmin": "Ito ay nangangahulugan na ang Piwik ay lubhang babagal kapag gumagamit ng file na batay sa session.",
"NfsFilesystemWarningSuffixInstall": "Ang pag-gamit ng file based session sa NFS ay sobrang mabagal iyong kakailanganin ang pag dag-dag ng maximum number na komokonekta sa iyong database server.",
- "NoConfigFound": "Ang Piwik configuration file ay hindi makita at iyong sinusubukang pumasok sa pahina ng Piwik.<br \/><b> » Maari mong <a href='index.php'>I-install ang Piwik ngayon<\/a><\/b><br \/><small>Kung iyo ng nainstall ang piwik dati at at meron ka nang mga tables sa iyong DB wag mabahala maari mo paring gamitin ang parehong mga tables at mapanatili ang mga datus na meron ka na!<\/small>",
"Optional": "Opsyonal",
"PasswordDoNotMatch": "password ay hindi tumutugma",
"PercentDone": "%s %% Tapos na",
diff --git a/plugins/Installation/lang/uk.json b/plugins/Installation/lang/uk.json
index e011055c38..b1b7323665 100644
--- a/plugins/Installation/lang/uk.json
+++ b/plugins/Installation/lang/uk.json
@@ -13,15 +13,16 @@
"DatabaseSetupLogin": "логін",
"DatabaseSetupServer": "сервер баз даних",
"DatabaseSetupTablePrefix": "префікс таблиць",
+ "Email": "Email",
"Extension": "Розширення",
"GoBackAndDefinePrefix": "Повернутися і встановити префікс для таблиць Piwik",
"Installation": "Встановлення",
"InstallationStatus": "Статус встановлення",
"LargePiwikInstances": "Доомога для великих інсталяцій Piwik",
"Legend": "Підказка",
- "NoConfigFound": "Файл конфігурації Piwik не знайдено в той час як Ви намагаєтесь користуватися Piwik.<br><b>  » Ви можете <a href='index.php'>встановити Piwik зараз<\/a><\/b><br><small>Якщо ви встановили Piwik раніше і деякі таблиці залишились в базі даних, Ви зможете використати їх і тим самим зберегти вже існуючі дані!<\/small>",
"Optional": "Не обовязково",
"PasswordDoNotMatch": "пароль не співпадає",
+ "PasswordRepeat": "Пароль ще раз",
"PercentDone": "%s %% Завершено",
"PleaseFixTheFollowingErrors": "Виправте наступні помилки",
"Requirements": "Системні вимоги Piwik",
diff --git a/plugins/Installation/lang/vi.json b/plugins/Installation/lang/vi.json
index 70797d7366..d9ce85ab73 100644
--- a/plugins/Installation/lang/vi.json
+++ b/plugins/Installation/lang/vi.json
@@ -32,7 +32,6 @@
"NfsFilesystemWarning": "Máy chủ của bạn đang sử dụng một tập tin hệ thống NFS",
"NfsFilesystemWarningSuffixAdmin": "Điều này tức là Piwik sẽ rất chậm khi sử dụng tập tin dựa trên phiên.",
"NfsFilesystemWarningSuffixInstall": "Sử dụng tập tin dựa trên các phiên trên NFS là rất chậm, vì vậy Piwik sẽ sử dụng các phiên cơ sở dữ liệu. Nếu bạn có nhiều người sử dụng bảng điều khiển đồng thời, bạn có thể cần phải tăng số lượng tối đa các kết nối client đến máy chủ cơ sở dữ liệu.",
- "NoConfigFound": "Tập tin cấu hình Piwik không thể được tìm thấy và bạn đang cố gắng truy cập vào một trang Piwik. <br\/><b> »Bạn có thể <a href='index.php'> cài đặt Piwik ngay bây giờ <\/a> <\/b> <br \/> <small> Nếu bạn cài đặt Piwik trước và có một số bảng trong DB của bạn, đừng lo lắng, bạn có thể sử dụng lại các bảng giống nhau và giữ dữ liệu hiện tại của bạn! <\/small>",
"Optional": "Tùy chọn",
"PasswordDoNotMatch": "Mật khẩu không phù hợp",
"PercentDone": "%s %% thực hiện",
diff --git a/plugins/Installation/lang/zh-cn.json b/plugins/Installation/lang/zh-cn.json
index ab96b1f3c3..dbe9371fea 100644
--- a/plugins/Installation/lang/zh-cn.json
+++ b/plugins/Installation/lang/zh-cn.json
@@ -36,14 +36,11 @@
"NfsFilesystemWarning": "您的服务器使用NFS文件系统。",
"NfsFilesystemWarningSuffixAdmin": "这意味着 Piwik 使用基于文件的会话将会非常慢。",
"NfsFilesystemWarningSuffixInstall": "在NFS上使用基于文件的会话会非常慢,所以 Piwik 将使用数据库会话。如果您有很多并发的面板用户,需要在增大客户端连接到服务器的最大数。",
- "NoConfigFound": "无法找到 Piwik 配置文件,而您正尝试存取一个 Piwik 的页面!<br \/><b>  » 您可以 <a href='index.php'>立刻安装 Piwik<\/a><\/b><br \/><small>假如您在之前已安装过 Piwik,并且已有些数据表在您的数据库中,不用担心,您可以重复使用此相同的数据表并保留您现存的数据!<\/small>",
"Optional": "非必需",
"Password": "密码",
"PasswordDoNotMatch": "密码不匹配",
"PasswordRepeat": "密码(重复)",
"PercentDone": "%s %% 已完成",
- "PiwikProAdTitle": "高级分析与服务",
- "PiwikProAdText": "添加高级功能和解锁全部功能需要 %1$s,Piwik PRO版本价格为 %2$s,您还可以选择Piwik 主机,只需要 %3$s ,Piwik PRO版云主机只需要 %4$s 。",
"PleaseFixTheFollowingErrors": "请修复以下错误",
"DefaultSettings": "默认 Piwik 设置",
"DefaultSettingsHelp": "Piwik自带的默认设置。现在,您可以自定义它们或稍后在管理介面上做。",
@@ -51,7 +48,6 @@
"RestartWebServer": "做过这个改动之后,请重新启动网络服务器。",
"ReusingTables": "重用的表",
"PiwikOrgNewsletter": "邮件通知我重大的 Piwik 社区更新",
- "PiwikProNewsletter": "给我发送 %1$sPiwik PRO%2$s 的折扣和服务相关的信息",
"SeeBelowForMoreInfo": "更详细的信息请看下面",
"SetupWebsite": "设定一个网站",
"SetupWebsiteError": "增加此网站时出现错误",
diff --git a/plugins/Installation/lang/zh-tw.json b/plugins/Installation/lang/zh-tw.json
index d46e632f79..69be80e9a9 100644
--- a/plugins/Installation/lang/zh-tw.json
+++ b/plugins/Installation/lang/zh-tw.json
@@ -18,7 +18,6 @@
"InstallationStatus": "安裝狀態",
"LargePiwikInstances": "Piwik 給予大型網站的協助",
"Legend": "說明",
- "NoConfigFound": "無法找到 Piwik 設定檔,而你正嘗試存取一個 Piwik 的頁面。<br \/><b>  » 你可以 <a href='index.php'>立刻安裝 Piwik<\/a><\/b><br \/><small>假如你之前已安裝過 Piwik,並且已有些資料表在你的資料庫中,不用擔心,你可以重複使用此相同的資料表並保留現存的資料!<\/small>",
"Optional": "選擇性",
"PasswordDoNotMatch": "密碼不相符",
"PercentDone": "%s %% 已完成",
diff --git a/plugins/Installation/templates/finished.twig b/plugins/Installation/templates/finished.twig
index b64bb79812..133bdc6ab4 100644
--- a/plugins/Installation/templates/finished.twig
+++ b/plugins/Installation/templates/finished.twig
@@ -17,13 +17,13 @@
<p>{{ 'Installation_WeHopeYouWillEnjoyPiwik'|translate }}</p>
<p><i>{{ 'Installation_HappyAnalysing'|translate }}</i></p>
- {% if arePiwikProAdsEnabled %}
- <h3>{{ 'Installation_PiwikProAdTitle'|translate }}</h3>
+ {% if areAdsForProfessionalServicesEnabled %}
+ <h3>{{ 'Installation_ProfessionalServicesAdTitle'|translate }}</h3>
<p>
- {% set linkOnPremises = 'Installation_End'|piwikProOnPremisesPromoUrl %}
- {% set linkOnCloud = 'Installation_End'|piwikProCloudPromoUrl %}
-
- {{ 'Installation_PiwikProAdText'|translate('<a rel="noreferrer" target="_blank" href="' ~ linkOnPremises ~ '">','</a>', '<a rel="noreferrer" target="_blank" href="' ~ linkOnCloud ~ '">','</a>')|raw }}
+ {{ 'Installation_ProfessionalServicesfessionalServicesAdText'|translate }}
+ </p>
+ <p>
+ {{ 'Installation_ProfessionalServicesfessionalDiscoverHow'|translate('<a rel="noreferrer" target="_blank" href="' ~ linkToProfessionalServices ~ '">','</a>')|raw }}
</p>
{% endif %}
diff --git a/plugins/LanguagesManager/Commands/FetchTranslations.php b/plugins/LanguagesManager/Commands/FetchTranslations.php
index 79f83da36d..ce24dc3a97 100644
--- a/plugins/LanguagesManager/Commands/FetchTranslations.php
+++ b/plugins/LanguagesManager/Commands/FetchTranslations.php
@@ -13,7 +13,7 @@ use Piwik\Container\StaticContainer;
use Piwik\Exception\AuthenticationFailedException;
use Piwik\Plugins\LanguagesManager\API as LanguagesManagerApi;
use Piwik\Translation\Transifex\API;
-use Symfony\Component\Console\Helper\ProgressHelper;
+use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
@@ -38,6 +38,8 @@ class FetchTranslations extends TranslationBase
protected function execute(InputInterface $input, OutputInterface $output)
{
+ $output->setDecorated(true);
+
$username = $input->getOption('username');
$password = $input->getOption('password');
$plugin = $input->getOption('plugin');
@@ -81,10 +83,10 @@ class FetchTranslations extends TranslationBase
$languages = $languageCodes;
}
- /** @var ProgressHelper $progress */
- $progress = $this->getHelperSet()->get('progress');
+ /** @var ProgressBar $progress */
+ $progress = new ProgressBar($output, count($languages));
- $progress->start($output, count($languages));
+ $progress->start();
$statistics = $transifexApi->getStatistics($resource);
@@ -108,6 +110,7 @@ class FetchTranslations extends TranslationBase
}
$progress->finish();
+ $output->writeln('');
}
public static function getDownloadPath()
diff --git a/plugins/LanguagesManager/Commands/Update.php b/plugins/LanguagesManager/Commands/Update.php
index b4f9eea4af..375614c5db 100644
--- a/plugins/LanguagesManager/Commands/Update.php
+++ b/plugins/LanguagesManager/Commands/Update.php
@@ -11,12 +11,12 @@ namespace Piwik\Plugins\LanguagesManager\Commands;
use Piwik\Plugins\LanguagesManager\API;
use Symfony\Component\Console\Helper\DialogHelper;
-use Symfony\Component\Console\Helper\ProgressHelper;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\NullOutput;
use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Helper\ProgressBar;
/**
*/
@@ -34,6 +34,8 @@ class Update extends TranslationBase
protected function execute(InputInterface $input, OutputInterface $output)
{
+ $output->setDecorated(true);
+
$start = microtime(true);
/** @var DialogHelper $dialog */
@@ -76,10 +78,10 @@ class Update extends TranslationBase
$output->writeln("Starting to import new language files");
- /** @var ProgressHelper $progress */
- $progress = $this->getHelperSet()->get('progress');
+ /** @var ProgressBar $progress */
+ $progress = new ProgressBar($output, count($files));
- $progress->start($output, count($files));
+ $progress->start();
foreach ($files as $filename) {
@@ -119,6 +121,7 @@ class Update extends TranslationBase
}
$progress->finish();
+ $output->writeln('');
}
$output->writeln("Finished in " . round(microtime(true)-$start, 3) . "s");
@@ -140,7 +143,7 @@ class Update extends TranslationBase
preg_match_all('/plugins\/([a-zA-z]+) /', $submodules, $matches);
$submodulePlugins = $matches[1];
- // ignore complete new plugins aswell
+ // ignore complete new plugins as well
$changes = shell_exec('git status');
preg_match_all('/plugins\/([a-zA-z]+)\/\n/', $changes, $matches);
$newPlugins = $matches[1];
@@ -177,7 +180,7 @@ class Update extends TranslationBase
if ($input->getOption('force')) {
$arguments['--lastupdate'] = 1;
} else {
- $lastModDate = strtotime('2015-01-04 00:00:00'); // date of inital transifex setup
+ $lastModDate = strtotime('2015-01-04 00:00:00'); // date of initial transifex setup
try {
// try to find the language file (of given plugin) with the newest modification date in git log
$path = ($plugin ? 'plugins/' . $plugin . '/' : '') . 'lang';
diff --git a/plugins/LanguagesManager/Model.php b/plugins/LanguagesManager/Model.php
index fad84238cd..071863b3cd 100644
--- a/plugins/LanguagesManager/Model.php
+++ b/plugins/LanguagesManager/Model.php
@@ -58,7 +58,7 @@ class Model
}
/**
- * Returns whether the given user has choosen to use 12 hour clock
+ * Returns whether the given user has chosen to use 12 hour clock
*
* @param $userLogin
* @return bool
diff --git a/plugins/LanguagesManager/lang/sq.json b/plugins/LanguagesManager/lang/sq.json
index 44f1ff8f52..79312c1c0b 100644
--- a/plugins/LanguagesManager/lang/sq.json
+++ b/plugins/LanguagesManager/lang/sq.json
@@ -1,5 +1,6 @@
{
"LanguagesManager": {
- "AboutPiwikTranslations": "Mbi përkthimet e Piwik-ut"
+ "AboutPiwikTranslations": "Mbi përkthimet e Piwik-ut",
+ "TranslationSearch": "Kërkim Përkthimi"
}
} \ No newline at end of file
diff --git a/plugins/LanguagesManager/lang/uk.json b/plugins/LanguagesManager/lang/uk.json
index 63f18a97ce..e37be17d69 100644
--- a/plugins/LanguagesManager/lang/uk.json
+++ b/plugins/LanguagesManager/lang/uk.json
@@ -1,5 +1,6 @@
{
"LanguagesManager": {
- "AboutPiwikTranslations": "Про переклади Piwik"
+ "AboutPiwikTranslations": "Про переклади Piwik",
+ "TranslationSearch": "Пошук перекладу"
}
} \ No newline at end of file
diff --git a/plugins/Live/Controller.php b/plugins/Live/Controller.php
index a74b4424ec..3a87d75559 100644
--- a/plugins/Live/Controller.php
+++ b/plugins/Live/Controller.php
@@ -133,7 +133,7 @@ class Controller extends \Piwik\Plugin\Controller
));
$view->visitData = $visits->getFirstRow()->getColumns();
$view->visitReferralSummary = VisitorProfile::getReferrerSummaryForVisit($visits->getFirstRow());
- $view->showLocation = true;
+ $view->showLocation = \Piwik\Plugin\Manager::getInstance()->isPluginLoaded('UserCountry');
$this->setWidgetizedVisitorProfileUrl($view);
$view->exportLink = $this->getVisitorProfileExportLink();
return $view->render();
diff --git a/plugins/Live/javascripts/live.js b/plugins/Live/javascripts/live.js
index bf386fdb88..95688e147d 100644
--- a/plugins/Live/javascripts/live.js
+++ b/plugins/Live/javascripts/live.js
@@ -65,7 +65,14 @@
ajaxRequest.addParams(this.options.dataUrlParams, 'GET');
ajaxRequest.setFormat('html');
ajaxRequest.setCallback(function (r) {
- that._parseResponse(r);
+ if (that.options.replaceContent) {
+ $(that.element).html(r);
+ if (that.options.fadeInSpeed) {
+ $(that.element).effect("highlight", {}, that.options.fadeInSpeed);
+ }
+ } else {
+ that._parseResponse(r);
+ }
// add default interval to last interval if not updated or reset to default if so
if (!that.updated) {
diff --git a/plugins/Live/lang/fr.json b/plugins/Live/lang/fr.json
index 2dff46092b..4cdf25a9dc 100644
--- a/plugins/Live/lang/fr.json
+++ b/plugins/Live/lang/fr.json
@@ -1,9 +1,11 @@
{
"Live": {
+ "AbandonedCartSummary": "%1$s caddies abandonnés%2$s et %3$s articles abandonnés%4$s pour une valeur totale de %5$s%6$s.",
"AveragePageGenerationTime": "Chaque page a pris une moyenne de %1$s à charger pour ce visiteur.",
"CalculatedOverNPageViews": "Calculé sur la base des %1$s dernières pages vues par ce visiteur.",
"ClickToViewMoreAboutVisit": "Cliquez pour afficher plus d'informations à propos de cette visite",
"ConvertedNGoals": "Conversion de %s objectifs",
+ "EcommerceSummaryConversions": "%1$s commandes%2$s sur un total de %3$s%4$s, comptaient %5$s articles%6$s.",
"FirstVisit": "Première visite",
"GoalType": "Type",
"HideMap": "Cacher la carte",
@@ -33,6 +35,8 @@
"VisitorsInRealTime": "Visiteurs en temps réel",
"VisitorsLastVisit": "La dernière visite du visiteur était il y a %s jours.",
"VisitsFrom": "%1$s%2$s visites%3$s de",
+ "VisitSummary": "A passé un total de %1$s%2$s sur le site web%3$s, et %4$saffiché %5$s pages en %6$s visites.%7$s",
+ "VisitSummaryWithActionDetails": "A passé un total de %1$s%2$s sur le site web%3$s, et effectué %4$s actions %5$s (%6$s) en %7$s visites%8$s.",
"RowActionTooltipDefault": "Afficher le logs des visiteurs segmenté par cette rangée",
"RowActionTooltipWithDimension": "Afficher le log des visiteurs segmenté en fonction de %s",
"RowActionTooltipTitle": "Ouvrir le log des visiteur segmenté",
diff --git a/plugins/Live/lang/nl.json b/plugins/Live/lang/nl.json
index 571ac72f2e..7e7dba65df 100644
--- a/plugins/Live/lang/nl.json
+++ b/plugins/Live/lang/nl.json
@@ -1,9 +1,11 @@
{
"Live": {
+ "AbandonedCartSummary": "%1$s verlaten winkelmanden%2$s en %3$s verlaten artikelen %4$s met een totaal waarde van %5$s%6$s.",
"AveragePageGenerationTime": "Elke pagina duurde gemiddeld %1$s om te laden voor deze bezoeker.",
"CalculatedOverNPageViews": "Berekend met de laatste %1$s paginaweergaves van deze bezoeker.",
"ClickToViewMoreAboutVisit": "Klik om meer informatie over dit bezoek te zien",
"ConvertedNGoals": "Behaalde %s Doelen",
+ "EcommerceSummaryConversions": "%1$s bestellingen %2$s voor een totaal van %3$s%4$s, besteld %5$s items %6$s.",
"FirstVisit": "Eerste bezoek",
"GoalType": "Type",
"HideMap": "Verberg kaart",
@@ -33,6 +35,8 @@
"VisitorsInRealTime": "Bezoekers in real-time",
"VisitorsLastVisit": "Het laatste bezoek van deze bezoekers was %s dagen geleden.",
"VisitsFrom": "%1$s%2$s bezoeken%3$s van",
+ "VisitSummary": "Bestede in totaal %1$s%2$s op de website %3$s, en bekeek %4$s pagina's %5$s in %6$s bezoeken %7$s.",
+ "VisitSummaryWithActionDetails": "Bestede in totaal %1$s%2$s op de website%3$s, en verrichte %4$s acties%5$s (%6$s) in %7$s bezoeken%8$s.",
"RowActionTooltipDefault": "Toon bezoekers log verdeeld volgens deze rij",
"RowActionTooltipWithDimension": "Toon bezoekers log verdeeld volgens %s",
"RowActionTooltipTitle": "Open gesegmenteerd Bezoekerslogboek",
diff --git a/plugins/Live/lang/ru.json b/plugins/Live/lang/ru.json
index 96f0c99890..266261bbe6 100644
--- a/plugins/Live/lang/ru.json
+++ b/plugins/Live/lang/ru.json
@@ -1,9 +1,11 @@
{
"Live": {
+ "AbandonedCartSummary": "%1$s заброшенных корзин %2$s и %3$s заброшенных товаров%4$s в сумме стоящих %5$s%6$s.",
"AveragePageGenerationTime": "В среднем требовалось %1$s у этого посетителя для полной загрузки страницы.",
"CalculatedOverNPageViews": "Рассчитано на основе этого посетителя с %1$s просмотром страниц(ы).",
"ClickToViewMoreAboutVisit": "Посмотреть более подробную информацию об этом визите",
"ConvertedNGoals": "Целей достигнуто: %s",
+ "EcommerceSummaryConversions": "%1$s заказов%2$s в общей сложности %3$s%4$s, куплено %5$s товаров%6$s.",
"FirstVisit": "Первое посещение",
"GoalType": "Тип",
"HideMap": "скрыть карту",
@@ -19,7 +21,7 @@
"NextVisitor": "Следующий посетитель",
"NoMoreVisits": "Больше нет посещений у этого посетителя.",
"PageRefreshed": "Сколько раз эта страница была просмотрена \/ обновлена несколько ряд подряд.",
- "PluginDescription": "Показывает актуальный журнал посетителей и позволяет смотреть ваших посетителей в режиме реального времени на приборной панели виджетов. Плагин также позволяет просматривать профиль посетитель данного пользователя.",
+ "PluginDescription": "Показывает актуальный журнал посетителей и позволяет смотреть ваших посетителей в режиме реального времени на приборной панели виджетов. Плагин также позволяет просматривать профиль посетителя для каждого пользователя.",
"PreviousVisitor": "Предыдущий посетитель",
"RealTimeVisitorCount": "Счётчик посетителей в реальном времени",
"Referrer_URL": "URL источника",
@@ -33,8 +35,12 @@
"VisitorsInRealTime": "Посетители в реальном времени",
"VisitorsLastVisit": "Последнее посещение этого пользователя было %s дней назад.",
"VisitsFrom": "%1$s%2$s визитов%3$s от",
+ "VisitSummary": "Провел в общей сложности %1$s%2$s на веб-сайте%3$s и просмотрел %4$s страниц%5$s за %6$s посещений%7$s.",
+ "VisitSummaryWithActionDetails": "Провел в общей сложности%1$s%2$s на веб-сайте%3$s и совершил %4$s действий%5$s (%6$s) за %7$s посещений%8$s.",
"RowActionTooltipDefault": "Показать журнал посетителей, сегментированный по этой строке",
"RowActionTooltipTitle": "Открыть сегментированный журнал посетителей",
- "SegmentedVisitorLogTitle": "Просмотр посещений где %1$s равно \"%2$s\""
+ "SegmentedVisitorLogTitle": "Просмотр посещений где %1$s равно \"%2$s\"",
+ "OnClickPause": "%s началось. Нажмите, чтобы приостановить.",
+ "OnClickStart": "%s остановлено. Нажмите, чтобы начать."
}
} \ No newline at end of file
diff --git a/plugins/Live/lang/sv.json b/plugins/Live/lang/sv.json
index cb5ade51e4..7bd00416f4 100644
--- a/plugins/Live/lang/sv.json
+++ b/plugins/Live/lang/sv.json
@@ -21,6 +21,7 @@
"NextVisitor": "Nästa besökare",
"NoMoreVisits": "Det finns inga fler besök för den här besökaren.",
"PageRefreshed": "Antal gånger denna sida har besökts \/ uppdateras i rad.",
+ "PluginDescription": "Ger tillgång till Besöksloggen i realtid och låter dig hålla koll på dina besökare live i realtids instrumentpanelen. Tillägget låter dig också se en Besöksprofil för valfri användare.",
"PreviousVisitor": "Förgående besökare",
"RealTimeVisitorCount": "Besöksräknare i realtid",
"Referrer_URL": "Hänvisningsadress",
@@ -34,6 +35,10 @@
"VisitorsInRealTime": "Besökare i realtid",
"VisitorsLastVisit": "Denna besökares senaste besök var %s dagar sedan.",
"VisitsFrom": "%1$s%2$s besökta %3$s från",
+ "VisitSummary": "Spenderade totalt %1$s%2$s på webbplatsen%3$s och kollade på %4$s sidor%5$s under %6$s besök%7$s.",
+ "VisitSummaryWithActionDetails": "Spenderade totalt %1$s%2$s på webbplatsen%3$s och genomförde %4$s händelser%5$s (%6$s) under %7$s besök%8$s.",
+ "RowActionTooltipDefault": "Visa Besöksloggen med segmentering baserat på denna rad",
+ "RowActionTooltipWithDimension": "Visa Besöksloggen med segmentering baserat på detta %s",
"RowActionTooltipTitle": "Öppna segmenterade besöksloggar",
"SegmentedVisitorLogTitle": "Besökslogg visar var besökarna %1$s och \"%2$s\" är",
"OnClickPause": "%s är startad. Klicka för att pausa.",
diff --git a/plugins/Live/lang/uk.json b/plugins/Live/lang/uk.json
index 862b663062..52137fc6c9 100644
--- a/plugins/Live/lang/uk.json
+++ b/plugins/Live/lang/uk.json
@@ -1,11 +1,47 @@
{
"Live": {
+ "AbandonedCartSummary": "%1$s кинутих кошиків%2$s та %3$s кинуті речей%4$s на загальну суму %5$s%6$s.",
+ "AveragePageGenerationTime": "В середньому потрібно %1$s у цього відвідувача для повного завантаження сторінки.",
+ "CalculatedOverNPageViews": "Розраховано на основі цього відвідувача з %1$s переглядом сторінки(ок).",
+ "ClickToViewMoreAboutVisit": "Подивитися більш детальну інформацію про цей візит",
+ "ConvertedNGoals": "Цілей досягнуто: %s",
+ "EcommerceSummaryConversions": "%1$s замовлень%2$s в цілому %3$s%4$s, куплено %5$s предметів%6$s.",
+ "FirstVisit": "Перше відвідування",
"GoalType": "Тип",
- "LastHours": "Останні %s годин(и)",
- "LastMinutes": "Останні %s хвилин(и)",
- "LinkVisitorLog": "Переглянути детальний протокол відвідувача",
- "Referrer_URL": "URL-адреса джерело переходів",
- "VisitorLog": "Протокол відвідувача",
- "VisitorsInRealTime": "Відвідувачі в реальному часі"
+ "HideMap": "приховати карту",
+ "KeywordRankedOnSearchResultForThisVisitor": "Ключове слово %1$s займає %2$s місце на %3$s сторінці пошуку для цього відвідувача",
+ "LastHours": "Останні %s годин",
+ "LastMinutes": "Останні %s хвилин",
+ "LastVisit": "Останнє відвідування",
+ "LinkVisitorLog": "Подивитися детальний журнал відвідувачів",
+ "LoadMoreVisits": "Завантажити більше відвідувачів",
+ "MorePagesNotDisplayed": "Більше сторінок про цього відвідувача не відображається.",
+ "NbVisitor": "1 відвідувач",
+ "NbVisitors": "%s відвідувачів",
+ "NextVisitor": "Наступний відвідувач",
+ "NoMoreVisits": "Більше немає відвідувань у цього відвідувача.",
+ "PageRefreshed": "Скільки разів ця сторінка була переглянута \/ оновлена ​​кілька ряд поспіль.",
+ "PluginDescription": "Показує актуальний журнал відвідувачів та дозволяє дивитися ваших відвідувачів в режимі реального часу на приладовій панелі віджетів. Плагін також дозволяє переглядати профіль відвідувача даного користувача.",
+ "PreviousVisitor": "Попередній відвідувач",
+ "RealTimeVisitorCount": "Лічильник відвідувачів в реальному часі",
+ "Referrer_URL": "URL джерела",
+ "ShowMap": "показати карту",
+ "SimpleRealTimeWidget_Message": "%1$s і %2$s за останні %3$s",
+ "ViewVisitorProfile": "Переглянути профіль відвідувача",
+ "VisitedPages": "Відвідані сторінки",
+ "VisitorLog": "Журнал відвідувачів",
+ "VisitorLogDocumentation": "Ця таблиця показує останні відвідування за обраний період. Ви можете бачити час останніх відвідин користувача при наведенні миші на дату відвідування. %1$s Якщо період включає сьогоднішній день, ви можете спостерігати за відвідувачами в реальному часі! %2$s Дані тут завжди відображаються в режимі реального часу незалежно від того, як часто ви використовуєте архівацію по крону.",
+ "VisitorProfile": "Профіль користувача",
+ "VisitorsInRealTime": "Відвідувачі в реальному часі",
+ "VisitorsLastVisit": "Останнє відвідування цього користувача було %s днів назад.",
+ "VisitsFrom": "%1$s%2$s візитів%3$s від",
+ "VisitSummary": "Провів в цілому %1$s%2$s на сайті%3$s, і переглянв %4$s сторінок%5$s в %6$s візитах%7$s.",
+ "VisitSummaryWithActionDetails": "Провів в цілому %1$s%2$s на сайті%3$s, і виконав %4$s дій%5$s (%6$s) в %7$s візитах%8$s.",
+ "RowActionTooltipDefault": "Показати журнал відвідувачів, сегментований по цьому рядку",
+ "RowActionTooltipWithDimension": "Показати журнал відвідувань сегментованих по цій %s",
+ "RowActionTooltipTitle": "Відкрити сегментований журнал відвідувачів",
+ "SegmentedVisitorLogTitle": "Перегляд журналу відвідувань, де %1$s є \"%2$s\"",
+ "OnClickPause": "%s запущено. Натисніть, щоб призупинити.",
+ "OnClickStart": "%s зупинено. Натисніть, щоб розпочати."
}
} \ No newline at end of file
diff --git a/plugins/Live/templates/_actionsList.twig b/plugins/Live/templates/_actionsList.twig
index d4ee6c203f..8d8bc1572a 100644
--- a/plugins/Live/templates/_actionsList.twig
+++ b/plugins/Live/templates/_actionsList.twig
@@ -101,10 +101,16 @@
and previousAction.url|default(false) == action.url %}
{# For events, do not show (url) if the Event URL is the same as the URL last displayed #}
{% else %}
+ {% if action.url|trim|lower starts with 'javascript:' or
+ action.url|trim|lower starts with 'vbscript:' or
+ action.url|trim|lower starts with 'data:' %}
+ {{ action.url }}
+ {% else %}
<a href="{{ action.url }}" rel="noreferrer" target="_blank" class="{% if action.eventCategory|default(false) is empty %}action-list-url{# don't put URL on new line for events #}{% endif %} truncated-text-line"
{% if overrideLinkStyle is not defined or overrideLinkStyle %}style="text-decoration:underline;"{% endif %}>
{{ action.url }}
</a>
+ {% endif %}
{% endif %}
{% if action.type == 'action' and action.pageTitle|default(false) is not empty %}</p>{% endif %}
{% elseif action.type != 'search' and action.type != 'event' %}
diff --git a/plugins/Login/lang/cs.json b/plugins/Login/lang/cs.json
index 2395841b94..39c4b874b0 100644
--- a/plugins/Login/lang/cs.json
+++ b/plugins/Login/lang/cs.json
@@ -12,6 +12,7 @@
"LoginOrEmail": "Uživatelské jméno nebo E-mail",
"LoginPasswordNotCorrect": "Chybná kombinace uživatelského jména a hesla.",
"LostYourPassword": "Zapomněli jste vaše heslo?",
+ "MailPasswordChangeBody": "Ahoj %1$s,\n\nz %2$s byl přijat požadavek na reset hesla. Abyste se mohli přihlásit s novými přihlašovacími údaji, navštivte následující odkaz:\n\n%3$s\n\nUpozornění: Změna hesla rovněž změní váš token_auth. Váš nový token_auth naleznete na stránce s vaším nastavením\n\nPokud používáte váš token_auth v externích aplikacích nebo pro archivaci, nezapomeňte h změnit, jinak API požadavky selžou\n\nPoznámka: tento odkaz vyprší za 24 hodin.\n\nA děkujeme, že používáte Piwik!",
"MailTopicPasswordChange": "Potvrďte změnu hesla",
"PasswordChanged": "Vaše heslo bylo změněno.",
"PasswordRepeat": "Heslo (pro kontrolu)",
diff --git a/plugins/Login/lang/de.json b/plugins/Login/lang/de.json
index 79a712d83f..0d606e4cf1 100644
--- a/plugins/Login/lang/de.json
+++ b/plugins/Login/lang/de.json
@@ -12,6 +12,7 @@
"LoginOrEmail": "Benutzername oder E-Mail",
"LoginPasswordNotCorrect": "Benutzername und Passwort sind nicht korrekt",
"LostYourPassword": "Passwort vergessen?",
+ "MailPasswordChangeBody": "Hallo %1$s,\n\nEine Anfrage zum Zurücksetzen des Passworts von %2$s wurde empfangen. Um die Passwortänderung zu bestätigen, damit Sie sich mit Ihren neuen Zugangsdaten anmelden können, besuchen Sie folgenden Link:\n\n%3$s\n\nAchtung: Das Ändern des Passworts wird auch Ihren token_auth ändern. Sie können den neuen token_auth bei Ihren Einstellungen einsehen.\n\nFalls Sie Ihren API token_auth in einem externen Programm oder für die Archivierung einsetzen, vergewissern Sie sich bitte, dass der token_auth aktualisiert wird, sonst werden die Anfragen an die API fehlschlagen.\n\nHinweis: Der Link ist nur 24 Stunden gültig.\n\nUnd vielen Dank, dass Sie Piwik verwenden!",
"MailTopicPasswordChange": "Passwortänderung bestätigen",
"PasswordChanged": "Das Passwort wurde geändert.",
"PasswordRepeat": "Passwort (wiederholen)",
diff --git a/plugins/Login/lang/el.json b/plugins/Login/lang/el.json
index 61ef5c8f57..4657d11fb7 100644
--- a/plugins/Login/lang/el.json
+++ b/plugins/Login/lang/el.json
@@ -12,6 +12,7 @@
"LoginOrEmail": "Χρήστης ή Ηλεκτρονική διεύθυνση",
"LoginPasswordNotCorrect": "Το όνομα χρήστη και ο κωδικός δεν είναι σωστά",
"LostYourPassword": "Ξεχάσατε τον κωδικό σας;",
+ "MailPasswordChangeBody": "Γεια σας %1$s,\n\nΈχει ληφθεί αίτηση αρχικοποίησης του συνθηματικού από %2$s. Για να επιβεβαιώσετε την αλλαγή συνθηματικού ώστε να μπορείτε να κάνετε είσοδο με τα νέα σας στοιχεία, επισκεφθείτε τον παρακάτω σύνδεσμο:\n\n%3$s\n\nΠροσοχή: Η αλλαγή του συνθηματικού θα προκαλέσει την αλλαγή του token_auth. Μπορείτε να δείτε το νέο σας token_auth στη σελίδα ρυθμίσεων σας.\n\nΑν χρησιμοποιείτε το token_auth με API από εξωτερικές εφαρμογές ή για την αρχειοθέτηση, βεβαιωθείτε να το ενημερώσετε, διαφορετικά οι κλήσεις στο API θα αποτυγχάνουν.\n\nΣημείωση: Ο σύνδεσμος θα λήξει σε 24 ώρες.\n\nΕυχαριστούμε που χρησιμοποιείτε το Piwik!",
"MailTopicPasswordChange": "Επιβεβαίωση Αλλαγής Κωδικού",
"PasswordChanged": "Ο κωδικός σας έχει αλλάξει.",
"PasswordRepeat": "Κωδικός (επανάληψη)",
diff --git a/plugins/Login/lang/fr.json b/plugins/Login/lang/fr.json
index 8d08b149b6..ee65f9e94c 100644
--- a/plugins/Login/lang/fr.json
+++ b/plugins/Login/lang/fr.json
@@ -5,12 +5,14 @@
"ExceptionInvalidSuperUserAccessAuthenticationMethod": "Un utilisateur avec un accès super utilisateur ne peut être authentifié en utilisant le mécanisme '%s'.",
"ExceptionPasswordMD5HashExpected": "Le paramètre mot de passe doit être le hash MD5 du mot de passe.",
"InvalidNonceOrHeadersOrReferrer": "La sécurité du formulaire a échoué. Veuillez recharger le formulaire et vérifier que vos cookies sont activés. Si vous utilisez un serveur proxy, vous devez %1$s configurer Piwik pour accepter les en-têtes du proxy %2$s qui relaient les en-têtes de l'hôte. Vérifiez aussi que l'en-tête de votre référent est correctement transmis.",
+ "InvalidNonceSSLMisconfigured": "Aussi, vous devriez %1$s forcer Piwik à utiliser une connexion sécurisée%2$s : dans votre fichier de configuration %3$s définissez %4$s la section ci-dessous %5$s",
"InvalidOrExpiredToken": "La clef est invalide ou a expiré",
"InvalidUsernameEmail": "Nom d'utilisateur et\/ou courriel invalide.",
"LogIn": "Connexion",
"LoginOrEmail": "Nom d'utilisateur ou courriel",
"LoginPasswordNotCorrect": "Mot de passe et nom d'utilisateur incorrects.",
"LostYourPassword": "Mot de passe perdu ?",
+ "MailPasswordChangeBody": "Bonjour %1$s,\n\nUne demande de réinitialisation de mot de passe a été reçue depuis %2$s. Pour confirmer le changement de mot de passe afin de pouvoir vous authentifier avec vos nouveaux identifiants, cliquez sur le lien suivant :\n\n%3$s\n\nAttention: modifier le mot de passe va aussi changer votre token_auth. vous pourrez obtenir votre nouveau token_auth sur votre page de paramètres.\n\nSi vous utilisez votre token_auth d'API avec n'importe quelle application externe ou pour de l'archivage, assurez-vous de mettre à jour le token_auth ou bien les requêtes vers l'API vont échouer.\n\nNote : ce jeton expirera dans 24 heures.\n\nMerci d'utiliser Piwik !",
"MailTopicPasswordChange": "Confirmer le changement de mot de passe",
"PasswordChanged": "Votre mot de passe a été modifié",
"PasswordRepeat": "Mot de passe (répétez)",
diff --git a/plugins/Login/lang/it.json b/plugins/Login/lang/it.json
index 3750a45a89..06fa2018d4 100644
--- a/plugins/Login/lang/it.json
+++ b/plugins/Login/lang/it.json
@@ -4,7 +4,7 @@
"ContactAdmin": "Possibile ragione: il tuo host potrebbe non avere attive le funzionalità di e-mail.<br \/>Per favore, contatta l'amministratore del server.",
"ExceptionInvalidSuperUserAccessAuthenticationMethod": "Un utente con accesso Super User non può essere autenticato utilizzando il sistema '%s'.",
"ExceptionPasswordMD5HashExpected": "I parametri della password che ci si aspetta sono un hash MD5 della password.",
- "InvalidNonceOrHeadersOrReferrer": "Sicurezza modulo non riuscita. Si prega di ricaricare il modulo e verificare che i cookie siano abilitati. Se si utilizza un server proxy, è necessario %1$s configurare Piwik per accettare gli header del proxy %2$s che inoltri l'header host. Inoltre, verificare che l'intestazione Referer venga inviata correttamente.",
+ "InvalidNonceOrHeadersOrReferrer": "Controllo sicurezza modulo non riuscito. Si prega di ricaricare il modulo e verificare che i cookies siano abilitati. Se si utilizza un server proxy, è necessario %1$sconfigurare Piwik per accettare l'header del proxy %2$s che inoltri all'header host. In più, bisogna verificare che l'header Referer venga inviata correttamente.",
"InvalidNonceSSLMisconfigured": "Inoltre puoi %1$s forzare Piwik a utilizzare una connessione sicura%2$s: nel tuo file di configurazione %3$s imposta %4$s sotto la sezione %5$s",
"InvalidOrExpiredToken": "Token non valido o scaduto",
"InvalidUsernameEmail": "Nome utente e\/o indirizzo e-mail non validi",
@@ -12,6 +12,7 @@
"LoginOrEmail": "Nome utente o E-mail",
"LoginPasswordNotCorrect": "Combinazione Nome utente e Password non corretta",
"LostYourPassword": "Hai perso la password?",
+ "MailPasswordChangeBody": "Salve %1$s,\n\nÈ stata ricevuta una richiesta di cambio password da parte di %2$s. Per confermare questo cambio password puoi accedere con le tue nuove credenziali, seguendo questo link:\n\n%3$s\n\nAttenzione: Il cambio di password cambierà anche il tuo token_auth. Puoi vedere il nuovo token_auth nella tua pagina delle impostazioni.\n\nSe stai utilizzando il tuo token_auth API in applicazioni esterne o per archiviazione, assicurati di aggiornarlo, altrimenti le richieste API falliranno.\n\nNota: questo link scadrà tra 24 ore.\n\nE grazie per utilizzare Piwik!",
"MailTopicPasswordChange": "Conferma Cambio Password",
"PasswordChanged": "La tua password è stata cambiata.",
"PasswordRepeat": "Password (ripeti)",
diff --git a/plugins/Login/lang/nl.json b/plugins/Login/lang/nl.json
index 264f248a49..d3b63d94fc 100644
--- a/plugins/Login/lang/nl.json
+++ b/plugins/Login/lang/nl.json
@@ -11,6 +11,7 @@
"LoginOrEmail": "Login of E-mail",
"LoginPasswordNotCorrect": "Gebruikersnaam & Wachtwoord niet correct",
"LostYourPassword": "Wachtwoord vergeten?",
+ "MailPasswordChangeBody": "Hi %1$s,\n\nWe hebben een verzoek ontvangen om het wachtwoord te wijzigen van %2$s. Bezoek de volgende link om dit te bevestigen: \n\n%3$s\n\nBelangrijk: Het veranderen van het wachtwoord veranderd ook je token_auth. Je kunt je nieuwe token_auth bekijken op je instellingen pagina.\n\nAls je een API token_auth gebruikt bij externe applicaties of voor het archieven, vergeet dan niet om de token_auth te updaten want anders zullen API aanvragen mislukken. \n\nLet op: de link verloopt over 24 uur.\n\nEn dank je wel voor het gebruiken van Piwik!",
"MailTopicPasswordChange": "Bevestig wachtwoord wijziging",
"PasswordChanged": "Je wachtwoord is veranderd.",
"PasswordRepeat": "Wachtwoord (herhaal)",
diff --git a/plugins/Login/lang/pt-br.json b/plugins/Login/lang/pt-br.json
index ef5dd5611f..030e427f24 100644
--- a/plugins/Login/lang/pt-br.json
+++ b/plugins/Login/lang/pt-br.json
@@ -12,6 +12,7 @@
"LoginOrEmail": "Nome de Usuário ou E-mail",
"LoginPasswordNotCorrect": "Combinação errada de Nome de Usuário e senha.",
"LostYourPassword": "Esqueceu a sua senha?",
+ "MailPasswordChangeBody": "Olá %1$s,\n\nUm pedido de redefinição de senha foi recebido de %2$s. Para confirmar esta alteração de senha a fim de que você possa fazer o login com as suas novas credenciais, visite o seguinte link:\n\n%3$s\n\nAtenção: Modificar sua senha também modificará seu token_auth. Você pode procurar o seu novo token_auth na sua página de configurações.\n\nSe você estiver utilizando um API token_auth em qualquer aplicação externa ou para arquivamento, certifique-se de atualizar o token_auth como requisitado pelo API ou falhará de outra forma.\n\nObs.: este link irá expirar em 24 horas.\n\nE agradeço por usar Piwik!",
"MailTopicPasswordChange": "Confirme Alteração de Senha",
"PasswordChanged": "Sua senha foi alterada.",
"PasswordRepeat": "Senha (repetir)",
diff --git a/plugins/Login/lang/ru.json b/plugins/Login/lang/ru.json
index 26b580344c..5429e3e738 100644
--- a/plugins/Login/lang/ru.json
+++ b/plugins/Login/lang/ru.json
@@ -5,12 +5,14 @@
"ExceptionInvalidSuperUserAccessAuthenticationMethod": "Пользователь с правами суперпользователя не может пройти проверку подлинности с помощью данного механизма: '%s'.",
"ExceptionPasswordMD5HashExpected": "Параметр пароля вероятно является MD5-хэшем пароля.",
"InvalidNonceOrHeadersOrReferrer": "Ошибка при загрузки формы безопасности. Пожалуйста, обновите форму и проверьте, что ваши cookies включены. Если вы используете прокси-сервер, вы должны %1$s настроить принятие прокси-заголовков в Piwik%2$s, которые следуют за названием хоста. Также убедитесь, что заголовки источника трафика отправляются верно.",
+ "InvalidNonceSSLMisconfigured": "Также, вы можете %1$s принудить Piwik использовать безопасное соединение%2$s: в вашем файле конфигурации %3$s установите %4$s под разделом %5$s",
"InvalidOrExpiredToken": "Код неправильный или просрочен.",
"InvalidUsernameEmail": "Неверное имя пользователя и\/или e-mail",
"LogIn": "Войти",
"LoginOrEmail": "Имя пользователя или E-mail",
"LoginPasswordNotCorrect": "Логин или пароль неверны",
"LostYourPassword": "Потеряли пароль?",
+ "MailPasswordChangeBody": "Привет %1$s,\n\n%2$s был получен запрос на сброс пароля. Чтобы подтвердить изменение пароля и чтобы было можно войти со своими новыми настройками, пройдите по следующей ссылке:\n\n%3$s\n\nВнимание: Изменение пароля также изменит ваш token_auth. Вы можете найти свой новый token_auth на своеon your settings page.\n\nЕсли вы используете свой API token_auth в каком-либо приложении для архивации, убедитесь, что вы обновили token_auth, так как в ином случае запросы к API потерпят неудачу.\n\nВнимание: эта ссылка станет недействительной через 24 часа.\n\nИ спасибо за то, что вы используете Piwik!",
"MailTopicPasswordChange": "Подтвердите смену пароля",
"PasswordChanged": "Ваш пароль был изменен.",
"PasswordRepeat": "Пароль еще раз",
diff --git a/plugins/Login/lang/sq.json b/plugins/Login/lang/sq.json
index 04d268333c..e69d2a1491 100644
--- a/plugins/Login/lang/sq.json
+++ b/plugins/Login/lang/sq.json
@@ -1,16 +1,24 @@
{
"Login": {
+ "ConfirmationLinkSent": "Te email-i juaj u dërgua një lidhje ripohimi. Kontrolloni email-in tuaj dhe vizitoni atë lidhje që të autorizoni kërkesën tuaj për ndryshim të fjalëkalimit.",
"ContactAdmin": "Arsye e mundshme: streha juaj mund të ketë çaktivizuar funksionin mail(). <br \/>Ju lutem, lidhuni me përgjegjësin e Piwik-ut tuaj.",
+ "ExceptionInvalidSuperUserAccessAuthenticationMethod": "Një përdorues me të drejta Superpërdoruesi nuk mund të bëjë mirëfilltësimin e vetes duke përdorur mekanizmin '%s'.",
"ExceptionPasswordMD5HashExpected": "Parametri i fjalëkalimit pritet të jetë një hash MD5 fjalëkalimi.",
"InvalidNonceOrHeadersOrReferrer": "Siguria e formularit dështoi. Ju lutem, ringarkoni formularin dhe kontrolloni nëse janë të aktivizuara \"cookie\"-et tuaja. Nëse përdorni një shërbyes ndërmjetës, duhet ta formësoni %1$s Piwik-un që të pranojë titull ndërmjetësi%2$s i cili përcjell titull Strehe. Kontrolloni gjithashtu që titulli i Referuesit dërgohet saktë.",
+ "InvalidNonceSSLMisconfigured": "Po ashtu, mund %1$sta detyroni Piwik-un të përdorë një lidhje të sigurt%2$s: te kartela juaj %3$s rregulloni %4$s nën ndarjen %5$s",
"InvalidOrExpiredToken": "Elementi është i pavlefshëm ose ka skaduar",
"InvalidUsernameEmail": "Emër përdoruesi dhe\/ose vendndodhje e-mail e pavlefshme",
"LogIn": "Hyni",
"LoginOrEmail": "Emër hyrjeje ose E-mail",
"LoginPasswordNotCorrect": "Emër përdoruesi & Fjalëkalim jo të saktë",
"LostYourPassword": "Humbët fjalëkalimin tuaj?",
+ "MailPasswordChangeBody": "Njatjeta %1$s,\n\nPrej %2$s ka ardhur një kërkesë për ricaktim fjalëkalimi. Për ripohim të këtij ndryshimi fjalëkalimi, që të mund hyni me kredenciale të reja, vizitoni lidhjen vijuese:\n\n%3$s\n\nKujdes: Ndryshimi i fjalëkalimit do të sjellë edhe ndryshimin e token_auth tuaj. token_auth tuaj të ri mund ta shihni te faqja e rregullimeve tuaja.\n\nNëse token_auth tuaj për API e përdorni në ndonjë aplikacion të jashtëm ose për arkivim, sigurohuni që ta përditësoni token_auth atje, përndryshe kërkesat te API do të dështojnë.\n\nShënim: kjo lidhje do të skadojë pas 24 orësh.\n\nDhe faleminderit që përdorni Piwik-un!",
+ "MailTopicPasswordChange": "Ripohoni Ndryshimin e Fjalëkalimit",
+ "PasswordChanged": "Fjalëkalimi juaj u ndryshua.",
"PasswordRepeat": "Fjalëkalim (sërish)",
"PasswordsDoNotMatch": "Fjalëkalimet nuk përputhen.",
- "RememberMe": "Mbamë Mend"
+ "PluginDescription": "Ofron mirëfilltësim përmes emri përdoruesi dhe fjalëkalimi, si dhe funksionin e ricaktimit të fjalëkalimeve. Metoda e mirëfilltësimit mund të ndryshohet duke përdorur një tjetër shtojcë Hyrjesh, të tillë si LoginLdap, të cilën e gjeni te Marketplace-i.",
+ "RememberMe": "Mbamë Mend",
+ "ResetPasswordInstructions": "Jepni një fjalëkalim të ri për llogarinë tuaj."
}
} \ No newline at end of file
diff --git a/plugins/Login/lang/sv.json b/plugins/Login/lang/sv.json
index 6aea11e06c..ffcece6418 100644
--- a/plugins/Login/lang/sv.json
+++ b/plugins/Login/lang/sv.json
@@ -5,12 +5,14 @@
"ExceptionInvalidSuperUserAccessAuthenticationMethod": "En användare med Superanvändaråtkomst kan inte bli autensieras vid användande av '%s' mekanism.",
"ExceptionPasswordMD5HashExpected": "Lösenordsparametern förväntas bli en MD5-hash av lösenordet.",
"InvalidNonceOrHeadersOrReferrer": "Formulärets säkerhet misslyckades. Vänligen ladda formuläret och kontrollera att cookies är aktiverade. Om du använder en proxyserver måste du %1$s konfigurera Piwik att acceptera proxy huvuden %2$s som överför Host-huvuden. Kontrollera också att din Referer header skickas korrekt.",
+ "InvalidNonceSSLMisconfigured": "Du kan även %1$s kräva att Piwik använder en säker anslutning%2$s: för att göra detta konfigurerar du din konfigurationsfil %3$s med %4$s nedan sektioner%5$s",
"InvalidOrExpiredToken": "Lösenordsbevis är felaktigt eller har utgått.",
"InvalidUsernameEmail": "Felaktigt användarnamn och\/eller e-postadress",
"LogIn": "Logga in",
"LoginOrEmail": "Användarnamn eller e-postadress",
"LoginPasswordNotCorrect": "Användarnamn & Lösenord är inte korrekta",
"LostYourPassword": "Glömt ditt lösenord?",
+ "MailPasswordChangeBody": "Hej %1$s,\n\nEn begäran om återställning av ditt lösenord togs emot från %2$s. För att bekräfta ändringen av lösenordet, vänligen gå till följande länk:\n\n%3$s\n\nNotering: Genom att ändra ditt lösenord så ändras även token_auth. Du kan ta reda på ditt nya token_auth på sidan för inställningar.\n\nOm du använder din API token_auth i några externa applikationer eller för arkivering kontrollera så att du har uppdaterat din token_auth annars är risken att anrop till API't misslyckas.\n\nNotering: denna länk kommer att sluta fungera efter 24 timmar.\n\nTack för att du använder dig av Piwik!",
"MailTopicPasswordChange": "Bekräfta byte av lösenord",
"PasswordChanged": "Ditt lösenord har ändrats.",
"PasswordRepeat": "Lösenord (bekräfta)",
diff --git a/plugins/Login/lang/uk.json b/plugins/Login/lang/uk.json
index 525720893d..90426fe99f 100644
--- a/plugins/Login/lang/uk.json
+++ b/plugins/Login/lang/uk.json
@@ -1,15 +1,24 @@
{
"Login": {
- "ContactAdmin": "Можлива причина: функція mail() відключена в налаштуваннях вашого хостингу.<br\/>Зверніться, будь ласка, до вашого Piwik-адміністратора.",
- "ExceptionPasswordMD5HashExpected": "Очікується що параметр паролю буде MD5() хеш від введеного паролю.",
- "InvalidOrExpiredToken": "Код невірний або прострочений.",
- "InvalidUsernameEmail": "Невірне ім'я користувача та\/або E-mail",
+ "ConfirmationLinkSent": "Посилання з підтвердженням було відправлено ​​на ваш e-mail. Перевірте свій e-mail і перейдіть по відправленої вам посиланням.",
+ "ContactAdmin": "Можлива причина: функція mail() відключена. <br \/>Будь ласка, зв'яжіться з адміністратором.",
+ "ExceptionInvalidSuperUserAccessAuthenticationMethod": "Користувач з правами суперкористувача не може пройти перевірку автентичності за допомогою даного механізму: '%s'.",
+ "ExceptionPasswordMD5HashExpected": "Параметр пароля ймовірно є MD5-хешем пароля.",
+ "InvalidNonceOrHeadersOrReferrer": "Помилка при завантаження форми безпеки. Будь ласка, поновіть форму і перевірте, що ваші cookies включені. Якщо ви використовуєте проксі-сервер, ви повинні %1$s налаштувати прийняття проксі-заголовків в Piwik%2$s, які слідують за назвою хосту. Також переконайтеся, що заголовки джерела трафіку відправляються вірно.",
+ "InvalidNonceSSLMisconfigured": "Також, ви можете %1$s примусово увійти в Piwik використовуючи захищене з'єднання%2$s: у файлі конфігурації %3$s встановіть %4$s нижче розділу %5$s",
+ "InvalidOrExpiredToken": "Код неправильний або прострочений.",
+ "InvalidUsernameEmail": "Неправильне ім'я користувача і\/або e-mail",
"LogIn": "Увійти",
"LoginOrEmail": "Ім'я користувача або E-mail",
- "LoginPasswordNotCorrect": "Ім'я користувача та пароль невірні",
- "LostYourPassword": "Забули свій пароль?",
- "PasswordRepeat": "Пароль (повтор)",
- "PasswordsDoNotMatch": "Паролі не співпадають",
- "RememberMe": "Пам’ятати мене"
+ "LoginPasswordNotCorrect": "Логін або пароль невірні",
+ "LostYourPassword": "Втратили пароль?",
+ "MailPasswordChangeBody": "Привіт %1$s,\n\nA Запит на скидання пароля був отриманий від %2$s. Щоб підтвердити цю зміна пароля, так щоб ви могли увійти в систему з новими обліковими даними, перейдіть за наступним посиланням:\n\n%3$s\n\nУвага: Зміна пароля також змінить ваш token_auth. Ви можете подивитися Ваш новий token_auth на сторінці налаштувань.\n\nЯкщо ви використовуєте Ваш API token_auth у будь-яких зовнішніх програмах чи для архівування, обов'язково оновіть token_auth для запитів до API, тому що він зміниться.\n\nПримітка: це посилання діє протягом 24 годин.\n\nІ спасибі за використання Piwik!",
+ "MailTopicPasswordChange": "Підтвердіть зміну пароля",
+ "PasswordChanged": "Ваш пароль був змінений.",
+ "PasswordRepeat": "Пароль ще раз",
+ "PasswordsDoNotMatch": "Паролі не співпадають.",
+ "PluginDescription": "Надає авторизацію через ім'я користувача і пароль, а також функцію скидання паролю. Спосіб авторизації може бути змінений якщо використовувати інший Login плагін, такий як LoginLdap, доступний через Маркет.",
+ "RememberMe": "Запам'ятати мене",
+ "ResetPasswordInstructions": "Введіть новий пароль для вашого облікового запису."
}
} \ No newline at end of file
diff --git a/plugins/LoginHttpAuth b/plugins/LoginHttpAuth
-Subproject 08d0c34ab8038486038a3312ac6007278b2a1c2
+Subproject 06e16190bee3121a9b707d00e055f57e22da3f8
diff --git a/plugins/MobileAppMeasurable/lang/ru.json b/plugins/MobileAppMeasurable/lang/ru.json
new file mode 100644
index 0000000000..30652510a8
--- /dev/null
+++ b/plugins/MobileAppMeasurable/lang/ru.json
@@ -0,0 +1,5 @@
+{
+ "MobileAppMeasurable": {
+ "MobileApp": "Мобильное приложение"
+ }
+} \ No newline at end of file
diff --git a/plugins/MobileAppMeasurable/lang/sq.json b/plugins/MobileAppMeasurable/lang/sq.json
index d1bc97551c..4ee1569244 100644
--- a/plugins/MobileAppMeasurable/lang/sq.json
+++ b/plugins/MobileAppMeasurable/lang/sq.json
@@ -1,6 +1,7 @@
{
"MobileAppMeasurable": {
"MobileApp": "Aplikacion Celulari",
- "MobileApps": "Aplikacione Celulari"
+ "MobileApps": "Aplikacione Celulari",
+ "MobileAppDescription": "Një aplikacion celulari, i shkruar në gjuhën origjinale të vetë sistemit, për iOS, Android ose çfarëdo sistemi tjetër operativ për celular."
}
} \ No newline at end of file
diff --git a/plugins/MobileAppMeasurable/lang/uk.json b/plugins/MobileAppMeasurable/lang/uk.json
new file mode 100644
index 0000000000..818e6ddda5
--- /dev/null
+++ b/plugins/MobileAppMeasurable/lang/uk.json
@@ -0,0 +1,7 @@
+{
+ "MobileAppMeasurable": {
+ "MobileApp": "Мобільний Додаток",
+ "MobileApps": "Мобільні Додатки",
+ "MobileAppDescription": "Власний мобільний додаток для IOS, Android або будь-який іншої мобільної операційної системи."
+ }
+} \ No newline at end of file
diff --git a/plugins/Morpheus/templates/admin.twig b/plugins/Morpheus/templates/admin.twig
index 73a898a732..4fc89289e8 100644
--- a/plugins/Morpheus/templates/admin.twig
+++ b/plugins/Morpheus/templates/admin.twig
@@ -24,7 +24,7 @@
</div>
{% import 'ajaxMacros.twig' as ajax %}
- {{ ajax.requestErrorDiv(emailSuperUser|default(''), arePiwikProAdsEnabled) }}
+ {{ ajax.requestErrorDiv(emailSuperUser|default(''), areAdsForProfessionalServicesEnabled, currentModule) }}
{{ postEvent("Template.beforeContent", "admin", currentModule) }}
<div class="page">
diff --git a/plugins/Morpheus/templates/ajaxMacros.twig b/plugins/Morpheus/templates/ajaxMacros.twig
index 267ff8e83d..2a4584c425 100644
--- a/plugins/Morpheus/templates/ajaxMacros.twig
+++ b/plugins/Morpheus/templates/ajaxMacros.twig
@@ -13,7 +13,7 @@
</div>
{% endmacro %}
-{% macro requestErrorDiv(emailSuperUser, arePiwikProAdsEnabled = false) %}
+{% macro requestErrorDiv(emailSuperUser, areAdsForProfessionalServicesEnabled = false, currentModule = '') %}
<div id="loadingError">
<div class="alert alert-danger">
@@ -29,9 +29,10 @@
<a rel="noreferrer" target="_blank" href="https://piwik.org/faq/troubleshooting/faq_19489/">{{ 'General_Faq'|translate }}</a> –
<a rel="noreferrer" target="_blank" href="http://forum.piwik.org/">{{ 'Feedback_CommunityHelp'|translate }}</a>
- {%- if arePiwikProAdsEnabled %}
+ {%- if areAdsForProfessionalServicesEnabled %}
- <a rel="noreferrer" target="_blank" href="{{ 'https://piwik.pro/'|piwikProCampaignParameters('Help', 'AjaxError')|e('html_attr') }}">{{ 'Feedback_ProfessionalHelp'|translate }}</a>
+ {% set supportUrl = 'https://piwik.org/support/?pk_campaign=Help&pk_medium=AjaxError&pk_content=' ~ currentModule ~ '&pk_source=Piwik_App' %}
+ <a rel="noreferrer" target="_blank" href="{{ supportUrl|e('html_attr') }}">{{ 'Feedback_ProfessionalHelp'|translate }}</a>
{%- endif %}.
</div>
</div>
diff --git a/plugins/Morpheus/templates/javascriptCode.tpl b/plugins/Morpheus/templates/javascriptCode.tpl
index 125259b807..18483dd09d 100644
--- a/plugins/Morpheus/templates/javascriptCode.tpl
+++ b/plugins/Morpheus/templates/javascriptCode.tpl
@@ -6,7 +6,7 @@
(function() {
{$setTrackerUrl}
{$optionsBeforeTrackerUrl}_paq.push(['setTrackerUrl', u+'piwik.php']);
- _paq.push(['setSiteId', {$idSite}]);
+ _paq.push(['setSiteId', '{$idSite}']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
diff --git a/plugins/Morpheus/templates/layout.twig b/plugins/Morpheus/templates/layout.twig
index 83b96d545e..bca60d1e95 100644
--- a/plugins/Morpheus/templates/layout.twig
+++ b/plugins/Morpheus/templates/layout.twig
@@ -23,7 +23,9 @@
{% include "@CoreHome/_favicon.twig" %}
{% include "_jsGlobalVariables.twig" %}
{% include "_jsCssIncludes.twig" %}
+
{%- if not isCustomLogo %}<link rel="manifest" href="plugins/CoreHome/javascripts/manifest.json">{% endif %}
+
{% endblock %}
</head>
<body id="{{ bodyId|default('') }}" ng-app="app" class="{{ bodyClass|default('') }}">
diff --git a/plugins/MultiSites/angularjs/dashboard/dashboard.controller.js b/plugins/MultiSites/angularjs/dashboard/dashboard.controller.js
index 35cf26a5de..41fcb81d9f 100644
--- a/plugins/MultiSites/angularjs/dashboard/dashboard.controller.js
+++ b/plugins/MultiSites/angularjs/dashboard/dashboard.controller.js
@@ -19,7 +19,7 @@
$scope.idSite = piwik.broadcast.getValueFromUrl('idSite');
$scope.url = piwik.piwik_url;
$scope.period = piwik.period;
- $scope.arePiwikProAdsEnabled = piwik.config && piwik.config.are_ads_enabled;
+ $scope.areAdsForProfessionalServicesEnabled = piwik.config && piwik.config.are_ads_enabled;
this.refresh = function (interval) {
multisitesDashboardModel.refreshInterval = interval;
diff --git a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.html b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.html
index 46bba85aad..a0354621b8 100644
--- a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.html
+++ b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.html
@@ -66,8 +66,8 @@
<a rel="noreferrer" target="_blank" href="https://piwik.org/faq/troubleshooting/faq_19489/">{{ 'General_Faq'|translate }}</a>
<a rel="noreferrer" target="_blank" href="http://forum.piwik.org/">{{ 'Feedback_CommunityHelp'|translate }}</a>
- <span ng-show="arePiwikProAdsEnabled"> – </span>
- <a ng-show="arePiwikProAdsEnabled" rel="noreferrer" target="_blank" href="https://piwik.pro/?pk_campaign=Help&pk_medium=AjaxError&pk_content=MultiSites&pk_source=Piwik_App">{{ 'Feedback_ProfessionalHelp'|translate }}</a>.
+ <span ng-show="areAdsForProfessionalServicesEnabled"> – </span>
+ <a ng-show="areAdsForProfessionalServicesEnabled" rel="noreferrer" target="_blank" href="https://piwik.org/support/?pk_campaign=Help&pk_medium=AjaxError&pk_content=MultiSites&pk_source=Piwik_App">{{ 'Feedback_ProfessionalHelp'|translate }}</a>.
</div>
</td>
</tr>
diff --git a/plugins/MultiSites/lang/tr.json b/plugins/MultiSites/lang/tr.json
new file mode 100644
index 0000000000..a91f1ebf19
--- /dev/null
+++ b/plugins/MultiSites/lang/tr.json
@@ -0,0 +1,9 @@
+{
+ "MultiSites": {
+ "Evolution": "Gelişme",
+ "LoadingWebsites": "Web siteleri yükleniyor",
+ "PluginDescription": "Tüm web sitesi ve uygulamalarınızı kullanışlı 'Tüm Web Siteleri' panosu ile görüp karşılaştırabilirsiniz.",
+ "TopLinkTooltip": "Tüm web sitelerinizin istatistiklerini karşılaştırın.",
+ "Pagination": "%1$s - %2$s of %3$s"
+ }
+} \ No newline at end of file
diff --git a/plugins/MultiSites/lang/uk.json b/plugins/MultiSites/lang/uk.json
index b6f687fd7c..e034de8c70 100644
--- a/plugins/MultiSites/lang/uk.json
+++ b/plugins/MultiSites/lang/uk.json
@@ -1,5 +1,9 @@
{
"MultiSites": {
- "Evolution": "Зміна"
+ "Evolution": "Еволюція",
+ "LoadingWebsites": "Завантаження сайтів",
+ "PluginDescription": "Подивитися і порівняти всі ваші веб-сайти і додатки в цій корисній 'Усі сайти' панелі приладів.",
+ "TopLinkTooltip": "Порівняйте веб-аналітику для всіх ваших сайтів.",
+ "Pagination": "%1$s - %2$s з %3$s"
}
} \ No newline at end of file
diff --git a/plugins/MultiSites/plugin.json b/plugins/MultiSites/plugin.json
deleted file mode 100644
index 1bf22b2dbd..0000000000
--- a/plugins/MultiSites/plugin.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "authors": [
- {
- "name": "Piwik PRO",
- "homepage": "http://piwik.pro"
- }
- ]
-} \ No newline at end of file
diff --git a/plugins/MultiSites/tests/Integration/MultiSitesTest.php b/plugins/MultiSites/tests/Integration/MultiSitesTest.php
index 8b6d7924a7..b027bef0b7 100644
--- a/plugins/MultiSites/tests/Integration/MultiSitesTest.php
+++ b/plugins/MultiSites/tests/Integration/MultiSitesTest.php
@@ -9,6 +9,7 @@
namespace Piwik\Plugins\MultiSites\tests\Integration;
use Piwik\Access;
+use Piwik\FrontController;
use Piwik\Plugins\MultiSites\API as APIMultiSites;
use Piwik\Plugins\SitesManager\API as APISitesManager;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
@@ -49,4 +50,28 @@ class MultiSitesTest extends IntegrationTestCase
// safety net
$this->assertEquals(0, $dataTable->getFirstRow()->getColumn('nb_visits'));
}
+
+ /**
+ * Testing that getOne does not error out when format=rss, #10407
+ *
+ * @group Plugins
+ */
+ public function testWhenRssFormatGetOneDoesNotError()
+ {
+ $_GET = array(
+ 'method' => 'MultiSites.getOne',
+ 'idSite' => $this->idSiteAccess,
+ 'period' => 'month',
+ 'date' => 'last10',
+ 'format' => 'rss'
+ );
+
+ $output = FrontController::getInstance()->fetchDispatch('API');
+
+ $this->assertContains('<item>', $output);
+ $this->assertContains('</rss>', $output);
+ $this->assertNotContains('error', $output);
+
+ $_GET = array();
+ }
}
diff --git a/plugins/Overlay/client/urlnormalizer.js b/plugins/Overlay/client/urlnormalizer.js
index 7dd6a8f274..4b5e403c2f 100644
--- a/plugins/Overlay/client/urlnormalizer.js
+++ b/plugins/Overlay/client/urlnormalizer.js
@@ -66,7 +66,7 @@ var Piwik_Overlay_UrlNormalizer = (function () {
return {
initialize: function () {
- this.setCurrentDomain(document.location.hostname);
+ this.setCurrentDomain(document.location.host);
this.setCurrentUrl(window.location.href);
var head = document.getElementsByTagName('head');
@@ -197,4 +197,4 @@ var Piwik_Overlay_UrlNormalizer = (function () {
};
-})(); \ No newline at end of file
+})();
diff --git a/plugins/Overlay/lang/de.json b/plugins/Overlay/lang/de.json
index 12391dc874..73e0124596 100644
--- a/plugins/Overlay/lang/de.json
+++ b/plugins/Overlay/lang/de.json
@@ -1,7 +1,7 @@
{
"Overlay": {
"Clicks": "%s Klicks",
- "ClicksFromXLinks": "%1$s klicks von einem von %2$s Verweisen",
+ "ClicksFromXLinks": "%1$s Klicks von einem von %2$s Verweisen",
"Domain": "Domain",
"ErrorNotLoading": "Die Seiten Overlay Sitzung kann gerade nicht aufgerufen werden.",
"ErrorNotLoadingDetails": "Möglicherweise hat die rechte Seite keinen Piwik Tracking Code. In diesem Fall bitte versuchen das Overlay für eine andere Seite aus dem Seitenbericht zu benutzen.",
diff --git a/plugins/Overlay/lang/it.json b/plugins/Overlay/lang/it.json
index f220c226da..cf2d12b949 100644
--- a/plugins/Overlay/lang/it.json
+++ b/plugins/Overlay/lang/it.json
@@ -15,7 +15,7 @@
"Overlay": "Overlay di Pagina",
"PluginDescription": "Vedi i tuoi dati statistici in sovrapposizione al tuo sito web. Guarda quante volte i tuoi utenti hanno cliccato su ciascun link. Nota: Richiede che sia abilitato il plugin Transitions.",
"RedirectUrlError": "Si sta tentando di aprire la Pagina Overlay per l'URL \"%1$s\". %2$s Nessuno dei domini dalle impostazioni di Piwik corrisponde al link.",
- "RedirectUrlErrorAdmin": "È possibile aggiungere il dominio come un ulteriore URL %1$snelle impostazioni%2$s.",
+ "RedirectUrlErrorAdmin": "È possibile aggiungere il dominio come un ulteriore URL nelle %1$simpostazioni%2$s.",
"RedirectUrlErrorUser": "Chiedi all'amministratore di aggiungere il dominio come un URL aggiuntivo."
}
} \ No newline at end of file
diff --git a/plugins/Overlay/lang/sv.json b/plugins/Overlay/lang/sv.json
index 29de918027..aaa7afe228 100644
--- a/plugins/Overlay/lang/sv.json
+++ b/plugins/Overlay/lang/sv.json
@@ -13,6 +13,7 @@
"OneClick": "1 klick",
"OpenFullScreen": "Gå till helskärmsläge (ingen sidolist)",
"Overlay": "Sidöverlägg",
+ "PluginDescription": "Se din statistikdata som ett Overlay på din faktiska webbplats. Kolla hur många gånger dina användare har klickat på respektive länk. Notering: Kräver att du har aktiverat Översättningstillägget.",
"RedirectUrlError": "Du försöker öppna ett överliggande lager för URL \"%1$s\". %2$s Ingen av domänerna från Piwik's inställningar matchar länken.",
"RedirectUrlErrorAdmin": "Du kan lägga till domänen som en extra URL %1$si inställningarna%2$s.",
"RedirectUrlErrorUser": "Be administratören att lägga till domänen som en extra webbadress"
diff --git a/plugins/Overlay/lang/uk.json b/plugins/Overlay/lang/uk.json
index c3a4786c00..61e9e993e1 100644
--- a/plugins/Overlay/lang/uk.json
+++ b/plugins/Overlay/lang/uk.json
@@ -1,5 +1,21 @@
{
"Overlay": {
- "Location": "Місцезнаходження"
+ "Clicks": "%s кліків",
+ "ClicksFromXLinks": "%1$s кліків від одного з %2$s джерел",
+ "Domain": "Домен",
+ "ErrorNotLoading": "Сторінка накладення сесії не може бути запущена.",
+ "ErrorNotLoadingDetails": "Можливо, сторінка що завантажується праворуч немає трекер коду Piwik. У цьому випадку, спробуйте запустити накладення на різні сторінки.",
+ "ErrorNotLoadingDetailsSSL": "Так як ви використовуєте Piwik по протоколу https, найбільш вірогідною причиною є те, що ваш сайт не підтримує протокол SSL. Спробуйте використовувати Piwik через http.",
+ "ErrorNotLoadingLink": "Отримати додаткові поради щодо усунення неполадок",
+ "Link": "Посилання",
+ "Location": "Місцезнаходження",
+ "NoData": "Немає даних по цій сторінці за обраний період.",
+ "OneClick": "1 клік",
+ "OpenFullScreen": "Перейти до повного екрану",
+ "Overlay": "Глибина проникнення",
+ "PluginDescription": "Переглядайте дані аналітики у вигляді накладення на ваш сайт. Подивіться, скільки разів користувачі натиснули на кожне посилання. Примітка: Потрібна активація плагіну Transitions.",
+ "RedirectUrlError": "Ви намагаєтеся відкрити накладення для URL \"%1$s\". %2$s Жоден з доменів в налаштуваннях Piwik не відповідає посиланню.",
+ "RedirectUrlErrorAdmin": "Можете додати домен як додатковий URL %1$sв налаштуваннях%2$s.",
+ "RedirectUrlErrorUser": "Попросіть адміністратора додати домен як додатковий URL."
}
} \ No newline at end of file
diff --git a/plugins/Overlay/templates/renderSidebar.twig b/plugins/Overlay/templates/renderSidebar.twig
index 36ff9c8ba1..0b8c0fbf80 100644
--- a/plugins/Overlay/templates/renderSidebar.twig
+++ b/plugins/Overlay/templates/renderSidebar.twig
@@ -1,4 +1,4 @@
-<div> <!-- Wrapper is needed that the html can be jqueryfied -->
+<div> <!-- Wrapper is needed that the html can be jQueryfied -->
<!-- This div is removed by JS and the content is put in the location div -->
<div class="overlayLocation">
diff --git a/plugins/PiwikPro/PiwikPro.php b/plugins/PiwikPro/PiwikPro.php
deleted file mode 100644
index 590b2a94b5..0000000000
--- a/plugins/PiwikPro/PiwikPro.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-namespace Piwik\Plugins\PiwikPro;
-
-class PiwikPro extends \Piwik\Plugin
-{
- /**
- * @see Piwik\Plugin::registerEvents
- */
- public function registerEvents()
- {
- return array(
- 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
- );
- }
-
- public function getStylesheetFiles(&$stylesheets)
- {
- $stylesheets[] = 'plugins/PiwikPro/stylesheets/widget.less';
- }
-}
diff --git a/plugins/PiwikPro/config/test.php b/plugins/PiwikPro/config/test.php
deleted file mode 100644
index 327acd5205..0000000000
--- a/plugins/PiwikPro/config/test.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-use Piwik\Tests\Framework\Mock\PiwikPro\Advertising;
-use Piwik\Plugins\PiwikPro\tests\Framework\Mock\Promo;
-
-return array(
- 'Piwik\PiwikPro\Advertising' => function () {
- return new Advertising();
- },
- 'Piwik\Plugins\PiwikPro\Promo' => function () {
- return new Promo();
- }
-);
diff --git a/plugins/PiwikPro/lang/en.json b/plugins/PiwikPro/lang/en.json
deleted file mode 100644
index 34e405f8f0..0000000000
--- a/plugins/PiwikPro/lang/en.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "PiwikPro": {
- "WidgetBlogTitle": "Piwik PRO Blog",
- "WidgetPiwikProAd": "Piwik PRO: Advanced Analytics & Services"
- }
-} \ No newline at end of file
diff --git a/plugins/PiwikPro/plugin.json b/plugins/PiwikPro/plugin.json
deleted file mode 100644
index 089dd4abf2..0000000000
--- a/plugins/PiwikPro/plugin.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "name": "PiwikPro",
- "description": "Provides widgets to follow Piwik PRO blog and to see info about Piwik PRO services and products.",
- "theme": false
-} \ No newline at end of file
diff --git a/plugins/PrivacyManager/DoNotTrackHeaderChecker.php b/plugins/PrivacyManager/DoNotTrackHeaderChecker.php
index 7bdf09a30b..0eecf97434 100644
--- a/plugins/PrivacyManager/DoNotTrackHeaderChecker.php
+++ b/plugins/PrivacyManager/DoNotTrackHeaderChecker.php
@@ -50,7 +50,7 @@ class DoNotTrackHeaderChecker
// this is an optional supplement to the site's tracking status resource at:
// /.well-known/dnt
// per Tracking Preference Expression (draft)
- header('Tk: 1');
+ Common::sendHeader('Tk: 1');
}
}
diff --git a/plugins/PrivacyManager/LogDataPurger.php b/plugins/PrivacyManager/LogDataPurger.php
index 9f21d001d1..3026e7416b 100755
--- a/plugins/PrivacyManager/LogDataPurger.php
+++ b/plugins/PrivacyManager/LogDataPurger.php
@@ -9,6 +9,7 @@
namespace Piwik\Plugins\PrivacyManager;
use Piwik\Common;
+use Piwik\Container\StaticContainer;
use Piwik\DataAccess\RawLogDao;
use Piwik\Date;
use Piwik\Db;
@@ -100,7 +101,7 @@ class LogDataPurger
// deal w/ log tables that will be purged
$maxIdVisit = $this->getDeleteIdVisitOffset($deleteLogsOlderThan);
if (!empty($maxIdVisit)) {
- foreach ($this->getDeleteTableLogTables() as $table) {
+ foreach (self::getDeleteTableLogTables() as $table) {
// getting an estimate for log_action is not supported since it can take too long
if ($table != Common::prefixTable('log_action')) {
$rowCount = $this->getLogTableDeleteCount($table, $maxIdVisit);
@@ -150,13 +151,20 @@ class LogDataPurger
// let's hardcode, since these are not dynamically created tables
public static function getDeleteTableLogTables()
{
- $result = Common::prefixTables('log_conversion',
- 'log_link_visit_action',
- 'log_visit',
- 'log_conversion_item');
+ $provider = StaticContainer::get('Piwik\Plugin\LogTablesProvider');
+
+ $result = array();
+ foreach ($provider->getAllLogTables() as $logTable) {
+
+ if ($logTable->getColumnToJoinOnIdVisit()) {
+ $result[] = Common::prefixTable($logTable->getName());
+ }
+ }
+
if (Db::isLockPrivilegeGranted()) {
$result[] = Common::prefixTable('log_action');
}
+
return $result;
}
}
diff --git a/plugins/PrivacyManager/lang/el.json b/plugins/PrivacyManager/lang/el.json
index c61f608b45..9e771d4115 100644
--- a/plugins/PrivacyManager/lang/el.json
+++ b/plugins/PrivacyManager/lang/el.json
@@ -55,7 +55,7 @@
"PurgingData": "Εκκαθάριση δεδομενων...",
"RecommendedForPrivacy": "Προτείνεται για λόγους ιδιωτικότητας",
"ReportsDataSavedEstimate": "Μέγεθος βάσης δεδομένων",
- "SaveSettingsBeforePurge": "Έχετε αλλάξει τις ρυθμίσεις διαγραφής δεδομένων. Αποθηκεύστε τες πριν αρχίσετε μια εκκαθάριση.",
+ "SaveSettingsBeforePurge": "Έχετε αλλάξει τις ρυθμίσεις διαγραφής δεδομένων. Αποθηκεύστε τις πριν αρχίσετε την εκκαθάριση.",
"SeeAlsoOurOfficialGuidePrivacy": "Δείτε επίσης τον επίσημο οδηγό μας: %1$sΙδιωτικότητα στα Αναλυτικά Ιστού%2$s",
"Teaser": "Στη σελίδα αυτή, μπορείτε να παραμετροποιήσετε το Piwik ώστε να είναι συμβατό με την υπάρχουσα νομοθεσία για την ιδιωτικότητα, με %1$s ανωνυμοποίηση των διευθύνσεων IP των επισκεπτών %2$s, %3$s αυτόματη διαγραφή των παλιών καταγραφών επισκεπτών από την βάση δεδομένων%4$s και %5$s διάθεση ενός μηχανισμού για μη συμπερίληψη στην καταγραφή για τον ιστοτόπο σας%6$s.",
"TeaserHeadline": "Ρυθμίσεις ιδιωτικού απορρήτου",
diff --git a/plugins/PrivacyManager/lang/it.json b/plugins/PrivacyManager/lang/it.json
index 012b45e312..770b33b81e 100644
--- a/plugins/PrivacyManager/lang/it.json
+++ b/plugins/PrivacyManager/lang/it.json
@@ -2,7 +2,7 @@
"PrivacyManager": {
"AnonymizeIpDescription": "Seleziona \"Sì\" se vuoi che Piwik non mostri gli indirizzi IP completi dei visitatori.",
"AnonymizeIpInlineHelp": "Rende anonimi gli ip dei tuoi visitatori per conformarsi alle leggi o ai regolamenti locali.",
- "AnonymizeIpExtendedHelp": "Quando gli utenti visitano il tuo sito web, Piwik non userà l'indirizzo IP completo (come %1$s) ma lo renderà prima anonimo (%2$s). Questo è uno dei requisiti definiti dalle leggi sulla privacy in alcuni paesi come la Germania.",
+ "AnonymizeIpExtendedHelp": "Quando gli utenti visitano il tuo sito web, Piwik non userà l'indirizzo IP completo (come %1$s) ma lo renderà prima anonimo (così: %2$s). Questo è uno dei requisiti definiti dalle leggi sulla privacy in alcuni paesi come la Germania.",
"AnonymizeIpMaskLengtDescription": "Seleziona quanti byte degli indirizzi IP dei visitatori devono essere nascosti.",
"AnonymizeIpMaskLength": "%1$s byte(s) - es. %2$s",
"CannotLockSoDeleteLogActions": "La tabella log_action non verrà pulita: assicura il privilegio LOCK TABLES all'utente MYSQL '%s'.",
@@ -22,7 +22,7 @@
"DeleteMaxRows": "Numero massimo di righe da cancellare in un passaggio:",
"DeleteMaxRowsNoLimit": "nessun limite",
"DeleteReportsConfirm": "Stai per consentire la cancellazione dei dati dei report. Se i vecchi report vengono rimossi, si dovranno rielaborare per visualizzarli. Sei sicuro di volerlo fare?",
- "DeleteReportsDetailedInfo": "I dati delle tabelle numeriche d'archivio del database (%1$s) e le tabelle d'archivio blob (%2$s) saranno cancellate.",
+ "DeleteReportsDetailedInfo": "I dati delle tabelle numeriche d'archivio del database (%1$s) e delle tabelle d'archivio blob (%2$s) saranno cancellati.",
"DeleteReportsInfo": "Se abilitato, i vecchi report verranno cancellati. %1$sRaccomandiamo di abilitare solo quando lo spazio del database è limitato.%2$s",
"DeleteReportsInfo2": "Se non è stato abilitato \"%s\", i vecchi report verranno automaticamente ricreati quando richiesti.",
"DeleteReportsInfo3": "Se abilitato \"%s\", i dati andranno definitivamente persi.",
@@ -57,7 +57,7 @@
"ReportsDataSavedEstimate": "Dimensioni database",
"SaveSettingsBeforePurge": "Hai cambiato le impostazioni per la cancellazione dei dati. Si consiglia di salvarli prima di cominciare una pulizia.",
"SeeAlsoOurOfficialGuidePrivacy": "Leggi anche la nostra guida ufficiale: %1$sWeb Analytics Privacy%2$s",
- "Teaser": "In questa pagina è possibile personalizzare Piwik per renderlo conforme alle norme vigenti sulla privacy. È possibile %1$s rendere anonimi gli IP dei visitatori%2$s, %3$s rimuovere automaticamente dal database i vecchi log dei visitatori%4$s e %5$s fornire un meccanismo opt-out per il sito%6$s.",
+ "Teaser": "In questa pagina è possibile personalizzare Piwik per renderlo conforme alle norme vigenti sulla privacy. È possibile %1$srendere anonimi gli IP dei visitatori%2$s, %3$srimuovere automaticamente dal database i vecchi log dei visitatori%4$s e %5$sfornire un meccanismo opt-out per il sito%6$s.",
"TeaserHeadline": "Impostazioni privacy",
"UseAnonymizedIpForVisitEnrichment": "Usa anche gli indirizzi IP Anonimi quando si arricchiscono le visite",
"UseAnonymizedIpForVisitEnrichmentNote": "Plugin come Geo Location tramite IP e Provider incrementano i metadati dei visitatori. Di default questi plugin utiizzano gli indirizzi IP resi anonimi. Se selezioni 'No', verrà utilizzato l'indirizzo IP completo non reso anonimo, con la conseguenza di una minore privacy ma con un'accuratezza dei dati migliore.",
diff --git a/plugins/PrivacyManager/lang/sv.json b/plugins/PrivacyManager/lang/sv.json
index a45b254e04..aeefdffd2f 100644
--- a/plugins/PrivacyManager/lang/sv.json
+++ b/plugins/PrivacyManager/lang/sv.json
@@ -2,6 +2,7 @@
"PrivacyManager": {
"AnonymizeIpDescription": "Välj \"Ja\" om du vill att Piwik inte ska spåra fullständiga IP-adresser.",
"AnonymizeIpInlineHelp": "Anonymisera den sista byten av besökarnas IP-adress för att följa lokala lagar om personlig integritet\/riktlinjer.",
+ "AnonymizeIpExtendedHelp": "När användare besöker din webbplats kommer inte Piwik använda deras fullständiga IP-adress (exempelvis %1$s). Istället kommer Piwik anonymisera den först (till %2$s). Anonymisering av IP-adresser är ett krav enligt personuppgiftslagen i några länder såsom Tyskland.",
"AnonymizeIpMaskLengtDescription": "Välj hur många bytes av besökares IP-adresser som ska döljas.",
"AnonymizeIpMaskLength": "%1$s byte(s) - t.ex. %2$s",
"CannotLockSoDeleteLogActions": "Tabellen log_action kommer inte att rensas: vänligen lägg till behörigheten LOCK TABLES till MYSQL-användaren '%s'",
@@ -48,6 +49,7 @@
"LeastMonthsInput": "Ange ett antal månader mer än %s.",
"MenuPrivacySettings": "Integritet",
"NextDelete": "Nästa schemalagda borttagning",
+ "PluginDescription": "Förbättra sekretessen för dina användare och gör så att din Piwik miljös sekretess uppfyller kraven som ställs enligt lokal lagstiftning.",
"PurgeNow": "Rensa databasen nu",
"PurgeNowConfirm": "Du är på väg att permanent radera data från din databas. Är du säker på att du vill fortsätta?",
"PurgingData": "Rensar data...",
diff --git a/plugins/PrivacyManager/lang/uk.json b/plugins/PrivacyManager/lang/uk.json
index 11f63237ac..2fdc90d4f1 100644
--- a/plugins/PrivacyManager/lang/uk.json
+++ b/plugins/PrivacyManager/lang/uk.json
@@ -1,5 +1,68 @@
{
"PrivacyManager": {
- "AnonymizeIpInlineHelp": "Анонімізувати останній байт IP-адреси відвідувача щоб забезпечити відповідність локальним законам\/рекомендаціям забезпечення конфіденційності."
+ "AnonymizeIpDescription": "Виберіть \"Так\", якщо хочете, щоб система відстежувала не повну IP-адресу відвідувачів.",
+ "AnonymizeIpInlineHelp": "Приховати останній байт IP-адрес ваших відвідувачів згідно вашим принципам конфіденційності або законодавству.",
+ "AnonymizeIpExtendedHelp": "Коли користувачі відвідують ваш сайт, Piwik не використовуватиме повний IP-адрес (наприклад, %1$s), а анонимизирует его (например, в %2$s). Анонимизация IP-адреса является одним из требований, установленных законами о конфиденциальности в некоторых странах, таких как Германия.",
+ "AnonymizeIpMaskLengtDescription": "Виберіть, як багато байтів IP-адреси відвідувачів повинно бути приховано.",
+ "AnonymizeIpMaskLength": "%1$s байт(ів), наприклад, %2$s",
+ "CannotLockSoDeleteLogActions": "Таблиця log_action не буде видалена: будь ласка, встановіть привілеї LOCK TABLES для ’%s’ користувача MYSQL.",
+ "ClickHereSettings": "Натисніть тут, щоб перейти до налаштувань: %s.",
+ "CurrentDBSize": "Поточний розмір бази даних",
+ "DBPurged": "База даних очищена.",
+ "DeleteBothConfirm": "Ви збираєтеся видалити дані відвідин сайту і дані за звітами одночасно. Ви більше не зможете переглядати статистику за старими відвідинам. Ви впевнені, що хочете зробити це?",
+ "DeleteDataDescription": "Ви можете налаштувати Piwik для постійного видалення старих даних про відвідування сайту і (або) оброблених звітів, щоб зберігати розмір вашої БД.",
+ "DeleteDataDescription2": "За бажанням заздалегідь оброблені звіти не будуть видалятися. Будуть видалятися тільки відвідування, перегляди сторінок і конверсія. Або заздалегідь оброблені звіти можуть видалятися, а дані по входах збережуться.",
+ "DeleteDataInterval": "Видаляти старі дані кожні",
+ "DeleteOldVisitorLogs": "Видалення старих журналів відвідувача",
+ "DeleteOldArchivedReports": "Видалення старих архівних звітів",
+ "DeleteLogDescription2": "Якщо ви використовуєте автоматичне видалення логів, переконайтеся, що всі попередні звіти за день були оброблені, щоб не втратити ні яких даних.",
+ "DeleteLogInfo": "Будуть видалені логи з наступних таблиць: %s",
+ "DeleteLogsConfirm": "Ви збираєтеся включити видалення даних про відвідування сайту. Коли старі дані по відвідини будуть видалені, а відповідні звіти не оброблені, ви не зможете переглядати аналітичні дані в історичній послідовності. Ви впевнені, що хочете зробити це?",
+ "DeleteLogsOlderThan": "Видалити логи, старше ніж",
+ "DeleteMaxRows": "Максимальне число рядків для видалення за один раз:",
+ "DeleteMaxRowsNoLimit": "немає обмежень",
+ "DeleteReportsConfirm": "Ви збираєтеся включити видалення даних за звітами. Коли старі звіти будуть видалені, ви повинні знову обробити їх, якщо хочете переглянути їх. Ви впевнені що хочете зробити це?",
+ "DeleteReportsDetailedInfo": "Дані бази даних, що містяться в numeric (%1$s) і blob-таблицях (%2$s) будуть видалені.",
+ "DeleteReportsInfo": "Якщо включено, старі звіти будуть видалені. %1$sМи рекомендуємо включати це тільки якщо розмір вашої БД обмежений.%2$s",
+ "DeleteReportsInfo2": "Якщо ви не включили '%s', старі звіти будуть відтворюватися автоматично за запитом.",
+ "DeleteReportsInfo3": "Якщо ви включили '%s', дані будуть назавжди втрачені.",
+ "DeleteReportsOlderThan": "Видалити звіти, старше ніж",
+ "DeleteSchedulingSettings": "Розклад видалення старих даних",
+ "DeleteDataSettings": "Видалення старих логів відвідувань і звітів",
+ "DoNotTrack_Description": "Відмова від відстеження – технологія і пропозиція політики безпеки, яка дозволяє користувачам відмовлятися від того, щоб їх відвідування відстежувалися. Використовується в аналітичних сервісах, рекламних мережах і соціальних платформах.",
+ "DoNotTrack_Disable": "Відключити можливість відмови від відстеження",
+ "DoNotTrack_Disabled": "Piwik зараз відстежує всіх відвідувачів, навіть якщо вони встановили налаштування «Я не хочу, щоб мене відстежували» в своїх браузерах.",
+ "DoNotTrack_DisabledMoreInfo": "Ми рекомендуємо поважати конфіденційність ваших відвідувачів і включити можливість відмови від відстеження.",
+ "DoNotTrack_Enable": "Включити можливість відмови від відстеження",
+ "DoNotTrack_Enabled": "На даний момент ви поважаєте конфіденційність ваших відвідувачів. Браво!",
+ "DoNotTrack_EnabledMoreInfo": "Коли користувач налаштовує свій браузер на «Я не хочу, щоб мене відстежували» (Можливість відмови від відстеження включена), Piwik не буде відслідковувати такі відвідування.",
+ "DoNotTrack_SupportDNTPreference": "Налаштування Відмови від Відстеження",
+ "EstimatedDBSizeAfterPurge": "Очікуваний розмір бази даних після чистки",
+ "EstimatedSpaceSaved": "Очікуваний розмір збереженого простору",
+ "GeolocationAnonymizeIpNote": "Підказка: Геолоакція матиме практично ті ж результати з 1 прихованим байтом IP адреси. Якщо приховано два або більше байтів, геолокація буде визначати місцезнаходження користувача неточно.",
+ "GetPurgeEstimate": "Оцінити очищення бази за часом",
+ "KeepBasicMetrics": "Зберегти основні показники (відвідування, перегляди сторінок, відсоток відскоків, конверсію цілей, конверсію ел. замовлень і ін.)",
+ "KeepDataFor": "Зберегти всі дані для",
+ "KeepReportSegments": "Для збереження даних вище також налаштуйте сегментацію звітів",
+ "LastDelete": "Останнє видалення було",
+ "LeastDaysInput": "Будь ласка, визначте кількість днів, більше ніж %s.",
+ "LeastMonthsInput": "Будь ласка, визначте кількість місяців, більше ніж %s.",
+ "MenuPrivacySettings": "Конфіденційність",
+ "NextDelete": "Наступне видалення за розкладом через",
+ "PluginDescription": "Підвищення рівня конфіденційності для користувачів і налаштування аналітики Piwik для конфіденційності сумісної з вашим місцевим законодавством.",
+ "PurgeNow": "Очистити базу даних зараз",
+ "PurgeNowConfirm": "Ви збираєтеся назавжди видалити дані з вашої бази даних. Ви впевнені, що хочете продовжити?",
+ "PurgingData": "Видалення даних...",
+ "RecommendedForPrivacy": "Рекомендується для забезпечення конфіденційності",
+ "ReportsDataSavedEstimate": "Розмір бази даних",
+ "SaveSettingsBeforePurge": "Ви змінили налаштування видалення даних. Будь ласка, збережіть їх, перед тим як почати чистку.",
+ "SeeAlsoOurOfficialGuidePrivacy": "Дивіться також офіційне керівництво: %1$sПриватність даних в Piwik%2$s",
+ "Teaser": "На цій вкладці ви можете налаштовувати веб-аналітику для її відповідної політики конфіденційності чинного законодавства вашої країни. Використовуйте: %1$s приховування IP-адреси відвідувача%2$s, %3$s автоматичне стирання старих логів з бази банних%4$s і %5$s можливість для відвідувачів виключити себе з обліку в системі%6$s.",
+ "TeaserHeadline": "Налаштування конфіденційності",
+ "UseAnonymizedIpForVisitEnrichment": "Також використовуйте анонімні IP-адреси при логуванні відвідувань.",
+ "UseAnonymizedIpForVisitEnrichmentNote": "Plugins such as Geo Location via IP and Provider improve visitor's metadata. By default these plugins use the anonymized IP addresses. If you select 'No', then the non-anonymized full IP address will be used instead, resulting in less privacy but better data accuracy.",
+ "UseAnonymizeIp": "Приховати IP-адреси відвідувачів",
+ "UseDeleteLog": "Регулярно видаляти старі логи відвідувань з бази даних",
+ "UseDeleteReports": "Завжди видаляти старі звіти з баз даних"
}
} \ No newline at end of file
diff --git a/plugins/PrivacyManager/tests/Integration/DataPurgingTest.php b/plugins/PrivacyManager/tests/Integration/DataPurgingTest.php
index 1f79d34b82..f8ff592eb9 100644
--- a/plugins/PrivacyManager/tests/Integration/DataPurgingTest.php
+++ b/plugins/PrivacyManager/tests/Integration/DataPurgingTest.php
@@ -23,6 +23,7 @@ use Piwik\Plugins\PrivacyManager\LogDataPurger;
use Piwik\Plugins\PrivacyManager\PrivacyManager;
use Piwik\Plugins\PrivacyManager\ReportsPurger;
use Piwik\Plugins\VisitorInterest\API as APIVisitorInterest;
+use Piwik\Tests\Framework\Mock\Plugin\LogTablesProvider;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Piwik\Tracker\GoalManager;
use Piwik\Tests\Framework\Fixture;
@@ -517,7 +518,7 @@ class DataPurgingTest extends IntegrationTestCase
{
$rawLogDao = new DataPurgingTest_RawLogDao(new DimensionMetadataProvider());
$rawLogDao->insertActionsOlderThanCallback = array($this, 'addReferenceToUnusedAction');
- $purger = new LogDataPurger(new LogDeleter($rawLogDao), $rawLogDao);
+ $purger = new LogDataPurger(new LogDeleter($rawLogDao, new LogTablesProvider()), $rawLogDao);
$this->unusedIdAction = Db::fetchOne(
"SELECT idaction FROM " . Common::prefixTable('log_action') . " WHERE name = ?",
diff --git a/plugins/ProfessionalServices/ProfessionalServices.php b/plugins/ProfessionalServices/ProfessionalServices.php
new file mode 100644
index 0000000000..203c3bb6f6
--- /dev/null
+++ b/plugins/ProfessionalServices/ProfessionalServices.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\ProfessionalServices;
+
+class ProfessionalServices extends \Piwik\Plugin
+{
+ /**
+ * @see Piwik\Plugin::registerEvents
+ */
+ public function registerEvents()
+ {
+ return array(
+ 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
+ 'Request.getRenamedModuleAndAction' => 'renameProfessionalServicesModule',
+ );
+ }
+
+ public function getStylesheetFiles(&$stylesheets)
+ {
+ $stylesheets[] = 'plugins/ProfessionalServices/stylesheets/widget.less';
+ }
+
+ /**
+ * @deprecated Can be removed in Piwik 3.0
+ * @param $module
+ * @param $action
+ */
+ public function renameProfessionalServicesModule(&$module, &$action)
+ {
+ if ($module == 'ProfessionalServices') {
+ $module = 'ProfessionalServices';
+
+ if($action == 'promoPiwikPro') {
+ $action = 'promoServices';
+ }
+
+ if($action == 'rssPiwikPro') {
+ $action = 'rss';
+ }
+ }
+ }
+}
diff --git a/plugins/PiwikPro/Promo.php b/plugins/ProfessionalServices/Promo.php
index c253df0f43..36f8ae155d 100644
--- a/plugins/PiwikPro/Promo.php
+++ b/plugins/ProfessionalServices/Promo.php
@@ -6,7 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\PiwikPro;
+namespace Piwik\Plugins\ProfessionalServices;
class Promo
{
@@ -19,27 +19,27 @@ class Promo
),
array(
'campaignContent' => 'bringEnterpriseLevel',
- 'text' => 'Bring your analytics to enterprise level. Upgrade your Piwik platform and receive access to numerous premium features and assistance from our experts.'
+ 'text' => 'Bring your analytics to enterprise level. Upgrade your Piwik platform and receive access to numerous premium features and assistance from experts.'
),
array(
'campaignContent' => 'funnelAnalytics',
- 'text' => 'Want Funnel Analytics? Get Premium features and enterprise-grade support from the makers of Piwik.'
+ 'text' => 'Want Funnel Analytics? Get Premium features and enterprise-grade support.'
),
array(
'campaignContent' => 'monitoringAndIncident',
- 'text' => 'Do you need 24/7 Monitoring and Incident Handling for your Piwik? Get Premium features and enterprise-grade support from the makers of Piwik.'
+ 'text' => 'Do you need 24/7 Monitoring and Incident Handling for your Piwik? Get Premium features and enterprise-grade support.'
),
array(
'campaignContent' => 'slowingDown',
- 'text' => 'Is your Piwik slowing down? The Piwik makers can help with your server setup!'
+ 'text' => 'Is your Piwik slowing down? Piwik experts can help with your server setup!'
),
array(
'campaignContent' => 'excitingFeatures',
- 'text' => 'Want to know how to use all the exciting features in Piwik? Try our User training to be up to speed with working with Piwik.'
+ 'text' => 'Want to know how to use all the exciting features in Piwik? Try a User training to be up to speed with working with Piwik.'
),
array(
'campaignContent' => 'slowingDown',
- 'text' => 'Did you know you can adjust the look and feel of Piwik to your brand, and even replace "Piwik" with your product name? Try our White Label product!',
+ 'text' => 'Did you know you can adjust the look and feel of Piwik to your brand, and even replace "Piwik" with your product name? Try the White Label product!',
),
array(
'campaignContent' => 'metaSites',
diff --git a/plugins/ProfessionalServices/Widgets.php b/plugins/ProfessionalServices/Widgets.php
new file mode 100644
index 0000000000..b1abc5e7da
--- /dev/null
+++ b/plugins/ProfessionalServices/Widgets.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\ProfessionalServices;
+
+use Piwik\Piwik;
+use Piwik\ProfessionalServices\Advertising;
+use Piwik\Plugins\ExampleRssWidget\RssRenderer;
+use Piwik\View;
+
+class Widgets extends \Piwik\Plugin\Widgets
+{
+ protected $category = 'About Piwik';
+
+ /**
+ * @var Advertising
+ */
+ private $advertising;
+
+ /**
+ * @var Promo
+ */
+ private $promo;
+
+ public function __construct(Advertising $advertising, Promo $promo)
+ {
+ $this->advertising = $advertising;
+ $this->promo = $promo;
+ }
+
+ protected function init()
+ {
+ if ($this->advertising->areAdsForProfessionalServicesEnabled()) {
+ $this->addWidget('ProfessionalServices_WidgetProfessionalServicesForPiwik', 'promoServices');
+ }
+ }
+
+ public function rss()
+ {
+ return '';
+ }
+
+ public function promoServices()
+ {
+ $view = new View('@ProfessionalServices/promoServicesWidget');
+
+ $promo = $this->promo->getContent();
+
+ $view->ctaLinkUrl = $this->advertising->getPromoUrlForPiwikProUpgrade();
+ $view->ctaText = $promo['text'];
+ $view->ctaLinkTitle = $this->promo->getLinkTitle();
+
+ return $view->render();
+ }
+}
diff --git a/plugins/ProfessionalServices/config/test.php b/plugins/ProfessionalServices/config/test.php
new file mode 100644
index 0000000000..03ad8662fd
--- /dev/null
+++ b/plugins/ProfessionalServices/config/test.php
@@ -0,0 +1,13 @@
+<?php
+
+use Piwik\Tests\Framework\Mock\ProfessionalServices\Advertising;
+use Piwik\Plugins\ProfessionalServices\tests\Framework\Mock\Promo;
+
+return array(
+ 'Piwik\ProfessionalServices\Advertising' => function () {
+ return new Advertising();
+ },
+ 'Piwik\Plugins\ProfessionalServices\Promo' => function () {
+ return new Promo();
+ }
+);
diff --git a/plugins/PiwikPro/images/promo.png b/plugins/ProfessionalServices/images/promo.png
index ac15b596df..ac15b596df 100644
--- a/plugins/PiwikPro/images/promo.png
+++ b/plugins/ProfessionalServices/images/promo.png
Binary files differ
diff --git a/plugins/ProfessionalServices/lang/en.json b/plugins/ProfessionalServices/lang/en.json
new file mode 100644
index 0000000000..1f275d103f
--- /dev/null
+++ b/plugins/ProfessionalServices/lang/en.json
@@ -0,0 +1,5 @@
+{
+ "ProfessionalServices": {
+ "WidgetProfessionalServicesForPiwik": "Professional Services for Piwik"
+ }
+} \ No newline at end of file
diff --git a/plugins/ProfessionalServices/plugin.json b/plugins/ProfessionalServices/plugin.json
new file mode 100644
index 0000000000..852b094b37
--- /dev/null
+++ b/plugins/ProfessionalServices/plugin.json
@@ -0,0 +1,4 @@
+{
+ "name": "ProfessionalServices",
+ "description": "Provides widgets to learn about Professional services and products for Piwik."
+} \ No newline at end of file
diff --git a/plugins/PiwikPro/stylesheets/widget.less b/plugins/ProfessionalServices/stylesheets/widget.less
index fdb9cb1eae..fdb9cb1eae 100644
--- a/plugins/PiwikPro/stylesheets/widget.less
+++ b/plugins/ProfessionalServices/stylesheets/widget.less
diff --git a/plugins/PiwikPro/templates/promoPiwikProWidget.twig b/plugins/ProfessionalServices/templates/promoServicesWidget.twig
index 2864fa340f..67f87df40a 100644
--- a/plugins/PiwikPro/templates/promoPiwikProWidget.twig
+++ b/plugins/ProfessionalServices/templates/promoServicesWidget.twig
@@ -1,6 +1,6 @@
<div class="promoWidget">
<div class="promo">
- <img class="icon" src="plugins/PiwikPro/images/promo.png">
+ <img class="icon" src="plugins/ProfessionalServices/images/promo.png">
<p class="text">
{{ ctaText }}
<br /><br />
diff --git a/plugins/PiwikPro/tests/Framework/Mock/Promo.php b/plugins/ProfessionalServices/tests/Framework/Mock/Promo.php
index 47dd6f6497..a854b9da8a 100644
--- a/plugins/PiwikPro/tests/Framework/Mock/Promo.php
+++ b/plugins/ProfessionalServices/tests/Framework/Mock/Promo.php
@@ -6,9 +6,9 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\PiwikPro\tests\Framework\Mock;
+namespace Piwik\Plugins\ProfessionalServices\tests\Framework\Mock;
-class Promo extends \Piwik\Plugins\PiwikPro\Promo
+class Promo extends \Piwik\Plugins\ProfessionalServices\Promo
{
public function getLinkTitle()
{
diff --git a/plugins/Provider/lang/sq.json b/plugins/Provider/lang/sq.json
index 90e8dff654..9209a1ba31 100644
--- a/plugins/Provider/lang/sq.json
+++ b/plugins/Provider/lang/sq.json
@@ -1,6 +1,7 @@
{
"Provider": {
"ColumnProvider": "Mundësues",
+ "PluginDescription": "Raporton Mundësuesit e Shërbimit Internet të vizitorëve.",
"ProviderReportDocumentation": "Ky raport ju tregon cilët Mundësues Shërbimi Internet kanë përdorur vizitorët tuaj për të hyrë te sajti. Për më tepër hollësi mund të klikoni mbi emrin e një mundësuesi. %s Nëse Piwik s’arrin ta përcaktojë mundësuesin për një vizitor, e tregon thjesht si IP.",
"WidgetProviders": "Mundësuesa",
"ProviderReportFooter": "Mundësues i panjohur do të thotë që adresa IP s’u kërkua dot."
diff --git a/plugins/Provider/lang/sv.json b/plugins/Provider/lang/sv.json
index 3f908b1fb0..e82eee6eb8 100644
--- a/plugins/Provider/lang/sv.json
+++ b/plugins/Provider/lang/sv.json
@@ -3,6 +3,7 @@
"ColumnProvider": "Internetleverantör",
"PluginDescription": "Rapporterar besökarnas Internetleverantör.",
"ProviderReportDocumentation": "Denna rapport visar vilka Internetleverantörer dina besökare använde för att få åtkomst till webbplatsen. Du kan klicka på en leverantörs namn för mer information. %s Om Piwik inte kan avgöra en besökares leverantör, så listas den som IP.",
- "WidgetProviders": "Internetleverantör"
+ "WidgetProviders": "Internetleverantör",
+ "ProviderReportFooter": "Okänd internetleverantör betyder att IP-adressen inte kunde slås upp."
}
} \ No newline at end of file
diff --git a/plugins/Provider/lang/uk.json b/plugins/Provider/lang/uk.json
index 6537f7daca..efb9f7ae81 100644
--- a/plugins/Provider/lang/uk.json
+++ b/plugins/Provider/lang/uk.json
@@ -1,6 +1,9 @@
{
"Provider": {
"ColumnProvider": "Провайдер",
- "WidgetProviders": "Провайдери"
+ "PluginDescription": "Повідомляє про постачальника інтернет послуг (ISP) у відвідувачів.",
+ "ProviderReportDocumentation": "Цей звіт показує, які інтернет-провайдери у відвідувачів вашого сайту. Ви можете клікнути на ім'я провайдера, щоб подивитися деталі. %s Якщо Piwik не може визначити провайдера, відображається просто IP.",
+ "WidgetProviders": "Провайдери",
+ "ProviderReportFooter": "Невідомий постачальник означає IP адресу, яка не може бути визначена."
}
} \ No newline at end of file
diff --git a/plugins/Referrers/Columns/Base.php b/plugins/Referrers/Columns/Base.php
index 655ea20449..8da2c79bc3 100644
--- a/plugins/Referrers/Columns/Base.php
+++ b/plugins/Referrers/Columns/Base.php
@@ -288,8 +288,11 @@ abstract class Base extends VisitDimension
return false;
}
+ $site = Cache::getCacheWebsiteAttributes($this->idsite);
+ $excludeUnknowns = $site['exclude_unknown_urls'];
+
// fallback logic if the referrer domain is not known to any site to not break BC
- if (isset($this->currentUrlParse['host'])) {
+ if (!$excludeUnknowns && isset($this->currentUrlParse['host'])) {
// this might be actually buggy if first thing tracked is eg an outlink and referrer is from that site
$currentHost = Common::mb_strtolower($this->currentUrlParse['host']);
if ($currentHost == Common::mb_strtolower($this->referrerHost)) {
diff --git a/plugins/Referrers/SearchEngine.php b/plugins/Referrers/SearchEngine.php
index 9b11ac860f..e2970c61ad 100644
--- a/plugins/Referrers/SearchEngine.php
+++ b/plugins/Referrers/SearchEngine.php
@@ -224,11 +224,10 @@ class SearchEngine extends Singleton
$searchEngineName = $definitions['name'];
$variableNames = $definitions['params'];
+ $keywordsHiddenFor = !empty($definitions['hiddenkeyword']) ? $definitions['hiddenkeyword'] : array();
$key = null;
- if ($searchEngineName === 'Google Images'
- || ($searchEngineName === 'Google' && strpos($referrerUrl, '/imgres') !== false)
- ) {
+ if ($searchEngineName === 'Google Images') {
if (strpos($query, '&prev') !== false) {
$query = urldecode(trim(UrlHelper::getParameterFromQueryString($query, 'prev')));
$query = str_replace('&', '&amp;', strstr($query, '?'));
@@ -286,27 +285,13 @@ class SearchEngine extends Singleton
$key = UrlHelper::getParameterFromQueryString($query, $variableName);
$key = trim(urldecode($key));
- // Special cases: empty or no keywords
+ // Special cases: empty keywords
if (empty($key)
&& (
- // Google search with no keyword
- ($searchEngineName == 'Google'
- && (empty($query) && (empty($referrerPath) || $referrerPath == '/') && empty($referrerParsed['fragment']))
- )
-
- // Yahoo search with no keyword
- || ($searchEngineName == 'Yahoo!'
- && ($referrerParsed['host'] == 'r.search.yahoo.com')
- )
-
// empty keyword parameter
- || strpos($query, sprintf('&%s=', $variableName)) !== false
+ strpos($query, sprintf('&%s=', $variableName)) !== false
|| strpos($query, sprintf('?%s=', $variableName)) !== false
-
- // search engines with no keyword
- || $searchEngineName == 'Ixquick'
- || $searchEngineName == 'Google Images'
- || $searchEngineName == 'DuckDuckGo')
+ )
) {
$key = false;
}
@@ -319,6 +304,30 @@ class SearchEngine extends Singleton
}
}
+ // if no keyword found, but empty keywords are allowed
+ if (!empty($keywordsHiddenFor) && ($key === null || $key === '')) {
+
+ $pathWithQueryAndFragment = $referrerPath;
+ if (!empty($query)) {
+ $pathWithQueryAndFragment .= '?'.$query;
+ }
+ if (!empty($referrerParsed['fragment'])) {
+ $pathWithQueryAndFragment .= '#'.$referrerParsed['fragment'];
+ }
+
+ foreach ($keywordsHiddenFor as $path) {
+ if (strlen($path) > 1 && substr($path, 0, 1) == '/' && substr($path, -1, 1) == '/') {
+ if (preg_match($path, $pathWithQueryAndFragment)) {
+ $key = false;
+ break;
+ }
+ } elseif ($path == $pathWithQueryAndFragment) {
+ $key = false;
+ break;
+ }
+ }
+ }
+
// $key === false is the special case "No keyword provided" which is a Search engine match
if ($key === null || $key === '') {
return false;
diff --git a/plugins/Referrers/images/searchEngines/search.disconnect.me.png b/plugins/Referrers/images/searchEngines/search.disconnect.me.png
new file mode 100644
index 0000000000..54b0eac351
--- /dev/null
+++ b/plugins/Referrers/images/searchEngines/search.disconnect.me.png
Binary files differ
diff --git a/plugins/Referrers/images/searchEngines/search.lookseek.com.png b/plugins/Referrers/images/searchEngines/search.lookseek.com.png
new file mode 100644
index 0000000000..ac1ff37a17
--- /dev/null
+++ b/plugins/Referrers/images/searchEngines/search.lookseek.com.png
Binary files differ
diff --git a/plugins/Referrers/images/searchEngines/search.smartshopping.com.png b/plugins/Referrers/images/searchEngines/search.smartshopping.com.png
new file mode 100644
index 0000000000..320ede63d5
--- /dev/null
+++ b/plugins/Referrers/images/searchEngines/search.smartshopping.com.png
Binary files differ
diff --git a/plugins/Referrers/images/searchEngines/searchlock.com.png b/plugins/Referrers/images/searchEngines/searchlock.com.png
new file mode 100644
index 0000000000..54f98183bc
--- /dev/null
+++ b/plugins/Referrers/images/searchEngines/searchlock.com.png
Binary files differ
diff --git a/plugins/Referrers/images/searchEngines/startpage.com.png b/plugins/Referrers/images/searchEngines/startpage.com.png
new file mode 100644
index 0000000000..916df91599
--- /dev/null
+++ b/plugins/Referrers/images/searchEngines/startpage.com.png
Binary files differ
diff --git a/plugins/Referrers/images/searchEngines/www.only-search.com.png b/plugins/Referrers/images/searchEngines/www.only-search.com.png
new file mode 100644
index 0000000000..543c95d88e
--- /dev/null
+++ b/plugins/Referrers/images/searchEngines/www.only-search.com.png
Binary files differ
diff --git a/plugins/Referrers/lang/it.json b/plugins/Referrers/lang/it.json
index ac5c1ad83d..ab9144217e 100644
--- a/plugins/Referrers/lang/it.json
+++ b/plugins/Referrers/lang/it.json
@@ -2,8 +2,8 @@
"Referrers": {
"AllReferrersReportDocumentation": "Questo report mostra tutti i tuoi Referenti in un unico report che elenca tutti i Siti web, le Parole chiave di ricerca e Campagne utilizzate dai visitatori per trovare il tuo sito web.",
"Campaigns": "Campagne",
- "CampaignsDocumentation": "Visitatori che sono arrivati sul tuo sito web a seguito di una campagna. %1$s Vedi il%2$s Report per maggiori dettagli.",
- "CampaignsReportDocumentation": "Questo report mostra quali campagne hanno portato i visitatori sul tuo sito web. %1$s Per ulteriori informazioni sulle campagne di monitoraggio, leggi la %2$sdocumentazione campagne su piwik.org%3$s",
+ "CampaignsDocumentation": "Visitatori che sono arrivati sul tuo sito web a seguito di una campagna. %1$sVedi il%2$s report per maggiori dettagli.",
+ "CampaignsReportDocumentation": "Questo report mostra quali campagne hanno portato i visitatori sul tuo sito web. %1$sPer ulteriori informazioni sulle campagne di monitoraggio, leggi la %2$sdocumentazione campagne su piwik.org%3$s",
"ColumnCampaign": "Campagna",
"ColumnSearchEngine": "Motore di ricerca",
"ColumnSocial": "Social network",
@@ -27,7 +27,7 @@
"ReferrersOverview": "Panoramica Referenti",
"ReferrerTypes": "Tipi di Referenti",
"SearchEngines": "Motori di ricerca",
- "SearchEnginesDocumentation": "Un visitatore è stato portato sul tuo sito da un motore di ricerca. %1$s Vedi il %2$s report per maggiori dettagli.",
+ "SearchEnginesDocumentation": "Un visitatore è stato portato sul tuo sito da un motore di ricerca. %1$s Vedi il%2$s report per maggiori dettagli.",
"SearchEnginesReportDocumentation": "Questo report mostra quali motori di ricerca hanno portato gli utenti sul tuo sito web. %s Cliccando su una riga della tabella è possibile vedere ciò che gli utenti stavano cercando utilizzando un determinato motore di ricerca.",
"SocialFooterMessage": "Questo è un sottoinsieme dei siti web riportati a sinistra. Esso filtra altri siti web in modo da poter confrontare direttamente i vostri referenti di social network.",
"Socials": "Social Networks",
@@ -44,7 +44,7 @@
"ViewAllReferrers": "Vedi tutti i Referenti",
"ViewReferrersBy": "Vedi Referenti per %s",
"Websites": "Siti web",
- "WebsitesDocumentation": "Il visitatore ha seguito un link su un altro sito web che lo ha portato sul tuo. %1$s Vedi il %2$s report per maggiori dettagli.",
+ "WebsitesDocumentation": "Il visitatore ha seguito un link su un altro sito web che lo ha portato sul tuo. %1$sVedi il%2$s report per maggiori dettagli.",
"WebsitesReportDocumentation": "In questa tabella è possibile vedere quali siti web hanno portato i visitatori sul tuo sito. %s Cliccando su una riga della tabella è possibile vedere su quali URL si trovavano i link al tuo sito.",
"WidgetExternalWebsites": "Elenco di Siti web esterni",
"WidgetGetAll": "Tutti i Referenti",
diff --git a/plugins/Referrers/lang/nl.json b/plugins/Referrers/lang/nl.json
index 39be150270..61be153d4e 100644
--- a/plugins/Referrers/lang/nl.json
+++ b/plugins/Referrers/lang/nl.json
@@ -20,9 +20,9 @@
"EvolutionDocumentationMoreInfo": "Voor meer informatie over de verschillende soorten verwijzingen, zie de documentatie van de %s tabel.",
"Keywords": "Sleutelwoorden",
"KeywordsReportDocumentation": "Dit rapport toont de sleutelwoorden waarop men zocht en waarbij men werd doorverwezen naar uw website. %s Door op een rij in de tabel te klikken kunt u de verdeling van de zoekmachines zien die op deze sleutelwoorden naar uw website hebben doorverwezen.",
- "Referrer": "Referer",
+ "Referrer": "Verwijzer",
"ReferrerName": "Verwijzer Naam",
- "Referrers": "Referrers",
+ "Referrers": "Herkomst",
"ReferrersOverview": "Referer Overzicht",
"ReferrerTypes": "Referrer Types",
"SearchEngines": "Zoekmachines",
diff --git a/plugins/Referrers/lang/uk.json b/plugins/Referrers/lang/uk.json
index 9cf0a1fabe..e23ca82bee 100644
--- a/plugins/Referrers/lang/uk.json
+++ b/plugins/Referrers/lang/uk.json
@@ -1,28 +1,55 @@
{
"Referrers": {
+ "AllReferrersReportDocumentation": "Цей звіт показує всіх реферів в одному зведеному звіті, перераховуючи всі Веб-сайти, Пошукові запити і Кампанії, якими користувалися відвідувачі, щоб знайти ваш сайт.",
"Campaigns": "Кампанії",
+ "CampaignsDocumentation": "Відвідувач перейшов на ваш сайт з рекламної кампанії. %1$s Детальна інформація у звіті %2$s",
+ "CampaignsReportDocumentation": "Цей звіт показує, які рекламні кампанії привели відвідувачів на ваш сайт. %1$s Для більшої інформації про відстеження кампаній читайте %2$sДокументацію по кампаніям на сайті piwik.org%3$s",
"ColumnCampaign": "Кампанія",
- "ColumnSearchEngine": "Пошукова машина",
- "ColumnWebsite": "Веб-сайт",
- "ColumnWebsitePage": "Сторінка Веб-сайту",
- "DirectEntry": "Прямі заходи",
- "Distinct": "Унікальні реферери по типу реферера",
- "DistinctCampaigns": "унікальні компанії",
- "DistinctKeywords": "унікальні ключові слова",
- "DistinctSearchEngines": "унікальні пошукові машини",
- "DistinctWebsites": "унікальні веб-сайти",
+ "ColumnSearchEngine": "Пошукова система",
+ "ColumnSocial": "Сторінка соціальної мережі",
+ "ColumnWebsite": "Сайт",
+ "ColumnWebsitePage": "Сторінка сайту",
+ "DirectEntry": "Прямий вхід",
+ "DirectEntryDocumentation": "Відвідувач перейшов на ваш сайт за посиланням, вбивши її в адресний рядок браузера або по закладці, що називається прямим переходом.",
+ "Distinct": "Різні джерела по типу",
+ "DistinctCampaigns": "Різні кампанії",
+ "DistinctKeywords": "Різні ключові слова",
+ "DistinctSearchEngines": "Різні пошукові системи",
+ "DistinctWebsites": "Різні сайти",
+ "EvolutionDocumentation": "Це огляд джерел, з яких відвідувачі приходять на ваш сайт.",
+ "EvolutionDocumentationMoreInfo": "Більше інформації про різні типи джерел див. в документації по таблиці %s.",
"Keywords": "Ключові слова",
- "Referrers": "Реферер",
+ "KeywordsReportDocumentation": "Цей звіт показує ключові слова, які відвідувачі вашого сайту вводили в пошуковику, перш ніж потрапити на ваш сайт. %s Клікнувши на конкретний ряд таблиці, ви побачите розподіл ключового слова по пошуковим системам.",
+ "PluginDescription": "Повідомляє дані реферерів: Пошукові системи, Ключові слова, Веб-сайти, Кампанії, Соціальні медіа, Пряме введення.",
+ "Referrer": "Джерело",
+ "ReferrerName": "Ім'я джерела",
+ "Referrers": "Джерела трафіку",
+ "ReferrersOverview": "Огляд джерел",
+ "ReferrerTypes": "Дипи джерела",
"SearchEngines": "Пошукові системи",
+ "SearchEnginesDocumentation": "Відвідувач перейшов на ваш сайт з пошукової системи. %1$s Детальна інформація у звіті %2$s.",
+ "SearchEnginesReportDocumentation": "Цей звіт показує, з яких пошукових систем прийшли відвідувачі. %s Клікнувши на конкретний ряд таблиці, ви побачите, що відвідувач шукав в пошуковій системі і що привело його на ваш сайт.",
+ "SocialFooterMessage": "Це підмножина сайтів зліва. Він відфільтровує інші сайти, так що ви можете порівняти свої соціальні мережі та джерела безпосередньо.",
+ "Socials": "Соціальні мережі",
+ "SocialsReportDocumentation": "Цей звіт показує, які соціальні мережі привели відвідувачів на ваш сайт.<br \/>Клікнувши на конкретний рядок таблиці, ви можете побачити, з яких саме сторінок соціальних мереж перейшли ці відвідувачі.",
"SubmenuSearchEngines": "Пошукові системи і ключові слова",
- "SubmenuWebsites": "Веб-сайти",
- "Type": "Тип реферера",
- "TypeCampaigns": "%s з кампаній",
- "TypeDirectEntries": "%s прямих заходжень",
- "TypeSearchEngines": "%s з пошукових систем",
- "TypeWebsites": "%s з веб-сайтів",
- "UsingNDistinctUrls": "(використовуючи %s унікальні URL)",
+ "SubmenuWebsites": "Сайти",
+ "Type": "Тип джерела",
+ "TypeCampaigns": "%s входів з кампаній",
+ "TypeDirectEntries": "%s прямих входів",
+ "TypeReportDocumentation": "Ця таблиця містить інформацію про розподіл типів джерел трафіку.",
+ "TypeSearchEngines": "%s входів з пошукових систем",
+ "TypeWebsites": "%s входів з сайтів",
+ "UsingNDistinctUrls": "(за %s різним посиланням)",
+ "ViewAllReferrers": "Подивитися всі джерела",
+ "ViewReferrersBy": "Подивитися джерела по %s",
"Websites": "Сайти",
- "WidgetExternalWebsites": "Список зовнішніх веб-сайтів"
+ "WebsitesDocumentation": "Відвідувач перейшов на ваш сайт за посиланням, яка перебувало на іншому сайті. %1$s Детальна інформація у звіті %2$s",
+ "WebsitesReportDocumentation": "У цій таблиці ви можете бачити сайти, які привели відвідувачів на ваш сайт. %s Клікнувши на таблиці по конкретному рядку, ви побачите де було розміщене посилання на ваш сайт.",
+ "WidgetExternalWebsites": "Зовнішні сайти",
+ "WidgetGetAll": "Всі джерела трафіку",
+ "WidgetSocials": "Список соціальних мереж",
+ "WidgetTopKeywordsForPages": "Топ ключових слів для сторінки URL",
+ "XPercentOfVisits": "%s відвідувань"
}
} \ No newline at end of file
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
index f5ff10e11c..1e7e4af8cb 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
@@ -38,7 +38,7 @@ class ReferrerKeywordTest extends IntegrationTestCase
$ecommerce = false;
Fixture::createWebsite($date, $ecommerce, $name = 'test1', $url = 'http://piwik.org/');
- Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.pro/');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.xyz/');
$this->keyword = new Keyword();
}
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
index f118e14ba6..cd1610a178 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
@@ -44,7 +44,7 @@ class ReferrerNameTest extends IntegrationTestCase
Fixture::createWebsite($date, $ecommerce, $name = 'test1', $url = 'http://piwik.org/foo/bar');
Fixture::createWebsite($date, $ecommerce, $name = 'test2', $url = 'http://piwik.org/');
- Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.pro/');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.xyz/');
$this->referrerName = new ReferrerName();
}
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
index 5925dbc5c0..63da107af5 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
@@ -32,6 +32,7 @@ class ReferrerTypeTest extends IntegrationTestCase
private $idSite1 = 1;
private $idSite2 = 2;
private $idSite3 = 3;
+ private $idSite4 = 4;
public function setUp()
{
@@ -44,7 +45,8 @@ class ReferrerTypeTest extends IntegrationTestCase
Fixture::createWebsite($date, $ecommerce, $name = 'test1', $url = 'http://piwik.org/foo/bar');
Fixture::createWebsite($date, $ecommerce, $name = 'test2', $url = 'http://piwik.org/');
- Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.pro/');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test3', $url = 'http://piwik.xyz/');
+ Fixture::createWebsite($date, $ecommerce, $name = 'test4', $url = 'http://google.com/subdir/', 1, null, null, null, null, $excludeUnknownUrls = 1);
$this->referrerType = new ReferrerType();
}
@@ -112,6 +114,19 @@ class ReferrerTypeTest extends IntegrationTestCase
// testing case where domain of referrer is not known to any site but neither is the URL, url != urlref
array(Common::REFERRER_TYPE_WEBSITE, $this->idSite3, 'http://example.org', 'http://example.com/bar'),
+
+ ####### testing specific case:
+ ## - ignore unknown urls is activated for idSite4
+
+ // referrer comes from another subdir, but same host => external website
+ array(Common::REFERRER_TYPE_WEBSITE, $this->idSite4, 'http://google.com/subdir/site', 'http://google.com/base'),
+ // referrer comes from same subdir and host => direct entry
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/page', 'http://google.com/subdir/x'),
+ array(Common::REFERRER_TYPE_DIRECT_ENTRY, $this->idSite4, 'http://google.com/subdir/', 'http://google.com/subdir/?q=test'),
+ // referrer comes from another subdir, but same host, query matches search engine definition => search engine
+ array(Common::REFERRER_TYPE_SEARCH_ENGINE, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.com/search?q=test'),
+ // referrer comes from search engine not matching site
+ array(Common::REFERRER_TYPE_SEARCH_ENGINE, $this->idSite4, 'http://google.com/subdir/index.html', 'http://google.fr/search?q=test')
);
}
diff --git a/plugins/Referrers/tests/Unit/SearchEngineTest.php b/plugins/Referrers/tests/Unit/SearchEngineTest.php
index e9f0c926ea..1b5cab4dbc 100644
--- a/plugins/Referrers/tests/Unit/SearchEngineTest.php
+++ b/plugins/Referrers/tests/Unit/SearchEngineTest.php
@@ -121,7 +121,7 @@ class SearchEngineTest extends \PHPUnit_Framework_TestCase
public function testMissingSearchEngineKeyword($url, $searchEngine)
{
$name = parse_url('http://' . $url);
- $this->assertTrue(!empty($searchEngine['params']), $name['host']);
+ $this->assertTrue(!empty($searchEngine['params']) || !empty($searchEngine['hiddenkeyword']), $name['host']);
}
/**
diff --git a/plugins/Resolution/lang/ar.json b/plugins/Resolution/lang/ar.json
index 7d9bfebc01..afc2e3dad1 100644
--- a/plugins/Resolution/lang/ar.json
+++ b/plugins/Resolution/lang/ar.json
@@ -3,6 +3,7 @@
"ColumnConfiguration": "الإعداد",
"ColumnResolution": "الكثافة النقطية",
"Configurations": "الإعدادات",
+ "PluginDescription": "يوضّح كثافة شاشة زوارك.",
"Resolutions": "الكثافات النقطية",
"WidgetGlobalVisitors": "الإعدادات العامة للزوار",
"WidgetResolutions": "كثافات الشاشة النقطية"
diff --git a/plugins/Resolution/lang/tr.json b/plugins/Resolution/lang/tr.json
index e24e8020cf..d0ba931102 100644
--- a/plugins/Resolution/lang/tr.json
+++ b/plugins/Resolution/lang/tr.json
@@ -1,11 +1,12 @@
{
"Resolution": {
- "ColumnConfiguration": "Konfigürasyon",
+ "ColumnConfiguration": "Yapılandırma",
"ColumnResolution": "Çözünürlük",
- "Configurations": "Konfigürasyonları",
- "PluginDescription": "Ziyaretçinin ekran çözünürlüklerini raporla",
+ "Configurations": "Yapılandırmalar",
+ "PluginDescription": "Ziyaretçinin ekran çözünürlüklerini bildirir.",
"Resolutions": "Çözünürlükler",
- "WidgetGlobalVisitors": "Global ziyaretçi konfikasyonu",
- "WidgetResolutions": "Ekran çözünürlükleri"
+ "WidgetGlobalVisitors": "Ziyaretçi Yapılandırması",
+ "WidgetGlobalVisitorsDocumentation": "Bu rapor ziyaretçilerinizin genel yapılandırmasını görüntüler. Yapılandırma bilgilerinde, işletim sistemi, web tarayıcı türü ve ekran çözünürlüğü bulunur.",
+ "WidgetResolutions": "Ekran Çözünürlüğü"
}
} \ No newline at end of file
diff --git a/plugins/Resolution/lang/uk.json b/plugins/Resolution/lang/uk.json
index 546bbaec47..038cb2362b 100644
--- a/plugins/Resolution/lang/uk.json
+++ b/plugins/Resolution/lang/uk.json
@@ -2,9 +2,11 @@
"Resolution": {
"ColumnConfiguration": "Конфігурація",
"ColumnResolution": "Роздільна здатність",
- "Configurations": "Конфігурації",
- "Resolutions": "Роздільні здатності",
- "WidgetGlobalVisitors": "Загальна конфігурація відвідувачів",
- "WidgetResolutions": "Роздільні здатності"
+ "Configurations": "По конфігурації",
+ "PluginDescription": "Повідомляє про роздільну здатність дисплея відвідувачів.",
+ "Resolutions": "По роздільній здатності моніторів",
+ "WidgetGlobalVisitors": "Глобальна конфігурація",
+ "WidgetGlobalVisitorsDocumentation": "Цей звіт показує загальну інформацію з найбільш популярними конфігураціями системи ваших відвідувачів. Конфігурація - це комбінація операційної системи, браузера і роздільної здатності дисплею.",
+ "WidgetResolutions": "По роздільній здатності моніторів"
}
} \ No newline at end of file
diff --git a/plugins/SEO/lang/ru.json b/plugins/SEO/lang/ru.json
index 5d2ed02d02..1383e4bac4 100644
--- a/plugins/SEO/lang/ru.json
+++ b/plugins/SEO/lang/ru.json
@@ -1,5 +1,6 @@
{
"SEO": {
+ "PluginDescription": "Этот плагин извлекает и отображает метрику SEO: веб-ранг Alexa, Google Pagerank, количество индексированных страниц и обратных ссылок на текущий выбранный веб-сайт.",
"AlexaRank": "Рейтинг Alexa",
"Bing_IndexedPages": "Страниц в индексе Bing",
"Dmoz": "Записей в каталоге DMOZ",
diff --git a/plugins/SEO/lang/sl.json b/plugins/SEO/lang/sl.json
index 5ac941f3c9..dab55ee7b8 100644
--- a/plugins/SEO/lang/sl.json
+++ b/plugins/SEO/lang/sl.json
@@ -1,7 +1,9 @@
{
"SEO": {
+ "PluginDescription": "Ta vtičnik izlušči in prikaže SEO metriko: Alexa web rangiranje, Google Pagerank, število indeksiranih strani in povratnih povezav za trenutno izbrane spletne strani.",
"AlexaRank": "Alexa položaj",
"Bing_IndexedPages": "Bing indeksirane strani",
+ "Dmoz": "DMOZ vnosi",
"DomainAge": "Starost domene",
"Google_IndexedPages": "Google indeksirane strani",
"Rank": "Položaj",
diff --git a/plugins/SEO/lang/sq.json b/plugins/SEO/lang/sq.json
index cf6e1cf597..d602da9078 100644
--- a/plugins/SEO/lang/sq.json
+++ b/plugins/SEO/lang/sq.json
@@ -1,8 +1,11 @@
{
"SEO": {
+ "PluginDescription": "Kjo shtojcë përfton dhe shfaq matje SEO: renditje web Alexa, Google Pagerank, numër faqesh të përfshira në tregues dhe paslidhje të sajtit të përzgjedhur në atë çast.",
"AlexaRank": "Renditje Alexa",
+ "Bing_IndexedPages": "Faqe të indeksuara nga Bing",
"Dmoz": "Zëra DMOZ",
"DomainAge": "Moshë Përkatësie",
+ "Google_IndexedPages": "Faqe të indeksuara nga Google",
"Rank": "Renditje",
"SeoRankings": "Renditje SEO",
"SEORankingsFor": "Renditje SEO për %s"
diff --git a/plugins/SEO/lang/uk.json b/plugins/SEO/lang/uk.json
index 5b8d9ec566..04c18f9b2f 100644
--- a/plugins/SEO/lang/uk.json
+++ b/plugins/SEO/lang/uk.json
@@ -1,9 +1,13 @@
{
"SEO": {
- "AlexaRank": "Alexa Rank",
+ "PluginDescription": "Цей плагін витягує і відображає метрики SEO: Alexa рейтинг, Google Pagerank, кількість проіндексованих сторінок і зворотних посилань в даний момент на сайт.",
+ "AlexaRank": "Рейтинг Alexa",
+ "Bing_IndexedPages": "Сторінок в індексі Bing",
+ "Dmoz": "Записів в каталозі DMOZ",
"DomainAge": "Вік домену",
- "Rank": "Rank",
- "SeoRankings": "SEO Рейтинги",
- "SEORankingsFor": "SEO Рейтинги за %s"
+ "Google_IndexedPages": "Сторінок в індексі Google",
+ "Rank": "Рейтинг",
+ "SeoRankings": "SEO-рейтинги",
+ "SEORankingsFor": "SEO рейтинги для %s"
}
} \ No newline at end of file
diff --git a/plugins/ScheduledReports/ScheduledReports.php b/plugins/ScheduledReports/ScheduledReports.php
index b966706cfc..df6744f673 100644
--- a/plugins/ScheduledReports/ScheduledReports.php
+++ b/plugins/ScheduledReports/ScheduledReports.php
@@ -192,9 +192,6 @@ class ScheduledReports extends \Piwik\Plugin
$filteredReportMetadata = array();
foreach ($availableReportMetadata as $reportMetadata) {
// removing reports from the API category and MultiSites.getOne
- if (empty($reportMetadata['category'])) {
- var_dump($reportMetadata);exit;
- }
if (
$reportMetadata['category'] == 'API' ||
$reportMetadata['category'] == Piwik::translate('General_MultiSitesSummary') && $reportMetadata['name'] == Piwik::translate('General_SingleWebsitesDashboard')
@@ -437,7 +434,7 @@ class ScheduledReports extends \Piwik\Plugin
// If running from piwik.php with debug, we ignore the 'email not sent' error
$tracker = new Tracker();
if (!$tracker->isDebugModeEnabled()) {
- throw new Exception("An error occured while sending '$filename' " .
+ throw new Exception("An error occurred while sending '$filename' " .
" to " . implode(', ', $mail->getRecipients()) .
". Error was '" . $e->getMessage() . "'");
}
diff --git a/plugins/ScheduledReports/lang/es.json b/plugins/ScheduledReports/lang/es.json
index 451bafb8ea..53b295f107 100644
--- a/plugins/ScheduledReports/lang/es.json
+++ b/plugins/ScheduledReports/lang/es.json
@@ -24,9 +24,11 @@
"Pagination": "Página %1$s de %2$s",
"PiwikReports": "Informes Piwik",
"PleaseFindAttachedFile": "Encuentre el informe en el archivo adjunto su %1$s informe por %2$s.",
+ "SentFromX": "Enviar informe desde %s.",
"PleaseFindBelow": "Por favor encuentre debajo su %1$s informe para %2$s.",
"PluginDescription": "Cree informes personalizados y prográmelos para ser enviados por correo electrónico diaria, semanal o mensualmente a uno o varias personas. Algunos formatos de informe están soportados (html, pdf, csv, imágenes).",
"ReportFormat": "Formato del informe",
+ "ReportHour": "Enviar informe a las %s horas",
"ReportIncludeNWebsites": "El informe incluirá las principales métricas para todos los sitios de internet con al menos una visita (de todo %s los sitios de internet disponibles).",
"ReportSent": "Informe enviado",
"ReportsIncluded": "Estadísticas incluidas",
diff --git a/plugins/ScheduledReports/lang/it.json b/plugins/ScheduledReports/lang/it.json
index 447e4fe26c..f554f5d432 100644
--- a/plugins/ScheduledReports/lang/it.json
+++ b/plugins/ScheduledReports/lang/it.json
@@ -6,7 +6,7 @@
"AggregateReportsFormat_TablesOnly": "(predefinito) Mostra tabelle (Grafici solo per le metriche chiave)",
"AlsoSendReportToTheseEmails": "Manda il report anche a questi indirizzi email (un indirizzo email per riga):",
"AreYouSureDeleteReport": "Sei sicuro di voler eliminare questo report e la sua programmazione?",
- "CancelAndReturnToReports": "Annulla e %1$storna alla lista dei report%2$s",
+ "CancelAndReturnToReports": "Annulla e %1$storna all'elenco dei report%2$s",
"CreateAndScheduleReport": "Crea e programma un report",
"CreateReport": "Crea Report",
"CustomVisitorSegment": "Segento Personalizzato Visitatore:",
@@ -35,7 +35,7 @@
"ReportType": "Invia report tramite",
"ReportUpdated": "Report aggiornato",
"Segment_Deletion_Error": "Questo segmento non può essere eliminato o reso invisibile agli altri utenti perchè è utilizzato per generare %s report(s) email. Si prega di riprovare dopo aver rimosso questo segmento da questo report.",
- "Segment_Help": "È possibile selezionare un segmento personalizzato esistente da applicare ai dati in questo report e-mail. È possibile creare e modificare segmenti personalizzati nella vostra dashboard%1$s (clicca qui per aprire)%2$s, quindi fare clic sulla casella di controllo \"%3$s\", quindi su \"%4$s\".",
+ "Segment_Help": "È possibile selezionare un segmento personalizzato esistente da applicare ai dati in questo report e-mail. È possibile creare e modificare segmenti personalizzati nella tua dashboard %1$s(clicca qui per aprire)%2$s, quindi clicca sulla casella di controllo \"%3$s\", quindi su \"%4$s\".",
"SegmentAppliedToReports": "Ai report è applicato il segmento'%s'.",
"SendReportNow": "Invia report adesso",
"SendReportTo": "Invia il report a",
diff --git a/plugins/ScheduledReports/lang/sq.json b/plugins/ScheduledReports/lang/sq.json
index ec8e9db5d4..9cc1a288a3 100644
--- a/plugins/ScheduledReports/lang/sq.json
+++ b/plugins/ScheduledReports/lang/sq.json
@@ -9,24 +9,40 @@
"CancelAndReturnToReports": "Anuloje dhe %1$skthehu te lista e raporteve%2$s",
"CreateAndScheduleReport": "Krijoni dhe Planifikoni një raport",
"CreateReport": "Krijoje Raportin",
+ "CustomVisitorSegment": "Segment Vetjak i Vizitorit",
"DescriptionOnFirstPage": "Përshkrimi i raportit do të shfaqet te faqja e parë e raportit.",
+ "DisplayFormat_TablesOnly": "Shfaq vetëm Tabela (jo grafikë)",
"EmailHello": "Tungjatjeta,",
"EmailReports": "Dërgo Raportet Me Email",
"EmailSchedule": "Plan Dërgimi me Email",
+ "EvolutionGraph": "Shfaq Grafikë Historie për %s vlerat kryesuese",
"FrontPage": "Faqja Ballore",
+ "PersonalEmailReports": "Raporte Personalë Me Email",
"MonthlyScheduleHelp": "Planifikim mujor: raporti do të dërgohet ditën e parë të çdo muaji.",
"MustBeLoggedIn": "Duhet të jeni i futur që të krijoni dhe të planifikoni raporte të personalizuar.",
+ "NoRecipients": "Ky raport s’ka marrës",
"Pagination": "Faqja %1$s nga %2$s",
"PiwikReports": "Raporte Piwik",
"PleaseFindAttachedFile": "Ju lutem, shihni te kartela bashkangjitur %1$s raportin tuaj për %2$s.",
+ "SentFromX": "Dërguar prej %s.",
"PleaseFindBelow": "Ju lutem, shihni më poshtë raportin tuaj %1$s për %2$s.",
+ "PluginDescription": "Krijoni raporte vetjakë dhe planifikoni për ta dërgimin me email përditë, për javë ose për muaj, te një ose disa vetë. Mbulohen një numër formatesh raportesh (html, pdf, csv, figura).",
"ReportFormat": "Format Raporti",
+ "ReportHour": "Dërgoje raportin më %s",
+ "ReportIncludeNWebsites": "Raporti do të përfshijë matjet kryesore për krejt sajtet që kanë të paktën një vizitë (prej sajtesh %s të përdorshëm deri sot).",
+ "ReportSent": "Raporti u dërgua",
"ReportsIncluded": "Përfshi statistikat",
+ "ReportType": "Dërgoje raportin përmes",
+ "ReportUpdated": "Raporti u përditësua",
+ "Segment_Deletion_Error": "Ky segment s’mund të fshihet ose të bëhet i padukshëm për përdoruesit e tjerë, ngaqë përdoret për të prodhuar raport(e) email për %s. Ju lutemi, riprovoni pas heqjes së këtij segmenti nga ky raport(e).",
+ "Segment_Help": "Mund të zgjidhni një segment ekzistues vetjak për ta zbatuar mbi të dhënat për këtë raport email. Segmente vetjakë mund të krijoni dhe përpunoni te pulti juaj %1$s(klikoni këtu që ta hapni)%2$s, mandej të klikoni mbi kutinë \"%3$s\", mandej \"%4$s\".",
+ "SegmentAppliedToReports": "Segmenti '%s' është zbatuar për këtë raport.",
"SendReportNow": "Dërgoje Raportin tani",
"SendReportTo": "Raportin dërgoje te",
"SentToMe": "Dërgoma mua",
"TableOfContent": "Listë raportesh",
"ThereIsNoReportToManage": "S’ka raport që mund të administrohet për sajtin %s",
+ "TopLinkTooltip": "Krijoni Raporte Me Email, që statistikat Piwik të dërgohen vetvetiu në email-in tuaj ose në adresat e klientëve tuaj!",
"TopOfReport": "Mbrapsht në krye",
"UpdateReport": "Përditësoje Raportin",
"WeeklyScheduleHelp": "Planifikim javor: raporti do të dërgohet të Hënën e parë të çdo jave."
diff --git a/plugins/ScheduledReports/lang/sv.json b/plugins/ScheduledReports/lang/sv.json
index f454b002aa..1eec17bb67 100644
--- a/plugins/ScheduledReports/lang/sv.json
+++ b/plugins/ScheduledReports/lang/sv.json
@@ -17,6 +17,7 @@
"EmailSchedule": "Schemalagd e-post",
"EvolutionGraph": "Visa historiska grafer för dom topp %s värdena",
"FrontPage": "Startsida",
+ "PersonalEmailReports": "Personliga e-postrapporter",
"MonthlyScheduleHelp": "Månatligt schema: Rapporten kommer att skickas ut den första dagen i varje månad.",
"MustBeLoggedIn": "Du måste vara inloggad för att skapa och schemalägga anpassade rapporter.",
"NoRecipients": "Rapporten har ingen mottagare",
@@ -25,7 +26,9 @@
"PleaseFindAttachedFile": "Du finner din rapport %1$s i den bifogade filen för %2$s.",
"SentFromX": "Skickat från %s.",
"PleaseFindBelow": "Nedan hittar du din %1$s rapport för %2$s.",
+ "PluginDescription": "Skapa anpassade rpaporter och schemalägg att dom ska skickas ut dagligen, veckovis eller månadsvis till en eller flera personer. Det finns stöd för flera format (html, pdf, csv och bilder).",
"ReportFormat": "Rapportformat",
+ "ReportHour": "Skicka rapporten klockan %s",
"ReportIncludeNWebsites": "Rapporten kommer att innehålla viktiga mättal för alla webbplatser som har minst ett besök (från %s webbsidorna som för tillfället är tillgängliga).",
"ReportSent": "Rapport skickad",
"ReportsIncluded": "Statistik ingår",
diff --git a/plugins/ScheduledReports/lang/uk.json b/plugins/ScheduledReports/lang/uk.json
index c0ed63b792..0e65e66090 100644
--- a/plugins/ScheduledReports/lang/uk.json
+++ b/plugins/ScheduledReports/lang/uk.json
@@ -1,15 +1,50 @@
{
"ScheduledReports": {
- "AlsoSendReportToTheseEmails": "Також надсилати звіти на наступні е-майли (кожен з нового рядка):",
+ "AggregateReportsFormat": "(необов'язково) Параметри відображення",
+ "AggregateReportsFormat_GraphsOnly": "Відображати тільки графіки (без звітних таблиць)",
+ "AggregateReportsFormat_TablesAndGraphs": "Відображати таблиці і графіки для всіх звітів",
+ "AggregateReportsFormat_TablesOnly": "(за замовчуванням) Відображати таблиці звітів (графіки тільки для ключових показетелей)",
+ "AlsoSendReportToTheseEmails": "Також відправляти звіти на наступні e-mail адреси (по одній в кожному рядку):",
+ "AreYouSureDeleteReport": "Ви впевнені, що хочете видалити звіт і його розклад?",
+ "CancelAndReturnToReports": "Скасувати та %1$sповернутися до списку звітів%2$s",
+ "CreateAndScheduleReport": "Створити і налаштувати розклад звітів",
+ "CreateReport": "Створити звітність",
+ "CustomVisitorSegment": "Cегмент відвідувачів:",
+ "DescriptionOnFirstPage": "Опис звіту відображається на першій сторінці звіту.",
+ "DisplayFormat_TablesOnly": "Відображати тільки таблиці (без графіків)",
"EmailHello": "Привіт,",
- "EmailReports": "Звіти на е-майл",
- "EmailSchedule": "Розклад розсилки",
- "MonthlyScheduleHelp": "Щомісячний розклад: звіт буде надсилатися в перший день кожного місяця",
- "PiwikReports": "Звіти Piwik",
- "PleaseFindAttachedFile": "Прикріплений файл є звітом %1$s від %2$s.",
+ "EmailReports": "Email-звіти",
+ "EmailSchedule": "Розклад e-mail розсилки",
+ "EvolutionGraph": "Показати історію зміни графіка для перших %s значень.",
+ "FrontPage": "Перша сторінка",
+ "PersonalEmailReports": "Персональні email-звіти",
+ "MonthlyScheduleHelp": "Щомісячне розклад: звіти будуть розсилатися кожний перший день місяця.",
+ "MustBeLoggedIn": "Ви повинні бути авторизовані для створення і редагування розкладу звітів.",
+ "NoRecipients": "У цього звіту одержувачів немає",
+ "Pagination": "Сторінка %1$s з %2$s",
+ "PiwikReports": "Звіти веб-аналітики",
+ "PleaseFindAttachedFile": "До цього листа прикріплений файл %1$s, що є звітом для %2$s.",
+ "SentFromX": "Відправлено від %s.",
+ "PleaseFindBelow": "Будь ласка, нижче вашого %1$s звіт за %2$s.",
+ "PluginDescription": "Створює користувальницькі звіти і планує їх відправку поштою щодня, щотижня або щомісяця для одного або кількох людей. Підтримує деякі формати звітів (html, pdf, csv, зображення).",
+ "ReportFormat": "Формат звіту",
+ "ReportHour": "Відправити звіт о %s годині",
+ "ReportIncludeNWebsites": "Звіт буде містити основні показники для всіх сайтів, у яких було хоча б одне відвідування (всього зараз доступно %s сайтів).",
+ "ReportSent": "Надіслати звіт",
+ "ReportsIncluded": "Дані, включені у звіт",
+ "ReportType": "Відправити звіт за допомогою",
+ "ReportUpdated": "Звіт оновлено",
+ "Segment_Deletion_Error": "Цей сегмент не може бути видалений або зроблений невидимим для інших користувачів, оскільки він використовується для створення звіту по електронній пошті %s. Повторіть спробу після видалення сегмента з цієї доповіді(дей).",
+ "Segment_Help": "Ви можете вибрати існуючий сегмент для застосування до даних цього звіту. Ви можете створювати і редагувати користувальницькі сегменти на панелі інструментів %1$s(натисніть тут, щоб відкрити)%2$s, натисніть далі на \"%3$s\", потім \"%4$s\".",
+ "SegmentAppliedToReports": "Сегмент '%s' застосовується до доповідей.",
"SendReportNow": "Надіслати звіт зараз",
- "SendReportTo": "Надіслати звіт на:",
- "SentToMe": "Надіслати мені",
- "WeeklyScheduleHelp": "Щотижневий розклад: звіт буде надсилатися в понелілок кожного тижня"
+ "SendReportTo": "Одержувачі",
+ "SentToMe": "Відправити мені",
+ "TableOfContent": "Аркуш звіту",
+ "ThereIsNoReportToManage": "У вас поки немає звітності для сайту %s",
+ "TopLinkTooltip": "Створіть Email-звіти в Piwik, щоб отримувати їх прямо на вашу електронну пошту або електрону пошту ваших клієнтів автоматично!",
+ "TopOfReport": "Повернутися наверх",
+ "UpdateReport": "Оновити звітність",
+ "WeeklyScheduleHelp": "Щотижневий розклад: звіти будуть розсилатися кожен понеділок."
}
} \ No newline at end of file
diff --git a/plugins/SegmentEditor/SegmentFormatter.php b/plugins/SegmentEditor/SegmentFormatter.php
index 19838d46d5..99052f5f4f 100644
--- a/plugins/SegmentEditor/SegmentFormatter.php
+++ b/plugins/SegmentEditor/SegmentFormatter.php
@@ -9,6 +9,7 @@
namespace Piwik\Plugins\SegmentEditor;
use Exception;
+use Piwik\Common;
use Piwik\Config;
use Piwik\Db;
use Piwik\Piwik;
@@ -111,7 +112,7 @@ class SegmentFormatter
$translation = Piwik::translate($this->matchesMetric[$operator]);
}
- return strtolower($translation);
+ return Common::mb_strtolower($translation);
}
private function getFormattedValue($operand)
diff --git a/plugins/SegmentEditor/SegmentQueryDecorator.php b/plugins/SegmentEditor/SegmentQueryDecorator.php
index d501f6f9b1..130cc59bd5 100644
--- a/plugins/SegmentEditor/SegmentQueryDecorator.php
+++ b/plugins/SegmentEditor/SegmentQueryDecorator.php
@@ -9,6 +9,7 @@
namespace Piwik\Plugins\SegmentEditor;
use Piwik\DataAccess\LogQueryBuilder;
+use Piwik\Plugin\LogTablesProvider;
use Piwik\Plugins\SegmentEditor\Services\StoredSegmentService;
use Piwik\Segment\SegmentExpression;
use Piwik\SettingsServer;
@@ -26,9 +27,10 @@ class SegmentQueryDecorator extends LogQueryBuilder
*/
private $storedSegmentService;
- public function __construct(StoredSegmentService $storedSegmentService)
+ public function __construct(StoredSegmentService $storedSegmentService, LogTablesProvider $logTablesProvider)
{
$this->storedSegmentService = $storedSegmentService;
+ parent::__construct($logTablesProvider);
}
public function getSelectQueryString(SegmentExpression $segmentExpression, $select, $from, $where, $bind, $groupBy,
diff --git a/plugins/SegmentEditor/SegmentSelectorControl.php b/plugins/SegmentEditor/SegmentSelectorControl.php
index 72be071e5e..560af449fa 100644
--- a/plugins/SegmentEditor/SegmentSelectorControl.php
+++ b/plugins/SegmentEditor/SegmentSelectorControl.php
@@ -9,11 +9,13 @@
namespace Piwik\Plugins\SegmentEditor;
use Piwik\API\Request;
+use Piwik\ArchiveProcessor\Rules;
use Piwik\Common;
use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Plugins\API\API as APIMetadata;
+use Piwik\Plugins\UsersManager\API AS UsersManagerAPI;
use Piwik\View\UIControl;
use Piwik\Plugins\SegmentEditor\API as SegmentEditorAPI;
@@ -53,7 +55,7 @@ class SegmentSelectorControl extends UIControl
&& ($segment['type'] == 'metric' && $segment['segment'] != 'visitIp')
) {
$metricsLabel = Piwik::translate('General_Metrics');
- $metricsLabel[0] = strtolower($metricsLabel[0]);
+ $metricsLabel[0] = Common::mb_strtolower($metricsLabel[0]);
$segment['category'] .= ' (' . $metricsLabel . ')';
}
$segmentsByCategory[$segment['category']][] = $segment;
@@ -78,6 +80,8 @@ class SegmentSelectorControl extends UIControl
$this->authorizedToCreateSegments = SegmentEditorAPI::getInstance()->isUserCanAddNewSegment($this->idSite);
$this->isUserAnonymous = Piwik::isUserIsAnonymous();
$this->segmentTranslations = $this->getTranslations();
+ $this->segmentProcessedOnRequest = Rules::isBrowserArchivingAvailableForSegments();
+ $this->hideSegmentDefinitionChangeMessage = UsersManagerAPI::getInstance()->getUserPreference(Piwik::getCurrentUserLogin(), 'hideSegmentDefinitionChangeMessage');
}
public function getClientSideProperties()
diff --git a/plugins/SegmentEditor/javascripts/Segmentation.js b/plugins/SegmentEditor/javascripts/Segmentation.js
index f80f3fa193..59340ac4a7 100644
--- a/plugins/SegmentEditor/javascripts/Segmentation.js
+++ b/plugins/SegmentEditor/javascripts/Segmentation.js
@@ -1102,7 +1102,46 @@ Segmentation = (function($) {
jQuery.extend(params, {
"idSegment": segmentId
});
- self.updateMethod(params);
+
+ if(segmentStr != getSegmentFromId(segmentId).definition && $('.segment-definition-change-confirm').data('hideMessage') != 1) {
+ var isBrowserArchivingAvailableForSegments = $('.segment-definition-change-confirm').data('segmentProcessedOnRequest');
+ var isRealTimeSegment = (autoArchive == 0);
+ var segmentNotProcessedOnRequest = !isBrowserArchivingAvailableForSegments || !isRealTimeSegment;
+
+ $('.process-on-request, .no-process-on-request').hide();
+
+ if (segmentNotProcessedOnRequest) {
+ $('.no-process-on-request').show();
+ } else {
+ $('.process-on-request').show();
+ }
+
+ piwikHelper.modalConfirm('.segment-definition-change-confirm', {
+ yes: function () {
+ if ($('#hideSegmentMessage:checked').length) {
+ var ajaxHandler = new ajaxHelper();
+ ajaxHandler.setLoadingElement();
+ ajaxHandler.addParams({
+ "module": 'API',
+ "format": 'json',
+ "method": 'UsersManager.setUserPreference',
+ "userLogin": piwik.userLogin,
+ "preferenceName": "hideSegmentDefinitionChangeMessage",
+ "preferenceValue": "1"
+ }, 'GET');
+ ajaxHandler.useCallbackInCaseOfError();
+ ajaxHandler.setCallback(function (response) {
+ self.updateMethod(params);
+ });
+ ajaxHandler.send(true);
+ } else {
+ self.updateMethod(params);
+ }
+ }
+ });
+ } else {
+ self.updateMethod(params);
+ }
}
};
diff --git a/plugins/SegmentEditor/lang/cs.json b/plugins/SegmentEditor/lang/cs.json
index 9751d2b848..d52a43b0c0 100644
--- a/plugins/SegmentEditor/lang/cs.json
+++ b/plugins/SegmentEditor/lang/cs.json
@@ -6,11 +6,14 @@
"AreYouSureDeleteSegment": "Opravdu chcete odstranit tento segment?",
"AutoArchivePreProcessed": "Segmentovaná hlášení jsou předzpracována rychleji (vyžadují cron)",
"AutoArchiveRealTime": "Segmentovaná hlášení jsou zpracována v reálném čase",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "Chystáte se změnit definici segmentu. Analytická data pro tento nový segment budou zobrazena až po novém vypracování reportů. Zobrazení nových dat pro upravený segment může zabrat až několik hodin. Přesto pokračovat?",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "Chystáte se změnit definici segmentu. Analytická data pro tento nový segment budou zpracována dle potřeby při jejich vyžádání. Zobrazení reportů může trvat několik minut. Přesto pokračovat?",
"ChooseASegment": "Zvolte segment",
"CurrentlySelectedSegment": "Aktuálně vybraný segment: %s",
"DataAvailableAtLaterDate": "Vaše segmentovaná analytická hlášení budou dostupná později. Omlouváme se za tuto nepříjemnost.",
"DefaultAllVisits": "Všechny návštěvy",
"DragDropCondition": "Přetáhněte podmínku",
+ "HideMessageInFuture": "Již tuto zprávu nezobrazovat",
"LoadingSegmentedDataMayTakeSomeTime": "Zpracování segmentovaných dat návštěvníků může pár minut trvat...",
"OperatorAND": "AND",
"OperatorOR": "OR",
diff --git a/plugins/SegmentEditor/lang/de.json b/plugins/SegmentEditor/lang/de.json
index 7e9a75ef96..4b852598d2 100644
--- a/plugins/SegmentEditor/lang/de.json
+++ b/plugins/SegmentEditor/lang/de.json
@@ -6,11 +6,14 @@
"AreYouSureDeleteSegment": "Möchten Sie dieses Segment wirklich löschen?",
"AutoArchivePreProcessed": "Segmentierte Berichte werden im Voraus verarbeitet (schneller, benötigt archive.php Cron)",
"AutoArchiveRealTime": "Segmentierte Berichte werden in Echtzeit verarbeitet.",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "Sie sind dabei die Definition des Segments zu ändern. Die Berichte für dieses neue Segment stehen erst zur Verfügung sobald sie berechnet wurden. Es könnte einige Stunden dauern bis Daten für das Segment angezeigt werden. Möchten Sie trotzdem fortfahren?",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "Sie sind dabei die Definition des Segments zu ändern. Die Berichte für dieses neue Segment werden berechnet, sobald Sie das nächste mal angefragt werden. Es könnte einige Minuten dauern bis die Berichte erscheinen. Möchten Sie trotzdem fortfahren?",
"ChooseASegment": "Segment auswählen",
"CurrentlySelectedSegment": "Aktuell ausgewähltes Segment: %s",
"DataAvailableAtLaterDate": "Ihre segmentierten Analytik-Berichte stehen später zur Verfügung. Wir entschuldigen uns für die Unannehmlichkeit.",
"DefaultAllVisits": "Alle Besuche",
"DragDropCondition": "Bedingung durch Drag & Drop hinzufügen",
+ "HideMessageInFuture": "Diese Meldung nicht mehr anzeigen",
"LoadingSegmentedDataMayTakeSomeTime": "Die Verarbeitung der segmentierten Besucherdaten kann einige Minuten dauern...",
"OperatorAND": "UND",
"OperatorOR": "ODER",
diff --git a/plugins/SegmentEditor/lang/el.json b/plugins/SegmentEditor/lang/el.json
index 96d5e2256b..7d45edd36a 100644
--- a/plugins/SegmentEditor/lang/el.json
+++ b/plugins/SegmentEditor/lang/el.json
@@ -6,11 +6,14 @@
"AreYouSureDeleteSegment": "Είστε σίγουροι για τη διαγραφή του τμήματος;",
"AutoArchivePreProcessed": "οι αναφορές τμημάτων προεπεξεργάζονται (γρηγορότερα, απαιτείται το archive.php με cron)",
"AutoArchiveRealTime": "οι αναφορές τμημάτων επεξεργάζονται σε πραγματικό χρόνο",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "Πρόκειται να αλλάξετε τον ορισμό της κατάτμησης. Η αναφορά αναλυτικών για τη νέα κατάτμηση δε θα είναι διαθέσιμη μέχρι να γίνει και πάλι επεξεργασία των αναφορών. Ενδέχεται να διαρκέσει λίγες ώρες μέχρι να εμφανιστούν δεδομένα αναφοράς για αυτή την κατάτμηση. Θέλετε να συνεχίσετε έτσι κι αλλιώς;",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "Πρόκειται να αλλάξετε τον ορισμό της κατάτμησης. Θα γίνει επεξεργασία της αναφοράς αναλυτικών για τη νέα κατάτμηση την επόμενη στιγμή που θα ζητηθεί. Οι αναφορές σας θα πάρουν λίγα λεπτά για να εμφανιστούν. Θέλετε να συνεχίσετε έτσι κι αλλιώς;",
"ChooseASegment": "Επιλέξτε ένα τμήμα",
"CurrentlySelectedSegment": "Επιλεγμένο τμήμα αυτή τη στιγμή: %s",
"DataAvailableAtLaterDate": "Οι τμηματικές αναφορές αναλυτικών θα είναι αργότερα διαθέσιμες. Ζητούμε συγγνώμη για την ταλαιπωρία.",
"DefaultAllVisits": "Όλες οι επισκέψεις",
"DragDropCondition": "Συνθήκη με Σύρε & Άσε",
+ "HideMessageInFuture": "Να μην εμφανίζεται το μήνυμα αυτό στο μέλλον",
"LoadingSegmentedDataMayTakeSomeTime": "Η επεξεργασία των δεδομένων των τμημάτων επισκεπτών μπορεί να διαρκέσει κάποια λεπτά...",
"OperatorAND": "ΚΑΙ",
"OperatorOR": "Ή",
diff --git a/plugins/SegmentEditor/lang/en.json b/plugins/SegmentEditor/lang/en.json
index 96e36c02b7..69621c015c 100644
--- a/plugins/SegmentEditor/lang/en.json
+++ b/plugins/SegmentEditor/lang/en.json
@@ -6,11 +6,14 @@
"AreYouSureDeleteSegment": "Are you sure you want to delete this segment?",
"AutoArchivePreProcessed": "segmented reports are pre-processed (faster, requires cron)",
"AutoArchiveRealTime": "segmented reports are processed in real time",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "You're about to change the segment definition. Your analytics reports for this new segment won't be available until the reports are re-processed. It may take a few hours for reports data to show for this segment. Proceed anyway?",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "You're about to change the segment definition. Your analytics reports for this new segment will be re-processed on demand the next time you request them. Your reports may take a few minutes to appear. Proceed anyway?",
"ChooseASegment": "Choose a segment",
"CurrentlySelectedSegment": "Currently selected segment: %s",
"DataAvailableAtLaterDate": "Your segmented analytics reports will be available later. We apologize for the inconvenience.",
"DefaultAllVisits": "All visits",
"DragDropCondition": "Drag & Drop condition",
+ "HideMessageInFuture": "Hide this message in the future",
"LoadingSegmentedDataMayTakeSomeTime": "Processing segmented visitor data may take a few minutes...",
"OperatorAND": "AND",
"OperatorOR": "OR",
diff --git a/plugins/SegmentEditor/lang/es.json b/plugins/SegmentEditor/lang/es.json
index ff1e7fd3b9..61e3945add 100644
--- a/plugins/SegmentEditor/lang/es.json
+++ b/plugins/SegmentEditor/lang/es.json
@@ -6,24 +6,36 @@
"AreYouSureDeleteSegment": "¿Está seguro que desea eliminar este segmento?",
"AutoArchivePreProcessed": "los informes segmentados son pre-procesados (rápidamente, requiere cron)",
"AutoArchiveRealTime": "los informes segmentados son procesados en tiempo real",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "Está próximo a cambiar la definición de este segmento. Sus informes analíticos para este nuevo segmento no estarán disponibles hasta que estos no sean reprocesados. Puede tomar unas pocas horas para que se observe información de este segmento. Aun así, proceder?",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "Está próximo a cambiar la definición de segmento. Sus informes analíticos para este nuevo segmento serán reprocesados bajo demanda la próxima vez que los peticione. Sus informes pueden tomar un par de minutos en aparecer. ¿Proceder de cualquier modo?",
"ChooseASegment": "Elegir un segmento",
+ "CurrentlySelectedSegment": "Segmento seleccionado actualmente: %s",
"DataAvailableAtLaterDate": "Sus informes analíticos segmentados estarán disponibles más tarde. Lamentamos la inconveniencia.",
"DefaultAllVisits": "Todas las visitas",
"DragDropCondition": "Arrastrar & soltar condición",
+ "HideMessageInFuture": "Ocultar este mensaje en el futuro",
"LoadingSegmentedDataMayTakeSomeTime": "Procesando los datos de visitante segmentados pueden tomar unos minutos…",
"OperatorAND": "Y",
"OperatorOR": "O",
"SaveAndApply": "Guardar & aplicar",
"SegmentDisplayedAllWebsites": "todos los sitios de internet",
"SegmentDisplayedThisWebsiteOnly": "este sitio de internet únicamente",
+ "SegmentIsDisplayedForWebsite": "y procesado por",
"SegmentNotApplied": "Segmento '%s' no aplicado",
"SegmentNotAppliedMessage": "Está solicitando datos para el segmento personalizado '%s', esta configuración de Piwik actualmente impide el proceso en tiempo real de informes por razones de rendimiento.",
+ "SelectSegmentOfVisits": "Seleccione un segmento de visitas:",
"ThisSegmentIsVisibleTo": "Este segmento es visible para:",
"VisibleToAllUsers": "todos los usuarios",
"VisibleToMe": "yo",
"YouMayChangeSetting": "Alternativamente puede cambiar la configuración en el archivo config (%1$s) o modificar este segmento y elegir '%2$s'.",
+ "VisibleToSuperUser": "Visible para usted debido a que posee un acceso de Super Usuario",
+ "SharedWithYou": "Compartido con usted",
"YouMustBeLoggedInToCreateSegments": "Debe estar conectado para crear y editar segmentos de usuario personalizados.",
"YouDontHaveAccessToCreateSegments": "No posee el nivel de acceso requerido para crear y editar segmentos.",
- "AddingSegmentForAllWebsitesDisabled": "Añadir segmentos para todos los sitios de internet se ha deshabilitado."
+ "AddingSegmentForAllWebsitesDisabled": "Añadir segmentos para todos los sitios de internet se ha deshabilitado.",
+ "SegmentXIsAUnionOf": "%s es una unión de estos segmentos:",
+ "CustomSegment": "Segmento personalizado",
+ "SegmentOperatorIsNullOrEmpty": "es nulo o vacío",
+ "SegmentOperatorIsNotNullNorEmpty": "no es nulo ni vacío"
}
} \ No newline at end of file
diff --git a/plugins/SegmentEditor/lang/fr.json b/plugins/SegmentEditor/lang/fr.json
index 1fb4502c8b..0928bd1efe 100644
--- a/plugins/SegmentEditor/lang/fr.json
+++ b/plugins/SegmentEditor/lang/fr.json
@@ -6,17 +6,21 @@
"AreYouSureDeleteSegment": "Êtes vous sûr(e) de vouloir supprimer ce segment?",
"AutoArchivePreProcessed": "les rapports segmentés sont pré-traités (plus rapide, requiert un cron sur archive.php)",
"AutoArchiveRealTime": "les rapports segmentés sont traités en temps réel",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "Vous vous apprêtez à changer la définition du segment. Vos rapports de statistiques pour ce nouveau segment ne seront pas disponibles avant que les rapports soient traités à nouveau. Cela peut prendre plusieurs heures pour que les données de rapports affichent ce segment. Voulez-vous continuer?",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "Vous vous apprêtez à changer la définition du segment. Vos rapports de statistiques pour ce segment vont être traités à nouveau à la demande la prochaine fois que vous le demanderez. Vos rapports pourront prendre plusieurs minutes à apparaître. Voulez-vous continuer?",
"ChooseASegment": "Choisir un segment",
"CurrentlySelectedSegment": "Segment sélectionné : %s",
"DataAvailableAtLaterDate": "Votre rapport d'analyse segmenté sera disponible plus tard. Veuillez nous excuser pour le désagrément.",
"DefaultAllVisits": "Toutes les visites",
"DragDropCondition": "Condition de Drag & Drop",
+ "HideMessageInFuture": "Cacher ce message à l'avenir",
"LoadingSegmentedDataMayTakeSomeTime": "Le traitement des données visiteurs segmentées peut prendre quelques minutes...",
"OperatorAND": "ET",
"OperatorOR": "OU",
"SaveAndApply": "Sauvegarder & appliquer",
"SegmentDisplayedAllWebsites": "tous les sites web",
"SegmentDisplayedThisWebsiteOnly": "ce site web uniquement",
+ "SegmentIsDisplayedForWebsite": "et traité pour",
"SegmentNotApplied": "Segment \"%s\" non appliqué",
"SegmentNotAppliedMessage": "Vous êtes en train de demander des données for le segment personnalisé '%s', la configuration actuelle de Piwik empêche la génération en temps réelle de rapport pour des raisons de performance.",
"SelectSegmentOfVisits": "Sélectionnez un segment de visites :",
diff --git a/plugins/SegmentEditor/lang/it.json b/plugins/SegmentEditor/lang/it.json
index 71e0b928bc..d496f574ab 100644
--- a/plugins/SegmentEditor/lang/it.json
+++ b/plugins/SegmentEditor/lang/it.json
@@ -6,11 +6,14 @@
"AreYouSureDeleteSegment": "Sei sicuro di voler eliminare questo segmento?",
"AutoArchivePreProcessed": "i reports segmentati sono pre-elaborati (più veloce, richiede un cron-job)",
"AutoArchiveRealTime": "i reports segmentati sono elaborati in tempo reale",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "Stai per cambiare la definizione del segmento. I tuoi report statistici per questo nuovo segmento non saranno disponibili fin quando essi non verranno elaborati. Questo può richiedere qualche ora per i dati da mostrare per questo segmento. Procedi lo stesso?",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "Stai per cambiare la definizione del segmento. I tuoi report statistici per questo nuovo segmento verranno elaborati su richiesta la prossima volta che li richiederai. I tuoi report possono richiedere qualche minuto per apparire. Procedi lo stesso?",
"ChooseASegment": "Scegli un segmento",
"CurrentlySelectedSegment": "Segmento attualmente selezionato: %s",
"DataAvailableAtLaterDate": "I report segmentati delle statistiche saranno disponibili più tardi. Ci scusiamo per l'inconveniente.",
"DefaultAllVisits": "Tutte le visite",
"DragDropCondition": "Copia & Incolla condizione",
+ "HideMessageInFuture": "Nascondi questo messaggio, in futuro",
"LoadingSegmentedDataMayTakeSomeTime": "L'elaborazione dei dati visitatore segmentati può richiedere qualche minuto...",
"OperatorAND": "E",
"OperatorOR": "O",
diff --git a/plugins/SegmentEditor/lang/nl.json b/plugins/SegmentEditor/lang/nl.json
index d8c1060c17..146d2b363f 100644
--- a/plugins/SegmentEditor/lang/nl.json
+++ b/plugins/SegmentEditor/lang/nl.json
@@ -10,6 +10,7 @@
"DataAvailableAtLaterDate": "De gesegmenteerde analyse rapporten zullen op een later tijdstip beschikbaar komen. Excuses voor het ongemak.",
"DefaultAllVisits": "Alle bezoeken",
"DragDropCondition": "Sleep en verplaats voorwaarde",
+ "HideMessageInFuture": "Dit bericht in de toekomst verbergen",
"LoadingSegmentedDataMayTakeSomeTime": "Verwerking van gesegmenteerde bezoeker gegevens kan enkele minuten duren ...",
"OperatorAND": "EN",
"OperatorOR": "OF",
diff --git a/plugins/SegmentEditor/lang/pt-br.json b/plugins/SegmentEditor/lang/pt-br.json
index faf1171950..c961e5d9e9 100644
--- a/plugins/SegmentEditor/lang/pt-br.json
+++ b/plugins/SegmentEditor/lang/pt-br.json
@@ -6,11 +6,14 @@
"AreYouSureDeleteSegment": "Confirma a exclusão deste segmento?",
"AutoArchivePreProcessed": "Relatórios segmentados são pré-processados ​​(Para agilizar, é necessário usar o cron em: archive.php)",
"AutoArchiveRealTime": "Relatórios segmentados são processados em tempo real",
+ "ChangingSegmentDefinitionConfirmationNotProcessedOnRequest": "Você está prestes a mudar a definição do segmento. Os relatórios analíticos para este novo segmento não estarão disponíveis até que os relatórios sejam reprocessados. Pode levar algumas horas para que os dados de relatórios mostrem para esse segmento. Continuar mesmo assim?",
+ "ChangingSegmentDefinitionConfirmationProcessedOnRequest": "Você está prestes a mudar a definição do segmento. Os relatórios analíticos para este novo segmento serão reprocessados sob demanda na próxima vez que solicitá-los. Seus relatórios pode demorar alguns minutos para aparecer. Continuar mesmo assim?",
"ChooseASegment": "Escolha um segmento",
"CurrentlySelectedSegment": "Segmento atualmente selecionado: %s",
"DataAvailableAtLaterDate": "Os seus relatórios de análise segmentados estarão disponíveis mais tarde. Pedimos desculpas pela inconveniência.",
"DefaultAllVisits": "Todas as visitas",
"DragDropCondition": "Condição Drag & Drop",
+ "HideMessageInFuture": "Ocultar esta mensagem no futuro",
"LoadingSegmentedDataMayTakeSomeTime": "O processamento segmentado de dados de visitantes pode demorar alguns mitutos...",
"OperatorAND": "e",
"OperatorOR": "ou",
diff --git a/plugins/SegmentEditor/lang/ru.json b/plugins/SegmentEditor/lang/ru.json
index ad9e928636..ac134deac9 100644
--- a/plugins/SegmentEditor/lang/ru.json
+++ b/plugins/SegmentEditor/lang/ru.json
@@ -1,5 +1,6 @@
{
"SegmentEditor": {
+ "PluginDescription": "Создать и повторно использовать пользовательские Сегменты посетителей с помощью Редактора сегментов.",
"AddANDorORCondition": "Добавить условие %s",
"AddNewSegment": "Добавить новый сегмент",
"AreYouSureDeleteSegment": "Вы уверены, что хотите удалить этот сегмент?",
diff --git a/plugins/SegmentEditor/lang/sv.json b/plugins/SegmentEditor/lang/sv.json
index 955e9da3b4..24ca92a229 100644
--- a/plugins/SegmentEditor/lang/sv.json
+++ b/plugins/SegmentEditor/lang/sv.json
@@ -1,11 +1,13 @@
{
"SegmentEditor": {
+ "PluginDescription": "Skapa och återanvänd anpassade Besökssegment med Segmenteditorn.",
"AddANDorORCondition": "Lägg till %s villkor",
"AddNewSegment": "Lägg till nytt segment",
"AreYouSureDeleteSegment": "Vill du verkligen radera detta segment?",
"AutoArchivePreProcessed": "Segmenterade rapporter processas i förväg (för att det ska gå fortare krävs archive.php data)",
"AutoArchiveRealTime": "Segmenterade rapporter processas i realtid",
"ChooseASegment": "Välj ett segment",
+ "CurrentlySelectedSegment": "Valt segment: %s",
"DataAvailableAtLaterDate": "Dina segmenterade analysrapporter kommer att finnas tillgänglig senare. Vi ber om ursäkt för besväret.",
"DefaultAllVisits": "Alla besök",
"DragDropCondition": "Dra & Droppa villkor",
@@ -15,14 +17,20 @@
"SaveAndApply": "Spara & Använd",
"SegmentDisplayedAllWebsites": "alla webbsidor",
"SegmentDisplayedThisWebsiteOnly": "endast denna webbsida",
+ "SegmentIsDisplayedForWebsite": "och behandlas för",
"SegmentNotApplied": "Segment '%s' tillämpas inte",
"SegmentNotAppliedMessage": "Du begär data för det Anpassade Segmentet '%s', denna Piwik konfiguration förhindrar realtidsbearbetning av rapporter pga prestandaskäl.",
+ "SelectSegmentOfVisits": "Välj ett segment av besök:",
"ThisSegmentIsVisibleTo": "Det här segmentet är synligt för:",
"VisibleToAllUsers": "alla användare",
"VisibleToMe": "jag",
"YouMayChangeSetting": "Alternativt kan du ändra inställningarna i konfigurationsfilen (%1$s), eller redigera detta Segment och välj '%2$s'.",
+ "VisibleToSuperUser": "Synligt för dig eftersom du har administratörsrättigheter",
+ "SharedWithYou": "Delat med dig",
"YouMustBeLoggedInToCreateSegments": "Du måste vara inloggad för att skapa och redigera besökssegment.",
"YouDontHaveAccessToCreateSegments": "Du har inte rättigheter för att skapa och redigera segment.",
+ "AddingSegmentForAllWebsitesDisabled": "Lägga till segment för alla webbplatser har inaktiverats.",
+ "SegmentXIsAUnionOf": "%s är en sammanslagning av dessa segment:",
"CustomSegment": "Anpassat segment",
"SegmentOperatorIsNullOrEmpty": "är null eller tom",
"SegmentOperatorIsNotNullNorEmpty": "är inte null och inte tom"
diff --git a/plugins/SegmentEditor/lang/uk.json b/plugins/SegmentEditor/lang/uk.json
new file mode 100644
index 0000000000..4c2c32c1eb
--- /dev/null
+++ b/plugins/SegmentEditor/lang/uk.json
@@ -0,0 +1,38 @@
+{
+ "SegmentEditor": {
+ "PluginDescription": "Створення та повторне використання користувальницьких сегментів відвідувачів з редактором сегменту.",
+ "AddANDorORCondition": "Добавить условие %s",
+ "AddNewSegment": "Додати новий сегмент",
+ "AreYouSureDeleteSegment": "Ви впевнені, що хочете видалити цей сегмент?",
+ "AutoArchivePreProcessed": "сегментовані звіти проходять попередню обробку (швидше, вимагає cron)",
+ "AutoArchiveRealTime": "сегментовані звіти обробляються в режимі реального часу",
+ "ChooseASegment": "Виберіть сегмент",
+ "CurrentlySelectedSegment": "В даний час обрано сегмент: %s",
+ "DataAvailableAtLaterDate": "Ваш сегментовані звіти аналітики будуть доступні пізніше. Ми приносимо свої вибачення за доставлені незручності.",
+ "DefaultAllVisits": "Всі візити",
+ "DragDropCondition": "Drag & Drop переміщення",
+ "LoadingSegmentedDataMayTakeSomeTime": "Обробка сегментованих даних відвідувач може зайняти кілька хвилин...",
+ "OperatorAND": "AND",
+ "OperatorOR": "OR",
+ "SaveAndApply": "Зберегти і Застосувати",
+ "SegmentDisplayedAllWebsites": "всі сайти",
+ "SegmentDisplayedThisWebsiteOnly": "цей сайт тільки",
+ "SegmentIsDisplayedForWebsite": "і обробляються для",
+ "SegmentNotApplied": "Сегмент '%s' не застосовується",
+ "SegmentNotAppliedMessage": "Ви запитуєте дані для сегменту '%s', ця конфігурація Piwik в даний час не дозволяє обробку в режимі реального часу звітів з міркувань продуктивності.",
+ "SelectSegmentOfVisits": "Виберіть сегмент візитів:",
+ "ThisSegmentIsVisibleTo": "Цей сегмент стає видимим для:",
+ "VisibleToAllUsers": "усіх користувачів",
+ "VisibleToMe": "мене",
+ "YouMayChangeSetting": "Ви також можете змінити налаштування у файлі конфігурації (%1$s), або редагувати цей сегмент і вибрати '%2$s'.",
+ "VisibleToSuperUser": "Видиме вам, тому що у вас є доступ суперкористувача",
+ "SharedWithYou": "Поділився з вами",
+ "YouMustBeLoggedInToCreateSegments": "Ви повинні увійти, щоб створювати і редагувати користувальницькі сегменти відвідувачів.",
+ "YouDontHaveAccessToCreateSegments": "Ви не маєте необхідного рівня доступу для створення і редагування сегментів.",
+ "AddingSegmentForAllWebsitesDisabled": "Додавання сегментів для всіх веб-сайтів було відключено.",
+ "SegmentXIsAUnionOf": "%s є об'єднанням цих сегментів:",
+ "CustomSegment": "Користувальницький Сегмент",
+ "SegmentOperatorIsNullOrEmpty": "є нульовим або порожнім",
+ "SegmentOperatorIsNotNullNorEmpty": "не нульовий або порожній"
+ }
+} \ No newline at end of file
diff --git a/plugins/SegmentEditor/stylesheets/segmentation.less b/plugins/SegmentEditor/stylesheets/segmentation.less
index c0f97e940a..f10f067856 100644
--- a/plugins/SegmentEditor/stylesheets/segmentation.less
+++ b/plugins/SegmentEditor/stylesheets/segmentation.less
@@ -670,6 +670,17 @@ a.metric_category {
}
}
+.segment-definition-change-confirm .description {
+ margin-top: 20px;
+ float: left;
+ width: 100%;
+ text-align: center;
+
+ > span {
+ display: inline-block;
+ }
+}
+
.dropdown-body {
border-top-width: 0;
display: none;
diff --git a/plugins/SegmentEditor/templates/_segmentSelector.twig b/plugins/SegmentEditor/templates/_segmentSelector.twig
index c8ab792fc0..76702b153c 100644
--- a/plugins/SegmentEditor/templates/_segmentSelector.twig
+++ b/plugins/SegmentEditor/templates/_segmentSelector.twig
@@ -32,7 +32,7 @@
</div>
</div>
- <div class="initial-state-rows">{# no space here important for jquery #}<div class="segment-add-row initial"><div>
+ <div class="initial-state-rows">{# no space here important for jQuery #}<div class="segment-add-row initial"><div>
<span>+ {{ 'SegmentEditor_DragDropCondition'|translate|raw }}</span>
</div></div>
<div class="segment-and">{{ 'SegmentEditor_OperatorAND'|translate|raw }}</div>
@@ -169,6 +169,24 @@
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>
+<div class="ui-confirm segment-definition-change-confirm" data-segment-processed-on-request="{{ segmentProcessedOnRequest|number_format }}" data-hide-message="{{ hideSegmentDefinitionChangeMessage }}">
+ <h2>
+ <span class="process-on-request">
+ {{ 'SegmentEditor_ChangingSegmentDefinitionConfirmationProcessedOnRequest'|translate }}
+ </span>
+ <span class="no-process-on-request">
+ {{ 'SegmentEditor_ChangingSegmentDefinitionConfirmationNotProcessedOnRequest'|translate }}
+ </span>
+ </h2>
+ <p class="description">
+ <span>
+ <input type="checkbox" id="hideSegmentMessage" name="hideSegmentMessage" />
+ <label for="hideSegmentMessage">{{ 'SegmentEditor_HideMessageInFuture'|translate }}</label>
+ </span>
+ </p>
+ <input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
+ <input role="no" type="button" value="{{ 'General_No'|translate }}"/>
+</div>
<div class="ui-confirm pleaseChangeBrowserAchivingDisabledSetting">
<h2>{{ 'SegmentEditor_SegmentNotApplied'|translate(nameOfCurrentSegment)|raw }}</h2>
{% set segmentSetting %}{{ 'SegmentEditor_AutoArchivePreProcessed'|translate }}{% endset %}
diff --git a/plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php b/plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php
index 6ecad82f2f..7e38188966 100644
--- a/plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php
+++ b/plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php
@@ -11,6 +11,7 @@ namespace Piwik\Plugins\SegmentEditor\tests\Unit;
use Piwik\Plugins\SegmentEditor\SegmentQueryDecorator;
use Piwik\Plugins\SegmentEditor\Services\StoredSegmentService;
use Piwik\Segment\SegmentExpression;
+use Piwik\Tests\Framework\Mock\Plugin\LogTablesProvider;
/**
* @group SegmentEditor
@@ -36,7 +37,8 @@ class SegmentQueryDecoratorTest extends \PHPUnit_Framework_TestCase
/** @var StoredSegmentService $service */
$service = $this->getMockSegmentEditorService();
- $this->decorator = new SegmentQueryDecorator($service);
+ $logTables = new LogTablesProvider();
+ $this->decorator = new SegmentQueryDecorator($service, $logTables);
}
public function test_getSelectQueryString_DoesNotDecorateSql_WhenNoSegmentUsed()
@@ -86,4 +88,5 @@ class SegmentQueryDecoratorTest extends \PHPUnit_Framework_TestCase
$mock->expects($this->any())->method('getAllSegmentsAndIgnoreVisibility')->willReturn(self::$storedSegments);
return $mock;
}
+
}
diff --git a/plugins/SitesManager/API.php b/plugins/SitesManager/API.php
index aa0cadb5df..a28093ed98 100644
--- a/plugins/SitesManager/API.php
+++ b/plugins/SitesManager/API.php
@@ -350,7 +350,7 @@ class API extends \Piwik\Plugin\API
* For the superUser it returns all the websites in the database.
*
* @param bool|int $limit Specify max number of sites to return
- * @param bool $_restrictSitesToLogin Hack necessary when runnning scheduled tasks, where "Super User" is forced, but sometimes not desired, see #3017
+ * @param bool $_restrictSitesToLogin Hack necessary when running scheduled tasks, where "Super User" is forced, but sometimes not desired, see #3017
* @return array array for each site, an array of information (idsite, name, main_url, etc.)
*/
public function getSitesWithAtLeastViewAccess($limit = false, $_restrictSitesToLogin = false)
@@ -1282,7 +1282,7 @@ class API extends \Piwik\Plugin\API
* Updates the field ts_created for the specified websites.
*
* @param $idSites int Id Site to update ts_created
- * @param $minDate Date to set as creation date. To play it safe it will substract one more day.
+ * @param $minDate Date to set as creation date. To play it safe it will subtract one more day.
*
* @ignore
*/
diff --git a/plugins/SitesManager/Controller.php b/plugins/SitesManager/Controller.php
index f77844af9e..225b2bdc09 100644
--- a/plugins/SitesManager/Controller.php
+++ b/plugins/SitesManager/Controller.php
@@ -125,8 +125,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
{
$path = PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/';
$filename = 'PiwikTracker.php';
- header('Content-type: text/php');
- header('Content-Disposition: attachment; filename="' . $filename . '"');
+ Common::sendHeader('Content-type: text/php');
+ Common::sendHeader('Content-Disposition: attachment; filename="' . $filename . '"');
return file_get_contents($path . $filename);
}
diff --git a/plugins/SitesManager/lang/fr.json b/plugins/SitesManager/lang/fr.json
index b4157d71b1..0da2650ea0 100644
--- a/plugins/SitesManager/lang/fr.json
+++ b/plugins/SitesManager/lang/fr.json
@@ -78,6 +78,7 @@
"UTCTimeIs": "L'heure UTC est %s.",
"OnlyMatchedUrlsAllowed": "Effectue le suivi des visites et actions uniquement quand l'URL d'action commence avec une des URLs ci-dessus.",
"OnlyMatchedUrlsAllowedHelp": "Quand activé, Piwik va effectuer le suivi des actions uniquement quand l'URL de la page est une des URLs de votre site web. Ceci empêche les gens de spammer vos données d'analyse avec des URLs d'autres sites web.",
+ "OnlyMatchedUrlsAllowedHelpExamples": "Le domaine et le chemin doivent être exacts et chaque sous-domaine valide doit être précisé séparément. Par exemple quand les URLs connues sont \"http:\/\/exemple.com\/chemin\" et \"http:\/\/bon.exemple.com\", les requêtes de suivit pour \"http:\/\/exemple.com\/autrechemin\" ou \"http:\/\/mauvais.exemple.com\" sont ignorées.",
"WebsitesManagement": "Gestion des sites",
"XManagement": "Gérer %s",
"ChooseMeasurableTypeHeadline": "Que voudriez-vous mesurer ?",
diff --git a/plugins/SitesManager/lang/ka.json b/plugins/SitesManager/lang/ka.json
index 5c0c750864..13f27929e5 100644
--- a/plugins/SitesManager/lang/ka.json
+++ b/plugins/SitesManager/lang/ka.json
@@ -12,8 +12,8 @@
"DeleteConfirm": "დარწმუნებული ხართ, რომ გსურთ %s ვებ საიტის წაშლა?",
"ExceptionDeleteSite": "ამ ვებ საიტის წაშლა შეუძლებელია, რადგან ის არის ერთადერთი რეგისტრირებული ვებ საიტი. ჯერ დაამატეთ ახალი ვებ საიტი და შემდეგ წაშალეთ ეს.",
"ExceptionEmptyName": "ვებ საიტის სახელი არ შეიძლება იყოს ცარიელი.",
- "ExceptionInvalidCurrency": "\"%s\" ვალუტა არ არის ვალიდური. გთხოვთ, მიუთითოთ ვალიდური ვალუტის სიმბოლო (მაგ. %s)",
- "ExceptionInvalidIPFormat": "IP მისამართი, გამორიცხვით \"%s\", არ არის ვალიდური IP ფორმატის (მაგ. %s).",
+ "ExceptionInvalidCurrency": "\"%1$s\" ვალუტა არ არის ვალიდური. გთხოვთ, მიუთითოთ ვალიდური ვალუტის სიმბოლო (მაგ. %2$s)",
+ "ExceptionInvalidIPFormat": "IP მისამართი, გამორიცხვით \"%1$s\", არ არის ვალიდური IP ფორმატის (მაგ. %2$s).",
"ExceptionInvalidTimezone": "საათობრივი სარტყელი \"%s\" არ არის ვალიდური. გთხოვთ, მიუთითოთ ვალიდური საათობრივი სარტყელი.",
"ExceptionInvalidUrl": "url '%s' არ არის ვალიდური URL.",
"ExceptionNoUrl": "ვებ საიტისთვის ერთი URL მაინც უნდა მიუთითოთ.",
diff --git a/plugins/SitesManager/lang/sq.json b/plugins/SitesManager/lang/sq.json
index cef6614882..12f4251a22 100644
--- a/plugins/SitesManager/lang/sq.json
+++ b/plugins/SitesManager/lang/sq.json
@@ -11,8 +11,10 @@
"DefaultCurrencyForNewWebsites": "Monedhë parazgjedhje për sajte të rinj",
"DefaultTimezoneForNewWebsites": "Zonë Kohore parazgjedhje për sajte të rinj",
"DeleteConfirm": "Jeni i sigurt se doni të hiqet sajti %s?",
+ "DisableSiteSearch": "Mos gjurmo Kërkime në Sajt",
"EcommerceHelp": "Po u aktivizua, te raporti \"Objektiva\" do të shfaqet një ndarje e re, \"E-tregti\".",
"EnableEcommerce": "Me E-tregti të aktivizuar",
+ "EnableSiteSearch": "Kërkimi në Sajt është i aktivizuar",
"EnableSiteSpecificUserAgentExclude": "Aktivizoni përjashtim agjenti përdoruesi për sajte të dhënë.",
"EnableSiteSpecificUserAgentExclude_Help": "Nëse ju duhet të përjashtoni agjentë të ndryshëm përdoruesi për sajte të ndryshëm, i vini shenjë kësaj kutize, klikoni mbi Ruaje dhe %1$sshtojeni agjentin e përdoruesi më sipër%2$s.",
"ExceptionDeleteSite": "Heqja e këtij sajti s’është e mundur, ngaqë është i vetmi sajt i regjistruar. Së pari, shtoni një sajt të ri, mandej hiqni këtë këtu.",
@@ -34,7 +36,10 @@
"GlobalWebsitesSettings": "Rregullime globale për sajte",
"HelpExcludedIps": "Jepni listën e IP-ve, një për rresht, që dëshironi të përjashtohen nga gjurmimi prej Piwik-ut. Mund të përdorni shenja të gjithëpushtetshme, p.sh. %1$s ose %2$s",
"JsTrackingTagHelp": "Kjo është etiketa JavaScript e Gjurmimit që duhet përfshirë në krejt faqet tuaja",
+ "KeepURLFragments": "Gjurmim fragmentesh URL-sh Faqesh",
+ "KeepURLFragmentsHelp": "Nëse kutiza më poshtë lihet pa shenjë, fragmentet e URL-ve të Faqeve (gjithçka pas %1$s) do të hiqen nga gjurmimet: %2$s do të gjurmohet si %3$s",
"KeepURLFragmentsHelp2": "Këtë rregullim mund ta anashkaloni më sipër, për sajte individualë.",
+ "KeepURLFragmentsLong": "Mbaji fragmentet e URL-ve të Faqeve kur gjurmohen URL Faqesh",
"ListOfIpsToBeExcludedOnAllWebsites": "IP-të më poshtë do të përjashtohen nga gjurmimi për krejt sajtet.",
"ListOfQueryParametersToBeExcludedOnAllWebsites": "Parametrat për URL-ra Kërkesash më poshtë do të përjashtohen nga URL-të për krejt sajtet.",
"ListOfQueryParametersToExclude": "Jepni listën e Parametrave për URL-ra Kërkesash, një për rresht, që duhen përjashtuar nga raportet për URL-ra Faqesh.",
@@ -46,10 +51,12 @@
"PiwikOffersEcommerceAnalytics": "Piwik-u ju mundëson ndjekje & raportim të thelluar Analizash E-tregtie. Mësoni më tepër rreth %1$s Analizash E-tregtie%2$s.",
"PiwikWillAutomaticallyExcludeCommonSessionParameters": "Piwik-u do t’i përjashtojë vetvetiu parametrat e zakonshëm të sesioneve (%s).",
"PluginDescription": "Administrimi i sajteve ju lejon të shtoni sajt të ri dhe të përpunoni sajte ekzistues.",
+ "SearchCategoryDesc": "Piwik-u mund të gjurmojë edhe kategorinë e Kërkimit për çdo fjalëkyç kërkimi të brendshëm në sajt.",
"SearchCategoryLabel": "Parametër kategorie",
"SearchCategoryParametersDesc": "Mund të jepni një listë parametrash kërkesash që përcaktojnë kategori kërkimesh, ndarë me presje.",
"SearchKeywordLabel": "Parametër kërkese",
"SearchKeywordParametersDesc": "Jepni një listë emrash parametrash kërkese fjalëkyçesh kërkimi në sajt, ndarë me presje.",
+ "SearchParametersNote": "Shënim: parametrat Kërkim dhe parametrat Kategori do të përdoren vetëm për sajte që kanë të aktivizuar Kërkimin brenda Sajtit, por që i kanë lënë të zbrazët këta parametra.",
"SearchParametersNote2": "Për ta çaktivizuar për sajtet e reja Kërkimin te Sajti, lërini të zbrazëta këto dy fusha.",
"SearchUseDefault": "Përdor parametra %1$sparazgjedhje%2$s Kërkimi në Sajt",
"SelectACity": "Përzgjidhni një qytet",
@@ -60,11 +67,21 @@
"SiteSearchUse": "Mund ta përdorni Piwik-un për të gjurmuar dhe raportuar se çfarë kërkojnë vizitorët me motorin e kërkimeve të brendshme në sajtin tuaj .",
"SiteWithoutDataTitle": "Ende s’ka të dhëna të regjistruara",
"SiteWithoutDataDescription": "Për këtë sajt s’janë gjurmuar ende të dhëna analitike",
+ "SiteWithoutDataSetupTracking": "Ju lutemi, rregulloni te sajti juaj %1$skod gjurmimi JavaScript%2$s, nëse s’e keni bërë tashmë.",
+ "SiteWithoutDataMessageDisappears": "Ky mesazh do të zhduket sapo të ketë ndoca të dhëna të gjurmuara për këtë sajt.",
+ "SiteWithoutDataSetupGoals": "Ndoshta mund të donit, ndërkohë, të %1$scaktoni ndonjë objektiv%2$s.",
+ "SuperUserAccessCan": "Një përdorues me hyrje Superpërdoruesi mundet gjithashtu %1$s të caktojë rregullime të përgjithshme%2$s për sajte të rinj.",
"Timezone": "Zonë kohore",
+ "TrackingSiteSearch": "Gjurmim Kërkimesh Brenda Sajti",
"TrackingTags": "Kod gjurmimi për %s",
"Urls": "URL-ra",
"UTCTimeIs": "Koha UTC është %s.",
+ "OnlyMatchedUrlsAllowed": "Gjurmo vizita dhe veprime vetëm kur URL-ja e veprimit fillon me një nga URL-të më sipër.",
+ "OnlyMatchedUrlsAllowedHelp": "Në qoftë e aktivizuar, Piwik-u do të gjurmojë veprime të brendshme vetëm kur URL-ja e Faqes është një nga URL-të e njohura për sajtin tuaj. Kjo pengon shfrytëzimin e padëshiruar të analizave tuaja përmes URL-sh për sajte të tjerë.",
+ "OnlyMatchedUrlsAllowedHelpExamples": "Përkatësia dhe shtegu duhet të përputhen saktësisht dhe çdo nënpërkatësi e vlefshme duhet të specifikohet veçmas. Për shembull. kur URL-të e ditura janë 'http:\/\/shembull.com\/shteg' dhe 'http:\/\/imirë.shembull.com', kërkesat për gjurmim të 'http:\/\/shembull.com\/shtegtjetër' ose 'http:\/\/ikeq.shembull.com' shpërfillen.",
"WebsitesManagement": "Administrim Sajtesh",
+ "XManagement": "Administroni %s",
+ "ChooseMeasurableTypeHeadline": "Ç’do të donit të matnit?",
"YouCurrentlyHaveAccessToNWebsites": "Deri tani keni hyrje te %s sajte.",
"YourCurrentIpAddressIs": "Adresa juaj IP e tanishme është %s"
}
diff --git a/plugins/SitesManager/lang/sv.json b/plugins/SitesManager/lang/sv.json
index 556eb2f3ac..e73f4dcaf6 100644
--- a/plugins/SitesManager/lang/sv.json
+++ b/plugins/SitesManager/lang/sv.json
@@ -67,13 +67,18 @@
"SiteSearchUse": "Du kan använda Piwik för att spåra och rapportera om vad besökarna söker efter med din webbplats interna sökmotor.",
"SiteWithoutDataTitle": "Inga data har samlats in än",
"SiteWithoutDataDescription": "Inga data har samlats in för denna webbplats än.",
+ "SiteWithoutDataSetupTracking": "Vänligen konfigurera %1$sJavaScript spårningskoden%2$s på din webbplats om du inte redan har gjort det.",
"SiteWithoutDataMessageDisappears": "Detta meddelande kommer visas tills data samlats in för denna webbsida.",
+ "SiteWithoutDataSetupGoals": "Under tiden kanske du vill %1$ssätta upp några mål%2$s.",
"SuperUserAccessCan": "En användare med Superbehörighet kan också %1$s specificera globala inställningar%2$s för nya webbsidor.",
"Timezone": "Tidszon",
"TrackingSiteSearch": "Spåra webbplatsens interna sökfunktion",
"TrackingTags": "Spårningskod för %s",
"Urls": "URLer",
"UTCTimeIs": "Aktuell tid (UTC) är %s.",
+ "OnlyMatchedUrlsAllowed": "Spåra endast besök och händelser när en händelse-URL börjar med någon av ovan URL'er.",
+ "OnlyMatchedUrlsAllowedHelp": "När aktiverat så kommer Piwik endast spåra interna händelser när sid-URL'en är någon av de kända URL'er för din webbplats. Detta förhindrar folk från att spamma din statistik med URL'er för andra webbplatser.",
+ "OnlyMatchedUrlsAllowedHelpExamples": "Domänen och sökvägen måste vara en exakt matchning och varje godkänd subdomän måste specificeras separat. T.ex. när den kända URL'en är 'http:\/\/exempel.se\/sökväg' och 'http:\/\/bra.exempel.se' spårningsförfrågan för 'http:\/\/exempel.se\/annansökväg' eller 'http:\/\/dålig.exempel.se' ignoreras.",
"WebsitesManagement": "Hantera webbplatser",
"XManagement": "Hantera %s",
"ChooseMeasurableTypeHeadline": "Vad vill du mäta?",
diff --git a/plugins/SitesManager/lang/uk.json b/plugins/SitesManager/lang/uk.json
index 3557821ede..b0a99b02eb 100644
--- a/plugins/SitesManager/lang/uk.json
+++ b/plugins/SitesManager/lang/uk.json
@@ -1,46 +1,88 @@
{
"SitesManager": {
"AddSite": "Додати новий сайт",
- "AdvancedTimezoneSupportNotFound": "Розширену підтримку часових поясів не знайно в вашому PHP (підтримується в PHP>=5.2). Все ще можна вибрати відступ часового поясу вручну.",
- "AliasUrlHelp": "Рекомендується, але не вимагається, вказувати різні URL (кожен з нового рядка) що ваші відвідувачі використовують для заходу на сайту.Перелічені посилання не будуть з’являтися і \"Реферери\" > \"Звіти веб-сайтів\". Зверніть увагу що не обовязково вказувати обидва варіанти URL з \"www\" та без оскільки Piwik автоматично визначає обидва варіанти.",
- "ChangingYourTimezoneWillOnlyAffectDataForward": "Зміна часового поясу вплине лише на отримання даних в майбутньому і не буде застосовуватися до існуючих даних.",
- "ChooseCityInSameTimezoneAsYou": "Виберіть місто в аналогічному до вашого часовому поясі.",
+ "AddMeasurable": "Додати нові показники",
+ "AdvancedTimezoneSupportNotFound": "Підтримка додаткових тимчасових зон не знайдено у вашому PHP (підтримується в PHP>=5.2). Ви все ще можете вибрати UTC вручну замість цього.",
+ "AliasUrlHelp": "Рекомендується, але необов'язково, вказувати всі домени для сайту (кожен домен – нова лінія), які користувачі можуть використовувати для доступу до сайту. Псевдоніми для різних доменів сайту не будуть відображатися в розділі Джерело трафіку > Сайти. Зауважте, що немає необхідності вказувати варіанти адрес з \"www\" і без нього. Piwik автоматично враховує обидва.",
+ "ChangingYourTimezoneWillOnlyAffectDataForward": "Зміна вашого часового поясу тільки вплине на те, що дані будуть враховуватися наперед, і ніяк не вплине на існуючі дані.",
+ "ChooseCityInSameTimezoneAsYou": "Виберіть місто в тому ж часовому поясі, де ви знаходитеся.",
"Currency": "Валюта",
- "CurrencySymbolWillBeUsedForGoals": "Символ валюти буде відображатися поруч із прибутками цілей.",
- "DefaultCurrencyForNewWebsites": "Типова валюта для нових веб-сайтів",
- "DefaultTimezoneForNewWebsites": "Типови часовий пояс для нових веб-сайтів",
- "DeleteConfirm": "Видалити веб-сайт %s?",
- "ExceptionDeleteSite": "Неможливо видалити цей сайт, так як це єдиний зареєстрований сайт. Додайте новий сайт, і після цього ви отримаєте можливість видалити цей.",
- "ExceptionEmptyName": "Назва сайту не може бути порожною.",
- "ExceptionInvalidCurrency": "Валюта \"%1$s\" не вірна. Введіть вірне позначення валют (напр. %2$s)",
- "ExceptionInvalidIPFormat": "IP-адреса для виключення \"%1$s\" має неправильний формат IP адреси (напр. %2$s).",
- "ExceptionInvalidTimezone": "Часовий пояс \"%s\" невірний. Введіть правильний часовий пояс.",
- "ExceptionInvalidUrl": "URL-адреса невірна: \"%s\".",
- "ExceptionNoUrl": "Ви маєте вказати хоча б одину URL-адресу для сайту.",
- "ExcludedIps": "IP-адреси до виключення",
- "ExcludedParameters": "Параметри до виключення",
- "GlobalListExcludedIps": "Глобальний список IP-адрес до виключення",
- "GlobalListExcludedQueryParameters": "Глобальний список URL пераметрів до виключення",
- "GlobalWebsitesSettings": "Глобальні налаштування веб-сайтів",
- "HelpExcludedIps": "Введіть перелік IP-адрес (кожну з нового рядка) що бажаєте виключити з відслідковування системою Piwik. Можете використовувати символи підстановок, наприклад %1$s or %2$s",
- "JsTrackingTagHelp": "Ось тег відслідковування JavaScript який треба включина на кожну сторінку вашого сайту",
- "ListOfIpsToBeExcludedOnAllWebsites": "Приведені IP-адреси будуть виключені з відслідковування на всіх веб-сайтах.",
- "ListOfQueryParametersToBeExcludedOnAllWebsites": "URL параметри наведені нижче будуть виключені з URL для всіх сайтів.",
- "ListOfQueryParametersToExclude": "Введіть перелік URL параметрів (кожен з нового рядка) для виключення зі звітів URL сторінок.",
- "MainDescription": "Звіти з веб-аналітики потребують веб-сайтів! Додайте, поновіть, видаліть веб-сайти, та отримайте JavaScript-код щоб додати на свої сторіки.",
- "NotFound": "не знайдено жодного веб-сайту",
- "NoWebsites": "Немає жодного сайту щоб адмініструвати",
- "PiwikWillAutomaticallyExcludeCommonSessionParameters": "Piwik автоматично виключатиме типові параметри сесій (%s).",
- "SelectACity": "Виберіть місто",
- "SelectDefaultCurrency": "Можна вибрати типову валюту для нових сайтів",
- "SelectDefaultTimezone": "Можна вибрати часовий пояс, який буде типовим для нових веб-сайтів.",
- "ShowTrackingTag": "показати теги відслідковування",
+ "CurrencySymbolWillBeUsedForGoals": "Символ валюти буде відображений після цілей виручки.",
+ "DefaultCurrencyForNewWebsites": "Валюта за замовчуванням для нових сайтів",
+ "DefaultTimezoneForNewWebsites": "Часовий пояс за замовчуванням для нових сайтів",
+ "DeleteConfirm": "Ви дійсно бажаєте видалити цей сайт %s?",
+ "DisableSiteSearch": "Не відстежувати пошук на сайті",
+ "EcommerceHelp": "Якщо включено, то звіт з Цілей буде містити новий розділ - \"Ecommerce (електронна комерція)",
+ "EnableEcommerce": "Ел. комерція включена",
+ "EnableSiteSearch": "Відстеження пошуку на сайті включено",
+ "EnableSiteSpecificUserAgentExclude": "Увімкнути фільтрацію user agent'ів для певних веб-сайтів.",
+ "EnableSiteSpecificUserAgentExclude_Help": "Якщо потрібно виключити різні агенти користувачів (user agents) для різних веб-сайтів, встановіть цей прапорець, натисніть кнопку зберегти і %1$sдодайте призначені для користувача агенти зверху%2$s.",
+ "ExceptionDeleteSite": "Неможливо видалити, оскільки це єдиний сайт в вашому списку. Додайте ще який-небудь сайт для видалення цього.",
+ "ExceptionEmptyName": "Назва сайту не може бути пусте.",
+ "ExceptionInvalidCurrency": "Валюта \"%1$s\" неправильна. Будь ласка, введіть правильний символ валюти (напр., %2$s)",
+ "ExceptionInvalidIPFormat": "IP для виключення \"%1$s\" має не правильний IP формат (напр., %2$s).",
+ "ExceptionInvalidTimezone": "Часовий пояс \"%s\" хибний. Будь ласка, введіть правильний.",
+ "ExceptionInvalidUrl": "URL '%s' не верен.",
+ "ExceptionNoUrl": "Ви повинні вказати хоча б один URL для цього сайту.",
+ "ExcludedIps": "Виключені IP",
+ "ExcludedParameters": "Виключені параметри",
+ "ExcludedUserAgents": "Виключені User Agents",
+ "GlobalExcludedUserAgentHelp1": "Введіть список користувацьких агентів, щоб виключити відстеження за допомогою Piwik.",
+ "GlobalExcludedUserAgentHelp2": "Ви можете використовувати це, щоб виключити відстеження якихось ботів.",
+ "GlobalListExcludedIps": "Загальний список виключених IP",
+ "GlobalListExcludedQueryParameters": "Загальний список запитів URL-параметрів для виключення",
+ "GlobalListExcludedUserAgents": "Загальний список користувацьких агентів для виключення",
+ "GlobalListExcludedUserAgents_Desc": "Якщо рядок user-agent'а відвідувача містить рядки, які ви вказали – Piwik не враховуватиме відвідування.",
+ "GlobalWebsitesSettings": "Загальні настройки сайтів",
+ "HelpExcludedIps": "Введіть список IP адрес, по одному на кожен рядок, які ви хочете виключити і не враховувати в веб-аналітиці. Можна вводити групою, напр. %1$s або %2$s",
+ "JsTrackingTagHelp": "Це код JavaScript, який необхідно вставити в усі ваші сторінки",
+ "KeepURLFragments": "Відстежувати фрагменти url сторінки",
+ "KeepURLFragmentsHelp": "Якщо прапорець не встановлений, фрагменти URL (все після %1$s) будуть видалені при відстеженні: %2$s будуть відслідковуватися як %3$s",
+ "KeepURLFragmentsHelp2": "Ви також можете перевизначити цей параметр для окремих веб-сайтів вище.",
+ "KeepURLFragmentsLong": "Зберігати додаткові фрагменти url при відстеженні сторінок",
+ "ListOfIpsToBeExcludedOnAllWebsites": "IP адреси нижче будуть виключені з статистики і не будуть враховуватися при зборі даних на всіх сайтах.",
+ "ListOfQueryParametersToBeExcludedOnAllWebsites": "Запити URL-параметрів нижче будуть виключені і не будуть враховуватися при зборі статистики на всіх сайтах.",
+ "ListOfQueryParametersToExclude": "Введіть список запитів URL-параметрів по одному на кожен рядок, щоб виключити їх зі сторінки зі звітами по URL.",
+ "MainDescription": "Для ведення статистики потрібно додати сайти. Додавайте, оновлюйте, видаляйте інформацію про сайти, а також перегляньте JavaScript-код для вставки на ваші сторінки.",
+ "NotAnEcommerceSite": "Сайт без ел. комерції",
+ "NotFound": "Не знайдено сайтів для",
+ "NoWebsites": "Ви не маєте жодного сайту на обліку.",
+ "OnlyOneSiteAtTime": "Ви можете тільки редагувати один сайт в один і той же час. Будь ласка, збережіть або скасуйте ваші поточні зміни до сайту %s.",
+ "PiwikOffersEcommerceAnalytics": "Ця опція може бути використана для аналітики інтернет-магазинів і електронних замовлень. Більше інформації – тут: %1$s Аналітика ел. комерції%2$s.",
+ "PiwikWillAutomaticallyExcludeCommonSessionParameters": "Веб-аналітика буде автоматично вилучати необхідні параметри сесії (%s).",
+ "PluginDescription": "Управління веб-сайтами та дозволяє додавати і редагувати їх.",
+ "SearchCategoryDesc": "Piwik також може відстежувати категорію пошуку для кожного слова, яке шукають на вашому сайті в пошуку.",
+ "SearchCategoryLabel": "Параметр категорій",
+ "SearchCategoryParametersDesc": "Ви можете ввести розділені комами списки параметрів, які б визначали категорію пошуку.",
+ "SearchKeywordLabel": "Параметр запитів",
+ "SearchKeywordParametersDesc": "Введіть список параметрів, які містять ключові слова пошуку по сайту (через кому).",
+ "SearchParametersNote": "Підказка: параметри запиту та категорії будуть використані лише для сайтів, які мають внутрішній пошук і включили відстеження пошуку, але залишили ці параметри порожніми (недоторканими).",
+ "SearchParametersNote2": "Щоб відключити функції відстеження пошуку по сайту для нових сайтів, залиште ці два поля порожніми.",
+ "SearchUseDefault": "Використовувати %1$sстандартні%2$s параметри пошуку по сайту",
+ "SelectACity": "Вибрати місто",
+ "SelectDefaultCurrency": "Ви можете встановити валюту за замовчуванням для нових сайтів.",
+ "SelectDefaultTimezone": "Ви можете встановити часовий пояс за замовчуванням для нових сайтів.",
+ "ShowTrackingTag": "Показати код",
"Sites": "Сайти",
+ "SiteSearchUse": "Ви можете використовувати Piwik для відстеження та відображення аналітики по тому, що шукають відвідувачі на вашому сайті використовуючи функціонал для внутрішнього пошуку по сайту.",
+ "SiteWithoutDataTitle": "Ще ніякі дані не були записані",
+ "SiteWithoutDataDescription": "Немає даних аналітики що відстежувалися на цьому сайті.",
+ "SiteWithoutDataSetupTracking": "Будь ласка, налаштуйте %1$sJavaScript код відстеження%2$s на вашому сайті, якщо ви цього не зробили раніше.",
+ "SiteWithoutDataMessageDisappears": "Це повідомлення зникне, як тільки перші дані отримаються на цей сайт.",
+ "SiteWithoutDataSetupGoals": "У той же час, може бути, ви хотіли б %1$sвстановити деякі цілі%2$s.",
+ "SuperUserAccessCan": "Користувач з правами суперкористувача може також %1$sвказати загальні налаштування%2$s для нових веб-сайтів.",
"Timezone": "Часовий пояс",
- "TrackingTags": "Теги відслідковування для %s",
- "Urls": "URL-адреси",
- "UTCTimeIs": "Поточний місцевий час: %s.",
- "WebsitesManagement": "Керування веб-сайтами",
- "YourCurrentIpAddressIs": "Ваша поточно IP адреса: %s"
+ "TrackingSiteSearch": "Відстежувати внутрішній пошук по сайту",
+ "TrackingTags": "Код відстеження для %s",
+ "Urls": "URL-и",
+ "UTCTimeIs": "Час UTC: %s.",
+ "OnlyMatchedUrlsAllowed": "Тільки відстеження відвідування та дії, коли URL-адреса дії починається з однієї з URL-адрес вище.",
+ "OnlyMatchedUrlsAllowedHelp": "Якщо ця функція включена, Piwik буде відслідковувати тільки внутрішні дії, коли URL сторінки є одна з найбільш відомих URL-адрес на вашому сайті. Це заважає людям спамити аналітику з URL-адрес для інших сайтів.",
+ "OnlyMatchedUrlsAllowedHelpExamples": "Домен і шлях повинен повністю збігатися і кожен дійсний піддомен повинен бути вказаний окремо. Наприклад, якщо відомі URL-адреси 'http:\/\/example.com\/path' і 'http:\/\/good.example.com', відстеження запитів для 'http:\/\/example.com\/otherpath' чи 'http:\/\/bad.example.com' ігноруються.",
+ "WebsitesManagement": "Управління сайтами",
+ "XManagement": "Управління %s",
+ "ChooseMeasurableTypeHeadline": "Щоб ви хотіли виміряти?",
+ "YouCurrentlyHaveAccessToNWebsites": "Наразі ви маєте доступ до %s сайтів.",
+ "YourCurrentIpAddressIs": "Ваш IP: %s"
}
} \ No newline at end of file
diff --git a/plugins/SitesManager/templates/sites-list/site-fields.html b/plugins/SitesManager/templates/sites-list/site-fields.html
index df8d6e7a3b..ad37071953 100644
--- a/plugins/SitesManager/templates/sites-list/site-fields.html
+++ b/plugins/SitesManager/templates/sites-list/site-fields.html
@@ -32,7 +32,9 @@
<ul>
<li>
<span class="title">{{ 'SitesManager_Urls'|translate }}</span>:
- {{ site.alias_urls.join(', ') }}
+ <span ng-repeat="url in site.alias_urls">
+ <a target=_blank rel=noreferrer ng-href="{{ url }}">{{ url }}{{$last ? '' : ', '}}</a>
+ </span>
</li>
<li ng-show="site.excluded_ips.length">
<span class="title">{{ 'SitesManager_ExcludedIps'|translate }}:</span>
diff --git a/plugins/SitesManager/tests/Integration/ApiTest.php b/plugins/SitesManager/tests/Integration/ApiTest.php
index ba897a4000..6606015395 100644
--- a/plugins/SitesManager/tests/Integration/ApiTest.php
+++ b/plugins/SitesManager/tests/Integration/ApiTest.php
@@ -545,7 +545,7 @@ class ApiTest extends IntegrationTestCase
$sites = API::getInstance()->getSitesWithAdminAccess();
- // we dont test the ts_created
+ // we don't test the ts_created
unset($sites[0]['ts_created']);
unset($sites[1]['ts_created']);
$this->assertEquals($resultWanted, $sites);
@@ -655,7 +655,8 @@ class ApiTest extends IntegrationTestCase
$sites = API::getInstance()->getSitesWithViewAccess();
- // we dont test the ts_created
+ // we don't test the ts_created
+
unset($sites[0]['ts_created']);
unset($sites[1]['ts_created']);
$this->assertEquals($resultWanted, $sites);
@@ -691,7 +692,7 @@ class ApiTest extends IntegrationTestCase
FakeAccess::setIdSitesAdmin(array());
$sites = API::getInstance()->getSitesWithAtLeastViewAccess();
- // we dont test the ts_created
+ // we don't test the ts_created
unset($sites[0]['ts_created']);
unset($sites[1]['ts_created']);
$this->assertEquals($resultWanted, $sites);
diff --git a/plugins/TestRunner/Commands/TestsRun.php b/plugins/TestRunner/Commands/TestsRun.php
index 8a12c07e3b..d5b7398d9f 100644
--- a/plugins/TestRunner/Commands/TestsRun.php
+++ b/plugins/TestRunner/Commands/TestsRun.php
@@ -190,7 +190,7 @@ class TestsRun extends ConsoleCommand
private function getTestsSuites()
{
- return array('unit', 'integration', 'system');
+ return array('unit', 'integration', 'system', 'plugin');
}
/**
diff --git a/plugins/Transitions/lang/it.json b/plugins/Transitions/lang/it.json
index 39961913f6..258c954172 100644
--- a/plugins/Transitions/lang/it.json
+++ b/plugins/Transitions/lang/it.json
@@ -17,7 +17,7 @@
"NoDataForActionDetails": "O l'azione non ha avuto pagine viste durante il periodo di %s o non è valida.",
"OutgoingTraffic": "Traffico uscente",
"PluginDescription": "Restituisce le azioni precedenti e seguenti per ciascun URL di pagina in un nuovo report Transizioni, disponibile tra i report Azioni con una nuova icona.",
- "ShareOfAllPageviews": "Questa pagina ha %1$s visualizzazioni (%2$s di tutte le visualizzazioni)",
+ "ShareOfAllPageviews": "Questa pagina ha avuto %1$s visualizzazioni (%2$s di tutte le visualizzazioni)",
"ToFollowingPages": "A Pagine Interne",
"ToFollowingPagesInline": "%s a pagine interne",
"ToFollowingSiteSearches": "Ricerche Interne",
diff --git a/plugins/Transitions/lang/sv.json b/plugins/Transitions/lang/sv.json
index 7e318dfdac..74a6be23b1 100644
--- a/plugins/Transitions/lang/sv.json
+++ b/plugins/Transitions/lang/sv.json
@@ -16,6 +16,7 @@
"NoDataForAction": "Det finns inga data för %s",
"NoDataForActionDetails": "Antingen har händelsen inte haft några sidvisningar under perioden %s eller så är den ogiltig.",
"OutgoingTraffic": "Utgående trafik",
+ "PluginDescription": "Tidigare Rapporter och följande åtgärder för varje sida URL i en ny Övergångsrapport, som finns i Händelserapporter via en ny ikon.",
"ShareOfAllPageviews": "Den här sidan hade %1$s sidvisningar (%2$s av alla sidvisningar)",
"ToFollowingPages": "Till interna sidor",
"ToFollowingPagesInline": "%s till interna sidor",
diff --git a/plugins/Transitions/lang/uk.json b/plugins/Transitions/lang/uk.json
new file mode 100644
index 0000000000..039e843094
--- /dev/null
+++ b/plugins/Transitions/lang/uk.json
@@ -0,0 +1,28 @@
+{
+ "Transitions": {
+ "BouncesInline": "%s відскоків (відмов)",
+ "DirectEntries": "Gрямих входів",
+ "ErrorBack": "Повернутися до попередньої дії",
+ "ExitsInline": "%s виходів з сайту",
+ "FromCampaigns": "з кампаній",
+ "FromPreviousPages": "з внутрішніх сторінок",
+ "FromPreviousPagesInline": "%s з внутрішніх сторінок",
+ "FromPreviousSiteSearches": "внутрішніх пошуків по сайту",
+ "FromPreviousSiteSearchesInline": "%s з внутрішнього пошуку по сайту",
+ "FromSearchEngines": "з пошукових систем",
+ "FromWebsites": "з сайтів",
+ "IncomingTraffic": "Вхідний трафік",
+ "LoopsInline": "%s оновлень сторінки",
+ "NoDataForAction": "Немає даних для %s",
+ "NoDataForActionDetails": "Не було скоєно таких дій %s або вони неправильні.",
+ "OutgoingTraffic": "Вихідний трафік",
+ "PluginDescription": "Звіти про попередні та наступні дій для кожної сторінки URL у новому звіті Переходів, в звітах Дії через новий значок.",
+ "ShareOfAllPageviews": "У цієї сторінки %1$s переглядів (%2$s з переглядів всіх сторінок)",
+ "ToFollowingPages": "на внутрішні сторінки",
+ "ToFollowingPagesInline": "%s на внутрішні сторінки",
+ "ToFollowingSiteSearches": "внутрішніх пошуків по сайту",
+ "ToFollowingSiteSearchesInline": "%s внутрішніх пошуків по сайту",
+ "XOfAllPageviews": "%s з усіх переглядів сторінки",
+ "XOutOfYVisits": "%1$s (з %2$s)"
+ }
+} \ No newline at end of file
diff --git a/plugins/TreemapVisualization b/plugins/TreemapVisualization
-Subproject d27210763471b61730d111cfafb4b87d168c5b1
+Subproject 22cc2992deb3429102a7ae09f90ae5172dced6b
diff --git a/plugins/UserCountry/images/flags/bu.png b/plugins/UserCountry/images/flags/bu.png
index d931b1dbe4..d96c2f30f7 100644
--- a/plugins/UserCountry/images/flags/bu.png
+++ b/plugins/UserCountry/images/flags/bu.png
Binary files differ
diff --git a/plugins/UserCountry/images/flags/ch.png b/plugins/UserCountry/images/flags/ch.png
index ead7c2a0d0..6f6723fb89 100644
--- a/plugins/UserCountry/images/flags/ch.png
+++ b/plugins/UserCountry/images/flags/ch.png
Binary files differ
diff --git a/plugins/UserCountry/images/flags/gf.png b/plugins/UserCountry/images/flags/gf.png
index 744ede391d..b3e22fb218 100644
--- a/plugins/UserCountry/images/flags/gf.png
+++ b/plugins/UserCountry/images/flags/gf.png
Binary files differ
diff --git a/plugins/UserCountry/images/flags/ls.png b/plugins/UserCountry/images/flags/ls.png
index e4f46519bb..dbc9ccb644 100644
--- a/plugins/UserCountry/images/flags/ls.png
+++ b/plugins/UserCountry/images/flags/ls.png
Binary files differ
diff --git a/plugins/UserCountry/images/flags/ly.png b/plugins/UserCountry/images/flags/ly.png
index afaae07d48..b5bd4c1607 100644
--- a/plugins/UserCountry/images/flags/ly.png
+++ b/plugins/UserCountry/images/flags/ly.png
Binary files differ
diff --git a/plugins/UserCountry/images/flags/mm.png b/plugins/UserCountry/images/flags/mm.png
index d931b1dbe4..772f931f0b 100644
--- a/plugins/UserCountry/images/flags/mm.png
+++ b/plugins/UserCountry/images/flags/mm.png
Binary files differ
diff --git a/plugins/UserCountry/images/flags/np.png b/plugins/UserCountry/images/flags/np.png
index 5b8e388fda..2afe8d7e5f 100644
--- a/plugins/UserCountry/images/flags/np.png
+++ b/plugins/UserCountry/images/flags/np.png
Binary files differ
diff --git a/plugins/UserCountry/images/flags/tk.png b/plugins/UserCountry/images/flags/tk.png
index 0440c43b42..107ce1494f 100644
--- a/plugins/UserCountry/images/flags/tk.png
+++ b/plugins/UserCountry/images/flags/tk.png
Binary files differ
diff --git a/plugins/UserCountry/lang/nl.json b/plugins/UserCountry/lang/nl.json
index 8cd357b73b..b3bb3dc080 100644
--- a/plugins/UserCountry/lang/nl.json
+++ b/plugins/UserCountry/lang/nl.json
@@ -40,31 +40,32 @@
"GeoIPUpdaterIntro": "Piwik beheert momenteel updates voor de volgende GeoIP databases",
"GeoLiteCityLink": "Als u de GeoLite City database gebruikt, gebruik dan deze link: %1$s%2$s%3$s.",
"Geolocation": "Geolocatie",
- "GeolocationPageDesc": "Op deze pagina kunt u instellen hoe Piwik bezoeker locaties bepaald.",
+ "GeolocationPageDesc": "Op deze pagina kunt u instellen hoe Piwik bezoekerlocaties bepaald.",
"getCityDocumentation": "Dit rapport laat zien in welke stad uw bezoekers waren toen ze uw website bezochten.",
"getContinentDocumentation": "Dit rapport laat zien in welk continent uw bezoekers waren toen ze uw website bezochten.",
"getCountryDocumentation": "Dit rapport laat zien in welk land uw bezoekers waren toen ze uw website bezochten.",
"getRegionDocumentation": "Dit rapport laat zien in welke regio uw bezoekers waren toen ze uw website bezochten.",
"HowToInstallApacheModule": "Hoe installeer ik de GeoIP module voor Apache?",
- "HowToInstallGeoIPDatabases": "Hoe krijg ik de GeoIP databases?",
- "HowToInstallGeoIpPecl": "Hoe installeer ik de GeoIP PECL extensie?",
- "HowToInstallNginxModule": "Hoe installeer ik de GeoIP module voor Nginx?",
- "HowToSetupGeoIP": "Hoe zet ik accurate geolocatie op met GeoIP",
+ "HowToInstallGeoIPDatabases": "Hoe krijg ik de GeoIP-databases?",
+ "HowToInstallGeoIpPecl": "Hoe installeer ik de GeoIP PECL-extensie?",
+ "HowToInstallNginxModule": "Hoe installeer ik de GeoIP-module voor Nginx?",
+ "HowToSetupGeoIP": "Hoe stel ik precieze geolocatie in met GeoIP",
"HowToSetupGeoIP_Step1": "%1$sDownload%2$s de GeoLite City database van %3$sMaxMind%4$s.",
"HowToSetupGeoIP_Step2": "Pak dit bestand uit en kopieer het resultaat, %1$s in de %2$smisc%3$s Piwik directory (u kunt dit doen met FTP of SSH).",
+ "HowToSetupGeoIP_Step3": "Herlaad dit scherm. De %1$sGeoIP (PHP)%2$s provider zal nu worden %3$sgeïnstalleerd%4$s. Selecteer deze.",
"HowToSetupGeoIP_Step4": "Klaar! U heeft zojuist Piwik ingesteld om GeoIP te gebruiken. U kunt nu zien uit welke regio's en steden uw bezoekers komen i.c.m. zeer accurate informatie over het land van herkomst.",
"HttpServerModule": "HTTP Server Module",
"InvalidGeoIPUpdatePeriod": "Ongeldige periode voor de GeoIP updater: %1$s. Geldige waardes zijn %2$s.",
- "ISPDatabase": "ISP database",
+ "ISPDatabase": "ISP-database",
"IWantToDownloadFreeGeoIP": "Ik wil de gratis GeoIP database downloaden...",
"Latitude": "Breedtegraad",
"Location": "Locatie",
- "LocationDatabase": "Locatie database",
+ "LocationDatabase": "Locatiedatabase",
"LocationDatabaseHint": "Een locatie database is of een land of een regio of een stad database.",
"LocationProvider": "Locatie Provider",
"Longitude": "Lengtegraad",
"Organization": "Organisatie",
- "OrgDatabase": "Organisatie Database",
+ "OrgDatabase": "Organisatiedatabase",
"PiwikNotManagingGeoIPDBs": "Piwik beheert momenteel geen GeoIP databases.",
"PluginDescription": "Rapporteert de locatie van je bezoekers: Land, regio, stad en coördinaten (lengte- en breedtegraad)",
"Region": "Regio",
@@ -78,6 +79,6 @@
"UpdaterScheduledForNextRun": "Het is ingepland om uitgevoerd te worden tijdens de volgende commando core:archive.",
"UpdaterWasLastRun": "De updater is voor het laatst uitgevoerd op %s.",
"UpdaterWillRunNext": "De volgende run is gepland om %s",
- "WidgetLocation": "Bezoeker Locatie"
+ "WidgetLocation": "Bezoekerlocatie"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/sq.json b/plugins/UserCountry/lang/sq.json
index 0ee12da135..162318efa0 100644
--- a/plugins/UserCountry/lang/sq.json
+++ b/plugins/UserCountry/lang/sq.json
@@ -1,6 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "S’gjendet dot funksioni find apache_get_modules function, po merret i mirëqenë si shërbyes non-Apache.",
+ "AssumingNonApache": "S’gjendet dot funksioni apache_get_modules function, po merret i mirëqenë si shërbyes non-Apache.",
"City": "Qytet",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontinent",
@@ -9,8 +9,26 @@
"country_a2": "Mundësues Satelitor",
"country_cat": "Bashkësi që flasin Katalançe",
"country_o1": "Vend Tjetër",
+ "country_ti": "Tibet",
+ "CurrentLocationIntro": "Sipas këtij mundësuesi, vendi juaj i tanishëm është",
"DistinctCountries": "%s vende ndaras",
+ "DownloadingDb": "Po shkarkohet %s",
+ "FromDifferentCities": "qytete të ndryshme",
+ "GeoIPDatabases": "Baza të dhënash GeoIP",
+ "GeoIpLocationProviderNotRecomnended": "Gjeovendëzimi funksionon, por nuk po përdorni një nga mundësuesit e këshilluar.",
+ "Geolocation": "Gjeovendëzim",
+ "GeolocationPageDesc": "Në këtë faqe mund të ndryshoni mënyrën se si përcakton Piwik-u vendndodhjet e vizitorëve.",
+ "HowToInstallGeoIpPecl": "Si ta instaloj zgjerimin GeoIP PECL?",
+ "HttpServerModule": "Modul Shërbyesi HTTP",
+ "ISPDatabase": "Bazë të Dhënash MShI",
"Location": "Vend",
- "SubmenuLocations": "Vende"
+ "LocationProvider": "Furnizues Vendndodhjesh",
+ "Organization": "Organizëm",
+ "OrgDatabase": "Bazë të dhënash Organizmi",
+ "Region": "Rajon",
+ "SubmenuLocations": "Vende",
+ "UpdaterHasNotBeenRun": "Përditësuesi s’është xhiruar ndonjëherë.",
+ "UpdaterIsNotScheduledToRun": "S’është vënë në plan të xhirohet në të ardhmen.",
+ "WidgetLocation": "Vendndodhje Vizitori"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/uk.json b/plugins/UserCountry/lang/uk.json
index 42d6196e4c..0392a92109 100644
--- a/plugins/UserCountry/lang/uk.json
+++ b/plugins/UserCountry/lang/uk.json
@@ -1,12 +1,98 @@
{
"UserCountry": {
+ "AssumingNonApache": "Не вдається знайти apache_get_modules функцію, мабуть цей веб-сервер це не на Apache.",
+ "CannotFindGeoIPDatabaseInArchive": "Не знайдено файл %1$s в tar-архіві %2$s!",
+ "CannotFindGeoIPServerVar": "Змінна %s не встановлена. Ваш сервер не може бути налаштований правильно.",
+ "CannotFindPeclGeoIPDb": "Неможливо знайти базу базу даних по країні, регіону або міста для GeoIP PECL модуля. Переконайтеся, що ваша БД GeoIP знаходиться в %1$s і названа %2$s або %3$s, інакше PECL модуль не помітить її.",
+ "CannotListContent": "Не вдалося перерахувати вміст %1$s: %2$s",
+ "CannotLocalizeLocalIP": "IP адреса %s - це локальна адреса і її конкретне місцезнаходження не може бути визначено.",
+ "CannotSetupGeoIPAutoUpdating": "Схоже на те, що Ви зберігаєте свої GeoIP бази за межами папки Piwik. Piwik не може автоматично оновлювати бази, які знаходяться за межами папки misc.",
+ "CannotUnzipDatFile": "Неможливо розпакувати dat-файл в %1$s : %2$s",
+ "City": "Місто",
+ "CityAndCountry": "%1$s, %2$s",
"Continent": "Континент",
"Country": "Країна",
"country_a1": "Анонімний проксі",
"country_a2": "Супутниковий провайдер",
+ "country_cat": "Каталаномовні суспільства",
"country_o1": "Інша країна",
+ "country_ti": "Тибет",
+ "CurrentLocationIntro": "Згідно використовуваного способу відстеження ви знаходитесь тут",
+ "DefaultLocationProviderDesc1": "Цей спосіб відстеження визначає місце розташування на основі мови, яким користуються користувачі в браузері і системі.",
+ "DefaultLocationProviderDesc2": "Це не дуже точне визначення, тому %1$sми рекомендуємо використовувати і встановити плагін %2$sGeoIp%3$s.%4$s",
+ "DefaultLocationProviderExplanation": "Ви використовуєте провайдер визначення розташування за промовчанням. Це означає, що за piwik буде судити про місцезнаходження відвідувача по використовуваній ним мові. %1$sПрочитайте тут%2$s про те, як встановлювати розташування більш точно.",
"DistinctCountries": "%s унікальних країн",
- "Location": "Місцезнаходження",
- "SubmenuLocations": "Місцезнаходження"
+ "DownloadingDb": "Завантаження %s",
+ "DownloadNewDatabasesEvery": "Оновлювати базу раз в",
+ "FatalErrorDuringDownload": "Сталась критична помилка при завантаженні цього файлу. Там може бути щось не так з вашим інтернет з'єднанням, з базою даних GeoIP, яку ви завантажили або Piwik. Спробуйте завантажити і встановити його вручну.",
+ "FoundApacheModules": "Piwik знайшов наступні модулі Apache",
+ "FromDifferentCities": "різні міста",
+ "GeoIPCannotFindMbstringExtension": "Неможливо знайти функцію %1$s. Будь ласка, переконайтеся, що розширення %2$s завантажено і встановлено.",
+ "GeoIPDatabases": "Бази даних GeoIP",
+ "GeoIPDocumentationSuffix": "Щоб побачити дані з цього звіту ви повинні встановити GeoIP в секції Geolocation, яка знаходиться в панелі адміністрування. Платні бази даних GeoIP %1$sMaxmind%2$s більш точні, ніж безкоштовні. Наскільки саме вони точні, ви можете подивитися %3$sтут%4$s.",
+ "GeoIPImplHasAccessTo": "Цей варіант реалізації GeoIP має доступ до таких баз даних",
+ "GeoIPIncorrectDatabaseFormat": "Ваша GeoIP база даних, здається, не має правильного формату. Вона може бути пошкоджена. Переконайтеся, що ви використовуєте бінарну версію і спробувйте замінити її іншим примірником.",
+ "GeoIpLocationProviderDesc_Pecl1": "Місце розташування ваших відвідувачів визначається за допомогою бази даних GeoIP і модуля PECL. Таке визначення — більш чітке та ефективне.",
+ "GeoIpLocationProviderDesc_Pecl2": "Обмежень по використанню цього способу відстеження немає, тому ми рекомендуємо саме його.",
+ "GeoIpLocationProviderDesc_Php1": "Цей спосіб відстеження є найбільш простим в установці, оскільки це не вимагає налаштування сервера (ідеально підходить для віртуального хостингу!). Він використовує GeoIP бази даних і PHP API MaxMind, щоб точно визначити місце розташування ваших відвідувачів.",
+ "GeoIpLocationProviderDesc_Php2": "Якщо у вашого сайту дуже багато відвідувачів, ви помітите, що цей спосіб занадто повільний. У цьому випадку вам потрібно встановити %1$sPECL розширення%2$s або спеціальний %3$sсерверний модуль%4$s.",
+ "GeoIpLocationProviderDesc_ServerBased1": "Визначення локації засноване на модулі GeoIP, який був встановлений на ваш HTTP-сервер. Це працює швидше і точніше, але %1$sможе бути використаний лише при відстеженні відвідувачів, які користуються звичайними браузерами.%2$s",
+ "GeoIpLocationProviderDesc_ServerBased2": "Якщо вам потрібно імпортувати лог-файли або зробити щось, що вимагає наявності та IP адрес, використовуйте %1$s вбудовуваний PECL GeoIP (рекомендується)%2$s або %3$s вбудовуваний PHP GeoIP %4$s.",
+ "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Підказка: анонімізація IP не впливає на ефект на отримання локації користувачів таким способом. Перед тим, як використовувати його з анонімізацією IP, переконайтеся, що це не суперечить законодавству вашої країни.",
+ "GeoIpLocationProviderNotRecomnended": "Геолокація працює, але ви не використовуєте один з рекомендованих провайдерів.",
+ "GeoIPNoServerVars": "Piwik не може знайти GeoIP %s змінні.",
+ "GeoIPPeclCustomDirNotSet": "PHP ini опція %s не встановлена.",
+ "GeoIPServerVarsFound": "Piwik знайшов наступні змінні GeoIP: %s",
+ "GeoIPUpdaterInstructions": "Вкажіть посилання нижче для завантаження баз даних. Якщо ви купили бази даних з %3$sMaxMind%4$s, ви можете знайти ці посилання %1$sтут%2$s. Будь ласка, зв'яжіться з %3$sMaxMind%4$s якщо у вас є проблеми з доступом до них.",
+ "GeoIPUpdaterIntro": "Piwik в даний час управляє оновленнями для наступних баз GeoIP",
+ "GeoLiteCityLink": "Якщо ви використовуєте базу даних GeoLite City, скористайтесь цим посиланням: %1$s%2$s%3$s.",
+ "Geolocation": "Геолокація",
+ "GeolocationPageDesc": "На цій сторінці ви можете змінити спосіб визначення місцеположення відвідувачів.",
+ "getCityDocumentation": "Цей звіт показує міста відвідувачів вашого сайту.",
+ "getContinentDocumentation": "Цей звіт показує континенти відвідувачів вашого сайту.",
+ "getCountryDocumentation": "Цей звіт показує країни відвідувачів вашого сайту.",
+ "getRegionDocumentation": "Цей звіт показує регіони відвідувачів вашого сайту.",
+ "HowToInstallApacheModule": "Як встановити GeoIP модуль для Apache?",
+ "HowToInstallGeoIPDatabases": "Як мені отримати бази даних GeoIP?",
+ "HowToInstallGeoIpPecl": "Як встановити GeoIP PECL розширення?",
+ "HowToInstallNginxModule": "Як встановити GeoIP модуль для Nginx?",
+ "HowToSetupGeoIP": "Як встановити точне визначення локацій відвідувачів з допомогою GeoIP",
+ "HowToSetupGeoIP_Step1": "%1$sЗавантажте%2$s базу даних GeoLite City з %3$sMaxMind%4$s.",
+ "HowToSetupGeoIP_Step2": "Вилучіть цей файл і скопіюйте %1$s в %2$smisc%3$s піддиректорію Piwik (ви можете зробити це через FTP або SSH).",
+ "HowToSetupGeoIP_Step3": "Перезавантажте цю сторінку. Переконайтеся, що %1$sGeoIP (PHP)%2$s тепер %3$sВстановлено%4$s. Виберіть його.",
+ "HowToSetupGeoIP_Step4": "Ось і все! Ви тільки що встановили GeoIP для Piwik, що означає, що ви можете бачити регіони і міста ваших відвідувачів та країну, де вони знаходяться.",
+ "HowToSetupGeoIPIntro": "Здається, що у вас не налаштоване визначено локації відвідувачів з допомогою GeoIP. Це корисна \"штука\" - без неї ви не зможете досить точно визначати місцезнаходження відвідувачів. І ось як ви можете швидко налаштувати все:",
+ "HttpServerModule": "HTTP Серверний модуль",
+ "InvalidGeoIPUpdatePeriod": "Невірний період для GeoIP оновлення: %1$s. Допустимі значення: %2$s.",
+ "IPurchasedGeoIPDBs": "Я придбав більш %1$sдеталізовану базу даних у MaxMind%2$s і хочу налаштувати автоматичні оновлення.",
+ "ISPDatabase": "База провайдерів",
+ "IWantToDownloadFreeGeoIP": "Я хочу завантажити безкоштовну GeoIP базу...",
+ "Latitude": "Широта",
+ "Location": "Локація",
+ "LocationDatabase": "Розташування бази даних",
+ "LocationDatabaseHint": "Розташування бази даних країни, регіону або міста.",
+ "LocationProvider": "Спосіб визначення локації користувача",
+ "Longitude": "Довгота",
+ "NoDataForGeoIPReport1": "Не існує даних для звіту, тому що немає даних про місцезнаходження або IP адреса відвідувача не може бути визначена географічно.",
+ "NoDataForGeoIPReport2": "Для забезпечення точної геолокаціі, змініть параметри %1$sтут%2$s і використовуйте %3$sбазу даних міст%4$s.",
+ "Organization": "Організація",
+ "OrgDatabase": "База організацій",
+ "PeclGeoIPNoDBDir": "PECL модуль звертається до баз в %1$s, але це існує не директорія. Будь ласка, створіть її і додайте в неї базу даних GeoIP. Або ви можете встановити %2$s в правильну директорію у вашому php.ini файлі.",
+ "PeclGeoLiteError": "Ваша БД GeoIP в %1$s названа %2$s. На жаль, PECL модуь не зможе розпізнати таке ім'я. Будь ласка, перейменуйте це в %3$s.",
+ "PiwikNotManagingGeoIPDBs": "Piwik в даний час не працює з базами GeoIP.",
+ "PluginDescription": "Повідомляє місцезнаходження відвідувачів: країна, регіон, місто і географічні координати (широта\/довгота).",
+ "Region": "Регіон",
+ "SetupAutomaticUpdatesOfGeoIP": "Налаштувати автоматичне оновлення GeoIP баз",
+ "SubmenuLocations": "Локації",
+ "TestIPLocatorFailed": "Piwik спробував визначити місцезнаходження відомої IP-адреси (%1$s), але ваш сервер повернув значення: %2$s. Якщо спосіб визначення локації був налаштований правильно, він повернув би значення: %3$s.",
+ "ThisUrlIsNotAValidGeoIPDB": "Завантажений файл не є коректною GeoIP базою. Будь ласка, перевірте посилання чи завантажте файл вручну.",
+ "ToGeolocateOldVisits": "Для того щоб отримати інформацію про місцезнаходження для попередніх відвідувачів, скористайтеся скриптом, про який написано %1$sтут%2$s.",
+ "UnsupportedArchiveType": "Зустрівся непідтримуваний тип архіву %1$s.",
+ "UpdaterHasNotBeenRun": "Оновлення ніколи не проводилися.",
+ "UpdaterIsNotScheduledToRun": "Це не заплановано до запуску в майбутньому.",
+ "UpdaterScheduledForNextRun": "Це запланований запуск команди core:archive при наступному виконанні cron-завдання.",
+ "UpdaterWasLastRun": "Оновлення останнього запуску в %s.",
+ "UpdaterWillRunNext": "Заплановано наступний запуск на %s.",
+ "WidgetLocation": "Місцезнаходження відвідувача"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/tests/Unit/UserCountryTest.php b/plugins/UserCountry/tests/Unit/UserCountryTest.php
index dddbce6b9f..c2db05db2d 100644
--- a/plugins/UserCountry/tests/Unit/UserCountryTest.php
+++ b/plugins/UserCountry/tests/Unit/UserCountryTest.php
@@ -109,6 +109,9 @@ class UserCountryTest extends \PHPUnit_Framework_TestCase
*/
public function testGeoIpDownloadInvalidUrl($url)
{
+ // unset translations, otherwise Exception message will be translated
+ StaticContainer::get('Piwik\Translation\Translator')->reset();
+
$updater = new Piwik_UserCountry_GeoIPAutoUpdater_publictest();
try {
$updater->downloadFile('loc', $url);
diff --git a/plugins/UserCountryMap/javascripts/visitor-map.js b/plugins/UserCountryMap/javascripts/visitor-map.js
index b6a1a24d51..07b5710259 100644
--- a/plugins/UserCountryMap/javascripts/visitor-map.js
+++ b/plugins/UserCountryMap/javascripts/visitor-map.js
@@ -48,7 +48,8 @@
specialMetricsColorScale = colorManager.getColors(
'visitor-map',
['special-metrics-color-scale-1', 'special-metrics-color-scale-2', 'special-metrics-color-scale-3',
- 'special-metrics-color-scale-4']
+ 'special-metrics-color-scale-4'],
+ true
),
countryHighlightColor = colors['country-highlight-color'],
countrySelectedColor = colors['country-selected-color'],
@@ -139,11 +140,34 @@
};
}
- function formatNumber(v) {
+ function formatNumber(v, metric, first) {
v = Number(v);
- return v > 1000000 ? (v / 1000000).toFixed(1) + 'm' :
- v > 1000 ? (v / 1000).toFixed(1) + 'k' :
- v;
+
+ if (v > 1000000) {
+ return (v / 1000000).toFixed(1) + 'm';
+ }
+
+ if (v > 1000) {
+ return (v / 1000).toFixed(1) + 'k';
+ }
+
+ if (!metric) {
+ return v;
+ }
+
+ if (metric == 'avg_time_on_site') {
+ v += first ? ' sec' : 's';
+ } else if (metric == 'bounce_rate') {
+ v += '%';
+ } else if (metric === 'nb_actions_per_visit') {
+ if (parseInt(v, 10) === v) {
+ return v;
+ }
+
+ return v.toFixed(1);
+ }
+
+ return v;
}
//
@@ -197,13 +221,7 @@
function addLegendItem(val, first) {
var d = $('<div>'), r = $('<div>'), l = $('<div>'),
metric = $$('.userCountryMapSelectMetrics').val(),
- v = formatNumber(Math.round(val));
-
- if (metric == 'avg_time_on_site') {
- v += first ? ' sec' : 's';
- } else if (metric == 'bounce_rate') {
- v += '%';
- }
+ v = formatNumber(Math.round(val), metric, first);
d.css({ width: 17, height: 17, float: 'left', background: colscale(val) });
l.css({ 'margin-left': 20, 'line-height': '20px', 'text-align': 'right' }).html(v);
@@ -245,7 +263,7 @@
if (id.length == 3) {
c = (stats.p90 - stats.min) / (stats.max - stats.min);
colscale = chroma.scale(specialMetricsColorScale, [0, c, c + 0.001, 1])
- .domain(chroma.limits(rows, 'c', 5, 'curMetric', filter))
+ .domain(chroma.limits(rows, 'c', 5, 'curMetric', filter), 4, 'c')
.mode('hsl');
}
}
@@ -464,7 +482,7 @@
$('.map-stats').html(formatValueForTooltips(UserCountryMap.countriesByIso[id], metric, 'world'));
} else {
$('.map-stats').html(
- _.nb_visits.replace('%s', '<strong>' + formatNumber(totalVisits) + '</strong>') + (id != 'world' ? ' (' +
+ _.nb_visits.replace('%s', '<strong>' + formatNumber(totalVisits, metric) + '</strong>') + (id != 'world' ? ' (' +
formatPercentage(totalVisits / worldTotalVisits) + ')' : '')
);
}
@@ -887,12 +905,11 @@
$.each(cities, function (i, city) {
sumArea += isNaN(city.curMetric) ? 0 : Math.pow(radscale(city.curMetric), 2);
});
+
maxRad = Math.sqrt(area * f[metric] / sumArea);
radscale = $K.scale.sqrt(cities.concat({ curMetric: 0 }), 'curMetric').range([2, maxRad + 2]);
- var is_rate = metric.substr(0, 3) != 'nb_' || metric == 'nb_actions_per_visit';
-
var citySymbols = map.addSymbols({
type: $K.LabeledBubble,
data: cities,
@@ -902,7 +919,26 @@
tolerance: 0
},
title: function (d) {
- return radscale(d.curMetric) > 10 ? formatNumber(d.curMetric) : '';
+ var v = d.curMetric;
+ if (isNaN(v)) {
+ return '';
+ }
+
+ if (metric === 'bounce_rate') {
+ v = Number((''+ v).replace('%', ''));
+ } else if (metric === 'avg_time_on_site') {
+ v = Number(v);
+ }
+
+ if (isNaN(v)) {
+ return '';
+ }
+
+ if (radscale(v) > 10) {
+ return formatNumber(d.curMetric, metric);
+ }
+
+ return '';
},
labelattrs: {
fill: cityLabelColor,
@@ -912,7 +948,7 @@
},
filter: function (d) {
if (isNaN(d.lat) || isNaN(d.long)) return false;
- return is_rate ? d.nb_visits > 5 && d.curMetric : d.curMetric;
+ return !!d.curMetric && d.curMetric !== '0';
},
aggregate: function (rows) {
var row = aggregate(rows);
@@ -927,14 +963,24 @@
},
sortBy: 'radius desc',
location: function (city) { return [city.long, city.lat]; },
- radius: function (city) { return radscale(city.curMetric); },
+ radius: function (city) {
+ var scale = radscale(city.curMetric);
+ if (isNaN(scale)) {
+ return 0.01;
+ }
+ return scale;
+ },
tooltip: function (city) {
return '<h3>' + city.city_name + '</h3>' +
formatValueForTooltips(city, metric, iso);
},
attrs: function (city) {
+ var color = colscale(city.curMetric);
+ if (color && color.hex) {
+ color = color.hex();
+ }
return {
- fill: colscale(city.curMetric).hex(),
+ fill: color,
'fill-opacity': 0.7,
stroke: cityStrokeColor,
cursor: 'pointer'
diff --git a/plugins/UserCountryMap/lang/ru.json b/plugins/UserCountryMap/lang/ru.json
index 0d43f7d025..5995e7514d 100644
--- a/plugins/UserCountryMap/lang/ru.json
+++ b/plugins/UserCountryMap/lang/ru.json
@@ -1,5 +1,6 @@
{
"UserCountryMap": {
+ "PluginDescription": "Этот плагин предоставляет виджеты Visitor Map и Real-time Map. Внимание: требуется включенный плагин UserCountry.",
"AndNOthers": "и %s других",
"Cities": "Города",
"Countries": "Страны",
diff --git a/plugins/UserCountryMap/lang/sq.json b/plugins/UserCountryMap/lang/sq.json
index fdd2aaac07..a5d35eb293 100644
--- a/plugins/UserCountryMap/lang/sq.json
+++ b/plugins/UserCountryMap/lang/sq.json
@@ -10,6 +10,8 @@
"None": "Asnjë",
"NoVisit": "Pa vizita",
"RealTimeMap": "Hartë e Atypëratyshme",
- "Regions": "Rajone"
+ "Regions": "Rajone",
+ "SecondsAgo": "%s sekonda më parë",
+ "VisitorMap": "Hartë Vizitorësh"
}
} \ No newline at end of file
diff --git a/plugins/UserCountryMap/lang/uk.json b/plugins/UserCountryMap/lang/uk.json
index 2200d02058..0ca0d06247 100644
--- a/plugins/UserCountryMap/lang/uk.json
+++ b/plugins/UserCountryMap/lang/uk.json
@@ -1,5 +1,25 @@
{
"UserCountryMap": {
- "map": "карта"
+ "PluginDescription": "Цей плагін надає віджет відображення відвідувачів на карті в реальному часі. Примітка: вимагає активації плагіну UserCountry.",
+ "AndNOthers": "та %s інших",
+ "Cities": "Міста",
+ "Countries": "Країни",
+ "DaysAgo": "%s днів назад",
+ "GoalConversions": "%s цілей досягнуто",
+ "HoursAgo": "%s годин тому",
+ "map": "мапа",
+ "MinutesAgo": "%s хвилин тому",
+ "None": "Немає",
+ "NoVisit": "Без відвідувань",
+ "RealTimeMap": "Мапа в реальному часі",
+ "Regions": "Регіони",
+ "Searches": "%s пошукових запитів",
+ "SecondsAgo": "%s секунд тому",
+ "ShowingVisits": "Останні геолокаційні відвідування",
+ "Unlocated": "<b>%s<\/b> %p відвідування з %c не можуть бути геолокалізованни.",
+ "VisitorMap": "Мапа відвідувань",
+ "WorldWide": "Весь світ",
+ "WithUnknownRegion": "%s з невідомим регіоном",
+ "WithUnknownCity": "%s з невідомим містом"
}
} \ No newline at end of file
diff --git a/plugins/UserId/.gitignore b/plugins/UserId/.gitignore
new file mode 100644
index 0000000000..c8c9480010
--- /dev/null
+++ b/plugins/UserId/.gitignore
@@ -0,0 +1 @@
+tests/System/processed/*xml \ No newline at end of file
diff --git a/plugins/UserId/API.php b/plugins/UserId/API.php
new file mode 100644
index 0000000000..932e19b113
--- /dev/null
+++ b/plugins/UserId/API.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserId;
+
+use Piwik\Archive;
+use Piwik\Metrics;
+use Piwik\Piwik;
+use Piwik\DataTable;
+use Piwik\DataTable\Row;
+
+/**
+ * API for plugin UserId. Allows to get User IDs table.
+ *
+ * @method static \Piwik\Plugins\UserId\API getInstance()
+ */
+class API extends \Piwik\Plugin\API
+{
+ /**
+ * Get a report of all User Ids.
+ *
+ * @param int $idSite
+ *
+ * @param string $period
+ * @param int $date
+ * @param string|bool $segment
+ *
+ * @return DataTable
+ */
+ public function getUsers($idSite, $period, $date, $segment = false)
+ {
+ Piwik::checkUserHasViewAccess($idSite);
+ $archive = Archive::build($idSite, $period, $date, $segment);
+ $dataTable = $archive->getDataTable(Archiver::USERID_ARCHIVE_RECORD);
+
+ $dataTable->queueFilter('ReplaceColumnNames');
+ $dataTable->queueFilter('ReplaceSummaryRowLabel');
+
+ return $dataTable;
+ }
+}
diff --git a/plugins/UserId/Archiver.php b/plugins/UserId/Archiver.php
new file mode 100644
index 0000000000..28c32bf3c6
--- /dev/null
+++ b/plugins/UserId/Archiver.php
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\UserId;
+use Piwik\Config;
+use Piwik\DataArray;
+use Piwik\DataTable;
+use Piwik\Metrics;
+
+/**
+ * Archiver that aggregates metrics per user ID (user_id field).
+ */
+class Archiver extends \Piwik\Plugin\Archiver
+{
+ const USERID_ARCHIVE_RECORD = "UserId_users";
+
+ const VISITOR_ID_FIELD = 'idvisitor';
+ const USER_ID_FIELD = 'user_id';
+
+ protected $maximumRowsInDataTableLevelZero;
+
+ function __construct($processor)
+ {
+ parent::__construct($processor);
+
+ $this->maximumRowsInDataTableLevelZero = Config::getInstance()->General['datatable_archiving_maximum_rows_userid_users'];
+ }
+
+ /**
+ * @var DataArray
+ */
+ protected $arrays;
+
+ /**
+ * Array to save visitor IDs for every user ID met during archiving process. We use it to
+ * fill metadata before actual inserting rows to DB.
+ * @var array
+ */
+ protected $visitorIdsUserIdsMap = array();
+
+ /**
+ * Archives data for a day period.
+ */
+ public function aggregateDayReport()
+ {
+ $this->arrays = new DataArray();
+ $this->aggregateUsers();
+ $this->insertDayReports();
+ }
+ /**
+ * Period archiving: simply sums up daily archives
+ */
+ public function aggregateMultipleReports()
+ {
+ $dataTableRecords = array(self::USERID_ARCHIVE_RECORD);
+ $columnsAggregationOperation = null;
+ $this->getProcessor()->aggregateDataTableRecords(
+ $dataTableRecords,
+ $this->maximumRowsInDataTableLevelZero,
+ $this->maximumRowsInDataTableLevelZero,
+ $columnToSort = 'nb_visits',
+ $columnsAggregationOperation,
+ $columnsToRenameAfterAggregation = null,
+ $countRowsRecursive = array());
+ }
+
+ /**
+ * Used to aggregate daily data per user ID
+ */
+ protected function aggregateUsers()
+ {
+ $userIdFieldName = self::USER_ID_FIELD;
+ $visitorIdFieldName = self::VISITOR_ID_FIELD;
+
+ /** @var \Zend_Db_Statement $query */
+ $query = $this->getLogAggregator()->queryVisitsByDimension(
+ array(self::USER_ID_FIELD),
+ "$userIdFieldName IS NOT NULL AND $userIdFieldName != ''",
+ array("LOWER(HEX($visitorIdFieldName)) as $visitorIdFieldName")
+ );
+
+ if ($query === false) {
+ return;
+ }
+
+ $rowsCount = 0;
+ while ($row = $query->fetch()) {
+ $rowsCount++;
+ $this->arrays->sumMetricsVisits($row[$userIdFieldName], $row);
+ $this->rememberVisitorId($row);
+ }
+ }
+
+ /**
+ * Insert aggregated daily data serialized
+ *
+ * @throws \Exception
+ */
+ protected function insertDayReports()
+ {
+ /** @var DataTable $dataTable */
+ $dataTable = $this->arrays->asDataTable();
+ $this->setVisitorIds($dataTable);
+ $report = $dataTable->getSerialized($this->maximumRowsInDataTableLevelZero, null, Metrics::INDEX_NB_VISITS);
+ $this->getProcessor()->insertBlobRecord(self::USERID_ARCHIVE_RECORD, $report);
+ }
+
+ /**
+ * Remember visitor ID per user. We use it to fill metadata before actual inserting rows to DB.
+ *
+ * @param array $row
+ */
+ private function rememberVisitorId($row)
+ {
+ if (!empty($row[self::USER_ID_FIELD]) && !empty($row[self::VISITOR_ID_FIELD])) {
+ $this->visitorIdsUserIdsMap[$row[self::USER_ID_FIELD]] = $row[self::VISITOR_ID_FIELD];
+ }
+ }
+
+ /**
+ * Fill visitor ID as metadata before actual inserting rows to DB.
+ *
+ * @param DataTable $dataTable
+ */
+ private function setVisitorIds(DataTable $dataTable)
+ {
+ foreach ($dataTable->getRows() as $row) {
+ $userId = $row->getColumn('label');
+ if (isset($this->visitorIdsUserIdsMap[$userId])) {
+ $row->setMetadata(self::VISITOR_ID_FIELD, $this->visitorIdsUserIdsMap[$userId]);
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/plugins/UserId/Columns/UserId.php b/plugins/UserId/Columns/UserId.php
new file mode 100644
index 0000000000..7ac474cf73
--- /dev/null
+++ b/plugins/UserId/Columns/UserId.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserId\Columns;
+
+use Piwik\Piwik;
+use Piwik\Plugin\Dimension\VisitDimension;
+
+/**
+ * UserId dimension
+ */
+class UserId extends VisitDimension
+{
+
+ /**
+ * The name of the dimension which will be visible for instance in the UI of a related report and in the mobile app.
+ * @return string
+ */
+ public function getName()
+ {
+ return Piwik::translate('UserId_UserId');
+ }
+
+} \ No newline at end of file
diff --git a/plugins/UserId/Reports/Base.php b/plugins/UserId/Reports/Base.php
new file mode 100644
index 0000000000..aa3f70e197
--- /dev/null
+++ b/plugins/UserId/Reports/Base.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserId\Reports;
+
+use Piwik\Plugin\Report;
+
+abstract class Base extends Report
+{
+ protected function init()
+ {
+ $this->categoryId = 'General_Visitors';
+ }
+}
diff --git a/plugins/UserId/Reports/GetUsers.php b/plugins/UserId/Reports/GetUsers.php
new file mode 100644
index 0000000000..776c29e02f
--- /dev/null
+++ b/plugins/UserId/Reports/GetUsers.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\UserId\Reports;
+
+use Piwik\Piwik;
+use Piwik\Plugin\ViewDataTable;
+use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
+use Piwik\Plugins\UserId\Columns\UserId;
+use Piwik\Report\ReportWidgetFactory;
+use Piwik\Widget\WidgetsList;
+
+/**
+ * A report showing all unique user IDs and some aggregated information about them. It also allows
+ * to open a popover with visitor details
+ */
+class GetUsers extends Base
+{
+ protected function init()
+ {
+ parent::init();
+
+ $this->name = Piwik::translate('UserId_UserReportTitle');
+ $this->subcategoryId = 'UserId_UserReportTitle';
+ $this->documentation = '';
+ $this->dimension = new UserId();
+ $this->metrics = array('label', 'nb_visits', 'nb_actions', 'nb_visits_converted');
+
+ // This defines in which order your report appears in the mobile app, in the menu and in the list of widgets
+ $this->order = 9;
+ }
+
+ /**
+ * @return array
+ */
+ public static function getColumnsToDisplay()
+ {
+ return array();
+ }
+
+ /**
+ * @param ViewDataTable $view
+ */
+ public function configureView(ViewDataTable $view)
+ {
+ $view->config->addTranslation('label', Piwik::translate('General_UserId'));
+ $view->config->addTranslation('nb_visits_converted', Piwik::translate('General_VisitConvertedGoal'));
+
+ /*
+ * Hide most of the table footer actions, leaving only export icons and pagination
+ */
+ $view->config->columns_to_display = $this->metrics;
+ $view->config->show_all_views_icons = false;
+ $view->config->show_active_view_icon = false;
+ $view->config->show_related_reports = false;
+ $view->config->show_insights = false;
+ $view->config->show_pivot_by_subtable = false;
+ $view->config->show_flatten_table = false;
+
+ if ($view->isViewDataTableId(HtmlTable::ID)) {
+ $view->config->disable_row_evolution = false;
+ }
+
+ // exclude users with less then 2 visits, when low population filter is active
+ $view->requestConfig->filter_excludelowpop_value = 2;
+ }
+}
diff --git a/plugins/UserId/UserId.php b/plugins/UserId/UserId.php
new file mode 100644
index 0000000000..b69f47c4e7
--- /dev/null
+++ b/plugins/UserId/UserId.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\UserId;
+
+use Piwik\Db;
+
+/**
+ * Plugin adds a new Users report showing all unique user IDs and some aggregated data
+ */
+class UserId extends \Piwik\Plugin
+{
+ /**
+ * Register event observers
+ *
+ * @return array
+ */
+ public function registerEvents()
+ {
+ return array(
+ // Add plugin's custom JS files
+ 'AssetManager.getJavaScriptFiles' => 'getJavaScriptFiles',
+ // Add translations for the client side JS
+ 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
+ );
+ }
+
+ /**
+ * Add a custom JS to the page. It adds possibility to open visitor details popover for each
+ * user ID in a report table
+ *
+ * @param $jsFiles
+ */
+ public function getJavaScriptFiles(&$jsFiles)
+ {
+ $jsFiles[] = "plugins/UserId/javascripts/rowaction.js";
+ }
+
+ /**
+ * Add translations for the client side JS
+ *
+ * @param $translationKeys
+ */
+ public function getClientSideTranslationKeys(&$translationKeys)
+ {
+ $translationKeys[] = "Live_ViewVisitorProfile";
+ }
+}
diff --git a/plugins/UserId/images/visitordetails-hover.png b/plugins/UserId/images/visitordetails-hover.png
new file mode 100644
index 0000000000..523a8ac6b4
--- /dev/null
+++ b/plugins/UserId/images/visitordetails-hover.png
Binary files differ
diff --git a/plugins/UserId/images/visitordetails.png b/plugins/UserId/images/visitordetails.png
new file mode 100644
index 0000000000..423392db75
--- /dev/null
+++ b/plugins/UserId/images/visitordetails.png
Binary files differ
diff --git a/plugins/UserId/javascripts/rowaction.js b/plugins/UserId/javascripts/rowaction.js
new file mode 100644
index 0000000000..d100c1f3f5
--- /dev/null
+++ b/plugins/UserId/javascripts/rowaction.js
@@ -0,0 +1,74 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+/**
+ * This file registers the visitor details overlay row action on the user IDs list page.
+ */
+(function () {
+
+ var actionName = 'visitorDetails';
+
+ function DataTable_RowActions_VisitorDetails(dataTable) {
+ this.dataTable = dataTable;
+ this.actionName = actionName;
+ this.trEventName = 'piwikTriggerVisitorDetailsAction';
+ }
+
+ DataTable_RowActions_VisitorDetails.prototype = new DataTable_RowAction();
+
+ DataTable_RowActions_VisitorDetails.prototype.performAction = function (label, tr, e) {
+ var visitorId = this.getRowMetadata($(tr)).idvisitor || '';
+ visitorId = encodeURIComponent(visitorId);
+ if (visitorId.length > 0) {
+ DataTable_RowAction.prototype.openPopover.apply(this, ['module=Live&action=getVisitorProfilePopup&visitorId=' + visitorId]);
+ }
+ };
+
+ DataTable_RowActions_VisitorDetails.prototype.doOpenPopover = function (urlParam) {
+ Piwik_Popover.createPopupAndLoadUrl(urlParam, _pk_translate('Live_VisitorProfile'), 'visitor-profile-popup');
+ };
+
+ DataTable_RowActions_Registry.register({
+
+ name: actionName,
+
+ instance: null,
+
+ dataTableIcon: 'plugins/UserId/images/visitordetails.png',
+ dataTableIconHover: 'plugins/UserId/images/visitordetails-hover.png',
+
+ order: 30,
+
+ dataTableIconTooltip: [
+ _pk_translate('Live_ViewVisitorProfile'),
+ ''
+ ],
+
+ isAvailableOnReport: function (dataTableParams, undefined) {
+ return dataTableParams.module == 'UserId';
+ },
+
+ isAvailableOnRow: function (dataTableParams, tr) {
+ return DataTable_RowAction.prototype.getRowMetadata(tr).hasOwnProperty('idvisitor');
+ },
+
+ createInstance: function (dataTable, param) {
+ if (dataTable !== null && typeof dataTable.visitorDetailsInstance != 'undefined') {
+ return dataTable.segmentVisitorLogInstance;
+ }
+
+ var instance = new DataTable_RowActions_VisitorDetails(dataTable);
+ if (dataTable !== null) {
+ dataTable.visitorDetailsInstance = instance;
+ }
+
+ this.instance = instance;
+
+ return instance;
+ }
+ });
+})(); \ No newline at end of file
diff --git a/plugins/UserId/lang/am.json b/plugins/UserId/lang/am.json
new file mode 100644
index 0000000000..89b16469da
--- /dev/null
+++ b/plugins/UserId/lang/am.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "ተጠቃሚዎች"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/ar.json b/plugins/UserId/lang/ar.json
new file mode 100644
index 0000000000..20c6e62bdb
--- /dev/null
+++ b/plugins/UserId/lang/ar.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "المستخدمون"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/be.json b/plugins/UserId/lang/be.json
new file mode 100644
index 0000000000..db19effcfb
--- /dev/null
+++ b/plugins/UserId/lang/be.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Карыстачы"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/bg.json b/plugins/UserId/lang/bg.json
new file mode 100644
index 0000000000..2265cef2c2
--- /dev/null
+++ b/plugins/UserId/lang/bg.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Потребители"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/ca.json b/plugins/UserId/lang/ca.json
new file mode 100644
index 0000000000..ef7056f9df
--- /dev/null
+++ b/plugins/UserId/lang/ca.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Usuaris"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/cs.json b/plugins/UserId/lang/cs.json
new file mode 100644
index 0000000000..e5e54b8aaf
--- /dev/null
+++ b/plugins/UserId/lang/cs.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "UserId",
+ "UserReportTitle": "Uživatelé",
+ "PluginDescription": "Zobrazí reporty uživatel"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/da.json b/plugins/UserId/lang/da.json
new file mode 100644
index 0000000000..399a31080b
--- /dev/null
+++ b/plugins/UserId/lang/da.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Brugere"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/de.json b/plugins/UserId/lang/de.json
new file mode 100644
index 0000000000..d2543cfcbf
--- /dev/null
+++ b/plugins/UserId/lang/de.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "Benutzer-ID",
+ "UserReportTitle": "Benutzer",
+ "PluginDescription": "Zeigt Benutzer-Berichte"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/el.json b/plugins/UserId/lang/el.json
new file mode 100644
index 0000000000..f9ffd5b451
--- /dev/null
+++ b/plugins/UserId/lang/el.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "Αναγνωριστικό χρήστη",
+ "UserReportTitle": "Χρήστες",
+ "PluginDescription": "Εμφανίζει τις αναφορές χρηστών"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/en.json b/plugins/UserId/lang/en.json
new file mode 100644
index 0000000000..40d9f3660d
--- /dev/null
+++ b/plugins/UserId/lang/en.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "UserId",
+ "UserReportTitle": "Users",
+ "PluginDescription": "Shows user reports"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/es.json b/plugins/UserId/lang/es.json
new file mode 100644
index 0000000000..98b725a25a
--- /dev/null
+++ b/plugins/UserId/lang/es.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Usuarios"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/et.json b/plugins/UserId/lang/et.json
new file mode 100644
index 0000000000..0777e69781
--- /dev/null
+++ b/plugins/UserId/lang/et.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Kasutajaid"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/eu.json b/plugins/UserId/lang/eu.json
new file mode 100644
index 0000000000..9e73f162f5
--- /dev/null
+++ b/plugins/UserId/lang/eu.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Erabiltzaileak"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/fa.json b/plugins/UserId/lang/fa.json
new file mode 100644
index 0000000000..e1a99adfe3
--- /dev/null
+++ b/plugins/UserId/lang/fa.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "کاربران"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/fi.json b/plugins/UserId/lang/fi.json
new file mode 100644
index 0000000000..72950a6649
--- /dev/null
+++ b/plugins/UserId/lang/fi.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Käyttäjät"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/fr.json b/plugins/UserId/lang/fr.json
new file mode 100644
index 0000000000..f0ec8c6d8d
--- /dev/null
+++ b/plugins/UserId/lang/fr.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "UserId",
+ "UserReportTitle": "Utilisateurs",
+ "PluginDescription": "Affiche les rapports utilisateur"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/gl.json b/plugins/UserId/lang/gl.json
new file mode 100644
index 0000000000..617065bb0d
--- /dev/null
+++ b/plugins/UserId/lang/gl.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Usuario"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/he.json b/plugins/UserId/lang/he.json
new file mode 100644
index 0000000000..35c16ba1e9
--- /dev/null
+++ b/plugins/UserId/lang/he.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "משתמשים"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/hi.json b/plugins/UserId/lang/hi.json
new file mode 100644
index 0000000000..a03ecf9b7c
--- /dev/null
+++ b/plugins/UserId/lang/hi.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "उपयोगकर्ता"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/hr.json b/plugins/UserId/lang/hr.json
new file mode 100644
index 0000000000..9f34d4a7cb
--- /dev/null
+++ b/plugins/UserId/lang/hr.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Korisnici"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/hu.json b/plugins/UserId/lang/hu.json
new file mode 100644
index 0000000000..afd68b2ac8
--- /dev/null
+++ b/plugins/UserId/lang/hu.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Felhasználók"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/id.json b/plugins/UserId/lang/id.json
new file mode 100644
index 0000000000..67985af03f
--- /dev/null
+++ b/plugins/UserId/lang/id.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Pengguna"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/is.json b/plugins/UserId/lang/is.json
new file mode 100644
index 0000000000..b5af86b45e
--- /dev/null
+++ b/plugins/UserId/lang/is.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Notendur"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/it.json b/plugins/UserId/lang/it.json
new file mode 100644
index 0000000000..ec2e4beb8d
--- /dev/null
+++ b/plugins/UserId/lang/it.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "Id Utente",
+ "UserReportTitle": "Utenti",
+ "PluginDescription": "Mostra i report utente"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/ja.json b/plugins/UserId/lang/ja.json
new file mode 100644
index 0000000000..b1c2060004
--- /dev/null
+++ b/plugins/UserId/lang/ja.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "ユーザー"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/ka.json b/plugins/UserId/lang/ka.json
new file mode 100644
index 0000000000..b1db014206
--- /dev/null
+++ b/plugins/UserId/lang/ka.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "მომხმარებლები"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/ko.json b/plugins/UserId/lang/ko.json
new file mode 100644
index 0000000000..e68c34e7f2
--- /dev/null
+++ b/plugins/UserId/lang/ko.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "사용자"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/lt.json b/plugins/UserId/lang/lt.json
new file mode 100644
index 0000000000..9d60aaa439
--- /dev/null
+++ b/plugins/UserId/lang/lt.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Naudotojai"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/lv.json b/plugins/UserId/lang/lv.json
new file mode 100644
index 0000000000..630778b101
--- /dev/null
+++ b/plugins/UserId/lang/lv.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Lietotāji"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/nb.json b/plugins/UserId/lang/nb.json
new file mode 100644
index 0000000000..b8404858f2
--- /dev/null
+++ b/plugins/UserId/lang/nb.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "Bruker-ID",
+ "UserReportTitle": "Brukere",
+ "PluginDescription": "Vises brukerrapporter"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/nl.json b/plugins/UserId/lang/nl.json
new file mode 100644
index 0000000000..7c4446cd64
--- /dev/null
+++ b/plugins/UserId/lang/nl.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "Gebruikers-ID",
+ "UserReportTitle": "Gebruikers",
+ "PluginDescription": "Toont gebruikerrapporten"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/nn.json b/plugins/UserId/lang/nn.json
new file mode 100644
index 0000000000..fd50467a5c
--- /dev/null
+++ b/plugins/UserId/lang/nn.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Brukarar"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/pl.json b/plugins/UserId/lang/pl.json
new file mode 100644
index 0000000000..3372d2057a
--- /dev/null
+++ b/plugins/UserId/lang/pl.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Użytkownicy"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/pt-br.json b/plugins/UserId/lang/pt-br.json
new file mode 100644
index 0000000000..43e1b12fec
--- /dev/null
+++ b/plugins/UserId/lang/pt-br.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "UserId",
+ "UserReportTitle": "Usuários",
+ "PluginDescription": "Mostra relatórios de usuários"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/pt.json b/plugins/UserId/lang/pt.json
new file mode 100644
index 0000000000..f0724879a7
--- /dev/null
+++ b/plugins/UserId/lang/pt.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Utilizadores"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/ro.json b/plugins/UserId/lang/ro.json
new file mode 100644
index 0000000000..c6670264b2
--- /dev/null
+++ b/plugins/UserId/lang/ro.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Utilizatori"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/ru.json b/plugins/UserId/lang/ru.json
new file mode 100644
index 0000000000..353190053a
--- /dev/null
+++ b/plugins/UserId/lang/ru.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Пользователи"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/sk.json b/plugins/UserId/lang/sk.json
new file mode 100644
index 0000000000..be0f5fbf12
--- /dev/null
+++ b/plugins/UserId/lang/sk.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Používatelia"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/sl.json b/plugins/UserId/lang/sl.json
new file mode 100644
index 0000000000..6a3b1959d6
--- /dev/null
+++ b/plugins/UserId/lang/sl.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Uporabniki"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/sq.json b/plugins/UserId/lang/sq.json
new file mode 100644
index 0000000000..2c8c14380c
--- /dev/null
+++ b/plugins/UserId/lang/sq.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Përdorues"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/sr.json b/plugins/UserId/lang/sr.json
new file mode 100644
index 0000000000..9f34d4a7cb
--- /dev/null
+++ b/plugins/UserId/lang/sr.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Korisnici"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/sv.json b/plugins/UserId/lang/sv.json
new file mode 100644
index 0000000000..98e102901d
--- /dev/null
+++ b/plugins/UserId/lang/sv.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "Användar ID",
+ "UserReportTitle": "Användare",
+ "PluginDescription": "Visa användarrapporter"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/ta.json b/plugins/UserId/lang/ta.json
new file mode 100644
index 0000000000..b8b8e7ec01
--- /dev/null
+++ b/plugins/UserId/lang/ta.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "பாவனையாளர்கள்"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/te.json b/plugins/UserId/lang/te.json
new file mode 100644
index 0000000000..57139b029a
--- /dev/null
+++ b/plugins/UserId/lang/te.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "వాడుకరులు"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/th.json b/plugins/UserId/lang/th.json
new file mode 100644
index 0000000000..850ec2b335
--- /dev/null
+++ b/plugins/UserId/lang/th.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "ผู้ใช้"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/tl.json b/plugins/UserId/lang/tl.json
new file mode 100644
index 0000000000..9c7f9b544f
--- /dev/null
+++ b/plugins/UserId/lang/tl.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Users"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/tr.json b/plugins/UserId/lang/tr.json
new file mode 100644
index 0000000000..9aec350fb0
--- /dev/null
+++ b/plugins/UserId/lang/tr.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Kullanıcılar"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/uk.json b/plugins/UserId/lang/uk.json
new file mode 100644
index 0000000000..6ecfc09fe4
--- /dev/null
+++ b/plugins/UserId/lang/uk.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "Користувачі"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/vi.json b/plugins/UserId/lang/vi.json
new file mode 100644
index 0000000000..5fa38b3ff8
--- /dev/null
+++ b/plugins/UserId/lang/vi.json
@@ -0,0 +1,7 @@
+{
+ "UserId": {
+ "UserId": "ID người dùng",
+ "UserReportTitle": "Các người dùng",
+ "PluginDescription": "Hiển thị báo cáo người dùng"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/zh-cn.json b/plugins/UserId/lang/zh-cn.json
new file mode 100644
index 0000000000..b6bdb6f51d
--- /dev/null
+++ b/plugins/UserId/lang/zh-cn.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "用户管理"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/lang/zh-tw.json b/plugins/UserId/lang/zh-tw.json
new file mode 100644
index 0000000000..35697dc6fd
--- /dev/null
+++ b/plugins/UserId/lang/zh-tw.json
@@ -0,0 +1,5 @@
+{
+ "UserId": {
+ "UserReportTitle": "使用者"
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/tests/Fixtures/TrackFewVisitsAndCreateUsers.php b/plugins/UserId/tests/Fixtures/TrackFewVisitsAndCreateUsers.php
new file mode 100644
index 0000000000..3c5ac0fcbd
--- /dev/null
+++ b/plugins/UserId/tests/Fixtures/TrackFewVisitsAndCreateUsers.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Plugins\UserId\tests\Fixtures;
+
+use Piwik\Date;
+use Piwik\Plugins\UserId\API;
+use Piwik\Tests\Framework\Fixture;
+
+/**
+ * Generates visits with user IDs and creates the user IDs index for testing
+ */
+class TrackFewVisitsAndCreateUsers extends Fixture
+{
+ public $dateTime = '2010-02-01 11:22:33';
+ public $idSite = 1;
+
+ public function setUp()
+ {
+ if (!self::siteCreated($idSite = 1)) {
+ self::createWebsite($this->dateTime);
+ }
+
+ $this->trackVisits();
+ }
+
+ private function trackVisits()
+ {
+ $t = self::getTracker($this->idSite, $this->dateTime, $defaultInit = true);
+ $t->setTokenAuth(self::getTokenAuth());
+ $t->enableBulkTracking();
+
+ foreach (array('user1', 'user2', 'user3') as $key => $userId) {
+ for ($numVisits = 0; $numVisits < ($key+1) * 10; $numVisits++) {
+ $t->setUserId($userId);
+ if ($numVisits % 5 == 0) {
+ $t->doTrackSiteSearch('some search term');
+ }
+ if ($numVisits % 4 == 0) {
+ $t->doTrackEvent('Event action', 'event cat');
+ }
+ $t->setForceNewVisit();
+ $t->setUrl('http://example.org/my/dir/page' . ($numVisits % 4));
+
+ $visitDateTime = Date::factory($this->dateTime)->addDay($numVisits)->getDatetime();
+ $t->setForceVisitDateTime($visitDateTime);
+
+ self::assertTrue($t->doTrackPageView('incredible title ' . ($numVisits % 3)));
+ }
+ }
+
+ self::checkBulkTrackingResponse($t->doBulkTrack());
+ }
+} \ No newline at end of file
diff --git a/plugins/UserId/tests/System/ApiTest.php b/plugins/UserId/tests/System/ApiTest.php
new file mode 100644
index 0000000000..ca73c2792d
--- /dev/null
+++ b/plugins/UserId/tests/System/ApiTest.php
@@ -0,0 +1,154 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\UserId\tests\System;
+
+use Piwik\Plugins\UserId\tests\Fixtures\TrackFewVisitsAndCreateUsers;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+
+/**
+ * Run system tests against the UserId.getUsers API method
+ *
+ * @group UserId
+ * @group ApiTest
+ * @group Plugins
+ */
+class ApiTest extends SystemTestCase
+{
+ /**
+ * @var TrackFewVisitsAndCreateUsers
+ */
+ public static $fixture;
+
+ /**
+ * @dataProvider getApiForTesting
+ */
+ public function testApi($api, $params)
+ {
+ $this->runApiTests($api, $params);
+ }
+
+ public function getApiForTesting()
+ {
+ $api = 'UserId.getUsers';
+ $startDate = substr(self::$fixture->dateTime, 0, 10);
+ $endDate = date('Y-m-d', strtotime($startDate) + 3600*24*365);
+
+ $apiToTest = array();
+ $apiToTest[] = array(
+ $api,
+ array(
+ 'date' => $startDate,
+ 'periods' => array('day'),
+ 'idSite' => 1,
+ 'testSuffix' => ''
+ )
+ );
+ $apiToTest[] = array(
+ $api,
+ array(
+ 'date' => "$startDate,$endDate",
+ 'periods' => array('range'),
+ 'idSite' => 1,
+ 'testSuffix' => ''
+ )
+ );
+
+ $apiToTest[] = array(
+ $api,
+ array(
+ 'date' => $startDate,
+ 'periods' => array('day'),
+ 'idSite' => 1,
+ 'testSuffix' => 'limit',
+ 'otherRequestParameters' => array(
+ 'filter_limit' => '2',
+ 'filter_offset' => '1',
+ )
+ )
+ );
+ $apiToTest[] = array(
+ $api,
+ array(
+ 'date' => "$startDate,$endDate",
+ 'periods' => array('range'),
+ 'idSite' => 1,
+ 'testSuffix' => 'limit',
+ 'otherRequestParameters' => array(
+ 'filter_limit' => '2',
+ 'filter_offset' => '1',
+ )
+ )
+ );
+
+ $apiToTest[] = array(
+ $api,
+ array(
+ 'date' => $startDate,
+ 'periods' => array('day'),
+ 'idSite' => 1,
+ 'testSuffix' => 'ascSortOrder',
+ 'otherRequestParameters' => array(
+ 'filter_sort_order' => 'asc',
+ )
+ )
+ );
+ $apiToTest[] = array(
+ $api,
+ array(
+ 'date' => "$startDate,$endDate",
+ 'periods' => array('range'),
+ 'idSite' => 1,
+ 'testSuffix' => 'ascSortOrder',
+ 'otherRequestParameters' => array(
+ 'filter_sort_order' => 'asc',
+ )
+ )
+ );
+
+ $apiToTest[] = array(
+ $api,
+ array(
+ 'date' => $startDate,
+ 'periods' => array('day'),
+ 'idSite' => 1,
+ 'testSuffix' => 'searchByUserId',
+ 'otherRequestParameters' => array(
+ 'filter_pattern' => 'user2'
+ )
+ )
+ );
+ $apiToTest[] = array(
+ $api,
+ array(
+ 'date' => "$startDate,$endDate",
+ 'periods' => array('range'),
+ 'idSite' => 1,
+ 'testSuffix' => 'searchByUserId',
+ 'otherRequestParameters' => array(
+ 'filter_pattern' => 'user2'
+ )
+ )
+ );
+
+ return $apiToTest;
+ }
+
+ public static function getOutputPrefix()
+ {
+ return '';
+ }
+
+ public static function getPathToTestDirectory()
+ {
+ return dirname(__FILE__);
+ }
+
+}
+
+ApiTest::$fixture = new TrackFewVisitsAndCreateUsers(); \ No newline at end of file
diff --git a/plugins/UserId/tests/System/expected/test___UserId.getUsers_day.xml b/plugins/UserId/tests/System/expected/test___UserId.getUsers_day.xml
new file mode 100644
index 0000000000..19e7d78d39
--- /dev/null
+++ b/plugins/UserId/tests/System/expected/test___UserId.getUsers_day.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>user1</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>3</nb_actions>
+ <nb_users>1</nb_users>
+ <max_actions>2</max_actions>
+ <sum_visit_length>1</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <idvisitor>b3daa77b4c04a955</idvisitor>
+ </row>
+ <row>
+ <label>user2</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>1</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <idvisitor>a1881c06eec96db9</idvisitor>
+ </row>
+ <row>
+ <label>user3</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>1</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <idvisitor>0b7f849446d33835</idvisitor>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UserId/tests/System/expected/test___UserId.getUsers_range.xml b/plugins/UserId/tests/System/expected/test___UserId.getUsers_range.xml
new file mode 100644
index 0000000000..184a718ff4
--- /dev/null
+++ b/plugins/UserId/tests/System/expected/test___UserId.getUsers_range.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>user3</label>
+ <nb_visits>31</nb_visits>
+ <nb_actions>44</nb_actions>
+ <max_actions>3</max_actions>
+ <sum_visit_length>12</sum_visit_length>
+ <bounce_count>19</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>30</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>30</sum_daily_nb_users>
+ <idvisitor>0b7f849446d33835</idvisitor>
+ </row>
+ <row>
+ <label>user2</label>
+ <nb_visits>21</nb_visits>
+ <nb_actions>29</nb_actions>
+ <max_actions>2</max_actions>
+ <sum_visit_length>8</sum_visit_length>
+ <bounce_count>13</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>20</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>20</sum_daily_nb_users>
+ <idvisitor>a1881c06eec96db9</idvisitor>
+ </row>
+ <row>
+ <label>user1</label>
+ <nb_visits>11</nb_visits>
+ <nb_actions>15</nb_actions>
+ <max_actions>2</max_actions>
+ <sum_visit_length>4</sum_visit_length>
+ <bounce_count>7</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>10</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>10</sum_daily_nb_users>
+ <idvisitor>b3daa77b4c04a955</idvisitor>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UserId/tests/System/expected/test_ascSortOrder__UserId.getUsers_day.xml b/plugins/UserId/tests/System/expected/test_ascSortOrder__UserId.getUsers_day.xml
new file mode 100644
index 0000000000..9cf17c8b03
--- /dev/null
+++ b/plugins/UserId/tests/System/expected/test_ascSortOrder__UserId.getUsers_day.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>user3</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>1</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <idvisitor>0b7f849446d33835</idvisitor>
+ </row>
+ <row>
+ <label>user2</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>1</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <idvisitor>a1881c06eec96db9</idvisitor>
+ </row>
+ <row>
+ <label>user1</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>3</nb_actions>
+ <nb_users>1</nb_users>
+ <max_actions>2</max_actions>
+ <sum_visit_length>1</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <idvisitor>b3daa77b4c04a955</idvisitor>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UserId/tests/System/expected/test_ascSortOrder__UserId.getUsers_range.xml b/plugins/UserId/tests/System/expected/test_ascSortOrder__UserId.getUsers_range.xml
new file mode 100644
index 0000000000..99aa12454a
--- /dev/null
+++ b/plugins/UserId/tests/System/expected/test_ascSortOrder__UserId.getUsers_range.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>user1</label>
+ <nb_visits>11</nb_visits>
+ <nb_actions>15</nb_actions>
+ <max_actions>2</max_actions>
+ <sum_visit_length>4</sum_visit_length>
+ <bounce_count>7</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>10</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>10</sum_daily_nb_users>
+ <idvisitor>b3daa77b4c04a955</idvisitor>
+ </row>
+ <row>
+ <label>user2</label>
+ <nb_visits>21</nb_visits>
+ <nb_actions>29</nb_actions>
+ <max_actions>2</max_actions>
+ <sum_visit_length>8</sum_visit_length>
+ <bounce_count>13</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>20</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>20</sum_daily_nb_users>
+ <idvisitor>a1881c06eec96db9</idvisitor>
+ </row>
+ <row>
+ <label>user3</label>
+ <nb_visits>31</nb_visits>
+ <nb_actions>44</nb_actions>
+ <max_actions>3</max_actions>
+ <sum_visit_length>12</sum_visit_length>
+ <bounce_count>19</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>30</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>30</sum_daily_nb_users>
+ <idvisitor>0b7f849446d33835</idvisitor>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UserId/tests/System/expected/test_limit__UserId.getUsers_day.xml b/plugins/UserId/tests/System/expected/test_limit__UserId.getUsers_day.xml
new file mode 100644
index 0000000000..52fcd98131
--- /dev/null
+++ b/plugins/UserId/tests/System/expected/test_limit__UserId.getUsers_day.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>user2</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>1</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <idvisitor>a1881c06eec96db9</idvisitor>
+ </row>
+ <row>
+ <label>user3</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>1</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <idvisitor>0b7f849446d33835</idvisitor>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UserId/tests/System/expected/test_limit__UserId.getUsers_range.xml b/plugins/UserId/tests/System/expected/test_limit__UserId.getUsers_range.xml
new file mode 100644
index 0000000000..9545aadbb7
--- /dev/null
+++ b/plugins/UserId/tests/System/expected/test_limit__UserId.getUsers_range.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>user2</label>
+ <nb_visits>21</nb_visits>
+ <nb_actions>29</nb_actions>
+ <max_actions>2</max_actions>
+ <sum_visit_length>8</sum_visit_length>
+ <bounce_count>13</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>20</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>20</sum_daily_nb_users>
+ <idvisitor>a1881c06eec96db9</idvisitor>
+ </row>
+ <row>
+ <label>user1</label>
+ <nb_visits>11</nb_visits>
+ <nb_actions>15</nb_actions>
+ <max_actions>2</max_actions>
+ <sum_visit_length>4</sum_visit_length>
+ <bounce_count>7</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>10</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>10</sum_daily_nb_users>
+ <idvisitor>b3daa77b4c04a955</idvisitor>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UserId/tests/System/expected/test_searchByUserId__UserId.getUsers_day.xml b/plugins/UserId/tests/System/expected/test_searchByUserId__UserId.getUsers_day.xml
new file mode 100644
index 0000000000..ac2a60152a
--- /dev/null
+++ b/plugins/UserId/tests/System/expected/test_searchByUserId__UserId.getUsers_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>user2</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_users>1</nb_users>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <idvisitor>a1881c06eec96db9</idvisitor>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UserId/tests/System/expected/test_searchByUserId__UserId.getUsers_range.xml b/plugins/UserId/tests/System/expected/test_searchByUserId__UserId.getUsers_range.xml
new file mode 100644
index 0000000000..ec3854dfb3
--- /dev/null
+++ b/plugins/UserId/tests/System/expected/test_searchByUserId__UserId.getUsers_range.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>user2</label>
+ <nb_visits>21</nb_visits>
+ <nb_actions>29</nb_actions>
+ <max_actions>2</max_actions>
+ <sum_visit_length>8</sum_visit_length>
+ <bounce_count>13</bounce_count>
+ <nb_visits_converted>0</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>20</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>20</sum_daily_nb_users>
+ <idvisitor>a1881c06eec96db9</idvisitor>
+ </row>
+</result> \ No newline at end of file
diff --git a/plugins/UserLanguage/lang/nl.json b/plugins/UserLanguage/lang/nl.json
index 9fc58a90a1..308e113701 100644
--- a/plugins/UserLanguage/lang/nl.json
+++ b/plugins/UserLanguage/lang/nl.json
@@ -1,7 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Browsertaal",
- "LanguageCode": "Taal code",
+ "LanguageCode": "Taalcode",
"PluginDescription": "Toont de taal die gebruikt wordt door browsers van uw bezoekers."
}
} \ No newline at end of file
diff --git a/plugins/UserLanguage/lang/sq.json b/plugins/UserLanguage/lang/sq.json
index 4c35237002..83ee7ab2d1 100644
--- a/plugins/UserLanguage/lang/sq.json
+++ b/plugins/UserLanguage/lang/sq.json
@@ -1,6 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Gjuhë shfletuesi",
- "LanguageCode": "Kod Gjuhe"
+ "LanguageCode": "Kod Gjuhe",
+ "PluginDescription": "Raporton gjuhën e përdorur nga shfletuesit e vizitorëve tuaj."
}
} \ No newline at end of file
diff --git a/plugins/UserLanguage/lang/uk.json b/plugins/UserLanguage/lang/uk.json
index 72fd7b22e1..0334cf2703 100644
--- a/plugins/UserLanguage/lang/uk.json
+++ b/plugins/UserLanguage/lang/uk.json
@@ -1,5 +1,7 @@
{
"UserLanguage": {
- "LanguageCode": "Код мови"
+ "BrowserLanguage": "Мова браузеру",
+ "LanguageCode": "Код мови",
+ "PluginDescription": "Повідомляє про мови, які використовуються у відвідувачів в браузері"
}
} \ No newline at end of file
diff --git a/plugins/UserLanguage/lang/vi.json b/plugins/UserLanguage/lang/vi.json
index 69321e4fa5..bc46f37b56 100644
--- a/plugins/UserLanguage/lang/vi.json
+++ b/plugins/UserLanguage/lang/vi.json
@@ -1,6 +1,7 @@
{
"UserLanguage": {
"BrowserLanguage": "Ngôn ngữ trình duyệt",
- "LanguageCode": "Mã ngôn ngữ"
+ "LanguageCode": "Mã ngôn ngữ",
+ "PluginDescription": "Các báo cáo ngôn ngữ được sử dụng bởi trình duyệt người dùng của bạn."
}
} \ No newline at end of file
diff --git a/plugins/UsersManager/Controller.php b/plugins/UsersManager/Controller.php
index 921d7a035c..189b6f58dd 100644
--- a/plugins/UsersManager/Controller.php
+++ b/plugins/UsersManager/Controller.php
@@ -83,7 +83,7 @@ class Controller extends ControllerAdmin
}
}
- // we dont want to display the user currently logged so that the user can't change his settings from admin to view...
+ // we don't want to display the user currently logged so that the user can't change his settings from admin to view...
$currentlyLogged = Piwik::getCurrentUserLogin();
$usersLogin = Request::processRequest('UsersManager.getUsersLogin');
foreach ($usersLogin as $login) {
diff --git a/plugins/UsersManager/UsersManager.php b/plugins/UsersManager/UsersManager.php
index 7e3bd11a63..b8840276d4 100644
--- a/plugins/UsersManager/UsersManager.php
+++ b/plugins/UsersManager/UsersManager.php
@@ -21,7 +21,6 @@ use Piwik\SettingsPiwik;
class UsersManager extends \Piwik\Plugin
{
const PASSWORD_MIN_LENGTH = 6;
- const PASSWORD_MAX_LENGTH = 80;
/**
* @see Piwik\Plugin::registerEvents
@@ -124,7 +123,7 @@ class UsersManager extends \Piwik\Plugin
$l = strlen($input);
- return $l >= self::PASSWORD_MIN_LENGTH && $l <= self::PASSWORD_MAX_LENGTH;
+ return $l >= self::PASSWORD_MIN_LENGTH;
}
public static function checkPassword($password)
@@ -148,8 +147,8 @@ class UsersManager extends \Piwik\Plugin
Piwik::postEvent('UsersManager.checkPassword', array($password));
if (!self::isValidPasswordString($password)) {
- throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPassword', array(self::PASSWORD_MIN_LENGTH,
- self::PASSWORD_MAX_LENGTH)));
+ throw new Exception(Piwik::translate('UsersManager_ExceptionInvalidPassword', array(self::PASSWORD_MIN_LENGTH
+ )));
}
}
diff --git a/plugins/UsersManager/lang/ar.json b/plugins/UsersManager/lang/ar.json
index 9ccbc9fb4d..c9d67f03da 100644
--- a/plugins/UsersManager/lang/ar.json
+++ b/plugins/UsersManager/lang/ar.json
@@ -13,7 +13,6 @@
"ExceptionEditAnonymous": "لا يمكن تحرير أو حذف المستخدم \"مجهول\"، فهو يستخدم من قبل Piwik لتعريف المستخدم الذي لم يقم بتسجيل الدخول بعد. على سبيل المثال، يمكنك جعل صفحة الإحصائيات عامة من خلال منح المستخدم \"مجهول\" صلاحيات \"المشاهدة\".",
"ExceptionEmailExists": "المستخدم بعنوان البريد '%s' موجود مسبقاً.",
"ExceptionInvalidEmail": "صيغة البريد الإلكتروني غير صحيحة",
- "ExceptionInvalidPassword": "يجب أن يكون طول كلمة المرور بين %1$s و %2$s رمزاً.",
"ExceptionPasswordMD5HashExpected": "يتوقع UsersManager.getTokenAuth كلمة مرور مشفرة باستخدام MD5 (طولها 32 رمزاً). الرجاء استدعاء الدالة md5() لكلمة المرور قبل استدعاء هذه الدالة.",
"ExceptionUserDoesNotExist": "المستخدم '%s' غير موجود.",
"ExcludeVisitsViaCookie": "استثني زياراتك باستخدام Cookies",
diff --git a/plugins/UsersManager/lang/be.json b/plugins/UsersManager/lang/be.json
index 717bab0ab3..8a6ae2f08c 100644
--- a/plugins/UsersManager/lang/be.json
+++ b/plugins/UsersManager/lang/be.json
@@ -14,7 +14,6 @@
"ExceptionEditAnonymous": "Ананімны карыстач не можа быць выдалены. Ён неабходзен Piwik для ідэнтыфікацыі карыстачоў, якія не ўвайшлі ў сістэму. Дапушчальна, вы можаце зрабіць статыстыку публічнай, падаючы права 'Прагляд' ананімнаму карыстачу.",
"ExceptionEmailExists": "Карыстач з Email '%s' ужо існуе.",
"ExceptionInvalidEmail": "Email няправільнага фармату",
- "ExceptionInvalidPassword": "Даўжыня пароля павінна быць паміж %1$s і %2$s знакаў.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth партабуе MD5-хэшаваны пароль ( даужыней ў 32 знака). Калі ласка, запытайце md5() функцыю перад выклікам гэтага метаду.",
"ExceptionUserDoesNotExist": "Карыстач '%s' не існуе.",
"ExcludeVisitsViaCookie": "Сключыць вашыя наведванні выкарыстоўваючы cookie",
diff --git a/plugins/UsersManager/lang/bg.json b/plugins/UsersManager/lang/bg.json
index 855b45c501..54d7670ccd 100644
--- a/plugins/UsersManager/lang/bg.json
+++ b/plugins/UsersManager/lang/bg.json
@@ -19,7 +19,6 @@
"ExceptionEditAnonymous": "Анонимният потребител не може да бъде редактиран или изтрит. Piwik по този начин дефинира в система потребители, които не са влезли. Например можете да направите данните на брояча ви публични, като зададете 'преглед' права на 'анонимен' потребител.",
"ExceptionEmailExists": "Потребител с имейл '%s' вече съществува.",
"ExceptionInvalidEmail": "Е-пощата, който сте въвели не е валиден.",
- "ExceptionInvalidPassword": "Дължината на паролата трябва да бъде между %1$s и %2$s символа.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth очаква MD5-хеширана парола (32 символа дълъг низ). Моля, извикайте md5() функцията на паролата преди да извикате този метод.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Премахването на права на привилигирован потребител за потребител '%s' не е възможно.",
"ExceptionUserDoesNotExist": "Потребителя '%s' не съществува.",
diff --git a/plugins/UsersManager/lang/ca.json b/plugins/UsersManager/lang/ca.json
index 9b0ec65585..6865424075 100644
--- a/plugins/UsersManager/lang/ca.json
+++ b/plugins/UsersManager/lang/ca.json
@@ -16,7 +16,6 @@
"ExceptionEditAnonymous": "L'usuari anònim no es pot editar o esborrar. El Piwik el fa servir per als usuaris que no han iniciat encara la sessió. Per exemple, podeu fer públiques les vostres estadístiques garantint el permís 'vista' a l'usuari 'anonymous' (anònim).",
"ExceptionEmailExists": "La direcció de correu-e '%s' ja està en un altre compte.",
"ExceptionInvalidEmail": "La direcció de correu-e no té un format vàlid.",
- "ExceptionInvalidPassword": "La longitud de la contrasenya ha de estar entre %1$s i %2$s caràcters.",
"ExceptionUserDoesNotExist": "L'usuari '%s' no existeix.",
"ExcludeVisitsViaCookie": "Exclou les teues visites utilitzant cookies",
"ForAnonymousUsersReportDateToLoadByDefault": "Pels usuaris anònims, introduïu la data dels informes per defecte",
diff --git a/plugins/UsersManager/lang/cs.json b/plugins/UsersManager/lang/cs.json
index 8cae69b171..9fdb38e570 100644
--- a/plugins/UsersManager/lang/cs.json
+++ b/plugins/UsersManager/lang/cs.json
@@ -26,7 +26,7 @@
"ExceptionEmailExists": "Uživatel s e-mailem '%s' již existuje.",
"ExceptionInvalidEmail": "E-mail nemá platný formát.",
"ExceptionInvalidLoginFormat": "Uživatelské jméno musí být v rozmezí %1$s až %2$s znaků a obsahovat pouze písmena, čísla, či následující znaky '_' '-' '.' '@' '+'",
- "ExceptionInvalidPassword": "Délka hesla musí být mezi %1$s a %2$s znaky.",
+ "ExceptionInvalidPassword": "Délka hesla msí být větší, než %1$s znaků.",
"ExceptionLoginExists": "Uživatel '%s' již existuje.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth očekává heslo v podobě MD5 hashe (32 znaků dlouhého řetězce). Prosím nejprve zavoltejte metodu md5() na tomto hesle.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Odebrání super-uživatelského přístupu uživateli %s není možné.",
diff --git a/plugins/UsersManager/lang/da.json b/plugins/UsersManager/lang/da.json
index 3cac5ca9ea..22db459f67 100644
--- a/plugins/UsersManager/lang/da.json
+++ b/plugins/UsersManager/lang/da.json
@@ -22,7 +22,6 @@
"ExceptionEditAnonymous": "Anonyme brugere kan ikke redigeres eller slettet. Anvendes af Piwik til at definere en bruger, som ikke er blevet logget på endnu. F. eks. kan du gøre statistikken offentlig ved at give 'se' adgang til 'anonym' bruger",
"ExceptionEmailExists": "Bruger med e-mail '%s' findes allerede.",
"ExceptionInvalidEmail": "E-mailadressen er ikke i gyldigt format.",
- "ExceptionInvalidPassword": "Længden på adgangskoden skal være mellem %1$s og %2$s tegn.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth forventer et MD5-hashet kodeord (32 tegn lang streng). Kald md5() funktionen på kodeordet, før denne metode kaldes.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Det er ikke muligt at fjerne superbruger adgang f0r brugeren '%s'.",
"ExceptionSuperUserAccess": "Brugeren har superbrugeradgang og har allerede tilladelse til at få adgang til og ændre alle hjemmesider i Piwik. Du kan fjerne superbrugeradgang fra brugeren, og prøve igen.",
diff --git a/plugins/UsersManager/lang/de.json b/plugins/UsersManager/lang/de.json
index fe2af9b777..4aec094e01 100644
--- a/plugins/UsersManager/lang/de.json
+++ b/plugins/UsersManager/lang/de.json
@@ -13,6 +13,7 @@
"ClickHereToSetTheCookieOnDomain": "Klicken Sie hier, um ein Cookie zu setzen, damit Ihre Besuche auf Websites ignoriert werden, die Piwik auf %s trackt.",
"ConfirmGrantSuperUserAccess": "Wollen Sie wirklich '%s' Hauptadministrator-Berechtigungen gewähren? Warnung: Der Nutzer wird Zugriff zu allen Websites haben und in der Lage sein, administrative Tätigkeiten durchzuführen.",
"ConfirmProhibitMySuperUserAccess": "%s, wollen Sie wirklich ihre eigenen Hauptadministrator-Berechtigungen entfernen? Sie werden alle Berechtigungen und Zugriff zu allen Websites verlieren und von Piwik abgemeldet werden.",
+ "ConfirmProhibitOtherUsersSuperUserAccess": "Wollen Sie wirklich dem Nutzer '%s' Hauptadministrator-Berechtigungen entziehen? Der Nutzer wird alle Berechtigungen und Zugriff zu allen Webseiten verlieren. Bitte vergeben Sie danach, wenn notwendig, die Zugriffsberechtigung zu benötigten Webseiten.",
"DeleteConfirm": "Soll der Benutzer %s wirklich gelöscht werden?",
"Email": "E-Mail",
"EmailYourAdministrator": "%1$sBitte berichten Sie diesen Fehler ihrem Administrator via E-Mail%2$s.",
@@ -25,7 +26,7 @@
"ExceptionEmailExists": "Ein Benutzer mit der E-Mail-Adresse '%s' existiert bereits.",
"ExceptionInvalidEmail": "Die E-Mail-Adresse hat ein ungültiges Format.",
"ExceptionInvalidLoginFormat": "Der Benutzername muss zwischen %1$s und %2$s Zeichen lang sein und darf nur Buchstaben, Zahlen oder die Zeichen '_', '-', '.', '@' oder '+' enthalten.",
- "ExceptionInvalidPassword": "Das Passwort muss zwischen %1$s und %2$s Zeichen lang sein.",
+ "ExceptionInvalidPassword": "Das Passwort muss mindestens %1$s Zeichen lang sein.",
"ExceptionLoginExists": "Der Benutzername '%s' existiert bereits.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth erwartet ein MD5-verschlüsseltes Passwort (32 Zeichen). Bitte wenden Sie die md5()-Funktion auf das Passwort an, bevor Sie diese Methode aufrufen.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Es ist nicht möglich die Hauptadministrator-Berechtigung von Benutzer '%s' zu entfernen.",
@@ -42,6 +43,7 @@
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Wenn Sie Ihr Passwort ändern möchten, geben Sie ein neues ein. Ansonsten lassen Sie dieses Feld frei.",
"InjectedHostCannotChangePwd": "Ihr Besuch erfolgt aktuell durch einen unbekannten Hostnamen (%1$s). Es ist somit nicht möglich Ihr Kennwort zu ändert bis dieser Umstand behoben ist.",
"LastSeen": "Zuletzt gesehen",
+ "MainDescription": "Hier kann der Zugriff auf bestimmte Webseiten erteilt werden. Es ist auch möglich, Zugriff auf alle Webseiten zu erlauben, in dem Sie \"Für alle Webseiten anwenden\" im Webseitenselektor anwählen.",
"ManageAccess": "Zugriffsverwaltung",
"MenuAnonymousUserSettings": "Gast-Besucher (\"anonymous\") Einstellungen",
"MenuUsers": "Benutzer",
diff --git a/plugins/UsersManager/lang/el.json b/plugins/UsersManager/lang/el.json
index b4430f85ee..f91b549e61 100644
--- a/plugins/UsersManager/lang/el.json
+++ b/plugins/UsersManager/lang/el.json
@@ -26,7 +26,7 @@
"ExceptionEmailExists": "Χρήστης με την ηλεκτρονική διεύθυνση «%s» υπάρχει ήδη.",
"ExceptionInvalidEmail": "Η ηλεκτρονική διεύθυνση δεν φαίνεται να είναι σωστή.",
"ExceptionInvalidLoginFormat": "Το όνομα χρήστη πρέπει να έχει αριθμό χαρακτήρων από %1$s έως %2$s και να περιέχει μόνο γράμματα, αριθμούς, ή τους χαρακτήρες '_' ή '-' ή '.' ή '@' ή '+'",
- "ExceptionInvalidPassword": "Το μήκος του κωδικού πρόσβασης πρέπει να είναι μεταξύ %1$s και %2$s χαρακτήρες.",
+ "ExceptionInvalidPassword": "Το μέγεθος του συνθηματικού πρέπει να είναι μεγαλύτερο από %1$s χαρακτήρες.",
"ExceptionLoginExists": "Το όνομα χρήστη '%s' υπάρχει ήδη.",
"ExceptionPasswordMD5HashExpected": "Το UsersManager.getTokenAuth αναμένει έναν κωδικό πρόσβασης ως αριθμό MD5 (μήκος 32 χαρακτήρων). Ανακαλέστε τη συνάρτηση md5() στον κωδικό πρόσβασης πριν ανακαλέσετε τη μέθοδο.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Η αφαίρεση του δικαιώματος Υπερ-Χρήστη από το χρήστη '%s' δεν είναι δυνατή.",
diff --git a/plugins/UsersManager/lang/en.json b/plugins/UsersManager/lang/en.json
index 7111d6acb0..6c9f8cb170 100644
--- a/plugins/UsersManager/lang/en.json
+++ b/plugins/UsersManager/lang/en.json
@@ -26,7 +26,7 @@
"ExceptionEmailExists": "User with email '%s' already exists.",
"ExceptionInvalidEmail": "The email doesn't have a valid format.",
"ExceptionInvalidLoginFormat": "The username must be between %1$s and %2$s characters long and contain only letters, numbers, or the characters '_' or '-' or '.' or '@' or '+'",
- "ExceptionInvalidPassword": "The password length must be between %1$s and %2$s characters.",
+ "ExceptionInvalidPassword": "The password length must be greater than %1$s characters.",
"ExceptionLoginExists": "Username '%s' already exists.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth is expecting a MD5-hashed password (32 chars long string). Please call the md5() function on the password before calling this method.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Removing the Super User access from user '%s' is not possible.",
diff --git a/plugins/UsersManager/lang/es.json b/plugins/UsersManager/lang/es.json
index 99a253b942..fb5557dfb7 100644
--- a/plugins/UsersManager/lang/es.json
+++ b/plugins/UsersManager/lang/es.json
@@ -7,6 +7,7 @@
"AnonymousUserHasViewAccess": "Nota: el usuario %1$s tiene acceso para %2$s en este sitio de internet.",
"AnonymousUserHasViewAccess2": "Sus informes de análisis y la información de sus visitantes son vistos públicamente.",
"ApplyToAllWebsites": "Aplicar a todos los sitios",
+ "ChangeAllConfirm": "¿Está seguro que desea otorgar a '%s' acceso a todos sus sitios de internet?",
"ChangePasswordConfirm": "Cambiar la contraseña también cambiará el token_auth del usuario. ¿Desea continuar?",
"ClickHereToDeleteTheCookie": "Haga clic aquí para borrar la cookie y permitir que Piwik realice un seguimiento de sus visitas",
"ClickHereToSetTheCookieOnDomain": "Haga clic aquí para configurar la cookie que excluirá sus visitas a los sitios de internet a los que Piwik realiza seguimiento en %s",
@@ -15,6 +16,7 @@
"DeleteConfirm": "¿Está seguro que desea eliminar al usuario %s?",
"Email": "Correo electrónico",
"EmailYourAdministrator": "%1$sEnviar un correo electrónico a su administrador acerca de este problema%2$s.",
+ "EnterUsernameOrEmail": "Introduce usuario o correo electrónico",
"ExceptionAccessValues": "El parámetro de acceso debe tener uno de los siguientes valores: [ %s ]",
"ExceptionAdminAnonymous": "No puede concederle el acceso de 'administrador' a un usuario 'anónimo'.",
"ExceptionDeleteDoesNotExist": "El usuario '%s' no existe, por lo tanto, no puede ser borrado.",
@@ -22,14 +24,19 @@
"ExceptionEditAnonymous": "El usuario anónimo no puede ser borrado o editado. Piwik lo utiliza para definir un usuario que no se ha conectado todavía. Por ejemplo, puede hacer públicas sus estadísticas mediante el acceso 'ver' al usuario 'anónimo'.",
"ExceptionEmailExists": "Ya existe un usuario con el correo electrónico '%s'.",
"ExceptionInvalidEmail": "El correo electrónico no tiene un formato válido.",
- "ExceptionInvalidPassword": "La extensión de la contraseña debe ser entre %1$s y %2$s caracteres.",
+ "ExceptionInvalidLoginFormat": "El usuario debe tener entre %1$s y %2$s caracteres y estar formado por letras, números o alguno de estos caracteres '_' o '-' o '.' o '@' o '+'",
+ "ExceptionInvalidPassword": "La extensión de la contraseña debe ser superior a los %1$s caracteres.",
+ "ExceptionLoginExists": "El usuario '%s' ya existe.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth está a la espera de una contraseña con algoritmo hash MD5 (32 caracteres de longitud). Por favor demande la función md5() en la contraseña antes de reclamar a este método.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Eliminar el acceso Super Usuario del usuario '%s' no es posible.",
"ExceptionSuperUserAccess": "Este usuario tiene acceso Super Usuario y ya posee permiso para acceder y modificar todos los sitios de internet de Piwik. Puede eliminar el acceso Super Usuario a este usuario y volver a probar.",
"ExceptionUserDoesNotExist": "El usuario '%s' no existe.",
"ExceptionYouMustGrantSuperUserAccessFirst": "Debe haber al menos un usuario con acceso Super Usuario. Por favor conceda el acceso Super Usuario a otro usuario.",
+ "ExceptionUserHasViewAccessAlready": "Éste usuario ya tiene acceso al sitio web.",
+ "ExceptionNoValueForUsernameOrEmail": "Por favor introduce usuario o correo electrónico.",
"ExcludeVisitsViaCookie": "Excluir sus visitas usando una cookie",
"ForAnonymousUsersReportDateToLoadByDefault": "Para los usuarios anónimos, fecha del informe a cargar por defecto",
+ "GiveViewAccess": "Otorgar acceso a la visualización",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Si desea cambiar la contraseña ingrese una nueva. Si no, déjelo vacío.",
"InjectedHostCannotChangePwd": "Está actualmente visitando con un medio desconocido (%1$s). No puede cambiar su contraseña hasta que el problema esté soluionado.",
"LastSeen": "Última visita",
diff --git a/plugins/UsersManager/lang/fa.json b/plugins/UsersManager/lang/fa.json
index 199137d411..a0284e26bc 100644
--- a/plugins/UsersManager/lang/fa.json
+++ b/plugins/UsersManager/lang/fa.json
@@ -3,6 +3,7 @@
"AddUser": "ایجاد یک کاربر جدید",
"Alias": "نام مستعار",
"AllWebsites": "همه وب سایت ها",
+ "AnonymousUserHasViewAccess": "توجه: کاربر %1$s در%2$s دسترسی به این وب سایت می باشد.",
"AnonymousUserHasViewAccess2": "گزارش تجزیه و تحلیل و اطلاعات بازدید کنندگان خود را علنی قابل مشاهده است.",
"ApplyToAllWebsites": "اعمال بر روی تمام وبسایت ها",
"ChangePasswordConfirm": "تغییر رمز عبور به نیز token_auth کاربر را تغییر دهید. آیا شما واقعا میخواهید ادامه دهید؟",
@@ -17,7 +18,6 @@
"ExceptionEditAnonymous": "کاربر گمنامی را نمی توان به ویرایش و یا حذف شده است. توسط Piwik مورد استفاده قرار می گیرد برای تعریف یک کاربر است که هنوز وارد سایت نشده هنوز. به عنوان مثال، شما می توانید آمار خود را عمومی و با اعطای 'مشاهده' دسترسی به \"کاربر ناشناس.",
"ExceptionEmailExists": "کاربر با ایمیل \"%s\" هم اکنون وجود دارد.",
"ExceptionInvalidEmail": "ایمیل به فرمت معتبر نیست.",
- "ExceptionInvalidPassword": "اندازه رمزعبور باید بین %1$s و %2$s کاراکتر باشد.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth انتظار رمز عبور MD5-hashed (32 کاراکتر رشته طولانی). لطفا تماس بگیرید تابع md5 () از رمز عبور را قبل از فراخوانی این روش.",
"ExceptionUserDoesNotExist": "کاربر \"%s\" وجود ندارد.",
"ExcludeVisitsViaCookie": "محروم بازدیدکننده داشته است خود را با استفاده از کوکی برای نگهداری اطلاعات استفاده می",
diff --git a/plugins/UsersManager/lang/fi.json b/plugins/UsersManager/lang/fi.json
index 9fb8873852..a9a274d80b 100644
--- a/plugins/UsersManager/lang/fi.json
+++ b/plugins/UsersManager/lang/fi.json
@@ -25,7 +25,6 @@
"ExceptionEmailExists": "Käyttäjä sähköpostilla '%s' on jo olemassa.",
"ExceptionInvalidEmail": "Sähköposti ei ole kelvollinen.",
"ExceptionInvalidLoginFormat": "Käyttäjänimen pitää olla %1$s-%2$s merkkiä pitkä ja saa sisältää vain kirjaimia (ei ääkkösiä), numeroita tai '_' or '-' or '.' or '@' or '+'",
- "ExceptionInvalidPassword": "Salasanan pituuden täytyy olla %1$s ja %2$s välillä.",
"ExceptionLoginExists": "Käyttäjätunnus '%s' on jo olemassa.",
"ExceptionPasswordMD5HashExpected": "UserManager.getTokenAuth haluaa MD5-tiivisteen salasanastasi (32 merkkiä pitkä merkkijono). Kutsu md5()-funktiota salasanallesi ennen kutsumista.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Superkäyttäjäoikeuksien poistaminen käyttäjältä '%s' ei ole mahdollista.",
diff --git a/plugins/UsersManager/lang/fr.json b/plugins/UsersManager/lang/fr.json
index d0f0719220..284efeb145 100644
--- a/plugins/UsersManager/lang/fr.json
+++ b/plugins/UsersManager/lang/fr.json
@@ -7,11 +7,13 @@
"AnonymousUserHasViewAccess": "Note : l'utilisateur %1$s a un accès en %2$s à ce site web.",
"AnonymousUserHasViewAccess2": "Vos rapports d'analyse et les informations de vos visiteurs sont visibles publiquement.",
"ApplyToAllWebsites": "Appliquer à tous les sites",
+ "ChangeAllConfirm": "Êtes cous certain(e) de vouloir accorder l'accès \"%s\" à l'ensemble des sites web?",
"ChangePasswordConfirm": "Modifier le mot de passe modifiera aussi la clef d'authentification des utilisateurs. Voulez-vous vraiment continuer?",
"ClickHereToDeleteTheCookie": "Cliquez ici pour supprimer le cookie et pour que Piwik prenne en compte vos visites",
"ClickHereToSetTheCookieOnDomain": "Cliquez ici pour mettre en place un cookie qui exclura vos visites sur ceux de vos sites web qui sont analysés par Piwik sur %s",
"ConfirmGrantSuperUserAccess": "Voulez vous vraiment donner un accès super utilisateur à '%s'? Attention : cet utilisateur va avoir accès à tous les sites web et sera capable d'effectuer des tâches administratives.",
"ConfirmProhibitMySuperUserAccess": "%s, voulez-vous vraiment supprimer votre accès super utilisateur? Vous allez perdre toutes les permissions et accès aux sites web et serez déconnecté(e) de Piwik.",
+ "ConfirmProhibitOtherUsersSuperUserAccess": "Souhaitez vous réellement retirer l'accès super utilisateur à \"%s\"? L'utilisateur va perdre toutes les permissions d'accès à l'ensemble des sites web. Assurez vous de lui accorder accès aux sites web requis après si nécessaire.",
"DeleteConfirm": "Êtes-vous sûr de vouloir supprimer l'utilisateur %s?",
"Email": "Courriel",
"EmailYourAdministrator": "%1$sEnvoyez un courriel à votre administrateur à propos de ce problème%2$s.",
@@ -23,7 +25,8 @@
"ExceptionEditAnonymous": "L'utilisateur Anonyme ne peut être édité ou supprimé. Il est utilisé pour identifier un utilisateur qui ne s'est pas encore connecté. Par exemple vous pouvez rendre vos statistiques publiques en accordant l'accès 'vue' à l'utilisateur 'anonyme'.",
"ExceptionEmailExists": "L'utilisateur avec l'e-mail '%s' existe déjà.",
"ExceptionInvalidEmail": "L'adresse courriel est invalide.",
- "ExceptionInvalidPassword": "La longueur du mot de passe doit être entre %1$s et %2$s caractères.",
+ "ExceptionInvalidLoginFormat": "Le nom d'utilisateur doit contenir entre %1$s et %2$s caractères et être composé uniquement de lettres, chiffres, ou les caractères '_' ou '-' ou '.' ou '@' ou '+'",
+ "ExceptionInvalidPassword": "La longueur du mot de passe doit être supérieure à %1$s caractères.",
"ExceptionLoginExists": "Le nom d'usager \"%s\" existe déjà.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth attend un mot de passe haché en MD5 (chaine de 32 caractères). Veuillez appeler la fonction md5() sur le mot de passe avant d'appeler cette méthode.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Retirer l'accès Super Utilisateur à l'utilisateur \"%s\" est impossible.",
@@ -40,6 +43,7 @@
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Si vous souhaitez modifier votre mot de passe tapez en un nouveau. Sinon laissez le champ vide.",
"InjectedHostCannotChangePwd": "Vous êtes actuellement connecté depuis un hôte inconnu (%1$s). Vous ne pourrez modifier votre mot de passe tant que ce problème ne sera pas corrigé.",
"LastSeen": "Vu pour la dernière fois",
+ "MainDescription": "Choisissez quels utilisateurs ont accès à quels sites. Vous pouvez aussi accorder accès à tous les sites d'un seul coup en sélectionnant \"Appliquer à tous les sites web\" dans le sélecteur de sites web.",
"ManageAccess": "Gestion des accès utilisateurs",
"MenuAnonymousUserSettings": "Paramètres utilisateurs anonymes",
"MenuUsers": "Utilisateurs",
diff --git a/plugins/UsersManager/lang/id.json b/plugins/UsersManager/lang/id.json
index f7d1755dd0..4dfef0638b 100644
--- a/plugins/UsersManager/lang/id.json
+++ b/plugins/UsersManager/lang/id.json
@@ -18,7 +18,6 @@
"ExceptionEditAnonymous": "Pengguna anonim tidak dapat dihapus atau disunting. Piwik menggunakan pengguna ini untuk menjelaskan pengguna yang belum masuk. Misalnya, Anda dapat membuat statistik publik Anda dengan memberi hak `Tampil` untuk pengguna 'anonim'.",
"ExceptionEmailExists": "Pengguna dengan surel '%s' telah tersedia.",
"ExceptionInvalidEmail": "Surel tidak memiliki bentuk sahih.",
- "ExceptionInvalidPassword": "Panjang sandi harus antara %1$s dan %2$s karakter.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth membutuhkan sandi acak MD5 (32 karakter larik panjang). Silakan panggil fungsi md5() dalam sandi sebelum memanggil metode ini.",
"ExceptionUserDoesNotExist": "Pengguan '%s' tida ada.",
"ExcludeVisitsViaCookie": "Kecualikan kunjungan Anda menggunakan kuki",
diff --git a/plugins/UsersManager/lang/it.json b/plugins/UsersManager/lang/it.json
index aad1358da8..bcf3d01289 100644
--- a/plugins/UsersManager/lang/it.json
+++ b/plugins/UsersManager/lang/it.json
@@ -26,7 +26,7 @@
"ExceptionEmailExists": "Utente con l'e-mail '%s' è già esistente.",
"ExceptionInvalidEmail": "L'e-mail inserita non è valida.",
"ExceptionInvalidLoginFormat": "Il nome utente deve essere lungo tra %1$s e %2$s caratteri e contenere solo lettere, numeri o i caratteri '_' o '-' o '.' o '@' o '+'",
- "ExceptionInvalidPassword": "La lunghezza della password deve essere tra %1$s e %2$s caratteri.",
+ "ExceptionInvalidPassword": "La lunghezza della password deve essere maggiore di %1$s caratteri.",
"ExceptionLoginExists": "Il nome utente '%s' esiste già.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth si aspetta una password MD5 hash (stringa lunga 32 caratteri). Si prega di richiamare la funzione md5() sulla password prima di richiamare questo metodo.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "È impossibile togliere l'accesso Super User all'utente '%s'.",
diff --git a/plugins/UsersManager/lang/ja.json b/plugins/UsersManager/lang/ja.json
index a6943e10e9..fec124fbaa 100644
--- a/plugins/UsersManager/lang/ja.json
+++ b/plugins/UsersManager/lang/ja.json
@@ -22,7 +22,6 @@
"ExceptionEditAnonymous": "anonymous ユーザーは、Piwik がログインしていないユーザーを定義するために使用するため、編集や削除はできません。 例えば、'anonymous' ユーザーに '表示' 権限を与えることによって、統計をパブリックにすることができます。",
"ExceptionEmailExists": "メールアドレスが '%s' のユーザーはすでに存在します。",
"ExceptionInvalidEmail": "メールアドレスが有効な形式ではありません。",
- "ExceptionInvalidPassword": "パスワードの長さは %1$s〜%2$s 文字である必要があります。",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth は、MD5 ハッシュ値のパスワード(32文字長の文字列)を想定しています。 このメソッドをコールする前に、パスワードに対して md5() 関数をコールしてください。",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "スーパーユーザーアクセスをユーザー '%s' から削除することができません。",
"ExceptionSuperUserAccess": "このユーザーはスーパーユーザーアクセス権を持ち、既に Piwik の全ウェブサイトへのアクセスおよび修正の権限を持っています。このユーザーからスーパーユーザーアクセス権を削除し、再度試すことができます。",
diff --git a/plugins/UsersManager/lang/ka.json b/plugins/UsersManager/lang/ka.json
index f31a9bea20..390ad537e2 100644
--- a/plugins/UsersManager/lang/ka.json
+++ b/plugins/UsersManager/lang/ka.json
@@ -4,7 +4,6 @@
"Alias": "ალიასი",
"AllWebsites": "ყველა ვებ საიტი",
"ApplyToAllWebsites": "ყველა ვებ საიტზე გამოყენება",
- "ChangeAllConfirm": "დარწმუნებული ხართ, რომ გსურთ შეცვალოთ '%s' უფლება ყველა ვებ საიტზე?",
"ClickHereToDeleteTheCookie": "დააწკაპუნეთ აქ, რომ წაშალოთ ქუქი და თქვენი ვიზიტების ტრეკირების საშუალება მისცეთ Piwik–ს",
"ClickHereToSetTheCookieOnDomain": "დააწკაპუნეთ აქ, რომ დანიშნოთ ქუქი, რომელიც გამორიცხავს Piwik–ის მიერ %s–ზე ტრეკირებულ თქვენს ვიზიტებს ვებ საიტებზე",
"DeleteConfirm": "დარწმუნებული ხართ, რომ გსურთ %s მომხმარებლის წაშლა?",
@@ -15,14 +14,11 @@
"ExceptionEditAnonymous": "ანონიმური მომხმარებლის რედაქტირება ან წაშლა შეუძლებელია. Piwik მას იყენებს იმ მომხმარებლის განსაზღვრისთვის, რომელიც ჯერ არ შესულა სისტემაში. მაგალითად, თქვენ შეგიძლიათ გახადოთ თქვენი სტატისტიკა საჯარო 'დათვალიერება' წვდომის 'ანონიმურ' მომხმარებელზე მინიჭებით.",
"ExceptionEmailExists": "მომხმარებელი '%s' ელ.ფოსტის მისამართით უკვე არსებობს.",
"ExceptionInvalidEmail": "ელ.ფოსტის მისამართი არის არამართებული ფორმატის.",
- "ExceptionInvalidLoginFormat": "მომხმარებლის სახელის სიმბოლოთა რაოდენობა უნდა იყოს %1$s–დან %2$s–მდე და შეიცავდეს მხოლოდ ასოებს, ციფრებს ან სიმბოლოებს '_' ან '-' ან '.' ან '@'",
- "ExceptionLoginExists": "მომხმარებელი '%s' უკვე არსებობს.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth მოითხოვს MD5-ჰეშირებულ პაროლს (32 სიმბოლოსგან შემდგარ სტრიქონი). გთხოვთ, მოსდეთ md5() ფუნქცია პაროლს ამ მეთოდის გამოძახებამდე.",
"ExceptionUserDoesNotExist": "მომხმარებელი '%s' არ არსებობს.",
"ExcludeVisitsViaCookie": "გამორიცხეთ თქვენი ვიზიტები ქუქიების გამოყენებით",
"ForAnonymousUsersReportDateToLoadByDefault": "ანონიმური მომხმარებლებისთვის, ნაგულისხმევად ჩასატვირთი რეპორტის თარიღი",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "თუ გსურთ პაროლის შეცვლა, აკრიფეთ ახალი. თუ არა, დატოვეთ ეს ველი ცარიელი.",
- "MainDescription": "გადაწყვიტეთ, რომელ მომხმარებელს როგორი Piwik წვდომა ექნება თქვენს ვებ საიტზე. ასევე შეგიძლიათ უფლებები დანიშნოთ ყველა ვებ საიტზე ერთბაშად.",
"ManageAccess": "წვდომის მართვა",
"MenuAnonymousUserSettings": "ანონიმური მომხმარებლის პარამეტრები",
"MenuUsers": "მომხმარებლები",
@@ -39,7 +35,7 @@
"UsersManagementMainDescription": "შექმენით ახალი მომხმარებელები ან განაახლეთ არსებული მომხმარებლები. შემდეგ ზემოთ შეგიძლიათ დაუნიშნოთ მათ უფლებები.",
"WhenUsersAreNotLoggedInAndVisitPiwikTheyShouldAccess": "როდესაც მომხმარებლები სისტემაში არ არიან შესული და ეწვევიან Piwik–ს, მათ უნდა შეძლონ წვდომა",
"YourUsernameCannotBeChanged": "თქვენი მომხმარებლის სახელის შეცვლა არ შეიძლება.",
- "YourVisitsAreIgnoredOnDomain": "%s Piwik–ის მიერ იგნორირებულია თქვენი ვიზიტები %s %s (თქვენს ბრაუზერში ნაპოვნია Piwik იგნორირების ქუქი).",
- "YourVisitsAreNotIgnored": "%sთქვენი ვიზიტები არ არის იგნორირებული Piwik–ის მიერ%s (Piwik იგნორირების ქუქი არ იქნა ნაპოვნი თქვენს ბრაუზერში)."
+ "YourVisitsAreIgnoredOnDomain": "%1$s Piwik–ის მიერ იგნორირებულია თქვენი ვიზიტები %2$s %3$s (თქვენს ბრაუზერში ნაპოვნია Piwik იგნორირების ქუქი).",
+ "YourVisitsAreNotIgnored": "%1$sთქვენი ვიზიტები არ არის იგნორირებული Piwik–ის მიერ%2$s (Piwik იგნორირების ქუქი არ იქნა ნაპოვნი თქვენს ბრაუზერში)."
}
} \ No newline at end of file
diff --git a/plugins/UsersManager/lang/ko.json b/plugins/UsersManager/lang/ko.json
index 1826f9914e..36ec99f57e 100644
--- a/plugins/UsersManager/lang/ko.json
+++ b/plugins/UsersManager/lang/ko.json
@@ -23,7 +23,6 @@
"ExceptionEditAnonymous": "익명 사용자는 편집이나 삭제를 할 수 없습니다. Piwik에서 아직 로그인하지 않은 사용자를 골라낼 때 사용하기 때문입니다. 예를 들어, '보기' 접근을 '익명' 사용자에게 주어서 당신의 상태를 공개할 수 있습니다.",
"ExceptionEmailExists": "'%s' 의 이메일을 가진 사용자는 이미 존재합니다.",
"ExceptionInvalidEmail": "이메일이 유효한 형식이 아닙니다.",
- "ExceptionInvalidPassword": "비밀번호 길이는 %1$s〜%2$s 문자이어야합니다.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth는 MD5 해시 값의 비밀번호 (32자 길이의 문자열)을 사용하고 있습니다. 이 메소드를 호출하기 전에 암호에 md5() 함수를 호출합니다.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "사용자 '%s'의 슈퍼 유저 권한 제거가 가능하지 않습니다.",
"ExceptionSuperUserAccess": "해당 사용자는 슈퍼 유저 권한을 가지고 있기에 Piwik 내 모든 웹사이트에 대해서 접근 가능하고 수정 역시 가능합니다. 해당 유저의 슈퍼 유저 권한을 제거한 후 다시 시도해보세요.",
diff --git a/plugins/UsersManager/lang/lt.json b/plugins/UsersManager/lang/lt.json
index a16a9f5f9a..2851165cf2 100644
--- a/plugins/UsersManager/lang/lt.json
+++ b/plugins/UsersManager/lang/lt.json
@@ -21,7 +21,6 @@
"ExceptionEditAnonymous": "Naudotojas 'anonimas' negali būti keičiamas ar šalinamas. Jis naudojamas nustatyti naudotoją, kuris dar neprisijungęs. Pavyzdžiui, Jūs galite padaryti savo statistinius duomenis viešais suteikdami 'matyti' teises naudotojui 'anonimas'.",
"ExceptionEmailExists": "Naudotojas su tokiu el. paštu '%s' jau yra.",
"ExceptionInvalidEmail": "Netinkamas el. pašto formatas.",
- "ExceptionInvalidPassword": "Slaptažodžio ilgis privalo būti tarp %1$s ir %2$s simbolių.",
"ExceptionLoginExists": "Naudotojo vardas \"%s\" jau yra.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Super naudotojo prieigos teisių pašalinimas iš naudotojo \"%s\" yra negalimas.",
"ExceptionUserDoesNotExist": "Naudotojas '%s' neegzistuoja.",
diff --git a/plugins/UsersManager/lang/lv.json b/plugins/UsersManager/lang/lv.json
index 4e21dca9b0..36db2ecb03 100644
--- a/plugins/UsersManager/lang/lv.json
+++ b/plugins/UsersManager/lang/lv.json
@@ -15,7 +15,6 @@
"ExceptionEditAnonymous": "Anonīmo lietotāju nav iespējams labot vai dzēst. Tas tiek izmantots, lai definētu lietotāju, kurš vēl nav pieteicies. Piemēram, Jūs varat publiskot statistiku atļaujot apskates pieeju anonīmajam lietotājam.",
"ExceptionEmailExists": "Lietotājs ar e-pasta adresi '%s' jau eksistē.",
"ExceptionInvalidEmail": "E-pasta adresei nav pareizs formāts",
- "ExceptionInvalidPassword": "Parolei jābūt garumā no %1$s līdz %2$s simboliem.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth sagaida MD5 kodētu paroli (32 simbolu garu tekstu). Lūdzu pielietojiet md5() metodi parolei pirms izsaucat šo metodi.",
"ExceptionUserDoesNotExist": "Lietotājs '%s' neeksistē.",
"ExcludeVisitsViaCookie": "Neiekļaut Jūsu pašu apmeklējumus izmantojot sīkdatni",
diff --git a/plugins/UsersManager/lang/nb.json b/plugins/UsersManager/lang/nb.json
index 718a8855e5..2473f5f54c 100644
--- a/plugins/UsersManager/lang/nb.json
+++ b/plugins/UsersManager/lang/nb.json
@@ -23,7 +23,6 @@
"ExceptionEditAnonymous": "Den anonyme brukeren kan ikke bli redigert eller slettet. Den blir brukt av Piwik for å definere en bruker som ikke har blitt logget inn ennå. Du kan for eksempel gjøre statistikken din offentlig ved å gi 'view'-tilgang til 'anonymous'-brukeren.",
"ExceptionEmailExists": "Bruker med e-post «%s» eksisterer allerede.",
"ExceptionInvalidEmail": "Epost-adressen er ikke i gyldig format.",
- "ExceptionInvalidPassword": "Passordet må være mellom %1$s og %2$s tegn.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth forventer et MD5-hashet passord (32 tegn lang streng). Vennligst kall md5()-funksjonen på passordet før du kaller denne metoden.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Det er ikke mulig å fjerne superbrukertilgang fra brukeren «%s».",
"ExceptionSuperUserAccess": "Denne brukeren har superbrukertilgang og har allerede tilgang til å se og modifisere alle nettsteder i Piwik. Du kan også fjerne superbrukertilgangen fra denne brukeren og prøve igjen.",
diff --git a/plugins/UsersManager/lang/nl.json b/plugins/UsersManager/lang/nl.json
index a34f2600aa..035a780037 100644
--- a/plugins/UsersManager/lang/nl.json
+++ b/plugins/UsersManager/lang/nl.json
@@ -15,6 +15,7 @@
"DeleteConfirm": "Weet u zeker dat u de volgende gebruiker wilt verwijderen: %s?",
"Email": "E-mail",
"EmailYourAdministrator": "%1$sE-mail de beheerder over dit probleem%2$s.",
+ "EnterUsernameOrEmail": "Voer een gebruikersnaam of e-mailadres in",
"ExceptionAccessValues": "De parameter toegang moet één van de volgede waarden bevatten: [ %s ]",
"ExceptionAdminAnonymous": "U kunt geen adminrechten toekennen aan de 'anonieme' gebruiker.",
"ExceptionDeleteDoesNotExist": "Gebruiker '%s' bestaat niet en kan dus niet verwijderd worden.",
@@ -22,7 +23,6 @@
"ExceptionEditAnonymous": "De anonieme gebruiker kan niet gewijzigd of verwijderd worden. Deze wordt door Piwik gebruikt voor gebruikers die nog niet zijn ingelogd. U kunt bijvoorbeeld uw statistieken publiekelijk maken door de 'anonieme' gebruiker 'kijkers rechten' te geven.",
"ExceptionEmailExists": "Er is reeds een gebruiker met '%s' als e-mail adres.",
"ExceptionInvalidEmail": "Het e-mail adres is ongeldig.",
- "ExceptionInvalidPassword": "De lengte van het wachtwoord moet tussen %1$s en %2$s tekens lang zijn.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth verwacht een MD5-hash wachtwoord (32 tekens lange reeks). Vraag de md5()functie op het wachtwoord op alvorens deze methode aan te roepen.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Het verwijderen van de Super User rechten van gebruiker '%s' is niet toegestaan.",
"ExceptionUserDoesNotExist": "Gebruiker '%s' bestaat niet.",
diff --git a/plugins/UsersManager/lang/pl.json b/plugins/UsersManager/lang/pl.json
index 57bbaea3e0..c505f98709 100644
--- a/plugins/UsersManager/lang/pl.json
+++ b/plugins/UsersManager/lang/pl.json
@@ -15,7 +15,6 @@
"ExceptionEditAnonymous": "Konto użytkownika anonimowego nie może być zmienione czy skasowane. Jest stosowane przez Piwik by zdefiniować użytkownika, który się nie loguje. Dla przykładu, możesz uczynić swoje statystyki powszechnie publiczne, udzielając prawa 'podglądu' dla 'anonimowego' użytkownika.",
"ExceptionEmailExists": "Użytkownik z takim adresem e-mail '%s' już istnieje.",
"ExceptionInvalidEmail": "Adres e-mail nie posiada poprawnego formatu.",
- "ExceptionInvalidPassword": "Długość hasła powinien zawierać od %1$s do %2$s znaków.",
"ExceptionPasswordMD5HashExpected": "Metoda UsersManager.getTokenAuth oczekuje hasła z hashem MD5 (łańcuch o długości 32 znaków). Wywołaj funkcję md5() z parametrem hasła, by wygenerować hash przed wywołaniem tej metody.",
"ExceptionUserDoesNotExist": "Użytkownik '%s' nie istnieje.",
"ExcludeVisitsViaCookie": "Wyklucz swoje wizyty stosując ciasteczka cookie",
diff --git a/plugins/UsersManager/lang/pt-br.json b/plugins/UsersManager/lang/pt-br.json
index 7baf55be48..ca0fa05007 100644
--- a/plugins/UsersManager/lang/pt-br.json
+++ b/plugins/UsersManager/lang/pt-br.json
@@ -26,7 +26,6 @@
"ExceptionEmailExists": "Usuário com o e-mail '%s' já existe.",
"ExceptionInvalidEmail": "O e-mail não tem um formato válido.",
"ExceptionInvalidLoginFormat": "O nome de usuário deve ter entre %1$s e %2$s caracteres e conter apenas letras, números ou os caracteres '_' or '-' or '.' or '@' or '+'",
- "ExceptionInvalidPassword": "A senha deve conter entre %1$s e %2$s caracteres.",
"ExceptionLoginExists": "O nome de usuário '%s' já existe.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth está esperando por uma senha MD5-hashed (32 caracteres). Por favor, chame a função md5() na senha antes de chamar este método.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Não é possível remover o acesso de Super Usuário do usuário '%s'",
diff --git a/plugins/UsersManager/lang/pt.json b/plugins/UsersManager/lang/pt.json
index fa8097d1ed..74d261904e 100644
--- a/plugins/UsersManager/lang/pt.json
+++ b/plugins/UsersManager/lang/pt.json
@@ -17,7 +17,6 @@
"ExceptionEditAnonymous": "O utilizador anónimo não pode ser editado ou apagado. Ele é usado pelo sistema para definir um utilizador que ainda não entrou. Por examplo, pode tornar as suas estatísticas públicas concedendo acesso 'ver' ao utilizador 'anónimo'.",
"ExceptionEmailExists": "Um utilizador com o e-mail '%s' já existe.",
"ExceptionInvalidEmail": "O e-mail não tem um formato válido.",
- "ExceptionInvalidPassword": "O senha deve ter entre %1$s e %2$s caracteres.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth está à espera de uma palavra-passe codificada em MD5 (cadeia de 32 caracteres). Por favor chame a função md5() sobre a palavra-passe antes de chamar este método.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "A remoção do acesso Super Utilizador do utilizador '%s' não é possível.",
"ExceptionUserDoesNotExist": "Utilizador '%s' não existe.",
diff --git a/plugins/UsersManager/lang/ro.json b/plugins/UsersManager/lang/ro.json
index cad0f073bf..a2f8d7798c 100644
--- a/plugins/UsersManager/lang/ro.json
+++ b/plugins/UsersManager/lang/ro.json
@@ -21,7 +21,6 @@
"ExceptionEditAnonymous": "Userul anonim nu poate fi editat sau sters.De exemplu poti face ca statisticile tale sa fie publice autorizand 'view' accesul la 'anonymous' user.",
"ExceptionEmailExists": "Deja există un utilizator cu adresa '%s'.",
"ExceptionInvalidEmail": "Emailul nu are un format valid.",
- "ExceptionInvalidPassword": "Lungimea parolei trebuie să fie între %1$s şi %2$s simboluri.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth se așteaptă la o parolă distribuita-MD5 (32 de caractere șir lung). Vă rugăm să apelati la funcția md5 () la parola înainte de a apela această metodă.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Scoaterea accesul utilizatorului Super de la utilizator '%s' nu este posibil.",
"ExceptionSuperUserAccess": "Acest utilizator are acces la Super utilizator și are deja permisiunea de a accesa și modifica toate site-urile din Piwik. Puteți scoate Super accesul utilizatorului la acest utilizator și încercați din nou.",
diff --git a/plugins/UsersManager/lang/ru.json b/plugins/UsersManager/lang/ru.json
index 965f2ae904..857456c6b0 100644
--- a/plugins/UsersManager/lang/ru.json
+++ b/plugins/UsersManager/lang/ru.json
@@ -22,7 +22,6 @@
"ExceptionEditAnonymous": "Анонимный пользователь не может быть удален. Он необходим системе Веб-аналитики для идентификации пользователей, которые не вошли в систему. Допустим, вы можете сделать статистику публичной, предоставляя право 'Просмотр' анонимному пользователю.",
"ExceptionEmailExists": "Пользователь с Email '%s' уже существует.",
"ExceptionInvalidEmail": "Email неправильного формата",
- "ExceptionInvalidPassword": "Длина пароля должна быть от %1$s до %2$s символов.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth ожидает MD5-хэшированный пароль (строка в 32 символа). Пожалуйста, вызовите функцию md5() к паролю перед вызовом этого метода.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Удаление прав суперпользователя у пользователя «%s» не представляется возможным.",
"ExceptionSuperUserAccess": "Этот пользователь уже имеет статус суперпользователя и разрешение на изменение всех веб-сайты в Piwik. Вы можете удалить права суперпользователя у этого пользователя, и попробовать снова.",
diff --git a/plugins/UsersManager/lang/sl.json b/plugins/UsersManager/lang/sl.json
index fe88be3be9..50dbddb1ca 100644
--- a/plugins/UsersManager/lang/sl.json
+++ b/plugins/UsersManager/lang/sl.json
@@ -10,7 +10,6 @@
"ExceptionDeleteDoesNotExist": "Uporabnik '%s' ne obstaja, ter ga tako ni moč izbrisati.",
"ExceptionEmailExists": "Uporabnik z emailom \"%s\" že obstaja.",
"ExceptionInvalidEmail": "Email ni veljavnega formata.",
- "ExceptionInvalidPassword": "Dolžina gesla mora biti med %1$s in %2$s znaki.",
"ExceptionUserDoesNotExist": "Uporabnik \"%s\" ne obstaja.",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Če bi radi spremenili geslo, vpišite novega. Če ne, to pustite prazno.",
"ManageAccess": "Upravljaj dostop",
diff --git a/plugins/UsersManager/lang/sq.json b/plugins/UsersManager/lang/sq.json
index e943b45826..7abaca0f00 100644
--- a/plugins/UsersManager/lang/sq.json
+++ b/plugins/UsersManager/lang/sq.json
@@ -7,14 +7,17 @@
"AnonymousUserHasViewAccess": "Shënim: përdoruesi %1$s ka hyrje %2$s te ky sajt.",
"AnonymousUserHasViewAccess2": "Raportet analitike dhe të dhënat e vizitorëve tuaj janë të dukshme publikisht.",
"ApplyToAllWebsites": "Zbatoje për tërë sajtet",
+ "ChangeAllConfirm": "Jeni i sigurt se doni t’i jepni përdoruesit '%s' hyrje në krejt sajtet?",
"ChangePasswordConfirm": "Ndryshimi i fjalëkalimit do të sjellë gjithashtu ndryshimin e “token_auth” të përdoruesit. Doni vërtet të vazhdohet?",
"ClickHereToDeleteTheCookie": "Klikoni këtu që të fshihet \"cookie\" dhe që ta bëni Piwik-un të gjurmojë vizitat tuaja",
"ClickHereToSetTheCookieOnDomain": "Klikoni këtu që të vendoset një \"cookie\" që do të përjashtojë vizitat tuaja në sajte të gjurmuar nga Piwik-u %s",
"ConfirmGrantSuperUserAccess": "Doni t’i akordoni '%s' hyrje Supepërdoruesi? Kujdes: përdoruesi do të ketë hyrje në krejt sajtet dhe do të jetë në gjendje të kryejë veprime administratori.",
"ConfirmProhibitMySuperUserAccess": "%s, doni vërtet t’i hiqni vetes të drejta Superpërdoruesi? Do të humbni krejt lejet dhe hyrjen në krejt sajtet dhe do të dilni nga Piwik-u.",
+ "ConfirmProhibitOtherUsersSuperUserAccess": "Doni vërtet të hiqni hyrje Superpërdoruesi prej '%s'? Përdoruesi do të humbë krejt lejet dhe hyrjet në krejt sajtet. Sigurohuni t’i lejoni hyrje më pas, në sajtet e nevojshme, nëse është rasti.",
"DeleteConfirm": "Jeni i sigurt se doni të fshihet përdoruesi %s?",
"Email": "Email",
"EmailYourAdministrator": "%1$sDërgojini përgjegjësit tuaj email rreth këtij problemi%2$s.",
+ "EnterUsernameOrEmail": "Jepni një emër përdoruesi ose adresë email",
"ExceptionAccessValues": "Parametri duhet të ketë një nga vlerat vijuese: [ %s ]",
"ExceptionAdminAnonymous": "S’mund t’i jepni hyrje 'administratori' përdoruesit 'anonim'.",
"ExceptionDeleteDoesNotExist": "Përdoruesi '%s' s'ekziston, ndaj s’mund të bëhet fshirje.",
@@ -22,17 +25,24 @@
"ExceptionEditAnonymous": "Përdoruesi anonim nuk mund të fshihet apo përpunohet të dhënat e tij. Përdoret nga Piwik-u për të përkufizuar një përdorues që s’ka bërë ende hyrjen. Për shembull, mund t’i bëni statistikat tuaja publike duke lejuar hyrje për 'parje' për përdoruesin 'anonim'.",
"ExceptionEmailExists": "Ka tashmë një përdorues me email-in '%s'.",
"ExceptionInvalidEmail": "Email-i s’është në format të vlefshëm.",
- "ExceptionInvalidPassword": "Fjalëkalimi duhet të jetë nga %1$s deri në %2$s shenja i gjatë.",
+ "ExceptionInvalidLoginFormat": "Emri i përdoruesit duhet të jetë ndërmjet %1$s dhe %2$s shenja i gjatë dhe të përmbajë vetëm shkronja, numra, ose shenjën '_' ose '-' ose '.' ose '@' ose '+'",
+ "ExceptionLoginExists": "Ka tashmë një përdorues '%s'.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth pret një fjalëkalim hash MD5 (varg 32 shenja të gjatë). Ju lutemi, zbatojeni funksionin md5() mbi fjalëkalimin përpara zbatimit të kësaj metode",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Heqja e lejeve Superpërdoruesi për përdoruesin '%s' s’është e mundur.",
"ExceptionSuperUserAccess": "Ky përdorues ka hyrje Superpërdoruesi dhe ka tashmë leje të hyjë dhe modifikojë krejt sajtet në këtë instalim Piwik-u. Mund t’ia hiqni të drejtat e Superpërdoruesit këtij përdoruesi dhe të riprovoni.",
"ExceptionUserDoesNotExist": "Përdoruesi '%s' s’ekziston.",
"ExceptionYouMustGrantSuperUserAccessFirst": "Duhet të ketë të paktën një përdorues me hyrje Superpërdoruesi. Ju lutemi, akordojini së pari të drejta Superpërdoruesi një përdoruesi.",
+ "ExceptionUserHasViewAccessAlready": "Ky përdorues ka tashmë hyrje në këtë sajt.",
+ "ExceptionNoValueForUsernameOrEmail": "Ju lutemi, jepni një emër përdoruesi ose adresë email.",
"ExcludeVisitsViaCookie": "Përjashtoni vizitat tuaja, përmes përdorimit të një \"cookie\"",
"ForAnonymousUsersReportDateToLoadByDefault": "Datë raporti që duhet ngarkuar si parazgjedhje për përdoruesit anonimë",
+ "GiveViewAccess": "Jepni hyrje për parje",
+ "GiveViewAccessTitle": "Jepini një përdoruesi ekzistues hyrje për të parë raportet për %s",
+ "GiveViewAccessInstructions": "Për t’i dhënë një përdoruesi ekzistues hyrje për parje të raporteve për %s jepni emrin e përdoruesit ose adresën email të një përdoruesi ekzistues",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Nëse dëshironi të ndryshoni fjalëkalimin, shtypni një të ri. Përndryshe lëreni të zbrazët.",
"InjectedHostCannotChangePwd": "Po e vizitoni me një strehë të panjohur (%1$s). S’mund ta ndryshoni fjalëkaliminm, pa ndrequr këtë problem.",
"LastSeen": "Këndej pari së fundi më",
+ "MainDescription": "Vendosni cilët përdorues kanë hyrje te sajtet tuaj. Mund jepni edhe hyrje për te krejt sajtet njëherësh, duke zgjedhur \"Zbatoje për krejt sajtet\" te përzgjedhësi i sajtit.",
"ManageAccess": "Administroni hyrjet",
"MenuAnonymousUserSettings": "Rregullime përdoruesi anonim",
"MenuUsers": "Përdorues",
@@ -41,6 +51,7 @@
"PersonalSettings": "Rregullime personale",
"NoteNoAnonymousUserAccessSettingsWontBeUsed2": "Shënim: Nuk mund të ndryshoni rregullimet në këtë ndarje, ngaqë s’keni ndonjë sajt ku mund të hyhet si përdorues anonim.",
"NoUsersExist": "Ende nuk ka përdorues",
+ "PluginDescription": "Administrimi i Përdoruesve ju lejon të shtoni përdorues të rinj, përpunoni përdoruesit ekzistues dhe t’u jepni atyre hyrje për të parë ose administruar sajte.",
"PrivAdmin": "Admin",
"PrivNone": "Pa hyrje",
"PrivView": "Pamje",
diff --git a/plugins/UsersManager/lang/sr.json b/plugins/UsersManager/lang/sr.json
index b0dfca35b4..2f09cf69e1 100644
--- a/plugins/UsersManager/lang/sr.json
+++ b/plugins/UsersManager/lang/sr.json
@@ -22,7 +22,6 @@
"ExceptionEditAnonymous": "Podaci o anonimnom korisniku ne mogu biti menjani ili obrisani. Anonimni korisnik služi da bi Piwik mogao da razlikuje korisnika koji se još nije prijavio na sistem. Primera radi, svoju statistiku možete učiniti javnom tako što ćete anonimnom korisniku dozvoliti 'prikaz' pristup.",
"ExceptionEmailExists": "Korisnik sa elektronskom adresom '%s' već postoji.",
"ExceptionInvalidEmail": "Elektronska adresa nije validna.",
- "ExceptionInvalidPassword": "Dužina lozinke mora biti između %1$s i %2$s znakova.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth očekuje MD5 hash lozinku (niz od 32 znaka). Molimo vas da primenite funkciju md5() nad lozinkom pre poziva ovog metoda. Hvala.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Uklanjanje superkorisničkog nivoa pristupa korisniku '%s' nije moguće.",
"ExceptionSuperUserAccess": "Ovaj korisnik već ima superkorisnički nivo pristupa. Možete mu ukloniti taj nivo i pokušati ponovo.",
diff --git a/plugins/UsersManager/lang/sv.json b/plugins/UsersManager/lang/sv.json
index 51bb38f20d..9a971c3045 100644
--- a/plugins/UsersManager/lang/sv.json
+++ b/plugins/UsersManager/lang/sv.json
@@ -7,6 +7,7 @@
"AnonymousUserHasViewAccess": "Observera: Användare %1$s och användare %2$s har nu tillgång till den här webbsidan.",
"AnonymousUserHasViewAccess2": "Dina analysrapporter och informationen om dina besökare är publika.",
"ApplyToAllWebsites": "Använd för alla webbplatser",
+ "ChangeAllConfirm": "Är du säker på att du vill ge '%s' tillgång till alla webbplatserna?",
"ChangePasswordConfirm": "Vid byte av lösenord kommer också användarens token_auth att ändras. Vill du verkligen fortsätta?",
"ClickHereToDeleteTheCookie": "Klicka här för att ta bort kakan så att Piwik börjar spåra dina besök igen",
"ClickHereToSetTheCookieOnDomain": "Klicka här för att sätta kakan som exkluderar dina besök spårade av Piwik för webbplatsen %s",
@@ -25,7 +26,6 @@
"ExceptionEmailExists": "Användaren med e-postadressen '%s' finns redan.",
"ExceptionInvalidEmail": "E-postadressen har inte ett giltigt format.",
"ExceptionInvalidLoginFormat": "Användarnamnet måste vara mellan %1$s och %2$s tecken långt och får endast innehålla bokstäver, siffror och tecknen _ - . @ +",
- "ExceptionInvalidPassword": "Lösenordets längd måste vara mellan %1$s och %2$s tecken.",
"ExceptionLoginExists": "Användaren '%s' finns redan.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth förväntar sig MD5-hashar av lösenorden (32 tecken lång sträng). Anropa gärna md5() funktionen på lösenord innan du anropar den här metoden.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Att ta bort Superanvändarbehörigheten från användare '%s' är inte möjligt.",
@@ -38,9 +38,11 @@
"ForAnonymousUsersReportDateToLoadByDefault": "Rapport som laddas som standard för anonyma användare.",
"GiveViewAccess": "Ge visningsbehörighet",
"GiveViewAccessTitle": "Ge en existerande användare behörighet att visa rapporter för %s",
+ "GiveViewAccessInstructions": "För att ge en befintlig användare läsrättighet för %s skriv in användarnamnet eller e-postadressen för den befintliga användaren.",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Om du vill ändra ditt lösenord så skriver du in det nya, annars lämnar du fältet tomt.",
"InjectedHostCannotChangePwd": "Du besöker för närvarande sidan genom ett okänt värdnamn (%1$s). Du kan inte ändra ditt lösenord innan det här prblemet är åtgärdat.",
"LastSeen": "Senast sedd",
+ "MainDescription": "Välj vilka användare som ska få tillgång till dina webbplatser. Du kan också ge tillgång till alla webbplatser samtidigt genom att välja \"Tillämpa på alla webbplatser\" i webbplatsväljaren.",
"ManageAccess": "Hantera rättigheter",
"MenuAnonymousUserSettings": "Inställningar för anonyma användare",
"MenuUsers": "Användare",
@@ -49,6 +51,7 @@
"PersonalSettings": "Personliga inställningar",
"NoteNoAnonymousUserAccessSettingsWontBeUsed2": "Notera: Eftersom att inga webbplaster tillåter anonym åtkomst till analysdata, så kan inga ändringar göras i den här sektionen.",
"NoUsersExist": "Det finns inga användare än.",
+ "PluginDescription": "Användarhanteringen låter dig lägga till nya användare, redigera befintliga användare och ge dom tillgång till läsrättighet eller administrera webbplatser.",
"PrivAdmin": "Administratör",
"PrivNone": "Inga rättigheter",
"PrivView": "Visa",
diff --git a/plugins/UsersManager/lang/tl.json b/plugins/UsersManager/lang/tl.json
index e36ce6ab3f..79c2fef5c5 100644
--- a/plugins/UsersManager/lang/tl.json
+++ b/plugins/UsersManager/lang/tl.json
@@ -21,7 +21,6 @@
"ExceptionEditAnonymous": "Ang mga hindi kilalang user ay hindi maaaring i-edit o tanggaling. Ito ay ginagamit ng Piwik upang tukuyin kung hindi pa naka logged ang user. maari mong gawing pampubliko ang iyong mga statistics sa pamamagitan ng pagbibigay ng 'view' access na gumagamit ng 'anonymous' user.",
"ExceptionEmailExists": "Ang email na '%s' para sa user na ito ay may iba nang gumagamit.",
"ExceptionInvalidEmail": "Ang e-mail ay walang wastong format.",
- "ExceptionInvalidPassword": "Ang haba ng password ay dapat nasa pagitan ng %1$s at %2$s na character.",
"ExceptionPasswordMD5HashExpected": "Ang UserManager.get Token Auth ay kinikilala lamang ang MD5-hashed password (32 chars long string). Mangyaring gamitin ang md5() function sa password bago gamitin ang method na ito.",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "Ang pag-alis sa Super User access mula sa user '%s' ay hindi posible.",
"ExceptionSuperUserAccess": "Ang user na ito ay mayroong Super User access at meroong permiso na e-access at magbago sa lahat ng website na nasa Piwik. Maari mong alisin ang Super User access mula sa user na ito at subukang muli.",
diff --git a/plugins/UsersManager/lang/uk.json b/plugins/UsersManager/lang/uk.json
index e429bb4983..f393b6bb68 100644
--- a/plugins/UsersManager/lang/uk.json
+++ b/plugins/UsersManager/lang/uk.json
@@ -1,40 +1,73 @@
{
"UsersManager": {
- "AddUser": "Створити нового користувача",
+ "AddUser": "Додати нового користувача",
"Alias": "Псевдонім",
- "AllWebsites": "Всі веб-сайти",
- "ApplyToAllWebsites": "Застосувати до всіх веб-сайтів",
- "ClickHereToDeleteTheCookie": "Клацніть щоб видалити cookie та дозволити Piwik відслідковувати ваші візити",
- "ClickHereToSetTheCookieOnDomain": "Клацніть щоб встановити cookie який слугуватиме вказівкою для ігнорування ваших візитів при відслідковуванні на веб-сайті %s",
- "DeleteConfirm": "Видалити користувача %s?",
- "Email": "E-mail",
- "ExceptionAccessValues": "Параметр доступу повинен мати одне з наступних значень: [ %s ]",
- "ExceptionAdminAnonymous": "Не можна надати права адміністратора анонімним користувачам.",
- "ExceptionDeleteDoesNotExist": "Користувач \"%s\" не існує і тому не може бути видалений.",
- "ExceptionEditAnonymous": "Анонімний користувач не може бути відредагований або видалений. Цей тип користувачів Piwik застосовує для користувачів, які не представились системі. Наприклад, Ви можете зробити Вашу статистику публічною надаючи права \"перегляду\" анонімномим користувачам.",
- "ExceptionEmailExists": "Користувач з адресою e-mail \"%s\" вже існує.",
- "ExceptionInvalidEmail": "Невірний e-mail.",
- "ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth приймає на вхід пароль хешований MD5 (стрічку довжиною в 32 символи). Викличте функцію md5() перед визовом даного методу.",
- "ExceptionUserDoesNotExist": "Користувач \"%s\" не існує.",
- "ExcludeVisitsViaCookie": "Виключити ваші відвідування використовуючи cookie",
- "ForAnonymousUsersReportDateToLoadByDefault": "Для анонімних користувачів повідомляти дату завантаження за замовчування",
- "IfYouWouldLikeToChangeThePasswordTypeANewOne": "Якщо необхідно змінити пароль, введіть новий сюди. В іншому випадку залиште поле незаповненим.",
- "ManageAccess": "Управління доступом",
- "MenuAnonymousUserSettings": "Налаштування анонімного користувача",
+ "AllWebsites": "Усі сайти",
+ "AnonymousUser": "Анонімний користувач",
+ "AnonymousUserHasViewAccess": "Примітка: користувач %1$s має %2$s доступ до цього сайту.",
+ "AnonymousUserHasViewAccess2": "Звіти та дані про відвідувачів загальнодоступні.",
+ "ApplyToAllWebsites": "Застосувати до всіх сайтів",
+ "ChangeAllConfirm": "Ви впевнені, що хочете надати '%s' доступ до всіх веб-сайтів?",
+ "ChangePasswordConfirm": "Зміна пароля також змінить призначений для користувача token_auth. Ви дійсно хочете продовжити?",
+ "ClickHereToDeleteTheCookie": "Натисніть тут, щоб видалити cookie ігнорування, і дозволити системі веб-аналітики відстежувати ваші відвідування",
+ "ClickHereToSetTheCookieOnDomain": "Натисніть тут, щоб встановити cookie ігнорування веб-аналітики, після установки якого система Вас буде ігнорувати при відвідуванні %s",
+ "ConfirmGrantSuperUserAccess": "Ви дійсно хочете користувача «%s» підвищити до суперкористувача? Увага: користувач матиме доступ до всіх веб-сайтів і зможе виконувати адміністративні завдання.",
+ "ConfirmProhibitMySuperUserAccess": "%s, Ви дійсно хочете видалити у себе права суперкористувача? Ви втратите всі дозволи і доступ до всіх сайтів і будете разлогінени з Piwik.",
+ "ConfirmProhibitOtherUsersSuperUserAccess": "Ви дійсно хочете видалити суперкористувача від '%s'? Користувач втратить усі права та доступ до всіх сайтів. Переконайтеся в тому, щоб дати доступ до потрібних сайтів, потім, якщо треба.",
+ "DeleteConfirm": "Ви впевнені, що хочете видалити користувача %s?",
+ "Email": "Email",
+ "EmailYourAdministrator": "%1$sНапишіть вашому адміністратору про цю проблему%2$s.",
+ "EnterUsernameOrEmail": "Введіть логін або адресу електронної пошти",
+ "ExceptionAccessValues": "Параметр доступу може мати тільки одне з наступних значень: [ %s ]",
+ "ExceptionAdminAnonymous": "Ви не можете надати права адміністратора анонімному користувачу.",
+ "ExceptionDeleteDoesNotExist": "Користувача '%s' не існує, тому він не може бути видалений.",
+ "ExceptionDeleteOnlyUserWithSuperUserAccess": "Неможливо видалити користувача '%s'",
+ "ExceptionEditAnonymous": "Анонімний користувач не може бути видалений. Він необхідний системі веб-аналітики для ідентифікації користувачів, які не ввійшли в систему. Наприклад, ви можете зробити статистику публічною, надаючи право 'Перегляд' анонімному користувачу.",
+ "ExceptionEmailExists": "Користувач з Email '%s' вже існує.",
+ "ExceptionInvalidEmail": "Email неправильного формату",
+ "ExceptionInvalidLoginFormat": "Ім'я користувача повинне бути від %1$s до %2$s символів і містити тільки літери, цифри, чи знаки '_' або '-' або '.' або '@' або '+'",
+ "ExceptionLoginExists": "Ім'я користувача '%s' вже існує.",
+ "ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth очікує MD5-хешваний пароль (рядок в 32 символи). Будь ласка, викличте функцію md5() до паролю перед викликом цього методу.",
+ "ExceptionRemoveSuperUserAccessOnlySuperUser": "Видалення прав суперкористувача у користувача «%s» не уявляється можливим.",
+ "ExceptionSuperUserAccess": "Цей користувач вже має статус суперкористувача і дозвіл на зміну всіх веб-сайти в Piwik. Ви можете видалити права суперкористувача у цього користувача, і спробувати знову.",
+ "ExceptionUserDoesNotExist": "Користувач '%s' не існує.",
+ "ExceptionYouMustGrantSuperUserAccessFirst": "Повинен бути принаймні один суперкористувач. Будь ласка, зробіть спочатку іншого суперкористувача.",
+ "ExceptionUserHasViewAccessAlready": "Цей користувач вже має доступ до цього сайту.",
+ "ExceptionNoValueForUsernameOrEmail": "Будь ласка, введіть ім'я користувача або email адресу.",
+ "ExcludeVisitsViaCookie": "Cookie виключення з статистики",
+ "ForAnonymousUsersReportDateToLoadByDefault": "Звіт для анонімних користувачів відображається за",
+ "GiveViewAccess": "Дати доступ на перегляд",
+ "GiveViewAccessTitle": "Дати існуючому користувачу доступ для перегляду звітів для %s",
+ "GiveViewAccessInstructions": "Щоб дати існуючому користувачу доступ для перегляду %s введіть логін або адресу електронної пошти для існуючого користувача",
+ "IfYouWouldLikeToChangeThePasswordTypeANewOne": "Якщо ви хочете змінити пароль, введіть новий. Інакше залиште поле порожнім.",
+ "InjectedHostCannotChangePwd": "В даний момент ви знаходитесь в Piwik з невідомого хоста (%1$s). Ви не можете змінити пароль, поки ця проблема не буде вирішена.",
+ "LastSeen": "Останнє відвідування",
+ "MainDescription": "Вирішення, які користувачі мають доступ до ваших сайтів. Ви також можете дати доступ на всі сайти відразу вибравши \"Поширюються на всі сайти\" у селекторі сайтів.",
+ "ManageAccess": "Управління правами доступу",
+ "MenuAnonymousUserSettings": "Налаштування анонімності",
"MenuUsers": "Користувачі",
- "MenuUserSettings": "Налаштування користувача",
- "PrivAdmin": "Адміністрування",
- "PrivNone": "Без доступу",
+ "MenuUserSettings": "Мої налаштування",
+ "MenuPersonal": "Персональне",
+ "PersonalSettings": "Персональні налаштування",
+ "NoteNoAnonymousUserAccessSettingsWontBeUsed2": "Підказка: Ви не можете змінити ці настройки, тому що у вас немає жодного веб-сайту, до якого б мав доступ анонімний користувач.",
+ "NoUsersExist": "Поки немає користувачів.",
+ "PluginDescription": "Управління користувачами дозволяє додавати нових користувачів, редагувати існуючих користувачів і дати їм доступ для перегляду або адміністрування сайтів.",
+ "PrivAdmin": "Адмін",
+ "PrivNone": "Немає доступу",
"PrivView": "Перегляд",
- "ReportDateToLoadByDefault": "Повідомляти дату завантаження за замовчуванням",
- "ReportToLoadByDefault": "Повідомляти про завантаження за замовчуванням",
- "TheLoginScreen": "Вікно входу.",
- "TypeYourPasswordAgain": "Введіть новий пароль знову.",
- "User": "Користувачі",
- "UsersManagement": "Керування Користувачами",
- "UsersManagementMainDescription": "Створіть нових користувачів або редагуйте існуючих. Також нижче можна задати права доступу для них.",
- "WhenUsersAreNotLoggedInAndVisitPiwikTheyShouldAccess": "Якщо користувачі не увійшли в систему і відвідують Piwik, то овни повинні мати можливість отримати доступ",
- "YourUsernameCannotBeChanged": "Ім’я користувача не можу бути змінене.",
+ "ReportDateToLoadByDefault": "Звіт за замовчуванням за",
+ "ReportToLoadByDefault": "Звіт за замовчуванням",
+ "SuperUserAccessManagement": "Управління суперкористувачами",
+ "SuperUserAccessManagementGrantMore": "Ви можете надати права суперкористувача іншим користувачам Piwik тут. Будь ласка, використовуйте цю функцію з обережністю.",
+ "SuperUserAccessManagementMainDescription": "Суперкористувачі мають найвищі дозволи. Вони можуть виконувати всі адміністративні завдання, такі як додавання нових сайтів для моніторингу, додавання користувачів, зміна прав доступу користувачів, активація і деактивація плагінів і навіть встановлення нових плагінів з Маркету.",
+ "TheLoginScreen": "Сторінка входу",
+ "ThereAreCurrentlyNRegisteredUsers": "Зараз налічується %s зареєстрованих користувачів.",
+ "TypeYourPasswordAgain": "Введіть ваш новий пароль знову.",
+ "User": "Користувач",
+ "UsersManagement": "Керування користувачами",
+ "UsersManagementMainDescription": "Створення нових користувачів або редагування існуючих. Також Ви можете задати права доступу для користувача.",
+ "WhenUsersAreNotLoggedInAndVisitPiwikTheyShouldAccess": "Коли незареєстровані користувачі відвідують систему Piwik, вони повинні бачити",
+ "YourUsernameCannotBeChanged": "Ім'я вашого користувача не може бути змінено.",
"YourVisitsAreIgnoredOnDomain": "%1$sВаші відвідування ігноруються системою Piwik в %2$s %3$s (Piwik знашов cookie у вашому браузері з вказівкою ігнорувати).",
"YourVisitsAreNotIgnored": "%1$sВаші відвідування відслідковуються системою Piwik %2$s (Piwik не знашов cookie у вашому браузері)."
}
diff --git a/plugins/UsersManager/lang/vi.json b/plugins/UsersManager/lang/vi.json
index 33b12cb874..2b92f662bb 100644
--- a/plugins/UsersManager/lang/vi.json
+++ b/plugins/UsersManager/lang/vi.json
@@ -3,6 +3,7 @@
"AddUser": "Thêm một người dùng mới",
"Alias": "Bí danh",
"AllWebsites": "Tất cả các website",
+ "AnonymousUser": "Người dùng ẩn danh",
"AnonymousUserHasViewAccess": "Lưu ý: Người dùng %1$s có truy cập %2$s đến website này.",
"AnonymousUserHasViewAccess2": "Các báo cáo phân tích của bạn và thông tin các khách truy cập của bạn là công khai có thể xem được.",
"ApplyToAllWebsites": "Áp dụng cho tất cả các website",
@@ -12,24 +13,30 @@
"DeleteConfirm": "Bạn có chắc chắn muốn xóa người dùng %s?",
"Email": "Email",
"EmailYourAdministrator": "%1$s E-mail tới quản trị viên của bạn về vấn đề này %2$s.",
+ "EnterUsernameOrEmail": "Nhập một tên người dùng hoặc địa chỉ email",
"ExceptionAccessValues": "Tham số truy cập phải có một trong các giá trị sau: [%s]",
"ExceptionAdminAnonymous": "Bạn không thể cấp quyền truy cập \"quản trị\" cho người sử dụng 'ẩn danh'.",
"ExceptionDeleteDoesNotExist": "Người dùng '%s' không tồn tại do đó nó không thể bị xóa.",
"ExceptionEditAnonymous": "Người dùng ẩn danh không thể chỉnh sửa hoặc xóa. Nó được sử dụng bởi Piwik để xác định một người dùng đã không đăng nhập lúc này. Ví dụ, bạn có thể làm cho số liệu thống kê công cộng(public) của bạn bằng cách cho phép truy cập \"xem\" đến người dùng 'ẩn danh'.",
"ExceptionEmailExists": "Người dùng với email '%s' đã tồn tại.",
"ExceptionInvalidEmail": "Email không có một định dạng hợp lệ.",
- "ExceptionInvalidPassword": "Độ dài mật khẩu phải từ %1$s và %2$s ký tự.",
+ "ExceptionLoginExists": "Tên người dùng '%s' đã tồn tại sẵn.",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth là yêu cầu một mật khẩu băm MD5 (chuỗi 32 char long). Xin vui lòng gọi hàm md5() trên mật khẩu trước khi gọi phương thức này.",
"ExceptionUserDoesNotExist": "Người dùng '%s' không tồn tại.",
+ "ExceptionNoValueForUsernameOrEmail": "Vui lòng nhập một tên người dùng hoặc địa chỉ email.",
"ExcludeVisitsViaCookie": "Loại bỏ các truy cập của bạn sử dụng một cookie",
"ForAnonymousUsersReportDateToLoadByDefault": "Đối với người dùng ẩn danh, báo cáo thep ngày nạp theo mặc định",
"IfYouWouldLikeToChangeThePasswordTypeANewOne": "Nếu bạn muốn thay đổi các loại mật khẩu thành một cái mới. Nếu không thì để trống.",
"InjectedHostCannotChangePwd": "Bạn đang truy cập với một máy chủ không xác định (%1$s). Bạn không thể thay đổi mật khẩu của bạn cho đến khi vấn đề này được xử lý.",
+ "LastSeen": "Lần xem cuối",
"ManageAccess": "Quản lý truy cập",
"MenuAnonymousUserSettings": "Thiết lập người dùng ẩn danh",
"MenuUsers": "Các người dùng",
"MenuUserSettings": "Thiết lập người dùng",
+ "MenuPersonal": "Cá nhân",
+ "PersonalSettings": "Thiết lập cá nhân",
"NoteNoAnonymousUserAccessSettingsWontBeUsed2": "Lưu ý: Bạn không thể thay đổi các thiết lập trong phần này, bởi vì bạn không có bất kỳ trang web nào có thể truy cập bởi người dùng ẩn danh.",
+ "NoUsersExist": "Chưa có người dùng nào.",
"PrivAdmin": "Quản trị viên",
"PrivNone": "Không có truy cập",
"PrivView": "Xem",
diff --git a/plugins/UsersManager/lang/zh-cn.json b/plugins/UsersManager/lang/zh-cn.json
index 50bb92f4be..5462bc94c9 100644
--- a/plugins/UsersManager/lang/zh-cn.json
+++ b/plugins/UsersManager/lang/zh-cn.json
@@ -18,7 +18,6 @@
"ExceptionEditAnonymous": "anonymous 用户不能被修改或删除,因为他是被 Piwik 使用来定义一个还未登入的用户!例如,您可以把 '查看' 权限授予 'anonymous' 用户以公开您的统计资料!",
"ExceptionEmailExists": "使用邮箱 '%s' 的用户已存在!",
"ExceptionInvalidEmail": "邮箱格式不正确!",
- "ExceptionInvalidPassword": "密码长度必须介于 %1$s 和 %2$s 个字符之间。",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth 是以MD5加密的密码(32 个字符)。使用此方法请请先调用 md5()函数。",
"ExceptionUserDoesNotExist": "用户 '%s' 不存在!",
"ExcludeVisitsViaCookie": "用 cookie 排除您自己的访问记录",
diff --git a/plugins/UsersManager/lang/zh-tw.json b/plugins/UsersManager/lang/zh-tw.json
index db5f835832..3c9977d51e 100644
--- a/plugins/UsersManager/lang/zh-tw.json
+++ b/plugins/UsersManager/lang/zh-tw.json
@@ -22,7 +22,6 @@
"ExceptionEditAnonymous": "匿名用戶不能修改或刪除。因為 Piwik 用來定義一個還未登入的使用者。舉例來說,你可以把'檢視'權限給匿名用戶來公開你的統計資料。",
"ExceptionEmailExists": "使用 '%s' E-mail 的使用者已經存在。",
"ExceptionInvalidEmail": "此 E-mail 地址格式無效。",
- "ExceptionInvalidPassword": "密碼長度必須是介於 %1$s 跟 %2$s 字符之間。",
"ExceptionPasswordMD5HashExpected": "UsersManager.getTokenAuth 是以MD5加密的密碼(32個字元字串)。在使用此方法前請先呼叫 md5() 函式。",
"ExceptionRemoveSuperUserAccessOnlySuperUser": "刪除用戶 '%s' 的超級用戶訪問權限是不可能的。",
"ExceptionSuperUserAccess": "該用戶擁有超級用戶訪問權限,並且已有權限訪問和修改的所有網站的Piwik。您可以刪除該用戶的超級用戶訪問權限,然後再試一次。",
diff --git a/plugins/UsersManager/tests/Integration/UsersManagerTest.php b/plugins/UsersManager/tests/Integration/UsersManagerTest.php
index 4b4dfb6fa7..0d24d5f5b2 100644
--- a/plugins/UsersManager/tests/Integration/UsersManagerTest.php
+++ b/plugins/UsersManager/tests/Integration/UsersManagerTest.php
@@ -159,7 +159,6 @@ class UsersManagerTest extends IntegrationTestCase
{
return array(
array("geggeqgeqag", "pas", "email@email.com", "alias"), // too short -> exception
- array("ghqgeggg", "gegageqqqqqqqgeqgqeg84897897897897g122gerrgageqqqqqqqgeqgqeg84897897897897g12234k3", "email@email.com", "alias"), // too long -> exception
array("geggeqgeqag", "", "email@email.com", "alias"), // empty -> exception
);
}
@@ -196,6 +195,19 @@ class UsersManagerTest extends IntegrationTestCase
}
/**
+ * long password => should work
+ * empty alias => use login
+ */
+ public function testAddUserLongPassword()
+ {
+ $login = "geggeqgeqag";
+ $this->api->addUser($login, "geqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaegeqgeagaeg", "mgeagi@geq.com", "");
+ $user = $this->api->getUser($login);
+ $this->assertEquals($login, $user['alias']);
+ $this->assertEquals($login, $user['login']);
+ }
+
+ /**
* no alias => use login
*/
public function testAddUserNoAliasSpecified()
@@ -345,7 +357,7 @@ class UsersManagerTest extends IntegrationTestCase
$this->assertInternalType('string', $user['date_registered']);
$this->assertEquals($email, $user['email']);
- //alias shouldnt be empty even if no alias specified
+ //alias shouldn't be empty even if no alias specified
$this->assertGreaterThan(0, strlen($user['alias']));
}
diff --git a/plugins/UsersManager/tests/System/ApiTest.php b/plugins/UsersManager/tests/System/ApiTest.php
index 7696c786b5..b72a956e10 100644
--- a/plugins/UsersManager/tests/System/ApiTest.php
+++ b/plugins/UsersManager/tests/System/ApiTest.php
@@ -48,7 +48,7 @@ class ApiTest extends SystemTestCase
$apiToTest = array(
array('UsersManager.getUsers'),
array('UsersManager.getUsersLogin'),
- array('UsersManager.getUsersAccessFromSite', array('idSite' => 6)), // admin user has admin acces for this
+ array('UsersManager.getUsersAccessFromSite', array('idSite' => 6)), // admin user has admin access for this
array('UsersManager.getUsersAccessFromSite', array('idSite' => 3)), // admin user has only view access for this, should not see anything
array('UsersManager.getUsersSitesFromAccess', array('access' => 'admin')),
array('UsersManager.getUsersWithSiteAccess', array('idSite' => 3, 'access' => 'admin')),
diff --git a/plugins/VisitFrequency/lang/uk.json b/plugins/VisitFrequency/lang/uk.json
index 501946142a..f27b04150f 100644
--- a/plugins/VisitFrequency/lang/uk.json
+++ b/plugins/VisitFrequency/lang/uk.json
@@ -3,12 +3,21 @@
"ColumnActionsByReturningVisits": "Дії повторних відвідувань",
"ColumnAverageVisitDurationForReturningVisitors": "Середня тривалість візиту повторних відвідувань (в сек.)",
"ColumnAvgActionsPerReturningVisit": "Середня кількість дій для повторних відвідувань",
+ "ColumnBounceCountForReturningVisits": "Показник відмов для відвідувачів що повернулись",
"ColumnBounceRateForReturningVisits": "Показник відмов для повторних відвідувань",
+ "ColumnMaxActionsInReturningVisit": "Максимум дій за одне повторне відвідування",
+ "ColumnNbReturningVisitsConverted": "Число конверсії відвідувачів, що повернулися",
"ColumnReturningVisits": "Візити повторних відвідувань",
+ "ColumnSumVisitLengthReturning": "Загальний час, проведений відвідувачами що повернулися (в секундах)",
+ "ColumnUniqueReturningVisitors": "Унікальні відвідувачі що повернулися",
+ "ColumnReturningUsers": "Відвідувачі що повернулися",
+ "PluginDescription": "Звіти метрик нових відвідувачів і постійних відвідувачів.",
"ReturnActions": "%s переглядів сторінок повторними відвідувачами",
"ReturnAverageVisitDuration": "%s середня тривалість візиту для повторного відвідувача",
"ReturnAvgActions": "%s дій на повнорного відвідувача",
"ReturnBounceRate": "%s повторних відвідувачів відмовили (залишили веб-сайт після перегляду одніє сторінки)",
+ "ReturningVisitDocumentation": "Повторний візит (на відміну від нового візиту) зробленого кимось, хто відвідував сайт хоча б один раз.",
+ "ReturningVisitsDocumentation": "Це огляд візитів що повернулися.",
"ReturnVisits": "%s повторних відвідувань",
"SubmenuFrequency": "Частота",
"WidgetGraphReturning": "Графік повторних відвідувань",
diff --git a/plugins/VisitTime/lang/it.json b/plugins/VisitTime/lang/it.json
index c458a1aeba..fcd30ce0b6 100644
--- a/plugins/VisitTime/lang/it.json
+++ b/plugins/VisitTime/lang/it.json
@@ -11,8 +11,8 @@
"VisitsByDayOfWeek": "Visite per giorno della settimana",
"WidgetByDayOfWeekDocumentation": "Il grafico mostra il numero di visite che il tuo sito ha ricevuto in ciascun giorno della settimana.",
"WidgetLocalTime": "Visite per ora locale",
- "WidgetLocalTimeDocumentation": "Questo grafico mostra che ora era nei %1$sfusi orari dei visitatori%2$s durante le loro visite.",
+ "WidgetLocalTimeDocumentation": "Questo grafico mostra che ora era nel %1$sfuso orario dei visitatori%2$s durante le loro visite.",
"WidgetServerTime": "Visite per ora del server",
- "WidgetServerTimeDocumentation": "Questo grafico mostra che ora era nel %1$s fuso orario del server %2$s durante le visite."
+ "WidgetServerTimeDocumentation": "Questo grafico mostra che ora era nel %1$sfuso orario del server%2$s durante le visite."
}
} \ No newline at end of file
diff --git a/plugins/VisitTime/lang/uk.json b/plugins/VisitTime/lang/uk.json
index c48532de5c..7aed4332a4 100644
--- a/plugins/VisitTime/lang/uk.json
+++ b/plugins/VisitTime/lang/uk.json
@@ -1,12 +1,18 @@
{
"VisitTime": {
- "ColumnLocalTime": "Локальний час",
- "ColumnServerTime": "Серверний час",
- "LocalTime": "По-годинне відвідування для локального часу",
- "NHour": "%s год.",
- "ServerTime": "По-годинне відвідування для серверного часу",
- "SubmenuTimes": "Разів",
- "WidgetLocalTime": "Відвідування по локальному часу",
- "WidgetServerTime": "Відвідування по серверному часу"
+ "ColumnLocalTime": "Місцевий час",
+ "ColumnServerTime": "Час на сервері",
+ "DayOfWeek": "День тижня",
+ "LocalTime": "Відвідувань за місцевим часом",
+ "NHour": "%s u.",
+ "PluginDescription": "Повідомляє місцевий час і час на сервері коли відвідувачі дивилися вебсайт або додаток.",
+ "ServerTime": "Відвідувань за часом на сервері",
+ "SubmenuTimes": "По часу",
+ "VisitsByDayOfWeek": "Відвідування по днях тижня",
+ "WidgetByDayOfWeekDocumentation": "Цей графік показує число відвідувань по кожному дню в тижні.",
+ "WidgetLocalTime": "Відвідувань за місцевим часом",
+ "WidgetLocalTimeDocumentation": "Цей графік показує, який час був у %1$s відвідувача в його часовому поясі %2$s під час його відвідування сайту.",
+ "WidgetServerTime": "Відвідувань за часом на сервері",
+ "WidgetServerTimeDocumentation": "Цей графік показує, який час був на %1$s сервері в його часовому поясі %2$s під час відвідування сайту."
}
} \ No newline at end of file
diff --git a/plugins/VisitorInterest/lang/fr.json b/plugins/VisitorInterest/lang/fr.json
index c138425bd3..960308094c 100644
--- a/plugins/VisitorInterest/lang/fr.json
+++ b/plugins/VisitorInterest/lang/fr.json
@@ -8,7 +8,7 @@
"NPages": "%s pages",
"OnePage": "1 page",
"PluginDescription": "Fournit des détails sur les intérêts des visiteurs: nombre de pages vues, temps passé sur le site web, jours depuis la dernière visite et plus.",
- "VisitNum": "Numéro de la visite",
+ "VisitNum": "Nombre de visites",
"VisitsByDaysSinceLast": "Visites par jours depuis la dernière visite",
"visitsByVisitCount": "Visites par nombre de visites",
"VisitsPerDuration": "Visites par durée de la visite",
diff --git a/plugins/VisitorInterest/lang/is.json b/plugins/VisitorInterest/lang/is.json
index 45643cabfc..bc9abd8545 100644
--- a/plugins/VisitorInterest/lang/is.json
+++ b/plugins/VisitorInterest/lang/is.json
@@ -7,7 +7,6 @@
"Engagement": "Þáttaka",
"NPages": "%s síður",
"OnePage": "1 síða",
- "PlusXMin": "%s mín",
"VisitsPerDuration": "Heimsóknir per lengd heimsóknar",
"VisitsPerNbOfPages": "Heimsóknir per fjölda síðna",
"WidgetLengths": "Lengd heimsókna",
diff --git a/plugins/VisitorInterest/lang/ka.json b/plugins/VisitorInterest/lang/ka.json
index e32ba759dd..e35d01bdcc 100644
--- a/plugins/VisitorInterest/lang/ka.json
+++ b/plugins/VisitorInterest/lang/ka.json
@@ -6,7 +6,6 @@
"ColumnVisitDuration": "ვიზიტის ხანგრძლივობა",
"NPages": "%s გვერდი",
"OnePage": "1 გვერდი",
- "PlusXMin": "%s წთ",
"VisitsPerDuration": "ვიზიტები ვიზიტის ხანგრძლივობის შესაბამისად",
"VisitsPerNbOfPages": "ვიზიტები გვერდების რაოდენობის შესაბამისად",
"WidgetLengths": "ვიზიტების სიგრძე",
diff --git a/plugins/VisitorInterest/lang/uk.json b/plugins/VisitorInterest/lang/uk.json
index 1d411e9ee6..d36e3b4a68 100644
--- a/plugins/VisitorInterest/lang/uk.json
+++ b/plugins/VisitorInterest/lang/uk.json
@@ -1,15 +1,24 @@
{
"VisitorInterest": {
"BetweenXYMinutes": "%1$s-%2$s хв",
- "BetweenXYSeconds": "%1$s-%2$s сек.",
+ "BetweenXYSeconds": "%1$s-%2$s сек",
"ColumnPagesPerVisit": "Сторінок за відвідування",
- "ColumnVisitDuration": "Тривалість відвідування",
- "Engagement": "Заручення",
+ "ColumnVisitDuration": "Тривалість відвідувань",
+ "Engagement": "Повторні відвідування",
"NPages": "%s сторінок",
- "OnePage": "одна сторінка",
- "VisitsPerDuration": "Відвідування за тривалістю",
- "VisitsPerNbOfPages": "Відвідування за кількістю сторінок",
+ "OnePage": "1 сторінка",
+ "PluginDescription": "Звіти про інтерес відвідувачів: кількість переглянутих сторінок, час, проведений на сайті, днів з моменту останнього відвідування, і багато іншого.",
+ "VisitNum": "Число відвідувань",
+ "VisitsByDaysSinceLast": "Відвідувань по днях з моменту останнього візиту",
+ "visitsByVisitCount": "Відвідування за їх кількістю",
+ "VisitsPerDuration": "Відвідувань за довжиною візиту",
+ "VisitsPerNbOfPages": "Відвідувань за кількістю сторінок",
"WidgetLengths": "Тривалість відвідувань",
- "WidgetPages": "Кількість сторінок за відвідування"
+ "WidgetLengthsDocumentation": "У цьому звіті ви можете бачити, як багато відвідувань мало певну тривалість. За замовчуванням звіт відображається у вигляді хмари тегів: найбільш часта тривалість відвідувань показується великим тегом.",
+ "WidgetPages": "Сторінок за відвідування",
+ "WidgetPagesDocumentation": "У цьому звіті ви можете бачити, як багато відвідувань мало певну кількість переглядів сторінок. За замовчуванням звіт відображається у вигляді хмари тегів: найбільш часта кількість переглянутих сторінок показується великим тегом.",
+ "WidgetVisitsByDaysSinceLast": "Відвідування по днях з моменту останнього відвідування",
+ "WidgetVisitsByDaysSinceLastDocumentation": "У цьому звіті відображаються відвідування, які були здійснені користувачами, чиї останні відвідування були певну кількість днів назад.",
+ "WidgetVisitsByNumDocumentation": "У цьому звіті відображаються відвідування, які були N-ми по рахунку, тобто показується скільки користувачів відвідали ваш сайт N-ну кількість разів."
}
} \ No newline at end of file
diff --git a/plugins/VisitsSummary/lang/sl.json b/plugins/VisitsSummary/lang/sl.json
index 387eefaa5a..3e80b38b7b 100644
--- a/plugins/VisitsSummary/lang/sl.json
+++ b/plugins/VisitsSummary/lang/sl.json
@@ -2,7 +2,7 @@
"VisitsSummary": {
"AverageGenerationTime": "%s povprečni čas generiranja",
"AverageVisitDuration": "%s povprečno trajanje obiska",
- "GenerateQueries": "%s ukazov izvršenih",
+ "GenerateQueries": "%s izvršenih povpraševanj",
"GenerateTime": "%s sekund za prikaz strani",
"MaxNbActions": "%s največje število akcij v enem obisku",
"NbActionsDescription": "%s akcij",
@@ -17,9 +17,9 @@
"NbUniquePageviewsDescription": "%s unikatnih ogledov",
"NbUniqueVisitors": "%s unikatnih obiskovalcev",
"NbVisitsBounced": "%s ogledov je bilo odbojev (so zapustili stran po ogledu ene strani)",
- "PluginDescription": "Splošne anlitične metrike: obiski, unikatni obiskovalci, število akcij, stopnja odbojev, ipd.",
+ "PluginDescription": "Prikaže splošne anlitične metrike: obiski, unikatni obiskovalci, število akcij, stopnja odbojev, ipd.",
"VisitsSummary": "Povzetek obiskov",
- "VisitsSummaryDocumentation": "To je pregled obiskov v zadnjem času.",
+ "VisitsSummaryDocumentation": "Pregled obiskov v zadnjem času.",
"WidgetLastVisits": "Graf zadnjih obiskov",
"WidgetOverviewGraph": "Pregled z grafom",
"WidgetVisits": "Povzetek obiskov"
diff --git a/plugins/VisitsSummary/lang/uk.json b/plugins/VisitsSummary/lang/uk.json
index cb9c8cbb35..2a394222c2 100644
--- a/plugins/VisitsSummary/lang/uk.json
+++ b/plugins/VisitsSummary/lang/uk.json
@@ -1,16 +1,27 @@
{
"VisitsSummary": {
+ "AverageGenerationTime": "%s середній час генерації сторінки",
"AverageVisitDuration": "%s середня тривалість відвідування",
"GenerateQueries": "%s запитів виконано",
- "GenerateTime": "%s секунд на генерацію сторінки",
- "MaxNbActions": "%s максимальна кількість переглядів сторінок за одне відвідування",
- "NbActionsDescription": "%s дій (переглядів сторінок, завантажень, переходів за зовнішніми посиланнями)",
- "NbActionsPerVisit": "%s дій на відвідування",
+ "GenerateTime": "сторінка згенерована за %s секунд",
+ "MaxNbActions": "%s макс. дій за одне відвідування",
+ "NbActionsDescription": "%s дій (перегляди сторінок, завантаження, зовнішні переходи)",
+ "NbActionsPerVisit": "%s дій за одне відвідування",
+ "NbDownloadsDescription": "%s завантажень",
+ "NbKeywordsDescription": "%s унікальних ключових слів",
+ "NbOutlinksDescription": "%s вихідних посилань",
+ "NbPageviewsDescription": "%s переглядів сторінок",
+ "NbSearchesDescription": "%s всього пошуків на вашому сайті",
+ "NbUniqueDownloadsDescription": "%s унікальних завантажень",
+ "NbUniqueOutlinksDescription": "%s унікальних зовнішніх посилань",
+ "NbUniquePageviewsDescription": "%s унікальних переглядів сторінок",
"NbUniqueVisitors": "%s унікальних відвідувачів",
- "NbVisitsBounced": "%s візитів з відмовами (залишили сайт після прегляду однієї сторінки)",
- "VisitsSummary": "Узагальнено відвідування",
+ "NbVisitsBounced": "%s відмов (пішли після перегляду однієї сторінки)",
+ "PluginDescription": "Звіти загальних аналітичних показників: відвідування, кількість унікальних відвідувачів, кількість користувачів, показник відмов і т.д..",
+ "VisitsSummary": "Відвідувань",
+ "VisitsSummaryDocumentation": "Це огляд динаміки відвідувань.",
"WidgetLastVisits": "Графік останніх відвідувань",
- "WidgetOverviewGraph": "Огляд з графіком",
+ "WidgetOverviewGraph": "Огляд по всім графіками",
"WidgetVisits": "Огляд відвідувань"
}
} \ No newline at end of file
diff --git a/plugins/WebsiteMeasurable/lang/ru.json b/plugins/WebsiteMeasurable/lang/ru.json
new file mode 100644
index 0000000000..a0536412cd
--- /dev/null
+++ b/plugins/WebsiteMeasurable/lang/ru.json
@@ -0,0 +1,5 @@
+{
+ "WebsiteMeasurable": {
+ "Website": "Веб-сайт"
+ }
+} \ No newline at end of file
diff --git a/plugins/WebsiteMeasurable/lang/uk.json b/plugins/WebsiteMeasurable/lang/uk.json
new file mode 100644
index 0000000000..41c3cae624
--- /dev/null
+++ b/plugins/WebsiteMeasurable/lang/uk.json
@@ -0,0 +1,7 @@
+{
+ "WebsiteMeasurable": {
+ "Website": "Сайт",
+ "Websites": "Сайти",
+ "WebsiteDescription": "Сайт складається з веб-сторінок, як правило, подається з одного домену."
+ }
+} \ No newline at end of file
diff --git a/plugins/Widgetize/lang/sv.json b/plugins/Widgetize/lang/sv.json
index 7186a034fe..189b3e5dd9 100644
--- a/plugins/Widgetize/lang/sv.json
+++ b/plugins/Widgetize/lang/sv.json
@@ -1,6 +1,7 @@
{
"Widgetize": {
"OpenInNewWindow": "Öppna i ett nytt fönster",
+ "PluginDescription": "Visa alla Piwik rapporter på din webbplats eller app med hjälp av enkel kod (en HTML-tagg).",
"TopLinkTooltip": "Exportera rapporter från Piwik som Widgets och bädda in instrumentpanelen i din app som en iframe."
}
} \ No newline at end of file
diff --git a/plugins/Widgetize/lang/tr.json b/plugins/Widgetize/lang/tr.json
index 10eaf05201..9080993176 100644
--- a/plugins/Widgetize/lang/tr.json
+++ b/plugins/Widgetize/lang/tr.json
@@ -1,7 +1,7 @@
{
"Widgetize": {
- "OpenInNewWindow": "Yeni pencerede aç",
- "PluginDescription": "Basit Gömülü HTML tag'i ile Piwik raporunu websitende veya uygulamada göster.",
- "TopLinkTooltip": "Piwik Raporunu Widgetlara dönüştür ve Uygulamandaki göstergene iframe olarak ekle"
+ "OpenInNewWindow": "Yeni pencerede açılsın",
+ "PluginDescription": "Piwik raporlarını web sitenizde ya da uygulamanızda basit gömülmüş HTML kod imi ile görüntüleyin.",
+ "TopLinkTooltip": "Piwik Raporlarını Gereç olarak verin ve uygulamanızın panosuna iframe olarak gömün."
}
} \ No newline at end of file
diff --git a/plugins/Widgetize/lang/uk.json b/plugins/Widgetize/lang/uk.json
index 2678eca3f8..7fefcbbdd3 100644
--- a/plugins/Widgetize/lang/uk.json
+++ b/plugins/Widgetize/lang/uk.json
@@ -1,5 +1,7 @@
{
"Widgetize": {
- "OpenInNewWindow": "Відкрити нове вікно"
+ "OpenInNewWindow": "Відкрити в новому вікні",
+ "PluginDescription": "Показати звіт Piwik на вебсайті або в додатку за допомогою простого вбудованого HTML тега.",
+ "TopLinkTooltip": "Експортуйте аналітику Piwik у вигляді віджетів і встановіть їх на своєму сайті або веб-сервісі як iframe."
}
} \ No newline at end of file
diff --git a/plugins/Widgetize/tests/System/WidgetTest.php b/plugins/Widgetize/tests/System/WidgetTest.php
index 40ad26252f..919556ed34 100644
--- a/plugins/Widgetize/tests/System/WidgetTest.php
+++ b/plugins/Widgetize/tests/System/WidgetTest.php
@@ -1360,21 +1360,12 @@ class WidgetTest extends SystemTestCase
),
),
array (
- 'name' => 'Piwik PRO Blog',
- 'uniqueId' => 'widgetPiwikProrssPiwikPro',
+ 'name' => 'Professional Services for Piwik',
+ 'uniqueId' => 'widgetProfessionalServicespromoServices',
'parameters' =>
array (
- 'module' => 'PiwikPro',
- 'action' => 'rssPiwikPro',
- ),
- ),
- array (
- 'name' => 'Piwik PRO: Advanced Analytics & Services',
- 'uniqueId' => 'widgetPiwikPropromoPiwikProPiwikPro',
- 'parameters' =>
- array (
- 'module' => 'PiwikPro',
- 'action' => 'promoPiwikPro',
+ 'module' => 'ProfessionalServices',
+ 'action' => 'promoServices',
),
)
);
diff --git a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php b/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php
index 9fbff49def..cd2a714ab2 100644
--- a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php
+++ b/tests/PHPUnit/Fixtures/TwoVisitsWithCustomEvents.php
@@ -19,7 +19,7 @@ class TwoVisitsWithCustomEvents extends Fixture
{
public $dateTime = '2010-01-03 11:22:33';
public $idSite = 1;
- public $idGoal1 = 1;
+ public static $idGoalTriggeredOnEventCategory = 3;
public function setUp()
{
@@ -38,6 +38,9 @@ class TwoVisitsWithCustomEvents extends Fixture
// These two goals are to check events don't trigger for URL or Title matching
APIGoals::getInstance()->addGoal($this->idSite, 'triggered js', 'url', 'webradio', 'contains');
APIGoals::getInstance()->addGoal($this->idSite, 'triggered js', 'title', 'Music', 'contains');
+ $idGoalTriggeredOnEventCategory = APIGoals::getInstance()->addGoal($this->idSite, 'event matching', 'event_category', 'CategoryTriggersGoal', 'contains');
+
+ $this->assertEquals($idGoalTriggeredOnEventCategory, self::$idGoalTriggeredOnEventCategory);
}
}
@@ -48,6 +51,7 @@ class TwoVisitsWithCustomEvents extends Fixture
$this->trackMusicPlaying($vis);
$this->trackMusicRatings($vis);
+ $this->trackEventWithoutUrl($vis);
$this->trackMovieWatchingIncludingInterval($vis);
$this->dateTime = Date::factory($this->dateTime)->addHour(0.5);
@@ -67,6 +71,14 @@ class TwoVisitsWithCustomEvents extends Fixture
return $vis->setForceVisitDateTime(Date::factory($this->dateTime)->addHour($hour)->getDatetime());
}
+ protected function trackEventWithoutUrl(PiwikTracker $vis)
+ {
+ $url = $vis->pageUrl;
+ $vis->setUrl('');
+ self::checkResponse($vis->doTrackEvent('CategoryTriggersGoal here', 'This is an event without a URL'));
+ $vis->setUrl($url);
+ }
+
protected function trackMusicPlaying(PiwikTracker $vis)
{
$vis->setUrl('http://example.org/webradio');
diff --git a/tests/PHPUnit/Fixtures/UITestFixture.php b/tests/PHPUnit/Fixtures/UITestFixture.php
index d7e7e3c291..7b7517a14f 100644
--- a/tests/PHPUnit/Fixtures/UITestFixture.php
+++ b/tests/PHPUnit/Fixtures/UITestFixture.php
@@ -252,7 +252,6 @@ class UITestFixture extends SqlDump
|| $widget['uniqueId'] == 'widgetReferrersgetKeywordsForPage'
|| $widget['uniqueId'] == 'widgetLivegetVisitorProfilePopup'
|| $widget['uniqueId'] == 'widgetActionsgetPageTitles'
- || $widget['uniqueId'] == 'widgetPiwikProrssPiwikPro'
|| strpos($widget['uniqueId'], 'widgetExample') === 0
) {
continue;
diff --git a/tests/PHPUnit/Framework/Fixture.php b/tests/PHPUnit/Framework/Fixture.php
index 736ffad5fe..c0ea0ce4cd 100644
--- a/tests/PHPUnit/Framework/Fixture.php
+++ b/tests/PHPUnit/Framework/Fixture.php
@@ -28,6 +28,7 @@ use Piwik\Option;
use Piwik\Piwik;
use Piwik\Plugin;
use Piwik\Plugin\Manager;
+use Piwik\Plugins\API\ProcessedReport;
use Piwik\Plugins\LanguagesManager\API as APILanguageManager;
use Piwik\Plugins\MobileMessaging\MobileMessaging;
use Piwik\Plugins\PrivacyManager\DoNotTrackHeaderChecker;
@@ -468,11 +469,14 @@ class Fixture extends \PHPUnit_Framework_Assert
* @param null|string $searchCategoryParameters
* @param null|string $timezone
* @param null|string $type eg 'website' or 'mobileapp'
+ * @param null|string $settings eg 'website' or 'mobileapp'
+ * @param int $excludeUnknownUrls
* @return int idSite of website created
*/
public static function createWebsite($dateTime, $ecommerce = 0, $siteName = false, $siteUrl = false,
$siteSearch = 1, $searchKeywordParameters = null,
- $searchCategoryParameters = null, $timezone = null, $type = null)
+ $searchCategoryParameters = null, $timezone = null, $type = null,
+ $excludeUnknownUrls = 0)
{
if($siteName === false) {
$siteName = self::DEFAULT_SITE_NAME;
@@ -490,7 +494,9 @@ class Fixture extends \PHPUnit_Framework_Assert
$startDate = null,
$excludedUserAgents = null,
$keepURLFragments = null,
- $type
+ $type,
+ $settings = null,
+ $excludeUnknownUrls
);
// Manually set the website creation date to a day earlier than the earliest day we record stats for
diff --git a/tests/PHPUnit/Framework/Mock/Plugin/LogTablesProvider.php b/tests/PHPUnit/Framework/Mock/Plugin/LogTablesProvider.php
new file mode 100644
index 0000000000..c563e250cd
--- /dev/null
+++ b/tests/PHPUnit/Framework/Mock/Plugin/LogTablesProvider.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Piwik\Tests\Framework\Mock\Plugin;
+
+use Piwik\Plugins\CoreHome\Tracker\LogTable\Action;
+use Piwik\Plugins\CoreHome\Tracker\LogTable\Conversion;
+use Piwik\Plugins\CoreHome\Tracker\LogTable\ConversionItem;
+use Piwik\Plugins\CoreHome\Tracker\LogTable\LinkVisitAction;
+use Piwik\Plugins\CoreHome\Tracker\LogTable\Visit;
+
+class LogTablesProvider extends \Piwik\Plugin\LogTablesProvider
+{
+ public function __construct()
+ {
+ }
+
+ public function getAllLogTables()
+ {
+ return array(
+ new Visit(),
+ new Action(),
+ new LinkVisitAction(),
+ new ConversionItem(),
+ new Conversion()
+ );
+ }
+
+}
diff --git a/tests/PHPUnit/Framework/Mock/PiwikPro/Advertising.php b/tests/PHPUnit/Framework/Mock/ProfessionalServices/Advertising.php
index b1de8c4899..4be42a6deb 100644
--- a/tests/PHPUnit/Framework/Mock/PiwikPro/Advertising.php
+++ b/tests/PHPUnit/Framework/Mock/ProfessionalServices/Advertising.php
@@ -5,15 +5,15 @@
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Tests\Framework\Mock\PiwikPro;
+namespace Piwik\Tests\Framework\Mock\ProfessionalServices;
-class Advertising extends \Piwik\PiwikPro\Advertising
+class Advertising extends \Piwik\ProfessionalServices\Advertising
{
public function __construct()
{
}
- public function arePiwikProAdsEnabled()
+ public function areAdsForProfessionalServicesEnabled()
{
return true;
}
diff --git a/tests/PHPUnit/Framework/TestCase/SystemTestCase.php b/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
index dbcd3671ef..a2f5f5d7b6 100755
--- a/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
+++ b/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
@@ -22,7 +22,6 @@ use Piwik\Tests\Framework\Constraint\HttpResponseText;
use Piwik\Tests\Framework\TestRequest\ApiTestConfig;
use Piwik\Tests\Framework\TestRequest\Collection;
use Piwik\Tests\Framework\TestRequest\Response;
-use Piwik\Translate;
use Piwik\Log;
use PHPUnit_Framework_TestCase;
use Piwik\Tests\Framework\Fixture;
diff --git a/tests/PHPUnit/Framework/TestRequest/Response.php b/tests/PHPUnit/Framework/TestRequest/Response.php
index b67b7d8092..cc5b682be2 100644
--- a/tests/PHPUnit/Framework/TestRequest/Response.php
+++ b/tests/PHPUnit/Framework/TestRequest/Response.php
@@ -131,6 +131,7 @@ class Response
'visitorId',
'nextVisitorId',
'previousVisitorId',
+ 'idvisitor'
);
return $this->removeXmlFields($apiResponse, $toRemove);
diff --git a/tests/PHPUnit/Integration/CronArchiveTest.php b/tests/PHPUnit/Integration/CronArchiveTest.php
index 1fc6eaa075..682425f1e3 100644
--- a/tests/PHPUnit/Integration/CronArchiveTest.php
+++ b/tests/PHPUnit/Integration/CronArchiveTest.php
@@ -105,7 +105,7 @@ Will pre-process for website id = 1, period = day, date = last%s
- pre-processing all visits
- skipping segment archiving for 'actions>=4'.
- pre-processing segment 1/1 actions>=2
-Archived website id = 1, period = day, 1 segments, 0 visits in last %s days, 0 visits today, Time elapsed: %s
+Archived website id = 1, period = day, 1 segments, 1 visits in last %s days, 1 visits today, Time elapsed: %s
Will pre-process for website id = 1, period = week, date = last%s
- pre-processing all visits
- skipping segment archiving for 'actions>=4'.
diff --git a/tests/PHPUnit/Integration/EmailValidatorTest.php b/tests/PHPUnit/Integration/EmailValidatorTest.php
index 22c95f86ee..a9adff114a 100644
--- a/tests/PHPUnit/Integration/EmailValidatorTest.php
+++ b/tests/PHPUnit/Integration/EmailValidatorTest.php
@@ -34,28 +34,55 @@ class EmailValidatorTest extends \PHPUnit_Framework_TestCase
unset($tlds[$key]);
}
}
+ $minimumTlds = 1200;
+ $this->assertGreaterThan( $minimumTlds, count($tlds), "expected to download at least $minimumTlds domain names");
return $tlds;
}
- public function test_allCurrentTlds(){
+ private function skipTestIfIdnNotAvailable()
+ {
+ if (!function_exists('idn_to_utf8')) {
+ $this->markTestSkipped("Function idn_to_utf8 does not exist, skip test");
+ }
+ }
+
+ public function test_allCurrentTlds()
+ {
+ $this->skipTestIfIdnNotAvailable();
+
$tlds = $this->getAllTlds();
if (count($tlds) === 0) {
$this->markTestSkipped("Couldn't get TLD list");
}
+ $errors = array();
foreach ($tlds as $key => $tld) {
if (strpos(mb_strtolower($tld), 'xn--') !== 0) {
$tld = mb_strtolower($tld);
}
- $email = 'test@example.' . idn_to_utf8($tld);
- $this->assertTrue(
- $this->isValid($email),
- "email $email is not valid, but expected to be valid. Add this domain extension to libs/Zend/Validate/Hostname.php"
- );
+ $domainNameExtension = idn_to_utf8($tld);
+ $email = 'test@example.' . $domainNameExtension;
+
+ if(!$this->isValid($email)) {
+ $errors[] = $domainNameExtension;
+ }
+ }
+
+ // only fail when at least 10 domains are failing the test, so it does not fail every time IANA adds a new domain extension...
+ if(count($errors) > 5)
+ {
+ $out = '';
+ foreach($errors as $domainNameExtension) {
+ $out .= "\t'$domainNameExtension' => array(1 => self::VALID_UNICODE_DOMAIN),\n";
+ }
+ $this->fail( "Some email extensions are not supported yet, you can add these domain extensions in libs/Zend/Validate/Hostname.php: \n\n" . $out);
}
}
- public function test_invalidTld(){
+ public function test_invalidTld()
+ {
+ $this->skipTestIfIdnNotAvailable();
+
$tlds = [
strval(bin2hex(openssl_random_pseudo_bytes(64))), //generates 128 bit length string
'-tld-cannot-start-from-hypen',
diff --git a/tests/PHPUnit/Integration/LogDeleterTest.php b/tests/PHPUnit/Integration/LogDeleterTest.php
index a3f0a2f841..62138ec5c4 100644
--- a/tests/PHPUnit/Integration/LogDeleterTest.php
+++ b/tests/PHPUnit/Integration/LogDeleterTest.php
@@ -12,6 +12,7 @@ use Piwik\Common;
use Piwik\DataAccess\RawLogDao;
use Piwik\Db;
use Piwik\LogDeleter;
+use Piwik\Tests\Framework\Mock\Plugin\LogTablesProvider;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Piwik\Tests\Framework\TestDataHelper\LogHelper;
@@ -34,7 +35,7 @@ class LogDeleterTest extends IntegrationTestCase
{
parent::setUp();
- $this->logDeleter = new LogDeleter(new RawLogDao());
+ $this->logDeleter = new LogDeleter(new RawLogDao(), new LogTablesProvider());
$this->logInserter = new LogHelper();
$this->insertTestData();
@@ -50,35 +51,6 @@ class LogDeleterTest extends IntegrationTestCase
$this->assertVisitExists(4);
}
- public function test_deleteConversions_RemovesConversionsAndConversionItems()
- {
- $this->logDeleter->deleteConversions(array(2, 3));
-
- $this->assertConversionsNotExists(2);
- $this->assertConversionsNotExists(3);
-
- $this->assertVisitExists(1);
- $this->assertVisitExists(2, $checkAggregates = false);
- $this->assertVisitExists(3, $checkAggregates = false);
- $this->assertVisitExists(4);
- }
-
- public function test_deleteConversionItems_RemovesConversionItems()
- {
- $this->logDeleter->deleteConversionItems(array(2, 3));
-
- $this->assertConversionItemsNotExist(2);
- $this->assertConversionItemsNotExist(3);
-
- $this->assertConversionsExists(2, $checkAggregates = false);
- $this->assertConversionsExists(3, $checkAggregates = false);
-
- $this->assertVisitExists(1);
- $this->assertVisitExists(2, $checkAggregates = false);
- $this->assertVisitExists(3, $checkAggregates = false);
- $this->assertVisitExists(4);
- }
-
public function test_deleteVisitsFor_DeletesVisitsForSpecifiedRangeAndSites_AndInvokesCallbackAfterEveryChunkIsDeleted()
{
$iterationCount = 0;
diff --git a/tests/PHPUnit/Integration/PiwikPro/AdvertisingTest.php b/tests/PHPUnit/Integration/ProfessionalSupport/AdvertisingTest.php
index 5d3c9c27d0..d8f728d051 100644
--- a/tests/PHPUnit/Integration/PiwikPro/AdvertisingTest.php
+++ b/tests/PHPUnit/Integration/ProfessionalSupport/AdvertisingTest.php
@@ -6,17 +6,17 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Tests\Integration\PiwikPro;
+namespace Piwik\Tests\Integration\ProfessionalServices;
use Piwik\Config;
-use Piwik\PiwikPro\Advertising;
+use Piwik\ProfessionalServices\Advertising;
use Piwik\Plugin;
use Piwik\Tests\Framework\Mock\FakeConfig;
use Piwik\Tests\Framework\Mock\Plugin\Manager;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
/**
- * @group PiwikPro
+ * @group ProfessionalServices
* @group Advertising
* @group Integration
*/
@@ -37,87 +37,54 @@ class AdvertisingTest extends IntegrationTestCase
*/
private $pluginManager;
- private $exampleUrl = 'https://piwik.pro/test';
+ private $exampleUrl = 'https://piwik.xyz/test';
public function setUp()
{
- $this->config = new FakeConfig(array('General' => array('piwik_pro_ads_enabled' => '1')));
+ $this->config = new FakeConfig(array('General' => array('piwik_professional_support_ads_enabled' => '1')));
$this->pluginManager = new Manager();
$this->advertising = $this->buildAdvertising($this->config);
}
- public function test_arePiwikProAdsEnabled_ActuallyEnabled()
+ public function test_areAdsForProfessionalServicesEnabled_ActuallyEnabled()
{
- $enabled = $this->advertising->arePiwikProAdsEnabled();
+ $enabled = $this->advertising->areAdsForProfessionalServicesEnabled();
$this->assertTrue($enabled);
}
- public function test_arePiwikProAdsEnabled_Disabled()
+ public function test_areAdsForProfessionalServicesEnabled_Disabled()
{
- $this->config->General = array('piwik_pro_ads_enabled' => '0');
+ $this->config->General = array('piwik_professional_support_ads_enabled' => '0');
- $enabled = $this->advertising->arePiwikProAdsEnabled();
+ $enabled = $this->advertising->areAdsForProfessionalServicesEnabled();
$this->assertFalse($enabled);
}
- public function test_arePiwikProAdsEnabled_shouldBeDisabledWhenCloudPluginIsInstalled()
+ public function test_areAdsForProfessionalServicesEnabled_UsingPreviousSettingName()
{
- $enabled = $this->advertising->arePiwikProAdsEnabled();
- $this->assertTrue($enabled);
-
- $this->pluginManager->setActivatedPlugins(array('CloudAdmin'));
+ $this->config->General = array('piwik_pro_ads_enabled' => '1');
- $enabled = $this->advertising->arePiwikProAdsEnabled();
- $this->assertFalse($enabled);
- }
+ $enabled = $this->advertising->areAdsForProfessionalServicesEnabled();
- public function test_arePiwikProAdsEnabled_shouldBeDisabledWhenEnterprisePluginIsInstalled()
- {
- $enabled = $this->advertising->arePiwikProAdsEnabled();
$this->assertTrue($enabled);
-
- $this->pluginManager->setActivatedPlugins(array('EnterpriseAdmin'));
-
- $enabled = $this->advertising->arePiwikProAdsEnabled();
- $this->assertFalse($enabled);
}
+
public function test_shouldBeEnabledByDefault()
{
$enabled = $this->buildAdvertising(Config::getInstance());
- $this->assertTrue($enabled->arePiwikProAdsEnabled());
+ $this->assertTrue($enabled->areAdsForProfessionalServicesEnabled());
}
public function test_getPromoUrlForOnPremises_WithoutContent()
{
- $link = $this->advertising->getPromoUrlForOnPremises('Installation_End');
-
- $this->assertSame('https://piwik.pro/c/upgrade/?pk_campaign=Upgrade_to_Pro&pk_medium=Installation_End&pk_source=Piwik_App', $link);
- }
-
- public function test_getPromoUrlForOnPremises_WithContent()
- {
- $link = $this->advertising->getPromoUrlForOnPremises('Installation_End', 'TestContent');
-
- $this->assertSame('https://piwik.pro/c/upgrade/?pk_campaign=Upgrade_to_Pro&pk_medium=Installation_End&pk_source=Piwik_App&pk_content=TestContent', $link);
- }
-
- public function test_getPromoUrlForCloud_WithoutContent()
- {
- $link = $this->advertising->getPromoUrlForCloud('Installation_End');
-
- $this->assertSame('https://piwik.pro/cloud/?pk_campaign=Upgrade_to_Cloud&pk_medium=Installation_End&pk_source=Piwik_App', $link);
- }
-
- public function test_getPromoUrlForCloud_WithContent()
- {
- $link = $this->advertising->getPromoUrlForCloud('Installation_End', 'TestContent');
+ $link = $this->advertising->getPromoUrlForPiwikProUpgrade();
- $this->assertSame('https://piwik.pro/cloud/?pk_campaign=Upgrade_to_Cloud&pk_medium=Installation_End&pk_source=Piwik_App&pk_content=TestContent', $link);
+ $this->assertSame('https://piwik.org/recommends/piwik-pro-from-app', $link);
}
public function test_addPromoCampaignParametersToUrl_withoutContentWithoutQuery()
diff --git a/tests/PHPUnit/Integration/ReleaseCheckListTest.php b/tests/PHPUnit/Integration/ReleaseCheckListTest.php
index 4852d2cf5d..469c6df27a 100644
--- a/tests/PHPUnit/Integration/ReleaseCheckListTest.php
+++ b/tests/PHPUnit/Integration/ReleaseCheckListTest.php
@@ -28,6 +28,8 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
{
private $globalConfig;
+ const MINIMUM_PHP_VERSION = '5.3.3';
+
public function setUp()
{
$iniReader = new IniReader();
@@ -36,6 +38,21 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
parent::setUp();
}
+ public function test_minimumPHPVersion_isEnforced()
+ {
+ global $piwik_minimumPHPVersion;
+ $this->assertEquals(self::MINIMUM_PHP_VERSION, $piwik_minimumPHPVersion, 'minimum PHP version global variable correctly defined');
+ }
+
+ public function test_minimumPhpVersion_isDefinedInComposerJson()
+ {
+ $composerJson = $this->getComposerJsonAsArray();
+ $this->assertEquals(self::MINIMUM_PHP_VERSION, $composerJson['config']['platform']['php']);
+
+ $expectedRequirePhp = '>=' . self::MINIMUM_PHP_VERSION;
+ $this->assertEquals($expectedRequirePhp, $composerJson['require']['php']);
+ }
+
public function test_icoFilesIconsShouldBeInPngFormat()
{
$files = Filesystem::globr(PIWIK_INCLUDE_PATH . '/plugins', '*.ico');
@@ -121,6 +138,86 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
}
}
+ public function getTemplateFileExtensions()
+ {
+ $extensions = array(
+ array('htm'),
+ array('html'),
+ array('twig'),
+ array('tpl'),
+ );
+ return $extensions;
+ }
+
+ /**
+ * @dataProvider getTemplateFileExtensions
+ */
+ public function testTemplatesDontContainJquery($extension)
+ {
+ $patternFailIfFound = 'jquery';
+
+ // known files that will for sure not contain a "buggy" $patternFailIfFound
+ $whiteListedFiles = array(
+ PIWIK_INCLUDE_PATH . '/plugins/TestRunner/templates/travis.yml.twig',
+ PIWIK_INCLUDE_PATH . '/plugins/CoreUpdater/templates/layout.twig',
+ PIWIK_INCLUDE_PATH . '/plugins/Installation/templates/layout.twig',
+ PIWIK_INCLUDE_PATH . '/plugins/Login/templates/login.twig',
+ PIWIK_INCLUDE_PATH . '/tests/UI/screenshot-diffs/singlediff.html',
+
+ // Note: entries below are paths and any file within these paths will be automatically whitelisted
+ PIWIK_INCLUDE_PATH . '/tests/resources/overlay-test-site-real/',
+ PIWIK_INCLUDE_PATH . '/tests/resources/overlay-test-site/',
+ PIWIK_INCLUDE_PATH . '/vendor/facebook/xhprof/xhprof_html/docs/',
+ );
+
+ $files = Filesystem::globr(PIWIK_INCLUDE_PATH, '*.' . $extension);
+ $this->assertFilesDoNotContain($files, $patternFailIfFound, $whiteListedFiles);
+ }
+
+ /**
+ * @param $files
+ * @param $patternFailIfFound
+ * @param $whiteListedFiles
+ */
+ private function assertFilesDoNotContain($files, $patternFailIfFound, $whiteListedFiles)
+ {
+ $foundPatterns = array();
+ foreach ($files as $file) {
+ if($this->isFileOrPathWhitelisted($whiteListedFiles, $file)) {
+ continue;
+ }
+ $content = file_get_contents($file);
+ $foundPattern = strpos($content, $patternFailIfFound) !== false;
+
+ if($foundPattern) {
+ $foundPatterns[] = $file;
+ }
+ }
+
+ $this->assertEmpty($foundPatterns,
+ sprintf("Forbidden pattern \"%s\" was found in the following files ---> please manually delete these files from Git. \n\n\t%s",
+ $patternFailIfFound,
+ implode("\n\t", $foundPatterns)
+ )
+ );
+ }
+
+ /**
+ * @param $whiteListedFiles
+ * @param $file
+ * @return bool
+ */
+ private function isFileOrPathWhitelisted($whiteListedFiles, $file)
+ {
+ foreach ($whiteListedFiles as $whitelistFile) {
+ if (strpos($file, $whitelistFile) === 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
public function testCheckThatGivenPluginsAreDisabledByDefault()
{
$pluginsShouldBeDisabled = array(
@@ -160,6 +257,7 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
{
$files = Filesystem::globr(PIWIK_INCLUDE_PATH, '*.php');
+ $tested = 0;
foreach($files as $file) {
// skip files in these folders
if (strpos($file, '/libs/') !== false) {
@@ -182,7 +280,10 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
$start = fgets($handle, strlen($expectedStart) + 1 );
$this->assertEquals($start, $expectedStart, "File $file does not start with $expectedStart");
+ $tested++;
}
+
+ $this->assertGreaterThan(2000, $tested, 'should have tested at least thousand of php files');
}
public function test_jsfilesDoNotContainFakeSpaces()
@@ -338,8 +439,12 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
shell_exec("sed '/<DEBUG>/,/<\/DEBUG>/d' < ". PIWIK_DOCUMENT_ROOT ."/js/piwik.js | sed 's/eval/replacedEvilString/' | java -jar yuicompressor-2.4.7/build/yuicompressor-2.4.7.jar --type js --line-break 1000 | sed 's/replacedEvilString/eval/' | sed 's/^[/][*]/\/*!/' > " . PIWIK_DOCUMENT_ROOT ."/piwik-minified.js");
$this->assertFileEquals(PIWIK_DOCUMENT_ROOT . '/piwik-minified.js',
- PIWIK_DOCUMENT_ROOT . '/piwik.js',
- 'minified /piwik.js is out of date, please re-generate the minified /piwik.js using instructions in /js/README'
+ PIWIK_DOCUMENT_ROOT . '/piwik.js',
+ 'minified /piwik.js is out of date, please re-generate the minified files using instructions in /js/README'
+ );
+ $this->assertFileEquals(PIWIK_DOCUMENT_ROOT . '/piwik-minified.js',
+ PIWIK_DOCUMENT_ROOT . '/js/piwik.min.js',
+ 'minified /js/piwik.min.js is out of date, please re-generate the minified files using instructions in /js/README'
);
}
@@ -398,7 +503,8 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
|| strpos($file, "tests/resources/Updater/") !== false
|| strpos($file, "Twig/Tests/") !== false
|| strpos($file, "processed/") !== false
- || strpos($file, "/vendor/") !== false;
+ || strpos($file, "/vendor/") !== false
+ || (strpos($file, "tmp/") !== false && strpos($file, 'index.php') !== false);
$isLib = strpos($file, "lib/xhprof") !== false || strpos($file, "phpunit/phpunit") !== false;
return ($isIniFile && $isIniFileInTests) || $isTestResultFile || $isLib;
@@ -526,8 +632,7 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
*/
private function getComposerRequireDevPackages()
{
- $composer = file_get_contents(PIWIK_INCLUDE_PATH . '/composer.json');
- $composerJson = json_decode($composer, $assoc = true);
+ $composerJson = $this->getComposerJsonAsArray();
$composerDependencyDevOnly = array_keys($composerJson["require-dev"]);
return $composerDependencyDevOnly;
}
@@ -657,7 +762,7 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
$countFileChecked++;
}
- $this->assertTrue($countFileChecked > 100, "expected to test at least 100 files, but tested only " . $countFileChecked);
+ $this->assertTrue($countFileChecked > 42, "expected to test at least 100 files, but tested only " . $countFileChecked);
if (!empty($errors)) {
throw new Exception(implode(",\n\n ", $errors));
@@ -672,4 +777,15 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
{
return stripos($file, "/tests/") !== false || stripos($file, "/phantomjs/") !== false;
}
+
+ /**
+ * @return mixed
+ */
+ private function getComposerJsonAsArray()
+ {
+ $composer = file_get_contents(PIWIK_INCLUDE_PATH . '/composer.json');
+ $composerJson = json_decode($composer, $assoc = true);
+ return $composerJson;
+ }
+
}
diff --git a/tests/PHPUnit/Integration/SegmentTest.php b/tests/PHPUnit/Integration/SegmentTest.php
index 4398a3e982..aedd95e61f 100644
--- a/tests/PHPUnit/Integration/SegmentTest.php
+++ b/tests/PHPUnit/Integration/SegmentTest.php
@@ -271,7 +271,7 @@ class SegmentTest extends IntegrationTestCase
*
FROM
" . Common::prefixTable('log_conversion') . " AS log_conversion
- LEFT JOIN " . Common::prefixTable('log_link_visit_action') . " AS log_link_visit_action ON log_conversion.idvisit = log_link_visit_action.idvisit
+ LEFT JOIN " . Common::prefixTable('log_link_visit_action') . " AS log_link_visit_action ON log_link_visit_action.idvisit = log_conversion.idvisit
WHERE
( log_conversion.idvisit = ? )
AND
@@ -361,7 +361,7 @@ class SegmentTest extends IntegrationTestCase
*
FROM
" . Common::prefixTable('log_conversion') . " AS log_conversion
- LEFT JOIN " . Common::prefixTable('log_visit') . " AS log_visit ON log_conversion.idvisit = log_visit.idvisit
+ LEFT JOIN " . Common::prefixTable('log_visit') . " AS log_visit ON log_visit.idvisit = log_conversion.idvisit
WHERE
( log_conversion.idvisit = ? )
AND
@@ -524,7 +524,7 @@ class SegmentTest extends IntegrationTestCase
FROM
" . Common::prefixTable('log_visit') . " AS log_visit
LEFT JOIN " . Common::prefixTable('log_link_visit_action') . " AS log_link_visit_action ON log_link_visit_action.idvisit = log_visit.idvisit
- LEFT JOIN " . Common::prefixTable('log_conversion') . " AS log_conversion ON log_conversion.idvisit = log_link_visit_action.idvisit
+ LEFT JOIN " . Common::prefixTable('log_conversion') . " AS log_conversion ON log_conversion.idvisit = log_visit.idvisit
WHERE
log_conversion.idgoal = ? AND HOUR(log_visit.visit_last_action_time) = ? AND log_link_visit_action.custom_var_k1 = ?
AND (
@@ -693,7 +693,7 @@ class SegmentTest extends IntegrationTestCase
SELECT log_conversion.idgoal AS `idgoal`, log_conversion.custom_dimension_1 AS `custom_dimension_1`, count(*) AS `1`, count(distinct log_conversion.idvisit) AS `3`,
FROM $logConversionsTable AS log_conversion
LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action
- ON log_conversion.idvisit = log_link_visit_action.idvisit
+ ON log_link_visit_action.idvisit = log_conversion.idvisit
LEFT JOIN $logActionTable AS log_action
ON log_link_visit_action.idaction_url = log_action.idaction
WHERE ( log_conversion.server_time >= ?
@@ -761,7 +761,7 @@ class SegmentTest extends IntegrationTestCase
SUM(log_conversion.items) AS `8`
FROM
" . Common::prefixTable('log_conversion') . " AS log_conversion
- LEFT JOIN " . Common::prefixTable('log_link_visit_action') . " AS log_link_visit_action ON log_conversion.idvisit = log_link_visit_action.idvisit
+ LEFT JOIN " . Common::prefixTable('log_link_visit_action') . " AS log_link_visit_action ON log_link_visit_action.idvisit = log_conversion.idvisit
WHERE
( log_conversion.idsite IN (?) )
AND
@@ -1289,7 +1289,7 @@ class SegmentTest extends IntegrationTestCase
FROM (
SELECT log_conversion.idgoal, log_conversion.idvisit, log_conversion.revenue, log_conversion.items
FROM $logConversionTable AS log_conversion
- LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_conversion.idvisit = log_link_visit_action.idvisit
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_link_visit_action.idvisit = log_conversion.idvisit
WHERE ( log_conversion.server_time >= ?
AND log_conversion.server_time <= ?
AND log_conversion.idsite IN (?) )
@@ -1340,7 +1340,7 @@ class SegmentTest extends IntegrationTestCase
FROM (
SELECT log_conversion.idgoal, log_conversion.referer_type, log_conversion.referer_name, log_conversion.referer_keyword, log_conversion.idvisit, log_conversion.revenue
FROM $logConversionTable AS log_conversion
- LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_conversion.idvisit = log_link_visit_action.idvisit
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_link_visit_action.idvisit = log_conversion.idvisit
WHERE ( log_conversion.server_time >= ?
AND log_conversion.server_time <= ?
AND log_conversion.idsite IN (?) )
@@ -1385,8 +1385,8 @@ class SegmentTest extends IntegrationTestCase
FROM (
SELECT log_conversion.idgoal, log_conversion.idvisit, log_conversion.revenue
FROM $logConversionTable AS log_conversion
- LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_conversion.idvisit = log_link_visit_action.idvisit
- LEFT JOIN $logVisitTable AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit
+ LEFT JOIN $logLinkVisitActionTable AS log_link_visit_action ON log_link_visit_action.idvisit = log_conversion.idvisit
+ LEFT JOIN $logVisitTable AS log_visit ON log_visit.idvisit = log_conversion.idvisit
WHERE ( log_conversion.server_time >= ?
AND log_conversion.server_time <= ?
AND log_conversion.idsite IN (?) )
diff --git a/tests/PHPUnit/Integration/Tracker/TrackerCodeGeneratorTest.php b/tests/PHPUnit/Integration/Tracker/TrackerCodeGeneratorTest.php
index 5e932a42e1..06f4bb5916 100644
--- a/tests/PHPUnit/Integration/Tracker/TrackerCodeGeneratorTest.php
+++ b/tests/PHPUnit/Integration/Tracker/TrackerCodeGeneratorTest.php
@@ -45,7 +45,7 @@ class TrackerCodeGeneratorTest extends IntegrationTestCase
(function() {
var u=&quot;//localhost/piwik/&quot;;
_paq.push(['setTrackerUrl', u+'piwik.php']);
- _paq.push(['setSiteId', 1]);
+ _paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
@@ -92,7 +92,7 @@ class TrackerCodeGeneratorTest extends IntegrationTestCase
(function() {
var u=&quot;https://localhost/piwik/&quot;;
_paq.push(['setTrackerUrl', u+'piwik.php']);
- _paq.push(['setSiteId', 1]);
+ _paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
@@ -140,7 +140,7 @@ class TrackerCodeGeneratorTest extends IntegrationTestCase
var u=&quot;//localhost/piwik/&quot;;
_paq.push(['setAPIUrl', 'http://localhost/statistics']);
_paq.push(['setTrackerUrl', u+'piwik.php']);
- _paq.push(['setSiteId', 1]);
+ _paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
@@ -183,7 +183,7 @@ class TrackerCodeGeneratorTest extends IntegrationTestCase
(function() {
var u=&quot;//abc&quot;def/&quot;;
_paq.push([\'setTrackerUrl\', u+\'piwik.php\']);
- _paq.push([\'setSiteId\', 1]);
+ _paq.push([\'setSiteId\', \'1\']);
var d=document, g=d.createElement(\'script\'), s=d.getElementsByTagName(\'script\')[0];
g.type=\'text/javascript\'; g.async=true; g.defer=true; g.src=u+\'piwik.js\'; s.parentNode.insertBefore(g,s);
})();
diff --git a/tests/PHPUnit/Integration/WidgetsListTest.php b/tests/PHPUnit/Integration/WidgetsListTest.php
index d545a7ca10..3cafbe67a1 100644
--- a/tests/PHPUnit/Integration/WidgetsListTest.php
+++ b/tests/PHPUnit/Integration/WidgetsListTest.php
@@ -49,7 +49,7 @@ class WidgetsListTest extends IntegrationTestCase
'Insights_WidgetCategory' => 2,
'ExampleUI_UiFramework' => 8,
'Referrers_Referrers' => 9,
- 'About Piwik' => 10,
+ 'About Piwik' => 7,
);
// number of main categories
$this->assertEquals(count($numberOfWidgets), count($widgetsPerCategory));
diff --git a/tests/PHPUnit/System/CustomEventsTest.php b/tests/PHPUnit/System/CustomEventsTest.php
index 3669d5aa20..f0eef83354 100644
--- a/tests/PHPUnit/System/CustomEventsTest.php
+++ b/tests/PHPUnit/System/CustomEventsTest.php
@@ -18,6 +18,9 @@ use Piwik\Tests\Fixtures\TwoVisitsWithCustomEvents;
*/
class CustomEventsTest extends SystemTestCase
{
+ /**
+ * @var TwoVisitsWithCustomEvents
+ */
public static $fixture = null; // initialized below class definition
/**
@@ -83,15 +86,15 @@ class CustomEventsTest extends SystemTestCase
'testSuffix' => '_segmentMatchesEventActionPlay')
),
- // eventValue should not match any page view
-// array('Actions.getPageUrls', array(
-// 'idSite' => $idSite1,
-// 'date' => $dateTime,
-// 'periods' => $dayPeriod,
-// 'segment' => "eventValue>0",
-// 'setDateLastN' => false,
-// 'testSuffix' => '_eventSegmentMatchNoAction')
-// ),
+ // Goals and events
+ array('Goals.get', array(
+ 'idSite' => $idSite1,
+ 'date' => $dateTime,
+ 'periods' => $dayPeriod,
+ 'idGoal' => TwoVisitsWithCustomEvents::$idGoalTriggeredOnEventCategory,
+ 'setDateLastN' => false)
+ )
+
);
$apiToCallProcessedReportMetadata = array(
diff --git a/tests/PHPUnit/System/EcommerceOrderWithItemsTest.php b/tests/PHPUnit/System/EcommerceOrderWithItemsTest.php
index 31a3646e71..3ef1040f7f 100755
--- a/tests/PHPUnit/System/EcommerceOrderWithItemsTest.php
+++ b/tests/PHPUnit/System/EcommerceOrderWithItemsTest.php
@@ -263,8 +263,8 @@ class EcommerceOrderWithItemsTest extends SystemTestCase
array('Goals.get', array('idSite' => $idSite,
'date' => $dateTime,
'periods' => array('week'),
+ 'idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER,
'otherRequestParameters' => array(
- 'idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER,
'columns' => 'avg_order_revenue'),
'testSuffix' => '_AvgOrderRevenue')),
diff --git a/tests/PHPUnit/System/EnvironmentValidationTest.php b/tests/PHPUnit/System/EnvironmentValidationTest.php
index c283cbbd8f..8f87d999f3 100644
--- a/tests/PHPUnit/System/EnvironmentValidationTest.php
+++ b/tests/PHPUnit/System/EnvironmentValidationTest.php
@@ -46,25 +46,24 @@ class EnvironmentValidationTest extends SystemTestCase
$this->simulateAbsentConfigFile('global.ini.php');
$output = $this->triggerPiwikFrom($entryPoint);
+
$this->assertOutputContainsConfigFileMissingError('global.ini.php', $output);
+
}
- public function getEntryPointsThatErrorWithNoLocal()
+ public function test_NoLocalConfigFile_TriggersError_inTracker()
{
- return array(
- array('tracker'),
- array('console')
- );
+ $this->simulateAbsentConfigFile('config.ini.php');
+
+ $output = $this->triggerPiwikFrom('tracker');
+ $this->assertContains('As Piwik is not installed yet, the Tracking API cannot proceed and will exit without error.', $output);
}
- /**
- * @dataProvider getEntryPointsThatErrorWithNoLocal
- */
- public function test_NoLocalConfigFile_TriggersError($entryPoint)
+ public function test_NoLocalConfigFile_TriggersError_inConsole()
{
$this->simulateAbsentConfigFile('config.ini.php');
- $output = $this->triggerPiwikFrom($entryPoint);
+ $output = $this->triggerPiwikFrom('console');
$this->assertOutputContainsConfigFileMissingError('config.ini.php', $output);
}
@@ -104,6 +103,7 @@ class EnvironmentValidationTest extends SystemTestCase
$this->simulateBadConfigFile($configFile);
$output = $this->triggerPiwikFrom($entryPoint);
+
$this->assertOutputContainsBadConfigFileError($output);
}
@@ -123,7 +123,7 @@ class EnvironmentValidationTest extends SystemTestCase
private function assertOutputContainsConfigFileMissingError($fileName, $output)
{
- $this->assertRegExp("/The configuration file \\{.*\\/" . preg_quote($fileName) . "\\} has not been found or could not be read\\./", $output);
+ $this->assertRegExp("/.*The configuration file \\{.*\\/" . preg_quote($fileName) . "\\} has not been found or could not be read\\..*/", $output, "Output did not contain the expected exception for $fileName --- Output was --- $output");
}
private function assertOutputContainsBadConfigFileError($output)
@@ -191,17 +191,24 @@ class EnvironmentValidationTest extends SystemTestCase
private function sendRequestToTracker()
{
- return $this->curl(Fixture::getRootUrl() . 'tests/PHPUnit/proxy/piwik.php?idsite=1&rec=1&action_name=something');
+ list($response, $info) = $this->curl(Fixture::getRootUrl() . 'tests/PHPUnit/proxy/piwik.php?idsite=1&rec=1&action_name=something');
+
+ // Check Tracker requests return 200
+ $this->assertEquals(200, $info["http_code"], 'Ok response');
+
+ return $response;
}
private function sendRequestToWeb()
{
- return $this->curl(Fixture::getRootUrl() . 'tests/PHPUnit/proxy/index.php');
+ list($response, $info) = $this->curl(Fixture::getRootUrl() . 'tests/PHPUnit/proxy/index.php');
+ return $response;
}
private function sendArchiveWebRequest()
{
- return $this->curl(Fixture::getRootUrl() . 'tests/PHPUnit/proxy/archive.php?token_auth=' . Fixture::getTokenAuth());
+ list($response, $info) = $this->curl(Fixture::getRootUrl() . 'tests/PHPUnit/proxy/archive.php?token_auth=' . Fixture::getTokenAuth());
+ return $response;
}
private function startConsoleProcess()
@@ -226,8 +233,10 @@ class EnvironmentValidationTest extends SystemTestCase
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$response = substr($response, $headerSize);
+ $responseInfo = curl_getinfo($ch);
+
curl_close($ch);
- return $response;
+ return array($response, $responseInfo);
}
} \ No newline at end of file
diff --git a/tests/PHPUnit/System/RowEvolutionTest.php b/tests/PHPUnit/System/RowEvolutionTest.php
index efdf021061..16ad1c4b3f 100755
--- a/tests/PHPUnit/System/RowEvolutionTest.php
+++ b/tests/PHPUnit/System/RowEvolutionTest.php
@@ -118,17 +118,18 @@ class RowEvolutionTest extends SystemTestCase
// Goals > Visits Until Conversion, idGoal != 0
$config['testSuffix'] = '_goals_visitsUntilConversion';
$config['periods'] = array('day');
+ $config['idGoal'] = '2';
$config['otherRequestParameters']['date'] = '2010-02-06,2010-03-06';
$config['otherRequestParameters']['period'] = 'day';
$config['otherRequestParameters']['apiModule'] = 'Goals';
$config['otherRequestParameters']['apiAction'] = 'getVisitsUntilConversion';
$config['otherRequestParameters']['label'] = ('1 visit, 2 visits');
- $config['otherRequestParameters']['idGoal'] = '2';
$return[] = array('API.getRowEvolution', $config);
// Goals > Visits Until Conversion, idGoal != 0, without specifying labels
$config['testSuffix'] = '_goals_visitsUntilConversion_WithoutLabels';
$config['periods'] = array('day');
+ $config['idGoal'] = '2';
$config['otherRequestParameters']['date'] = '2010-02-06,2010-03-06';
$config['otherRequestParameters']['period'] = 'day';
$config['otherRequestParameters']['apiModule'] = 'Goals';
@@ -136,7 +137,6 @@ class RowEvolutionTest extends SystemTestCase
$config['otherRequestParameters']['label'] = false;
$config['otherRequestParameters']['filter_limit'] = 2;
$config['otherRequestParameters']['filter_sort_column'] = 'nb_conversions';
- $config['otherRequestParameters']['idGoal'] = '2';
$return[] = array('API.getRowEvolution', $config);
// test date range where most recent date has no data (for #3465)
diff --git a/tests/PHPUnit/System/expected/test_AutoSuggestAPITest_browserEngine__API.getSuggestedValuesForSegment.xml b/tests/PHPUnit/System/expected/test_AutoSuggestAPITest_browserEngine__API.getSuggestedValuesForSegment.xml
index 837f1843e3..27415a7b8f 100644
--- a/tests/PHPUnit/System/expected/test_AutoSuggestAPITest_browserEngine__API.getSuggestedValuesForSegment.xml
+++ b/tests/PHPUnit/System/expected/test_AutoSuggestAPITest_browserEngine__API.getSuggestedValuesForSegment.xml
@@ -6,6 +6,7 @@
<row>Text-based</row>
<row>Dillo</row>
<row>iCab</row>
+ <row>Elektra</row>
<row>Presto</row>
<row>Gecko</row>
<row>KHTML</row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
index bd56600c6b..193c7e3ebb 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_flat__API.getProcessedReport_day.xml
@@ -214,6 +214,15 @@
<max_event_value>0</max_event_value>
<avg_event_value>0</avg_event_value>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
</result>
<result prettyDate="Monday, January 4, 2010" />
<result prettyDate="Tuesday, January 5, 2010" />
@@ -232,7 +241,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>42</nb_visits>
- <nb_uniq_visitors>40</nb_uniq_visitors>
+ <nb_visits>43</nb_visits>
+ <nb_uniq_visitors>41</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml
index bea242a734..60b79ec22c 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getAction_lastN__API.getProcessedReport_day.xml
@@ -151,6 +151,15 @@
<max_event_value>0</max_event_value>
<avg_event_value>0</avg_event_value>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
</result>
<result prettyDate="Monday, January 4, 2010" />
<result prettyDate="Tuesday, January 5, 2010" />
@@ -164,61 +173,64 @@
<row>
<segment>eventAction==playTrailer</segment>
- <idsubdatatable>807</idsubdatatable>
+ <idsubdatatable>856</idsubdatatable>
</row>
<row>
<segment>eventAction==Search</segment>
- <idsubdatatable>800</idsubdatatable>
+ <idsubdatatable>849</idsubdatatable>
</row>
<row>
<segment>eventAction==play25%25</segment>
- <idsubdatatable>802</idsubdatatable>
+ <idsubdatatable>851</idsubdatatable>
</row>
<row>
<segment>eventAction==play50%25</segment>
- <idsubdatatable>803</idsubdatatable>
+ <idsubdatatable>852</idsubdatatable>
</row>
<row>
<segment>eventAction==play75%25</segment>
- <idsubdatatable>804</idsubdatatable>
+ <idsubdatatable>853</idsubdatatable>
</row>
<row>
<segment>eventAction==playEnd</segment>
- <idsubdatatable>805</idsubdatatable>
+ <idsubdatatable>854</idsubdatatable>
</row>
<row>
<segment>eventAction==rating</segment>
- <idsubdatatable>806</idsubdatatable>
+ <idsubdatatable>855</idsubdatatable>
</row>
<row>
<segment>eventAction==clickBuyNow</segment>
- <idsubdatatable>808</idsubdatatable>
+ <idsubdatatable>857</idsubdatatable>
</row>
<row>
<segment>eventAction==event+action+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
- <idsubdatatable>810</idsubdatatable>
+ <idsubdatatable>859</idsubdatatable>
</row>
<row>
<segment>eventAction==play</segment>
- <idsubdatatable>801</idsubdatatable>
+ <idsubdatatable>850</idsubdatatable>
</row>
<row>
<segment>eventAction==playStart</segment>
- <idsubdatatable>809</idsubdatatable>
+ <idsubdatatable>858</idsubdatatable>
</row>
<row>
<segment>eventAction==Purchase</segment>
</row>
+ <row>
+ <segment>eventAction==This+is+an+event+without+a+URL</segment>
+ </row>
</result>
<result prettyDate="Monday, January 4, 2010" />
<result prettyDate="Tuesday, January 5, 2010" />
@@ -228,7 +240,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>42</nb_visits>
- <nb_uniq_visitors>40</nb_uniq_visitors>
+ <nb_visits>43</nb_visits>
+ <nb_uniq_visitors>41</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml
index 98d6c9c102..40bd94b451 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_flat__API.getProcessedReport_day.xml
@@ -196,6 +196,15 @@
<max_event_value>10</max_event_value>
<avg_event_value>9.5</avg_event_value>
</row>
+ <row>
+ <label>CategoryTriggersGoal here - This is an event without a URL</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
</result>
<result prettyDate="Monday, January 4, 2010" />
<result prettyDate="Tuesday, January 5, 2010" />
@@ -214,7 +223,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>42</nb_visits>
- <nb_uniq_visitors>40</nb_uniq_visitors>
+ <nb_visits>43</nb_visits>
+ <nb_uniq_visitors>41</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml
index e8f56874f1..5b430036c5 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getCategory_lastN__API.getProcessedReport_day.xml
@@ -70,6 +70,15 @@
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
</result>
<result prettyDate="Monday, January 4, 2010" />
<result prettyDate="Tuesday, January 5, 2010" />
@@ -83,17 +92,22 @@
<row>
<segment>eventCategory==Movie</segment>
- <idsubdatatable>745</idsubdatatable>
+ <idsubdatatable>792</idsubdatatable>
</row>
<row>
<segment>eventCategory==Music</segment>
- <idsubdatatable>746</idsubdatatable>
+ <idsubdatatable>793</idsubdatatable>
</row>
<row>
<segment>eventCategory==event+category+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
- <idsubdatatable>747</idsubdatatable>
+ <idsubdatatable>794</idsubdatatable>
+ </row>
+ <row>
+
+ <segment>eventCategory==CategoryTriggersGoal+here</segment>
+ <idsubdatatable>795</idsubdatatable>
</row>
</result>
<result prettyDate="Monday, January 4, 2010" />
@@ -104,7 +118,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>42</nb_visits>
- <nb_uniq_visitors>40</nb_uniq_visitors>
+ <nb_visits>43</nb_visits>
+ <nb_uniq_visitors>41</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml
index 7e7115220c..dcaf39aabb 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_flat__API.getProcessedReport_day.xml
@@ -223,6 +223,15 @@
<max_event_value>9.66</max_event_value>
<avg_event_value>9.66</avg_event_value>
</row>
+ <row>
+ <label>Event Name not defined - This is an event without a URL</label>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
</result>
<result prettyDate="Monday, January 4, 2010" />
<result prettyDate="Tuesday, January 5, 2010" />
@@ -241,7 +250,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>42</nb_visits>
- <nb_uniq_visitors>40</nb_uniq_visitors>
+ <nb_visits>43</nb_visits>
+ <nb_uniq_visitors>41</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml
index 8abd14891c..0dbe31d0ef 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_Events.getName_lastN__API.getProcessedReport_day.xml
@@ -63,7 +63,7 @@
</row>
<row>
<label>Event Name not defined</label>
- <nb_events>6</nb_events>
+ <nb_events>7</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
@@ -119,36 +119,36 @@
<row>
<segment>eventName==Spirited+Away+%28%E5%8D%83%E3%81%A8%E5%8D%83%E5%B0%8B%E3%81%AE%E7%A5%9E%E9%9A%A0%E3%81%97%29</segment>
- <idsubdatatable>873</idsubdatatable>
+ <idsubdatatable>922</idsubdatatable>
</row>
<row>
<segment>eventName==La+fianc%C3%A9e+de+l%26%23039%3Beau</segment>
- <idsubdatatable>872</idsubdatatable>
+ <idsubdatatable>921</idsubdatatable>
</row>
<row>
- <idsubdatatable>871</idsubdatatable>
+ <idsubdatatable>920</idsubdatatable>
</row>
<row>
<segment>eventName==event+name+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+Extremely+long+---%26gt%3B+SHOULD+APPEAR+IN+TEST+OUTPUT+NOT+TRUNCATED+%26lt%3B---</segment>
- <idsubdatatable>877</idsubdatatable>
+ <idsubdatatable>926</idsubdatatable>
</row>
<row>
<segment>eventName==Ponyo+%28%E5%B4%96%E3%81%AE%E4%B8%8A%E3%81%AE%E3%83%9D%E3%83%8B%E3%83%A7%29</segment>
- <idsubdatatable>875</idsubdatatable>
+ <idsubdatatable>924</idsubdatatable>
</row>
<row>
<segment>eventName==Princess+Mononoke+%28%E3%82%82%E3%81%AE%E3%81%AE%E3%81%91%E5%A7%AB%29</segment>
- <idsubdatatable>874</idsubdatatable>
+ <idsubdatatable>923</idsubdatatable>
</row>
<row>
<segment>eventName==Search+query+here</segment>
- <idsubdatatable>876</idsubdatatable>
+ <idsubdatatable>925</idsubdatatable>
</row>
</result>
<result prettyDate="Monday, January 4, 2010" />
@@ -159,7 +159,7 @@
<result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
- <nb_visits>42</nb_visits>
- <nb_uniq_visitors>40</nb_uniq_visitors>
+ <nb_visits>43</nb_visits>
+ <nb_uniq_visitors>41</nb_uniq_visitors>
</reportTotal>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_day.xml
index 2539c55bb3..445b742211 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_day.xml
@@ -29,7 +29,7 @@
<max_time_generation>0.333</max_time_generation>
<entry_nb_uniq_visitors>2</entry_nb_uniq_visitors>
<entry_nb_visits>2</entry_nb_visits>
- <entry_nb_actions>30</entry_nb_actions>
+ <entry_nb_actions>31</entry_nb_actions>
<entry_sum_visit_length>7202</entry_sum_visit_length>
<entry_bounce_count>0</entry_bounce_count>
<avg_time_on_page>1499</avg_time_on_page>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml
index dfbc1b65a0..0b56a1fbd5 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Actions.getPageUrls_month.xml
@@ -27,7 +27,7 @@
<min_time_generation>0.333</min_time_generation>
<max_time_generation>0.333</max_time_generation>
<entry_nb_visits>2</entry_nb_visits>
- <entry_nb_actions>30</entry_nb_actions>
+ <entry_nb_actions>31</entry_nb_actions>
<entry_sum_visit_length>7202</entry_sum_visit_length>
<entry_bounce_count>0</entry_bounce_count>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml
index 67343d25f6..b1b81dbb1c 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_day.xml
@@ -364,4 +364,16 @@
<avg_event_value>0</avg_event_value>
<segment>eventAction==Purchase</segment>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventAction==This+is+an+event+without+a+URL</segment>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml
index 8f96e9b8f8..f60a44a673 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getAction_month.xml
@@ -364,4 +364,16 @@
<avg_event_value>0</avg_event_value>
<segment>eventAction==Purchase</segment>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventAction==This+is+an+event+without+a+URL</segment>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml
index 705ab95996..8b98dbd18e 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_day.xml
@@ -229,4 +229,29 @@
</row>
</subtable>
</row>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventCategory==CategoryTriggersGoal+here</segment>
+ <subtable>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ </subtable>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml
index 0ec9655add..ced40076d2 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getCategory_month.xml
@@ -229,4 +229,29 @@
</row>
</subtable>
</row>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventCategory==CategoryTriggersGoal+here</segment>
+ <subtable>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ </subtable>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml
index 84c1b47507..5a73ee71d2 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_day.xml
@@ -184,9 +184,9 @@
</row>
<row>
<label>Event Name not defined</label>
- <nb_uniq_visitors>4</nb_uniq_visitors>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_uniq_visitors>5</nb_uniq_visitors>
+ <nb_visits>7</nb_visits>
+ <nb_events>7</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
@@ -215,6 +215,17 @@
<max_event_value>0</max_event_value>
<avg_event_value>0</avg_event_value>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
</subtable>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml
index 141ccc652e..d0560a0023 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Events.getName_month.xml
@@ -184,13 +184,13 @@
</row>
<row>
<label>Event Name not defined</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>7</nb_visits>
+ <nb_events>7</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<subtable>
<row>
@@ -215,6 +215,17 @@
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ </row>
</subtable>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Goals.get_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Goals.get_day.xml
new file mode 100644
index 0000000000..40d1317d97
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Goals.get_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>0</revenue>
+ <conversion_rate>10%</conversion_rate>
+ <nb_conversions_new_visit>1</nb_conversions_new_visit>
+ <nb_visits_converted_new_visit>1</nb_visits_converted_new_visit>
+ <revenue_new_visit>0</revenue_new_visit>
+ <conversion_rate_new_visit>10%</conversion_rate_new_visit>
+ <nb_conversions_returning_visit>0</nb_conversions_returning_visit>
+ <nb_visits_converted_returning_visit>0</nb_visits_converted_returning_visit>
+ <revenue_returning_visit>0</revenue_returning_visit>
+ <conversion_rate_returning_visit>0%</conversion_rate_returning_visit>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml
index c2c4ac7f78..572b560a01 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml
@@ -9,9 +9,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>21</pageId>
+ <pageId>22</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Purchase</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -114,9 +114,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>20</pageId>
+ <pageId>21</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -219,9 +219,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>16</pageId>
+ <pageId>17</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play50%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -233,9 +233,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>17</pageId>
+ <pageId>18</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play75%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -247,9 +247,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>19</pageId>
+ <pageId>20</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<eventName>Search query here</eventName>
@@ -261,9 +261,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>22</pageId>
+ <pageId>23</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playEnd</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -277,7 +277,7 @@
<url />
<pageIdAction />
- <pageId>23</pageId>
+ <pageId>24</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>rating</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -290,9 +290,9 @@
<row>
<type>event</type>
<url>http://example.org/finishedMovie</url>
- <pageIdAction>25</pageIdAction>
+ <pageIdAction>27</pageIdAction>
- <pageId>24</pageId>
+ <pageId>25</pageId>
<eventCategory>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventCategory>
<eventAction>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventAction>
<eventName>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventName>
@@ -397,9 +397,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>18</pageId>
+ <pageId>19</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -500,6 +500,17 @@
<actionDetails>
<row>
+ <type>goal</type>
+ <goalName>triggered js</goalName>
+ <goalId>1</goalId>
+ <revenue>0</revenue>
+ <goalPageId>1</goalPageId>
+
+ <url>http://example.org/webradio</url>
+ <icon>plugins/Morpheus/images/goal.png</icon>
+
+ </row>
+ <row>
<type>action</type>
<url>http://example.org/webradio</url>
<pageTitle>Welcome!</pageTitle>
@@ -513,17 +524,6 @@
</row>
<row>
- <type>goal</type>
- <goalName>triggered js</goalName>
- <goalId>1</goalId>
- <revenue>0</revenue>
- <goalPageId>1</goalPageId>
-
- <url>http://example.org/webradio</url>
- <icon>plugins/Morpheus/images/goal.png</icon>
-
- </row>
- <row>
<type>event</type>
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
@@ -660,6 +660,30 @@
</customVariables>
<eventName>La fiancée de l'eau</eventName>
<eventValue>10</eventValue>
+ <timeSpent>0</timeSpent>
+ <timeSpentPretty>0s</timeSpentPretty>
+ <icon>plugins/Morpheus/images/event.png</icon>
+
+ </row>
+ <row>
+ <type>goal</type>
+ <goalName>event matching</goalName>
+ <goalId>3</goalId>
+ <revenue>0</revenue>
+ <goalPageId>9</goalPageId>
+
+ <url />
+ <icon>plugins/Morpheus/images/goal.png</icon>
+
+ </row>
+ <row>
+ <type>event</type>
+ <url />
+ <pageIdAction />
+
+ <pageId>9</pageId>
+ <eventCategory>CategoryTriggersGoal here</eventCategory>
+ <eventAction>This is an event without a URL</eventAction>
<timeSpent>1499</timeSpent>
<timeSpentPretty>24 min 59s</timeSpentPretty>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -669,9 +693,9 @@
<type>action</type>
<url>http://example.org/movies</url>
<pageTitle>Movie Theater</pageTitle>
- <pageIdAction>13</pageIdAction>
+ <pageIdAction>15</pageIdAction>
- <pageId>9</pageId>
+ <pageId>10</pageId>
<generationTime>0.67s</generationTime>
<timeSpent>60</timeSpent>
<timeSpentPretty>1 min 0s</timeSpentPretty>
@@ -681,9 +705,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>10</pageId>
+ <pageId>11</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Princess Mononoke (もののけ姫)</eventName>
@@ -695,9 +719,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>11</pageId>
+ <pageId>12</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Ponyo (崖の上のポニョ)</eventName>
@@ -709,9 +733,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>12</pageId>
+ <pageId>13</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -723,9 +747,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>13</pageId>
+ <pageId>14</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>clickBuyNow</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -737,9 +761,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>14</pageId>
+ <pageId>15</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playStart</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -751,9 +775,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>15</pageId>
+ <pageId>16</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play25%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -761,7 +785,7 @@
</row>
</actionDetails>
- <goalConversions>1</goalConversions>
+ <goalConversions>2</goalConversions>
<siteCurrency>USD</siteCurrency>
<siteCurrencySymbol>$</siteCurrencySymbol>
@@ -782,7 +806,7 @@
<visitDuration>3601</visitDuration>
<visitDurationPretty>1 hours 0 min</visitDurationPretty>
<searches>0</searches>
- <actions>15</actions>
+ <actions>16</actions>
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -809,7 +833,7 @@
<browserIcon>plugins/DevicesDetection/images/browsers/FF.gif</browserIcon>
<browserCode>FF</browserCode>
<browserVersion>3.6</browserVersion>
- <events>13</events>
+ <events>14</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
<country>France</country>
@@ -857,9 +881,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>45</pageId>
+ <pageId>46</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Purchase</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -958,9 +982,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>44</pageId>
+ <pageId>45</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -1059,9 +1083,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>40</pageId>
+ <pageId>41</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play50%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1073,9 +1097,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>41</pageId>
+ <pageId>42</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play75%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1087,9 +1111,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>43</pageId>
+ <pageId>44</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<eventName>Search query here</eventName>
@@ -1101,9 +1125,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>46</pageId>
+ <pageId>47</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playEnd</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1117,7 +1141,7 @@
<url />
<pageIdAction />
- <pageId>47</pageId>
+ <pageId>48</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>rating</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1130,9 +1154,9 @@
<row>
<type>event</type>
<url>http://example.org/finishedMovie</url>
- <pageIdAction>25</pageIdAction>
+ <pageIdAction>27</pageIdAction>
- <pageId>48</pageId>
+ <pageId>49</pageId>
<eventCategory>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventCategory>
<eventAction>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventAction>
<eventName>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventName>
@@ -1233,9 +1257,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>42</pageId>
+ <pageId>43</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -1337,7 +1361,7 @@
<pageTitle>Welcome!</pageTitle>
<pageIdAction>2</pageIdAction>
- <pageId>25</pageId>
+ <pageId>26</pageId>
<generationTime>0.33s</generationTime>
<timeSpent>60</timeSpent>
<timeSpentPretty>1 min 0s</timeSpentPretty>
@@ -1349,7 +1373,7 @@
<goalName>triggered js</goalName>
<goalId>1</goalId>
<revenue>0</revenue>
- <goalPageId>25</goalPageId>
+ <goalPageId>26</goalPageId>
<url>http://example.org/webradio</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -1360,7 +1384,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>26</pageId>
+ <pageId>27</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play</eventAction>
<customVariables>
@@ -1380,7 +1404,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>27</pageId>
+ <pageId>28</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play25%</eventAction>
<customVariables>
@@ -1400,7 +1424,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>28</pageId>
+ <pageId>29</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play50%</eventAction>
<customVariables>
@@ -1420,7 +1444,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>29</pageId>
+ <pageId>30</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play75%</eventAction>
<customVariables>
@@ -1440,7 +1464,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>30</pageId>
+ <pageId>31</pageId>
<eventCategory>Music</eventCategory>
<eventAction>playEnd</eventAction>
<customVariables>
@@ -1460,7 +1484,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>31</pageId>
+ <pageId>32</pageId>
<eventCategory>Music</eventCategory>
<eventAction>rating</eventAction>
<customVariables>
@@ -1481,7 +1505,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>32</pageId>
+ <pageId>33</pageId>
<eventCategory>Music</eventCategory>
<eventAction>rating</eventAction>
<customVariables>
@@ -1501,9 +1525,9 @@
<type>action</type>
<url>http://example.org/movies</url>
<pageTitle>Movie Theater</pageTitle>
- <pageIdAction>13</pageIdAction>
+ <pageIdAction>15</pageIdAction>
- <pageId>33</pageId>
+ <pageId>34</pageId>
<generationTime>0.67s</generationTime>
<timeSpent>60</timeSpent>
<timeSpentPretty>1 min 0s</timeSpentPretty>
@@ -1513,9 +1537,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>34</pageId>
+ <pageId>35</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Princess Mononoke (もののけ姫)</eventName>
@@ -1527,9 +1551,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>35</pageId>
+ <pageId>36</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Ponyo (崖の上のポニョ)</eventName>
@@ -1541,9 +1565,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>36</pageId>
+ <pageId>37</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1555,9 +1579,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>37</pageId>
+ <pageId>38</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>clickBuyNow</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1569,9 +1593,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>38</pageId>
+ <pageId>39</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playStart</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1583,9 +1607,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>39</pageId>
+ <pageId>40</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play25%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml
index c2c4ac7f78..572b560a01 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml
@@ -9,9 +9,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>21</pageId>
+ <pageId>22</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Purchase</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -114,9 +114,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>20</pageId>
+ <pageId>21</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -219,9 +219,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>16</pageId>
+ <pageId>17</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play50%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -233,9 +233,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>17</pageId>
+ <pageId>18</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play75%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -247,9 +247,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>19</pageId>
+ <pageId>20</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<eventName>Search query here</eventName>
@@ -261,9 +261,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>22</pageId>
+ <pageId>23</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playEnd</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -277,7 +277,7 @@
<url />
<pageIdAction />
- <pageId>23</pageId>
+ <pageId>24</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>rating</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -290,9 +290,9 @@
<row>
<type>event</type>
<url>http://example.org/finishedMovie</url>
- <pageIdAction>25</pageIdAction>
+ <pageIdAction>27</pageIdAction>
- <pageId>24</pageId>
+ <pageId>25</pageId>
<eventCategory>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventCategory>
<eventAction>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventAction>
<eventName>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventName>
@@ -397,9 +397,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>18</pageId>
+ <pageId>19</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -500,6 +500,17 @@
<actionDetails>
<row>
+ <type>goal</type>
+ <goalName>triggered js</goalName>
+ <goalId>1</goalId>
+ <revenue>0</revenue>
+ <goalPageId>1</goalPageId>
+
+ <url>http://example.org/webradio</url>
+ <icon>plugins/Morpheus/images/goal.png</icon>
+
+ </row>
+ <row>
<type>action</type>
<url>http://example.org/webradio</url>
<pageTitle>Welcome!</pageTitle>
@@ -513,17 +524,6 @@
</row>
<row>
- <type>goal</type>
- <goalName>triggered js</goalName>
- <goalId>1</goalId>
- <revenue>0</revenue>
- <goalPageId>1</goalPageId>
-
- <url>http://example.org/webradio</url>
- <icon>plugins/Morpheus/images/goal.png</icon>
-
- </row>
- <row>
<type>event</type>
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
@@ -660,6 +660,30 @@
</customVariables>
<eventName>La fiancée de l'eau</eventName>
<eventValue>10</eventValue>
+ <timeSpent>0</timeSpent>
+ <timeSpentPretty>0s</timeSpentPretty>
+ <icon>plugins/Morpheus/images/event.png</icon>
+
+ </row>
+ <row>
+ <type>goal</type>
+ <goalName>event matching</goalName>
+ <goalId>3</goalId>
+ <revenue>0</revenue>
+ <goalPageId>9</goalPageId>
+
+ <url />
+ <icon>plugins/Morpheus/images/goal.png</icon>
+
+ </row>
+ <row>
+ <type>event</type>
+ <url />
+ <pageIdAction />
+
+ <pageId>9</pageId>
+ <eventCategory>CategoryTriggersGoal here</eventCategory>
+ <eventAction>This is an event without a URL</eventAction>
<timeSpent>1499</timeSpent>
<timeSpentPretty>24 min 59s</timeSpentPretty>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -669,9 +693,9 @@
<type>action</type>
<url>http://example.org/movies</url>
<pageTitle>Movie Theater</pageTitle>
- <pageIdAction>13</pageIdAction>
+ <pageIdAction>15</pageIdAction>
- <pageId>9</pageId>
+ <pageId>10</pageId>
<generationTime>0.67s</generationTime>
<timeSpent>60</timeSpent>
<timeSpentPretty>1 min 0s</timeSpentPretty>
@@ -681,9 +705,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>10</pageId>
+ <pageId>11</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Princess Mononoke (もののけ姫)</eventName>
@@ -695,9 +719,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>11</pageId>
+ <pageId>12</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Ponyo (崖の上のポニョ)</eventName>
@@ -709,9 +733,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>12</pageId>
+ <pageId>13</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -723,9 +747,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>13</pageId>
+ <pageId>14</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>clickBuyNow</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -737,9 +761,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>14</pageId>
+ <pageId>15</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playStart</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -751,9 +775,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>15</pageId>
+ <pageId>16</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play25%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -761,7 +785,7 @@
</row>
</actionDetails>
- <goalConversions>1</goalConversions>
+ <goalConversions>2</goalConversions>
<siteCurrency>USD</siteCurrency>
<siteCurrencySymbol>$</siteCurrencySymbol>
@@ -782,7 +806,7 @@
<visitDuration>3601</visitDuration>
<visitDurationPretty>1 hours 0 min</visitDurationPretty>
<searches>0</searches>
- <actions>15</actions>
+ <actions>16</actions>
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -809,7 +833,7 @@
<browserIcon>plugins/DevicesDetection/images/browsers/FF.gif</browserIcon>
<browserCode>FF</browserCode>
<browserVersion>3.6</browserVersion>
- <events>13</events>
+ <events>14</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
<country>France</country>
@@ -857,9 +881,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>45</pageId>
+ <pageId>46</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Purchase</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -958,9 +982,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>44</pageId>
+ <pageId>45</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -1059,9 +1083,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>40</pageId>
+ <pageId>41</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play50%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1073,9 +1097,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>41</pageId>
+ <pageId>42</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play75%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1087,9 +1111,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>43</pageId>
+ <pageId>44</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<eventName>Search query here</eventName>
@@ -1101,9 +1125,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>46</pageId>
+ <pageId>47</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playEnd</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1117,7 +1141,7 @@
<url />
<pageIdAction />
- <pageId>47</pageId>
+ <pageId>48</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>rating</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1130,9 +1154,9 @@
<row>
<type>event</type>
<url>http://example.org/finishedMovie</url>
- <pageIdAction>25</pageIdAction>
+ <pageIdAction>27</pageIdAction>
- <pageId>48</pageId>
+ <pageId>49</pageId>
<eventCategory>event category Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventCategory>
<eventAction>event action Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventAction>
<eventName>event name Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long Extremely long ---&gt; SHOULD APPEAR IN TEST OUTPUT NOT TRUNCATED &lt;---</eventName>
@@ -1233,9 +1257,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>42</pageId>
+ <pageId>43</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>Search</eventAction>
<icon>plugins/Morpheus/images/event.png</icon>
@@ -1337,7 +1361,7 @@
<pageTitle>Welcome!</pageTitle>
<pageIdAction>2</pageIdAction>
- <pageId>25</pageId>
+ <pageId>26</pageId>
<generationTime>0.33s</generationTime>
<timeSpent>60</timeSpent>
<timeSpentPretty>1 min 0s</timeSpentPretty>
@@ -1349,7 +1373,7 @@
<goalName>triggered js</goalName>
<goalId>1</goalId>
<revenue>0</revenue>
- <goalPageId>25</goalPageId>
+ <goalPageId>26</goalPageId>
<url>http://example.org/webradio</url>
<icon>plugins/Morpheus/images/goal.png</icon>
@@ -1360,7 +1384,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>26</pageId>
+ <pageId>27</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play</eventAction>
<customVariables>
@@ -1380,7 +1404,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>27</pageId>
+ <pageId>28</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play25%</eventAction>
<customVariables>
@@ -1400,7 +1424,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>28</pageId>
+ <pageId>29</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play50%</eventAction>
<customVariables>
@@ -1420,7 +1444,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>29</pageId>
+ <pageId>30</pageId>
<eventCategory>Music</eventCategory>
<eventAction>play75%</eventAction>
<customVariables>
@@ -1440,7 +1464,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>30</pageId>
+ <pageId>31</pageId>
<eventCategory>Music</eventCategory>
<eventAction>playEnd</eventAction>
<customVariables>
@@ -1460,7 +1484,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>31</pageId>
+ <pageId>32</pageId>
<eventCategory>Music</eventCategory>
<eventAction>rating</eventAction>
<customVariables>
@@ -1481,7 +1505,7 @@
<url>http://example.org/webradio</url>
<pageIdAction>3</pageIdAction>
- <pageId>32</pageId>
+ <pageId>33</pageId>
<eventCategory>Music</eventCategory>
<eventAction>rating</eventAction>
<customVariables>
@@ -1501,9 +1525,9 @@
<type>action</type>
<url>http://example.org/movies</url>
<pageTitle>Movie Theater</pageTitle>
- <pageIdAction>13</pageIdAction>
+ <pageIdAction>15</pageIdAction>
- <pageId>33</pageId>
+ <pageId>34</pageId>
<generationTime>0.67s</generationTime>
<timeSpent>60</timeSpent>
<timeSpentPretty>1 min 0s</timeSpentPretty>
@@ -1513,9 +1537,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>34</pageId>
+ <pageId>35</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Princess Mononoke (もののけ姫)</eventName>
@@ -1527,9 +1551,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>35</pageId>
+ <pageId>36</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Ponyo (崖の上のポニョ)</eventName>
@@ -1541,9 +1565,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>36</pageId>
+ <pageId>37</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playTrailer</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1555,9 +1579,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>37</pageId>
+ <pageId>38</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>clickBuyNow</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1569,9 +1593,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>38</pageId>
+ <pageId>39</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>playStart</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
@@ -1583,9 +1607,9 @@
<row>
<type>event</type>
<url>http://example.org/movies</url>
- <pageIdAction>14</pageIdAction>
+ <pageIdAction>16</pageIdAction>
- <pageId>39</pageId>
+ <pageId>40</pageId>
<eventCategory>Movie</eventCategory>
<eventAction>play25%</eventAction>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml
index 705ab95996..8b98dbd18e 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_day.xml
@@ -229,4 +229,29 @@
</row>
</subtable>
</row>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventCategory==CategoryTriggersGoal+here</segment>
+ <subtable>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ </subtable>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml
index 0ec9655add..ced40076d2 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getCategory_month.xml
@@ -229,4 +229,29 @@
</row>
</subtable>
</row>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventCategory==CategoryTriggersGoal+here</segment>
+ <subtable>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ </subtable>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml
index 84c1b47507..5a73ee71d2 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_day.xml
@@ -184,9 +184,9 @@
</row>
<row>
<label>Event Name not defined</label>
- <nb_uniq_visitors>4</nb_uniq_visitors>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_uniq_visitors>5</nb_uniq_visitors>
+ <nb_visits>7</nb_visits>
+ <nb_events>7</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
@@ -215,6 +215,17 @@
<max_event_value>0</max_event_value>
<avg_event_value>0</avg_event_value>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
</subtable>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml
index 141ccc652e..d0560a0023 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventAction__Events.getName_month.xml
@@ -184,13 +184,13 @@
</row>
<row>
<label>Event Name not defined</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>7</nb_visits>
+ <nb_events>7</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<subtable>
<row>
@@ -215,6 +215,17 @@
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ </row>
</subtable>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml
index 31da89e717..5270d12b50 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_day.xml
@@ -355,4 +355,29 @@
</row>
</subtable>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventAction==This+is+an+event+without+a+URL</segment>
+ <subtable>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ </subtable>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml
index f695f351a1..8503a4dc17 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getAction_month.xml
@@ -355,4 +355,29 @@
</row>
</subtable>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventAction==This+is+an+event+without+a+URL</segment>
+ <subtable>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ </row>
+ </subtable>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml
index 194453a8db..47862d59be 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_day.xml
@@ -52,9 +52,9 @@
</row>
<row>
<label>Event Name not defined</label>
- <nb_uniq_visitors>4</nb_uniq_visitors>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_uniq_visitors>5</nb_uniq_visitors>
+ <nb_visits>7</nb_visits>
+ <nb_events>7</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
@@ -72,6 +72,17 @@
<max_event_value>0</max_event_value>
<avg_event_value>0</avg_event_value>
</row>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ </row>
</subtable>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml
index e27153830c..ceeee487c1 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventCategory__Events.getName_month.xml
@@ -52,13 +52,13 @@
</row>
<row>
<label>Event Name not defined</label>
- <nb_visits>6</nb_visits>
- <nb_events>6</nb_events>
+ <nb_visits>7</nb_visits>
+ <nb_events>7</nb_events>
<nb_events_with_value>0</nb_events_with_value>
<sum_event_value>0</sum_event_value>
<min_event_value>0</min_event_value>
<max_event_value>0</max_event_value>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
<subtable>
<row>
@@ -72,6 +72,17 @@
<sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
<avg_event_value>0</avg_event_value>
</row>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ </row>
</subtable>
</row>
<row>
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml
index 67343d25f6..b1b81dbb1c 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_day.xml
@@ -364,4 +364,16 @@
<avg_event_value>0</avg_event_value>
<segment>eventAction==Purchase</segment>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventAction==This+is+an+event+without+a+URL</segment>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml
index 8f96e9b8f8..f60a44a673 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getAction_month.xml
@@ -364,4 +364,16 @@
<avg_event_value>0</avg_event_value>
<segment>eventAction==Purchase</segment>
</row>
+ <row>
+ <label>This is an event without a URL</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventAction==This+is+an+event+without+a+URL</segment>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml
index ab1e9a0af0..01bb3a24a3 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_day.xml
@@ -108,4 +108,16 @@
</row>
</subtable>
</row>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventCategory==CategoryTriggersGoal+here</segment>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml
index 2e1a51f476..5f3a8a5f0c 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents_secondaryDimensionIsEventName__Events.getCategory_month.xml
@@ -108,4 +108,16 @@
</row>
</subtable>
</row>
+ <row>
+ <label>CategoryTriggersGoal here</label>
+ <nb_visits>1</nb_visits>
+ <nb_events>1</nb_events>
+ <nb_events_with_value>0</nb_events_with_value>
+ <sum_event_value>0</sum_event_value>
+ <min_event_value>0</min_event_value>
+ <max_event_value>0</max_event_value>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <avg_event_value>0</avg_event_value>
+ <segment>eventCategory==CategoryTriggersGoal+here</segment>
+ </row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserId.getUsers_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserId.getUsers_month.xml
new file mode 100644
index 0000000000..5ae68e2624
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserId.getUsers_month.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>commonuser</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <max_actions>1</max_actions>
+ <sum_visit_length>0</sum_visit_length>
+ <bounce_count>1</bounce_count>
+ <nb_visits_converted>1</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>1</sum_daily_nb_users>
+ <idvisitor>c7a1daa770a8e43a</idvisitor>
+ </row>
+ <row>
+ <label>user1</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>3</nb_actions>
+ <max_actions>3</max_actions>
+ <sum_visit_length>2</sum_visit_length>
+ <bounce_count>0</bounce_count>
+ <nb_visits_converted>1</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>1</sum_daily_nb_users>
+ <idvisitor>b3daa77b4c04a955</idvisitor>
+ </row>
+ <row>
+ <label>user2</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>2</nb_actions>
+ <max_actions>2</max_actions>
+ <sum_visit_length>1</sum_visit_length>
+ <bounce_count>0</bounce_count>
+ <nb_visits_converted>1</nb_visits_converted>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <sum_daily_nb_users>1</sum_daily_nb_users>
+ <idvisitor>c515c2f2350e7b1a</idvisitor>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_sortByProcessedMetric__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_sortByProcessedMetric__API.getProcessedReport_day.xml
index a2dc2171b4..8da6f23bc6 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_sortByProcessedMetric__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_sortByProcessedMetric__API.getProcessedReport_day.xml
@@ -61,11 +61,11 @@
<reportMetadata>
<row>
- <idsubdatatable>2712</idsubdatatable>
+ <idsubdatatable>2746</idsubdatatable>
</row>
<row>
- <idsubdatatable>2711</idsubdatatable>
+ <idsubdatatable>2745</idsubdatatable>
</row>
</reportMetadata>
<reportTotal>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserId.getUsers_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserId.getUsers_day.xml
new file mode 100644
index 0000000000..c234bed59e
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserId.getUsers_day.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result /> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_hideColumns___API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_hideColumns___API.getProcessedReport_day.xml
index 57b073b46b..0832775d9d 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_hideColumns___API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_hideColumns___API.getProcessedReport_day.xml
@@ -58,7 +58,7 @@
<reportMetadata>
<row>
- <idsubdatatable>5121</idsubdatatable>
+ <idsubdatatable>5149</idsubdatatable>
</row>
</reportMetadata>
<reportTotal>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_showColumns___API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_showColumns___API.getProcessedReport_day.xml
index 7274d6e75a..e25c8e2282 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_showColumns___API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_showColumns___API.getProcessedReport_day.xml
@@ -67,7 +67,7 @@
<reportMetadata>
<row>
- <idsubdatatable>5125</idsubdatatable>
+ <idsubdatatable>5153</idsubdatatable>
</row>
</reportMetadata>
<reportTotal>
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_day.xml
index bd42dba25a..b9567cea41 100644
--- a/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_day.xml
@@ -120,7 +120,7 @@
</slots>
<segment>customVariableName==_pk_scount</segment>
- <idsubdatatable>3173</idsubdatatable>
+ <idsubdatatable>3205</idsubdatatable>
</row>
<row>
<slots>
@@ -131,7 +131,7 @@
</slots>
<segment>customVariableName==_pk_scat</segment>
- <idsubdatatable>3172</idsubdatatable>
+ <idsubdatatable>3204</idsubdatatable>
</row>
</result>
<result prettyDate="Monday, January 4, 2010">
@@ -144,7 +144,7 @@
</slots>
<segment>customVariableName==_pk_scount</segment>
- <idsubdatatable>3176</idsubdatatable>
+ <idsubdatatable>3208</idsubdatatable>
</row>
<row>
<slots>
@@ -155,7 +155,7 @@
</slots>
<segment>customVariableName==_pk_scat</segment>
- <idsubdatatable>3175</idsubdatatable>
+ <idsubdatatable>3207</idsubdatatable>
</row>
</result>
<result prettyDate="Tuesday, January 5, 2010" />
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_month.xml b/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_month.xml
index 4d86dedf9b..5ba222e978 100644
--- a/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_month.xml
+++ b/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_month.xml
@@ -89,7 +89,7 @@
</slots>
<segment>customVariableName==_pk_scount</segment>
- <idsubdatatable>3198</idsubdatatable>
+ <idsubdatatable>3230</idsubdatatable>
</row>
<row>
<slots>
@@ -100,7 +100,7 @@
</slots>
<segment>customVariableName==_pk_scat</segment>
- <idsubdatatable>3197</idsubdatatable>
+ <idsubdatatable>3229</idsubdatatable>
</row>
</result>
<result prettyDate="February 2010" />
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Actions.getPageTitles_firstSite_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Actions.getPageTitles_firstSite_lastN__API.getProcessedReport_day.xml
index 3391cb2597..7ae4526b49 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Actions.getPageTitles_firstSite_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Actions.getPageTitles_firstSite_lastN__API.getProcessedReport_day.xml
@@ -184,51 +184,51 @@
<result prettyDate="Tuesday, January 5, 2010">
<row>
- <idsubdatatable>1956</idsubdatatable>
+ <idsubdatatable>1990</idsubdatatable>
</row>
<row>
- <idsubdatatable>1955</idsubdatatable>
+ <idsubdatatable>1989</idsubdatatable>
</row>
</result>
<result prettyDate="Wednesday, January 6, 2010">
<row>
- <idsubdatatable>1960</idsubdatatable>
+ <idsubdatatable>1994</idsubdatatable>
</row>
<row>
- <idsubdatatable>1959</idsubdatatable>
+ <idsubdatatable>1993</idsubdatatable>
</row>
</result>
<result prettyDate="Thursday, January 7, 2010">
<row>
- <idsubdatatable>1964</idsubdatatable>
+ <idsubdatatable>1998</idsubdatatable>
</row>
<row>
- <idsubdatatable>1963</idsubdatatable>
+ <idsubdatatable>1997</idsubdatatable>
</row>
</result>
<result prettyDate="Friday, January 8, 2010">
<row>
- <idsubdatatable>1968</idsubdatatable>
+ <idsubdatatable>2002</idsubdatatable>
</row>
<row>
- <idsubdatatable>1967</idsubdatatable>
+ <idsubdatatable>2001</idsubdatatable>
</row>
</result>
<result prettyDate="Saturday, January 9, 2010">
<row>
- <idsubdatatable>1972</idsubdatatable>
+ <idsubdatatable>2006</idsubdatatable>
</row>
<row>
- <idsubdatatable>1971</idsubdatatable>
+ <idsubdatatable>2005</idsubdatatable>
</row>
</result>
</reportMetadata>
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Referrers.getWebsites_firstSite_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Referrers.getWebsites_firstSite_lastN__API.getProcessedReport_day.xml
index 50478b59fc..b2a9849fa7 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Referrers.getWebsites_firstSite_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_Referrers.getWebsites_firstSite_lastN__API.getProcessedReport_day.xml
@@ -116,14 +116,14 @@
<row>
<segment>referrerName==referrer.com</segment>
- <idsubdatatable>1907</idsubdatatable>
+ <idsubdatatable>1941</idsubdatatable>
</row>
</result>
<result prettyDate="Monday, January 4, 2010">
<row>
<segment>referrerName==referrer.com</segment>
- <idsubdatatable>1909</idsubdatatable>
+ <idsubdatatable>1943</idsubdatatable>
</row>
</result>
<result prettyDate="Tuesday, January 5, 2010" />
@@ -133,14 +133,14 @@
<row>
<segment>referrerName==referrer.com</segment>
- <idsubdatatable>1914</idsubdatatable>
+ <idsubdatatable>1948</idsubdatatable>
</row>
</result>
<result prettyDate="Saturday, January 9, 2010">
<row>
<segment>referrerName==referrer.com</segment>
- <idsubdatatable>1916</idsubdatatable>
+ <idsubdatatable>1950</idsubdatatable>
</row>
</result>
</reportMetadata>
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv
index d08c01fa52..137e38b598 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_csv__ScheduledReports.generateReport_month.original.csv
@@ -7,6 +7,9 @@ Visits Summary
nb_uniq_visitors,nb_visits,nb_actions,max_actions,nb_actions_per_visit,avg_time_on_site,bounce_rate
2,11,43,5,3.9,00:10:55,27%
+Users
+No data available
+
Custom Variables
No data available
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html
index 52069c075a..dc8860833a 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html
@@ -31,6 +31,11 @@
</a>
</li>
<li>
+ <a href="#UserId_getUsers" style="text-decoration:none; color: rgb(13,13,13);">
+ Users
+ </a>
+ </li>
+ <li>
<a href="#CustomVariables_getCustomVariables" style="text-decoration:none; color: rgb(13,13,13);">
Custom Variables
</a>
@@ -496,6 +501,11 @@
<a style="text-decoration:none; color: rgb(13,13,13); font-size: 9pt;" href="#reportTop">
Back to top
</a>
+<h2 id="UserId_getUsers" style="color: rgb(13,13,13); font-size: 24pt; font-weight:normal;">
+ Users
+</h2>
+
+ There is no data for this report.
<h2 id="CustomVariables_getCustomVariables" style="color: rgb(13,13,13); font-size: 24pt; font-weight:normal;">
Custom Variables
</h2>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
index 9634ff726a..5bca6ae875 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
@@ -2350,6 +2350,35 @@
<uniqueId>ExampleUI_getPlanetRatiosWithLogos</uniqueId>
</row>
<row>
+ <name>Users</name>
+ <module>UserId</module>
+ <action>getUsers</action>
+ <dimension>UserId</dimension>
+ <metrics>
+ <label>Label</label>
+ <nb_visits>Visits</nb_visits>
+ <nb_actions>Actions</nb_actions>
+ <nb_visits_converted>Visits with Conversions</nb_visits_converted>
+ </metrics>
+ <metricsDocumentation>
+ <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+ <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+ <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+ <avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+ <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+ <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+ </metricsDocumentation>
+ <processedMetrics>
+ <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+ <avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+ <bounce_rate>Bounce Rate</bounce_rate>
+ <conversion_rate>Conversion Rate</conversion_rate>
+ </processedMetrics>
+ <imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=UserId&amp;apiAction=getUsers&amp;period=day&amp;date=2009-01-04</imageGraphUrl>
+ <imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=UserId&amp;apiAction=getUsers&amp;period=day&amp;date=2008-12-06,2009-01-04</imageGraphEvolutionUrl>
+ <uniqueId>UserId_getUsers</uniqueId>
+ </row>
+ <row>
<category>API</category>
<name>Main metrics</name>
<module>API</module>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml
index 8c6340eebb..aaae0ff362 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml
@@ -142,7 +142,7 @@
<category>Visit</category>
<name>Device brand</name>
<segment>deviceBrand</segment>
- <acceptedValues>3Q, Acer, Ainol, Airness, Alcatel, Allview, Altech UEC, Arnova, Amazon, Amoi, Apple, Archos, ARRIS, Airties, Asus, Avvio, Audiovox, Axxion, BBK, Becker, Bird, Beetel, Bmobile, Barnes &amp; Noble, BangOlufsen, BenQ, BenQ-Siemens, Blu, Boway, bq, Brondi, Bush, CUBOT, Carrefour, Captiva, Casio, Cat, Celkon, ConCorde, Changhong, Cherry Mobile, Cricket, Crosscall, Compal, CnM, Crius Mea, CreNova, Capitel, Compaq, Coolpad, Cowon, Cube, Coby Kyros, Danew, Datang, Denver, Desay, Dbtel, DoCoMo, Dicam, Dell, DNS, DMM, Doogee, Doov, Dopod, Dune HD, E-Boda, EBEST, Ericsson, ECS, Ezio, Elephone, Easypix, Energy Sistem, Ericy, Eton, eTouch, Evertek, Ezze, Fairphone, Fly, Foxconn, Fujitsu, Garmin-Asus, Gateway, Gemini, Gionee, Gigabyte, Gigaset, GOCLEVER, Goly, Google, Gradiente, Grundig, Haier, Hasee, Hisense, Hi-Level, Hosin, HP, HTC, Huawei, Humax, Hyrican, Hyundai, Ikea, iBall, i-Joy, iBerry, iKoMo, i-mate, iOcean, iNew, Infinix, Innostream, Inkti, Intex, i-mobile, INQ, Intek, Inverto, iTel, Jiayu, Jolla, Karbonn, KDDI, Kingsun, Konka, Komu, Koobee, K-Touch, KT-Tech, KOPO, Koridy, Kumai, Kyocera, Kazam, Lava, Lanix, LCT, Lenovo, Lenco, Le Pan, LG, Lingwin, Loewe, Logicom, Lexibook, Majestic, Manta Multimedia, Mobistel, Mecer, Medion, MEEG, Meizu, Metz, MEU, MicroMax, Mediacom, MediaTek, Mio, Mpman, Mofut, Motorola, Microsoft, MSI, Memup, Mitsubishi, MLLED, M.T.T., MyPhone, NEC, Netgear, NGM, Nintendo, Noain, Nokia, Nomi, Nikon, Newgen, Nexian, NextBook, Onda, OnePlus, OPPO, Orange, O2, Ouki, OUYA, Opsson, Panasonic, PEAQ, Philips, Pioneer, Polaroid, Palm, phoneOne, Pantech, Ployer, Point of View, PolyPad, Pomp, Positivo, Prestigio, ProScan, PULID, Qilive, Qtek, QMobile, Quechua, Overmax, Oysters, Ramos, RCA Tablets, Readboy, Rikomagic, RIM, Roku, Rover, Samsung, Sega, Sony Ericsson, Sencor, Softbank, SFR, Sagem, Sharp, Siemens, Sendo, Skyworth, Smartfren, Sony, Spice, SuperSonic, Selevision, Sanyo, Symphony, Smart, Star, Storex, Stonex, SunVan, Sumvision, Tesla, TCL, Telit, ThL, TiPhone, Tecno Mobile, Tesco, TIANYU, Telefunken, Telenor, T-Mobile, Thomson, Tolino, Toplux, Toshiba, TechnoTrend, Trevi, Tunisie Telecom, Turbo-X, TVC, TechniSat, teXet, Unowhy, Uniscope, UTStarcom, Vastking, Videocon, Vertu, Vitelcom, VK Mobile, ViewSonic, Vestel, Vivo, Voto, Voxtel, Vodafone, Vizio, Videoweb, Walton, WellcoM, Wexler, Wiko, Wolder, Wonu, Woxter, Xiaomi, Xolo, Yarvik, Yuandao, Yusun, Ytone, Zeemi, Zonda, Zopo, ZTE, Web TV, Unknown</acceptedValues>
+ <acceptedValues>3Q, Acer, Ainol, Airness, Alcatel, Allview, Altech UEC, Arnova, Amazon, Amoi, Apple, Archos, ARRIS, Airties, Asus, Avvio, Audiovox, Axxion, BBK, Becker, Bird, Beetel, Bmobile, Barnes &amp; Noble, BangOlufsen, BenQ, BenQ-Siemens, Blu, Boway, bq, Brondi, Bush, CUBOT, Carrefour, Captiva, Casio, Cat, Celkon, ConCorde, Changhong, Cherry Mobile, Cricket, Crosscall, Compal, CnM, Crius Mea, CreNova, Capitel, Compaq, Coolpad, Cowon, Cube, Coby Kyros, Danew, Datang, Denver, Desay, Dbtel, DoCoMo, Dicam, Dell, DNS, DMM, Doogee, Doov, Dopod, Dune HD, E-Boda, EBEST, Ericsson, ECS, Ezio, Elephone, Easypix, Energy Sistem, Ericy, Eton, eTouch, Evertek, Explay, Ezze, Fairphone, Fly, Foxconn, Fujitsu, Garmin-Asus, Gateway, Gemini, Gionee, Gigabyte, Gigaset, GOCLEVER, Goly, Google, Gradiente, Grundig, Haier, Hasee, Hisense, Hi-Level, Hosin, HP, HTC, Huawei, Humax, Hyrican, Hyundai, Ikea, iBall, i-Joy, iBerry, iKoMo, i-mate, iOcean, iNew, Infinix, Innostream, Inkti, Intex, i-mobile, INQ, Intek, Inverto, iTel, Jiayu, Jolla, Karbonn, KDDI, Kingsun, Konka, Komu, Koobee, K-Touch, KT-Tech, KOPO, Koridy, Kumai, Kyocera, Kazam, Lava, Lanix, LCT, Lenovo, Lenco, Le Pan, LG, Lingwin, Loewe, Logicom, Lexibook, Majestic, Manta Multimedia, Mobistel, Mecer, Medion, MEEG, Meizu, Metz, MEU, MicroMax, Mediacom, MediaTek, Mio, Mpman, Mofut, Motorola, Microsoft, MSI, Memup, Mitsubishi, MLLED, M.T.T., MyPhone, NEC, Netgear, NGM, Nintendo, Noain, Nokia, Nomi, Nikon, Newgen, Nexian, NextBook, Onda, OnePlus, OPPO, Orange, O2, Ouki, OUYA, Opsson, Panasonic, PEAQ, Philips, Pioneer, Polaroid, Palm, phoneOne, Pantech, Ployer, Point of View, PolyPad, Pomp, Positivo, Prestigio, ProScan, PULID, Qilive, Qtek, QMobile, Quechua, Overmax, Oysters, Ramos, RCA Tablets, Readboy, Rikomagic, RIM, Roku, Rover, Samsung, Sega, Sony Ericsson, Sencor, Softbank, SFR, Sagem, Sharp, Siemens, Sendo, Skyworth, Smartfren, Sony, Spice, SuperSonic, Selevision, Sanyo, Symphony, Smart, Star, Storex, Stonex, SunVan, Sumvision, Tesla, TCL, Telit, ThL, TiPhone, Tecno Mobile, Tesco, TIANYU, Telefunken, Telenor, T-Mobile, Thomson, Tolino, Toplux, Toshiba, TechnoTrend, Trevi, Tunisie Telecom, Turbo-X, TVC, TechniSat, teXet, Unowhy, Uniscope, UTStarcom, Vastking, Videocon, Vertu, Vitelcom, VK Mobile, ViewSonic, Vestel, Vivo, Voto, Voxtel, Vodafone, Vizio, Videoweb, Walton, WellcoM, Wexler, Wiko, Wolder, Wonu, Woxter, Xiaomi, Xolo, Yarvik, Yuandao, Yusun, Ytone, Zeemi, Zonda, Zopo, ZTE, Web TV, Unknown</acceptedValues>
</row>
<row>
<type>dimension</type>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml
index ead3c57fb7..14f8e614de 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml
@@ -334,7 +334,7 @@
<isReport>1</isReport>
</row>
<row>
- <name>Browser engines</name>
+ <name>Operating System families</name>
<category>
<id>General_Visitors</id>
<name>Visitors</name>
@@ -347,14 +347,14 @@
<order>20</order>
</subcategory>
<module>DevicesDetection</module>
- <action>getBrowserEngines</action>
- <order>110</order>
+ <action>getOsFamilies</action>
+ <order>108</order>
<parameters>
<module>DevicesDetection</module>
- <action>getBrowserEngines</action>
+ <action>getOsFamilies</action>
</parameters>
- <uniqueId>widgetDevicesDetectiongetBrowserEngines</uniqueId>
- <viewDataTable>graphPie</viewDataTable>
+ <uniqueId>widgetDevicesDetectiongetOsFamilies</uniqueId>
+ <viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
@@ -433,7 +433,7 @@
</widgets>
</row>
<row>
- <name>Browser Plugins</name>
+ <name>Browser engines</name>
<category>
<id>General_Visitors</id>
<name>Visitors</name>
@@ -445,19 +445,19 @@
<name>Software</name>
<order>20</order>
</subcategory>
- <module>DevicePlugins</module>
- <action>getPlugin</action>
- <order>113</order>
+ <module>DevicesDetection</module>
+ <action>getBrowserEngines</action>
+ <order>110</order>
<parameters>
- <module>DevicePlugins</module>
- <action>getPlugin</action>
+ <module>DevicesDetection</module>
+ <action>getBrowserEngines</action>
</parameters>
- <uniqueId>widgetDevicePluginsgetPlugin</uniqueId>
- <viewDataTable>table</viewDataTable>
+ <uniqueId>widgetDevicesDetectiongetBrowserEngines</uniqueId>
+ <viewDataTable>graphPie</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Operating System families</name>
+ <name>Browser Plugins</name>
<category>
<id>General_Visitors</id>
<name>Visitors</name>
@@ -469,14 +469,14 @@
<name>Software</name>
<order>20</order>
</subcategory>
- <module>DevicesDetection</module>
- <action>getOsFamilies</action>
- <order>108</order>
+ <module>DevicePlugins</module>
+ <action>getPlugin</action>
+ <order>113</order>
<parameters>
- <module>DevicesDetection</module>
- <action>getOsFamilies</action>
+ <module>DevicePlugins</module>
+ <action>getPlugin</action>
</parameters>
- <uniqueId>widgetDevicesDetectiongetOsFamilies</uniqueId>
+ <uniqueId>widgetDevicePluginsgetPlugin</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -553,7 +553,7 @@
<isReport>1</isReport>
</row>
<row>
- <name>Continent</name>
+ <name>Visitor Map</name>
<category>
<id>General_Visitors</id>
<name>Visitors</name>
@@ -565,19 +565,17 @@
<name>Locations</name>
<order>25</order>
</subcategory>
- <module>UserCountry</module>
- <action>getContinent</action>
- <order>106</order>
+ <module>UserCountryMap</module>
+ <action>visitorMap</action>
+ <order>1</order>
<parameters>
- <module>UserCountry</module>
- <action>getContinent</action>
+ <module>UserCountryMap</module>
+ <action>visitorMap</action>
</parameters>
- <uniqueId>widgetUserCountrygetContinent</uniqueId>
- <viewDataTable>table</viewDataTable>
- <isReport>1</isReport>
+ <uniqueId>widgetUserCountryMapvisitorMap</uniqueId>
</row>
<row>
- <name>Visitor Map</name>
+ <name>Continent</name>
<category>
<id>General_Visitors</id>
<name>Visitors</name>
@@ -589,14 +587,16 @@
<name>Locations</name>
<order>25</order>
</subcategory>
- <module>UserCountryMap</module>
- <action>visitorMap</action>
- <order>1</order>
+ <module>UserCountry</module>
+ <action>getContinent</action>
+ <order>106</order>
<parameters>
- <module>UserCountryMap</module>
- <action>visitorMap</action>
+ <module>UserCountry</module>
+ <action>getContinent</action>
</parameters>
- <uniqueId>widgetUserCountryMapvisitorMap</uniqueId>
+ <uniqueId>widgetUserCountrygetContinent</uniqueId>
+ <viewDataTable>table</viewDataTable>
+ <isReport>1</isReport>
</row>
<row>
<name>Country</name>
@@ -723,7 +723,7 @@
<isReport>1</isReport>
</row>
<row>
- <name>Visits per number of pages</name>
+ <name>Visits per visit duration</name>
<category>
<id>General_Visitors</id>
<name>Visitors</name>
@@ -736,41 +736,17 @@
<order>30</order>
</subcategory>
<module>VisitorInterest</module>
- <action>getNumberOfVisitsPerPage</action>
- <order>120</order>
+ <action>getNumberOfVisitsPerVisitDuration</action>
+ <order>115</order>
<parameters>
<module>VisitorInterest</module>
- <action>getNumberOfVisitsPerPage</action>
+ <action>getNumberOfVisitsPerVisitDuration</action>
</parameters>
- <uniqueId>widgetVisitorInterestgetNumberOfVisitsPerPage</uniqueId>
+ <uniqueId>widgetVisitorInterestgetNumberOfVisitsPerVisitDuration</uniqueId>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Visits by Visit Number</name>
- <category>
- <id>General_Visitors</id>
- <name>Visitors</name>
- <order>5</order>
- <icon>icon-reporting-visitors</icon>
- </category>
- <subcategory>
- <id>VisitorInterest_Engagement</id>
- <name>Engagement</name>
- <order>30</order>
- </subcategory>
- <module>VisitorInterest</module>
- <action>getNumberOfVisitsByVisitCount</action>
- <order>125</order>
- <parameters>
- <module>VisitorInterest</module>
- <action>getNumberOfVisitsByVisitCount</action>
- </parameters>
- <uniqueId>widgetVisitorInterestgetNumberOfVisitsByVisitCount</uniqueId>
- <viewDataTable>table</viewDataTable>
- <isReport>1</isReport>
- </row>
- <row>
<name>Visitor profile</name>
<category>
<id>General_Visitors</id>
@@ -789,7 +765,7 @@
<uniqueId>widgetLivegetVisitorProfilePopup</uniqueId>
</row>
<row>
- <name>Visits per visit duration</name>
+ <name>Visits per number of pages</name>
<category>
<id>General_Visitors</id>
<name>Visitors</name>
@@ -802,18 +778,18 @@
<order>30</order>
</subcategory>
<module>VisitorInterest</module>
- <action>getNumberOfVisitsPerVisitDuration</action>
- <order>115</order>
+ <action>getNumberOfVisitsPerPage</action>
+ <order>120</order>
<parameters>
<module>VisitorInterest</module>
- <action>getNumberOfVisitsPerVisitDuration</action>
+ <action>getNumberOfVisitsPerPage</action>
</parameters>
- <uniqueId>widgetVisitorInterestgetNumberOfVisitsPerVisitDuration</uniqueId>
+ <uniqueId>widgetVisitorInterestgetNumberOfVisitsPerPage</uniqueId>
<viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Visits by Day of Week</name>
+ <name>Visits by Visit Number</name>
<category>
<id>General_Visitors</id>
<name>Visitors</name>
@@ -821,19 +797,19 @@
<icon>icon-reporting-visitors</icon>
</category>
<subcategory>
- <id>VisitTime_SubmenuTimes</id>
- <name>Times</name>
- <order>35</order>
+ <id>VisitorInterest_Engagement</id>
+ <name>Engagement</name>
+ <order>30</order>
</subcategory>
- <module>VisitTime</module>
- <action>getByDayOfWeek</action>
+ <module>VisitorInterest</module>
+ <action>getNumberOfVisitsByVisitCount</action>
<order>125</order>
<parameters>
- <module>VisitTime</module>
- <action>getByDayOfWeek</action>
+ <module>VisitorInterest</module>
+ <action>getNumberOfVisitsByVisitCount</action>
</parameters>
- <uniqueId>widgetVisitTimegetByDayOfWeek</uniqueId>
- <viewDataTable>graphVerticalBar</viewDataTable>
+ <uniqueId>widgetVisitorInterestgetNumberOfVisitsByVisitCount</uniqueId>
+ <viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
@@ -885,6 +861,30 @@
<isReport>1</isReport>
</row>
<row>
+ <name>Visits by Day of Week</name>
+ <category>
+ <id>General_Visitors</id>
+ <name>Visitors</name>
+ <order>5</order>
+ <icon>icon-reporting-visitors</icon>
+ </category>
+ <subcategory>
+ <id>VisitTime_SubmenuTimes</id>
+ <name>Times</name>
+ <order>35</order>
+ </subcategory>
+ <module>VisitTime</module>
+ <action>getByDayOfWeek</action>
+ <order>125</order>
+ <parameters>
+ <module>VisitTime</module>
+ <action>getByDayOfWeek</action>
+ </parameters>
+ <uniqueId>widgetVisitTimegetByDayOfWeek</uniqueId>
+ <viewDataTable>graphVerticalBar</viewDataTable>
+ <isReport>1</isReport>
+ </row>
+ <row>
<name>Real-time Map</name>
<category>
<id>General_Visitors</id>
@@ -931,7 +931,7 @@
<isReport>1</isReport>
</row>
<row>
- <name>Entry Page Titles</name>
+ <name>Entry pages</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -944,18 +944,18 @@
<order>10</order>
</subcategory>
<module>Actions</module>
- <action>getEntryPageTitles</action>
- <order>106</order>
+ <action>getEntryPageUrls</action>
+ <order>103</order>
<parameters>
<module>Actions</module>
- <action>getEntryPageTitles</action>
+ <action>getEntryPageUrls</action>
</parameters>
- <uniqueId>widgetActionsgetEntryPageTitles</uniqueId>
+ <uniqueId>widgetActionsgetEntryPageUrls</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Entry pages</name>
+ <name>Entry Page Titles</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -968,18 +968,18 @@
<order>10</order>
</subcategory>
<module>Actions</module>
- <action>getEntryPageUrls</action>
- <order>103</order>
+ <action>getEntryPageTitles</action>
+ <order>106</order>
<parameters>
<module>Actions</module>
- <action>getEntryPageUrls</action>
+ <action>getEntryPageTitles</action>
</parameters>
- <uniqueId>widgetActionsgetEntryPageUrls</uniqueId>
+ <uniqueId>widgetActionsgetEntryPageTitles</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Exit pages</name>
+ <name>Exit page titles</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -992,18 +992,18 @@
<order>15</order>
</subcategory>
<module>Actions</module>
- <action>getExitPageUrls</action>
- <order>104</order>
+ <action>getExitPageTitles</action>
+ <order>107</order>
<parameters>
<module>Actions</module>
- <action>getExitPageUrls</action>
+ <action>getExitPageTitles</action>
</parameters>
- <uniqueId>widgetActionsgetExitPageUrls</uniqueId>
+ <uniqueId>widgetActionsgetExitPageTitles</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Exit page titles</name>
+ <name>Exit pages</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1016,13 +1016,13 @@
<order>15</order>
</subcategory>
<module>Actions</module>
- <action>getExitPageTitles</action>
- <order>107</order>
+ <action>getExitPageUrls</action>
+ <order>104</order>
<parameters>
<module>Actions</module>
- <action>getExitPageTitles</action>
+ <action>getExitPageUrls</action>
</parameters>
- <uniqueId>widgetActionsgetExitPageTitles</uniqueId>
+ <uniqueId>widgetActionsgetExitPageUrls</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1051,7 +1051,7 @@
<isReport>1</isReport>
</row>
<row>
- <name>Page Titles Following a Site Search</name>
+ <name>Pages Following a Site Search</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1064,18 +1064,18 @@
<order>25</order>
</subcategory>
<module>Actions</module>
- <action>getPageTitlesFollowingSiteSearch</action>
- <order>119</order>
+ <action>getPageUrlsFollowingSiteSearch</action>
+ <order>116</order>
<parameters>
<module>Actions</module>
- <action>getPageTitlesFollowingSiteSearch</action>
+ <action>getPageUrlsFollowingSiteSearch</action>
</parameters>
- <uniqueId>widgetActionsgetPageTitlesFollowingSiteSearch</uniqueId>
+ <uniqueId>widgetActionsgetPageUrlsFollowingSiteSearch</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Search Keywords with No Results</name>
+ <name>Site Search Keywords</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1088,18 +1088,18 @@
<order>25</order>
</subcategory>
<module>Actions</module>
- <action>getSiteSearchNoResultKeywords</action>
- <order>118</order>
+ <action>getSiteSearchKeywords</action>
+ <order>115</order>
<parameters>
<module>Actions</module>
- <action>getSiteSearchNoResultKeywords</action>
+ <action>getSiteSearchKeywords</action>
</parameters>
- <uniqueId>widgetActionsgetSiteSearchNoResultKeywords</uniqueId>
+ <uniqueId>widgetActionsgetSiteSearchKeywords</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Pages Following a Site Search</name>
+ <name>Page Titles Following a Site Search</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1112,18 +1112,18 @@
<order>25</order>
</subcategory>
<module>Actions</module>
- <action>getPageUrlsFollowingSiteSearch</action>
- <order>116</order>
+ <action>getPageTitlesFollowingSiteSearch</action>
+ <order>119</order>
<parameters>
<module>Actions</module>
- <action>getPageUrlsFollowingSiteSearch</action>
+ <action>getPageTitlesFollowingSiteSearch</action>
</parameters>
- <uniqueId>widgetActionsgetPageUrlsFollowingSiteSearch</uniqueId>
+ <uniqueId>widgetActionsgetPageTitlesFollowingSiteSearch</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Site Search Keywords</name>
+ <name>Search Keywords with No Results</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1136,13 +1136,13 @@
<order>25</order>
</subcategory>
<module>Actions</module>
- <action>getSiteSearchKeywords</action>
- <order>115</order>
+ <action>getSiteSearchNoResultKeywords</action>
+ <order>118</order>
<parameters>
<module>Actions</module>
- <action>getSiteSearchKeywords</action>
+ <action>getSiteSearchNoResultKeywords</action>
</parameters>
- <uniqueId>widgetActionsgetSiteSearchKeywords</uniqueId>
+ <uniqueId>widgetActionsgetSiteSearchNoResultKeywords</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1219,7 +1219,7 @@
<isReport>1</isReport>
</row>
<row>
- <name>Event Actions</name>
+ <name>Event Names</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1232,19 +1232,19 @@
<order>40</order>
</subcategory>
<module>Events</module>
- <action>getAction</action>
- <order>101</order>
+ <action>getName</action>
+ <order>102</order>
<parameters>
<module>Events</module>
- <action>getAction</action>
- <secondaryDimension>eventName</secondaryDimension>
+ <action>getName</action>
+ <secondaryDimension>eventAction</secondaryDimension>
</parameters>
- <uniqueId>widgetEventsgetActionsecondaryDimensioneventName</uniqueId>
+ <uniqueId>widgetEventsgetNamesecondaryDimensioneventAction</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Event Names</name>
+ <name>Event Categories</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1257,19 +1257,19 @@
<order>40</order>
</subcategory>
<module>Events</module>
- <action>getName</action>
- <order>102</order>
+ <action>getCategory</action>
+ <order>100</order>
<parameters>
<module>Events</module>
- <action>getName</action>
+ <action>getCategory</action>
<secondaryDimension>eventAction</secondaryDimension>
</parameters>
- <uniqueId>widgetEventsgetNamesecondaryDimensioneventAction</uniqueId>
+ <uniqueId>widgetEventsgetCategorysecondaryDimensioneventAction</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Event Categories</name>
+ <name>Event Actions</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1282,19 +1282,19 @@
<order>40</order>
</subcategory>
<module>Events</module>
- <action>getCategory</action>
- <order>100</order>
+ <action>getAction</action>
+ <order>101</order>
<parameters>
<module>Events</module>
- <action>getCategory</action>
- <secondaryDimension>eventAction</secondaryDimension>
+ <action>getAction</action>
+ <secondaryDimension>eventName</secondaryDimension>
</parameters>
- <uniqueId>widgetEventsgetCategorysecondaryDimensioneventAction</uniqueId>
+ <uniqueId>widgetEventsgetActionsecondaryDimensioneventName</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Event Names</name>
+ <name>Event Actions</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1307,19 +1307,19 @@
<order>40</order>
</subcategory>
<module>Events</module>
- <action>getName</action>
- <order>102</order>
+ <action>getAction</action>
+ <order>101</order>
<parameters>
<module>Events</module>
- <action>getName</action>
- <secondaryDimension>eventAction</secondaryDimension>
+ <action>getAction</action>
+ <secondaryDimension>eventName</secondaryDimension>
</parameters>
- <uniqueId>widgetEventsgetNamesecondaryDimensioneventAction</uniqueId>
+ <uniqueId>widgetEventsgetActionsecondaryDimensioneventName</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Event Categories</name>
+ <name>Event Names</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1332,19 +1332,19 @@
<order>40</order>
</subcategory>
<module>Events</module>
- <action>getCategory</action>
- <order>100</order>
+ <action>getName</action>
+ <order>102</order>
<parameters>
<module>Events</module>
- <action>getCategory</action>
+ <action>getName</action>
<secondaryDimension>eventAction</secondaryDimension>
</parameters>
- <uniqueId>widgetEventsgetCategorysecondaryDimensioneventAction</uniqueId>
+ <uniqueId>widgetEventsgetNamesecondaryDimensioneventAction</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Event Actions</name>
+ <name>Event Categories</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1357,19 +1357,19 @@
<order>40</order>
</subcategory>
<module>Events</module>
- <action>getAction</action>
- <order>101</order>
+ <action>getCategory</action>
+ <order>100</order>
<parameters>
<module>Events</module>
- <action>getAction</action>
- <secondaryDimension>eventName</secondaryDimension>
+ <action>getCategory</action>
+ <secondaryDimension>eventAction</secondaryDimension>
</parameters>
- <uniqueId>widgetEventsgetActionsecondaryDimensioneventName</uniqueId>
+ <uniqueId>widgetEventsgetCategorysecondaryDimensioneventAction</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Content Name</name>
+ <name>Content Piece</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1382,13 +1382,13 @@
<order>45</order>
</subcategory>
<module>Contents</module>
- <action>getContentNames</action>
- <order>135</order>
+ <action>getContentPieces</action>
+ <order>136</order>
<parameters>
<module>Contents</module>
- <action>getContentNames</action>
+ <action>getContentPieces</action>
</parameters>
- <uniqueId>widgetContentsgetContentNames</uniqueId>
+ <uniqueId>widgetContentsgetContentPieces</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1441,7 +1441,7 @@
<isReport>1</isReport>
</row>
<row>
- <name>Content Piece</name>
+ <name>Content Name</name>
<category>
<id>General_Actions</id>
<name>Actions</name>
@@ -1454,18 +1454,18 @@
<order>45</order>
</subcategory>
<module>Contents</module>
- <action>getContentPieces</action>
- <order>136</order>
+ <action>getContentNames</action>
+ <order>135</order>
<parameters>
<module>Contents</module>
- <action>getContentPieces</action>
+ <action>getContentNames</action>
</parameters>
- <uniqueId>widgetContentsgetContentPieces</uniqueId>
+ <uniqueId>widgetContentsgetContentNames</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Referrers</name>
+ <name>Referrer Types</name>
<category>
<id>Referrers_Referrers</id>
<name>Referrers</name>
@@ -1478,18 +1478,18 @@
<order>5</order>
</subcategory>
<module>Referrers</module>
- <action>getAll</action>
- <order>102</order>
+ <action>getReferrerType</action>
+ <order>101</order>
<parameters>
<module>Referrers</module>
- <action>getAll</action>
+ <action>getReferrerType</action>
</parameters>
- <uniqueId>widgetReferrersgetAll</uniqueId>
+ <uniqueId>widgetReferrersgetReferrerType</uniqueId>
<viewDataTable>tableAllColumns</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Referrer Types</name>
+ <name>Referrers</name>
<category>
<id>Referrers_Referrers</id>
<name>Referrers</name>
@@ -1502,18 +1502,18 @@
<order>5</order>
</subcategory>
<module>Referrers</module>
- <action>getReferrerType</action>
- <order>101</order>
+ <action>getAll</action>
+ <order>102</order>
<parameters>
<module>Referrers</module>
- <action>getReferrerType</action>
+ <action>getAll</action>
</parameters>
- <uniqueId>widgetReferrersgetReferrerType</uniqueId>
+ <uniqueId>widgetReferrersgetAll</uniqueId>
<viewDataTable>tableAllColumns</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Search Engines</name>
+ <name>Keywords</name>
<category>
<id>Referrers_Referrers</id>
<name>Referrers</name>
@@ -1526,18 +1526,18 @@
<order>10</order>
</subcategory>
<module>Referrers</module>
- <action>getSearchEngines</action>
- <order>107</order>
+ <action>getKeywords</action>
+ <order>103</order>
<parameters>
<module>Referrers</module>
- <action>getSearchEngines</action>
+ <action>getKeywords</action>
</parameters>
- <uniqueId>widgetReferrersgetSearchEngines</uniqueId>
+ <uniqueId>widgetReferrersgetKeywords</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Keywords</name>
+ <name>Search Engines</name>
<category>
<id>Referrers_Referrers</id>
<name>Referrers</name>
@@ -1550,13 +1550,13 @@
<order>10</order>
</subcategory>
<module>Referrers</module>
- <action>getKeywords</action>
- <order>103</order>
+ <action>getSearchEngines</action>
+ <order>107</order>
<parameters>
<module>Referrers</module>
- <action>getKeywords</action>
+ <action>getSearchEngines</action>
</parameters>
- <uniqueId>widgetReferrersgetKeywords</uniqueId>
+ <uniqueId>widgetReferrersgetSearchEngines</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1766,7 +1766,7 @@
<uniqueId>widgetEcommercegetEcommerceLog</uniqueId>
</row>
<row>
- <name>Product Category</name>
+ <name>Product SKU</name>
<category>
<id>Goals_Ecommerce</id>
<name>Ecommerce</name>
@@ -1779,18 +1779,18 @@
<order>10</order>
</subcategory>
<module>Goals</module>
- <action>getItemsCategory</action>
- <order>132</order>
+ <action>getItemsSku</action>
+ <order>130</order>
<parameters>
<module>Goals</module>
- <action>getItemsCategory</action>
+ <action>getItemsSku</action>
</parameters>
- <uniqueId>widgetGoalsgetItemsCategory</uniqueId>
+ <uniqueId>widgetGoalsgetItemsSku</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Product SKU</name>
+ <name>Product Category</name>
<category>
<id>Goals_Ecommerce</id>
<name>Ecommerce</name>
@@ -1803,18 +1803,18 @@
<order>10</order>
</subcategory>
<module>Goals</module>
- <action>getItemsSku</action>
- <order>130</order>
+ <action>getItemsCategory</action>
+ <order>132</order>
<parameters>
<module>Goals</module>
- <action>getItemsSku</action>
+ <action>getItemsCategory</action>
</parameters>
- <uniqueId>widgetGoalsgetItemsSku</uniqueId>
+ <uniqueId>widgetGoalsgetItemsCategory</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Product SKU</name>
+ <name>Product Name</name>
<category>
<id>Goals_Ecommerce</id>
<name>Ecommerce</name>
@@ -1827,13 +1827,13 @@
<order>10</order>
</subcategory>
<module>Goals</module>
- <action>getItemsSku</action>
- <order>130</order>
+ <action>getItemsName</action>
+ <order>131</order>
<parameters>
<module>Goals</module>
- <action>getItemsSku</action>
+ <action>getItemsName</action>
</parameters>
- <uniqueId>widgetGoalsgetItemsSku</uniqueId>
+ <uniqueId>widgetGoalsgetItemsName</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -1862,7 +1862,7 @@
<isReport>1</isReport>
</row>
<row>
- <name>Product Name</name>
+ <name>Product SKU</name>
<category>
<id>Goals_Ecommerce</id>
<name>Ecommerce</name>
@@ -1875,13 +1875,13 @@
<order>10</order>
</subcategory>
<module>Goals</module>
- <action>getItemsName</action>
- <order>131</order>
+ <action>getItemsSku</action>
+ <order>130</order>
<parameters>
<module>Goals</module>
- <action>getItemsName</action>
+ <action>getItemsSku</action>
</parameters>
- <uniqueId>widgetGoalsgetItemsName</uniqueId>
+ <uniqueId>widgetGoalsgetItemsSku</uniqueId>
<viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
@@ -2412,7 +2412,7 @@
</widgets>
</row>
<row>
- <name>Advanced tag cloud: with logos and links</name>
+ <name>Data tables</name>
<category>
<id>ExampleUI_UiFramework</id>
<name>UI Framework</name>
@@ -2420,19 +2420,19 @@
<icon />
</category>
<subcategory>
- <id>Tag clouds</id>
- <name>Tag clouds</name>
+ <id>ExampleUI_GetTemperaturesDataTable</id>
+ <name>Data tables</name>
<order>99</order>
</subcategory>
<module>ExampleUI</module>
- <action>getPlanetRatiosWithLogos</action>
- <order>213</order>
+ <action>getTemperatures</action>
+ <order>210</order>
<parameters>
<module>ExampleUI</module>
- <action>getPlanetRatiosWithLogos</action>
+ <action>getTemperatures</action>
</parameters>
- <uniqueId>widgetExampleUIgetPlanetRatiosWithLogos</uniqueId>
- <viewDataTable>cloud</viewDataTable>
+ <uniqueId>widgetExampleUIgetTemperatures</uniqueId>
+ <viewDataTable>table</viewDataTable>
<isReport>1</isReport>
</row>
<row>
@@ -2444,19 +2444,21 @@
<icon />
</category>
<subcategory>
- <id>ExampleUI_GetTemperaturesDataTable</id>
- <name>Data tables</name>
+ <id>Bar graph</id>
+ <name>Bar graph</name>
<order>99</order>
</subcategory>
<module>ExampleUI</module>
<action>getTemperatures</action>
<order>210</order>
<parameters>
+ <forceView>1</forceView>
+ <viewDataTable>graphVerticalBar</viewDataTable>
<module>ExampleUI</module>
<action>getTemperatures</action>
</parameters>
- <uniqueId>widgetExampleUIgetTemperatures</uniqueId>
- <viewDataTable>table</viewDataTable>
+ <uniqueId>widgetExampleUIgetTemperaturesforceView1viewDataTablegraphVerticalBar</uniqueId>
+ <viewDataTable>graphVerticalBar</viewDataTable>
<isReport>1</isReport>
</row>
<row>
@@ -2542,7 +2544,7 @@
<isReport>1</isReport>
</row>
<row>
- <name>Data tables</name>
+ <name>Advanced tag cloud: with logos and links</name>
<category>
<id>ExampleUI_UiFramework</id>
<name>UI Framework</name>
@@ -2550,25 +2552,23 @@
<icon />
</category>
<subcategory>
- <id>Bar graph</id>
- <name>Bar graph</name>
+ <id>Tag clouds</id>
+ <name>Tag clouds</name>
<order>99</order>
</subcategory>
<module>ExampleUI</module>
- <action>getTemperatures</action>
- <order>210</order>
+ <action>getPlanetRatiosWithLogos</action>
+ <order>213</order>
<parameters>
- <forceView>1</forceView>
- <viewDataTable>graphVerticalBar</viewDataTable>
<module>ExampleUI</module>
- <action>getTemperatures</action>
+ <action>getPlanetRatiosWithLogos</action>
</parameters>
- <uniqueId>widgetExampleUIgetTemperaturesforceView1viewDataTablegraphVerticalBar</uniqueId>
- <viewDataTable>graphVerticalBar</viewDataTable>
+ <uniqueId>widgetExampleUIgetPlanetRatiosWithLogos</uniqueId>
+ <viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Pie graph</name>
+ <name>Simple tag cloud</name>
<category>
<id>ExampleUI_UiFramework</id>
<name>UI Framework</name>
@@ -2576,23 +2576,25 @@
<icon />
</category>
<subcategory>
- <id>Pie graph</id>
- <name>Pie graph</name>
+ <id>Tag clouds</id>
+ <name>Tag clouds</name>
<order>99</order>
</subcategory>
<module>ExampleUI</module>
<action>getPlanetRatios</action>
- <order>212</order>
+ <order>5</order>
<parameters>
+ <forceView>1</forceView>
+ <viewDataTable>cloud</viewDataTable>
<module>ExampleUI</module>
<action>getPlanetRatios</action>
</parameters>
- <uniqueId>widgetExampleUIgetPlanetRatios</uniqueId>
- <viewDataTable>graphPie</viewDataTable>
+ <uniqueId>widgetExampleUIgetPlanetRatiosforceView1viewDataTablecloud</uniqueId>
+ <viewDataTable>cloud</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Simple tag cloud</name>
+ <name>Pie graph</name>
<category>
<id>ExampleUI_UiFramework</id>
<name>UI Framework</name>
@@ -2600,43 +2602,41 @@
<icon />
</category>
<subcategory>
- <id>Tag clouds</id>
- <name>Tag clouds</name>
+ <id>Pie graph</id>
+ <name>Pie graph</name>
<order>99</order>
</subcategory>
<module>ExampleUI</module>
<action>getPlanetRatios</action>
- <order>5</order>
+ <order>212</order>
<parameters>
- <forceView>1</forceView>
- <viewDataTable>cloud</viewDataTable>
<module>ExampleUI</module>
<action>getPlanetRatios</action>
</parameters>
- <uniqueId>widgetExampleUIgetPlanetRatiosforceView1viewDataTablecloud</uniqueId>
- <viewDataTable>cloud</viewDataTable>
+ <uniqueId>widgetExampleUIgetPlanetRatios</uniqueId>
+ <viewDataTable>graphPie</viewDataTable>
<isReport>1</isReport>
</row>
<row>
- <name>Support Piwik!</name>
+ <name>Movers and Shakers</name>
<category>
- <id>About Piwik</id>
- <name>About Piwik</name>
+ <id>Insights_WidgetCategory</id>
+ <name>Insights</name>
<order>99</order>
<icon />
</category>
<subcategory />
- <module>CoreHome</module>
- <action>getDonateForm</action>
- <order>5</order>
+ <module>Insights</module>
+ <action>getOverallMoversAndShakers</action>
+ <order>99</order>
<parameters>
- <module>CoreHome</module>
- <action>getDonateForm</action>
+ <module>Insights</module>
+ <action>getOverallMoversAndShakers</action>
</parameters>
- <uniqueId>widgetCoreHomegetDonateForm</uniqueId>
+ <uniqueId>widgetInsightsgetOverallMoversAndShakers</uniqueId>
</row>
<row>
- <name>Piwik PRO: Advanced Analytics &amp; Services</name>
+ <name>Support Piwik!</name>
<category>
<id>About Piwik</id>
<name>About Piwik</name>
@@ -2644,17 +2644,17 @@
<icon />
</category>
<subcategory />
- <module>PiwikPro</module>
- <action>promoPiwikPro</action>
- <order>99</order>
+ <module>CoreHome</module>
+ <action>getDonateForm</action>
+ <order>5</order>
<parameters>
- <module>PiwikPro</module>
- <action>promoPiwikPro</action>
+ <module>CoreHome</module>
+ <action>getDonateForm</action>
</parameters>
- <uniqueId>widgetPiwikPropromoPiwikPro</uniqueId>
+ <uniqueId>widgetCoreHomegetDonateForm</uniqueId>
</row>
<row>
- <name>Welcome!</name>
+ <name>System Check</name>
<category>
<id>About Piwik</id>
<name>About Piwik</name>
@@ -2662,14 +2662,14 @@
<icon />
</category>
<subcategory />
- <module>CoreHome</module>
- <action>getPromoVideo</action>
- <order>10</order>
+ <module>Installation</module>
+ <action>getSystemCheck</action>
+ <order>16</order>
<parameters>
- <module>CoreHome</module>
- <action>getPromoVideo</action>
+ <module>Installation</module>
+ <action>getSystemCheck</action>
</parameters>
- <uniqueId>widgetCoreHomegetPromoVideo</uniqueId>
+ <uniqueId>widgetInstallationgetSystemCheck</uniqueId>
</row>
<row>
<name>Top Keywords for Page URL</name>
@@ -2690,6 +2690,24 @@
<uniqueId>widgetReferrersgetKeywordsForPage</uniqueId>
</row>
<row>
+ <name>System Summary</name>
+ <category>
+ <id>About Piwik</id>
+ <name>About Piwik</name>
+ <order>99</order>
+ <icon />
+ </category>
+ <subcategory />
+ <module>CoreHome</module>
+ <action>getSystemSummary</action>
+ <order>15</order>
+ <parameters>
+ <module>CoreHome</module>
+ <action>getSystemSummary</action>
+ </parameters>
+ <uniqueId>widgetCoreHomegetSystemSummary</uniqueId>
+ </row>
+ <row>
<name>Piwik.org Blog</name>
<category>
<id>About Piwik</id>
@@ -2708,43 +2726,43 @@
<uniqueId>widgetExampleRssWidgetrssPiwik</uniqueId>
</row>
<row>
- <name>Insights Overview</name>
+ <name>Welcome!</name>
<category>
- <id>Insights_WidgetCategory</id>
- <name>Insights</name>
+ <id>About Piwik</id>
+ <name>About Piwik</name>
<order>99</order>
<icon />
</category>
<subcategory />
- <module>Insights</module>
- <action>getInsightsOverview</action>
- <order>99</order>
+ <module>CoreHome</module>
+ <action>getPromoVideo</action>
+ <order>10</order>
<parameters>
- <module>Insights</module>
- <action>getInsightsOverview</action>
+ <module>CoreHome</module>
+ <action>getPromoVideo</action>
</parameters>
- <uniqueId>widgetInsightsgetInsightsOverview</uniqueId>
+ <uniqueId>widgetCoreHomegetPromoVideo</uniqueId>
</row>
<row>
- <name>SEO Rankings</name>
+ <name>Latest Piwik Plugin Updates</name>
<category>
- <id>SEO</id>
- <name>SEO</name>
+ <id>About Piwik</id>
+ <name>About Piwik</name>
<order>99</order>
<icon />
</category>
<subcategory />
- <module>SEO</module>
- <action>getRank</action>
- <order>99</order>
+ <module>CorePluginsAdmin</module>
+ <action>getNewPlugins</action>
+ <order>19</order>
<parameters>
- <module>SEO</module>
- <action>getRank</action>
+ <module>CorePluginsAdmin</module>
+ <action>getNewPlugins</action>
</parameters>
- <uniqueId>widgetSEOgetRank</uniqueId>
+ <uniqueId>widgetCorePluginsAdmingetNewPlugins</uniqueId>
</row>
<row>
- <name>Movers and Shakers</name>
+ <name>Insights Overview</name>
<category>
<id>Insights_WidgetCategory</id>
<name>Insights</name>
@@ -2753,13 +2771,13 @@
</category>
<subcategory />
<module>Insights</module>
- <action>getOverallMoversAndShakers</action>
+ <action>getInsightsOverview</action>
<order>99</order>
<parameters>
<module>Insights</module>
- <action>getOverallMoversAndShakers</action>
+ <action>getInsightsOverview</action>
</parameters>
- <uniqueId>widgetInsightsgetOverallMoversAndShakers</uniqueId>
+ <uniqueId>widgetInsightsgetInsightsOverview</uniqueId>
</row>
<row>
<name>Piwik Changelog</name>
@@ -2780,93 +2798,21 @@
<uniqueId>widgetExampleRssWidgetrssChangelog</uniqueId>
</row>
<row>
- <name>Piwik PRO Blog</name>
- <category>
- <id>About Piwik</id>
- <name>About Piwik</name>
- <order>99</order>
- <icon />
- </category>
- <subcategory />
- <module>PiwikPro</module>
- <action>rssPiwikPro</action>
- <order>99</order>
- <parameters>
- <module>PiwikPro</module>
- <action>rssPiwikPro</action>
- </parameters>
- <uniqueId>widgetPiwikProrssPiwikPro</uniqueId>
- </row>
- <row>
- <name>System Check</name>
- <category>
- <id>About Piwik</id>
- <name>About Piwik</name>
- <order>99</order>
- <icon />
- </category>
- <subcategory />
- <module>Installation</module>
- <action>getSystemCheck</action>
- <order>16</order>
- <parameters>
- <module>Installation</module>
- <action>getSystemCheck</action>
- </parameters>
- <uniqueId>widgetInstallationgetSystemCheck</uniqueId>
- </row>
- <row>
- <name>System Summary</name>
- <category>
- <id>About Piwik</id>
- <name>About Piwik</name>
- <order>99</order>
- <icon />
- </category>
- <subcategory />
- <module>CoreHome</module>
- <action>getSystemSummary</action>
- <order>15</order>
- <parameters>
- <module>CoreHome</module>
- <action>getSystemSummary</action>
- </parameters>
- <uniqueId>widgetCoreHomegetSystemSummary</uniqueId>
- </row>
- <row>
- <name>Latest Piwik Plugin Updates</name>
- <category>
- <id>About Piwik</id>
- <name>About Piwik</name>
- <order>99</order>
- <icon />
- </category>
- <subcategory />
- <module>CorePluginsAdmin</module>
- <action>getNewPlugins</action>
- <order>19</order>
- <parameters>
- <module>CorePluginsAdmin</module>
- <action>getNewPlugins</action>
- </parameters>
- <uniqueId>widgetCorePluginsAdmingetNewPlugins</uniqueId>
- </row>
- <row>
- <name>Example Widget Name</name>
+ <name>SEO Rankings</name>
<category>
- <id>About Piwik</id>
- <name>About Piwik</name>
+ <id>SEO</id>
+ <name>SEO</name>
<order>99</order>
<icon />
</category>
<subcategory />
- <module>ExamplePlugin</module>
- <action>myExampleWidget</action>
+ <module>SEO</module>
+ <action>getRank</action>
<order>99</order>
<parameters>
- <module>ExamplePlugin</module>
- <action>myExampleWidget</action>
+ <module>SEO</module>
+ <action>getRank</action>
</parameters>
- <uniqueId>widgetExamplePluginmyExampleWidget</uniqueId>
+ <uniqueId>widgetSEOgetRank</uniqueId>
</row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__SitesManager.getJavascriptTag.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__SitesManager.getJavascriptTag.xml
index d4c25ca522..c8c4cc2022 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__SitesManager.getJavascriptTag.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__SitesManager.getJavascriptTag.xml
@@ -7,11 +7,11 @@
(function() {
var u=&quot;//example.org/piwik/&quot;;
_paq.push(['setTrackerUrl', u+'piwik.php']);
- _paq.push(['setSiteId', 1]);
+ _paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
})();
&lt;/script&gt;
&lt;noscript&gt;&lt;p&gt;&lt;img src=&quot;//example.org/piwik/piwik.php?idsite=1&quot; style=&quot;border:0;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;/noscript&gt;
&lt;!-- End Piwik Code --&gt;
-</result> \ No newline at end of file
+</result>
diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv
index ae676d91e9..b3855b3029 100644
--- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv
+++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_csv__ScheduledReports.generateReport_week.original.csv
@@ -7,6 +7,9 @@ Visits Summary
nb_uniq_visitors,nb_visits,nb_actions,max_actions,nb_actions_per_visit,avg_time_on_site,bounce_rate
1,5,16,6,3.2,00:22:49,20%
+Users
+No data available
+
Custom Variables
label,nb_visits,nb_actions,revenue,nb_actions_per_visit,avg_time_on_site,bounce_rate
ValueIsZero,5,16,$ 13361.11,3.2,00:22:49,20%
diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html
index 4f38210ecc..5a7735b4d9 100644
--- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html
+++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html
@@ -31,6 +31,11 @@
</a>
</li>
<li>
+ <a href="#UserId_getUsers" style="text-decoration:none; color: rgb(13,13,13);">
+ Users
+ </a>
+ </li>
+ <li>
<a href="#CustomVariables_getCustomVariables" style="text-decoration:none; color: rgb(13,13,13);">
Custom Variables
</a>
@@ -556,6 +561,11 @@
<a style="text-decoration:none; color: rgb(13,13,13); font-size: 9pt;" href="#reportTop">
Back to top
</a>
+<h2 id="UserId_getUsers" style="color: rgb(13,13,13); font-size: 24pt; font-weight:normal;">
+ Users
+</h2>
+
+ There is no data for this report.
<h2 id="CustomVariables_getCustomVariables" style="color: rgb(13,13,13); font-size: 24pt; font-weight:normal;">
Custom Variables
</h2>
diff --git a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__UserId.getUsers_day.xml b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__UserId.getUsers_day.xml
new file mode 100644
index 0000000000..106f23f16b
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__UserId.getUsers_day.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<results>
+ <result date="2009-01-04" />
+ <result date="2009-01-05" />
+ <result date="2009-01-06" />
+ <result date="2009-01-07" />
+ <result date="2009-01-08" />
+ <result date="2009-01-09" />
+ <result date="2009-01-10" />
+</results> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__UserId.getUsers_week.xml b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__UserId.getUsers_week.xml
new file mode 100644
index 0000000000..5cfb246edc
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__UserId.getUsers_week.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<results>
+ <result date="From 2008-12-29 to 2009-01-04" />
+ <result date="From 2009-01-05 to 2009-01-11" />
+ <result date="From 2009-01-12 to 2009-01-18" />
+ <result date="From 2009-01-19 to 2009-01-25" />
+ <result date="From 2009-01-26 to 2009-02-01" />
+ <result date="From 2009-02-02 to 2009-02-08" />
+ <result date="From 2009-02-09 to 2009-02-15" />
+</results> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_noVisit__UserId.getUsers_day.xml b/tests/PHPUnit/System/expected/test_noVisit__UserId.getUsers_day.xml
new file mode 100644
index 0000000000..c234bed59e
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_noVisit__UserId.getUsers_day.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result /> \ No newline at end of file
diff --git a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
new file mode 100644
index 0000000000..cd572e4849
--- /dev/null
+++ b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
@@ -0,0 +1,171 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Tests\Unit\DataAccess;
+
+use Piwik\DataAccess\LogQueryBuilder\JoinGenerator;
+use Piwik\DataAccess\LogQueryBuilder\JoinTables;
+use Piwik\Tests\Framework\Mock\Plugin\LogTablesProvider;
+use Piwik\Tracker\Visit;
+
+/**
+ * @group Core
+ */
+class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @var JoinGenerator
+ */
+ private $generator;
+
+ public function setUp()
+ {
+ $this->generator = $this->makeTables(array(
+ 'log_visit',
+ array('table' => 'log_conversion', 'joinOn' => 'log_conversion.idvisit = log_visit.idvisit'),
+ 'log_action'));
+ }
+
+ public function test_constructor_shouldAddTablesIfNeeded()
+ {
+ $tables = $this->makeTables(array('log_visit', 'log_action'));
+ $this->makeGenerator($tables);
+
+ $this->assertEquals(array('log_visit', 'log_action', 'log_link_visit_action'), $tables->getTables());
+ }
+
+ public function test_generate_shouldJoinWithSubselect_IfBaseTableIsLogVisit()
+ {
+ $generator = $this->generate(array('log_visit', 'log_action'));
+ $this->assertTrue($generator->shouldJoinWithSelect());
+ }
+
+ public function test_generate_shouldNotJoinWithSubselect_IfBaseTableIsLogVisitButNoTableToJoin()
+ {
+ $generator = $this->generate(array('log_visit'));
+ $this->assertFalse($generator->shouldJoinWithSelect());
+ }
+
+ public function test_generate_shouldNotJoinWithSubselect_IfLogVisitIsGivenButItIsNotBaseTable()
+ {
+ $generator = $this->generate(array('log_conversion', 'log_visit'));
+ $this->assertFalse($generator->shouldJoinWithSelect());
+ }
+
+ public function test_generate_getJoinString()
+ {
+ $generator = $this->generate(array('log_action', 'log_link_visit_action', 'log_visit'));
+
+ $expected = 'log_action AS log_action ';
+ $expected .= 'LEFT JOIN log_link_visit_action AS log_link_visit_action ON log_link_visit_action.idaction_url = log_action.idaction ';
+ $expected .= 'LEFT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit';
+ $this->assertEquals($expected, $generator->getJoinString());
+ }
+
+ public function test_generate_getJoinString_OnlyOneTable()
+ {
+ $generator = $this->generate(array('log_visit'));
+ $this->assertEquals('log_visit AS log_visit', $generator->getJoinString());
+ }
+
+ public function test_generate_getJoinString_OnlyOneActionTable()
+ {
+ $generator = $this->generate(array('log_action'));
+ $this->assertEquals('log_action AS log_action', $generator->getJoinString());
+ }
+
+ public function test_generate_getJoinString_OnlyActionTables()
+ {
+ $generator = $this->generate(array('log_link_visit_action', 'log_action'));
+ $expected = 'log_link_visit_action AS log_link_visit_action';
+ $expected .= ' LEFT JOIN log_action AS log_action ON log_link_visit_action.idaction_url = log_action.idaction';
+ $this->assertEquals($expected, $generator->getJoinString());
+ }
+
+ public function test_generate_getJoinString_manuallyJoinedAlready()
+ {
+ $generator = $this->generate(array(
+ 'log_link_visit_action',
+ array('table' => 'log_visit', 'joinOn' => 'log_visit.idvisit = log_link_visit_action.idvisit'),
+ array('table' => 'log_action', 'joinOn' => 'log_link_visit_action.idaction_name = log_action.idaction'),
+ 'log_action'
+ ));
+
+ $expected = 'log_link_visit_action AS log_link_visit_action ';
+ $expected .= 'LEFT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit ';
+ $expected .= 'LEFT JOIN log_action AS log_action ON (log_link_visit_action.idaction_name = log_action.idaction AND log_link_visit_action.idaction_url = log_action.idaction)';
+ $this->assertEquals($expected, $generator->getJoinString());
+ }
+
+ public function test_generate_getJoinString_allTables()
+ {
+ $generator = $this->generate(array(
+ 'log_action',
+ 'log_conversion_item',
+ 'log_link_visit_action',
+ 'log_conversion',
+ 'log_visit',
+ ));
+
+ $expected = 'log_action AS log_action ';
+ $expected .= 'LEFT JOIN log_link_visit_action AS log_link_visit_action ON log_link_visit_action.idaction_url = log_action.idaction ';
+ $expected .= 'LEFT JOIN log_visit AS log_visit ON log_visit.idvisit = log_link_visit_action.idvisit ';
+ $expected .= 'LEFT JOIN log_conversion AS log_conversion ON log_conversion.idvisit = log_link_visit_action.idvisit ';
+ $expected .= 'LEFT JOIN log_conversion_item AS log_conversion_item ON log_conversion_item.idvisit = log_link_visit_action.idvisit';
+ $this->assertEquals($expected, $generator->getJoinString());
+ }
+
+ public function test_sortTablesForJoin_shouldSortTablesAsSpecified()
+ {
+ $tables = array(
+ 'log_action',
+ array('table' => 'log_conversion', 'joinOn' => 'log_conversion.idvisit = log_visit.idvisit'),
+ 'log_conversion_item',
+ 'log_link_visit_action',
+ 'log_conversion',
+ 'log_visit',
+ );
+
+ $generator = $this->makeGenerator($tables);
+ $tables[] = 'log_foo_bar';
+ usort($tables, array($generator, 'sortTablesForJoin'));
+
+ $expected = array(
+ array('table' => 'log_conversion', 'joinOn' => 'log_conversion.idvisit = log_visit.idvisit'),
+ 'log_link_visit_action',
+ 'log_action',
+ 'log_visit',
+ 'log_conversion',
+ 'log_conversion_item',
+ 'log_foo_bar'
+ );
+
+ $this->assertEquals($expected, $tables);
+ }
+
+ private function generate($tables)
+ {
+ $generator = $this->makeGenerator($tables);
+ $generator->generate();
+ return $generator;
+ }
+
+ private function makeGenerator($tables)
+ {
+ if (is_array($tables)) {
+ $tables = $this->makeTables($tables);
+ }
+
+ return new JoinGenerator($tables);
+ }
+
+ private function makeTables($tables)
+ {
+ return new JoinTables(new LogTablesProvider(), $tables);
+ }
+} \ No newline at end of file
diff --git a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
new file mode 100644
index 0000000000..8f5a52fd0b
--- /dev/null
+++ b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Tests\Unit\DataAccess;
+
+use Piwik\DataAccess\LogQueryBuilder\JoinTables;
+use Piwik\Tests\Framework\Mock\Plugin\LogTablesProvider;
+use Piwik\Tracker\Visit;
+
+/**
+ * @group Core
+ */
+class JoinTablesTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @var JoinTables
+ */
+ private $tables;
+
+ public function setUp()
+ {
+ $this->tables = $this->makeTables(array(
+ 'log_visit',
+ array('table' => 'log_conversion', 'joinOn' => 'log_conversion.idvisit = log_visit.idvisit'),
+ 'log_action'));
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Table 'log_foo_bar_baz' can't be used for segmentation
+ */
+ public function test_construct_shouldThrowException_IfTableIsNotPossibleToJoin()
+ {
+ $this->makeTables(array('log_visit', 'log_foo_bar_baz'));
+ }
+
+ public function test_hasJoinedTable_shouldDetectIfTableIsAlreadyAdded()
+ {
+ $this->assertTrue($this->tables->hasJoinedTable('log_visit'));
+ $this->assertTrue($this->tables->hasJoinedTable('log_action'));
+
+ $this->assertFalse($this->tables->hasJoinedTable('log_foo_bar_baz'));
+ $this->assertFalse($this->tables->hasJoinedTable('log_conversion')); // we do not check for manually joined tables
+ }
+
+ public function test_addTableToJoin_shouldAddGivenTable()
+ {
+ $table = 'log_conversion_item';
+ $this->assertFalse($this->tables->hasJoinedTable($table));
+
+ $this->tables->addTableToJoin($table);
+
+ $this->assertTrue($this->tables->hasJoinedTable($table));
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Table 'log_foo_bar_baz' can't be used for segmentation
+ */
+ public function test_addTableToJoin_shouldCheckIfTableCanBeUsedForSegmentation()
+ {
+ $table = 'log_foo_bar_baz';
+ $this->assertFalse($this->tables->hasJoinedTable($table));
+
+ $this->tables->addTableToJoin($table);
+
+ $this->assertTrue($this->tables->hasJoinedTable($table));
+ }
+
+ public function test_hasJoinedTableManually_shouldReturnTrue_IfTableJoinExistsExactlyAsGiven()
+ {
+ $result = $this->tables->hasJoinedTableManually('log_conversion', 'log_conversion.idvisit = log_visit.idvisit');
+
+ $this->assertTrue($result);
+ }
+
+ public function test_hasJoinedTableManually_shouldReturnFalse_IfTableOrJoinDoesNotMatch()
+ {
+ $result = $this->tables->hasJoinedTableManually('log_foo_bar_baz', 'log_conversion.idvisit = log_visit.idvisit');
+ $this->assertFalse($result);
+
+ $result = $this->tables->hasJoinedTableManually('log_conversion', 'log_foo_bar_baz.idvisit = log_visit.idvisit');
+ $this->assertFalse($result);
+ }
+
+ public function test_hasAddedTableManually_shouldReturnTrue_IfTableWasAddedManually()
+ {
+ $result = $this->tables->hasAddedTableManually('log_conversion');
+
+ $this->assertTrue($result);
+ }
+
+ public function test_hasAddedTableManually_shouldReturnFalse_IfTableWasNotAddedManually()
+ {
+ $result = $this->tables->hasAddedTableManually('log_foo_bar_baz');
+ $this->assertFalse($result);
+
+ $result = $this->tables->hasAddedTableManually('log_conversion_item');
+ $this->assertFalse($result);
+ }
+
+ public function test_getLogTable_shouldReturnInstanceOfLogTable_IfTableExists()
+ {
+ $visit = $this->tables->getLogTable('log_visit');
+ $this->assertFalse($visit instanceof Visit);
+ }
+
+ public function test_getLogTable_shouldReturnNull_IfLogTableDoesNotExist()
+ {
+ $visit = $this->tables->getLogTable('log_foo_bar_baz');
+ $this->assertNull($visit);
+ }
+
+ public function test_findIndexOfManuallyAddedTable_shouldReturnTheIndex_IfTableWasAddedManually()
+ {
+ $this->assertSame(1, $this->tables->findIndexOfManuallyAddedTable('log_conversion'));
+ }
+
+ public function test_findIndexOfManuallyAddedTable_shouldReturnNull_IfTableWasNotAddedManually()
+ {
+ $this->assertNull($this->tables->findIndexOfManuallyAddedTable('log_visit'));
+ $this->assertNull($this->tables->findIndexOfManuallyAddedTable('log_action'));
+ $this->assertNull($this->tables->findIndexOfManuallyAddedTable('log_foo_bar_baz'));
+ }
+
+ public function test_sort_shouldNeverSortFirstEntry_AndNotMaintainKeys()
+ {
+ $tables = $this->makeTables(array('log_conversion', 'log_visit', 'log_action', 'log_conversion_item'));
+ $tables->sort(function($a, $b) {
+ return strcmp($a, $b);
+ });
+
+ $expected = array('log_conversion', 'log_action', 'log_conversion_item', 'log_visit');
+ $this->assertEquals($expected, $tables->getTables());
+ }
+
+ private function makeTables($tables)
+ {
+ return new JoinTables(new LogTablesProvider(), $tables);
+ }
+} \ No newline at end of file
diff --git a/tests/PHPUnit/Unit/DataTableTest.php b/tests/PHPUnit/Unit/DataTableTest.php
index fa7fe22669..b2eb143518 100644
--- a/tests/PHPUnit/Unit/DataTableTest.php
+++ b/tests/PHPUnit/Unit/DataTableTest.php
@@ -308,6 +308,73 @@ class DataTableTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($subtable, $row1->getIdSubDataTable());
}
+ public function testSumRowMetadata_CustomAggregationOperation()
+ {
+ $metadata1 = array('mytest' => 'value1');
+ $metadata2 = array('mytest' => 'value2');
+
+ $self = $this;
+ $row1 = new Row(array(Row::COLUMNS => array('test_int' => 145), Row::METADATA => $metadata1));
+ $finalRow = new Row(array(Row::COLUMNS => array('test_int' => 5), Row::METADATA => $metadata2));
+ $finalRow->sumRowMetadata($row1, array('mytest' => function ($thisValue, $otherValue, $thisRow, $otherRow) use ($self, $row1, $finalRow) {
+ $self->assertEquals('value2', $thisValue);
+ $self->assertEquals('value1', $otherValue);
+ $self->assertSame($thisRow, $finalRow);
+ $self->assertSame($otherRow, $row1);
+
+ if (!is_array($thisValue)) {
+ $thisValue = array($thisValue);
+ }
+
+ $thisValue[] = $otherValue;
+ return $thisValue;
+ }));
+
+ $this->assertEquals(array('value2', 'value1'), $finalRow->getMetadata('mytest'));
+ }
+
+ public function testSumRow_CustomAggregationOperation()
+ {
+ $columns = array('test_int' => 145, 'test_float' => 145.5);
+
+ $row1 = new Row(array(Row::COLUMNS => $columns));
+
+ $columns2 = array('test_int' => 5);
+ $finalRow = new Row(array(Row::COLUMNS => $columns2));
+
+
+ $self = $this;
+
+ $finalRow->sumRow($row1, $copyMetadata = true, $operation = array('test_int' => function ($thisValue, $otherValue, $thisRow, $otherRow) use ($self, $row1, $finalRow) {
+ $self->assertEquals(5, $thisValue);
+ $self->assertEquals(145, $otherValue);
+ $self->assertSame($thisRow, $finalRow);
+ $self->assertSame($otherRow, $row1);
+
+ if (!is_array($thisValue)) {
+ $thisValue = array($thisValue);
+ }
+
+ $thisValue[] = $otherValue;
+ return $thisValue;
+ }));
+
+ $this->assertEquals(array(5, 145), $finalRow->getColumn('test_int'));
+ }
+
+ /**
+ * @expectedException \Exception
+ * @expectedExceptionMessage Unknown operation 'foobarinvalid'
+ */
+ public function testSumRow_ShouldThrowExceptionIfInvalidOperationIsGiven()
+ {
+ $row1 = new Row(array(Row::COLUMNS => array('test_int' => 145)));
+ $finalRow = new Row(array(Row::COLUMNS => array('test_int' => 5)));
+ $finalRow->sumRow($row1, $copyMetadata = true, $operation = array('test_int' => 'fooBarInvalid'));
+
+ $this->assertEquals(array(5, 145), $finalRow->getColumn('test_int'));
+ }
+
public function unserializeTestsDataProvider()
{
return array(
diff --git a/tests/PHPUnit/Unit/FilesystemTest.php b/tests/PHPUnit/Unit/FilesystemTest.php
index 86894d13e1..1c2d69d69f 100644
--- a/tests/PHPUnit/Unit/FilesystemTest.php
+++ b/tests/PHPUnit/Unit/FilesystemTest.php
@@ -93,6 +93,8 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
'/DataTable/Bridges.php',
'/DataTable/DataTableInterface.php',
'/DataTable/Filter',
+ '/DataTable/index.htm', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
+ '/DataTable/index.php', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
'/DataTable/Manager.php',
'/DataTable/Map.php',
'/DataTable/Renderer',
@@ -100,17 +102,26 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
'/DataTable/Row',
'/DataTable/Row.php',
'/DataTable/Simple.php',
+ '/DataTable/Filter/index.htm', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
+ '/DataTable/Filter/index.php', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
'/DataTable/Renderer/Console.php',
'/DataTable/Renderer/Csv.php',
'/DataTable/Renderer/Html.php',
+ '/DataTable/Renderer/index.htm', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
+ '/DataTable/Renderer/index.php', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
'/DataTable/Renderer/Json.php',
'/DataTable/Renderer/Php.php',
'/DataTable/Renderer/Rss.php',
'/DataTable/Renderer/Tsv.php',
'/DataTable/Renderer/Xml',
'/DataTable/Renderer/Xml.php',
+ '/DataTable/Renderer/Xml/index.htm', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
+ '/DataTable/Renderer/Xml/index.php', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
'/DataTable/Renderer/Xml/Other.php',
- '/DataTable/Row/DataTableSummaryRow.php'
+ '/DataTable/Row/DataTableSummaryRow.php',
+ '/DataTable/Row/index.htm', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
+ '/DataTable/Row/index.php', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
+
), $result);
}
@@ -121,12 +132,18 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(array(
'/DataTable/Filter',
'/DataTable/Row',
+ '/DataTable/Filter/index.htm', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
+ '/DataTable/Filter/index.php', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
'/DataTable/Renderer/Json.php',
'/DataTable/Renderer/Php.php',
'/DataTable/Renderer/Rss.php',
'/DataTable/Renderer/Xml',
+ '/DataTable/Renderer/Xml/index.htm', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
+ '/DataTable/Renderer/Xml/index.php', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
'/DataTable/Renderer/Xml/Other.php',
'/DataTable/Row/DataTableSummaryRow.php',
+ '/DataTable/Row/index.htm', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
+ '/DataTable/Row/index.php', // this was is created as side effect of "Target files" being within the tmp/ folder, @see createIndexFilesToPreventDirectoryListing
), $result);
}
@@ -137,7 +154,7 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
// make sure there is a difference between those folders
$result = Filesystem::directoryDiff($source, $target);
- $this->assertCount(8, $result);
+ $this->assertCount(14, $result);
Filesystem::unlinkTargetFilesNotPresentInSource($source, $target);
diff --git a/tests/PHPUnit/Unit/Tracker/ResponseTest.php b/tests/PHPUnit/Unit/Tracker/ResponseTest.php
index 93d8a70ad4..4d902ada08 100644
--- a/tests/PHPUnit/Unit/Tracker/ResponseTest.php
+++ b/tests/PHPUnit/Unit/Tracker/ResponseTest.php
@@ -16,7 +16,7 @@ use Exception;
class TestResponse extends Response {
- protected function logExceptionToErrorLog(Exception $e)
+ protected function logExceptionToErrorLog($e)
{
// prevent console from outputting the error_log message
}
diff --git a/tests/PHPUnit/Unit/UrlTest.php b/tests/PHPUnit/Unit/UrlTest.php
index 6f9c50d614..bb4a2ab1ba 100644
--- a/tests/PHPUnit/Unit/UrlTest.php
+++ b/tests/PHPUnit/Unit/UrlTest.php
@@ -73,6 +73,43 @@ class UrlTest extends \PHPUnit_Framework_TestCase
}
/**
+ * @dataProvider getProtocol
+ */
+ public function test_getCurrentScheme_ProtoHeaderShouldPrecedenceHttpsHeader($proto)
+ {
+ $_SERVER['HTTPS'] = 'on';
+ $_SERVER['HTTP_X_FORWARDED_PROTO'] = $proto;
+ $this->assertEquals($proto, Url::getCurrentScheme());
+
+ unset($_SERVER['HTTP_X_FORWARDED_PROTO']);
+ unset($_SERVER['HTTPS']);
+ }
+
+ /**
+ * @dataProvider getProtocol
+ */
+ public function test_getCurrentScheme_shouldDetectSecureFromHttpsHeader()
+ {
+ $_SERVER['HTTPS'] = 'on';
+ $this->assertEquals('https', Url::getCurrentScheme());
+
+ unset($_SERVER['HTTPS']);
+ }
+
+ /**
+ * @dataProvider getProtocol
+ */
+ public function test_getCurrentScheme_shouldBeHttpByDefault()
+ {
+ $this->assertEquals('http', Url::getCurrentScheme());
+ }
+
+ public function getProtocol()
+ {
+ return array(array('http'), array('https'));
+ }
+
+ /**
* Dataprovider for testIsLocalUrl
*/
public function getLocalUrls()
diff --git a/tests/UI/specs/Installation_spec.js b/tests/UI/specs/Installation_spec.js
index 2ee77adfec..bc24ec0248 100644
--- a/tests/UI/specs/Installation_spec.js
+++ b/tests/UI/specs/Installation_spec.js
@@ -51,8 +51,22 @@ describe("Installation", function () {
}, done);
});
+ var pageUrl;
+ it("should have already created a tmp/sessions/index.htm file to prevent directory listing", function (done) {
+ expect.screenshot('nothing_to_see_here').to.be.capture(function (page) {
+ pageUrl = page.getCurrentUrl();
+
+ // page.load will load by default the proxy ie. http://localhost/piwik/tests/PHPUnit/proxy/
+ // but we need here to check in: http://localhost/piwik/tmp/sessions/
+ page.load("../../../tmp/sessions/index.htm");
+
+ }, done);
+ });
+
it("should display the database setup page when next is clicked on the system check page", function (done) {
expect.screenshot("db_setup").to.be.capture(function (page) {
+ page.load(pageUrl);
+
page.click('.next-step .btn');
}, done);
});
@@ -88,7 +102,7 @@ describe("Installation", function () {
var pageUrl, pageUrlDe;
- it("should show Piwik PRO GmbH when language is German", function (done) {
+ it("should un-select Professional Services newsletter checkbox when language is German", function (done) {
expect.screenshot("superuser_de").to.be.capture(function (page) {
pageUrl = page.getCurrentUrl();
pageUrlDe = pageUrl + '&language=de'
diff --git a/tests/UI/specs/SegmentSelectorEditor_spec.js b/tests/UI/specs/SegmentSelectorEditor_spec.js
index 16e42a6017..b260f3abe6 100644
--- a/tests/UI/specs/SegmentSelectorEditor_spec.js
+++ b/tests/UI/specs/SegmentSelectorEditor_spec.js
@@ -141,8 +141,8 @@ describe("SegmentSelectorEditorTest", function () {
}, done);
});
- it("should correctly update the segment when its details are changed and saved", function (done) {
- expect.screenshot("updated").to.be.captureSelector(selectorsToCapture, function (page) {
+ it("should correctly should show a confirmation when changing segment definition", function (done) {
+ expect.screenshot("update_confirmation").to.be.captureSelector('.ui-dialog', function (page) {
page.click('.segmentEditorPanel .editSegmentName');
page.evaluate(function () {
$('input.edit_segment_name').val('');
@@ -163,7 +163,12 @@ describe("SegmentSelectorEditorTest", function () {
page.evaluate(function () {
$('button.saveAndApply').click();
});
+ }, done);
+ });
+ it("should correctly update the segment when saving confirmed", function (done) {
+ expect.screenshot("updated").to.be.captureSelector(selectorsToCapture, function (page) {
+ page.click('.ui-dialog button:contains(Yes)');
page.click('.segmentationContainer');
}, done);
});
diff --git a/tests/angularjs/Gruntfile.js b/tests/angularjs/Gruntfile.js
index 2e50318f95..3527b5973a 100644
--- a/tests/angularjs/Gruntfile.js
+++ b/tests/angularjs/Gruntfile.js
@@ -2,6 +2,12 @@ module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
+ karma: {
+ unit: {
+ configFile: 'karma.conf.js',
+ autoWatch: true
+ }
+ },
pkg: grunt.file.readJSON('package.json'),
watch: {
scripts: {
@@ -13,7 +19,14 @@ module.exports = function(grunt) {
},
piwikjs: {
files: ['js/piwik.js'],
- tasks: ["shell:compilePiwikJs"],
+ tasks: ["shell:compilePiwikJs", "shell:updateTracker"],
+ options: {
+ spawn: false,
+ },
+ },
+ piwikjs2: {
+ files: ['plugins/*/tracker.js',],
+ tasks: ["shell:updateTracker"],
options: {
spawn: false,
},
@@ -27,6 +40,14 @@ module.exports = function(grunt) {
cwd: 'js'
}
}
+ },
+ updateTracker: {
+ command: "php console custom-piwik-js:update --ignore-minified",
+ options: {
+ execOptions: {
+ cwd: ''
+ }
+ }
}
},
"clean-pattern": {
diff --git a/tests/angularjs/karma.conf.js b/tests/angularjs/karma.conf.js
index 9525c7e06b..780fdb6d8e 100755
--- a/tests/angularjs/karma.conf.js
+++ b/tests/angularjs/karma.conf.js
@@ -20,7 +20,7 @@ module.exports = function(config) {
"libs/bower_components/angular-animate/angular-animate.js",
'libs/bower_components/angular-mocks/angular-mocks.js',
'libs/bower_components/jquery/dist/jquery.min.js',
- "libs/bower_components/jquery-ui/jquery-ui.min.js",
+ "libs/bower_components/jquery-ui/ui/minified/jquery-ui.min.js",
"plugins/CoreHome/javascripts/require.js",
"plugins/Morpheus/javascripts/piwikHelper.js",
"plugins/Morpheus/javascripts/ajaxHelper.js",
@@ -68,7 +68,7 @@ module.exports = function(config) {
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
- browsers: ['PhantomJS'],
+ browsers: [],
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
diff --git a/tests/angularjs/package.json b/tests/angularjs/package.json
index 74b8e44936..0d8daedeed 100644
--- a/tests/angularjs/package.json
+++ b/tests/angularjs/package.json
@@ -24,5 +24,8 @@
"engines": {
"node": ">= 0.10.0"
},
- "version": "0.1.0"
+ "version": "0.1.0",
+ "devDependencies": {
+ "grunt-karma": "^2.0.0"
+ }
}
diff --git a/tests/index.html b/tests/index.html
index 9078a41907..ac14989274 100644
--- a/tests/index.html
+++ b/tests/index.html
@@ -6,8 +6,7 @@
<ul>
<li><a href="https://github.com/piwik/piwik/blob/master/tests/README.md">Setup PHPUnit tests</a></li>
- <li><a href="javascript/">Run piwik.js Javascript unit & integration tests</a>. <br/><i>Note: the Javascript tests
- are not executed in Jenkins so must be run manually on major browsers after any change to piwik.js</i></li>
+ <li><a href="javascript/">Run piwik.js Javascript unit & integration tests</a>. <br/></li>
</ul>
<p>If you are new to the wonderful world of testing, <a href='https://github.com/piwik/piwik/blob/master/tests/README.md'>see the README</a> for an introduction.</p>
diff --git a/tests/javascript/index.php b/tests/javascript/index.php
index be9af836da..c03d06ba22 100644
--- a/tests/javascript/index.php
+++ b/tests/javascript/index.php
@@ -5,6 +5,13 @@
<meta charset="utf-8">
<title>piwik.js: Unit Tests</title>
<?php
+
+$cacheBuster = md5(uniqid(mt_rand(), true));
+
+// Note: when you want to debug the piwik.js during the tests, you need to set a cache buster that is always the same
+// between requests so the browser knows it is the same file and know where to breakpoint.
+//$cacheBuster= 'nocb'; // uncomment to debug
+
$root = dirname(__FILE__) . '/../..';
try {
@@ -14,6 +21,20 @@ try {
$mysql = false;
}
+use \Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
+use \Piwik\Plugins\CustomPiwikJs\TrackingCode\JsTestPluginTrackerFiles;
+
+$targetFileName = '/tests/resources/piwik.test.js';
+$sourceFile = PIWIK_DOCUMENT_ROOT . TrackerUpdater::DEVELOPMENT_PIWIK_JS;
+$targetFile = PIWIK_DOCUMENT_ROOT . $targetFileName;
+
+file_put_contents($targetFile, '');
+
+$updater = new TrackerUpdater($sourceFile, $targetFile);
+$updater->setTrackerFiles(new JsTestPluginTrackerFiles());
+$updater->checkWillSucceed();
+$updater->update();
+
if(file_exists("stub.tpl")) {
echo file_get_contents("stub.tpl");
}
@@ -53,7 +74,7 @@ testTrackPageViewAsync();
?>
</script>
<script src="../lib/q-1.4.1/q.js" type="text/javascript"></script>
- <script src="../../js/piwik.js?rand=<?php echo md5(uniqid(mt_rand(), true)) ?>" type="text/javascript"></script>
+ <script src="../..<?php echo $targetFileName ?>?rand=<?php echo $cacheBuster ?>" type="text/javascript"></script>
<script src="../../plugins/Overlay/client/urlnormalizer.js" type="text/javascript"></script>
<script src="piwiktest.js" type="text/javascript"></script>
<link rel="stylesheet" href="assets/qunit.css" type="text/css" media="screen" />
@@ -76,9 +97,10 @@ testTrackPageViewAsync();
</style>
<script src="../../libs/bower_components/jquery/dist/jquery.min.js" type="text/javascript"></script>
<script src="assets/qunit.js" type="text/javascript"></script>
- <script src="jslint/jslint.js" type="text/javascript"></script>
+
<script type="text/javascript">
QUnit.config.reorder = false;
+ QUnit.config.altertitle = false;
function _e(id){
if (document.getElementById)
return document.getElementById(id);
@@ -434,18 +456,53 @@ function PiwikTest() {
test("JSLint", function() {
expect(1);
- var src = '<?php
+
+ stop();
+
+ $.getScript("jslint/jslint.js", function(){
+
+ var src = '<?php
+
+ // Once we use JSHint instead of jslint, we could remove a few lines below,
+ // to use instead the feature to disable jshint for the JSON2 block
+// /* jshint ignore:start */
+// // Code here will be linted with ignored by JSHint.
+// /* jshint ignore:end */
+
+
+ function getLineCountJsLintStarted($src,$contentRemovedFromPos) {
+ $contentRemoved = substr($src, 0, $contentRemovedFromPos);
+ // the JS code contain \n within the JS code, but these are not new lines
+ $contentRemovedWithoutBackslash = str_replace('\\\n', '', $contentRemoved);
+ $countOfLinesRemoved = count(explode('\\n', $contentRemovedWithoutBackslash)) - 1;
+ return $countOfLinesRemoved;
+ }
+
$src = file_get_contents('../../js/piwik.js');
+
$src = strtr($src, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
- $src = substr($src, strpos($src, '/* startjslint */'));
- echo "$src"; ?>';
+ $contentRemovedFromPos = strpos($src, '/* startjslint */');
+ $contentToJslint = substr($src, $contentRemovedFromPos);
+
+ echo "$contentToJslint"; ?>';
+
+ var result = JSLINT(src);
+ ok( result, "JSLint validation: please check the browser console for the list of jslint errors." );
+ if (console && console.log && !result) {
+ var countOfLinesRemoved = <?php echo getLineCountJsLintStarted($src,$contentRemovedFromPos); ?>;
+
+ // we fix the line numbers so they match to the line numbers in ../../js/piwik.js
+ JSLINT.errors.forEach( function (item, index) {
+ item.line += countOfLinesRemoved;
+ console.log(item);
+ });
+
+ console.log('JSLINT errors', JSLINT.errors);
+ }
+
+ start();
+ });
- var result = JSLINT(src);
- ok( result, "JSLint" );
- if (console && console.log && !result) {
- console.log('JSLINT errors', JSLINT.errors);
- }
-// alert(JSLINT.report(true));
});
test("JSON", function() {
@@ -1928,9 +1985,10 @@ function PiwikTest() {
});
test("API methods", function() {
- expect(69);
+ expect(71);
equal( typeof Piwik.addPlugin, 'function', 'addPlugin' );
+ equal( typeof Piwik.addPlugin, 'function', 'addTracker' );
equal( typeof Piwik.getTracker, 'function', 'getTracker' );
equal( typeof Piwik.getAsyncTracker, 'function', 'getAsyncTracker' );
@@ -1995,6 +2053,7 @@ function PiwikTest() {
equal( typeof tracker.trackGoal, 'function', 'trackGoal' );
equal( typeof tracker.trackLink, 'function', 'trackLink' );
equal( typeof tracker.trackPageView, 'function', 'trackPageView' );
+ equal( typeof tracker.trackRequest, 'function', 'trackRequest' );
// content
equal( typeof tracker.trackAllContentImpressions, 'function', 'trackAllContentImpressions' );
equal( typeof tracker.trackVisibleContentImpressions, 'function', 'trackVisibleContentImpressions' );
@@ -2068,8 +2127,66 @@ function PiwikTest() {
var customTracker = Piwik.getTracker('customTrackerUrl', '71');
var customVisitorId = customTracker.getVisitorId();
notEqual(Piwik.getAsyncTracker().getVisitorId(), customVisitorId, 'Visitor ID are different on different websites');
+ });
+
+ test("Managing multiple trackers", function() {
+ expect(23);
+
+ var asyncTracker = Piwik.getAsyncTracker();
+ var i, tracker;
+
+ // TEST addTracker()
+
+ var trackers = [
+ {idSite: '71', url: 'customTrackerUrl', expectedIdSite: '71', expectedUrl: 'customTrackerUrl'},
+ {idSite: 72, url: 'customTrackerUrl', expectedIdSite: 72, expectedUrl: 'customTrackerUrl'},
+ {idSite: 72, url: 'anotherTrackerUrl', expectedIdSite: 72, expectedUrl: 'anotherTrackerUrl'},
+ {idSite: 73, url: null, expectedIdSite: 73, expectedUrl: asyncTracker.getTrackerUrl()}
+ ]
+
+ // add Tracker returns created tracker instance
+ for (i = 0; i < trackers.length; i++) {
+ tracker = trackers[i];
+ var createdTracker = asyncTracker.addTracker(tracker.url, tracker.idSite);
+ equal(tracker.expectedIdSite, createdTracker.getSiteId(), 'addTracker() was created with correct idsite ' + tracker.expectedIdSite);
+ equal(tracker.expectedUrl, createdTracker.getTrackerUrl(), 'addTracker() was created with correct piwikUrl ' + tracker.expectedUrl);
+ }
+
+ // TEST getAsyncTracker()
+
+ // by default still returns first tracker
+ var firstTracker = Piwik.getAsyncTracker();
+ equal(firstTracker.getSiteId(), asyncTracker.getSiteId(), 'getAsyncTracker() async same site id');
+ equal(firstTracker.getTrackerUrl(), asyncTracker.getTrackerUrl(), 'getAsyncTracker() async same getTrackerUrl()');
+ equal(firstTracker, asyncTracker, 'getAsyncTracker() async same tracker instance');
+
+
+ try {
+ // should throw exception when no idSite given
+ asyncTracker.addTracker(tracker.url);
+ ok(false, 'addTracker() without siteId expected exception has not been triggered');
+ } catch (e) {
+ ok(true, 'addTracker() siteId expected exception has been triggered');
+ }
+
+ // getting a specific tracker instance
+
+ for (i = 0; i < trackers.length; i++) {
+ tracker = trackers[i];
+ var fetchedTracker = Piwik.getAsyncTracker(tracker.url, tracker.idSite);
+ equal(tracker.expectedIdSite, fetchedTracker.getSiteId(), 'getAsyncTracker() correct site id ' + tracker.expectedIdSite);
+ equal(tracker.expectedUrl, fetchedTracker.getTrackerUrl(), 'getAsyncTracker() correct tracker url ' + tracker.expectedUrl);
+ }
+
+ // getting an unknown instance
+ equal(null, Piwik.getAsyncTracker('unknownUrl', 72), 'getAsyncTracker() piwikUrl not known');
+ equal(null, Piwik.getAsyncTracker('customTrackerUrl', 999982), 'getAsyncTracker() piwikSiteId not known');
+ var fetchedTracker = Piwik.getAsyncTracker('customTrackerUrl', '71');
+ var createdTracker = fetchedTracker.addTracker(null, 55);
+ equal('customTrackerUrl', createdTracker.getTrackerUrl(), 'addTracker() should be default use tracker url of current tracker, not first tracker');
+ asyncTracker.removeAllAsyncTrackersButFirst();
});
test("AnalyticsTracker alias", function() {
@@ -2244,7 +2361,7 @@ function PiwikTest() {
});
test("Tracker setDomains(), isSiteHostName(), isSiteHostPath(), and getLinkIfShouldBeProcessed()", function() {
- expect(154);
+ expect(165);
var tracker = Piwik.getTracker();
var initialDomains = tracker.getDomains();
@@ -2262,23 +2379,31 @@ function PiwikTest() {
// test wildcards
tracker.setDomains( ['*.Example.com'] );
- propEqual(["*.Example.com", domainAlias], tracker.getDomains()), 'should add domainAlias';
+ propEqual(tracker.getDomains(), ["*.Example.com", domainAlias], 'should add domainAlias');
+
+ tracker.setDomains( ['*.Example.com/'] );
+ propEqual(tracker.getDomains(), ["*.Example.com/", domainAlias], 'should add domainAlias if domain has a slash as it is not a path');
+
+ tracker.setDomains( ['*.Example.com/*'] );
+ propEqual(tracker.getDomains(), ["*.Example.com/*", domainAlias], 'should add domainAlias if domain has /* as it is not a path');
tracker.setDomains( '*.Example.org' );
- propEqual(["*.Example.org", domainAlias], tracker.getDomains()), 'should handle a string';
+ propEqual(tracker.getDomains(), ["*.Example.org", domainAlias], 'should handle a string');
+
+ tracker.setDomains( ['*.Example.com/path'] );
+ propEqual(tracker.getDomains(), ["*.Example.com/path"], 'if any other domain has path should not add domainAlias');
tracker.setDomains( ['*.Example.com', '*.example.ORG'] );
- propEqual(["*.Example.com", '*.example.ORG', domainAlias], tracker.getDomains()), 'should be able to set many domains';
+ propEqual(tracker.getDomains(), ["*.Example.com", '*.example.ORG', domainAlias], 'should be able to set many domains');
tracker.setDomains( [] );
- propEqual([domainAlias], tracker.getDomains()), 'setting an empty array should reset the list';
+ propEqual(tracker.getDomains(), [domainAlias], 'setting an empty array should reset the list');
tracker.setDomains( ['*.Example.com', domainAlias + '/path', '*.example.ORG'] );
- propEqual(['*.Example.com', domainAlias + '/path', '*.example.ORG'], tracker.getDomains()), 'if domain alias is already given should not add domainAlias';
+ propEqual(tracker.getDomains(), ['*.Example.com', domainAlias + '/path', '*.example.ORG'], 'if domain alias is already given should not add domainAlias');
tracker.setDomains( ['.' + domainAlias + '/path'] );
- propEqual(['.' + domainAlias + '/path'], tracker.getDomains()), 'if domain alias with subdomain is already given should not add domainAlias';
-
+ propEqual(tracker.getDomains(), ['.' + domainAlias + '/path'], 'if domain alias with subdomain is already given should not add domainAlias');
/**
* isSiteHostName ()
@@ -2339,16 +2464,20 @@ function PiwikTest() {
// with path
tracker.setDomains( '.piwik.org/path' );
+ ok( isSiteHostPath('piwik.org', 'path'), 'isSiteHostPath("piwik.org", "path")' );
ok( isSiteHostPath('piwik.org', '/path'), 'isSiteHostPath("piwik.org", "/path")' );
ok( isSiteHostPath('piwik.org', '/path/'), 'isSiteHostPath("piwik.org", "/path/")' );
ok( !isSiteHostPath('piwik.org', '/path.htm'), 'isSiteHostPath("piwik.org", "/path.htm")' );
ok( isSiteHostPath('piwik.org', '/path/test'), 'isSiteHostPath("piwik.org", "/path/test)' );
ok( isSiteHostPath('dev.piwik.org', '/path'), 'isSiteHostPath("dev.piwik.org", "/path")' );
+ ok( !isSiteHostPath('piwik.com', ''), '!isSiteHostPath("piwik.com", "")');
+ ok( !isSiteHostPath('piwik.org', '/'), 'isSiteHostPath("piwik.org", "/")' );
ok( !isSiteHostPath('piwik.org', '/pat'), '!isSiteHostPath("piwik.org", "/pat")');
ok( !isSiteHostPath('piwik.org', '.com'), '!isSiteHostPath("piwik.org", ".com")');
ok( !isSiteHostPath('piwik.com', '/path'), '!isSiteHostPath("piwik.com", "/path")');
ok( !isSiteHostPath('piwik.com', '/path/test'), '!isSiteHostPath("piwik.com", "/path/test")');
- ok( !isSiteHostPath('piwik.com', ''), '!isSiteHostPath("piwik.com", "/path/test")');
+ ok( !isSiteHostPath('piwik.com', 'path/test'), '!isSiteHostPath("piwik.com", "/path/test")');
+ ok( !isSiteHostPath('piwik.com', 'path/test/'), '!isSiteHostPath("piwik.com", "/path/test")');
// no path
var domains = ['.piwik.org', 'piwik.org', '*.piwik.org', '.piwik.org/'];
@@ -2373,19 +2502,23 @@ function PiwikTest() {
}
// multiple paths / domains
- tracker.setDomains( ['piwik.org/path', 'piwik.org/foo', 'piwik.org/bar/baz', '.piwik.pro/test'] );
- ok( isSiteHostPath('piwik.pro', '/test/bar'), 'isSiteHostPath("piwik.pro", "/test/bar")' );
+ tracker.setDomains( ['piwik.org/path', 'piwik.org/foo', 'piwik.org/bar/baz', '.piwik.xyz/test'] );
+ ok( isSiteHostPath('piwik.xyz', 'test/bar'), 'isSiteHostPath("piwik.xyz", "test/bar")' );
+ ok( isSiteHostPath('piwik.xyz', '/test/bar'), 'isSiteHostPath("piwik.xyz", "/test/bar")' );
ok( !isSiteHostPath('piwik.org', '/foobar/'), 'isSiteHostPath("piwik.org", "/foobar/")' );
+ ok( !isSiteHostPath('piwik.org', 'foobar/'), 'isSiteHostPath("piwik.org", "foobar/")' );
+ ok( !isSiteHostPath('piwik.org', 'foobar'), 'isSiteHostPath("piwik.org", "foobar")' );
ok( isSiteHostPath('piwik.org', '/foo/bar'), 'isSiteHostPath("piwik.org", "/foo/bar")' );
ok( isSiteHostPath('piwik.org', '/bar/baz/foo'), 'isSiteHostPath("piwik.org", "/bar/baz/foo/")' );
ok( !isSiteHostPath('piwik.org', '/bar/ba'), 'isSiteHostPath("piwik.org", "/bar/ba")' );
ok( isSiteHostPath('piwik.org', '/path/test'), 'isSiteHostPath("piwik.org", "/path/test")' );
ok( isSiteHostPath('piwik.org', '/path/test.htm'), 'isSiteHostPath("piwik.org", "/path/test.htm")' );
- ok( isSiteHostPath('dev.piwik.pro', '/test'), 'isSiteHostPath("dev.piwik.pro", "/test")' );
- ok( !isSiteHostPath('dev.piwik.pro', 'something/test.htm'), 'isSiteHostPath("dev.piwik.pro", "something/test")' );
- ok( !isSiteHostPath('dev.piwik.pro', '/'), 'isSiteHostPath("dev.piwik.pro", "/")' );
+ ok( isSiteHostPath('dev.piwik.xyz', '/test'), 'isSiteHostPath("dev.piwik.xyz", "/test")' );
+ ok( !isSiteHostPath('dev.piwik.xyz', 'something/test.htm'), 'isSiteHostPath("dev.piwik.xyz", "something/test")' );
+ ok( !isSiteHostPath('dev.piwik.xyz', '/'), 'isSiteHostPath("dev.piwik.xyz", "/")' );
+ ok( !isSiteHostPath('dev.piwik.xyz', ''), 'isSiteHostPath("dev.piwik.xyz", "")' );
ok( !isSiteHostPath('piwik.org', '/'), 'isSiteHostPath("piwik.org", "/")' );
- ok( !isSiteHostPath('piwik.pro', '/'), 'isSiteHostPath("piwik.pro", "/")' );
+ ok( !isSiteHostPath('piwik.xyz', '/'), 'isSiteHostPath("piwik.xyz", "/")' );
ok( !isSiteHostPath('piwik.org', '/index.htm'), 'isSiteHostPath("piwik.org", "/index.htm")' );
ok( !isSiteHostPath('piwik.org', '/anythingelse'), 'isSiteHostPath("piwik.org", "/anythingelse")' );
ok( !isSiteHostPath('another.org', '/'), 'isSiteHostPath("another.org", "/")' );
@@ -2423,12 +2556,11 @@ function PiwikTest() {
return link;
}
- tracker.setDomains( ['.piwik.org/path', '.piwik.org/foo', '.piwik.org/bar/baz', '.piwik.pro/test'] );
+ tracker.setDomains( ['.piwik.org/path', '.piwik.org/foo', '.piwik.org/bar/baz', '.piwik.xyz/test'] );
// they should not be detected as outlink as they match one of the domains
equal(undefined, getLinkIfShouldBeProcessed(createLink('http://www.piwik.org/foo/bar')), 'getLinkIfShouldBeProcessed http://www.piwik.org/foo/bar matches .piwik.org/foo')
equal(undefined, getLinkIfShouldBeProcessed(createLink('http://piwik.org/foo/bar')), 'getLinkIfShouldBeProcessed http://piwik.org/foo/bar matches .piwik.org/foo')
- equal(undefined, getLinkIfShouldBeProcessed(createLink('piwik.org/foo/bar')), 'getLinkIfShouldBeProcessed missing protocol only domain given')
equal(undefined, getLinkIfShouldBeProcessed(createLink('//piwik.org/foo/bar')), 'getLinkIfShouldBeProcessed no protcol but url starts with //')
equal(undefined, getLinkIfShouldBeProcessed(createLink('http://www.piwik.org/foo?x=1')), 'getLinkIfShouldBeProcessed url with query parameter should detect correct path')
equal(undefined, getLinkIfShouldBeProcessed(createLink('http://www.piwik.org/foo')), 'getLinkIfShouldBeProcessed path is same as allowed path')
@@ -2438,6 +2570,7 @@ function PiwikTest() {
equal(undefined, getLinkIfShouldBeProcessed(createLink('http://WWW.PIWIK.ORG/BAR/BAZ')), 'getLinkIfShouldBeProcessed should test everything lowercase')
equal(undefined, getLinkIfShouldBeProcessed(createLink('http://www.piwik.org/bar/baz/x/y/z')), 'getLinkIfShouldBeProcessed many appended paths')
equal(undefined, getLinkIfShouldBeProcessed(createLink('http://www.piwik.org/bar/baz?test=1&foo=bar')), 'getLinkIfShouldBeProcessed another test with query parameter and multiple directories')
+ equal('link', getLinkIfShouldBeProcessed(createLink('piwik.org/foo/bar')).type, 'getLinkIfShouldBeProcessed missing protocol only domain given should be outlink as current domain not given in setDomains')
propEqual({
"href": "http://www.piwik.org/foo/download.apk",
"type": "download"
@@ -2451,9 +2584,9 @@ function PiwikTest() {
"type": "download"
}, getLinkIfShouldBeProcessed(createLink('http://www.piwik.com/foobar/download.apk')), 'getLinkIfShouldBeProcessed should detect download even if it goes to different domain')
propEqual({
- "href": "http://www.piwik.pro/foo/",
+ "href": "http://www.piwik.xyz/foo/",
"type": "link"
- }, getLinkIfShouldBeProcessed(createLink('http://www.piwik.pro/foo/')), 'getLinkIfShouldBeProcessed path matches but domain not so outlink')
+ }, getLinkIfShouldBeProcessed(createLink('http://www.piwik.xyz/foo/')), 'getLinkIfShouldBeProcessed path matches but domain not so outlink')
propEqual({
"href": "http://www.piwik.org/bar",
"type": "link"
@@ -2642,7 +2775,7 @@ function PiwikTest() {
function getVisitorIdFromCookie(tracker) {
visitorCookieName = tracker.hook.test._getCookieName('id');
visitorCookieValue = tracker.hook.test._getCookie(visitorCookieName);
- return visitorCookieValue.split('.')[0];
+ return visitorCookieValue ? visitorCookieValue.split('.')[0] : '';
}
test("User ID and Visitor UUID", function() {
@@ -2869,6 +3002,28 @@ function PiwikTest() {
ok( diffTime >= 2000, 'setLinkTrackingTimer()' );
});
+ test("Generate error messages when calling an undefined API method", function() {
+ expect(2);
+
+ // temporarily reset the console error logger so our errors don't show up in the console log while running tests.
+ var console = {};
+ var errorCallBack = console.error;
+ window.console.error = function() {};
+
+ // Calling undefined methods should generate an error
+ function callNonExistingMethod() {
+ _paq.push(['NonExistingFunction should error and display the error in the console']);
+ }
+ function callNonExistingMethodWithParameter() {
+ _paq.push(['NonExistingFunction should not error', 'this is a parameter']);
+ }
+
+ throws( callNonExistingMethod, /was not found in "_paq" variable/, 'Expected to raise an error when calling an undefined method.');
+ throws( callNonExistingMethodWithParameter, /was not found in "_paq" variable/, 'Expected to raise an error when calling an undefined method with parameters.');
+
+ window.console.error = errorCallBack;
+ });
+
test("Overlay URL Normalizer", function() {
expect(23);
@@ -2956,7 +3111,65 @@ function PiwikTest() {
equal( getPiwikUrlForOverlay('/piwik.php?version=1234'), '/', 'only piwik.php with leading slash with query' );
});
-<?php
+ function generateAnIframeInDocument() {
+ // Generate an iframe, and call the method inside the iframe to check it returns true
+ var hostAndPath = $(location).attr('pathname');
+ var iframe = document.createElement('iframe');
+ iframe.id = "iframeTesting";
+ iframe.style = "display : none";
+ var html = '\
+ <html><body> \
+ <scr' + 'ipt src="' + hostAndPath + '../../js/piwik.js?rand=<?php echo $cacheBuster; ?>" type="text/javascript"></sc' + 'ript> \
+ <scr' + 'ipt src="' + hostAndPath + 'piwiktest.js" type="text/javascript"></sc' + 'ript> \
+ <scr' + 'ipt src="' + hostAndPath + '../../libs/bower_components/jquery/dist/jquery.min.js" type="text/javascript"></sc' + 'ript> \
+ <scr' + 'ipt type="text/javascript"> \
+ window.onload = function() { \
+ $(document).ready(function () { \
+ window.iframeIsLoaded = true; \
+ window.isInsideIframe = function () { \
+ var tracker = Piwik.getTracker(); \
+ return tracker.hook.test._isInsideAnIframe(); \
+ }; \
+ });\
+ }; \
+ window.iframeIsLoaded = false; \
+ \
+ </sc' + 'ript> \
+ </body></html>\
+ ';
+
+ document.body.appendChild(iframe);
+ iframe.contentWindow.document.open();
+ iframe.contentWindow.document.write(html);
+ iframe.contentWindow.document.close();
+
+ };
+
+ test("isInsideAnIframe", function() {
+
+ expect(6);
+ var tracker = Piwik.getTracker();
+ var isInsideAnIframe = tracker.hook.test._isInsideAnIframe;
+ equal( typeof isInsideAnIframe, 'function', 'isInsideAnIframe' );
+ equal( isInsideAnIframe(), false, 'these tests are not running inside an iframe, got: ' + isInsideAnIframe());
+ equal( !isInsideAnIframe(), true, 'these tests are not running inside an iframe');
+ equal( document.getElementById("iframeTesting"), undefined, 'the iframe is not loaded yet...');
+
+ generateAnIframeInDocument();
+
+
+ stop();
+ setTimeout(function() {
+ equal( document.getElementById("iframeTesting").contentWindow.iframeIsLoaded, true, 'the iframe is loaded now!');
+ equal( document.getElementById("iframeTesting").contentWindow.isInsideIframe(), true, 'inside an iframe, isInsideAnIframe() returns true');
+
+ start();
+
+ }, 4000); // wait for iframe to load
+
+ });
+
+ <?php
if ($mysql) {
?>
@@ -2974,7 +3187,7 @@ if ($mysql) {
});
test("tracking", function() {
- expect(114);
+ expect(119);
// Prevent Opera and HtmlUnit from performing the default action (i.e., load the href URL)
var stopEvent = function (evt) {
@@ -3153,6 +3366,9 @@ if ($mysql) {
var visitorIdEnd = tracker.getVisitorId();
ok( visitorIdStart == visitorIdEnd, "tracker.getVisitorId() same at the start and end of process");
+ // Tracker custom request
+ tracker.trackRequest('myFoo=bar&baz=1');
+
// Custom variables
tracker.storeCustomVariablesInCookie();
tracker.setCookieNamePrefix("PREFIX");
@@ -3228,8 +3444,12 @@ if ($mysql) {
tracker3.addEcommerceItem("SKU NO PRICE NO QUANTITY", "PRODUCT NAME 3", "CATEGORY", "", "" );
tracker3.addEcommerceItem("SKU ONLY" );
tracker3.trackEcommerceCartUpdate( 555.55 );
+
tracker3.trackEcommerceOrder( "ORDER ID YES", 666.66, 333, 222, 111, 1 );
+ // the same order tracked once more, should have no items
+ tracker3.trackEcommerceOrder( "ORDER WITHOUT ANY ITEM", 777, 444, 222, 111, 1 );
+
// do not track
tracker3.setDoNotTrack(false);
@@ -3279,12 +3499,21 @@ if ($mysql) {
window.onerror = oldOnError;
// Testing JavaScriptErrorTracking END
+ // add tracker
+ _paq.push(["addTracker", null, 13]);
+ var createdNewTracker = Piwik.getAsyncTracker(null, 13);
+ equal(13, createdNewTracker.getSiteId(), "addTracker() was actually added");
+
+ createdNewTracker.setCustomData({ "token" : getToken() });
+ _paq.push(['trackPageView', 'twoTrackers']);
+ tracker.removeAllAsyncTrackersButFirst();
+
stop();
setTimeout(function() {
xhr.open("GET", "piwik.php?requests=" + getToken(), false);
xhr.send(null);
results = xhr.responseText;
- equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "33", "count tracking events" );
+ equal( (/<span\>([0-9]+)\<\/span\>/.exec(results))[1], "37", "count tracking events" );
// firing callback
ok( trackLinkCallbackFired, "trackLink() callback fired" );
@@ -3318,6 +3547,9 @@ if ($mysql) {
ok( /DoTrack/.test( results ), "setDoNotTrack(false)" );
ok( ! /DoNotTrack/.test( results ), "setDoNotTrack(true)" );
+ // custom tracking request
+ ok( /myFoo=bar&baz=1&idsite=1/.test( results ), "trackRequest sends custom parameters");
+
// Test Custom variables
ok( /SaveCustomVariableCookie.*&cvar=%7B%222%22%3A%5B%22cookiename2PAGE%22%2C%22cookievalue2PAGE%22%5D%7D.*&_cvar=%7B%221%22%3A%5B%22cookiename%22%2C%22cookievalue%22%5D%2C%222%22%3A%5B%22cookiename2%22%2C%22cookievalue2%22%5D%7D/.test(results), "test custom vars are set");
@@ -3361,6 +3593,9 @@ if ($mysql) {
// Cart update
ok( /idgoal=0&revenue=555.55&ec_items=%5B%5B%22SKU%20PRODUCT%22%2C%22random%22%2C%22random%20PRODUCT%20CATEGORY%22%2C11.1111%2C2%5D%2C%5B%22SKU%20ONLY%20SKU%22%2C%22%22%2C%22%22%2C0%2C1%5D%2C%5B%22SKU%20ONLY%20NAME%22%2C%22PRODUCT%20NAME%202%22%2C%22%22%2C0%2C1%5D%2C%5B%22SKU%20NO%20PRICE%20NO%20QUANTITY%22%2C%22PRODUCT%20NAME%203%22%2C%22CATEGORY%22%2C0%2C1%5D%2C%5B%22SKU%20ONLY%22%2C%22%22%2C%22%22%2C0%2C1%5D%5D/.test( results ), "logEcommerceCartUpdate() with items" );
+ // Ecommerce order recorded twice, but each order empties the cart/list of items, so this order is empty of items
+ ok( /idgoal=0&ec_id=ORDER%20WITHOUT%20ANY%20ITEM&revenue=777&ec_st=444&ec_tx=222&ec_sh=111&ec_dt=1&ec_items=%5B%5D/.test( results ), "logEcommerceOrder() called twice, second time has no item" );
+
// parameters inserted by plugin hooks
ok( /testlog/.test( results ), "plugin hook log" );
ok( /testlink/.test( results ), "plugin hook link" );
@@ -3376,6 +3611,9 @@ if ($mysql) {
ok( /e_c=JavaScript%20Errors&e_a=http%3A%2F%2Fpiwik.org%2Fpath%2Fto%2Ffile.js%3Fcb%3D34343%3A44%3A12&e_n=Uncaught%20Error%3A%20The%20message&idsite=1/.test( results ), "enableJSErrorTracking() function with predefined onerror event");
ok( /e_c=JavaScript%20Errors&e_a=http%3A%2F%2Fpiwik.org%2Fpath%2Fto%2Ffile.js%3Fcb%3D3kfkf%3A45&e_n=Second%20Error%3A%20With%20less%20data&idsite=1/.test( results ), "enableJSErrorTracking() function without predefined onerror event and less parameters");
+ ok( /piwik.php\?action_name=twoTrackers&idsite=1&/.test( results ), "addTracker() trackPageView() sends request to both Piwik instances");
+ ok( /piwik.php\?action_name=twoTrackers&idsite=13&/.test( results ), "addTracker() trackPageView() sends request to both Piwik instances");
+
start();
}, 5000);
});
@@ -4089,6 +4327,14 @@ function customAddEventListener(element, eventType, eventHandler, useCapture) {
}
})(PiwikTest);
</script>
+
+<?php
+ include_once $root . '/core/Filesystem.php';
+ $files = \Piwik\Filesystem::globr($root . '/plugins/*/tests/javascript', 'index.php');
+ foreach ($files as $file) {
+ include_once $file;
+ }
+?>
<div id="jashDiv">
<a href="#" onclick="javascript:loadJash();" title="Open JavaScript Shell"><img id="title" src="gnome-terminal.png" border="0" width="24" height="24" /></a>
diff --git a/tests/javascript/piwiktest.js b/tests/javascript/piwiktest.js
index 8430f54055..c535b9b132 100644
--- a/tests/javascript/piwiktest.js
+++ b/tests/javascript/piwiktest.js
@@ -44,7 +44,8 @@ Piwik.addPlugin('testPlugin', {
'_resolveRelativeReference : resolveRelativeReference,' +
'_addEventListener : addEventListener,' +
'_prefixPropertyName : prefixPropertyName,' +
- '_getPiwikUrlForOverlay : getPiwikUrlForOverlay' +
+ '_getPiwikUrlForOverlay : getPiwikUrlForOverlay, ' +
+ '_isInsideAnIframe : isInsideAnIframe' +
'}'
);
},
diff --git a/tests/resources/extractSearchEngineInformationFromUrlTests.yml b/tests/resources/extractSearchEngineInformationFromUrlTests.yml
index 6043e0d32f..c300e768bc 100644
--- a/tests/resources/extractSearchEngineInformationFromUrlTests.yml
+++ b/tests/resources/extractSearchEngineInformationFromUrlTests.yml
@@ -284,25 +284,6 @@
engine: 'Baidu'
keywords: 'test3'
-# Google SSL hidden keyword not defined
-- url: 'http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CC&url=http%3A%2F%2Fpiwik.org%2F&ei=&usg='
- engine: 'Google'
- keywords: false
-
-# Yet another change http://googlewebmastercentral.blogspot.ca/2012/03/upcoming-changes-in-googles-http.html
-- url: 'https://www.google.com/'
- engine: 'Google'
- keywords: false
-
-- url: 'https://www.google.co.uk/'
- engine: 'Google'
- keywords: false
-
-# without trailing slash
-- url: 'https://www.google.co.uk'
- engine: 'Google'
- keywords: false
-
- url: 'http://search.naver.com/search.naver?where=nexearch&query=FAU+&x=0&y=0&sm=top_hty&fbm=1&ie=utf8'
engine: 'Naver'
keywords: 'fau'
@@ -320,21 +301,6 @@
engine: 'Daum'
keywords: '검색 질문형 검색어 결혼 후 걱정 1위'
-# DDG
-- url: 'http://duckduckgo.com/post.html'
- engine: 'DuckDuckGo'
- keywords: false
-
-# Google images no keyword
-- url: 'http://www.google.com/imgres?hl=en&client=ubuntu&hs=xDb&sa=X&channel=fs&biw=1920&bih=1084&tbm=isch&prmd=imvns&tbnid=5i7iz7u4LPSSrM:&imgrefurl=http://helloworld/trac/wiki/HowToSetupDevelopmentEnvironmentWindows&docid=tWN9OesMyOTqsM&imgurl=http://helloworld.org/trac/raw-attachment/wiki/HowToSetupDevelopmentEnvironmentWindows/eclipse-preview.jpg&w=1000&h=627&ei=pURoT67BEdT74QTUzYiSCQ&zoom=1&iact=hc&vpx=1379&vpy=548&dur=513&hovh=178&hovw=284&tx=134&ty=105&sig=108396332168858896950&page=1&tbnh=142&tbnw=227&start=0&ndsp=37&ved=1t:429,r:5,s:0'
- engine: 'Google Images'
- keywords: false
-
-# Google images no keyword next try
-- url: 'http://www.google.fr/imgres?hl=en&biw=1680&bih=925&gbv=2&tbm=isch&tbnid=kBma1eg8aVOKoM:&imgrefurl=http://www.squido.com/research-keywords&docid=YSY3GQh3O8dkjM&imgurl=http://i3.squidocdn.com/resize/squidoo_images/590/draft_lens10233921module148408128photo_1298307262Research_keywords_6.jpg&w=590&h=412&ei=_OVZT4_3EInQ8gOWuqXbDg&zoom=1&iact=hc&vpx=164&vpy=205&dur=33&hovh=188&hovw=269&tx=137&ty=89&sig=113944581904793140725&page=1&tbnh=109&tbnw=156&start=0&ndsp=42&ved=1t:429,r:0,s:0www.google.fr/imgres?hl=en&biw=1680&bih=925&gbv=2&tbm=isch&tbnid=kBma1eg8aVOKoM:&imgrefurl=http://www.squido.com/research-keywords&docid=YSY3GQh3O8dkjM&imgurl=http://i3.squidocdn.com/resize/squidoo_images/590/draft_lens10233921module148408128photo_1298307262Research_keywords_6.jpg&w=590&h=412&ei=_OVZT4_3EInQ8gOWuqXbDg&zoom=1&iact=hc&vpx=164&vpy=205&dur=33&hovh=188&hovw=269&tx=137&ty=89&sig=113944581904793140725&page=1&tbnh=109&tbnw=156&start=0&ndsp=42&ved=1t:429,r:0,s:0'
- engine: 'Google Images'
- keywords: false
-
# conduit.com
- url: 'http://images.search.conduit.com/ImagePreview/?q=test+5&ctid=CT2431245&SearchSource=13&PageSource=HomePage&start=105&pos=33'
engine: 'Conduit.com'
@@ -484,15 +450,58 @@
engine: 'Sputnik'
keywords: 'микро'
-# No keyword
- url: 'http://yandex.ru/clck/jsredir?from=yandex.ru;yandsearch;web;;&text=&etext=385.4_2Hh6u_q9NEfpXpGpdVughcGncWYG-_kwHJA-7QxQ8v4xvt5Q2aAB7TvvUxHLtacHMltCoYGQFFmIdiXaIT-_yiHqjEJoZKVdHIXJylYsQ5TJuxRtqCDA0zUi_xlatVD6kx219rIP4Q4a7j9E7-2U88ZpCZwGXuhRws6LASTZUIJRfiPbVdxjIn2Qu5bCtcGKIQBqGa567Czx019cxaPvNAWQQ_8MIJjUgFHzg2vO_XvlSMmKOcooZNX5UzqgJAnaioMW7884jsYEKwXebrij39unXyWKnLXDX15607fkXqQFGIC_tp8zvjXq0ynizqcdQcfkHnZG-zxxPqCoALAWj47hwRCZtLGinfqMatmzFWG7Yo7eWxScEHyMI2J89OU2ZjpuHog0VyZpSb3hN17-CdHWEeN_ii1mLG_J24ftGMEpbWOeH-M3fZeAtCzmq0XUFchFAbVvm9Xmk8I2M-4A.66cd118e1c9292f7ec030c8580f6912eae4ac700&uuid=&state=AiuY0DBWFJ4ePaEse6rgeAjgs2pI3DW99KUdgowt9XsGes-COYeAtjuEaMUoBSHP2gxXC4630Mz4aEvXYUCXRTGAgAQwM7IGD-gsizkhSmBNCEfle91ZI3guOwMFOli3aeHzkqoQeuyYhvz_XwXodFz8gB8yMp6IgAL52sHwR5edKVNpZtbPIFNbLDRYIxJbYQciYGnLnCw_i584OfCtQO-zjBBGMlwoQFtGet-Xvmw&data=UlNrNmk5WktYejR0eWJFYk1LdmtxdE5aS05CUWU0alhkSkF1MEpOb0Jrc0dpbmNsUGhaVjljRWt6R0VackFURk5sM1psNlVKMWh6djhYazhRT1psQTdHamFGSFJacDFhQjdfbHJQU05jeDJMRHV0MTJmRG53Zw&b64e=2&sign=9072743a841f27dd5e766c4b57fa5138&keyno=0&l10n=ru'
engine: 'Yandex'
keywords: ''
+##########################################
+# No keyword tests
- url: 'http://r.search.yahoo.com/_ylt=A9mSs2YFMt1ThykAAaOA3YlQ;_ylu=X3oDMTBydWpobjZlBHNlYwNzcgRwb3MDMQRjb2xvA2lyMgR2dGlkAw--/RV=2/RE=1407033989/RO=10/RU=http://www.something.com//RK=0/RS=YOw3nEcdnM8kysqLyl4DzpAHnDo-'
engine: 'Yahoo!'
keywords: false
+- url: 'https://search.disconnect.me/searchTerms/serp?search=da616d2a-c376-4469-84be-8f38e4573e32'
+ engine: 'DisconnectSearch'
+ keywords: false
+
+- url: 'https://ixquick.com/do/asearch'
+ engine: 'Ixquick'
+ keywords: false
+
+# DuckDuckGo never provides a keyword
+- url: 'http://duckduckgo.com/post.html'
+ engine: 'DuckDuckGo'
+ keywords: false
+
+## Google Images provides none
+- url: 'http://www.google.com/imgres?hl=en&client=ubuntu&hs=xDb&sa=X&channel=fs&biw=1920&bih=1084&tbm=isch&prmd=imvns&tbnid=5i7iz7u4LPSSrM:&imgrefurl=http://helloworld/trac/wiki/HowToSetupDevelopmentEnvironmentWindows&docid=tWN9OesMyOTqsM&imgurl=http://helloworld.org/trac/raw-attachment/wiki/HowToSetupDevelopmentEnvironmentWindows/eclipse-preview.jpg&w=1000&h=627&ei=pURoT67BEdT74QTUzYiSCQ&zoom=1&iact=hc&vpx=1379&vpy=548&dur=513&hovh=178&hovw=284&tx=134&ty=105&sig=108396332168858896950&page=1&tbnh=142&tbnw=227&start=0&ndsp=37&ved=1t:429,r:5,s:0'
+ engine: 'Google Images'
+ keywords: false
+
+- url: 'http://www.google.fr/imgres?hl=en&biw=1680&bih=925&gbv=2&tbm=isch&tbnid=kBma1eg8aVOKoM:&imgrefurl=http://www.squido.com/research-keywords&docid=YSY3GQh3O8dkjM&imgurl=http://i3.squidocdn.com/resize/squidoo_images/590/draft_lens10233921module148408128photo_1298307262Research_keywords_6.jpg&w=590&h=412&ei=_OVZT4_3EInQ8gOWuqXbDg&zoom=1&iact=hc&vpx=164&vpy=205&dur=33&hovh=188&hovw=269&tx=137&ty=89&sig=113944581904793140725&page=1&tbnh=109&tbnw=156&start=0&ndsp=42&ved=1t:429,r:0,s:0www.google.fr/imgres?hl=en&biw=1680&bih=925&gbv=2&tbm=isch&tbnid=kBma1eg8aVOKoM:&imgrefurl=http://www.squido.com/research-keywords&docid=YSY3GQh3O8dkjM&imgurl=http://i3.squidocdn.com/resize/squidoo_images/590/draft_lens10233921module148408128photo_1298307262Research_keywords_6.jpg&w=590&h=412&ei=_OVZT4_3EInQ8gOWuqXbDg&zoom=1&iact=hc&vpx=164&vpy=205&dur=33&hovh=188&hovw=269&tx=137&ty=89&sig=113944581904793140725&page=1&tbnh=109&tbnw=156&start=0&ndsp=42&ved=1t:429,r:0,s:0'
+ engine: 'Google Images'
+ keywords: false
+
+# Google SSL hidden keyword not defined
+- url: 'http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CC&url=http%3A%2F%2Fpiwik.org%2F&ei=&usg='
+ engine: 'Google'
+ keywords: false
+
+# Yet another change http://googlewebmastercentral.blogspot.ca/2012/03/upcoming-changes-in-googles-http.html
+- url: 'https://www.google.com/'
+ engine: 'Google'
+ keywords: false
+
+- url: 'https://www.google.co.uk/'
+ engine: 'Google'
+ keywords: false
+
+# without trailing slash
+- url: 'https://www.google.co.uk'
+ engine: 'Google'
+ keywords: false
+
+
# No search
- url: 'http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-x&output=html&h=15&slotname=2973049897&adk=3777420323&w=728&lmt=1381755030&flash=11.9.900.117&url=http%3A%2F%2Fexample.com%2F&dt=1381755030169&bpp=8&bdt=2592&shv=r20131008&cbv=r20130906&saldr=sa&correlator=1381755030200&frm=20&ga_vid=1659309719.1381755030&ga_sid=1381755030&ga_hid=1569070879&ga_fc=0&u_tz=660&u_his=3&u_java=1&u_h=768&u_w=1366&u_ah=728&u_aw=1366&u_cd=24&u_nplug=0&u_nmime=0&dff=times%20new%20roman&dfs=13&adx=311&ady=107&biw=1349&bih=673&oid=2&ref=http%3A%2F%2Fwww.google.com.au%2Furl%3Fsa%3Dt%26rct%3Dj%26q%3D%26esrc%3Ds%26frm%3D1%26source%3Dweb%26cd%3D10%26ved%3D0CGcQFjAJ%26url%3Dhttp%253A%252F%252Fexample.com%252F%26ei%3DXNtbUvrJPKXOiAfw1IH4Bw%26usg%3DAFQjCNE66zRf2zaUw8FKf0JWxiM1FiXHVg&vis=1&fu=0&ifi=1&pfi=32&dtd=122&xpc=tBekiCZTWM&p=http%3A//example.com&rl_rc=true&adsense_enabled=true&ad_type=text_image&oe=utf8&height=15&width=728&format=fp_al_lp&kw_type=radlink&prev_fmts=728x15_0ads_al&rt=ChBSW-iYAADltAqmmOfZAA2SEg1BbmltYXRlZCBUZXh0Ggj019wBciBqgSgBUhMI8OHhzq6WugIVhJOmCh2NYQBO&hl=en&kw0=Animated+Text&kw1=Animated+GIF&kw2=Animated+Graphics&kw3=Fonts&okw=Animated+Text'
engine:
diff --git a/tests/travis b/tests/travis
-Subproject 41e9efcb897239ed1fd899a4e29b5888a008213
+Subproject 5af9e8fcd1fa1239108397d3ea588d1f1aac653