var qsrw = new Object();
qsrw.currIndex = -1;
qsrw.defaultIndex = 0;
qsrw.hasHeadlines = false;
qsrw.methodologyPages = new Array();

qsrw.initWidget = function() {
	qsrw.changeTab(qsrw.defaultIndex);
	qsrw.setClickTracking();
}

qsrw.changeTab = function(i) {
	var currTab = document.getElementById('rwT' + qsrw.currIndex);
	var newTab = document.getElementById('rwT' + i);
	var currData = document.getElementById('rwD' + qsrw.currIndex);
	var newData = document.getElementById('rwD' + i);
	
	if(currTab) {
		currTab.className = '';
	}
	
	if(currData) {
		currData.style.display = 'none';
	}
	
	newTab.className = newTab.className + 'rw_sel';
	newData.style.display = 'block';

	if(i != qsrw.currIndex) {
		try {
			var normalNewTabName = qsrw.normalizeTabName(newTab.firstChild.nodeValue);
			
			if(qsrw.hasHeadlines) {
				qsrw.updateHeadlines();
			}
			
			// Update about rates link
			if(i < qsrw.methodologyPages.length) {
				var aboutRatesLink = document.getElementById('rwTitle').getElementsByTagName('a')[0];
				aboutRatesLink.href = qsrw.methodologyPages[i];
				aboutRatesLink.search += (aboutRatesLink.search.length > 0 ? '&prd=' : '?prd=') + normalNewTabName;
				//aboutRatesLink.href = 'http://insure.com.lampdev.dms.quinstreet.net/publishers/multi_tab_widget' + '?prd=' + normalNewTabName;
			}
			
			// Track tab change (Quad)
			qsrw.trackImpression(i);
		} catch(ex) {}
	}
	
	qsrw.currIndex = i;
}

qsrw.toggleSelect = function(target) {
	target.isOpen = !target.isOpen;
	if(!target.optBox) {
		target.optBox = qsrw.getSelectOptions(target);
	}
	if(target.optBox) {
		target.optBox.style.display = target.isOpen ? 'block' : '';
	}
	target.focus();
}

qsrw.closeSelect = function(target) {
	if(!target.active) {
		target.isOpen = false;
		if(!target.optBox) {
			target.optBox = qsrw.getSelectOptions(target);
		}
		if(target.optBox) {
			target.optBox.style.display = '';
		}
	}
}

qsrw.getSelectOptions = function(target) {
	try {
		var spans = target.getElementsByTagName('span');
		for(var i = 0; i < spans.length; i++) {
			if(spans[i].className == 'rw_select_options') {
				return spans[i];
			}
		}
	} catch(ex) {
	}
	return null;
}

/* DEPRECATED, kept for backward compatibility */
qsrw.submitSelect = function(sel) {
	qsrw.trackClick(qsrw.currIndex); // quad click-out tracking
	
	/*
	 * We can't just change window.location to the option value because we need
	 * the URL to open in a new tab/window. This is accomplished by putting the
	 * select inside a form with method get, and target _blank. Set the action
	 * to the option value less the query params, break up the query params and
	 * store each key/value pair as a hidden input field in the form. Finally,
	 * submit the form which effectively opens the full option value in a new
	 * tab/window like we want! 
	 */
	var opt = sel.options[sel.selectedIndex];
	if(opt.value.length > 0) {
		var form = sel.parentNode;
		var url = opt.value;
		var qIdx = url.indexOf('?');
		var baseUrl = qIdx < 0 ? url : url.substring(0, qIdx);
		var query = qIdx < 0 ? '' : url.substring(qIdx + 1);
		
		// remove previous inputs
		for(var i = form.childNodes.length - 1; i >= 0; i--) {
			form.removeChild(form.childNodes[i]);
		}
		form.appendChild(sel);
		
		// add new inputs
		var params = query.split('&');
		for(var i = 0; i < params.length; i++) {
			var eIdx = params[i].indexOf('=');
			var param = '';
			var pVal = '';
			if(eIdx >= 0) {
				param = params[i].substring(0, eIdx);
				if(eIdx + 1 < params[i].length) {
					pVal = params[i].substring(eIdx + 1);
				}
				var hInput = document.createElement('input');
				hInput.type = 'hidden';
				hInput.name = param;
				hInput.value = pVal;
				form.appendChild(hInput);
			}
		}
		
		form.action = baseUrl;
		form.submit();
	}
}

qsrw.setClickTracking = function() {
	try {
		var tabRow = document.getElementById('rwTabRow');
		var tabs = tabRow.getElementsByTagName('td');
		for(var i = 0; i < tabs.length; i++) {
			var tabId = tabs[i].id;
			var dataId = tabId.replace('T', 'D');
			var dataNode = document.getElementById(dataId);
			var aList = dataNode.getElementsByTagName('a');
			
			for(var j = 0; j < aList.length; j++) {
				aList[j].onclick = function() { qsrw.trackClick(qsrw.currIndex); };
			}
		}
	} catch(ex) {}
}

qsrw.normalizeTabName = function(name) {
	return name.replace(/\s/g, '').replace('/', '_');
}

qsrw.updateData = function(tabData) {
	try {
		for(var i = 0; i < tabData.length; i++) {
			var tabIndex = qsrw.getTabIndexByName(tabData[i].name);
			if(tabIndex >= 0) {
				var dataDiv = document.getElementById('rwD' + tabIndex);
				if(dataDiv) {
					var tdList = dataDiv.getElementsByTagName('td');
					if(tdList.length > 0 && tdList[0].className == 'rw_data') {
						rowList = tdList[0].getElementsByTagName('tr');
						colList = rowList[0].getElementsByTagName('th');
						for(var j = 0; j < colList.length; j++) {
							try {
								colList[j].innerHTML = tabData[i].labels[j];
							} catch(ex) {}
						}
						for(var j = 1; j < rowList.length; j++) {
							colList = rowList[j].getElementsByTagName('td');
							for(var k = 1; k < colList.length; k++) {
								try {
									var links = colList[k].getElementsByTagName('a');
									if(!links || links.length == 0) {
										colList[k].innerHTML = tabData[i].data[j-1][k-1];
									}
								} catch(ex) {
									colList[k].innerHTML = '--';
								}
							}
						}
					}
					
					if(tdList.length > 0 && tdList[tdList.length-1].className == 'rw_headlines') {
						var hlItems = tdList[tdList.length-1].getElementsByTagName('li');
						var articles = tabData[i].articles;
						for(var j = 0; j < hlItems.length; j++) {
							var a;
							if(j < articles.length) {
								a = articles[j];
								hlItems[j].style.visibility = '';
							} else {
								a = {title:'',url:''};
								hlItems[j].style.visibility = 'hidden';
							}
							var aTag = hlItems[j].getElementsByTagName('a')[0];
							var sep = a.url.indexOf('?') >= 0 ? '&' : '?';
							aTag.href = a.url + (qsrw.wtQsOsrc ? sep + 'WT.qs_osrc=' + qsrw.wtQsOsrc : '');
							aTag.title = '';
							aTag.innerHTML = a.title;
						}
						qsrw.hasHeadlines = true;
					}
				}
			}
		}
	} catch(ex) {};
}

qsrw.getTabIndexByName = function(name) {
	var result = -1;
	try {
		var tabRow = document.getElementById('rwTabRow');
		var tabs = tabRow.getElementsByTagName('td');
		for(var i = 0; i < tabs.length; i++) {
			if(name == tabs[i].firstChild.nodeValue) {
				result = i;
			}
		}
	} catch(ex) {}
	return result;
}

qsrw.updateHeadlines = function() {
	var tabData = document.getElementById("rwTabData");
	var listItems = tabData.getElementsByTagName("li");
	for(var i = 0; i < listItems.length; i++) {
		// check for headlines parent
		if(listItems[i].offsetHeight > 0 && listItems[i].parentNode.parentNode.className == "rw_headlines") {
			var link = listItems[i].getElementsByTagName("a")[0];
			if(link.title && link.title.length > 0) {
				link.firstChild.nodeValue = link.title;
				link.title = "";
			}
			qsrw.textReduce(link, 1);
		}
	}
}

/*
 * WARNING: Does not play nice with embedded tags (e.g., <br>)
 * Should only be used on elements that contain only text.
 */
qsrw.textReduce = function(el, numLines) {
	var textNode = el.firstChild;
	if(!textNode) {
		return;
	}
	
	// Strut text to determine total line height
	var strut = "A";
	for(var i = 1; i < numLines; i++) {
		strut += " A";
	}
	
	// Compute maximum line height
	var prevText = textNode.nodeValue;
	var prevDisplay = el.style.display;
	var prevWidth = el.style.width;
	el.style.display = "block";
	el.style.width = "1px";
	textNode.nodeValue = strut;
	var maxHeight = el.offsetHeight;
	
	// Restore modified properties (except block display)
	el.style.width = prevWidth;
	textNode.nodeValue = prevText;
	
	// If element wraps, change length
	if(el.offsetHeight > maxHeight) {
		var str = textNode.nodeValue;
		var base = "";
		
		// Find longest string that doesn't wrap
		while(str.length > 1) {
			var left = str.substring(0, str.length / 2);
			var right = str.substring(str.length / 2);
			textNode.nodeValue = base + left + "...";
			
			if(el.offsetHeight > maxHeight) {
				str = left;
			} else {
				base += left;
				str = right;
			}
		}
		base = base.replace(/\s*$/, "");
		
		// Ellipsize and set title to full value
		//textNode.nodeValue = base.substring(0, base.length - 4) + "...";
		textNode.nodeValue = base + "...";
		el.title = (el.title && el.title.length > 0) ? el.title + " : " + prevText : prevText;
	}
	
	// Restore display
	el.style.display = prevDisplay;
}

qsrw.trackImpression = function(index) {
	try {
		if(qsrw.impressionTrackers && qsrw.impressionTrackers[index].length > 0) {
			var qImage = new Image(1, 1);
			qImage.src = qsrw.impressionTrackers[index] + ';rnd=' + Math.random();
		}
	} catch(ex){}
}

qsrw.trackClick = function(index) {
	try {
		if(qsrw.impressionTrackers && qsrw.impressionTrackers[index].length > 0) {
			var url = qsrw.impressionTrackers[index].replace(';e=i;', ';e=c;');
			var qImage = new Image(1, 1);
			qImage.src = url + ';rnd=' + Math.random();
		}
	} catch(ex) {}
}
