//ACBIX, PWC, RSP, IWB, IWV
//console.log("ACBIX, PWC, RSP, IWB, IWV");
function CompareTool() {
	this.aoExpand = false;
	this.inputErrors = false;
}

CompareTool.prototype.init = function() {
	this.pageEvents = {
		'#compareTable tbody tr.dataRow' : {
			'mouseout': {context:this, handler:this.highlightOut }
			,'mouseover': {context:this, handler:this.highlightOver }
		},
		'#compareTable tbody tr.TopTenHoldingsRow a[symbol]' : {
			 'mouseover': { context:this, handler:this.sameSymbolOverOut, data:{over:true} }
			,'mouseout': { context:this, handler:this.sameSymbolOverOut, data:{over:false} }
		}
	}
	this.populateFormData();
}

CompareTool.prototype.populateFormData = function() {

	var formDataPointer = this.formData;		
	function setSelected(el, prop) {
		var dd = Element.get(el);
		for(var i=0; i < dd.options.length; i++) {
			var option = dd.options[i];
			if (option.value == formDataPointer[prop]) {
				option.selected = true;
				break;
			}
		}
	}

	if (Element.get("rdAuto")) {
		var compareType = (this.formData.compareType == "specific") ? "rdSpecific" : "rdAuto";
		Element.get(compareType).checked = true;

		this.toggleCompareInputs(this.formData.compareType);
		Element.get("tbSymbolSingle").value = this.formData.symbolSingle;
		Element.get("tbSymbolMultiple").value = this.formData.symbolMultiple;
	
		setSelected("ddComparedTo", "comparedTo");
		setSelected("ddMinimumInvestment", "minimumInvestment");
		setSelected("ddRelativeValues", "relativeValues");
	
		if (this.formData.salesLoad) Element.get("cbSalesLoad").checked = true;
		if (this.formData.transactionFee) Element.get("cbTransactionFee").checked = true;
		if (this.formData.expense) Element.get("cbExpense").checked = true;
		if (this.formData.openClosed) Element.get("cbOpenClosed").checked = true;
		if (this.formData.aoExpand) compareTool.toggleAdvancedOptions(null, true);			
	}
}

CompareTool.prototype.toggleAdvancedOptions = function(status, quick) {
	this.aoExpand = !this.aoExpand;
	
	if (status) this.aoExpand = (status == "show") ? true : false;
	
	if (this.aoExpand) {
		Element.addClass("ctAdvancedOptionsLink", "expand");
		(quick) ? Element.setDisplay("ctAdvancedOptions", "block") : toggleDiv.show();
		Element.setHTML("ctAdvancedOptionsLink", "Hide advanced options");
	} else {
		Element.removeClass("ctAdvancedOptionsLink", "expand");
		(quick) ? Element.setDisplay("ctAdvancedOptions", "none") : toggleDiv.hide();
		Element.setHTML("ctAdvancedOptionsLink", "Show advanced options");
	}
}

CompareTool.prototype.toggleCompareInputs = function(val) {
	var stateAuto = (val == "auto") ? "block" : "none";
	var stateSpecific = (val == "auto") ? "none" : "block";
	var stateOptionsLink = (val == "auto") ? "visible" : "hidden";

	Element.setDisplay("compareAuto", stateAuto);
	Element.setDisplay("compareSpecific", stateSpecific);
	Element.setVisibility("ctAdvancedOptionsLink", stateOptionsLink);
	
	if (val == "specific") this.toggleAdvancedOptions("hide", true);
}

CompareTool.prototype.buildData = function(tab, compareType) {

	this.hasErrors = false;
	var symbolSingle = Element.get("tbSymbolSingle");
	var symbolMultiple = Element.get("tbSymbolMultiple");

	this.errNode = Element.parseSelector("div.errMsg", null, "first");
	Element.removeChildNodes(this.errNode);
	Element.setDisplay(this.errNode,"none");

	Element.removeClass(symbolSingle, "errHighlight");
	Element.removeClass(symbolMultiple, "errHighlight");

	this.tab = tab || "Snapshot";
	this.data = {};
	this.data.symbolSingle = symbolSingle.value || "";
	this.data.symbolMultiple = symbolMultiple.value || "";
	this.data.comparedTo = Element.get("ddComparedTo").value || "";
	this.data.currentPage = this.currentPage || "index.asp";
	this.data.tab = this.tab;
	
	if (compareType) {
		this.data.formWasUsed = true;
	} else {
		this.data.formWasUsed = false;
	}
	
	if (compareType) {
		this.data.compareType = compareType;
	} else {
		this.data.compareType = (Element.get("rdAuto").checked) ? Element.get("rdAuto").value : Element.get("rdSpecific").value;		
	}

	if (this.data.compareType == "auto") {
		if (this.data.symbolSingle == "" || this.data.symbolSingle == symbolSingle.getAttribute("defaultText")) {
			Element.addClass(symbolSingle, "errHighlight");
			this.drawInlineMsg("errModNoSymbol");
			this.hasErrors = true;
		}
	} else {
		if (this.data.symbolMultiple == "" || this.data.symbolMultiple == symbolMultiple.getAttribute("defaultText")) {
			//!/\,/.test(this.data.symbolMultiple)
			Element.addClass(symbolMultiple, "errHighlight");
			this.drawInlineMsg("errModNoSymbol");
			this.hasErrors = true;
		}
	}

	if (this.hasErrors) {
		alert("Please review the highlighted fields and make changes as needed before resubmitting.");
		return false;
	}
	
	// should there be defaults for each property?
	if (Element.get("ddMinimumInvestment")) {
		this.data.aoExpand = (Element.hasClass("ctAdvancedOptionsLink", "expand")) ? true : false;
		this.data.minimumInvestment = Element.get("ddMinimumInvestment").value || "";
		this.data.salesLoad = (Element.get("cbSalesLoad").checked) ? true : false;
		this.data.transactionFee = (Element.get("cbTransactionFee").checked) ? true : false;
		this.data.expense = (Element.get("cbExpense").checked) ? true : false;
		this.data.openClosed = (Element.get("cbOpenClosed").checked) ? true : false;
		this.data.relativeValues = Element.get("ddRelativeValues").value || "";
	}

	if (arguments.length == 3) {
		var url = "compare_print.asp?display=popup&data=" + DataFunctions.serializer.serialize(this.data);
		window.open(url,'print','width=800, resize=no, scrollbars=yes, toolbar=yes, menubar=yes');
	} else {
		location.href = "compareResults.asp?tab=" + this.tab + "&data=" + DataFunctions.serializer.serialize(this.data);
	}
	return false;
}

CompareTool.prototype.drawInlineMsg = function(msgType) {
	if (!this.errNode) this.errNode = Element.parseSelector("div.errMsg", null, "first");
	var inlineErr = Element.get(msgType).cloneNode(true);
	inlineErr.style.color = "black";
	this.errNode.appendChild(inlineErr);
	Element.setDisplay(this.errNode,"block");
}

CompareTool.prototype.showSymbolErrors = function() {
	if (this.inputErrors) {
		Element.setHTML("errMsgInvalidSymbol", this.inputErrors.errorMsg);
		
		var symbolSingle = Element.get("tbSymbolSingle");
		var symbolMultiple = Element.get("tbSymbolMultiple");
		
		if (this.inputErrors.compareType == "auto") {
			Element.addClass(symbolSingle, "errHighlight");
			symbolSingle.value = this.inputErrors.tbValue;
		} else {
			Element.addClass(symbolMultiple, "errHighlight");
			symbolMultiple.value = this.inputErrors.tbValue;
		}
		this.drawInlineMsg("errModInvalidSymbol");
	}
}

// show an error message if no symbols returned
CompareTool.prototype.checkResults = function() {
	if(this.formData.noResults) {
		this.drawInlineMsg("errModNoResults");
	}
}

CompareTool.prototype.trMouseOverOut = function(e,el,data) {
	Element.switchClass(el,"highlight",data.over);
}

CompareTool.prototype.sameSymbolOverOut = function(e,el,data) {
	var thisSymbol = el.getAttribute("symbol");
	var sameSymbols = Element.parseSelector('tr.TopTenHoldingsRow a[symbol="'+thisSymbol+'"]', Element.get("tbodyCompareTool"));
	
	for (var i = 0;i < sameSymbols.length;i++) {
		sameSymbols[i] = Element.getParent(sameSymbols[i], "tr");
	}

	Element.switchClass(sameSymbols, "sameSymbolRow", data.over);
}

CompareTool.prototype.highlightOver = function(e, el, data) {
	Element.addClass(el, "highlight");
}

CompareTool.prototype.highlightOut = function(e, el, data) {
	Element.removeClass(el, "highlight");
}

var compareTool = new CompareTool();

////////// FX Library //////////
function Fx(el) {
	this.item = this.get(el);
}
Fx.prototype = new Element_class(); //requires Element 3+

// smooth show/hide effect for elements
Fx.prototype.slide = function(props) {
	
	var props = props || {};
	//this.type = props.type || null;
	this.item = this.get(props.id);
	this.itemIsOpen = (this.item.style.display == "block") ? true : false;

	// effect parameters
	this.now = null;
	this.iHeight = 0;
	this.direction = false;
	this.timer = null;
	this.start = null;
	this.interval = props.time || 400;
	this.opacity = props.opacity || 0;
	this.inTransition = false;
	this.onShowComplete = props.visible || null; // a function to be called when done showing
	this.onHideComplete = props.hidden || null; // a function to be called when done hiding

	this.show = function(quick) {
		if (this.inTransition) return;
		
		this.itemIsOpen = true;
		this.setDisplay(this.item, "block");

		if (quick) {
			if (this.onShowComplete) this.onShowComplete();
			return;
		}
		this.inTransition = true;
		this.iHeight = this.getSize(this.item).height;
		this.oHeight = this.iHeight;
		this.direction = true;
		this.setStyle(this.item, "height:" + 1+"px;");
		this.startTransition(0, this.iHeight);
		return;
	}

	this.hide = function(quick) {
		if (this.inTransition) return;
	
		this.itemIsOpen = false;
	
		if (quick) {
			this.setDisplay("this.item", "none");
			if (this.onHideComplete) this.onHideComplete();
			return;
		}
	
		this.inTransition = true;
		this.setDisplay(this.item, "block")
		this.iHeight = this.getSize(this.item).height;
		this.direction = false;
		this.setStyle(this.item, "height:" + this.iHeight+"px;");
	
		this.startTransition(this.iHeight,0);
	
		return;
	}

	this.startTransition = function(from,to) {
		if (this.timer) {
			clearInterval(this.timer);
		}
		this.setStyle(this.item, "display:block;overflow:hidden;")
		this.fromSize = from;
		this.toSize = to;
		this.start = (new Date).getTime();
	   	var self = this;
	   	this.timer = window.setInterval( function(){ self.heightTransition() }, 40);
	}
	
	this.heightTransition = function() {
		this.time = (new Date).getTime();

		if (this.time >= this.interval+this.start) {
			clearInterval(this.timer);
			this.timer = null; // cancel timer
			this.setStyle(this.item, "overflow:hidden;");
			this.inTransition = false;
			if (this.direction) { // show complete
				this.setStyle(this.item, "height:");
				if (this.onShowComplete) this.onShowComplete();
			}
			else { // hide complete
				this.setDisplay(this.item, "none");
				this.setStyle(this.item, "height:");
				if (this.onHideComplete) this.onHideComplete();
			}
		return;
		}
		else {
			var Tpos = (this.time - this.start) / (this.interval);
			this.now = ((-Math.cos(Tpos*Math.PI)/2) + 0.5) * (this.toSize-this.fromSize) + this.fromSize;
			//sinoidal transition is from script.aculo.us
		}
		this.update();
	}

	this.toggle = function(display, quick) {
		var quick = (quick) ? true : false;
		if (display) {
			this.show(quick);
		}
		else {
			this.hide(quick);
		}
		return false;
	}

	this.update = function() {
		if (this.opacity) {
			// Opacity may cause transparency issues in IE with complex divs
			var opac = Math.round((this.now/this.iHeight)*100)/100;
			this.setStyle(this.item, "filter:Alpha(Opacity="+(opac*100)+")");
			this.setStyle(this.item, "opacity:" + opac);
		}
		this.now = Math.max(this.now, 1);
		this.setStyle(this.item, "height:" + this.now+"px;");
	}

	this.isOpen = function() {
		return this.itemIsOpen;
	}
}
////////// FX Library //////////
var toggleDiv = new Fx();