	M=[
 [ "createDSN.sas","dbf2sas.sas","doc2sas.sas","findfiles.sas","note2sas.sas","ora2sas.sas","pickdate.sas","quotes.sas","read_dbf.sas","stdout.sas"]
,[ "delabel.sas","delete.sas","deleteds.sas","ds_wait.sas","huntstop.sas","nextmemn.sas","nextobjn.sas","orderidx.sas","purtysql.sas","reorder.sas","resize.sas","SameLabel.sas","samelabl.sas","viewsource.ora"]
,[ "ds2htm.sas","ds2text.sas","sas2dbf.sas","sas2xls.sas","xmlib.sas","~sas2xls.sas"]
,[ "calendar.sas","jdsgimac.sas","jsTitleAndFootnote.sas","makegridtemplate.sas","scattermatrix.sas","style-gallery.sas","tiffdevice.sas","webframe.sas"]
,[ "compcnt.sas","firstcap.sas","hash-macros.sas","hierarch.sas","multi-level-hash.sas","putHash.sas","putln.sas"]
,[ "_delmac_.sas","add2optn.sas","anyobs.sas","array.sas","clearmv.sas","clearmvs.sas","existmac.sas","existmv.sas","hasvar.sas","lastword.sas","loaddata.sas","metadata.sas","quikmail.sas","resolveIt.sas","reverse.sas","sasname.sas","seplist.sas","split.sas","tranwrdi.sas"]
,[ "cleanLib.sas","getzips.sas","para_sym.sas","prependLib.sas","Rolands.sas","sumpuzzle.sas"]]
	P=[
 [ "Programatically create an ODBC data source to a Microsoft Access database","Macro to convert dbase file to SAS dataset: Ver 3.0b.<br><b><i>Author Richard Hockey DPH Sep 1998,<br>rhockey@mater.org.au</i></b><br><br>See also <a href=\"index.php?m=sas2dbf\">sas2dbf</a>","Create a SAS table from a table in a document.","Obtain information about files: type, size, time modified, altname and owner.","Read a Lotus Notes database that has been File/Exported... as a structured text file","Create SAS data sets or views from/to Oracle tables","Select a date from a month long calendar","Fetch stock quotes from Yahoo into a data set","Import a dBase III file into a SAS data set","Place the stdout of a command in the tokenization stream"]
,[ "Remove labels from all columns in a data set.","Delete a data set or view","Delete a data set or view","Wait for a data set to become available for exclusive lock","Hunt down and stop users with a lock on the data set you must modify","Emit the next available (non-existent) library member from a sequence having numerically advancing suffixes.","Emit the next available (non-existent) catalog object from a sequence having numerically advancing suffixes.","Create an index named 'order' for a data set","Pretty print SQL source. Not to shabby. Use with <A HREF=\"index.php?m=viewsource.ora\">viewsource.ora</A>","Writes a SAS program to regenerate a data set","Rebuild a data set, shortening all the character columns to minimum space required","Label variables in second data set the same as in the first data set","Label variables in second data set the same as in the first data set","Oracle procedure to extract view source"]
,[ "Output data set as html","Export data set to a field delimited text file","Macro to convert SAS dataset to dbase file. Ver 2.0B.<br><b><i>Author Richard Hockey DPH Sep 1998,<br>rhockey@mater.org.au</i></b><br><br>See also <a href=\"index.php?m=dbf2sas\">dbf2sas</a>","Export SAS datasets and OUTPUT catalog entries as worksheets of an Excel file.<BR>This macro can write to _WEBOUT to deliver binary Excel worksheets from SAS/Intrnet applications","Export several SAS tables in one XML file","Deprecated, replaced by <a href=\"?m=sas2xls\">sas2xls<a>.<BR>Export up to fifty SAS datasets and/or SOURCE catalog entries as worksheets of an Excel file.<BR>This macro can write to _WEBOUT to deliver real Excel worksheets from SAS/Intrnet applications"]
,[ "Generate a calendar using Proc REPORT","Simplfy utilization of Java2D Graphics","ODS HTML Javascripted titles and footnotes of unlimited length.<BR>Sample <A HREF=\"jsTitleAndFootnote-sample.sas\" TYPE=\"text/plain\">SAS program</A>, <A HREF=\"jsTitleAndFootnote-sample.html\">HTML output</A>, <A HREF=\"jsTitleAndFootnote-sample.js.html\">Javascript generated</A>","Create a GREPLAY template that is a grid of ordered panels","Create a matrix of scatter plots, graphing pairs of variables from your data","Generate output according to each style that can be specified.","Create a TIFF graphics device that outputs images at a custom dpi","Generate an HTML GRSEG previewer with Thumbnails. Modification of <A HREF=\"http://ftp.sas.com/techsup/download/sample/graph/other-webframe.html\">SI sample</A>, similar to WEBFRAME device (V7)"]
,[ "Compare number of rows in by-groups of two data sets","Given a string of words in all uppercase, convert so only first letter of each word is capitalized","Macros for simplified use of arrays as hashes. Be forewarned, know thy technique, know thy data.","For a given data set and by group specification, create a data set enumerating parent/child relationships of the by groups","Macros for implementing and utilizing multi level hashes in DATA Step.","Show the contents of a hash in the log.","Show a multiline text value in the log."]
,[ "Delete a macro","Add a path or other additional information to a SAS option","Check if a data set has any rows","Populate a macro array (<i>N</i> macro variables) from a delimited list of items","Set all global macro variables to blank","Set all global macro variables to blank","Determines if a macro exists","Determines if a macro variable exists","Determine if a data set has a variable of a given type","Returns the last word from a delimited list of words.<BR>Version 8: use %scan (<I>x y z</I>, -1)","Simplistic cards like emulation for DATA Steps emitted by macro","Data about data","Fire off an email with a small message: to, subject and body","Resolve any level of indirect addressing as specified in a template expression","Reverse a macro variable's value.","Determine if a string is a valid SAS name","Emit a list of items separated by some delimiter","Populate a macro array (<i>N</i> macro variables) from a delimited list of items.  This macro uses rx* function, which have some problems with macro quoting tokens.","Case insensitive version of tranwrd()"]
,[ "Clean one libraries librefs from anothers","Return list of zipcodes within X miles of another","Generate symbol statements for a parallel plot","Prepend one libraries librefs to anothers","General purpose and specialized macros for pharmaceuticals","Programming exercise"]]
	N=[
 [ "Will show up when you run ODBC Data Source Administrator control panel applet","","<U>Windows</U> only.","<U>Windows</U> only.<BR>This macro will do wildcard and recursive searching.<BR>Updated 11/03/02 to provide owner.","All fields will be character","Can reformat character columns based on first N rows","","Past performance is not indicative of future profits :-)","","Handy for setting macro variables"]
,[ "","Emits a Proc SQL","Emits a Proc DATASETS","Useful when rebuilding or appending with merge during a <B>batch</B> job.  Uses UNIX sleep.  Will <B>endsas</B> if data not available after 10 waits.","SAS/Share and UNIX.  Also contains %showuser and %stopuser.","","","","Does a sufficient jobs for most purposes. <A HREF=\"purtysql-sample.sas\" TYPE=\"text/plain\">Sample Use</A>.<BR>Better yet, use <A HREF=\"http://www.revealnet.com\">Revealnet's PL/Formatter</A> with <A HREF=\"http://www.toadsoft.com\">ToadSoft</A>.","Opens the program into the SAS Editor for easy rearranging of columns, attribute changes and data transformations.","","Pure macro, but does not work ... yet.<BR>When MODVAR() function is available to Base SAS it will.","Emits a PROC step","SAS/Access to Oracle needed. <A HREF=\"purtysql-sample.sas\" TYPE=\"text/plain\">Sample Use</A>."]
,[ "Modified version of SI macro that allows where clause to contain a like-condition with % pattern matching specification","Column heading using names or labels can be requested","","Requires Perl and modules XML::Simple, Spreadsheet::WriteExcel and Date::Calc<BR><i>Current versions of Excel read XML files directly and you may not need this macro. Check out <a href=\"?m=xmlib\">xmlib<a> instead</i>.","Used by <a href=\"?m=sas2xls\">sas2xls<a>","Requires Perl and module Spreadsheet::WriteExcel.<BR>Thanks to John McNamara @ cpan.org for answering my questions, his great module makes writing a binary Excel file easy.<BR>A <A HREF=\"http://groups.google.com/groups?q=author%3Axlr82sas@aol.com+%22Bidirectional+Named+Pipe+Communications+between+PERL+and+SAS+%22\">Roger DeAngelis post</A> to SAS-L got me started on this."]
,[ "","Uses javaobj.<br>Java source, jar and examples are <a href=\"../samples/#jdsgi\">here</a>","Developed to work around <A HREF=\"http://support.sas.com/techsup/unotes/SN/005/005118.html\">SN-005118</A>, long TITLE and FOOTNOTE statements receive an unwanted &lt;BR&gt; at or near position 108 when using ODS HTML<BR><A HREF=\"jsTitleAndFootnote-sample.html\">Usage</A>","","Find other good stuff at <a href=\"http://www.math.yorku.ca/SCS/vcd/\">Michael Friendly's</a> Visualizing Categorical Data","May cause access violations.  Works best on version 9.1+","","Suitable for dynamic use since all pieces are named with a timestamp to prevent problematic caching. <A HREF=\"webframe-sample.sas\" TYPE=\"text/plain\">Sample</A>"]
,[ "Useful for comparing different extraction techniques that should result in same subset. Requires %makelist.","DATA Step only","Inspired by Paul Dorfman.","Useful for creating data for SAS/AF Organizational Chart class","Additional <A HREF='../samples/#hash7'>sample code</a>.","",""]
,[ "Useful when developing autocall macros. Must be invoked on a PROC boundary.","This extension of <A HREF=\"http://support.sas.com/kb/24/841.html\">Peter Craword's start-up quick tip</A> (found at SAS website) will handle repeated invocations and not add information already present","","","Pure macro implementation. For v8.2+ consider using <CODE>%symdel <I>mvar</I></CODE>","SQL implementation emits a Proc step. For v8.2+ consider using <B><CODE STYLE=\"white-space:nowrap\">%symdel <I>mvar</I></CODE></B>","Emits a Proc step, sets macro variable named in argument 2","Emits -1, 0 or 1","Emits 0 or 1","Useful for some generic forms of DATA Step BY processing with first<B>.</B> and last<B>.</B> logic","Not for everyone, not for every time.  This convenience should be used sparingly.","","Tested on UNIX","","For versions before v6.12. Otherwise use<BR><CODE>%sysfunc(reverse(&amp;&lt;macro-variable&gt;))</CODE>","Based on David L. Ward's %SASNAME posted to SAS-L April 11, 2002. Rewritten using verify().","Additional <a href=\"seplist-explain.html\">explanation</a>.","",""]
,[ "A simplistic way to remove librefs previously prepended earlier in a session","<A HREF=\"50.htm\">The $50 dollar macro</A> !","Sample use to follow someday","Prepending is great way to do test modifications to a production system without replacing any production code","",""]]

	var gropen, itopen, moff

	function infoHTML (nav,h) {
		var x = nav[1]
		var y = nav[2]
		var html = "<"+h+">"+M[x][y]+"</"+h+"><p class='label'>Purpose:</p><p class='info'>"+P[x][y]+"</p>"

		if (N[x][y] != "")
			html += "<p class='label'>Notes:</p><p class='info'>"+N[x][y]+"</p>"

		return html
	}
	function mover(e){var tg=e?e.target?e.target:this:this
		document.getElementById('info').innerHTML = infoHTML (tg.id.split('_'),'h3')
		document.getElementById('info').style.display='block'
	}
	function mout(e){var tg=e?e.target?e.target:this:this
		document.getElementById('info').style.display='none'
		if(moff)mover(moff)
	}
	function grover(e){var tg=e?e.target?e.target:this:this;if(tg!=gropen)tg.style.backgroundColor="#ccc"}
	function grout (e){var tg=e?e.target?e.target:this:this;if(tg!=gropen)tg.style.backgroundColor="#ddd"}
	function grick (e){var tg=e?e.target?e.target:this:this
		if (typeof gropen != 'undefined' && tg != gropen) {
			gropen.style.backgroundColor='#ddd'
			gropen.style.fontWeight='normal'
			gropen.style.borderColor='#888'
			itopen.style.display='none'
		}
		gropen = tg
		gropen.style.backgroundColor='#88BBFF'
		gropen.style.fontWeight='bold'
		gropen.style.borderColor='#6699FF'
		var itgid = gropen.id.replace(/group/,'items')
		itopen = document.getElementById(itgid)
		itopen.style.display='block'
	}
	function load(x,y) {
		// hash part of url (stuff after #) is for positioning web page to a named A tag
		// hash part is not available to web server side
		// it is strictly client side, thus process hash requests here
		// while setting up event handlers, check if the hash part matches a known macro
		var hash = location.hash.substring(1)
		var re = new RegExp ();
		re.compile ("^"+hash+"[.]", "i")
		var obj1, obj2
		for (var i=0;i<M.length;i++) {
			obj1 = document.getElementById('group'+i)
			obj1.group = i
			obj1.onmouseover = grover
			obj1.onmouseout  = grout
			obj1.onclick     = grick
			for (var j=0;j<M[i].length;j++) {
				obj2 = document.getElementById('i_'+i+'_'+j)
				obj2.onmouseover = mover
				obj2.onmouseout  = mout

				if (hash && re.test(new String(M[i][j]))) {
					location.href = "index.php?m="+hash
				}
			}
		}

		grick({target:document.getElementById('group'+x)})
		if (y != -1 ) {
			moff = {target:document.getElementById('i_'+x+'_'+y)}
			mover(moff)
		}
		obj1.style.borderBottom = '1px solid #888';
	}