Here you can find the most recent version of my Blogger Archive javascript scripts. The previous version(s) are found here. And you can view the lastest version in action here in my blog.
Important: Phil Ringnalda has done a lovely point'n'click Blogger Archive Script Generator loosely based on some of my code. It's probably the best way to get this functionality if you're not a script monkey yourself. :-)
The archive script presented here is designed for use with a weekly archive scheme. Points to note:
Disclaimer: As far as I'm concerned this code is in the public domain, if you do use it, a credit would be nice, but is not necessary. Whatever happens, if you use this software I am not responsible.
<script type="text/javascript" language="JavaScript" src="blogarc.html"></script>
where blogarc.html is the name of your archive file.
Add the following where you want the archive listing to be displayed
<script language="JavaScript" type="text/javascript"> //<![CDATA[ <!-- WriteArchiveSection( BlogInfo ); //--> //]]> </script>If you want simply (or additionaly) previous/next archive links you can call the WriteArchiveBottom() function.
<script language="JavaScript" type="text/javascript"> //<![CDATA[ <!-- WriteArchiveBottom(); //--> //]]> </script>
<script type="text/javascript" language="JavaScript" src="cookie.js"></script> <script type="text/javascript" language="JavaScript" src="blogarc.js"></script> <script type="text/javascript" language="JavaScript" src="blogarc.html"></script>
where blogarc.html is the name of your archive file. In the blogarc.js file edit line 116 to change the value "blogarc" to your own archive prefix. Finally modify the Blogger Template as detailed in the Single File instructions.
If in doubt, just use your browser's "view source" facility to see how I've done it in my site
Here's the code:
// (c)2002 A J Buchanan. Blogger populated data structure var count=0; var BlogInfo = new Array(); <Blogger> BlogInfo[count++] = new BlogArchiveEntry( "<$BlogArchiveLink$>" , "<$BlogArchiveName$>" ); </Blogger> // Other Data var defaultlimit = 5; // Limited Processing - Need list sorted function bi_comp( a, b ){ return -a.Compare( b ); } BlogInfo.sort( bi_comp );
// AJB 1/11/2001, cookie.js // (very) Simple cookie handling // Example usage: // var Xcookie = new obiCookie( "LimitArchive", 365 ); // ( First Param is cookie name, second is desired expirey time in days) // // 1. Read Cookie // var theCookie = Xcookie.GetCookie(); // if ( null == theCookie ) // // Cookie does not exist // else // // the cookie value can be taken either // // from the return value or from the .cookieVal property // var x = theCookie; // var x = Xcookie.cookieVal; // // 2. Write Cookie (Expiry time as in object initialisation) // Xcookie.SetCookie( "106" ); // // 3. Delete Cookie // Xcookie.KillCookie(); // // My Type 'obiCookie' // Constructor function obiCookie( theCookieName, theExpireTimeInDays ){ this.CookieName = theCookieName; this.cookieVal = null; this.expireTimeInMs = theExpireTimeInDays * 1000 * 60 * 60 * 24; } // Methods obiCookie.prototype.GetCookie = function(){ // Look for our named cookie var i = document.cookie.indexOf( this.CookieName + "=" ); if ( -1 != i ){ var e = document.cookie.slice( i ).indexOf( ";" ); this.cookieVal = document.cookie.slice( i+this.CookieName.length+1, (-1 != e)?e:document.cookie.length ); return this.cookieVal;} return null; } obiCookie.prototype.SetCookie = function( Value ){ var expireDate = new Date(); expireDate.setTime( expireDate.getTime() + this.expireTimeInMs ); var cookietext = this.CookieName + "=" + Value + "; expires=" + expireDate.toGMTString(); document.cookie = cookietext; this.cookieVal = Value; } obiCookie.prototype.KillCookie = function(){ var expireDate = new Date(); document.cookie = this.CookieName + "=0" + "; expires=" + expireDate.toGMTString(); this.cookieVal = null; } obiCookie.prototype.GetValue = function(){ return this.cookieVal; }
// AJB 28/10/2001 Better Archive Listings // Last Update 3/8/2002 // My Type 'BlogArchiveEntry' function BlogArchiveEntry( theLink, theName ) { this.Link = theLink; this.Name = theName; // Extract Date from Name, Yuk! // 09/30/2001 - 10/06/2001 this.StartDate = new Date( this.Name.slice(6,10), this.Name.slice(0,2)-1, this.Name.slice(3,5) ); this.EndDate = new Date( this.Name.slice(13+6,13+10), this.Name.slice(13+0,13+2)-1, this.Name.slice(13+3,13+5) ); } BlogArchiveEntry.prototype.Compare = function( rhs ){ if ( this.StartDate == rhs.StartDate ) return 0; else if ( this.StartDate > rhs.StartDate ) return 1; else return -1; } BlogArchiveEntry.prototype.MakeLink_UKShort = function(){ var newName = this.StartDate.getDate() + "/"+(this.StartDate.getMonth()+1) + "/"+this.StartDate.getFullYear(); var outString = ""; if ( -1 != location.href.indexOf( this.Link ) ){ // No Link, this is our page! outString = "<span class='selected'>" + newName + "</span>"; } else { // Link outString = "<a href='" + this.Link + "'>" + newName + "</a>"; } return outString; } BlogArchiveEntry.prototype.MakeLink_Normal = function(){ var outString = ""; if ( -1 != location.href.indexOf( this.Link ) ) { // No Link, this is our page! outString = this.Name; } else { // Link outString = "<a href='" + this.Link + "'>" + this.Name + "</a>"; } return outString; } // Short/Long listing selection function ShowAll(){ var cookie = new obiCookie( "LimitArchive", 365 ); cookie.SetCookie( 0 ); location.href = location.href; } function ShowSubset( HowMany ){ var cookie = new obiCookie( "LimitArchive", 365 ); cookie.SetCookie( HowMany ); location.href = location.href; } // Locate URL in list of archives function FindIdx( myURL ){ for ( var n=0; n<BlogInfo.length; n++ ) { if ( -1 != myURL.indexOf( BlogInfo[n].Link ) ) return n; } return -1; } // Make Archive Link Functions function MakePreviousArchiveLink( myURL, AnchorText ) { var idx; if ( -1 == ( idx = FindIdx( myURL )) ) return null; if ( 0 == idx ) return null; if (( null == AnchorText ) || ( "" == AnchorText )) return BlogInfo[idx-1].MakeLink_UKShort(); else return "<a href='" + BlogInfo[idx-1].Link + "'>" + AnchorText + "</a>"; } function MakeNextArchiveLink( myURL, AnchorText ) { var idx; if ( -1 == ( idx = FindIdx( myURL )) ) return null; if ( (BlogInfo.length-1) == idx ) return null; if (( null == AnchorText ) || ( "" == AnchorText )) return BlogInfo[idx+1].MakeLink_UKShort(); else return "<a href='" + BlogInfo[idx+1].Link + "'>" + AnchorText + "</a>"; } function MakeFirstArchiveLink( AnchorText ) { if (( null == AnchorText ) || ( "" == AnchorText )) return BlogInfo[0].MakeLink_UKShort(); else return "<a href='" + BlogInfo[0].Link + "'>" + AnchorText + "</a>"; } function WriteArchiveSection() { document.write( "<ul>" ); var isIndexPage = ( -1 != location.href.indexOf( "index.html" ) ); var isArchivePage = ( -1 != location.href.indexOf( "blogarc" ) ); var thisIndex = FindIdx( location.href ); // Show Link for Home Page, if this is an archive Page if ( !isIndexPage ) document.write( "<li><a href=\"./\">" + "Current Posts</a></li></ul><ul>" ); // Next/Previous Links var navlink=""; var wrotelink=false; if ( navlink = MakeNextArchiveLink( location.href, "Previous Week" )){ document.write( "<li>" + navlink + "</li>" ); wrotelink=true; } if ( navlink = MakePreviousArchiveLink( location.href, "Following Week" )){ document.write( "<li>" + navlink + "</li>" ); wrotelink=true; } if ( true == wrotelink ) document.write( "</ul><ul>" ); // Work out extents of listing var startindex = 0; var limit = 0; var limitArchiveCookie = new obiCookie( "LimitArchive", 365 ); if ( null == limitArchiveCookie.GetCookie() ) limitArchiveCookie.SetCookie( defaultlimit ); limit = Number(limitArchiveCookie.GetValue()); if ( 0 != limit ){ // Showing a subset around the current archive file if ( -1 == thisIndex ) startindex = 0; // but this is not an archive page, so don't! else startindex = Math.round( thisIndex - (limit/2) ); limit += startindex; } else // Showing whole lisiting limit = BlogInfo.length; // Clamp selected region to ends if ( startindex < 0 ){ limit -= startindex; startindex = 0; } if ( limit > BlogInfo.length ){ startindex -= (limit-BlogInfo.length); limit = BlogInfo.length; } // The Archives for ( var n=startindex; n<limit; n++ ) { document.write( "<li>" + BlogInfo[n].MakeLink_UKShort() +"</li>" ); } // Archive Length Options if ( 0 == limitArchiveCookie.GetCookie() ) document.write( "<li><a href=\"javascript:ShowSubset(defaultlimit);\">" +"[Show Less]</a></li>" ); else document.write( "<li><a href=\"javascript:ShowAll();\">" +"[Show All]</a></li>" ); document.write( "</ul>" ); } function WriteArchiveBottom() { // Next/Previous Links var navlink=""; var wrotelink=false; if ( navlink = MakeNextArchiveLink( location.href, "[<< Previous Week]" )) { document.write( navlink ); wrotelink=true; } if ( navlink = MakePreviousArchiveLink( location.href, "[Following Week >>]" )) { document.write( (wrotelink?" ":"") + navlink ); wrotelink=true; } if ( !wrotelink ) { document.write( MakeFirstArchiveLink( "[<< Archives]" ) ); } }