var Library = function()
{
	this.albumsCache = new Array();
    this.repeatMode = false;
    this.shuffleMode = false;

    this.currentTrack = 0;
    this.currentAlbum = 0;
    this.currentArtist = 0;

    this.playlist = null;
    this.currentAlbumName = "";
    this.currentArtistName = "";
    this.currentTitle = "";

    this.getAlbum = getAlbum;
    this.play = play;
	this.download = download;
    this.getCurrentTrackUrl = getCurrentTrackUrl;
    this.playNext = playNext;
    this.playPrev = playPrev;
    this.toggleShuffleMode = toggleShuffleMode;
    this.toggleRepeatMode = toggleRepeatMode;
    this.showDialog = showDialog;
    this.hideDialogs = hideDialogs;

    function toggleShuffleMode()
    {
        document.library.repeatMode = false;
        document.library.shuffleMode = !document.library.shuffleMode;
        updateControls();

        // turned on
		if (document.library.shuffleMode)
		{
			$('#player-controls-mode-shuffle').attr("title", "Turn off shuffle mode");
		}
		else // turned off
		{
			$('#player-controls-mode-shuffle').attr("title", "Turn on shuffle mode");
		}
    }

    function toggleRepeatMode()
    {
        document.library.shuffleMode = false;
        document.library.repeatMode = !document.library.repeatMode;
        updateControls();

        // turned on
		if (document.library.repeatMode) {
			$('#player-controls-mode-repeat').attr("title", "Turn off repeat mode");
		}
        // turned off
		else {
			$('#player-controls-mode-repeat').attr("title", "Turn on repeat mode");
		}
    }

    function updateControls()
    {
         if (document.library.repeatMode) {
             //$('#player-controls-mode-shuffle').removeClass('player-controls-mode-shuffle');
             $('#player-controls-mode-repeat').addClass('player-controls-mode-repeat-on');
         }
         else {
            $('#player-controls-mode-repeat').removeClass('player-controls-mode-repeat-on');
         }
         if (document.library.shuffleMode) {
             //$('#player-controls-mode-shuffle').removeClass('player-controls-mode-shuffle');
             $('#player-controls-mode-shuffle').addClass('player-controls-mode-shuffle-on');
         }
         else {
            $('#player-controls-mode-shuffle').removeClass('player-controls-mode-shuffle-on');
         }
    }

    function getPrevId() {
        var CT = document.library.currentTrack;
        var playlistLength = document.library.playlist.length;

        // shufle mode
        if (document.library.shuffleMode) {
             var randNo = Math.floor(Math.random()*playlistLength);
             return randNo;
        }
        // repeat mode
        else if (document.library.repeatMode) {
            if (CT == 0) {
                return parseInt(playlistLength)-1;
            }
            else {
                return parseInt(CT)-1;
            }
        }
        // nono option was selected
        else {
            if (CT == 0) {
                return -1;
            }
            else {
                return parseInt(CT)-1
            }
        }
    }

    function getNextId() {
        var CT = document.library.currentTrack;
        var playlistLength = document.library.playlist.length;

        // shufle mode
        if (document.library.shuffleMode) {
             var randNo = Math.floor(Math.random()*playlistLength);
             return randNo;
        }
        // repeat mode
        else if (document.library.repeatMode) {
            if (parseInt(playlistLength) == parseInt(CT)+1) {
                return 0;
            }
            else {
                return parseInt(CT)+1
            }
        }
        // nono option was selected
        else {
            if (parseInt(playlistLength) == parseInt(CT)+1) {
                return -1;
            }
            else {
                return parseInt(CT)+1;
            }
        }
    }

    function printAlbumRow(artistId, albumId, albumName) {
        $('#player-content-album-name').html('<span id="player-album'+albumId+'">'+albumName+'</span>');
    }

    function printArtistRow(artistId, artistName) {
        $('#player-content-album-artist').html('<span id="player-artist'+artistId+'">'+artistName+'</span>');
    }
	
	function printAlbumCover(artinstName, albumName) {
		$('#player-content-album-cover').html('<img class="player-content-album-cover-image" src="'+document.remoteServerUrl+'covers/'+artistName+'-'+albumName+'.jpg" />');
	}

    function printSubscribeRow(albumId, albumName, artistId, artistName, albumFeed) {
        $('#player-content-album-subscribe').html(
            '<span class="player-content-album-subscribe-rss" id="player-subscribe-rss'+albumId+'">\
                <a href="'+document.remoteServerUrl+'podcast?album_id='+albumId+'&artist_id='+artistId+'"> +RSS</a>\
            </span>\n\
            <span class="player-content-album-subscribe-itunes" id="player-subscribe-itunes'+albumId+'">\
                <a href="'+document.remoteServerUrl.replace('http','itpc')+'podcast?album_id='+albumId+'&artist_id='+artistId+'"> +iTunes</a>\
            </span>\n\
            <span class="player-content-album-share-facebook" id="player-subscribe-facebook'+albumId+'">\
                <a> +share on Facebook</a>\
            </span>');

        $('#player-subscribe-facebook'+albumId+' > a').click(function() {
            baseURL = window.location.href.split('#');
            baseURL = baseURL[0];

            var tracks = '';
            var i = 0;
            for(itemId in albumFeed['tracks']) {
                tracks += '<tr><td style="padding-bottom:3px;">\
                    <a name="fb_share" share_url="'+baseURL+'%23'+artistId+'-'+albumId+'-'+i+'" type="button"></a>\
                    <script src="http://static.ak.fbcdn.net/connect.php/js/FB.Share" type="text/javascript"></script></td>\
                    <td style="padding-bottom:3px;"><div style="padding-left:10px;">'+albumFeed["tracks"][itemId]["title"]+'</div>\
                    </td>';
                i++;
            }

            $('#player-dialog-share-category').html('\
                <div style="padding:10px 0 30px; font-size:18px; font-weight:bold;">Share on Facebook:</div>\
                <div style="padding:10px 0; border-top:1px solid #ddd; border-bottom:1px solid #ddd;">\
                    <a name="fb_share" share_url="'+baseURL+'" type="button"></a>\
                    <script src="http://static.ak.fbcdn.net/connect.php/js/FB.Share" type="text/javascript"></script>\
                    <span style="padding-left:10px; font-size:13px;"><b>Amazing Discoveries Audio Library</b></span>\
                </div>\
                <div style="padding:10px 0; border-bottom:1px solid #ddd;">\
                    <a name="fb_share" share_url="'+baseURL+'%23'+artistId+'-'+albumId+'-0" type="button"></a>\
                    <script src="http://static.ak.fbcdn.net/connect.php/js/FB.Share" type="text/javascript"></script>\
                    <span style="padding-left:10px;">"<b>'+albumName+'</b>" by <b>'+artistName+'</b></span>\
                </div>\
                <div style="padding:20px 0 5px;"><b>Single tracks</b>:</div>\
                <div id="player-dialog-share-tracks"><table border="0" cellpadding="0" cellspacing="0">'+tracks+'</table></div>\
                <div style="padding-top:15px; text-align:right;"><input type="button" name="close" value="Done" style="padding:0 20px" /></div>\
            ');

            $('#player-dialog-share-category input[type=button]').click(function() { document.library.hideDialogs(); });

            document.library.showDialog('player-dialog-share');
        });

    }

    function getAlbum(albumId, artistId, activeTrackId) {	
		if (albumId+'-'+artistId in this.albumsCache ) {  // album is in CACHE
				displayAlbum(this.albumsCache[albumId+'-'+artistId], activeTrackId);
		}
        // album is not in cache - we need to download it
		else {
			$('#player-left-column').block({message:null});
			$.getJSON(document.remoteServerUrl+"library?viewType=album&id="+albumId+"&id2="+artistId+"&callback=?", function(result){
			    document.library.albumsCache[albumId+'-'+artistId] = result;
			    displayAlbum(result, activeTrackId);
				
    			//unlock menu
			});
		}
    }
	
	function displayAlbum(albumFeed, activeTrackId) {
		artistId = albumFeed['artist_id'];
		albumId = albumFeed['album_id'];
        albumName = document.dictionary.getAlbum(albumId);
        artistName = document.dictionary.getArtist(artistId);

        // set for page title
        document.library.currentAlbumName = albumName;
        document.library.currentArtistName = artistName;

        //update address
        document.library.currentAlbum = albumId;
        document.library.currentArtist = artistId;
        printLocationHash(artistId, albumId, null, document.library.currentArtistName+'_'+document.library.currentAlbumName);

        printArtistRow(artistId, artistName);
        printAlbumRow(artistId, albumId, albumName);

		printAlbumCover(artistName, albumName);

        printSubscribeRow(albumId, albumName, artistId, artistName, albumFeed);

        document.library.playlist = albumFeed['tracks'];

        // go through all items
        var tracks = '';
        var i = 1;
        for(itemId in albumFeed['tracks']) {
            tracks += '<tr id="player-track'+itemId+'" class="player-content-playlist-track" onclick="javascript:document.library.play(\''+itemId+'\');">';
            tracks += '<td class="player-content-playlist-track-number">'+i+'</td>';
            tracks += '<td class="player-content-playlist-track-name">'+albumFeed["tracks"][itemId]["title"]+'</td>';
            tracks += '<td class="player-content-playlist-track-time">'+albumFeed["tracks"][itemId]["duration"]+'</td>';
			tracks += '<td class="player-content-playlist-track-download"><div id="player-download-button" class="player-content-button" title="Download" onClick="javascript:document.library.download(\''+itemId+'\');"></div></td>';
            tracks += '</tr>';
            i++;
        }
        jQuery('#player-content-playlist').html('<table id="player-content-playlist-table" cellpadding="0" cellspacing="0">'+tracks+'</table>');

		// enable download link
		$('#player-download-button').button({
			text: false,
			icons: {
				primary: 'ui-icon-download'
			}

		}).click(function() { });

        // hilight current
        $("#player-track"+this.currentTrack).addClass("player-current-track");

        // unlobck menu
        $('#player-left-column').unblock();
//        $("#player-sidebar").accordion("resize");
        var aa = $('#player-sidebar .selected');
//        aa.removeClass('selected');
//        aa.next().next().addClass('selected');
//        aa.addClass('ui-state-default');
//        aa.addClass('ui-accordion-content-active');
        

        // play first
        if(typeof(activeTrackId) != 'undefined') {
            document.library.play(activeTrackId);
        }
        else {
            // we don't want to play first tracks by default
            //document.library.play(0);
        }
	}

    function printLocationHash(artistId, albumId, trackId, urlString) {
        //default values
        albumId = typeof(albumId) != 'undefined' ? albumId : 0;
        trackId = (typeof(trackId) != 'undefined' && trackId != null) ? trackId : 0;

        // Remove non-alphanumeric characters
        urlString = urlString.replace(/ |-/g, "_").replace(/\?|!|\.|,|&/g, "").split("'").join("");;

        window.location.hash = artistId+"-"+albumId+"-"+trackId+"-"+urlString;
    }

	function download(id) {
		location.href = document.library.playlist[id]['filepath'];
	}

    function play(id) {
        // we can play
        if (id != -1) {
            try {
                // $("#player-content").block({message: null});
                loadFile(document.library.playlist[id]['filepath'])

                //update current track ID
                document.library.currentTrack = id;

                // change page  title
                document.library.currentTitle = document.library.playlist[id]['title'];

                $(document).prop("title", document.mainTitle + " - "
                    + document.library.currentArtistName + " - "
                    + document.library.currentAlbumName + " - "
                    + document.library.currentTitle);

                $("#player-controls-display-track-info-speaker").html(document.library.currentArtistName);
                $("#player-controls-display-track-info-track-name").html(document.library.currentTitle);

                $("#player-content-playlist-table tr").removeClass("player-current-track");
                $("#player-track"+id).addClass("player-current-track");

                //update location
                printLocationHash(document.library.currentArtist, document.library.currentAlbum, document.library.currentTrack, document.library.currentArtistName+'_'+document.library.currentTitle);
            }
            catch(err) {
                //alert(err.description);
            }
            finally
            {
               // $("#player-content").unblock();
            }
        }
    }
	
    function playNext() {
        play(getNextId());
    }

    function playPrev() {
        play(getPrevId());
    }

    function getCurrentTrackUrl() {
        return document.library.playlist[this.currentTrack]['filepath'];
    }

    function showDialog(dialogId) {
        $("#player-dialog").show(0);
        $("#"+dialogId).show(0);
    }

    function hideDialogs() {
        $("#player-dialog").hide(0);
        $("#player-dialog > div").hide(0);
    }
}

