diff --git a/browse.php b/browse.php
index 220a0f9b..69454c2e 100644
--- a/browse.php
+++ b/browse.php
@@ -37,6 +37,7 @@ require_once 'lib/init.php';
/* Display the headers and menus */
require_once Config::get('prefix') . '/templates/header.inc.php';
+echo '
';
switch($_REQUEST['action']) {
case 'file':
@@ -104,37 +105,8 @@ switch($_REQUEST['action']) {
break;
case 'song':
Browse::set_type('song');
-
- /* Setup the View Object */
- $view = new View();
- $view->import_session_view();
-
- $match = scrub_in($_REQUEST['match']);
-
- require (conf('prefix') . '/templates/show_box_top.inc.php');
- show_alphabet_list('song_title','browse.php',$match,'song_title');
- /* Detect if it's Browse, and if so don't fill it in */
- if ($match == 'Browse') { $match = ''; }
- show_alphabet_form($match,_('Show Titles Starting With'),"browse.php");
- require (conf('prefix') . '/templates/show_box_bottom.inc.php');
-
- $sql = $song->get_sql_from_match($_REQUEST['match']);
-
- if ($_REQUEST['keep_view']) {
- $view->initialize();
- }
- else {
- $db_results = mysql_query($sql, dbh());
- $total_items = mysql_num_rows($db_results);
- $offset_limit = 999999;
- if ($match != 'Show All') { $offset_limit = $user->prefs['offset_limit']; }
- $view = new View($sql, 'browse.php?action=song_title','title',$total_items,$offset_limit);
- }
-
- if ($view->base_sql) {
- $songs = $song->get_songs($view->sql);
- show_songs($songs,0,0);
- }
+ $song_ids = Browse::get_objects();
+ Browse::show_objects($song_ids);
break;
case 'catalog':
@@ -146,6 +118,8 @@ switch($_REQUEST['action']) {
break;
} // end Switch $action
+echo '
';
+
/* Show the Footer */
show_footer();
?>
diff --git a/images/icon_add.png b/images/icon_add.png
new file mode 100644
index 00000000..6332fefe
Binary files /dev/null and b/images/icon_add.png differ
diff --git a/lib/class/browse.class.php b/lib/class/browse.class.php
index eaa540bb..531ccc26 100644
--- a/lib/class/browse.class.php
+++ b/lib/class/browse.class.php
@@ -29,12 +29,14 @@
*/
class Browse {
-
+ // Public static vars that are cached
+ public static $sql;
+
/**
* constructor
* This should never be called
*/
- private __construct() {
+ private function __construct() {
// Rien a faire
@@ -56,9 +58,14 @@ class Browse {
case 'unplayed':
case 'rated':
$key = $_REQUEST['key'];
- $_SESSION['browse']['filter'][$key] = make_bool($_REQUEST['value']);
+ if ($_SESSION['browse']['filter'][$key]) {
+ unset($_SESSION['browse']['filter'][$key]);
+ }
+ else {
+ $_SESSION['browse']['filter'][$key] = 1;
+ }
break;
- default
+ default:
// Rien a faire
break;
} // end switch
@@ -87,4 +94,145 @@ class Browse {
} // set_type
+ /**
+ * get_objects
+ * This gets an array of the ids of the objects that we are
+ * currently browsing by it applies the sql and logic based
+ * filters
+ */
+ public static function get_objects() {
+
+ // First we need to get the SQL statement we are going to run
+ // This has to run against any possible filters (dependent on type)
+ $sql = self::get_sql();
+ $db_results = Dba::query($sql);
+
+ $results = array();
+
+ while ($data = Dba::fetch_assoc($db_results)) {
+ // If we've hit our offset limit
+ if (count($results) >= $GLOBALS['user']->prefs['offset_limit']) { return $results; }
+
+ // Make sure that this object passes the logic filter
+ if (self::logic_filter($data['id'])) {
+ $results[] = $data['id'];
+ }
+ } // end while
+
+ return $results;
+
+ } // get_objects
+
+ /**
+ * get_sql
+ * This returns the sql statement we are going to use this has to be run
+ * every time we get the objects because it depends on the filters and the
+ * type of object we are currently browsing
+ */
+ public static function get_sql() {
+
+ // Get our base SQL must always return ID
+ switch ($_SESSION['browse']['type']) {
+ case 'album':
+
+ break;
+ case 'artist':
+
+ break;
+ case 'genre':
+
+ break;
+ case 'song':
+ default:
+ $sql = "SELECT `song`.`id` FROM `song` ";
+ break;
+ } // end base sql
+
+ // No sense to go further if we don't have filters
+ if (!is_array($_SESSION['browse']['filter'])) { return $sql; }
+
+ // Foreach the filters and see if any of them can be applied
+ // as part of a where statement in this sql (type dependent)
+ $where_sql = "WHERE 1=1 AND ";
+
+ foreach ($_SESSION['browse']['filter'] as $key=>$value) {
+ $where_sql .= self::sql_filter($key,$value);
+ } // end foreach
+
+ $where_sql = rtrim($where_sql,'AND ');
+
+ $sql .= $where_sql;
+
+ self::$sql = $sql;
+
+ return $sql;
+
+ } // get_sql
+
+ /**
+ * sql_filter
+ * This takes a filter name and value and if it is possible
+ * to filter by this name on this type returns the approiate sql
+ * if not returns nothing
+ */
+ private static function sql_filter($filter,$value) {
+
+ $filter_sql = '';
+
+ if ($_SESSION['browse']['type'] == 'song') {
+ switch($filter) {
+ case 'alpha_match':
+ $filter_sql = " `song`.`title` LIKE '" . Dba::escape($value) . "%' AND ";
+ break;
+ case 'unplayed':
+ $filter_sql = " `song`.`played`='0' AND ";
+ break;
+ default:
+ // Rien a faire
+ break;
+ } // end list of sqlable filters
+ } // if it is a song
+
+ if ($_SESSION['browse']['type'] == 'album') {
+
+
+
+
+ } // end album
+
+ return $filter_sql;
+
+ } // sql_filter
+
+ /**
+ * logic_filter
+ * This runs the filters that we can't easily apply
+ * to the sql so they have to be done after the fact
+ * these should be limited as they are often intensive and
+ * require additional queries per object... :(
+ */
+ private static function logic_filter($object_id) {
+
+ return true;
+
+ } // logic_filter
+
+ /**
+ * show_objects
+ * This takes an array of objects
+ * and requires the correct template based on the
+ * type that we are currently browsing
+ */
+ public static function show_objects($object_ids) {
+
+ switch ($_SESSION['browse']['type']) {
+ case 'song':
+ show_box_top();
+ require_once Config::get('prefix') . '/templates/show_songs.inc.php';
+ show_box_bottom();
+ break;
+ } // end switch on type
+
+ } // show_object
+
} // browse
diff --git a/lib/class/song.class.php b/lib/class/song.class.php
index 7711ea95..ca1b5bbf 100644
--- a/lib/class/song.class.php
+++ b/lib/class/song.class.php
@@ -126,12 +126,12 @@ class Song {
} // fill_ext_info
- /*!
- @function format_type
- @discussion gets the type of song we are trying to
- play, used to set mime headers and to trick
- players into playing them correctly
- */
+ /**
+ * format_type
+ * gets the type of song we are trying to
+ * play, used to set mime headers and to trick
+ * players into playing them correctly
+ */
function format_type($override='') {
// If we pass an override for downsampling or whatever then use it
@@ -633,20 +633,6 @@ class Song {
} // _update_ext_item
- /*!
- @function format_song
- @discussion this takes a song object
- and formats it for display
- and returns the object cleaned up
- */
- function format_song() {
-
- $this->format();
-
- return true;
-
- }
-
/**
* format
* This takes the current song object
diff --git a/templates/list_header.inc b/templates/list_header.inc.php
similarity index 99%
rename from templates/list_header.inc
rename to templates/list_header.inc.php
index 257c5220..7fb13a57 100644
--- a/templates/list_header.inc
+++ b/templates/list_header.inc.php
@@ -1,7 +1,7 @@
username == $playlist->user || $GLOBALS['user']->has_access('100'))) {
- $tab = 1;
- $playlist_owner = true;
-}
-
-//Horrible hack!
-if ($_SERVER['SCRIPT_NAME'] == '/browse.php') {
- // Setup the links
- $link_end = '';
- $title_start = '';
- $track_start = '';
- $bit_start = '';
-}
-?>
-
-
-
-
diff --git a/templates/show_songs.inc.php b/templates/show_songs.inc.php
new file mode 100644
index 00000000..e0fa49be
--- /dev/null
+++ b/templates/show_songs.inc.php
@@ -0,0 +1,53 @@
+
+
+
+
+format();
+?>
+
+
+
+ |
+ f_link; ?> |
+ f_artist_link; ?> |
+ f_album_link; ?> |
+
+
+