This file is here for tracking changes in development versions

2014-07-28
* Added connection timing to database connection verification
* Plugin now connects to database only when parsing shortcodes/responding to ajax hooks to reduce page load times
* Settings verification button is disabled during ajax request to avoid subsequent requests when given MySQL host takes long time to respond

2014-07-29
* Added few missing CSS class names to shortcodes HTML

2014-09-29
* Added option to override radiodj.css by copying it to current theme's or child themes root
	Now the plugin checks if radiodj.css exists in theme or child theme and loads that instead

2014-10-05
* Bugfix: Add stripcslashes for input variables in database verification

2015-04-23
* Enhancement: Better caching for data in shortcode
* Bugfix: Connect to database only if cached data not available

2015-04-26
* Fix: Removed invalid <h3> tags from table headings
* Enhancement: Separator hiphen between artist and title wrapped in <span class="separator"> so it can be hidden/styled using CSS
* Enhancement: Added option to display song titles of upcoming tracks

2015-11-23
* Bugfix: Replace deprecated like_escape function with radiodj_db::esc_like method

2016-09-01
* Enhancement: Added reCAPTCHA for submission verification
* Enhancement: Make sure tracks in playlist queue can't be requested
* Enhancement: Added option to disable name input field for requests

2016-09-02
* Enhancement: Added option for request per-IP-address limit duration
* Fix: Check request limit using selected time interval rather than comparing date
* Enhancement: Added options to disable request submission and display a message

2016-09-03
* Enhancement: Option to control track types available for requests
* Enhancement: Option to control track types displayed by [now-playing] shortcode

2016-09-04
* Enhancement: Display a dismissible notification when request submission is disabled

2026-08-04
* Security: Removed malicious code injected into lib/radiodj.class.php (backdoor allowing remote code execution via HTTP headers)
* Bugfix: Removed leftover debug code that caused the track request list to always show zero results
* Security: Fixed reflected XSS in the track request search box
* Security: Escaped track title/artist and request ID output in the request form
* Security: Added capability checks to the verify-database and dismiss-notice admin AJAX actions
* Security: Added nonce verification to the dismiss-notice admin AJAX action
* Security: Sanitize all option values on save instead of storing raw POST data
* Compatibility: Replaced deprecated strftime() calls with a locale-aware date formatter
* Enhancement: [track-requests] no longer queries the database on page load; results only load after a search is submitted
* Refactor: Database class now uses mysqli exclusively; legacy mysql_* extension fallback code removed

2026-08-04
* Fix: All UI strings and code comments restored to English source text (previously mixed with hardcoded Dutch)
* Fix: Date/time formatting now follows the WordPress site locale instead of being hardcoded to Dutch
* Fix: Added missing radiodj text domain to several translatable strings so they load correctly
* i18n: Regenerated languages/radiodj.pot and radiodj-en_US.po/.mo from current source strings
* i18n: Added a complete Dutch (nl_NL) translation: languages/radiodj-nl_NL.po/.mo

2026-08-04
* Fix: Plugin translation files (languages/*.mo) were never actually loaded -- added the missing load_plugin_textdomain() call, so the site language (e.g. Dutch) is now used instead of always falling back to English

2026-08-04
* Fix: Translation loading now uses a path built directly from the plugin files own location instead of plugin_basename(), which could silently fail on symlinked or non-standard mounted plugin directories
* Fix: Removed a redundant, broken load_plugin_textdomain() call in the admin class
* Refactor: All custom CSS classes renamed with a consistent rdj- prefix across every template, stylesheet, and script
* Refactor: Moved all hardcoded inline styles into css/admin.css and css/radiodj.css
* Fix: Removed a shared id="nptable" duplicated across 6 templates; replaced with the rdj-main-table class
* Fix: table/th/td CSS rules were unscoped and could leak onto unrelated tables; now scoped under .rdj-wrap
* Fix: stray orphaned closing tags, a dead CSS selector, and a missing radiodj text domain found during cleanup
* i18n: Translated remaining Dutch comments in css/radiodj.css to English

2026-08-07
* Redesign: Color palette reworked to match the site own dark teal/lime-green/orange look instead of a separately-invented scheme; replaced pale yellow/green highlight blocks with dark-tinted highlights and colored left borders, and fixed several dark-on-dark unreadable text colors
* Enhancement: Coming Soon block now shows artist and title on separate rows so longer titles display in full, still truncating independently with an ellipsis if needed

2026-08-07
* Fix: Plugin background was made transparent in 0.7.6 assuming the dark page background would show through, but the theme applies its own light background to the content area specifically, making light text unreadable there and on every other plugin page (top tracks, top artists, requests, etc). Now uses its own solid dark background so it stays readable regardless of the surrounding theme.

2026-08-07
* Enhancement: Section headers now use the theme own header background image (img/header.png, child theme first then parent theme) instead of a plain gradient, falling back to the gradient if not found
* Enhancement: Added real spacing between Now/Coming Soon/Recently Played sections by splitting into three separate tables
* Tweak: Removed colored left border accent on now-playing/coming-soon highlights
* Fix: Position badge circles now properly centered both directions, with a glowing teal ring
* Fix: Removed leftover separator dash in Recently Played list
* Housekeeping: Added Requires at least (5.0), Requires PHP (7.3), updated Tested up to (6.9)

2026-08-07
* Fix: Request success/error messages rendered outside .rdj-wrap so plugin CSS never applied, causing unreadable white-on-white text in some cases. All 9 occurrences now use one consistent, properly-wrapped helper.
* Enhancement: Return to list of tracks link is now a styled button
* Enhancement: Success messages use a distinct green style instead of the orange notice style
* Tweak: Header background updated with teal inset glow effect and lighter text color per feedback

2026-08-08
* New: Now Playing, Coming Soon, and Recently Played now show a "Requested by" badge with name and message on requested tracks, via a LEFT JOIN with a defensive fallback if the schema does not support it
* i18n: Added and translated new "Requested by %s" string

2026-08-09
* Fix: Requested-by join used history.songID, actual column is history.trackID -- corrected against real table structure
* Fix: Coming Soon block was not showing requester info because the played=0 filter excluded already-queued requests; now matches by most recent request per song instead
* Tweak: Now Playing badge moved inline to end of the artist-title line instead of its own row
* Credits: Added Danny Terweij and Claude credits throughout plugin header, readme, CSS headers, and translation metadata

2026-08-09
* New: Optional Auto-Queue Requests setting (off by default) makes the plugin add requested tracks directly to the RadioDJ playout queue itself, giving correct first-come-first-served order since queuelist play order is governed by its auto-increment ID. Disable RadioDJ own request-queueing plugin if you enable this, to avoid double-queueing.
* i18n: Added and translated new strings for the auto-queue setting

2026-08-09
* Enhancement: Auto-Queue Requests now records the outcome of the last attempt and shows it on the settings page for easier diagnosis

2026-08-09
* Reverted: Auto-Queue Requests feature (0.8.2/0.8.3) fully removed -- RadioDJ own AutoDJ engine periodically rewrites queuelist and overwrites manually-inserted rows before they reliably play. On hold pending a fix or supported hook from RadioDJ. Re-enable RadioDJ own request-queueing plugin if you had this setting on.

2026-08-10
* Fix: Top Tracks Times played/Last played line was misaligned across two cells with no header; replaced with a single combined cell of badge-style pills matching the requested-by badge styling

2026-08-11
* Enhancement: Header background image now bundled with the plugin (images/header.png) instead of looked up from the theme; new Display Options field to replace it via the WordPress media picker
* Enhancement: Position badge circles in all top lists made bigger (36px) with reinforced centering
* Enhancement: Position badges now have tiered glow ring colors by rank -- gold top 3, lime 4th-10th, teal for the rest -- across all four top lists

2026-08-11
* Fix: Position badge numbers still looked off-center due to Kalam cursive font uneven numeral glyph spacing, not a CSS centering bug. Switched to standard sans-serif for these numbers.

2026-08-11
* Fix: Top Tracks position badge was centered only within its own row, not the full two-row track block. Cell now uses rowspan=2 with native table vertical-align for reliable cross-row centering; circle styling moved to an inner span.

2026-08-13
* Fix: Deadlock errors on wp_options DELETE queries caused by WordPress transient API delete-on-read behavior under concurrent traffic. Now-playing and top-list caches use a custom lightweight cache instead of transients, avoiding the delete-then-insert cycle entirely.
* Housekeeping: Removed two leftover debug HTTP headers sent on every request

2026-08-21 (0.9.0)
* Merge: Combined two previously-standalone plugins into RadioDJ so a station site only needs to install one plugin instead of three:
	- "Icecast2 Listener Count Widget" (was v2.0.0) -> now lib/radiodj-icecast-widget.class.php, registered as the "RadioDJ: Icecast2 Listener Count" widget (same widget slug as before, so existing sidebar placements and settings are kept).
	- "Superstar Stream Player" (was v1.4.0) -> now lib/radiodj-stream-player.class.php, available via the new [radiodj-stream-player] shortcode (the old [superstar_stream_player] shortcode still works as an alias).
* Enhancement: The listener-count widget's front-end auto-refresh interval was hardcoded to 60 seconds directly in JavaScript with no way to change it. It's now a real setting -- "Listener Count Refresh Interval" under Settings -> RadioDJ Options -> Listener Count Widget -- still defaulting to 60 seconds.
* Enhancement: Both merged features now share RadioDJ's single "Settings -> RadioDJ Options" screen (new "Listener Count Widget" and "Stream Player" sections) instead of each having their own separate settings page.
* Refactor: Icecast widget's inline <style>/<script> blocks (previously echoed into wp_footer on every single page load regardless of whether the widget was in use) replaced with properly registered/enqueued css/radiodj-icecast.css and js/radiodj-icecast.js, only loaded when the widget or its assets are actually needed.
* Refactor: Stream Player options renamed from ssp_* to rdj_player_* to match this plugin's naming convention; a migration step on activation copies over any ssp_* values left from a previously separately-installed Superstar Stream Player so settings aren't lost when switching to the merged plugin.
* Refactor: Icecast widget's listener-log database table renamed from {prefix}icecast2_listener_log to {prefix}radiodj_icecast_listener_log, and its cron hooks/AJAX action to radiodj_icecast_* to avoid any collision with a previously-installed copy of the standalone plugin running side by side during migration.
* i18n: All strings from both merged plugins moved to the shared 'radiodj' text domain and added to languages/radiodj.pot; radiodj-en_US.po/.mo and radiodj-nl_NL.po/.mo fully translated (218 strings each, up from 117); radiodj-lv_LV.po/.mo regenerated with the new msgids present for translators (existing partial Latvian translation left as-is, matching its state before this merge).
* Housekeeping: Plugin header, readme.txt, and changes.txt updated to describe the combined feature set; version bumped 0.8.9 -> 0.9.0 to reflect the merge.

2026-08-22 (0.9.1)
* Fix: Stream Player showed "Stream offline" and a red/offline status dot even while audio was playing correctly and the spectrum visualizer was active. The player's now-playing status poll was still calling the old AJAX action name (ssp_now_playing) left over from the pre-merge standalone Superstar Stream Player plugin, instead of the renamed radiodj_player_now_playing action registered on the PHP side -- so the status check silently failed on every poll and always fell back to "offline", even though playback itself (driven directly by the <audio> element and stream URL, not by this status poll) was unaffected.
