  var gbase="http://www.google.com/reader/ui/3523697345-audio-player.swf?autoPlay=true&audioUrl=";
  var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  var days=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];

  function generatePlayer(i,filename) {
    var h=27;
    var w=400;
    var url=gbase+escape(base+filename);

    return "<div class='audio_dld' id='playaDivId_"+i+"' "+   // style='display: none' "+
      +" class='audio-player-placeholder' width='"+w+"px'>\n"
      +"  <object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'\n"
      +"    codebase=\"http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0\"\n"
      +"    width='"+w+"px' align='middle' height='"+h+"px'>\n"
      +"    <param name='quality' value='best'>\n"
      +"    <param name='allowScriptAccess' value='never'>\n"
      +"    <param name='allowFullScreen' value='true'>\n"
      +"    <param name='wmode' value='transparent'>\n"
      +"    <param name='movie' value=\""+url+"\">\n"
      +"    <embed classname='audio-player-embed'\n"
      +"      type='application/x-shockwave-flash'\n"
      +"      src=\""+url+"\"\n"
      +"      allowscriptaccess='never' allowfullscreen='true' quality='best'\n"
      +"      bgcolor='#ffffff' wmode='transparent' flashvars='playerMode=embedded'\n"
      +"      pluginspage='http://www.macromedia.com/go/getflashplayer' width='"+w+"px' height='"+h+"px'>\n"
      +"  </object>\n"
      +"</div>"
  }

  function makeDownloadLink(f) {
    return "<a class='audio_dll' href=\""+base+f+"\" title='click to download the full mp3'>"+
      // "<img border='0' width='80px' height='15px' src='audio_mp3_button.png' />"+
      "download mp3"+
      "</a>";
  }

  function makePlayNowLink(i) {
    return "<a class='audio_pnl' id='pnlId_"+i+"' href='javascript:void(0)' onclick='toggleVis("+i+
      ")' title='click to show instant-start player' >play now</a>";
      //+
//      "<a class='audio_snl' href='javascript:void(0)' onclick='toggleVis("+i+
//      ")' title='click to STOP player'><span id='stopper'>%nbsp;</span> stop now</a>";
//      "<div class='buttons'><a href='#' class='negative' onclick='toggleVis("+i+")>"+
//      "<img src='cross.png' alt='' />stop/close player</a></div>"
  }

  function toggleVis(i) {
    //var n=document.getElementById("playaDivId_"+i);
    if(currentlyPlaying>-1 && currentlyPlaying!=i) {
      // stop playback and reset UI
      var nowPlaying=document.getElementById("playaContainerId_"+currentlyPlaying);
      nowPlaying.innerHTML="";
      var nowLink=document.getElementById("pnlId_"+currentlyPlaying);
      nowLink.innerHTML="play now";
      currentlyPlaying=-1;
    }

    if(currentlyPlaying>-1) {
      // stop playback and reset UI
      var nowPlaying=document.getElementById("playaContainerId_"+currentlyPlaying);
      nowPlaying.innerHTML="";
      var nowLink=document.getElementById("pnlId_"+currentlyPlaying);
      nowLink.innerHTML="play now";
      currentlyPlaying=-1;
    }
    else {
      // playback "i"
      var n=document.getElementById("playaContainerId_"+i);
      var playa=generatePlayer(i,a[i].f);
      n.innerHTML=playa;
      var nowLink=document.getElementById("pnlId_"+i);
      nowLink.innerHTML="stop now";
      currentlyPlaying=i;
    }
  }

  function toggleD(n) {
    var linkText=n.innerHTML;
    if(linkText==="&gt;&gt; full description") {
      var mySpan=n.parentNode;
      var dotSpan=mySpan.previousSibling;
      var desc2Span=mySpan.nextSibling;
      dotSpan.style.display='none';
      mySpan.style.display='none';
      desc2Span.style.display='';
    }
  }

  function makeDate(rawDate) {
    var dayNum=rawDate.substr(6,2);
    var monNum=new Number(rawDate.substr(4,2));
    var yrNum=new Number(rawDate.substr(0,4));
    var monName=months[monNum-1];
    var dateObj=new Date();
    dateObj.setDate(new Number(dayNum));
    dateObj.setMonth(monNum-1);
    dateObj.setYear(yrNum);
    var dayOfWeekNum=dateObj.getDay();
    var dayOfWeekName=days[dayOfWeekNum];
    var classByMonth=((monNum % 2)==1 ? "the_date_modd" : "the_date_meven");
    classByMonth="the_date_meven"; // better
    return "<div class='"+classByMonth+"'>"+
       "  <div class='date_m'>"+dayOfWeekName+" "+monName+"</div>"+
       "  <div class='date_d'>"+dayNum+"</div>"+
           "</div>"
    ;
  }

  function makeTime(totalSecondsStr) {
    var totalSeconds=parseInt(totalSecondsStr);
    var remainderSeconds = totalSeconds % 60;
    var minutes = ( totalSeconds - remainderSeconds ) / 60;
    var pad="";
    if(remainderSeconds<10) {
      pad="0";
    }
    // return minutes+":"+pad+remainderSeconds;
    return "running time "+minutes+" minutes";
  }

  function makeDescriptionText(i) {
    var desc=a[i].ds;
    if(desc==="") {
      return "";
    }
    var dynControl="<span>...</span><span>"+
                   "<a class='descmore' title='click to display the full decsription text' "+
                   " href='javascript:void(0)' onclick='toggleD(this)'>>> full description</a></span>";
				   "</span>";
    var wordsToDisplay=7;
    var splitPoint=0;
    var pos=0;
    for(var i=0; i<wordsToDisplay; i++) {
      splitPoint=desc.indexOf(" ",pos);
      if(splitPoint==-1) {
        pos=0;
        break;
      }
      pos=splitPoint+1;
    }
    var firstPart=desc.substring(0,splitPoint);
    var secondPart=" "+desc.substring(splitPoint);
    var secondPartMarkup="<span style='display:none'>"+secondPart+"</span>";
    return "<br />"+firstPart+dynControl+secondPartMarkup;
  }

  function makeSize(totalBytes) {
    var remainderBytes = totalBytes % (1024 * 1024);
    var mBytes = ( totalBytes - remainderBytes) / (1024 * 1024);
    var tenthsRemainder = remainderBytes % (1024 * 1024 / 10);
    var tenthsMb = (remainderBytes - tenthsRemainder) / (1024 * 1024 / 10);
    return mBytes + "."+Math.floor(tenthsMb)+"mb";
  }

  function groupByDate(arr) {
    var result=[];
    for(var i=arr.length-1; i>-1; i--) {
      var rec=arr[i];
      var others=result[rec.d];
      if(others==undefined) {
        others=[rec];
        result[rec.d]=others;
      }
      else {
        others.splice(1,0,rec);
      }
    }
    return result;
  }

  function intradaySort(a,b) {
    if(a.f==b.f) return 0;
    return (a.f>b.f ? 1 : -1);
  }

  function generateListing() {
    var groupedByDate=groupByDate(a);
    var k=0;
    var sortedByDate=[];
    for(key in groupedByDate) {
      sortedByDate.splice(1,0,key);
    }
    sortedByDate.sort().reverse();
    for(var i=0; i<sortedByDate.length; i++) {
      var recArrDt=sortedByDate[i];
      var recArr=groupedByDate[recArrDt].sort(intradaySort);
      if(k>0) {
        document.write("<tr><td colspan='3'>&nbsp;</td></tr>");
        document.write("<tr class='audio_seprow' style='border-top: 1px dotted lightgray'><td colspan='3'>&nbsp;</td></tr>");
      }
      for(var j=0; j<recArr.length; j++) {
        var rec=recArr[j];
        if(j==0) {
          document.write("<tr>"+
            "<tr><td class='audio_calcol'>"+makeDate(rec.d)+"</td>"+
            "<td class='audio_colorbar'></td><td class='audio_txt' width='420px'>");
        }
        else {
          document.write("<br />");
        }
        k++;
        //var playa=generatePlayer(k,rec.f);
    var originalIndex=0;
    for(var x=0; x<a.length; x++) {
      if(rec.f==a[x].f) {
            originalIndex=x;
        break;
      }
    }
        document.write(
          "  <span class='audio_title'>"+rec.t+"</span><br /><span class='audio_by'>by "+rec.s+"</span>"+
          " "+makeDescriptionText(originalIndex)+" <br /> "+
          "  <span style='white-space:nowrap'>"+makePlayNowLink(originalIndex)+" or "+makeDownloadLink(rec.f)+
          "<span style='white-space:nowrap; color: gray'> | " +makeTime(rec.dr)+", "+makeSize(rec.b)+" </span></span> <br />"+
          "<div id='playaContainerId_"+originalIndex+"'></div>"
          //playa

        );
      }
      document.write("</td></tr>\n");
    }
  }
