/**
 * Songlist Manager - fetches and caches songlists 
 *
 * Copyright: (c)2007 CK Web Technologies
 * Author:    Chris Knowles <chris.knowles@ckweb.com.au>
 * Version:   $Id: Songlist.js 22 2007-11-13 04:31:39Z Chris $
 */

var Songlist = function(app, songlistCacheSize)
{
    this.app = app;
    this.songlists = new $AA;
    this.lastSonglist = null;
    this.songlistCacheSize = songlistCacheSize;
    this.html = $D.id('songlist');
    this.list = $D.id('sl');
    this.message = false;
    this.listHtml = "<table border='0' cellpadding='0' cellspacing='0'><tr><th class='stretch'>Interpret</th><th class='stretch'>Titel</th><th class='time'>Dauer</th><th class='add'>&nbsp;</th><tbody>";
    
    this.setMessage = function(message)
    {
        message = "<div class='message'>" + message + "</div>";
        $D.setContent(this.html, message);
        this.message = true;
    };
    
    this.clearMessage = function()
    {
        $D.setContent(this.html, "");
        this.message = false;
    };
    
    this.search = function(e)
    {        
        $E.kill(e);
        $D.id('searchButton').blur();
        var form = $D.id('searchForm');
        if (form.searchStr.value) {
            if ($D.id('artistfield').checked) { 
                this.fetchSearchResults(form.searchStr.value, 'artist');
            
            } else if ($D.id('titlefield').checked) {   
                this.fetchSearchResults(form.searchStr.value, 'title');
            
            } else {
                alert("Bitte geben Sie an ob Sie Interpreten oder Titel suchen");
            }
        } else {
            alert("Bitte Suchbegriff eingeben");
        }   
        
    };
    
    this.fetchSearchResults = function(searchStr, field)
    {
        $D.setContent('songlist', '');
        $D.setContent('songlist-title', '');
        $D.setContent('songlist-description', '');
        $D.id('songlist').style.background = '#FFF url(../images/loading.gif) no-repeat center 100px';
        var http = new $H;
        var self = this;
        this.songlists.remove('search');
        http.post('search/', "searchStr=" + searchStr + "&field=" + field, function(){self.addSonglist(http, 'search')});
    };
    
    this.autoload = function(type, val)
    {
        if (type == 'songlist') {
            var prefix = '';
        } else {
            var prefix = type + '-';
        }
        var http = new $H;
        var self = this;
        http.get(type + '/' + val + '/', false, function(){self.addSonglist(http, prefix + val)});
    };
       
    this.fetch = function(e)
    {
        $E.kill(e);
        var evt  = $E.get(e);
        var id = evt.target.id.substr(1);
        
        if (evt.target.tagName == 'A') {
            $D.setContent('songlist', '');
            $D.setContent('songlist-title', '');
            $D.setContent('songlist-description', '');
            $D.id('songlist').style.background = '#FFF url(../images/loading.gif) no-repeat center 100px';
            if (this.songlists.length > this.songlistCacheSize) {
                this.songlists.remove(this.lastSonglist);
            }
    
            var content = this.songlists.get(id);
    
            if (this.songlists.get(id)) {
                this.buildSonglist(id);
    
            } else {
                var http = new $H;
                var self = this;
                http.get('songlist/' + id + '/', false, function(){self.addSonglist(http, id)});
    
            }
            this.lastSonglist = id;
        }

    };
    
    this.fetchArtist = function(e)
    {
        $E.kill(e);
        var evt  = $E.get(e);
        var id = $D.getContent(evt.target);
        
        if (evt.target.tagName == 'A') {
            $D.setContent('songlist', '');
            $D.setContent('songlist-title', '');
            $D.setContent('songlist-description', '');
            $D.id('songlist').style.background = '#FFF url(../images/loading.gif) no-repeat center 100px';
            if (this.songlists.length > this.songlistCacheSize) {
                this.songlists.remove(this.lastSonglist);
            }
            var content = this.songlists.get('artist-' + id);
    
            if (this.songlists.get('artist-' + id)) {
                var title =  'Artist ' + id.replace("artist-", "");
                this.buildSonglist('artist-' + id, title);
    
            } else {
                var http = new $H;
                var self = this;
                http.get('artist/' + id + '/', false, function(){self.addSonglist(http, 'artist-' + id)});
    
            }
            this.lastSonglist = 'artist-' + id;
        }

    };
    
    this.fetchTitle = function(e)
    {
        $E.kill(e);
        var evt  = $E.get(e);
        var id = $D.getContent(evt.target);
        
        if (evt.target.tagName == 'A') {
            $D.setContent('songlist', '');
            $D.setContent('songlist-title', '');
            $D.setContent('songlist-description', '');
            $D.id('songlist').style.background = '#FFF url(../images/loading.gif) no-repeat center 100px';
            if (this.songlists.length > this.songlistCacheSize) {
                this.songlists.remove(this.lastSonglist);
            }
    
            var content = this.songlists.get('title-' + id);
            var title =  'Title ' + id.replace("title-", "");
            if (this.songlists.get('title-' + id)) {
                this.buildSonglist('title-' + id, title);
    
            } else {
                var http = new $H;
                var self = this;
                http.get('title/' + id + '/', false, function(){self.addSonglist(http, 'title-' + id)});
    
            }
            this.lastSonglist = 'title-' + id;
        }

    };
    
    this.addSonglist = function(http, id, title, description)
    {   
        var data = http.text.split("|||");
        if (title) {
            $D.setContent('songlist-title', title);
        } else {
            $D.setContent('songlist-title', data[0]);
            $D.setContent('songlist-description', data[1]);
        }
        
        if (data[2] == 'no results') {
            $D.id('songlist').style.background = '';
            $D.setContent('songlist', "<p class='message'>Leider keine Übereinstimmungen gefunden!</p>");
            return;
        }
        var songlist = {};
        var tracks = data[2].split("||");
        
        for (var i = 0, len = tracks.length; i < len; i++) {
            var track = tracks[i].split("|");
            songlist[track[0]] = {
                idTrack: track[0],
                artist: track[1],
                title: track[2],
                minutes: track[3],
                seconds: track[4],
                cdNo: track[5]
            }; 
        }

        this.songlists.set(id, {songlist: songlist, title: data[0], description: data[1]});

        this.buildSonglist(id);
    };
    
    this.buildSonglist = function(id, title)
    {
        $D.setContent('songlist', '');
        var html = this.listHtml;
        var data = this.songlists.get(id);
        if (title) {
            $D.setContent('songlist-title', title);
        } else {
            $D.setContent('songlist-title', data.title);
            $D.setContent('songlist-description', data.description);
        }
        
        var songlist = data.songlist;
        for (name in songlist) {
            track = songlist[name];
            html += "<tr id='sl-" + track.idTrack + "'><td class='stretch'>" + track.artist + "</td><td class='stretch'>" + track.title + "</td><td>" + track.minutes + ":" + track.seconds + "</td><td><a href='add/" + track.idTrack + "/' id='add-" + id + "-" + track.idTrack + "-" + track.cdNo + "'>+</a></td></tr>";
        }
        html += '</tbody></table>';
        $D.id('songlist').style.background = '#FFF';
        $D.setContent(this.html, html);
    };
    
    this.handleClick = function(e)
    {
        $E.kill(e);
        var evt = $E.get(e);
        var parts = evt.target.id.split("-");
        // form artist/title A-Z
        if (parts[1] == 'artist' || parts[1] == 'title') {
            //add
            if (parts[0] == 'add') {
                // A-Z
                if (parts.length == 5) {
                    var songlistId = parts[1] + "-" + parts[2];
                    var trackId = parts[3];
                    var cdNo = parts[4];
                    this.app.Playlist.addFromSonglist(songlistId, trackId, cdNo);
                // 0-9
                } else {
                    var songlistId = parts[1] + "-0-9";
                    var trackId = parts[4];
                    var cdNo = parts[5];
                    this.app.Playlist.addFromSonglist(songlistId, trackId, cdNo);
                }
            // play
            } else {
                // A-Z
                if (parts.length == 4) {
                    var songlistId = parts[1] + "-" + parts[2];
                    var trackId = parts[3];
                    this.app.Player.load(songlistId, trackId);
                // 0-9
                } else {
                    var songlistId = parts[1] + "-0-9";
                    var trackId = parts[4];
                    this.app.Player.load(songlistId, trackId);
                }      
            }
        // from menu
        } else {
            //add
            if (parts[0] == 'add') {
                var songlistId = parts[1];
                var trackId = parts[2];
                var cdNo = parts[3];
                this.app.Playlist.addFromSonglist(songlistId, trackId, cdNo);
            // play
            } else {
                var songlistId = parts[1];
                var trackId = parts[2];
                this.app.Player.load(songlistId, trackId);
            }
        }
    };
    
}