<?xml version="1.0" encoding="UTF-8" ?> 
	<Module>
		<ModulePrefs title="GOINC"  
			title_url="http://stegic.net/goinc/"
			description="For keeping tabs on BOINC."
			author="Ivan Stegic"
			screenshot="http://stegic.net/gm/goinc-xml/goinc-ss.gif"
			thumbnail="http://stegic.net/gm/goinc-xml/goinc-thumb.gif"
			author_email="ivan.stegic+this-stops-spam@gmail.com"
			author_location="Minneapolis, MN">
			<Require feature="setprefs" /> 
			<Require feature="dynamic-height"/>
		</ModulePrefs> 
			<UserPref
				name="gid"
				default_value="0"
				datatype="hidden"/>
			<UserPref name="c" 
				display_name="Trend color" 
				default_value="blue" 
				datatype="enum" >
				<EnumValue value="blue" display_value="Blue" />
				<EnumValue value="red" display_value="Red" />
				<EnumValue value="black" display_value="Black" />
				<EnumValue value="green" display_value="Green" />
			</UserPref>
			<UserPref name="d" 
				display_name="Data history" 
				default_value="20" 
				datatype="enum" >
				<EnumValue value="5" display_value="last 5" />
				<EnumValue value="10" display_value="last 10" />
				<EnumValue value="15" display_value="last 15" />
				<EnumValue value="20" display_value="last 20" />
			</UserPref> 
			<UserPref name="tot" 
				display_name="Show total?" 
				default_value="true" 
				datatype="bool" >
			</UserPref>
			<UserPref name="dt" 
					display_name="Show date?" 
					default_value="true" 
					datatype="bool" >
			</UserPref>
			<!-- User 1 with mandatory project selection -->
			<UserPref name="pid1" 
				display_name="Proj 1" 
				datatype="enum" 
				required="true">
				<EnumValue value="0" display_value="CPDN" />
				<EnumValue value="1" display_value="Einstein" />
				<EnumValue value="2" display_value="LHC" />
				<EnumValue value="3" display_value="Predictor" />
				<EnumValue value="4" display_value="Rosetta" />
				<EnumValue value="5" display_value="SETI" />
				<EnumValue value="6" display_value="BBC CPDN" />
			</UserPref>
			<UserPref name="val1" 
				display_name="UserID/Auth Token 1" 
				required="true" />
			<!-- User 2 -->
			<UserPref name="pid2" 
				display_name="Proj 2" 
				datatype="enum" 
				default_value="99">
				<EnumValue value="99" display_value="---" />
				<EnumValue value="0" display_value="CPDN" />
				<EnumValue value="1" display_value="Einstein" />
				<EnumValue value="2" display_value="LHC" />
				<EnumValue value="3" display_value="Predictor" />
				<EnumValue value="4" display_value="Rosetta" />
				<EnumValue value="5" display_value="SETI" />
				<EnumValue value="6" display_value="BBC CPDN" />
			</UserPref>
			<UserPref name="val2" 
				display_name="User ID/Auth Token 2"  />
			<!-- User 3 -->
			<UserPref name="pid3" 
				display_name="Proj 3" 
				datatype="enum" 
				default_value="99">
				<EnumValue value="99" display_value="---" />
				<EnumValue value="0" display_value="CPDN" />
				<EnumValue value="1" display_value="Einstein" />
				<EnumValue value="2" display_value="LHC" />
				<EnumValue value="3" display_value="Predictor" />
				<EnumValue value="4" display_value="Rosetta" />
				<EnumValue value="5" display_value="SETI" />
				<EnumValue value="6" display_value="BBC CPDN" />
			</UserPref>
			<UserPref name="val3" 
				display_name="User ID/Auth Token 3"  />
			<!-- User 4 -->
			<UserPref name="pid4" 
				display_name="Proj 4" 
				datatype="enum" 
				default_value="99">
				<EnumValue value="99" display_value="---" />
				<EnumValue value="0" display_value="CPDN" />
				<EnumValue value="1" display_value="Einstein" />
				<EnumValue value="2" display_value="LHC" />
				<EnumValue value="3" display_value="Predictor" />
				<EnumValue value="4" display_value="Rosetta" />
				<EnumValue value="5" display_value="SETI" />
				<EnumValue value="6" display_value="BBC CPDN" />
			</UserPref>
			<UserPref name="val4" 
				display_name="User ID/Auth Token 4"  />
			<!-- User 5 -->
			<UserPref name="pid5" 
				display_name="Proj 5" 
				datatype="enum" 
				default_value="99">
				<EnumValue value="99" display_value="---" />
				<EnumValue value="0" display_value="CPDN" />
				<EnumValue value="1" display_value="Einstein" />
				<EnumValue value="2" display_value="LHC" />
				<EnumValue value="3" display_value="Predictor" />
				<EnumValue value="4" display_value="Rosetta" />
				<EnumValue value="5" display_value="SETI" />
				<EnumValue value="6" display_value="BBC CPDN" />
			</UserPref>
			<UserPref name="val5" 
				display_name="User ID/Auth Token 5"  />
		<Content type="html">
		<![CDATA[ 
		<style TYPE="text/css">
		<!--
			div.name {
				font-size: 10px; 
				font-family:  'lucida grande', arial, sans-serif; 
				float: left; 
				width: 18%;
				text-align: right;
				}
			div.date, div.avg, div.proj, div.tot {
				font-size: 10px; 
				font-family: 'lucida grande', arial, sans-serif;
				float: left; 
				width: 15%;
				text-align: center;
				}	
			div.img {
				font-size: 10px; 
				font-family:  'lucida grande', arial, sans-serif;
				float: left; 
				width: 21%;
				text-align: center;
				}
			div.hdr {
				font-weight: bold;
				width: 100%;
				}
			div.hname {
				font-size: 9px; 
				font-family: 'lucida grande', arial, sans-serif; 
				width: 33%;
				text-align: right;
				float: left; 
				}
			div.havg, div.htot {
				font-size: 9px; 
				font-family: 'lucida grande', arial, sans-serif; 
				width: 15%;
				text-align: center;
				float: left; 
				}
			div.hfuture {
				font-size: 9px; 
				font-family: 'lucida grande', arial, sans-serif; 
				width: 36%;
				text-align: left;
				float: left;
				}
			div.error {
				font-size: 10px;
				font-family:  'lucida grande', arial, sans-serif;
				color: red;
				text-align: center;
				font-style: italic;
				width: 100%;
				margin-top: 10px;
				margin-bottom: 10px;
				}
			div.grey {
				font-size: 10px;
				font-family:  'lucida grande', arial, sans-serif;
				color: grey;
				text-align: center;
				font-style: italic;
				width: 100%;
				}				
			div.pane {
				width: 100%;
				font-family:  'lucida grande', arial, sans-serif;
				font-size: 10px;
				}
			div.title {
				font-family:  'lucida grande', arial, sans-serif;
				font-size: 10px;
				font-weight: bold;
				margin-top: 10px;
				text-align: center;
				}
			div.strap, div.ftr {
				font-family:  'lucida grande', arial, sans-serif;
				font-size: 9px;
				margin-bottom: 5px;
				margin-top: 0px;
				text-align: center;
				}
			div.ftr {
				font-family: 'lucida grande', arial, sans-serif;
				font-size: 9px;
				margin-bottom: 0px;
				margin-top: 15px;
				text-align: center;
				}
			div.cnt {
				font-family:  'lucida grande', arial, sans-serif;
				font-size: 8px;
				margin-bottom: 0px;
				margin-top: 0px;
				text-align: center;
				color: white;
				}								
			a:link, a:visited {
				font-family :  'lucida grande', arial, sans-serif;
				text-decoration : none; 
				color: blue;
				} 
			a:hover  {
				font-family :  'lucida grande', arial, sans-serif;
				text-decoration : none; 
				color: red;
				}
		-->
		</style>

		<script type="text/javascript">
		
			// project urls
			var ProjectURL = new Array()
			ProjectURL[0] = "http://climateapps2.oucs.ox.ac.uk/cpdnboinc/"
			ProjectURL[1] = "http://einstein.phys.uwm.edu/"
			ProjectURL[2] = "http://lhcathome.cern.ch/"
			ProjectURL[3] = "http://predictor.scripps.edu/"
			ProjectURL[4] = "http://boinc.bakerlab.org/rosetta/"
			ProjectURL[5] = "http://setiathome.berkeley.edu/"
			ProjectURL[6] = "http://bbc.cpdn.org/"

			// project names
			var ProjectName = new Array()
			ProjectName[0] = "CPDN"
			ProjectName[1] = "Einstein"
			ProjectName[2] = "LHC"
			ProjectName[3] = "Predictor"
			ProjectName[4] = "Rosetta"
			ProjectName[5] = "SETI"
			ProjectName[6] = "BBC CPDN"
			
			// this updates the host data by user
			function showHostData( u ) {

				// Get userprefs
				var prefs = new _IG_Prefs(__MODULE_ID__);
				var val = prefs.getString("val"+u);
				var host_url = '';
				
				if (_gel("SH"+u+ __MODULE_ID__).innerHTML == "+") {
					// show the host info for the user
					_gel("SH"+u+ __MODULE_ID__).innerHTML = "-";	
					_gel("h"+u+ __MODULE_ID__).style.display = "";
					// this is where we get host by user data, and report to supply the authentication token if only the username is supplied.
					if ( val.length == 32 ) {
						// here's where we get the data
						host_url = ProjectURL[prefs.getString("pid"+ u)] + 'show_user.php?format=xml&auth=' + val;
						_gel("h"+u+ __MODULE_ID__).innerHTML = "<div class='grey'>Loading host data...</div>";
						_IG_FetchXmlContent( host_url, _IG_Callback( callback_getHostData, u )  );
					} ;
				} else {
					// hide the host per user information
					_gel("SH"+u+ __MODULE_ID__).innerHTML = "+";	
					_gel("h"+u+ __MODULE_ID__).style.display = "none";				
				};
				
				_IG_AdjustIFrameHeight();
			}

			// this gets the host data
			function callback_getHostData( responseText, uid ) {

				// setup the host headers
				var html_hhdr = '<div class="hdr">'
							+ '<div class="hname">Host</div>'
							+ '<div class="havg">Avg</div>'
							+ '<div class="htot">Total</div>'
							+ '<div class="hfuture">OS</div>'
							+ '</div>';
				// flag for alternating grey rows
				var flag = 1;

				// initialize a header data row
				var html_hrow = '';

				// Get a list of the host element nodes
				var itemList = responseText.getElementsByTagName("host");

				// Loop through all host nodes
				for (var i = 0; i < itemList.length ; i++) { 
					// For each host node, get child nodes.
					var nodeList = itemList.item(i).childNodes;
					// Loop through child nodes
					for (var j = 0; j < nodeList.length ; j++) {
						var node = nodeList.item(j);
						
						if (node.nodeName == "domain_name") {
							
							var domain_name = node.firstChild.nodeValue;
							if ( domain_name.length > 17 ) {
								domain_name = domain_name.substring( 0, 17 ) + "..." ;
							} ;
							
						}

						if (node.nodeName == "expavg_credit") {
							var expavg_credit =  Math.round( node.firstChild.nodeValue );
						}

						if (node.nodeName == "total_credit") {
							var total_credit =  Math.round( node.firstChild.nodeValue ) ;
						}
						
						if (node.nodeName == "os_name") {
							var os_name =  node.firstChild.nodeValue  ;
						}
						
					} 

					// set a row of data
					if ( flag == 0 ) {
						html_hrow += '<div class="hname">'+domain_name+'</div>'
								+'<div class="havg">'+expavg_credit+'</div>'
								+'<div class="htot">'+total_credit+'</div>'
								+'<div class="hfuture">'+os_name+'</div>';
						flag = 1;
					} else {
						html_hrow += '<div class="hname" style="background-color: #eee">'+domain_name+'</div>'
								+'<div class="havg" style="background-color: #eee">'+expavg_credit+'</div>'
								+'<div class="htot" style="background-color: #eee">'+total_credit+'</div>'
								+'<div class="hfuture" style="background-color: #eee">'+os_name+'</div>';
						flag = 0;					
					}

				}

				_gel("h"+uid+__MODULE_ID__).innerHTML = html_hhdr+html_hrow;

			};

			// this is the callback that updates user data for a given idvalue
			function callback_updateUserData(responseText, idvalue) {

					var itemList = responseText.getElementsByTagName("user");
					var nodeList = itemList.item(0).childNodes;

					var prefs = new _IG_Prefs(__MODULE_ID__);

					var html_proj = '<div class="proj" id="PROJ'+idvalue+'__MODULE_ID__"><a target="_blank" href="'+ProjectURL[prefs.getString("pid"+idvalue)]+'">'+ ProjectName[prefs.getString("pid"+idvalue)]+'</a></div>';
					var html_name = '';
					var html_avg = '';
					var html_tot = '';
					var html_date = '';
					var html_trend = '';

					var uid = '';
					var total_credit = '';
					var expavg_credit = '';
					var expavg_time = '';

					if (responseText == null || typeof(responseText) != "object" || responseText.firstChild == null) {
						// alert ( "uh oh" );
						_gel("u"+idvalue+__MODULE_ID__).innerHTML = '<div class="error">An error occured - please try again later.</div>';
						return;
					}					
					
				
					// Loop through child nodes. Extract data from the text nodes that are
					for (var j = 0; j < nodeList.length ; j++) {

						var node = nodeList.item(j);
												
						// user's id
						if (node.nodeName == "id") {
							uid = node.firstChild.nodeValue ; 
						}
						
						// user's name
						if (node.nodeName == "name") {
							if ( prefs.getString("val"+idvalue).length == 32 ) {
								html_name = '<div class="name"><a href="'+ ProjectURL[prefs.getString("pid"+idvalue)] + 'show_user.php?auth=' + prefs.getString("val"+idvalue)+'" target="_blank">'+node.firstChild.nodeValue+'</a> ';
								html_name += '[<a id="SH'+idvalue+'__MODULE_ID__" href="#" onclick="showHostData('+idvalue+');"  >+</a>]'
							} else {
								html_name = '<div class="name"><a href="'+ ProjectURL[prefs.getString("pid"+idvalue)] + 'show_user.php?userid=' + prefs.getString("val"+idvalue)+'" target="_blank">'+node.firstChild.nodeValue+'</a> ';
							};
							
							html_name += '</div>'; 
						}						

						// user's current average credit
						if (node.nodeName == "expavg_credit") {
							html_avg = '<div class="avg">'+Math.round(node.firstChild.nodeValue)+'</div>'; 
						}

						// user's total credit
						// only show it if the prefs want it to be shown						
						if ( prefs.getBool("tot") == true ) {
							if (node.nodeName == "total_credit") {
								html_tot = '<div class="tot">'+Math.round(node.firstChild.nodeValue)+'</div>'; 
							}
							_gel("hdr_tot"+ __MODULE_ID__).style.display = "";
						} else {
							_gel("hdr_tot"+ __MODULE_ID__).style.display = "none";
						};
						
						// last updated on... convert from epoch time to human readable!
						// only show it if the prefs want it to be shown						
						if ( prefs.getBool("dt") == true ) {
							if (node.nodeName == "expavg_time") {
								var mEpoch = node.firstChild.nodeValue;
								var dDate = new Date;
								if(mEpoch<10000000000) mEpoch *= 1000;
								dDate.setTime(mEpoch);
								var m = dDate.getMonth()+1
								html_date = '<div class="date">'+m+"/"+dDate.getDate()+" "+dDate.getHours()+":"+dDate.getMinutes()+'</div>'; 
							}
							_gel("hdr_date"+ __MODULE_ID__).style.display = "";
						} else {
							_gel("hdr_date"+ __MODULE_ID__).style.display = "none";
						}
						
						// get some additional stats, not for show
						// expavg_time
						if (node.nodeName == "expavg_time") {
							expavg_time = node.firstChild.nodeValue ; 
						}						
						// expavg_credit
						if (node.nodeName == "expavg_credit") {
							expavg_credit = node.firstChild.nodeValue ; 
						}						
						// total_credit
						if (node.nodeName == "total_credit") {
							total_credit = node.firstChild.nodeValue ; 
						}						
						
					} 
					
					var html_trend_url = 'http://stegic.net/gm/goinc-xml/t.php?u=' + 
									uid+'&' +
									'd='+ prefs.getString("d")+'&' +
									'p='+ prefs.getInt("pid'+idvalue+'")+'&' +
									'c='+ prefs.getString("c")+'&' + 
									'g=bar'+'&' + 
									'tot='+total_credit+'&' + 
									'avg='+expavg_credit+'&' + 
									'time='+expavg_time+'&' 

					var html_trend = 	'<div class="img" id="IMG' + 
									idvalue + '__MODULE_ID__"><img height="16" src="' +
									html_trend_url +'" border="0" alt="Trend over the last '+
									prefs.getString("d")+' days."></div>';

					_gel("u"+idvalue+__MODULE_ID__).innerHTML = html_proj+html_name+html_avg+html_tot+html_date+html_trend;
					// _gel("debug").innerHTML += html_trend_url+"<br>";
					
				}


				// main display of statistics function
				function displayStats() {

					// Get userprefs
					var prefs = new _IG_Prefs(__MODULE_ID__);

					// GoincID generation and storage
					var gid = prefs.getString("gid");
					if ( gid == 0 ) {
						// get a new gid, we don't have one here!
						_IG_FetchContent('http://stegic.net/gm/goinc-xml/gid.php', function (responseText) {
							var gid = responseText;
							// _gel("debug").innerHTML += "<br>no stored gid, this is new :: " + gid;
							// set the user pref with the new value
							prefs.set("gid", gid);
							// record this session
							var randomnumber=Math.floor(Math.random()*1001)
							var rurl = 'http://stegic.net/gm/goinc-xml/gid.php?r='+randomnumber+'&gid='+gid+'&u1='+prefs.getString("val1")+'&u2='+prefs.getString("val2")+'&u3='+prefs.getString("val3")+'&u4='+prefs.getString("val4")+'&u5='+prefs.getString("val5")+'&p1='+prefs.getInt("pid1")+'&p2='+prefs.getInt("pid2")+'&p3='+prefs.getInt("pid3")+'&p4='+prefs.getInt("pid4")+'&p5='+prefs.getInt("pid5")
							_IG_FetchContent( rurl, function (responseRec) {
								var suc = responseRec;
								 //_gel("debug").innerHTML += "<br>record status :: " + suc + "<br>rurl ::"+rurl;
							});												
							
						});					
					} else {
						// _gel("debug").innerHTML = "<br>stored gid :: " + gid;
						var randomnumber=Math.floor(Math.random()*1001)
						var rurl = 'http://stegic.net/gm/goinc-xml/gid.php?r='+randomnumber+'&gid='+gid+'&u1='+prefs.getString("val1")+'&u2='+prefs.getString("val2")+'&u3='+prefs.getString("val3")+'&u4='+prefs.getString("val4")+'&u5='+prefs.getString("val5")+'&p1='+prefs.getInt("pid1")+'&p2='+prefs.getInt("pid2")+'&p3='+prefs.getInt("pid3")+'&p4='+prefs.getInt("pid4")+'&p5='+prefs.getInt("pid5")
						_IG_FetchContent( rurl, function (responseRec) {
							var suc = responseRec;
							// _gel("debug").innerHTML += "<br>record status :: " + suc + "<br>rurl ::"+rurl;
						});												
					}

					// store id values in an array
					var IDval = new Array();
					IDval[1] = prefs.getString("val1");
					IDval[2] = prefs.getString("val2");
					IDval[3] = prefs.getString("val3");
					IDval[4] = prefs.getString("val4");
					IDval[5] = prefs.getString("val5");

					for ( ID in IDval) {
						// if the value is non-zero, then try to load
						if ( IDval[ID] != 0 ) {
							_gel("u"+ID+__MODULE_ID__).innerHTML = "<div class='grey'>Loading user data...</div>";
							var url = "";
							if (  IDval[ID].length == 32 ) {
								url = ProjectURL[prefs.getString("pid"+ID)] + 'show_user.php?format=xml&auth=' + IDval[ID];
							} else {
								url = ProjectURL[prefs.getString("pid"+ID)] + 'show_user.php?format=xml&userid=' + IDval[ID];
							}
							
							_IG_FetchXmlContent( url, _IG_Callback( callback_updateUserData, ID )  );
						};
					}
				};
			// do this when it loads
			_IG_RegisterOnloadHandler(displayStats);
		</script>
		<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
		</script>
		<script type="text/javascript">
			_uacct = "UA-1030134-1";
			urchinTracker();
		</script>		

		<div id="pane__MODULE_ID__" class="pane">
			<div id="title__MODULE_ID__" class="title">
				<a href="http://stegic.net/goinc/" target="_blank">GOINC</a>: For keeping tabs on <a href="http://boinc.berkeley.edu" target="_blank">BOINC</a>.
			</div>
			<div id="strap__MODULE_ID__" class="strap">
				Use Basecamp? Try <a href="http://periscopegadget.com/" target="_blank">Periscope Gadget</a> for iGoogle
			</div>
			<div  id="hdr__MODULE_ID__" class="hdr">
				<div id="hdr_proj__MODULE_ID__" class="proj">Proj</div>
				<div id="hdr_name__MODULE_ID__" class="name">Name</div>
				<div id="hdr_avg__MODULE_ID__" class="avg">Avg</div>
				<div id="hdr_tot__MODULE_ID__" class="tot">Total</div>
				<div id="hdr_date__MODULE_ID__" class="date">Date</div>
				<div id="hdr_img__MODULE_ID__" class="img">Trend</div>
			</div>
			<div id="u1__MODULE_ID__" style="clear: left;"></div>
			<div id="h1__MODULE_ID__" style="clear: left; display:none"></div>
			<div id="u2__MODULE_ID__" style="clear: left;"></div>
			<div id="h2__MODULE_ID__" style="clear: left; display:none"></div>
			<div id="u3__MODULE_ID__" style="clear: left;"></div>
			<div id="h3__MODULE_ID__" style="clear: left; display:none"></div>
			<div id="u4__MODULE_ID__" style="clear: left;"></div>
			<div id="h4__MODULE_ID__" style="clear: left; display:none"></div>
			<div id="u5__MODULE_ID__" style="clear: left;"></div>
			<div id="h5__MODULE_ID__" style="clear: left; display:none"></div>
			<div id="ftr__MODULE_ID__" class="ftr">
				<a href="http://stegic.net/goinc/" target="_blank">GOINC 1.2</a> &middot; 05/02/07 &middot; <a href="http://stegic.net/goinc-help/" target="_blank">Help</a><br /><a href="http://twitter.com/ten7" target="_blank">Follow me</a> on Twitter
			</div>
		</div>
		]]> 
		</Content>
	</Module>
