function isBadEmail(str) {
	if (/@.*@/.test(str)) return true;
	if (/[\000-\037 ()<>,;:\\"[\]\177]/.test(str)) return true;
	if (/.+@[A-Za-z0-9\-]+\.[A-Za-z0-9\-.]*/.test(str)) return false;
	return true;
}
	
function signUpErrorHandler() {
	Effect.BlindDown("SignUpPanelErrorMsg", { duration: 0.25 });
	$("SignUpPanelLoader").hide();
	if ($("SignUpPanelForm").hasClassName("isDisabled"))
		$("SignUpPanelForm").removeClassName("isDisabled");
	new Effect.Opacity("SignUpPanelForm", { from: 0.5, to: 1.0, duration: 0.1 });
}

var dataListReady = null;

function initDataList() {
	// DATA LISTS
	var dataLists = $$("table.DataList");
	if (dataLists) {
		$(dataLists).each(function (dl, index) {
			var itemList = dl.select("div.ListItem");
			var itemCt = itemList.length;
			for (var i = 0; i < itemCt; i++) {
				var itemElm = itemList[i];
				
				// extract the item id
				var result = /\d+$/.exec(itemElm.id);
				if (result.length > 0) {
					var itemId = result[0];
					
					// get the item description
					var itemOpened = $("ItemOpened-" + itemId);
					var itemOpenedSrc = itemOpened.innerHTML;
					
					var maxLinesPerItem = 3;
					var maxCharsPerLine = parseInt(($(itemOpened).getWidth() / 6));	// 5px per character
					var posOfBr = itemOpenedSrc.search(/<br ?\/?>/i);	// <br /> node
					
					// add more link if <div>:
					//   - is greater than 33px (33 = line height * 2)
					//   - has a character count greater than the max characters per line time 2 lines
					//   - contains a <br> node
					if ($(itemOpened).getHeight() > 28 && ((itemOpenedSrc.length > (maxCharsPerLine * maxLinesPerItem)) || (posOfBr != -1))) {
					
						// copy the item description for short description
						var itemClosed = itemOpened.cloneNode(true);
						
						// truncate the short description
						var itemClosedSrc = itemClosed.innerHTML;
						if (posOfBr != -1 && posOfBr <= (maxCharsPerLine * maxLinesPerItem)) {
							itemClosedSrc = itemClosedSrc.substring(0, posOfBr);
						}
						else if (itemClosedSrc.charAt(maxCharsPerLine * maxLinesPerItem) == " ") {
							itemClosedSrc = itemClosedSrc.substring(0, (maxCharsPerLine * maxLinesPerItem));
						}
						else {
							itemClosedSrc = itemClosedSrc.substring(0, (maxCharsPerLine * maxLinesPerItem));
							// remove the trailing truncated word 
							itemClosedSrc = itemClosedSrc.replace(/\w+$/, "");
						}
						// remove trailing spaces
						itemClosedSrc = itemClosedSrc.replace(/\s+$/, "");
						// the non-breaking space is added before the link
						// for spacing and to force the link to 'stick' to
						// the last word and prevent the 'More' link from
						// being orphaned onto a newline
						itemClosedSrc += '&nbsp;<a href="#" class="MoreBtn" id="MoreBtn-' + itemId + '">More...</a>';
						itemClosed.innerHTML = itemClosedSrc;
						
						// append the short description
						itemElm.insertBefore(itemClosed, itemOpened);
						
						// append the close button
						var closeBtn = document.createElement("div");
						var closeBtnSrc = '<a href="#" class="CloseBtn" id="CloseBtn-' + itemId + '">(X) Close</a>';
						closeBtn.innerHTML = closeBtnSrc;
						closeBtn.className = "CloseBtn";
						itemOpened.appendChild(closeBtn);
						
						// initialize the short description
						itemClosed.id = "ItemClosed-" + itemId;
						itemClosed.className = "ItemClosed";
						
						// initialize the description
						itemOpened.className = "ItemOpened";	
			
						$("ItemOpened-" + itemId).hide();		
						
						itemElm.style.position = "relative";
	
						// initialize button event handlers
						$("MoreBtn-" + itemId).observe("click", function (evt) {
							evt.stop();
							// extract the item id
							var result = /\d+$/.exec(this.id);
							if (result.length > 0) {
								var itemId = result[0];
								Effect.BlindUp("ItemClosed-" + itemId, { duration: 0.25, queue: "front" });	
								Effect.BlindDown("ItemOpened-" + itemId, { duration: 0.5, queue: "end" });
							}
						});
	
						$("CloseBtn-" + itemId).observe("click", function (evt) {
							evt.stop();
							// extract the item id
							var result = /\d+$/.exec(this.id);
							if (result.length > 0) {
								var itemId = result[0];
								Effect.BlindUp("ItemOpened-" + itemId, { duration: 0.5, queue: "front" });	
								Effect.BlindDown("ItemClosed-" + itemId, { duration: 0.25, queue: "end" });
							}						
						});
					}
				}
			}
		});
		
		if (dataListReady) {
			dataListReady();
		}
	}	
}

document.observe("dom:loaded", function() {					
						
	// DATA LISTS				
	initDataList();
										
	// PRINT BUTTON
	// set onclick event handler for the [PRINT] button
	// onclick event will launch the print window
	if ($("PrintPageBtn")) {
		Event.observe("PrintPageBtn", "click", function(evt) {
			evt.stop();
			this.blur();
			print();
		});
	}
	
	// EMAIL BUTTON
	// set onclick event handler for the [EMAIL] button
	// onclick event will launch an email window with the document's title as 
	// the subject and create a prefabricated message with the document's URL
	if ($("EmailPageBtn")) {
		Event.observe("EmailPageBtn", "click", function(evt) {
			evt.stop();
			this.blur();
			var uri = "mailto:?";
			uri += "Subject=" + escape(document.title);
			uri += "&";
			uri += "Body=Thought%20you%20might%20be%20interested%20in%20the%20following%20link%3A%0A%0A";
			uri += window.location.href;
			window.location.href = uri;
		});
	}
	
	// TEXT SIZE + (increase)
	// set onclick event handler for the [+] text size button
	// onclick event will toggle the font size style sheet
	if ($("IncTextSizeBtn")) {
		Event.observe("IncTextSizeBtn", "click", function(evt) {
			evt.stop();
			this.blur();
			setActiveStyleSheet("default");
		});
	}
	
	// TEXT SIZE - (decrease)
	// set onclick event handler for the [-] text size button
	// onclick event will toggle the font size style sheet
	if ($("DecTextSizeBtn")) {
		Event.observe("DecTextSizeBtn", "click", function(evt) {
			evt.stop();
			this.blur();
			setActiveStyleSheet("large");
		});
	}
	
	// HORIZONTAL RULES
	// nest the <hr> element into a div container for customization via CSS
	// unless it has already been nested in a div with "HorzRule" class name
	var allHorzRules = $$("hr");
	allHorzRules.each(function (hr) {
		var parentNode = hr.up();
		if (!(parentNode.tagName.toLowerCase() == "div" && parentNode.hasClassName("HorzRule"))) {
			$(hr).wrap("div", { "class": "HorzRule" });
		}
	});
	

	// OUR TEAM MENU
	// load "Our Team" menu with people
	var targetElm = $("OurTeamMenu").select("div.Submenu > div.SubmenuBody > ul")[0];
	new Ajax.Request("/portfolio/team_menu.cgi", {
		method: "post",
		onComplete: function(transport) {
			// alert(transport.responseText);
			targetElm.replace(transport.responseText);
			var MainMenuBar = new Spry.Widget.MenuBar("MainMenuBar");
		}
	});
	
	// PORTFOLIO
	if ($("PortfolioSectorPicklist")) {
		$("PortfolioSectorPicklist").observe("change", function (evt) {
			//this.form.submit();
			new Ajax.Updater("PortfolioCompanyList", "/portfolio/portfolio.cgi?" + Math.random(), {															
				method: "post",
				parameters: $("FilterBySector").serialize(true),
				onCreate: function () {
					$("SectorLoader").show();	
				},
				onComplete: function (transport) {
					$("SectorLoader").hide();	
					initDataList();
				}
			});
		});
	}
	
	// SIGN UP PANEL	
	if ($("SignUpLink")) {
		var signUpFormLoaded = false;
		new Ajax.Updater("SignUpLink", "/forms/sign_up_form.html", { 
			method: "get",
			insertion: Insertion.After,
			onSuccess: function() {
				signUpFormLoaded = true;
			},
			onComplete: function() {
				if (signUpFormLoaded) {
					
					$("SignUpPanel",
					  "SignUpPanelLoader",
					  "SignUpPanelErrorMsg",
					  "SignUpPanelResponse",
					  "SignUpPanelDisabledSubmitBtn").invoke("hide");
	
					Event.observe("SignUpLink", "click", function(evt) {
						if ($("SignUpPanel")) {
							evt.stop();
							if (!$("SignUpLink").hasClassName("isOn")) {
								$("SignUpLink").addClassName("isOn");
								Effect.BlindDown("SignUpPanel", {
									duration: 0.5,
									afterFinish: function () {
										$("SignUpPanelFirstName").focus();
									}
								});
							}
						}
					});
					
					Event.observe("SignUpPanelCloseBtn", "click", function(evt) {
						evt.stop();
						$("SignUpPanelCloseBtn").blur();
						if ($("SignUpLink").hasClassName("isOn")) {
							Effect.BlindUp("SignUpPanel", {
								duration: 0.5, 
								afterFinish: function () {
									$("SignUpPanel","SignUpPanelLoader","SignUpPanelErrorMsg","SignUpPanelResponse").invoke("hide");
									$("SignUpPanelContent").show();
									$("SignUpPanelForm").enable().show().reset();
									if ($("SignUpLink").hasClassName("isOn"))
										$("SignUpLink").removeClassName("isOn");
									if ($("SignUpPanelForm").hasClassName("isDisabled"))
										$("SignUpPanelForm").removeClassName("isDisabled");
								}
							});
						}
					});
					
					Event.observe("SignUpPanelForm", "submit", function(evt) {
						evt.stop();
						var errorMsg = "";
						var email = $("SignUpPanelEmail").value.strip();
						if ($("SignUpPanelFirstName").value.strip() == "") errorMsg += "<li>Please enter your first name.</li>";
						if ($("SignUpPanelLastName").value.strip() == "") errorMsg += "<li>Please enter your last name.</li>";
						if ($("SignUpPanelCompany").value.strip() == "") errorMsg += "<li>Please enter your company name.</li>";
						if (email == "") {
							errorMsg += "<li>Please enter your email address.</li>";
						}
						else if (email != $("SignUpPanelConfirmEmail").value.strip()) {
							errorMsg += "<li>The email address and confirm email address don't match.</li>";
						}
						else if (isBadEmail(email)) {
							errorMsg += "<li>Please enter a valid email address.</li>";
						}
						
						if (errorMsg != "") {
							errorMsg = "<ul>" + errorMsg + "</ul>";
							$("SignUpPanelErrorMsg").innerHTML = errorMsg;
							Effect.BlindDown("SignUpPanelErrorMsg", { duration: 0.25 });
						}
						else {
							Effect.BlindUp("SignUpPanelErrorMsg", { duration: 0.25 });
							new Ajax.Request("/contact/sign_up.cgi", { 
								method: "post",
								parameters: $("SignUpPanelForm").serialize(true),
								onCreate: function() {
									if (!$("SignUpPanelForm").hasClassName("isDisabled"))
										$("SignUpPanelForm").addClassName("isDisabled");
										$("SignUpPanelLoader").show();
								},
								onSuccess: function(transport) {
									var json = transport.responseJSON;
									if (json.response.status.toLowerCase() == "success") {
										$("SignUpPanelLoader").hide();
										new Effect.Parallel([
											new Effect.BlindDown("SignUpPanelResponse", { sync: true }), 
											new Effect.SlideUp("SignUpPanelContent", { sync: true })
										], { duration: 1.0 });
									}
									else if (json.response.status.toLowerCase() == "error") {
										$("SignUpPanelErrorMsg").innerHTML = json.response.message;
										signUpErrorHandler();
									}
									else {
										$("SignUpPanelErrorMsg").innerHTML = "<p>I'm sorry. An error occurred while processing" +
											" your request. Please try re-submitting your information in a few minutes. (invalid response)</p>";
										signUpErrorHandler();
									}
								},
								onFailure: function() {
									$("SignUpPanelErrorMsg").innerHTML = "<p>I'm sorry. An error occurred while processing" +
										" your request. Please try re-submitting your information in a few minutes. (no response)</p>";
									signUpErrorHandler();
								}
							});
						}
					});
				}
			}
		});
	}
});