function uniqueId() {
  if (typeof(dynamicIdCount) != 'number') {
    var dynamicIdCount = 0;
  }

  return("uniqueid"+dynamicIdCount++);
}


// Recoded to generate control/flash containers dynamically

var AudioPlayer = function(objXml, containerElem) {
    var jqContainer = $(containerElem);
    jqContainer.empty();
    //jqContainer = gContainer;
    var jqFlashEmbed = $('<div id="flash-embed" />');
    var strUrl;
    var time;
    var events_list = '';
    var event_order = 0;
    var playerId = uniqueId();
    var player;
    var progBar;
    var duration = 0;
    var time = 0;
    var run_once = true;
    var volume = 100;
    //Buttons:
    var playButton = new PlayerButton("Play", playTrack, "play");
    var pauseButton = new PlayerButton("Pause", pauseTrack, "pause");
    var stopButton = new PlayerButton("Stop", stopTrack, "stop");
    var rewindButton = new PlayerButton("Rewind", rewindTrack, "rewind");
    var forwardButton = new PlayerButton("Forward", forwardTrack, "forward");
    var muteButton = new PlayerButton("Mute", muteTrack, "mute");
    var volUpButton = new PlayerButton("Up", volUpTrack, "volume-up");
    var volDownButton = new PlayerButton("Down", volDownTrack, "volume-down");
    //Assembling the containers for the player
    //Container
    jqAudioContainer = $('<div id="audio-container" />');
    //Player
    jqAudioPlayerCont = $('<div id="audio-player" />');
    //Controls
    var jqControlPanel = $('<div id="control-panel" />');
    var jqControls = $('<div id="controls" class="clearfix" />');
    var jqStandardCont = $('<div id="standard-controls" class="clearfix" />');
    var jqUL = $('<ul />');
    var jqVolCont = $('<div id="volume-controls" class="clearfix" />');
    var jqVolUL = $('<ul />');

    // Status containers
    var jqStatusCont = $('<div id="status"><div id="inner-status" class="clearfix"><span class="ne">&nbsp;</span><span class="nw">&nbsp;</span><h2 class="rm">Status</h2><div class="col1"><p id="text-status">Idle</p></div><!-- end col1 --><div class="col2"><dl><dt>Current:</dt><dd id="now-playing"><span>00:00</span>:00</dd><dt>Duration:</dt><dd id="duration">00:00:00</dd></dl></div><!-- end col2 --><span class="se">&nbsp;</span><span class="sw">&nbsp;</span></div></div>');

    // progress bar containers
    var jqPBWrap = $('<div id="progress-bar-wrap" />');
    var jqIPB = $('<div id="inner-progress-bar" />');
    jqProgBarContainer = $("<div class='progress-bar-container' />");
    var jqPBUL = $('<ul />');

    //Timing containers and start/end buttons
    var jqTimingCont = $('<div id="timings" class="clearfix" />');
    var jqStartTime = $('<div id="start-time" />');
    var jqStartRow = $('<div class="row"><label for="start-hours">Hours</label><input type="text" maxlength="2" id="start-hours"><span class="dots">:</span><label for="start-minutes">Minutes</label><input type="text" maxlength="2" id="start-minutes"><span class="dots">:</span><label for="start-seconds">Seconds</label><input type="text" maxlength="2" id="start-seconds"></div><!-- end row --><div id="start-time-information"><span class="ne">&nbsp;</span><span class="nw">&nbsp;</span><div id="inner-start-time-information"><a href="#">Change <strong>Start</strong> to current play point</a></div><span class="se">&nbsp;</span><span class="sw">&nbsp;</span></div>');
    var jqEndTime = $('<div id="end-time">');
    var jqEndRow = $('<div class="row"><label for="end-hours">Hours</label><input type="text" maxlength="2" id="end-hours"><span class="dots">:</span><label for="end-minutes">Minutes</label><input type="text" maxlength="2" id="end-minutes"><span class="dots">:</span><label for="end-seconds">Seconds</label><input type="text" maxlength="2" id="end-seconds"></div><!-- end row --><div id="end-time-information"><span class="ne">&nbsp;</span><span class="nw">&nbsp;</span><div id="inner-end-time-information"><a href="#">Change <strong>End</strong> to current play point</a></div><span class="se">&nbsp;</span><span class="sw">&nbsp;</span></div>')

    var jqStartBtn = jqStartRow.find('a');
    var jqEndBtn = jqEndRow.find('a');


    var setTranscriptTime = function(intTime, strWhich) {
        /*
        mapTime = convertTimeMapping(intTime);
        $('#'+strWhich+'-seconds')[0].value=mapTime['seconds'];
        $('#'+strWhich+'-minutes')[0].value=mapTime['minutes'];
        $('#'+strWhich+'-hours')[0].value=mapTime['hours'];
        */
    }

    jqStartBtn.bind("click", function(evt){
        setTranscriptTime(getCurrentTime(), 'start');
        return false;
    })
    jqEndBtn.bind("click", function(evt){
        setTranscriptTime(getCurrentTime(), 'end');
        return false;
    })

    //flash container
  var jqFlashContainer = $("<div id="+playerId+" />");
    jqContainer.empty();
    jqUL.append(playButton.element);
    jqUL.append(pauseButton.element);
    jqUL.append(stopButton.element);

    jqVolCont.append($('<h3>Volume:</h3>'));
    jqVolCont.append(jqVolUL);
    jqVolUL.append(muteButton.element);
    jqVolUL.append(volDownButton.element);
    jqVolUL.append(volUpButton.element);

    jqControls.append($('<h2 class="rm">Controls:</h2>'));
    jqControls.append(jqStandardCont);
    jqControls.append(jqVolCont);
    jqControlPanel.append(jqControls);
    jqControlPanel.append(jqStatusCont);

    jqPBUL.append(rewindButton.element);
    jqPBUL.append(forwardButton.element);
    jqIPB.append(jqPBUL);
    jqPBWrap.append(jqIPB);
    jqIPB.append(jqProgBarContainer);

    //jqAudioPlayerCont.append($('<h1>'+title+'</h1>'));
    //Append the button control panel
    jqFlashEmbed.append(jqFlashContainer);
    jqAudioPlayerCont.append(jqFlashEmbed)
    jqAudioPlayerCont.append(jqControlPanel);
    jqAudioPlayerCont.append(jqPBWrap);
    //Append progress bar

    jqAudioPlayerCont.append(jqTimingCont);
    jqAudioPlayerCont.append($('<span class="se">&nbsp;</span><span class="sw">&nbsp;</span>'));
    jqAudioContainer.append(jqAudioPlayerCont);
    jqContainer.append(jqAudioContainer);

    var embedJWPlayer = function() {
        var flashvars = {
          controlbar: 'none'
        };
        var params = {

        };
        var attributes = {
          id: playerId,
          name: playerId,
          wmode: 'transparent'
        };
        swfobject.embedSWF("/broads/live/javascript/player/player.swf", playerId, "460", "345", "9.0.0",'', flashvars, params, attributes);
    }

    embedJWPlayer();

    var loadFile = function(strFile) {
        player.sendEvent("LOAD",strFile);
    }

    var render = function() {
        player = document.getElementById(playerId);
        strUrl = $(objXml).find('media').attr('url');
        loadFile(strUrl);
        jqStandardCont.append(jqUL);

        //jqAudioContainer.append(jqContainer);
        player.addModelListener('TIME','playerEvents().time');
        player.addModelListener('LOADED','playerEvents().loaded');
        player.addModelListener('STATE','playerEvents().state');
        player.addViewListener('PLAY','playerEvents().playing');
        //player.addControllerListener('VOLUME','playerEvents().volume');
        player.addControllerListener('MUTE','playerEvents().mute');
   }


  function getCurrentTime() {
    return time;
  }

  function getDuration() {
    return duration;
  }

    /**
        Progress bar
    */


    function setPositionListener(evt) {
        var num;
        num = getDuration()*evt;
        //progBar.setPlayed(evt);
        setCurrentTime(num);
    }

    function setSegmentStartListener(evt) {
        //mapTime = convertTimeMapping(evt*getDuration());
        setTranscriptTime(evt*getDuration(), 'start');
    }

    function setSegmentEndListener(evt) {
        setTranscriptTime(evt*getDuration(), 'end');
    }


    progBar = new ProgressBar(setPositionListener, setSegmentStartListener, setSegmentEndListener);

    jqProgBarContainer.append(progBar.element);
    progBar.setLoaded(0);
    progBar.setPlayed(0);
    progBar.setSegmentStart(0);
    progBar.setSegmentEnd(1);


    /**
        Timer
    */

    var convertTime = function(time, layout) {
        var hours, minutes, seconds;
        var html;
        hours = minutes = seconds = '00';
        time = parseInt(time);
        if(time >= 60) {
            minutes = parseInt(time/60);
            seconds = time-(minutes*60);
            if(minutes >= 60) {
                hours = parseInt(minutes/60);
                minutes -= parseInt(hours*60);
            }
        } else {
            seconds = time;
        }
        if(seconds < 10) { seconds = '0'+seconds; }
        minutes = (minutes < 10)?((minutes=='00')?minutes:'0'+minutes):minutes;
        hours = (hours < 10)?((hours=='00')?hours:'0'+hours):hours;
        if(layout) {
            html = "<span>"+hours+":"+minutes+"</span>"+":"+seconds;
        } else {
            html = hours+":"+minutes+":"+seconds;
        }
        return html;
    }
    var convertTimeMapping = function(time) {
        var hours, minutes, seconds;
        var mapTime = new Object()
        hours = minutes = seconds = '00';
        time = parseInt(time);
        if(time >= 60) {
            minutes = parseInt(time/60);
            seconds = time-(minutes*60);
            if(minutes >= 60) {
                hours = parseInt(minutes/60);
                minutes -= parseInt(hours*60);
            }
        } else {
            seconds = time;
        }
        if(seconds < 10) { seconds = '0'+seconds; }
        minutes = (minutes < 10)?((minutes=='00')?minutes:'0'+minutes):minutes;
        hours = (hours < 10)?((hours=='00')?hours:'0'+hours):hours;
        mapTime['seconds'] = seconds;
        mapTime['minutes'] = minutes;
        mapTime['hours'] = hours;
        //console.log(mapTime);
        return mapTime;
    }
    var renderStatus = function(statusContainer) {

    }
    /**
        Event listeners
    */
  function evtSetTime(obj) {
    time = obj.position;
    duration = obj.duration;
    progBar.setPlayed(time/duration);
    $('#now-playing').html(convertTime(time, true));
    $('#duration').html(convertTime(duration, false));
        if(run_once) {
            setTranscriptTime(getDuration(), 'end');
            run_once = false;
        }
  }

  function evtSetLoaded(obj) {
    progBar.setLoaded(obj.loaded/obj.total);
  }

    function evtSetPlaying(obj) {
    }

    function evtSetState(obj) {
        $('#text-status').text(obj['newstate']);
        if(obj['newstate'] == 'PLAYING') {
            playButton.disable();
            pauseButton.enable();
            stopButton.enable();
        }
        if(obj['newstate'] == 'PAUSED') {
            playButton.enable();
            pauseButton.disable();
            stopButton.enable();
        }
        if(obj['newstate'] == 'IDLE' || obj['newstate'] == 'COMPLETED') {
            playButton.enable();
            pauseButton.enable();
            stopButton.enable();
        }
        if(obj['newstate'] == 'COMPLETED') {
            player.sendEvent('STOP',null);
        }

    }

    function evtMuteState(obj) {
        //console.log(obj);
        if(!obj['state']) {
            muteButton.inactive();
        } else {
            muteButton.active();
        }

    }

    function evtVolState(obj) {

    }

    /**
        Buttons and button commands
    */
    playButton.enable();
    pauseButton.enable();
    stopButton.enable();
    rewindButton.enable();
    forwardButton.enable();
    muteButton.enable();
    volUpButton.enable();
    volDownButton.enable();
    function playTrack() {
        progBar.enable();
        player.sendEvent('PLAY',true);
        return false;
    }
    function pauseTrack() {
        player.sendEvent('PLAY',false);
        return false;
    }
    function stopTrack() {
        player.sendEvent('STOP',null);
        return false;
    }
    function rewindTrack() {
        player.sendEvent('SEEK',getCurrentTime()-(getDuration()/100));
        return false;
    }
    function forwardTrack() {
        player.sendEvent('SEEK',getCurrentTime()+(getDuration()/100));
        return false;
    }
    function muteTrack() {
        player.sendEvent('MUTE');
        return false;
    }
    function volUpTrack() {
        volume += 10;
        player.sendEvent('VOLUME', volume);
        return false;
    }
    function volDownTrack() {
        volume -= 10;
        player.sendEvent('VOLUME', volume);
        return false;
    }
    function setCurrentTime(time) {
        player.sendEvent('SEEK',time);
    }
    return({
      'id': playerId,
        'render': render,
        'loadFile': loadFile,
        'convertTime': convertTime,
        'convertTimeMapping': convertTimeMapping,
        'playButton':playButton,
        'pauseButton':pauseButton,
        'stopButton': stopButton,
        'rewindButton':rewindButton,
        'forwardButton': forwardButton,
        'muteButton': muteButton,
        'volUpButton': volUpButton,
        'volDownButton': volDownButton,
        'setCurrentTime': setCurrentTime,
        'evtSetTime': evtSetTime,
        'evtSetLoaded': evtSetLoaded,
        'evtSetPlaying': evtSetPlaying,
        'evtSetState' : evtSetState,
        'evtMuteState': evtMuteState,
        'evtVolState': evtVolState,
        'setTranscriptTime':setTranscriptTime
    });

}


