/**
 * flowplayer.playlist.js 3.0.0. Flowplayer JavaScript plugin.
 * 
 * This file is part of Flowplayer, http://flowplayer.org
 *
 * Author: Tero Piirainen, <support@flowplayer.org>
 * Copyright (c) 2008 Flowplayer Ltd
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * SEE: http://www.opensource.org/licenses
 * 
 * Version: 3.0.0 - Tue Nov 25 2008 16:30:11 GMT-0000 (GMT+00:00)
 */
(function($)
{

    $f.addPlugin("playlist", function(wrap, options)
    {

        // self points to current Player instance
        var self = this;

        var opts = {
            playingClass: 'playing',
            pausedClass: 'paused',
            progressClass: 'progress',
            template: '<a href="${url}">${title}</a>',
            loop: false,
            playOnClick: true
        };

        $.extend(opts, options);
        wrap = $(wrap);
        var manual = self.getPlaylist().length < 2;
        var els = null;


        /* setup playlists with onClick handlers */

        // template based playlist
        if (!manual)
        {

            var template = wrap.is(":empty") ? opts.template : wrap.html();
            wrap.empty();

            $.each(self.getPlaylist(), function()
            {

                var clip = this;

                var el = template;

                $.each(clip, function(key, val)
                {
                    el = el.replace("$\{" + key + "\}", val).replace("$%7B" + key + "%7D", val);
                });

                el = $(el);

                el.click(function()
                {
                    return play(el, clip.index);
                });

                wrap.append(el);
            });

            els = wrap.children();


            // HTML based playlist
        } else
        {

            els = wrap.children();
            if (els.eq(0).hasClass("__scrollable")) { els = els.children(); }

            els.each(function()
            {
                var el = $(this);
                el.click(function()
                {
                    return play(el, el.attr("href"));
                });
            });

            // setup player to play first clip
            var clip = self.getClip(0);
            if (!clip.url && opts.playOnClick)
            {
                clip.update({ url: els.eq(0).attr("href") });
            }

        }

        function play(el, clip)
        {

            if (el.hasClass(opts.playingClass) || el.hasClass(opts.pausedClass))
            {
                self.toggle();

            } else
            {
                el.addClass(opts.progressClass);
                self.play(clip);
            }

            return false;
        }


        function clearCSS()
        {
            //console.log('Remove all three from clearCSS');
            els.removeClass(opts.playingClass);
            els.removeClass(opts.pausedClass);
            els.removeClass(opts.progressClass);
        }

        function getEl(clip)
        {
            //console.log('Looking for ' + clip.url);
            return (manual) ? els.filter("[href$='" + clip.url + "']") : els.eq(clip.index);
        }

        // onStart
        self.onStart(function(clip)
        {
            //console.log('call clearCSS then add playingClass from onStart');
            clearCSS();
            getEl(clip).addClass(opts.playingClass);
        });

        // onPause	
        self.onPause(function(clip)
        {
            //console.log('Remove playing and add paused from onPause');
            getEl(clip).removeClass(opts.playingClass).addClass(opts.pausedClass);
        });

        // onResume
        self.onResume(function(clip)
        {
            //console.log('Remove paused and add playing from onResume');
            getEl(clip).removeClass(opts.pausedClass).addClass(opts.playingClass);
        });

        // what happens when clip ends ?
        if (!opts.loop && !manual)
        {

            // stop the playback exept on the last clip, which is stopped by default
            self.onBeforeFinish(function(clip)
            {
                if (clip.index < els.length - 1)
                {
                    return false;
                }
            });
        }

        // on manual setups perform looping here
        if (manual && opts.loop)
        {
            self.onBeforeFinish(function(clip)
            {
                var el = getEl(clip);
                if (el.next().length)
                {
                    el.next().click();
                } else
                {
                    els.eq(0).click();
                }
                return false;
            });
        }

        // onUnload
        self.onUnload(function()
        {
            clearCSS();
        });


        return self;

    });

})(jQuery);		
