
		var m_dptemplates;
		var m_dpbases;
		var m_dpitems;
		var m_dpsubs;
		var m_months;
		var m_abbrevmonths;
		var m_days;
		var m_abbrevdays;
		
		function isimage(str)
		{
			var found = false;
			var stemp = str.toLowerCase();
			 
			var images = new Array();
			images[0] = ".jpg";
			images[1] = ".jpeg";
			images[2] = ".jpe";
			images[3] = ".gif";
			images[4] = ".tif";
			images[5] = ".bmp";
			images[6] = ".png";
			
			var i;
			for (i=0; i < images.length; i++)
			{
				var i1 = stemp.lastIndexOf(images[i]);
				if ( i1 + images[i].length == stemp.length )	// found at end
				{
					found = true;
					break;
				}
			}
			
			return found;
		}

		function parselist(slist)
		{				    
			var i;
			var iindex = 0;
			var iarray = new Array();
			var item = "";
			
			if ( slist == null )
			    return iarray;
			
			if ( slist.length == 0 )
				return iarray;
				
			for (i=0; i < slist.length; i++)
			{
				var p = slist.charAt(i);
							
				switch (p)
				{
					case "\\":
						if ( slist.charAt(i+1) == "," )
						{
							item += ","
							i++;
						}
						else
						{
							item += "\\";
						}
						break;
						
					case ",":
						iarray[iindex++] = item;
						item = "";
						break;
						
					default:
						item += p;
				}	
			}
			iarray[iindex++] = item;
			return iarray;		
		}
		
		function makelist(sarray)
		{
			var slist = "";
			
			for (i=0; i < sarray.length; i++)
			{
				slist += sarray[i];
				if ( i < sarray.length - 1 )
					slist += ",";
			}
			
			return slist;
		}

		function formatago(now, dt, format)
		{
		    var longform = true;
		    
			var daysf = "";
			if (format.indexOf("D") != -1)
				daysf = "D";
			else if (format.indexOf("d") != -1)
				daysf = "d";

			var hoursf = "";
			if (format.indexOf("H") != -1)
				hoursf = "H";
			else if (format.indexOf("h") != -1)
				hoursf = "h";

			var minsf = "";
			if (format.indexOf("M") != -1)
				minsf = "M";
			else if (format.indexOf("m") != -1)
				minsf = "m";

			var secsf = "";
			if (format.indexOf("S") != -1)
				secsf = "S";
			else if (format.indexOf("s") != -1)
				secsf = "s";
				
		    var havesecs = false;
			if ( secsf.length > 0 )
			    havesecs = true;
				
			var past = true;
			var elapsed = now.getTime() - dt.getTime();	
			if ( elapsed < 0 )
			{
				past = false;
				elapsed = dt.getTime() - now.getTime();
			}
			
			var msecondsPerMinute = 1000 * 60;
			var msecondsPerHour = msecondsPerMinute * 60;
			var msecondsPerDay = msecondsPerHour * 24;

			var days = Math.floor( elapsed / msecondsPerDay );
			elapsed = elapsed - (days * msecondsPerDay );

			var hours = Math.floor( elapsed / msecondsPerHour );
			elapsed = elapsed - (hours * msecondsPerHour );

			var minutes = Math.floor( elapsed / msecondsPerMinute );
			elapsed = elapsed - (minutes * msecondsPerMinute );

			var seconds = Math.floor( elapsed / 1000 );
			
			var astr = "";
			if ( days != 0 )
			{
				if ( daysf == "D" )
				{
					if ( days == 1 )
						astr += days + " day"
					else
						astr += days + " days";
				}
				else if ( daysf == "d" )
				{
				    longform = false;
					astr += days + "d ";
				}
			}
			
			if ( hours != 0 )
			{					
				if ( hoursf == "H" )
				{
					if ( astr.length > 0 )
						astr += ", ";
					if ( hours == 1 )
						astr += hours + " hour"
					else
						astr += hours + " hours";
				}
				else if ( hoursf == "h" )
				{
				    longform = false;
					astr += hours + "h ";
				}
			}
			
			if ( minutes != 0 )
			{
				if ( minsf == "M" )
				{
					if ( astr.length > 0 )
						astr += ", ";
					if ( minutes == 1 )
						astr += minutes + " minute"
					else
						astr += minutes + " minutes";
				}
				else if ( minsf == "m" )
				{
				    longform = false;
					astr += minutes + "m ";
				}
			}

			if ( seconds != 0 )
			{
				if ( secsf == "S" )
				{
					if ( astr.length > 0 )
						astr += ", ";
					if ( seconds == 1 )
						astr += seconds + " second"
					else
						astr += seconds + " seconds";
				}
				else if ( secsf == "s" )
				{
				    longform = false;
					astr += seconds + "s";
				}
			}
									
			if ( astr.length > 0 )
			{
				if ( past )
					astr += " ago";
				else
					astr += " from now";
			}
			
			// catch possible negative time
			/*
			if ( days < 0 )
				astr = "";
			*/
			
			if ( astr.length == 0 )
			{
				if ( longform )
				    if ( havesecs )
					    astr = "1 second ago";
					else
					    astr = "1 minute ago";
				else
				    if ( havesecs )
					    astr = "1s ago";
					else
					    astr = "1m ago";
			}
									
			return astr;
		}
		
		function onlist(value, list)
		{
			var i = 0;
			var found = false;
			while ( i < list.length && !found )
			{
				if ( list[i] == value )
					found = true;
				else
					i++;
			}
			
			if ( found )
				return(i);
			else
				return(-1);
		}
		
		function updatetimebase(item, newbase)
		{
			var i;
			for (i=0; i < m_timeitems.length; i++)
			{
				if ( item == m_timeitems[i] )
				{
					m_timebases[i] = newbase;
					dotimeupdates(false);
					return;
				}
			}
		}
		
		function initdps()
		{		
			m_abbrevmonths = new makeArray('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
			m_months = new makeArray('January','February','March','April','May','June','July','August','September','October','November','December');
			m_days = new makeArray('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
			m_abbrevdays = new makeArray('Sun','Mon','Tues','Wed','Thur','Fri','Sat');

			m_dpitems = new Array();
			m_dpbases = new Array();
			m_dptemplates = new Array();
			m_dpsubs = new Array();
			
			var pp = document.getElementById("pageproperties");
			var dpl = parselist(pp.getAttribute("dpl"));
						
			var part = 1;
			var itemno = 0;
			var tuple;
			var subno = 0;			
			var sublist = new Array();

			var i;
			for (i = 0; i < dpl.length; i++)
			{
				var item = dpl[i];
				
				if ( item == "#" )
				{
					m_dpsubs[itemno] = sublist;
					sublist = new Array();
					subno = 0;

					part = 1;
					itemno++;
				}
				else
				{					
					switch (part)
					{
						case 1:
							m_dpitems[itemno] = document.getElementById(item);
							part = 2;
							break;
							
						case 2:
							m_dpbases[itemno] = new Date(item);
							part = 3;
							break;

						case 3:
							m_dptemplates[itemno] = item;
							part = 4;
							break;
							
						case 4:
							tuple = new Array();
							tuple[0] = new Number(item);
							part = 5;
							break;
							
						case 5:
							tuple[1] = item;
							part = 6;
							break;
						
						case 6:
							tuple[2] = item;
							sublist[subno] = tuple;
							subno++;
							part = 4;		// next tuple		
							break;
					}
				}				
			}

			if ( m_dpitems.length > 0 )
				window.setTimeout("dodpupdates(true)", 5000);	
		}
		
		function setdpitem(item, base, template, subs)
		{
		    var i;
			for (i=0; i < m_dpitems.length; i++)
			{
			    if ( m_dpitems[i] == item )
			    {
			        m_dpbases[i] = base;
			        
			        if ( template != null )
			            m_dptemplates[i] = template;
			            
			        if ( subs != null )
			        {
			            // *** this is not general
			            var s = parselist(subs);
			            m_dpsubs[i] = new Array();
			            m_dpsubs[i][0] = new Array();
			            m_dpsubs[i][0][0] = new Number(s[0]);
			            m_dpsubs[i][0][1] = s[1];
			            m_dpsubs[i][0][2] = s[2];			            
			        }
			        return;
			    }   
			}
		}
				
		function dodpupdates(repeat)
		{	
			var now = new Date();			
			now.setMilliseconds(now.getMilliseconds() - m_timedelta);			// adjust to server time offset
				
			var i;
			for (i=0; i < m_dpitems.length; i++)
			{
				var rstr = m_dptemplates[i];
				var base = m_dpbases[i];
								
				var j;
				for (j=m_dpsubs[i].length-1; j >= 0; j--)
				{
					var insert = m_dpsubs[i][j][0];
					var dp = m_dpsubs[i][j][1];
					var format = m_dpsubs[i][j][2];
															
					var vstr = "";
					switch (dp)
					{
						case "now":
							vstr = formatdt(now, format);
							break;
							
						case "ago":
							vstr = formatago(now, base, format);							
							break;
					}
					
					rstr = rstr.substring(0,insert+1) + vstr + rstr.substring(insert+1);
				}
				m_dpitems[i].innerHTML = rstr;
			}
						
			if ( repeat )
				window.setTimeout("dodpupdates(true)", 5000);	
		}		
		
		function formatdt(dt, format)
		{			
			var fstr = "";
			var fchar = "dhHmMsty";
			
			var infrag = false;
			var ffrag = "";
			var f;
			for (f=0; f<format.length; f++)
			{
				var fc = format.charAt(f);

				if ( fchar.indexOf(fc) != -1 )
				{
					ffrag += fc;
					infrag = true;
				}
				else
				{	
					if ( infrag )
					{
						infrag = false;
						fstr += formatfrag(dt, ffrag);		
						ffrag = "";
					}
					fstr += fc;
				}
			}
			
			if ( infrag )
				fstr += formatfrag(dt, ffrag);		
			
			return fstr;
		}
		
		function formatfrag(dt, format)
		{			
			var fstr = "";
			
			switch (format)
			{
				case "d":
					fstr = new String(dt.getDate());
					break;
					
				case "dd":
					fstr = new String(dt.getDate());
					if ( fstr.length == 1 )
						fstr = "0" + fstr;
					break;
				
				case "ddd":
					fstr = daystr(dt.getDay(),true);
					break;
				
				case "dddd":
					fstr = daystr(dt.getDay(),false);
					break;
				
				case "h":
					var h = dt.getHours();
					if ( h == 0 )
						h = 12;
					if ( h > 12 )
						h -= 12;
					fstr = new String(h);
					break;
				
				case "hh":
					var h = dt.getHours();
					if ( h == 0 )
						h = 12;
					if ( h > 12 )
						h -= 12;
					h = new String(h);
					if ( h.length == 1 )
						fstr = "0" + h;
					break;
				
				case "H":
					fstr = new String(dt.getHours());
					break;
				
				case "HH":
					var fstr = new String(dt.getHours());
					if ( fstr.length == 1 )
						fstr = "0" + fstr;
					break;
				
				case "m":
					fstr = new String(dt.getMinutes());
					break;
			    
			    case "s":
			    	fstr = new String(dt.getSeconds());
			    	break;

			    case "ss":
			        fstr = new String(dt.getSeconds());
				    if ( fstr.length == 1 )
						fstr = "0" + fstr;
					break;
					
				case "mm":
					fstr = new String(dt.getMinutes());
					if ( fstr.length == 1 )
						fstr = "0" + fstr;
					break;
				
				case "M":
					fstr = new String(dt.getMonth() + 1);
					break;
				
				case "MM":
					fstr = new String(dt.getMonth() + 1);
					if ( fstr.length == 1 )
						fstr = "0" + fstr;
					break;
				
				case "MMM":
					fstr = monthstr(dt.getMonth(),true);
					break;
				
				case "MMMM":
					fstr = monthstr(dt.getMonth(),false);
					break;
				
				case "yy":
					fstr = dt.getFullYear();
					fstr = fstr.substring(2)
					break;
				
				case "yyyy":
					fstr = dt.getFullYear();
					break;
					
				case "t":
					var h = dt.getHours();
					if ( h > 11 )
						fstr = "P";
					else
						fstr = "A"; 
					break;
					
				case "tt":
					var h = dt.getHours();
					if ( h > 11 )
						fstr = "PM";
					else
						fstr = "AM"; 
					break;
				
				default:
					return format;
			}
			 
			return fstr;
		}
		
		function monthstr(month, abbrev)
		{
			if ( !abbrev )
				return m_months[month];
			else
				return m_abbrevmonths[month];
		}
		
		function daystr(day, abbrev)
		{
			if ( !abbrev )
				return m_days[day];
			else
				return m_abbrevdays[day];
		}
		
		function makeArray() 
		{
			for (i = 0; i<makeArray.arguments.length; i++)
				this[i] = makeArray.arguments[i];
		}		
				
		function localizeduser(user)
		{
			var i = user.indexOf("!");
			if ( i == -1 )
				return user;
			
			return user.substring(0,i);
		}
		
		function setcookie(name, value, expires, path, domain, secure)
		{
			document.cookie= name + "=" + escape(value) +
				((expires) ? "; expires=" + expires.toGMTString() : "") +
				((path) ? "; path=" + path : "") +
				((domain) ? "; domain=" + domain : "") +
				((secure) ? "; secure" : "");
		}
		
		function getcookie(name)
		{
			var dc = document.cookie;
			var prefix = name + "=";
			var begin = dc.indexOf("; " + prefix);
			if (begin == -1)
			{
				begin = dc.indexOf(prefix);
				if (begin != 0) return null;
			}
			else
			{
				begin += 2;
			}
			var end = document.cookie.indexOf(";", begin);
			if (end == -1)
			{
				end = dc.length;
			}
			return unescape(dc.substring(begin + prefix.length, end));
		}

		function deletecookie(name, path, domain)
		{
			if (getcookie(name))
			{
				document.cookie = name + "=" + 
					((path) ? "; path=" + path : "") +
					((domain) ? "; domain=" + domain : "") +
					"; expires=Thu, 01-Jan-70 00:00:01 GMT";
			}
		}		
		
        function echeck(str) 
        {
		    var at="@"
		    var dot="."
		    var lat=str.indexOf(at)
		    var lstr=str.length
		    var ldot=str.indexOf(dot)
		    
		    if (str.indexOf(at)==-1){
		       return false;
		    }

		    if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		       return false;
		    }

		    if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		        return false;
		    }

		     if (str.indexOf(at,(lat+1))!=-1){
		        return false;
		     }

		     if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
		        return false;
		     }

		     if (str.indexOf(dot,(lat+2))==-1){
		        return false;
		     }
    		
		     if (str.indexOf(" ")!=-1){
		        return false;
		     }

 		     return true;					
	    }