<!--

// Matrix indices for script parameter sets
IX_PF_ID = 0;
IX_PF_METHOD = 1;
IX_PF_BACKUP_KEYWORD = 2;
IX_PF_FORMAT = 3;
IX_PF_SIZE = 4;
IX_PF_DEBUG = 5;
IX_PF_KEYWORDS = 6;
IX_PF_BACKGROUND_COLOR = 7;
IX_PF_BORDER_COLOR = 8;
IX_PF_LINK_COLOR = 9;
IX_PF_URL_COLOR = 10;
IX_PF_TEXT_COLOR = 11;
IX_PF_EXCLUDE = 12;
IX_PF_MAX_RESULTS = 13;
IX_PF_TEMPLATE = 14;
IX_PF_PROGRAMS = 15;
IX_PF_CUID = 16;
IX_PF_XSLURL = 17;
IX_PF_EPI = 18;
IX_PF_EPI2 = 19;
IX_PF_CATEGORIES = 20;
IX_PF_LANG = 21;

NUM_IX_PF = 22;

MAX_ADS_PER_PAGE_PF = 10;

// Current script variable set
if(typeof currIx_pf == 'undefined') {
	currIx_pf = 0;
}

// Matrix holding the script variables (one set of IX_PF_* per ad)
if(typeof setArr_pf == 'undefined') {
	setArr_pf = new Array(10);
	for(i=0;i<MAX_ADS_PER_PAGE_PF;i++) {
		setArr_pf[i] = new Array(NUM_IX_PF);
	}
}

// Synchronization variable for parse() function, iframe insertion in particular.
if(typeof pf_inParse == 'undefined') {
	pf_inParse = 0;
}

// Store the current set of script parameters
setArr_pf[currIx_pf][IX_PF_ID] = typeof pf_id != 'undefined' ? pf_id : '0';
setArr_pf[currIx_pf][IX_PF_METHOD] = typeof pf_method != 'undefined' ? pf_method : 'manual';
setArr_pf[currIx_pf][IX_PF_BACKUP_KEYWORD] = typeof pf_backup_keyword != 'undefined' ? pf_backup_keyword : '';
setArr_pf[currIx_pf][IX_PF_FORMAT] = typeof pf_format != 'undefined' ? pf_format : '';
setArr_pf[currIx_pf][IX_PF_SIZE] = typeof pf_size != 'undefined' ? pf_size : '125x125';
setArr_pf[currIx_pf][IX_PF_DEBUG] = typeof pf_debug != 'undefined' ? pf_debug : 'no';
setArr_pf[currIx_pf][IX_PF_KEYWORDS] = typeof pf_keywords != 'undefined' ? pf_keywords : '';
setArr_pf[currIx_pf][IX_PF_BACKGROUND_COLOR] = typeof pf_bgcolor != 'undefined' ? pf_bgcolor : '';
setArr_pf[currIx_pf][IX_PF_BORDER_COLOR] = typeof pf_bordercolor != 'undefined' ? pf_bordercolor : '';
setArr_pf[currIx_pf][IX_PF_LINK_COLOR] = typeof pf_linkcolor != 'undefined' ? pf_linkcolor : '';
setArr_pf[currIx_pf][IX_PF_URL_COLOR] = typeof pf_urlcolor != 'undefined' ? pf_urlcolor : '';
setArr_pf[currIx_pf][IX_PF_TEXT_COLOR] = typeof pf_textcolor != 'undefined' ? pf_textcolor : '';
setArr_pf[currIx_pf][IX_PF_EXCLUDE] = typeof pf_exclude != 'undefined' ? pf_exclude : '';
setArr_pf[currIx_pf][IX_PF_MAX_RESULTS] = typeof pf_maxresults != 'undefined' ? pf_maxresults : '';
setArr_pf[currIx_pf][IX_PF_TEMPLATE] = typeof pf_template!= 'undefined' ? pf_template : '';
setArr_pf[currIx_pf][IX_PF_PROGRAMS] = typeof pf_programs != 'undefined' ? pf_programs : '';
setArr_pf[currIx_pf][IX_PF_CUID] = typeof pf_cuid != 'undefined' ? pf_cuid : '';
setArr_pf[currIx_pf][IX_PF_XSLURL] = typeof pf_xslurl != 'undefined' ? pf_xslurl : '';
setArr_pf[currIx_pf][IX_PF_EPI] = typeof pf_epi != 'undefined' ? pf_epi : '';
setArr_pf[currIx_pf][IX_PF_EPI2] = typeof pf_epi2 != 'undefined' ? pf_epi2 : '';
setArr_pf[currIx_pf][IX_PF_CATEGORIES] = typeof pf_categories != 'undefined' ? pf_categories : '';
setArr_pf[currIx_pf][IX_PF_LANG] = typeof pf_lang != 'undefined' ? pf_lang : '';

currIx_pf++;

/**
* 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_pf(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 == 'a') {
				continue;
			} 
			if(cnt < 400) {
				var subText = traverse_pf(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_pf(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_pf(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_pf(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) 
{
	pf_inParse = 1;

	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 = 40;
	var MAX_KEYWORDS = 24;
	var MAX_KEYWORD_LENGTH = 32;
	var url = '';
	var nnWidth = 0;
	var nnHeight = 0;

	// Create new iframe-node and insert
	var paramIx = 0;
	var scriptNode = null;
	var scriptNodes = document.getElementsByTagName('a');
	for(i=0; i<scriptNodes.length; i++) {
		scriptNode = scriptNodes[i];
		var id = scriptNode.getAttribute('id');
		if(id == 'pf_ads') {
			if(scriptNode.previousSibling.nodeName == 'IFRAME') {
				// Found pf_ads script node preceeded by iframe
				paramIx++;
				continue;
			} else {
				// Found pf_ads with no preceeding iframe
				break;
			}
		}
	}

	var exclude = setArr_pf[paramIx][IX_PF_EXCLUDE];
	exclude = exclude.replace(/ /,',');
	if(setArr_pf[paramIx][IX_PF_METHOD] != "manual") {
		var title = parseText_pf(doc, 'title').slice(0,MAX_TITLE);
		var metaDescription = parseMeta_pf(doc, 'description').slice(0,MAX_META_DESCRIPTION);
		var metaKeywords = parseMeta_pf(doc, 'keywords').slice(0,MAX_META_KEYWORDS);
		var h1 = parseText_pf(doc, 'h1').slice(0,MAX_H1);
		var h2 = parseText_pf(doc, 'h2').slice(0,MAX_H2);
		var h3 = parseText_pf(doc, 'h3').slice(0,MAX_H3);
		var bold = (parseText_pf(doc, 'strong').concat(parseText_pf(doc,'b'))).slice(0,MAX_BOLD);
		var body = parseText_pf(doc, 'body').slice(0,MAX_BODY);
		var keywords = setArr_pf[paramIx][IX_PF_KEYWORDS];
		url = createUrlAutomatic_pf(title,metaDescription,metaKeywords,h1,h2,h3,bold,body,exclude,keywords);
	} else {
		if(typeof setArr_pf[paramIx][IX_PF_KEYWORDS] != 'undefined') {
			var split = setArr_pf[paramIx][IX_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, exclude);
		}
	}

	// Get the size of the new iframe
	if(setArr_pf[paramIx][IX_PF_FORMAT].match('^ctext.*$')) {
		var a = setArr_pf[paramIx][IX_PF_FORMAT].split('_');
		var b = a[1].split('x');
		nnWidth = parseInt(b[0]);
		nnHeight = parseInt(b[1]);
	} else {
		var a = setArr_pf[paramIx][IX_PF_SIZE].split('x');
		nnWidth = parseInt(a[0]);
		nnHeight = parseInt(a[1]);
	}

	// Append the URL with the parameter set for this script tag
	url = appendCommonInfo_pf(url,paramIx);
	if(typeof nnWidth != 'undefined') 
		url += '&pf_width=' + nnWidth;
	if(typeof nnHeight != 'undefined') 
		url += '&pf_height=' + nnHeight;
	var newNode = document.createElement('iframe');
	newNode.frameBorder = "0";
	newNode.border = "0";
	newNode.marginwidth = "0";
	newNode.marginheight = "0";
	newNode.scrolling = "no";
	newNode.style.border = "0";
	newNode.width = nnWidth + 2;
	newNode.height = nnHeight + 2;
	newNode.src = url;
	scriptNode.parentNode.insertBefore(newNode, scriptNode);
	pf_inParse = 0;
	return true;
}

/**
* Append the script parameters
*/
function appendCommonInfo_pf(url, paramIx) 
{
	url += '&a=' + setArr_pf[paramIx][IX_PF_ID];
	url += '&xmlVersion=2';
	if(typeof pf_maxresults != 'undefined')
		url += '&maxResults=' + setArr_pf[paramIx][IX_PF_MAX_RESULTS];
    if(typeof pf_template != 'undefined')
		url += '&tid=' + setArr_pf[paramIx][IX_PF_TEMPLATE];
	if(typeof pf_programs != 'undefined')
		url += '&programs=' + setArr_pf[paramIx][IX_PF_PROGRAMS];
	if(typeof pf_cuid != 'undefined')
		url += '&cuid=' + setArr_pf[paramIx][IX_PF_CUID];
	if(typeof pf_xslurl != 'undefined') 
		url += '&xslUrl=' + setArr_pf[paramIx][IX_PF_XSLURL];
	if(typeof pf_epi != 'undefined') 
		url += '&epi=' + setArr_pf[paramIx][IX_PF_EPI];
    if(typeof pf_lang != 'undefined')
        url += '&lang=' + setArr_pf[paramIx][IX_PF_LANG];
	if(typeof pf_epi2 != 'undefined')
		url += '&epi2=' + setArr_pf[paramIx][IX_PF_EPI2];
	if(typeof pf_bgcolor != 'undefined') 
		url += '&pf_bgcolor=' + setArr_pf[paramIx][IX_PF_BACKGROUND_COLOR];
	if(typeof pf_bordercolor != 'undefined') 
		url += '&pf_bordercolor=' + setArr_pf[paramIx][IX_PF_BORDER_COLOR];
	if(typeof pf_linkcolor != 'undefined') 
		url += '&pf_linkcolor=' + setArr_pf[paramIx][IX_PF_LINK_COLOR];
	if(typeof pf_urlcolor != 'undefined') 
		url += '&pf_urlcolor=' + setArr_pf[paramIx][IX_PF_URL_COLOR];
	if(typeof pf_textcolor != 'undefined') 
		url += '&pf_textcolor=' + setArr_pf[paramIx][IX_PF_TEXT_COLOR];
	if(typeof pf_categories != 'undefined') {
            url += '&fallbackCategoryId=' + setArr_pf[paramIx][IX_PF_CATEGORIES];
            url += '&categoryId=' + setArr_pf[paramIx][IX_PF_CATEGORIES];
            url += '&recurse=true';
    }
    return url;
}

/**
* @param list Array of terms
* @return Contents of array, comma separated string.
*/
function commaSep_pf(list) 
{
	var sb = '';
	if(null != list && list.length > 0) {
		for(i=0; i<list.length; i++) {
			sb += encodeTerm_pf(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, exclude, keywords) 
{
	var str = "";
	var baseUrl = 'http://pf.tradedoubler.com/pf/cx?ttid=2';
	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 += "&description=" + escape(str);
	if (exclude && exclude.length > 0)
		baseUrl += "&exclude=" + escape(exclude);
	if (keywords && keywords.length > 0)
		baseUrl += "&fallbackDescription=" + escape(keywords);

	return baseUrl;
}

/**
* Constructs a TD URL, using manually supplied keywords
*/
function createUrlManual_pf(list, exclude) 
{
	var baseUrl = 'http://pf.tradedoubler.com/pf/cx?ttid=2';
	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 += "&description=" + escape(str);
	if (exclude && exclude.length > 0)
		baseUrl += "&exclude=" + escape(exclude);
	return baseUrl;
}

/**
* Starts the parse when body looks finished enough
*/
var count = 0;
var bl1 = 0;

function startParse_pf() {
	if(bl1 == 0) {
		bl1 = document.getElementsByTagName('body')[0].innerHTML.length;
		setTimeout("startParse_pf()",300);
		return true;
	}

	var bl2 = document.getElementsByTagName('body')[0].innerHTML.length;
	if(bl1 != 0 && bl1 == bl2 && pf_inParse == 0) {
		parse_pf(document);
	} else {
		bl1 = bl2;
		if(count < 5) {
			setTimeout("startParse_pf()",300);
			return true;
		}
	}
	
	return true;
}


function encodeTerm_pf(fld)
{
	if (fld == "") return false;
	var encodedField = "";
	var s = fld;
	if (typeof encodeURIComponent == "function") {
		encodedField = encodeURIComponent(s);
	} else {
		encodedField = escape(s);
	}
	return encodedField;
}

startParse_pf();