/*
	Revisions
	6 July 2003 T.B. Passin
	Failed to write occurrence scopes.
*/

CLOSE_EMPTY_TAG='/>'
CLOSE_END_TAG='>\n'
CLOSE_START_TAG='>'
OPEN_START_TAG="\n<"

/* ================================================
    Output an element. "attributes" is an array 
    of values keyed by attribute names.
===================================================*/
function makeElement(element,attributes,content){
    var stag,etag,Element,atts=''
    var content=content||''
    var empty=(!content)
    var a,atts
    
    stag=OPEN_START_TAG + element
    if (attributes){
        for (a in attributes){
             atts+=" "+ a+'="'+
                attributes[a]+'"'  
        }
        if (atts){stag+=atts}
    }
    if (empty){Element=stag + CLOSE_EMPTY_TAG}
    else {
        stag+= CLOSE_START_TAG
        etag="</"+element + CLOSE_END_TAG
        Element=stag+content+etag
    }
    return Element
}

function escape_quotes(str){
    if (!str){return ''}
    str=str.replace(/"/g,"&quot;")
    str=str.replace(/'/g,"&apos;")
    return str
}

function escape_lt(str){
    if (!str){return ''}
    str=str.replace(/</g,"&lt;")  
    return str
}

function doScopes(scopes){
    var s,scopes,theScope
    var att,scopeStr=''
    for (s in scopes){
        theScope=scopes[s].topic
        att=new Object()
        att['xlink:href']='#'+theScope
        scopeStr+=makeElement("topicRef",att)
    }
    if (scopeStr){
        scopeStr=makeElement("scope","",scopeStr)
    }
    return scopeStr    
}    

function doNames(topic){
    var names,theName='',nameStr='',n
    var att
    var s,scopes,theScope,scopeStr=''
    var results=''
	var escaped_name

    names=topic.getNamesFiltered()
    if (!names){return ''}
    for (n in names){
        theName=names[n];
        scopes=theName.getScopes()
        if (scopes){
            nameStr+=doScopes(scopes)
        }
		escaped_name = escapeXMLChars(theName.name)
        nameStr+=makeElement("baseNameString","",escaped_name)
        nameStr=makeElement("baseName","",nameStr)        
    }
    return nameStr    
}


function doOccur(Occur){
    var temp='',results='',topicref
    var scopes
    var instance, href,resource
    instance="#"+Occur.instanceOf

	scopes=Occur.getScopes()
    if (scopes){
        results+=doScopes(scopes)   
    }

	if (instance){
        href=new Object()
        href['xlink:href']=instance
        results+=makeElement("instanceOf","",
            makeElement('topicRef',href))
    }

	resource=Occur.getResource()
    if (resource){
        href=new Object()
        href['xlink:href']=escapeXMLChars(resource)
        results+=makeElement("resourceRef",href)
    }
    else {
        resource=Occur.getData()
        resource='<![CDATA['+resource+']]>'
        results+=makeElement("resourceData",'',resource)
    }

	results=makeElement("occurrence",'',results)
    return results   
}    

function doOccurs(occurrences){
    var o,Occur,results=''
    for (o in occurrences){
        Occur=occurrences[o]
        results+=doOccur(Occur)
    }
    return results
}    

function doIdentity(Topic){
	identity=Topic.getIdentity()
	if (!identity){
		return ''
	}

	var identityStr=''
	var uri=identity.getResourceRef()
	if (uri){
		var attributes = new Object()
		attributes['xlink:href']=uri
		identityStr = makeElement('resourceRef',attributes,'')
	}

// <subjectIndicatorRef xlink:href="http://www.w3.org/TR/xmlschema-2/#dt-maxLength"/>
	var indicators=identity.getSubjectIndicators()
	if (indicators){
		for (var i in indicators){
			attributes=[]
			attributes['xlink:href']=indicators[i]
			identityStr += makeElement('subjectIndicatorRef',attributes,'')
		}
	}

	if (identityStr){
		return makeElement('subjectIdentity',[],identityStr)
	}
	else {
		return ''
	}
	
}


function doTopic(Topic){
    var Type,nameStr,id,att,instance
    var topicStr=''
    var occurs,occurStr=''
	if (!(Topic&&Topic.id)){return ''}

    instance=Topic.instanceOf
    if (instance){
	    Type=new Object()
		Type['xlink:href']='#'+instance

		topicStr=makeElement('instanceOf','',makeElement('topicRef',Type))
	}

	var identityStr=doIdentity(Topic)

    occurs=Topic.getOccursFiltered()
    if (occurs&&occurs.length){occurStr=doOccurs(occurs)}
    att=new Object()
    att['id']=Topic.id
    nameStr=doNames(Topic)
    topicStr+=identityStr+nameStr+occurStr
    return makeElement('topic',att,topicStr)+'\n'
}    


/* ===================================================
	Serialize a topic map to XTM
===================================================*/
function doTopicmap(map){
    var str=''
    var t,topics
	var a,associations,assoc
	var result=new Array()

    result[0]='<?xml version="1.0" encoding="iso-8859-1"?>\n\
<topicMap xmlns="http://www.topicmaps.org/xtm/1.0/"\n\
	xmlns:xlink="http://www.w3.org/1999/xlink">\n'

    topics=map.getTopicsFiltered()
    for (t in topics){
        result.push(doTopic(topics[t]))
    }
	associations=map.getAssociations()
	for (a in associations){
		assoc=associations[a]
		result.push(doAssoc(assoc))
	}
    result.push('</topicMap>')
    return result.join('')
}
    

function doAssoc(assoc){
	if (!assoc){return ''}
	
    var m,member,members
    var p,players,player,playerid,playertopic
    var scopes
    var href,instance
    var role
    var str='',playerStr='',memberStr='',assocStr=''
	var temp=''
    members=assoc.getMembers()
    for (m in members){
		if (!m){continue}
		
		temp='';playerStr=''
        member=members[m]
        role='#'+member.roleSpec
		href=new Object()
		href['xlink:href']=role
		memberStr=makeElement('roleSpec','',
			makeElement('topicRef',href))
        players=member.getPlayers()
        for (p in players){
            player=players[p]
            playerid="#"+player.id
            href=new Object()
            href['xlink:href']=playerid
            playerStr+=makeElement('topicRef',href)
        }
		temp=memberStr+playerStr
		str+=makeElement('member','',temp)
    }
	href=new Object()
	instance="#"+assoc.instanceOf
    href['xlink:href']=instance
	assocStr=makeElement('instanceOf','',
		makeElement('topicRef',href))
    scopes=assoc.getScopes()
    if (scopes){
        assocStr+=doScopes(scopes)
    }
	href=new Object()
	href['id']=assoc.id
	assocStr=makeElement('association',href,assocStr+str)
	return assocStr
}    
    
function test(){
    return doTopicmap(tm1)
}    

var ANDAMP = '__ANDAMP__'
var ANDLT = '__ANDLT__'
function escapeXMLChars(cdata) {
    if (!cdata) {
			return ''
    }
	var str = cdata
	str = str.replace(/&amp;/g,ANDAMP)
	str = str.replace(/&/g,'&amp;')
	str = str.replace(/__ANDAMP__/g,'&amp;')

	str = str.replace(/&lt/g,ANDLT)
	str = str.replace(/</g,'&lt;')
	str = str.replace(/__ANDLT__/g,'&lt;')

	return str
}



