diff --git a/examples/ui/audio_player/css/example.css b/examples/ui/audio_player/css/example.css
new file mode 100644
index 00000000..ffd0bb06
--- /dev/null
+++ b/examples/ui/audio_player/css/example.css
@@ -0,0 +1,5 @@
+.OxTableList .OxItem .OxCell > img.playing {
+ width: 10px;
+ height: 10px;
+ margin: 2px 0 0 -1px;
+}
\ No newline at end of file
diff --git a/examples/ui/audio_player/index.html b/examples/ui/audio_player/index.html
new file mode 100644
index 00000000..9ea928b5
--- /dev/null
+++ b/examples/ui/audio_player/index.html
@@ -0,0 +1,14 @@
+
+
+
+ Audio Player
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/ui/audio_player/js/example.js b/examples/ui/audio_player/js/example.js
new file mode 100644
index 00000000..91d736d8
--- /dev/null
+++ b/examples/ui/audio_player/js/example.js
@@ -0,0 +1,253 @@
+/*
+...
+*/
+
+'use strict';
+
+Ox.load('UI', function() {
+
+ var paused = true,
+ track = 0,
+ tracks = [
+ {
+ album: 'The Grey Album',
+ artist: 'Danger Mouse',
+ duration: 160417,
+ src: 'mp3/03 Encore.mp3',
+ title: 'Encore',
+ year: '2004'
+ },
+ {
+ album: 'The Grey Album',
+ artist: 'Danger Mouse',
+ duration: 214961,
+ src: 'mp3/04 December 4th.mp3',
+ title: 'December 4th',
+ year: '2004'
+ },
+ {
+ album: 'The Grey Album',
+ artist: 'Danger Mouse',
+ duration: 246857,
+ src: 'mp3/05 99 Problems.mp3',
+ title: '99 Problems',
+ year: '2004'
+ }
+ ],
+
+ $toolbar = Ox.Bar({size: 39}),
+
+ $viewLabel = Ox.Label({
+ textAlign: 'center',
+ title: 'Tracks',
+ width: 61
+ })
+ .css({
+ position: 'absolute',
+ left: '4px',
+ top: '4px',
+ paddingTop: '1px',
+ borderBottomLeftRadius: 0,
+ borderBottomRightRadius: 0,
+ fontSize: '10px'
+ })
+ .appendTo($toolbar),
+
+ $viewButtons = Ox.ButtonGroup({
+ buttons: [
+ {id: 'tracks', title: 'list', tooltip: 'View Tracks'},
+ {id: 'albums', title: 'iconlist', tooltip: 'View Albums'},
+ {id: 'grid', title: 'grid', tooltip: 'View Grid'},
+ {id: 'columns', title: 'columns', tooltip: 'View Columns'}
+ ],
+ max: 1,
+ min: 1,
+ selectable: true,
+ type: 'image'
+ })
+ .css({
+ position: 'absolute',
+ left: '4px',
+ top: '19px'
+ })
+ .bindEvent({
+ change: function(data) {
+ $viewLabel.options({title: Ox.toTitleCase(data.value)});
+ }
+ })
+ .appendTo($toolbar),
+
+ $audioPlayer = Ox.AudioPlayer({
+ audio: tracks,
+ paused: true,
+ width: window.innerWidth - 205
+ })
+ .css({left: '69px', top: '4px'})
+ .bindEvent({
+ paused: function(data) {
+ paused = data.paused;
+ },
+ track: function(data) {
+ $list.value(tracks[track].src, 'playing', false);
+ track = data.track;
+ $list.value(tracks[track].src, 'playing', true);
+ }
+ })
+ .appendTo($toolbar)
+ .gainFocus(),
+
+ $findSelect = Ox.Select({
+ items: [
+ {id: 'all', title: 'Find: All'},
+ {id: 'tracks', title: 'Find: Tracks'},
+ {id: 'artists', title: 'Find: Artists'},
+ {id: 'albums', title: 'Find: Albums'}
+ ],
+ overlap: 'left',
+ type: 'image'
+ })
+ .css({
+ position: 'absolute',
+ right: '4px',
+ top: '4px',
+ borderBottomRightRadius: 0
+ })
+ .bindEvent({
+ change: function(data) {
+ $findLabel.options({title: data.title});
+ }
+ })
+ .appendTo($toolbar),
+
+ $findLabel = Ox.Label({
+ title: 'Find: All',
+ width: 112
+ })
+ .css({
+ position: 'absolute',
+ right: '20px',
+ top: '4px',
+ paddingTop: '1px',
+ borderBottomLeftRadius: 0,
+ borderBottomRightRadius: 0,
+ fontSize: '10px'
+ })
+ .appendTo($toolbar),
+
+ $findInput = Ox.Input({
+ clear: true,
+ width: 128
+ })
+ .css({
+ position: 'absolute',
+ right: '4px',
+ top: '19px',
+ borderTopLeftRadius: 0
+ })
+ .appendTo($toolbar),
+
+ $list = Ox.TableList({
+ columns: [
+ {
+ format: function(value) {
+ if (value) {
+ return Ox.Element('')
+ .addClass('playing')
+ .attr({src: Ox.UI.getImageURL(
+ paused ? 'symbolUnmute' : 'symbolMute'
+ )})
+ } else {
+ return Ox.Element();
+ }
+ },
+ id: 'playing',
+ title: 'Playing',
+ titleImage: 'mute',
+ visible: true,
+ width: 16
+ },
+ {
+ id: 'title',
+ operator: '+',
+ title: 'Title',
+ visible: true,
+ width: 192
+ },
+ {
+ id: 'artist',
+ operator: '+',
+ title: 'Artist',
+ visible: true,
+ width: 192
+ },
+ {
+ id: 'album',
+ operator: '+',
+ title: 'Album',
+ visible: true,
+ width: 192
+ },
+ {
+ align: 'right',
+ id: 'year',
+ operator: '+',
+ title: 'Year',
+ visible: true,
+ width: 64
+ },
+ {
+ align: 'right',
+ format: function(value) {
+ return Ox.formatDuration(value / 1000).substr(4);
+ },
+ id: 'duration',
+ operator: '-',
+ title: 'Time',
+ visible: true,
+ width: 64
+ }
+ ],
+ columnsVisible: true,
+ items: tracks,
+ max: 1,
+ sort: [{key: 'artist', operator: '+'}],
+ unique: 'src'
+ })
+ .bindEvent({
+ open: function(data) {
+ var src = data.ids[0],
+ index = Ox.indexOf(tracks, function(track) {
+ return track.src == src;
+ });
+ if (index == track) {
+ $list.value(tracks[track].src, 'playing', true);
+ $audioPlayer.options({paused: false, position: 0});
+ } else {
+ $list.value(tracks[track].src, 'playing', false);
+ track = index;
+ $audioPlayer.options({paused: false, track: track});
+ $list.value(tracks[track].src, 'playing', true);
+ }
+ },
+ openpreview: function(data) {
+ paused = !paused;
+ $audioPlayer.options({paused: paused});
+ $list.closePreview();
+ }
+ }),
+
+ $panel = Ox.SplitPanel({
+ elements: [
+ {element: $toolbar, size: 39},
+ {element: $list}
+ ],
+ orientation: 'vertical'
+ })
+ .appendTo(Ox.$body);
+
+ $($viewButtons.find('.OxButton')[0]).css({borderTopLeftRadius: 0});
+ $($viewButtons.find('.OxButton')[3]).css({borderTopRightRadius: 0});
+ $findInput.find('input').css({borderTopLeftRadius: 0, borderTopRightRadius: 0});
+ $findInput.find('.OxButton').css({borderTopRightRadius: 0});
+
+});
diff --git a/examples/ui/audio_player/mp3/03 Encore.mp3 b/examples/ui/audio_player/mp3/03 Encore.mp3
new file mode 100644
index 00000000..2eb72e0c
Binary files /dev/null and b/examples/ui/audio_player/mp3/03 Encore.mp3 differ
diff --git a/examples/ui/audio_player/mp3/04 December 4th.mp3 b/examples/ui/audio_player/mp3/04 December 4th.mp3
new file mode 100644
index 00000000..af42f652
Binary files /dev/null and b/examples/ui/audio_player/mp3/04 December 4th.mp3 differ
diff --git a/examples/ui/audio_player/mp3/05 99 Problems.mp3 b/examples/ui/audio_player/mp3/05 99 Problems.mp3
new file mode 100644
index 00000000..bf2e995a
Binary files /dev/null and b/examples/ui/audio_player/mp3/05 99 Problems.mp3 differ