<!--

/**
* Struct for a word and its frequency
*/
function Term(word, count) {
	this.word = word;
	this.count = count;
}

/**
* Customer sorter from Term struct
*/
function sortByTermFreq(a,b) {
	return ((a.count > b.count) ? -1 : ((a.count < b.count) ? 1 : 0));
}
/**
* Escape chars we're not interested in
*/
function escapeTerm(term, replacement) {
	return term.replace(/\-|\:|\*|\;|\,|\.|\'|\"|\`|\'|\#|\/|\\|\%|\&\{|\(|\[|\}|\)|\}|\+|\!|\?/g, replacement);
}

/**
* Trim L and R whitespace 
*/
function trim(str) {
	return str.replace(/^\s*|\s*$/,'');
}

/** 
* Extract textnodes recursively. Stops when more than 400 terms collected
* @return whitespace-sep string of words extracted
*/
function traverse(node, cnt) 
{
	var txt = '';

	if(node.nodeType == 3) {
		txt += node.nodeValue + ' ';
	}
	
	if(node.childNodes != null) {
		for(var i=0; i<node.childNodes.length; i++) {
			var childNode = node.childNodes.item(i);
			if(childNode.nodeName == 'SCRIPT') {
				continue;
			} 
			if(cnt < 400) {
				var subText = traverse(childNode, cnt + txt.split(/\s+/).length);
				if(subText)
					txt += subText + ' ';
			}
		}
	}
	return txt;
}

/** 
* Parse all text nodes from tags 
* @return Filtered Term list, sorted by descending frequency
*/
function parseText(doc,tagName)
{
	var termArray = new Array();
	var list = doc.getElementsByTagName(tagName);
	var sb = '';
	var t = 0;

	for(var i=0; i<list.length; i++) {
		sb += traverse(list.item(i),0) + ' ';
	}
	
	sb = escapeTerm(sb, ' ');
	var split = sb.split(/\s+|\n/);

	outer: for(var i=0; i<split.length; i++) {
		var word = trim(split[i]).toLowerCase();
		if(word != '' && word.length > 3) {
			for(var j=0; j<termArray.length; j++) {
				if(word == termArray[j].word) {
					termArray[j].count++;
					continue outer;
				}
			}
			termArray[termArray.length++] = new Term(word,1);
		}
	}

	termArray.sort(sortByTermFreq);
	return termArray;
}

/**
* Parses the meta tags
* @attrName = content, keywords, etc
*/
function parseMeta(doc, attrName) 
{
	var termArray = new Array();
	var list = doc.getElementsByTagName('meta');
	if(list) {
		for(var i=0; i<list.length; i++) {
			var nodeMap = list[i].attributes;
			var nameAttrNode = nodeMap.getNamedItem('name');
			var contentAttrNode = nodeMap.getNamedItem('content');
			
			if(nameAttrNode && nameAttrNode.nodeValue == attrName && contentAttrNode) {
				var content = contentAttrNode.nodeValue;
				content = escapeTerm(content, ' ');
				var split = content.split(/\s+/);
				outer: for(var j=0; j<split.length; j++) {
                			var word = trim(split[j]).toLowerCase();
                			if(word != '') {
                        			for(var k=0; k<termArray.length; k++) {
                                			if(word == termArray[k].word) {
                                        			termArray[k].count++;
                                        			continue outer;
							}
                                		}
                        			termArray[termArray.length++] = new Term(word,1);
                        		}
				}
                	}
		}
        }
	termArray.sort(sortByTermFreq);
	return termArray;
}

/**
* Parse a DOM document
*/
function parse_pf(doc) 
{
	var MAX_H1 = 8;
	var MAX_H2 = 8;
	var MAX_H3 = 8;
	var MAX_TITLE = 12;
	var MAX_BOLD = 20;
	var MAX_META_KEYWORDS = 6;
	var MAX_META_DESCRIPTION = 12;
	var MAX_BODY = 20
	var MAX_KEYWORDS = 24;
	var MAX_KEYWORD_LENGTH = 32;
	var url = '';
	if(pf_method != "manual") {
		var title = parseText(doc, 'title').slice(0,MAX_TITLE);
		var metaDescription = parseMeta(doc, 'description').slice(0,MAX_META_DESCRIPTION);
		var metaKeywords = parseMeta(doc, 'keywords').slice(0,MAX_META_KEYWORDS);
		var h1 = parseText(doc, 'h1').slice(0,MAX_H1);
		var h2 = parseText(doc, 'h2').slice(0,MAX_H2);
		var h3 = parseText(doc, 'h3').slice(0,MAX_H3);
		var bold = (parseText(doc, 'strong').concat(parseText(doc,'b'))).slice(0,MAX_BOLD);
		var body = parseText(doc, 'body').slice(0,MAX_BODY);
		url = createUrlAutomatic_pf(title,metaDescription,metaKeywords,h1,h2,h3,bold,body);
	} else {
		if(typeof pf_keywords != 'undefined') {
			var split = pf_keywords.toLowerCase().split(/\,|\s{1,}/);
			for(i=0; i<split.length; i++) {
				split[i] = split[i].slice(0,MAX_KEYWORD_LENGTH);
			}
			url = createUrlManual_pf(split);
		}
	}

	url = appendCommonInfo_pf(url);
	// Create new JS-node and insert
	var scriptNode = document.getElementById('pf_ads');
	var newNode = document.createElement('iframe');
	newNode.frameBorder = "0";
	newNode.border = "0";
	newNode.marginwidth = "0";
	newNode.marginheight = "0";
	newNode.scrolling = "no";
	newNode.style.border = "0px";
	var split = pf_size.split(/x/);
	newNode.width = split[0];
	newNode.height = split[1];
	newNode.src = url;
	scriptNode.parentNode.insertBefore(newNode, scriptNode);
	return true;
}

function appendCommonInfo_pf(url) 
{
	url += '&a=' + pf_id;
	url += '&ttid=2';
	if(typeof pf_maxresults != 'undefined')
		url += '&maxResults=' + trim(pf_maxresults);
	if(typeof pf_template != 'undefined')
		url += '&tid=' + trim(pf_template);
	if(typeof pf_programs != 'undefined')
		url += '&programs=' + trim(pf_programs);
	if(typeof pf_cuid != 'undefined')
		url += '&cuid=' + trim(pf_cuid);	
	if(typeof pf_xslurl != 'undefined') 
		url += '&xslUrl=' + trim(pf_xslurl);
	return url;
}

/**
* @param list Array of terms
* @return Contents of array, comma separated string.
*/
function commaSep(list) 
{
	var sb = '';
	if(null != list && list.length > 0) {
		for(i=0; i<list.length; i++) {
			sb += encodeTerm(list[i].word);
			if(i+1 != list.length)
				sb += ',';	
		}
		return sb;
	}
	return "";
}

/**
* Constructs a TD url, using DOM-parsed terms
*/
function createUrlAutomatic_pf(title, metaDescription, metaKeywords, h1, h2, h3, bold, body) 
{
	var str = "";
	var baseUrl = 'http://pf.tradedoubler.com/pf/pf?';
	var c = new Array();
	if(typeof title != 'undefined')
		c = c.concat(title);
	if(typeof metaDescription != 'undefined') 
		c = c.concat(metaDescription);
	if(typeof metaKeywords != 'undefined')
		c = c.concat(metaKeywords);
	if(typeof h1 != 'undefined')
		c = c.concat(h1);
	if(typeof h2 != 'undefined')
		c = c.concat(h2);
	if(typeof h3 != 'undefined') 
		c = c.concat(h3);
	if(typeof bold != 'undefined')
		c = c.concat(bold);
	if(c.length < 10) {
		if(typeof body != 'undefined')
			c = c.concat(body);
	}
	c = c.slice(0,50);
	
	for(var x=0; x<c.length; x++) {
		str += c[x].word;
		if(x+1 != c.length) {
			str += " ";
		}
	}
	baseUrl += "productName=" + escape(str);
	return baseUrl;
}

/**
* Constructs a TD URL, using manually supplied keywords
*/
function createUrlManual_pf(list) 
{
	var baseUrl = 'http://pf.tradedoubler.com/pf/pf?';
	var str = "";
	if(null != list && list.length > 0) {
		for(var i=0; i<list.length; i++) {
			var kw = escapeTerm(trim(list[i]));
			if(kw != '') {
				str += kw;
				if(i+1 != list.length) {
					str += ' ';	
				}		
			}
		}
	}
	baseUrl += "productName=" + escape(str);
	return baseUrl;
}

/**
* Starts the parse when body looks finished enough
*/
var pf_count = 0;
var pf_bl1 = 0;

function startParse_pf() {
	
	if(pf_bl1 == 0) {
		pf_bl1 = document.getElementsByTagName('body')[0].innerHTML.length;
		setTimeout("startParse_pf()",300);
		return true;
	}

	var bl2 = document.getElementsByTagName('body')[0].innerHTML.length;
	if(pf_bl1 != 0 && pf_bl1 == bl2) {
		parse_pf(document);
	} else {
		pf_bl1 = bl2;
		if(pf_count++ < 5) {
			setTimeout("startParse_pf()",300);
			return true;
		}
	}
	return true;
}

startParse_pf();

/**
	Below, surrogate for encodeURIComponent for very old browsers.
	encodeURIComponent transmutes any input to UTF-8 regardless of
	browser or page charset. 

	Call by encodeTerm(String)
*/


var hexchars = "0123456789ABCDEF";
var okURIchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";

function utf8(wide) 
{
	var c, s;
	var enc = "";
  	var i = 0;
  	while(i<wide.length) {
    		c = wide.charCodeAt(i++);
    		// handle UTF-16 surrogates
    		if (c>=0xDC00 && c<0xE000) continue;
    		if (c>=0xD800 && c<0xDC00) {
      			if (i>=wide.length) continue;
	      		s= wide.charCodeAt(i++);
      			if (s<0xDC00 || c>=0xDE00) continue;
	      		c= ((c-0xD800)<<10)+(s-0xDC00)+0x10000;
		}
    	}
    	if (c<0x80) enc += String.fromCharCode(c);
    	else if (c<0x800) enc += String.fromCharCode(0xC0+(c>>6),0x80+(c&0x3F));
    	else if (c<0x10000) enc += String.fromCharCode(0xE0+(c>>12),0x80+(c>>6&0x3F),0x80+(c&0x3F));
    	else enc += String.fromCharCode(0xF0+(c>>18),0x80+(c>>12&0x3F),0x80+(c>>6&0x3F),0x80+(c&0x3F));
  	return enc;
}

function toHex(n) 
{
	return hexchars.charAt(n>>4)+hexchars.charAt(n & 0xF);
}

function encodeURIComponentNew(s) 
{
  	var s = utf8(s);
  	var c;
  	var enc = "";
  	for (var i= 0; i<s.length; i++) {
    		if (okURIchars.indexOf(s.charAt(i))==-1) {
      			enc += "%"+toHex(s.charCodeAt(i));
    		} else {
      			enc += s.charAt(i);
		}
  	}
  	return enc;
}


function encodeTerm(fld)
{
	if (fld == "") return false;
	var encodedField = "";
	var s = fld;
	if (typeof encodeURIComponent == "function") {
		encodedField = encodeURIComponent(s);
	} else {
		encodedField = encodeURIComponentNew(s);
	}
	return encodedField;
}

