function clfxmlparserAddFrames(clfXML, addFrameData, addTopicData) {
	function addFrame(frame) {
		if (frame.nodeName != "Frame")
			return;
		var offset = parseInt(frame.getAttribute("offset"));
		var len = parseInt(frame.getAttribute("length"))
		if (!(offset >= 0 && len > 0)) // Check for NaN
			return;
		var name = frame.getAttribute("name");
		var terms = frame.getElementsByTagName("Term");
		var attrs = new Object();
		attrs['_category'] = name;
		var frameid = frame.getAttribute("FID");
		if (frameid == null || frameid == "")
			frameid = ++_id;
		else
			frameid = parseInt(frameid);
		// traverse all terms inside the frame
		for (var i=0; i < terms.length; i++) {
			if (terms[i].firstChild != null && terms[i].firstChild.nodeValue != null && terms[i].firstChild.nodeValue.length >0 /*&& terms[i].firstChild.nodeValue != "N/A"*/) {
				if (terms[i].getAttribute("attribute").toLowerCase() == "detection")
					continue
				attrs[terms[i].getAttribute("attribute")] = terms[i].firstChild ? terms[i].firstChild.nodeValue.replace(/[\s\n\t\r]+/g, ' ') : "";
				// mark terms inside frames
				var termlen = parseInt(terms[i].getAttribute("length"));
				var termoffset = parseInt(terms[i].getAttribute("offset"));
				if (len > termlen && offset <= termoffset && offset + len > termoffset)
					addFrameData(frameid * -1, attrs, termoffset, termlen);
			}
		}
		attrs['_isTerm'] = attrs[attrs['_category']] != null; //TODO: fill from CSS
		if (attrs['_isTerm']) {
			attrs['_name'] = attrs[attrs['_category']];
			attrs[attrs['_category']] = null;
		}
		addFrameData(frameid, attrs, offset, len);
	}
	function addTopic(topic) {
		if (topic.nodeName != "Topic")
			return;
		var scorestr = topic.getAttribute("Score");
		if (scorestr == null)
			return;
		var topicScore = Math.round(parseFloat(scorestr * 100));
		var topicName = topic.firstChild.nodeValue;
		if (topicName == null || topicName.length == 0)
			return;
		addTopicData(topicName, topicScore);
	}
	var _id = 100000; // default frame id if no frame id found
	var frmsroot = clfXML.getXML().getElementsByTagName("Frames");
	if (frmsroot == null || frmsroot.length == 0)
		throw new Error("CLFERROR: Unsupported XML Document\n\t('Frames' element is missing)");
	var allframes = frmsroot[0].childNodes;
	if (allframes == null || allframes.length == 0)
		throw new Error("CLFERROR: Unsupported XML Document\n\t(No 'Frame' elements)");
	for (var i = 0; i < allframes.length; i++)
		addFrame(allframes[i]);
	var topicsroot = clfXML.getXML().getElementsByTagName("Topics");
	if (topicsroot == null || topicsroot.length == 0)
		return;
	var alltopics = topicsroot[0].childNodes;
	if (alltopics == null || alltopics.length == 0)
		return;
	for (var i = 0; i < alltopics.length; i++)
		addTopic(alltopics[i]);
}

