/* ======================================================
	Output a string containing a report on the topics
   ====================================================== */
function runTopics(map,topicfilters,assocfilters,features){
	var topics=map.getTopicsFiltered(topicfilters)
	var feature_assoc=features&&features['include_assoc']
	var t,Topic
	var Name,label,n
	var names=new Object()
	var o,Occur,occurs
	var data,resource,occurstr
	var type,typename
	var scopes,Scope,s,scopetype,scopenames,scopename
	var scopestr=''
	var assocs,a,assoc,assocname
	var members,mem,m,playerstr
	var playernames,playername
	var isplayer
	var results=new Array()
	var a=new Array()
	var assocIndex=map.getAssocIndex()//assocIndexByTopics

	// Get list of topics sorted by name	
	for (t in topics){
		Topic=topics[t]
		if (!Topic){continue}
		Name=Topic.getNamesFiltered(topicfilters)
		if (!Name||!Name[0]){continue}

		label=Name[0].name
		names[Topic.id]=label
	}
	names=sortArrayByValue(names)

	results[results.length]='<table border="1">\n'

	// Walk through all topics
	for (n in names){
		Name=names[n]
		if (!Name){continue}
		results[results.length]='<tr>\n'
		results[results.length]='<td valign="top" width="50%">\n'
		results[results.length]='<b>'+Name+'</b>'
		Topic=map.getTopicById(n)
		occurs=Topic.getOccursFiltered()

		// Show occurrences
		if (occurs&&occurs.length){
			results[results.length]='<ul>\n'
			for (o in occurs){
				Occur=occurs[o]
				occurstr=''
				type=null
				typename=''
				scopetype=null;scopenames=null
				scopename='';scopestr=''

				// Get occurrence type
				type=map.getTopicById(Occur.instanceOf)
				typename=type&&type.getNamesFiltered()
				if (typename){
					typename=typename[0].name
				}
				else {
					typename=type||Occur.instanceOf||''
				}

				// Get (the first) scope of the occurrence
				scopes=Occur.getScopes()
				if (scopes.length){

					Scope=scopes[0]
					scopetype=map.getTopicById(Scope.topic)
					scopenames=scopetype.getNamesFiltered()
					scopename=scopenames[0].name
					if (scopename){
						scopestr=' ['+scopename+']'
					}
				}

				resource=Occur.getResource()
				if (resource){
					occurstr='<li><a href="'+resource+'" target="_resource">'
					occurstr+=typename+scopestr+'</a>\n'
					results[results.length]=occurstr
				}
				else {
					data=Occur.getData()
					a=data.split('\n')
					data=a.join('<br>\n')
					results[results.length]=
						'<li>'+typename+scopestr+':<br>'+data+'\n'
				}
			}
			results[results.length]='</ul>'
		}
		results[results.length]='</td>\n'
	
		// Show associations for this topic
		if (feature_assoc){		
			results[results.length]='<td valign="top">\n'
			results[results.length]=reportAssociationsForTopic(map,
				Topic,assocIndex,assocfilters)
			results[results.length]='</td></tr>\n'
		}
	}
	results[results.length]='</table>\n'
	return results.join('')
}

function reportAssociationsForTopic(map,Topic,assocIndex,assocfilters){
	// Show associations for this topic
	var assocs,a,assoc,assocname
	var players,player,p
	var isplayer,playerstr='',playername
	var m,mem,members
	var roletopic,rolename
	var t,topicnames,topicname
	var topiclist
	var results=''
	// Index associations by topic
	assocs=assocIndex[Topic.id]
	if (!assocs){return}
	
	for (a in assocs){
		assocname='';
		assoc=map.getAssocByID(assocs[a])
		if (!assoc||!assoc.hasScopeOr(assocfilters)){continue}
		
		assocname=getAssocType(map,assoc)
		if (assocname){			
			playerstr+='<li>'+assocname
			if (assoc.id.indexOf('GEN')==-1){
				playerstr+=' ('+assoc.id+')'
			}
			playerstr+='\n'
		}
		else {
			playerstr+='<li>\n'
		}
		
		// Show names of all roleplayers for the association
		members=assoc.getMembers()
		for (m in members){
			mem=members[m]
			rolename=''
			roletopic=map.getTopicById(mem.roleSpec)
			rolename=roletopic&&roletopic.getNamesFiltered()
			if (!rolename){rolename=''}
			if (rolename){
				rolename=rolename[0].name
			}
			
			players=mem.getPlayers()
			if (players.length){
				playerstr+='<ul><li>'+rolename+'\n'
				topiclist=new Array()
				playerstr+='<ul>\n'
				for (p in players){
					playername=''
					player=players[p]
					if (player==Topic){
						playerstr+='<li><b>[this topic]</b>\n'
					}
					else {
						playername=player.getNamesFiltered()
						playername=playername[0].name
						topiclist.push(playername)
						topiclist.sort()
					}
				}
				for (t in topiclist){
					playerstr+='<li>'+topiclist[t]+'\n'
				}
				playerstr+='</ul>\n'
				playerstr+='</ul>\n'
			}
		}
	
	}	
	if (playerstr){
		results='&nbsp;&nbsp;&nbsp;&nbsp;'
		results+='<b>this topic is associated with:</b>\n<ul>\n'
		results+=playerstr+'</ul>\n'
	}
	return results
}	

function runReport(map,topicfilters,assocfilters,features){
	var win
	var report=runTopics(map,topicfilters,assocfilters,features)
	if (!report){return}
	
	win=window.open('','report')
	with (win.document){
		write(head)
		write(body_start)
		write(report)
		write(body_end)
		close()
	}
	win.focus()
}

var head="<!doctype html public '-//W3C//DTD HTML 4.0 Transitional//EN'>\n\
<html>\n\
<head>\n\
<title>Topic Map Report</title>\n\
<style type='text/css'>\n\
    body {background-color:white}\n\
	body{font-family:tahoma,arial,sans-serif;\n\
		font-size:80%}\n\
	table {background-color:lightblue}\n\
	tr,td,th{font-family:tahoma,arial,sans-serif;\n\
		font-size:85%;background-color:white}\n\
\
	#occur_display {text-align:left;background-color:white}\n\
</style>\n\
</head>\n"

var body_start='<body>\n'
var body_end='</body></html>'
