var MainAPI = ( function ( ) {


  // Setup all Text and TextArea inputs to expand when focused on.
  // Need to add Expandable class to your input. ex. <input type="text" class="Expandable" value="" /> or <textarea cols="5"  rows="5" class="Expandable">
    var setupExpandableTextFields = function() {
        var defaultOptions = { Width : 20, Rows : 5 };
        $$(document.getElementsByTagName('input'), document.getElementsByTagName('textarea')).each( function(el) {
            if (el.hasClass("Expandable")) {
                el.addEvents({
                    "focus" : function() {
                        if (el.type == "text") { el.setStyle("width", (el.width + defaultOptions["Width"]) ); } else { el.setProperty("rows", (el.rows + defaultOptions["Rows"]) ); }
                    },
                    "blur" : function() {
                        if (el.type == "text") { el.setStyle("width", (el.width - defaultOptions["Width"]) ); } else { el.setProperty("rows", (el.rows - defaultOptions["Rows"]) ); }
                    }
                });
            }
        });
	}

  var setupDatePicker = function ( container ) {
		var enableCalendar = function ( elementID ) {
    		var cCalendar = {
    			"months" : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
    			"days" : ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
    			"daysAbr" : ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
    			"layerId" : "CalendarDiv",
    			"iFrameId" : "CalendarIframe",
    			"elementId" : elementID,
    			"date" : null,
    			"yearBar" : null,
    			"monthBar" : null,
    			"content" : null,
    			"todayBar" : null,
    			"getDate" : function (theDate) {
    				return this.date;
    			},
    			"getElementDate" : function () {
    				var dateValue = $(this.elementId).getProperty("value");
    				var d = getJSDate(dateValue);
    				return (d !== false) ? d : new Date();
    			},
    			"setElementDate" : function (theDate) {
    				$(this.elementId).value = getFormatedDate(theDate);
    				this.setElementTitle(theDate);
    				return theDate;
    			},
    			"setDate" : function (theDate) {
    				this.date = theDate;
    				return this.date;
    			},
    			"pickDate" : function (theDate) {
    				this.setElementDate(this.setDate(theDate));
    			},
    			"setElementTitle" : function (theDate) {
					var elDate = this.getElementDate();
					//print_r(elDate);
					$(this.elementId).setProperty("title", cCalendar.days[elDate.getDay()] + " " + cCalendar.months[elDate.getMonth()] + " " + elDate.getDate() + " " + elDate.getFullYear());
                },
                "isDisplayed" : function () {
                	return ($(this.layerId) && $(this.layerId).getStyle("visibility") == "visible" && $(this.layerId).getStyle("display") == "block");
    			},
    			"changeYear" : function (nbYears) {
    				this.setDate(new Date(this.getDate().getFullYear() + nbYears, this.getDate().getMonth(), 1));
    				this.build();
    				this.display();
    			},
    			"changeMonth" : function (nbMonths) {
    				this.setDate(new Date(this.getDate().getFullYear(), this.getDate().getMonth() + nbMonths, 1));
    				this.build();
    				this.display();
    			},
    			"build" : function (theDate) {
    				// Builds yearBar
    				this.yearBar = new Element("div", {
    					"class" : "cCalendarBar"
    				}).adopt(
    					new Element("span", { // Previous button (go to previous year)
        					"class" : "previous",
        					"events" : {
            					"click" : function () {
                      				cCalendar.changeYear(-1);
                          		}
            				}
        				}).set("html", "&nbsp;"),
        				new Element("span", { // Display current year
                            "class" : "content cCalendar13px"
        				}).set("html", this.date.getFullYear()),
        				new Element("span", { // Next button (go to next year)
        					"class" : "next",
        					"events" : {
            					"click" : function () {
                      				cCalendar.changeYear(1);
                          		}
            				}
        				}).set("html", "&nbsp;")
    				);

    				// Builds monthBar
    				this.monthBar = new Element("div", {
    					"class" : "cCalendarBar"
    				}).adopt(
    					new Element("span", { // Previous button (go to previous month)
        					"class" : "previous",
        					"events" : {
            					"click" : function () {
                      				(function () { cCalendar.changeMonth(-1); }).delay(300);
                          		}
            				}
        				}).set("html", "&nbsp;"),
        				new Element("span", { // Displays current month
                            "class" : "content"
        				}).set("html", this.months[this.date.getMonth()]),
        				new Element("span", { // Next button (go to previous next)
        					"class" : "next",
        					"events" : {
            					"click" : function () {
                      				(function () { cCalendar.changeMonth(1); }).delay(300);
                          		}
            				}
        				}).set("html", "&nbsp;")
    				);

    	   			// Builds content table
    	   			this.content = new Element("table", {
    					"class" : "cCalendarDaysTable",
    					"cellpadding" : "0",
    					"cellspacing" : "1"
    				});


    				// Old school building because of IE (using native DOM function for tables)
    				// Builds THead and inserts a row inside it
    				var headerRow = this.content.createTHead().insertRow(this.content.length);
    				var tmp = null;
    				$each(this.daysAbr, function (day, index) {
        				tmp = headerRow.appendChild(new Element("th").set("html", day));
        				tmp.className = (index == 6 || index == 0) ? "weekend" : "";
    				});

    				// Builds TBody
    				var tBody = new Element("tbody").inject(this.content);

    				// Builds table rows
    				var firstDay = new Date(this.date.getFullYear(), this.date.getMonth(), 1);
    				var dayOfTheWeek = firstDay.getDay();
    				var daysToSub = ((dayOfTheWeek + 7) %7 );
    				var startDate = new Date(firstDay.getFullYear(), firstDay.getMonth(), firstDay.getDate() - daysToSub);

    				var cellClass = "";
    				var cellContent = "";
    				var cellEvents = null;
    				while (startDate.getMonth() != (this.date.getMonth() + 1) % 12) {
    					for (var i = 0; i < 7; i++) {
    						if (i % 7 == 0) {
    							// If new week, inserts new row
    							var currentRow = tBody.insertRow(tBody.rows.length);
    						}

    						if (startDate.equals(this.getElementDate())) {
    							cellClass = "cCalendarDateSelected";
    							cellEvents = null;
    						} else {
    							cellClass = (startDate.getMonth() != this.date.getMonth()) ? "cCalendarDateShadowed" : "cCalendarDate";
    							cellEvents = {
    								"mouseover" : (function () {
    									this.toggleClass("cCalendarDateOver");
    									cCalendar.setElementDate(getJSDate(this.id));
    								}),
    								"mouseout" : (function () {
    									this.toggleClass("cCalendarDateOver");
    									cCalendar.setElementDate(cCalendar.date);
    								}),
    								"click" : (function () {
    									cCalendar.pickDate(getJSDate(this.id));
    									cCalendar.hide();
    								})
    							};
    						}

    						var currentCell = currentRow.insertCell(currentRow.cells.length);
    						currentCell.appendChild(new Element("div", {
    							"id" : getFormatedDate(startDate),
    							"class" : cellClass + ((startDate.isWeekend()) ? " weekend" : ""),
    							"events" : cellEvents
    						}).set("html", startDate.getDate().toString()));

    						startDate.setDate(startDate.getDate() + 1);
    					}
    				}

    				this.todayBar = new Element("div", {
    					"id" : "todayBar_" + getFormatedDate(new Date()),
    					"class" : "cCalendarTodayBar",
    					"events" : {
    						"mouseover" : function () {
    							this.toggleClass("cCalendarDateOver");
    							cCalendar.setElementDate(getJSDate(this.id.split("_")[1]));
    						},
    						"mouseout" : function () {
    							this.toggleClass("cCalendarDateOver");
    							cCalendar.setElementDate(cCalendar.date);
    						},
    						"click" : function () {
    							cCalendar.pickDate(getJSDate(this.id.split("_")[1]));
    							cCalendar.hide();
    						}
                        }
    				}).set("html", "Today");
    			},
    			"clean" : function () {
                    $(this.layerId).empty();
                },
    			"display" : function () {
    				if (!$(this.layerId)) {
    					var newNode = new Element("div", {
                            "id" : this.layerId,
    						"class" : "cCalendar",
    						"events" : {
                                "mousedown" : function (e) {
	                                try {
	                                	var evt = new Event(e);
	                                	evt.stop();
	                                } catch (ex){}
								}
                            }
    					}).inject(document.body);
    				} else {
    				   this.clean();
    				}

    				$(this.layerId).adopt(this.yearBar, this.monthBar, this.content, this.todayBar);

    				var x = $(this.elementId).offsetLeft;
        			var y = $(this.elementId).offsetTop + $(this.elementId).offsetHeight + 2;

        			var parent = $(this.elementId);
        			while (parent.offsetParent) {
            			parent = parent.offsetParent;
            			x += parent.offsetLeft;
            			y += parent.offsetTop;
        			}

    				$(this.layerId).setStyles( {
                        "position" : "absolute",
    					"visibility" : "visible",
    					"display" : "block",
    					"z-index" : 10000,
    					"left" : x + "px",
    					"top" : y + "px",
    					"width" : "132px",
    					"padding" : "2px 2px 2px 2px"
    				});

					// IE6 fix, needed to display over the select elements
    				if (!$(this.iFrameId)) {
    					var newNode = new Element("iFrame", {
        					"id" : this.iFrameId,
        					"src" : "about:blank",
        					"scrolling" : "no",
        					"frameborder" : "0"
    					}).inject(document.body);
    				}

    				$(this.iFrameId).setStyles( {
                        "position" : "absolute",
    					"width" : $(this.layerId).offsetWidth + "px",
    					"height" : $(this.layerId).offsetHeight + "px",
    					"top" : $(this.layerId).getStyle("top"),
    					"left" : $(this.layerId).getStyle("left"),
    					"z-index" : parseInt($(this.layerId).getStyle("z-index")) - 1,
    					"visibility" : $(this.layerId).getStyle("visibility"),
    					"display" : $(this.layerId).getStyle("display")
    				});
    			},
    			"hide" : function () {
    				$(this.layerId).setStyles( {
                        "visibility" : "hidden",
    					"display" : "none"
    				});

    				$(this.iFrameId).setStyles( {
                        "visibility" : $(this.layerId).getStyle("visibility"),
    					"display" : $(this.layerId).getStyle("display")
    				});
    			},
    			"getCursorPos" : function (el) {
					el.focus(); // for IE
					 if (el.selectionStart) {
					 	return el.selectionStart;
					} else {
						if (!document.selection) {return 0;}
					}
					var c = "\001";
					var sel	= document.selection.createRange();
					var dup	= sel.duplicate();
					var len	= 0;
					dup.moveToElementText(el);
					sel.text = c;
					len	 = (dup.text.indexOf(c));
					sel.moveStart("character", -1);
					sel.text = "";
					return len;
				},
				"setSelection" : function setSelectionRange(el, selectionStart, selectionEnd) {
					if (el.createTextRange) {
						var range = el.createTextRange();
						range.collapse(true);
						range.moveEnd('character', selectionEnd);
						range.moveStart('character', selectionStart);
						range.select();
					}
					else if (el.setSelectionRange) {
						el.focus();
						el.setSelectionRange(selectionStart, selectionEnd);
					}
				}
    		};

			cCalendar.setElementTitle();
			new Element("img", {
				"src" : "/images/icons/calendar.png",
				"class" : "cCalendarIcon",
				"title" : "Pick a date",
				"alt" : "Pick a date",
				events : {
                    "click" : function () {
                        if (!cCalendar.isDisplayed()) {
		    				$(cCalendar.elementId).focus();
			    		}
                    }
                }
			}).inject($(cCalendar.elementId), "after");

			$(cCalendar.elementId).addEvent("focus", function() {
				if (!cCalendar.isDisplayed()) {
					setTimeout(function () {
						var theDate = cCalendar.getElementDate();
						cCalendar.setDate((theDate == null) ? new Date() : theDate);
						cCalendar.build();
						if (!cCalendar.isDisplayed()) {
							cCalendar.display();
						}
					}, 150);
	    		}
    		});

    		$(cCalendar.elementId).addEvent("blur", function() {
				(function(){
					if (cCalendar.isDisplayed()) {
						cCalendar.hide();
					}
				}).delay(150);
    		});

    		$(cCalendar.elementId).addEvent("click", function() {
	    		if (!cCalendar.isDisplayed()) {
    				$(cCalendar.elementId).blur();
	    			$(cCalendar.elementId).focus();
	    		} else {
	    			cCalendar.hide();
	    		}
    		});

    		$(cCalendar.elementId).addEvent("keydown", function(e) {
    			var v = this.getProperty("value");
    			e = new Event(e);

        		if (e.code >= 48 && e.code <= 57) {
    				e.stop();
    				var curPos = cCalendar.getCursorPos(this);
    				this.value = this.value.substring(0, curPos) + "" + (e.code - 48) + this.value.substring(curPos, this.value.length);
    				cCalendar.setSelection(this, curPos + 1, curPos + 1);
    				return;
        		}

    			if (e.code == 13) {
    				if (cCalendar.isDisplayed()) {
    					e.stop();
    					cCalendar.hide();
    				}
    				return;
                }

    			if (e.code == 191 || e.code == 111) {
    				e.key = "/";
    			}

    			// To be improved, waiting for mootools fix for key handling
				/*if (e.code == 191) { // If "?", stop the event
    				if (e.key == "�" && e.shift) {
    					e.stop();
    					return;
    				}
    				e.key = "/";
    			}

    			if (e.code == 111) {
                    e.key = "/";
                }*/

    			if (e.code >= 96 && e.code <= 105) {
    				e.key = "" + (e.code - 96);
        		}
        		if ((e.key != "left" && e.key != "right" && e.key != "up" && e.key != "down" && e.key != "backspace" && e.key != "delete" && e.key != "tab" && e.code != 35 && e.code != 36 && e.key != "/") && (isNaN(parseInt(e.key)))) {
        			e.stop();
        			return;
        		} else {
        			switch (e.key) {
    					case "up" :
    					case "down" :
            				if (e.key == "down") {
            					if (cCalendar.getElementDate().getDate() > 0) {
            						this.value = getFormatedDate(new Date(cCalendar.getElementDate().getFullYear(), cCalendar.getElementDate().getMonth(), cCalendar.getElementDate().getDate() - 1));
            						cCalendar.setDate(new Date(cCalendar.getElementDate().getFullYear(), cCalendar.getElementDate().getMonth(), cCalendar.getElementDate().getDate() - 1));
    								cCalendar.build();
    								cCalendar.display();
            					} else {
            						e.stop();
            					}
            				} else {
            					this.value = getFormatedDate(new Date(cCalendar.getElementDate().getFullYear(), cCalendar.getElementDate().getMonth(), cCalendar.getElementDate().getDate() + 1));
           						cCalendar.setDate(new Date(cCalendar.getElementDate().getFullYear(), cCalendar.getElementDate().getMonth(), cCalendar.getElementDate().getDate() + 1));
    							cCalendar.build();
    							cCalendar.display();
            				}
            				setTimeout(function () { $(cCalendar.elementId).select(); }, 10);
    						break;
           			}
        		}
    		});

    		/*
    		document.addEvent("mousedown", function (e) {
    			try {

    				setTimeout(function () {
    					if (cCalendar != null && cCalendar.isDisplayed()) {
    						print_r("Document Mousedown: hide from " + $(cCalendar.elementId).id);
    						cCalendar.hide();
    					}
    				}, 200);
    			}
    			catch (ex) { print_r(ex); }
    		});*/

    		function getJSDate(formatedDate)
    		{
        		if (formatedDate == "") {
        			return false;
        		}
    			var dateAr = formatedDate.split("/");
        		var d = Number(dateAr[1]);
        		var m = Number(dateAr[0]);
        		var y = Number(dateAr[2]);

        		if (isNaN(y) || isNaN(m) || isNaN(d)) {
        			return false;
        		}
				if (parseInt(y) < 1900 || (m <= 0 || m > 12) || (d <= 0 || d > 31)) {
					return false;
				}

				var d = new Date(y, m - 1, d);

				if (d != "Invalid Date") {
					return d;
				} else {
        			return false;
        		}
        	}

        	function getFormatedDate(JSDate)
        	{
				return (JSDate.getMonth() + 1) + "/" + JSDate.getDate() + "/" + JSDate.getFullYear();
        		//return JSDate.format("m/d/Y");
        	}

        	function changeDay(elementID, theNumberOfDays)
        	{
    			var theDate = getJSDate($(elementID).getProperty("value"));
    			theDate.setDate(theDate.getDate() + theNumberOfDays);
    			$(elementID).value = getFormatedDate(theDate);
        	}
    	}

		var elementArray = (container) ? container.getElements("input.date") : $$("input.date");
		elementArray.each ( function ( el ) {
			el.removeClass("date");
			enableCalendar(el.getProperty("id"));
        });
    };

	var setupNewBar = function () {
		if ($("createNew")) {
			$("createNew").addEvent("click", function() {
				if ($("newBarOptions").getStyle("display") == "none") {
					$("newBarOptions").setStyles( { display : "block", visibility : "visible" } );
				} else {
					$("newBarOptions").setStyles( { display : "none", visibility : "hidden" } );
				}
			});
		}
	};

	var setupAutoComplete = function (elID, options) {
		if (!isset("AutoComplete")) {
			loadJS( { file : "/core/js/autocomplete.class.js" } );
		}

		function waitLoading(elID, options) {
			if (isset("AutoComplete")) {
				var ac = new AutoComplete($(elID), options);
			} else {
				setTimeout(function () {
					waitLoading(elID, options);
				}, 10);
			}
		}

		waitLoading(elID, options);
	};

	// store this function (referencing these private functions) in the global scope
	setupAll = function ( container, options ) {
		setupExpandableTextFields();
		setupDatePicker();
		setupNewBar();
	}

	// and schedule it to be run when the page is ready
	window.addEvent ( "domready", setupAll );

	return {
		setupExpandableTextFields : setupExpandableTextFields,
		setupDatePicker : setupDatePicker,
		setupNewBar : setupNewBar,
		setupAutoComplete : setupAutoComplete,
		setupAll : setupAll
	}

} )();

var loadJS = function(src, el){
    if (src["file"]) {
        var script = new Element("script", { type: "text/javascript", language: "javascript", src: src["file"] });
        if (el) {
            script.inject(el, "after");
        } else {
            script.inject(document.head);
        }
    }
    if (src["code"]) {
        try {
            eval(src["code"]);
        } catch (e) {
            print_r(e);
        }
    }
};

var CSSAPI =  ( function () {
	var loadedCSS = {};
	var loadCSS = function(src) {
		if (!loadCSS[src]) {
			new Element("link", {
		    	"rel" : "stylesheet",
		    	"type" : "text/css",
		    	"href" : src
		    }).inject(document.head);
			loadCSS[src] = src;
	    }
	};

	return { loadCSS : loadCSS };
}) ();

var loadCSS = CSSAPI.loadCSS;

var getTypeDescription = function(type){
    var retValue = "";
    switch (type) {
        case "Phone":
            retValue = "";
            break;
        case "SSNOrEIN":
            retValue = "SSNOrEIN type fields must be 9 digits to 10 digits in length";
            break;
        case "Email":
            retValue = "";
            break;
    }
    return retValue;
};

var stripNondigits = function(value){
    var retVal = "";
    var i;
    for (i = 0; i < value.length; i++) {
        var tmp = value.charAt(i);
        if (tmp >= "0" && "9" >= tmp) {
            retVal += tmp;
        }
    }
    return retVal;
};

setupCharCounter = function(id, maxLength, cntID){
    var obj = $(id);
    var cnt = obj.get("text").length;
    var border = obj.getStyle("border");
    var cntObj = (cntID) ? $(cntID) : null;
    var color = cntObj ? cntObj.getStyle("color") : "";
    var labelObj = $(id + "_label");
    var labelColor = (labelObj) ? labelObj.getStyle("color") : "";
    var updateCount = function(){
        var diff = obj.value.length - maxLength;
        if (diff < 0) {
            obj.setStyle("border", border);
            if (labelObj) {
                labelObj.setStyle("color", labelColor);
            }
        }
        else {
            obj.setStyle("border", "1px solid red");
            obj.value = obj.value.substr(0, maxLength);
            if (labelObj) {
                labelObj.setStyle("color", "red");
            }
        }

        if (cntObj) {
            if (diff < 0) {
                cntObj.setStyle("color", color);
                cntObj.set("html", -1 * diff);
            }
            else {
                cntObj.setStyle("color", "red");
                cntObj.value = 0;
                cntObj.set("html", "0 Number of characters is at or larger than capacity");
            }
        }
    }
    updateCount();
    obj.updateCharCount = updateCount;
    obj.addEvent("keyup", function(e){
        updateCount();
    });
    obj.addEvent("keydown", function(e){
        updateCount();
    });
    obj.removeEvent("change");
    obj.addEvent("change", function(e){
        updateCount();
    });
};

function addInputFields (containerID, numFields)
{
	if (!containerID) {return;}
	new Element('div', {id: "topDiv"}).addClass("floatWrapper").setStyles('padding-left: 100px;').inject($(containerID), "after");
	new Element('div', {id: "searchFields"}).addClass("floatLeft").inject($('topDiv'));
	new Element('div', {id: "innerKeywords"}).addClass("floatWrapper floatLeft keywords").inject($('topDiv'));

	for (i=0; i<numFields; i++) {
		new Element('div', {id: "keywordWrapper"+i}).addClass("floatLeft").setStyles('padding-right: 10px;').inject($("innerKeywords"));
		new Element('input', {name: "filterKeyword", value: "", type: "text", id: "keywordField"}).inject($("keywordWrapper"+i));
	}
	new Element('div', {id: "imageWrapper"}).addClass("floatLeft").inject($('topDiv'));
	new Element('img', {src: "/images/minus_icon_small.gif", alt: "remove"}).addClass("clickable").addEvent('click', function(){this.getParent().getParent().dispose();}).inject($("imageWrapper"));
}

function getKeywords ()
{
	var keywrodArray = [];
	var i=0;
	$$('input[name=filterKeyword]', 'searchFields').each(function (field) {
		 if (field.value) {
		 	keywrodArray[i] = field.value;
		 	++i;
		 }
	});
	return keywrodArray.join(',');
}

//equivilant to htmlentities with ENT_QUOTES
function cleanHTML(string) {
    var div = document.createElement('div');
    var text = document.createTextNode(string);
    div.appendChild(text);
    return div.innerHTML;
}

//this function handels the selection of all the checkboxes in one click
function allstate (o, state) {
	if (o) {
		if (o.length) {
			for (var i = 0; i < o.length; i++) {
				o[i].checked = state;
			}
		} else {
			o.checked = state;
		}
	}
}

//this function shows the popup that explains the reason why we can't contact and advisor
//used in advisor search in requests see AdvisorSearch::getSearchResultsBlock()
function showDNCBox (el, event) {
	var advisorInfo = el.id.split('_');
	Popups.showMsg(el, event, '/requests/buildDNCMsgBox', {ID: advisorInfo[1], Data: {ID: advisorInfo[1]}, event: event});
}

function setActiveClient(clientID)
{
	var data = {"clientID": clientID};
	var options = {
		method: 'post',
		encoding: 'utf-8',
		onComplete: function(response){
			if (response.html == 1) {
				document.location = document.location.href;
			}
			else {
				alert('An error occurred.');
			}
		}
	};
	API.request('/clients/setactiveclient', data, options);
}

function makeFavorite(id, advId, personId)
{
	var data = {"AdvisorID":advId, "PersonID":personId};
	var el = $(id);
	EFX.showOverlay(el);
	//var favoriteStatus = el.getProperty("favoriteStatus");

	var toolTipText = $(el.id + "_ToolTipWrappper").getElement(".toolTipMiddle");
	toolTipText.set("text", "Updating advisor...");

		var options = {
			method: 'post',
			encoding: 'utf-8',
			onComplete: function(response){
				if (el.hasClass('star')) {
					el.src = '/core/images/unstar.gif';
					//el.setProperty("favoriteStatus", "unstar");
					el.removeClass('star')
					el.addClass('unstar');
				} else {
					el.src = '/core/images/star.gif';
					//el.setProperty("favoriteStatus", "star");
					el.removeClass('unstar')
					el.addClass('star');
				}
				EFX.hideOverlay(el);
			}
		};
		if (el.hasClass('star')) {
			API.request('/advisornetwork/unmakefavorite', data, options);
		} else {
			API.request('/advisornetwork/makefavorite', data, options);
		}

		(function(){
			var nexTipText = favoriteToolTip(el, true);
			toolTipText.set("text", nexTipText);
		}).delay(1200);
}

function favoriteToolTip(el, returnJustText) {
	var el = $(el.id); // ie hack
	if (el.hasClass('star')) {
		if (returnJustText) {
			return 'Click to remove favorite';
		} else {
			ToolTipAPI.showToolTip(el, 'Click to remove favorite', 63);
		}
	} else {
		if (returnJustText) {
			return 'Click to make favorite';
		} else {
			ToolTipAPI.showToolTip(el, 'Click to make favorite', 63);
		}
	}
}

function addTag(advId, tagName)
{
	if (tagName == "") {
		alert("Group Name is empty.");
		return false;
	}
	
	var data = {"AdvisorID":advId, "TagName":tagName};
	var tagListDiv = $('tagListDiv'+advId);
	EFX.showOverlay(tagListDiv);
	var options = {
		method: 'post',
		encoding: 'utf-8',
		onComplete: function(response){
			
			eval(response["js"]); // tag id
			
			// create new tag div
			var newTagDiv = new Element('div', {
				'class': 'floatWrapper tagOptionLink txtAlignLeft paddingRightMini whiteSpaceNoWrap',
				'id': 'tagAssignedDiv' + advId + '-' + tagId
			});
			var tagInput = new Element('input', {
				'class': 'tagChkBox' + advId,
				'type': 'hidden',
				'value': tagId,
				'id': 'grouplistitem'+advId+"-"+tagId,
				'name': 'TagListAssigned[]'
			});
			var chkImg = new Element('img', {
				'src': '/images/icons/icon_check_qualified.gif',
				'class': 'floatLeft',
				'events': {
					'mouseover': function(){
						this.src = '/images/icons/icon_x_qualified.gif';
					},
					'mouseout': function(){
						this.src = '/images/icons/icon_check_qualified.gif';
					},
					'click': function(){
						removeTag(advId, tagId);
					}
				}
			});
			var tagDetailsDiv = new Element('div', {
				'class': 'floatLeft',
				'style': 'margin-bottom: 1px;'
			});

			if($('noTags'+advId))
			{
				$('noTags'+advId).dispose();
			}

			tagDetailsDiv.set("html", response.html);
			newTagDiv.adopt(tagInput, chkImg, tagDetailsDiv);

			assignedTagList = $('assignedTagList'+advId);
			newTagDiv.inject(assignedTagList, 'top');
			var tagOptMenu = $("TagOptionMenu_" + advId);


			if($('assignedTagListPage'+advId)){
				var assignedTagListPage = $('assignedTagListPage'+advId);
			}
			else{
				var assignedTagListPage = new Element('span', {
					'id': 'assignedTagListPage'+advId
				});

				var myGrpTitle = new Element('span', {
					'html': 'My Groups:',
					'class': 'popupProfileJobTitle'
				});
				var brk = new Element('br');
				var innerTagDiv = new Element('div');
				innerTagDiv.adopt(myGrpTitle, assignedTagListPage);

				//var tagListDiv = $('tagListDiv'+advId);
				tagListDiv.adopt(innerTagDiv, brk);
			}
			var taglistHtml = assignedTagListPage.get('html');
			if(taglistHtml)
			{
				assignedTagListPage.set('html', taglistHtml + ', ' + '<a href="/advisornetwork/search?advancedSearch=1&TagList[]=' + tagId + '">' + response.html + '</a>');
			}
			else
			{
				assignedTagListPage.set('html', '<a href="/advisornetwork/search?advancedSearch=1&TagList[]=' + tagId + '">' + response.html + '</a>');
			}

			// cleanup
			$("inpAddTag"+advId).set('value', '');
			var sb = new Fx.Scroll(tagOptMenu, { wait : false } );
			sb.toElement(assignedTagList);
			EFX.hideOverlay(tagListDiv);
		}
	}

	API.request('/advisornetwork/addTag', data, options);
}

function removeTag(advId, tagId)
{
	var confirmed = confirm('Are you sure you want to remove this advisor from this group?');

	if (confirmed) {
		var tagListDiv = $('tagListDiv'+advId);
		EFX.showOverlay(tagListDiv);
		var data = {
			"AdvisorID": advId,
			"TagID": tagId
		};

		var options = {
			method: 'post',
			encoding: 'utf-8',
			onComplete: function(response){
				$("tagAssignedDiv" + advId + "-" + tagId).dispose();

				var assignedTagListPage = $('assignedTagListPage' + advId);
				assignedTagListPage.set('html', response.html);
				EFX.hideOverlay(tagListDiv);
			}
		};

		API.request('/advisornetwork/removeTag', data, options);
	}
}

function assignTag(advId, tagId)
{
	var data = {"AdvisorID":advId, "TagID":tagId};
	var tagListDiv = $('tagListDiv'+advId);
	EFX.showOverlay(tagListDiv);

	var options = {
		method: 'post',
		encoding: 'utf-8',
		onComplete: function(response){
			// create new tag div
			var newTagDiv = new Element('div', {
				'class': 'floatWrapper tagOptionLink txtAlignLeft paddingRightMini whiteSpaceNoWrap',
				'id': 'tagAssignedDiv' + advId + '-' + tagId
			});
			var tagInput = new Element('input', {
				'class': 'tagChkBox' + advId,
				'type': 'hidden',
				'value': tagId,
				'id': 'grouplistitem'+advId+"-"+tagId,
				'name': 'TagListAssigned[]'
			});
			var chkImg = new Element('img', {
				'src': '/images/icons/icon_check_qualified.gif',
				'class': 'floatLeft',
				'events': {
					'mouseover': function(){
						this.src = '/images/icons/icon_x_qualified.gif';
					},
					'mouseout': function(){
						this.src = '/images/icons/icon_check_qualified.gif';
					},
					'click': function(){
						removeTag(advId, tagId);
					}
				}
			});
			var tagDetailsDiv = new Element('div', {
				'class': 'floatLeft',
				'style': 'margin-bottom: 1px;'
			});

			if($('noTags'+advId))
			{
				$('noTags'+advId).dispose();
			}

			tagDetailsDiv.set("html", response.html);
			newTagDiv.adopt(tagInput, chkImg, tagDetailsDiv);

			assignedTagList = $('assignedTagList'+advId);
			newTagDiv.inject(assignedTagList, 'top');

			if($('assignedTagListPage'+advId)){
				var assignedTagListPage = $('assignedTagListPage'+advId);
			}
			else{
				var assignedTagListPage = new Element('span', {
					'id': 'assignedTagListPage'+advId
				});

				var myGrpTitle = new Element('span', {
					'html': 'My Groups:',
					'class': 'popupProfileJobTitle'
				});
				var brk = new Element('br');
				var innerTagDiv = new Element('div');
				innerTagDiv.adopt(myGrpTitle, assignedTagListPage);

				//var tagListDiv = $('tagListDiv'+advId);
				tagListDiv.adopt(innerTagDiv, brk);
			}

			var taglistHtml = assignedTagListPage.get('html');
			if(taglistHtml)
			{
				assignedTagListPage.set('html', taglistHtml + ', ' + '<a href="/advisornetwork/search?advancedSearch=1&TagList[]=' + tagId + '">' + response.html + '</a>');
			}
			else
			{
				assignedTagListPage.set('html', '<a href="/advisornetwork/search?advancedSearch=1&TagList[]=' + tagId + '">' + response.html + '</a>');
			}

			var tagOptMenu = $("TagOptionMenu_" + advId);
			// cleanup
			$("tagChkDiv-"+advId+"-"+tagId).dispose();
			var sb = new Fx.Scroll(tagOptMenu, { wait : false } );
			sb.toElement(assignedTagList);
			EFX.hideOverlay(tagListDiv);
			//(tagOptMenu.set('html', '<p>Groups updated</p>')).delay(1000);
			(function(){
				closeGroupsOptionMenu(advId)
			}).delay(3000);
		}
	}

	API.request('/advisornetwork/assignTag', data, options);
}

/**
 * Creates option menu for groups (tag) management
 *
 * @author Michael Simmons <msimmons@guidepointglobal.com>
 * @param {Object} el - Element that has the event that invokes this function
 * @param {Integer} advisorID - ID of advisor
 */
var showGroupsOptionMenu = function(el, advisorID) {
	var advMenu = $("TagOptionMenuWrapper_" + advisorID)
        ,optionImg = $("TagMenu_" + advisorID)
        ,listOptions = [];

	$$(".tagMenuWrapper").addClass("hidden");

    if (advMenu) {
        advMenu.removeClass("hidden");
    } else {
        var coords = $(el.id).getCoordinates()
		    ,data = {"AdvisorID": advisorID}
		    ,options = {
    			method: "post",
    			encoding: "utf-8",
    			onComplete: function(response) {
    		        var menuWrapper = new Element("div", {
    		            id: "TagOptionMenuWrapper_" + advisorID, "class": "tagMenuWrapper", isOverPopup: "N"
    		            ,styles: {  height:"287px", width:"222px", position: "absolute", top: parseInt(coords.top) + 1, left: parseInt(coords.right), zIndex: 1 }
    		        });

                    var menu = new Element("div", {
                        id: "TagOptionMenu_" + advisorID, "class": "tagOptionMenu"
                        ,styles: { background: "#ffffff", width: "218px", height: "287px", padding: "0px", border: "solid 2px #668db3", overflow: "hidden", textAlign: "left", zIndex: 2 }
    	                ,events: {
                            onclick: function() {
                                menuWrapper.setProperty("isOverPopup", "Y");
                                showGroupsOptionMenu(el, advisorID);
                            }
    	                    //,mouseleave: function() {
                            //    menuWrapper.setProperty("isOverPopup", "N");
                            //    hideGroupsOptionMenu(advisorID);
                            //}
    	                }
    	            }).set("html", response.html);

					Popups.ieZIndexHack(menuWrapper, menu);
                    menuWrapper.adopt(menu).inject(document.body);

    		        Popups.dropShadow(menu);
    			}
    		};
		API.request('/clients/gettagmenu', data, options);
    }
}

function rmAdvisorFromCreateRequest()
{
	$('selectedAdvisorDiv').dispose();
	return false;
}

/**
 *  Hides option menu for groups (tag) management
 *
 * @author Michael Simmons <msimmons@guidepointglobal.com>
 * @param {Integer} advisorID - ID of advisor
 */
var hideGroupsOptionMenu = function(advisorID) {
    var menu = $("TagOptionMenuWrapper_" + advisorID);
    ( function() {
        if (menu && menu.getProperty("isOverPopup") == "N") {
            menu.addClass("hidden");
        }
    }).delay(200);
}

var closeGroupsOptionMenu = function(advisorID) {
    var menu = $("TagOptionMenuWrapper_" + advisorID);
    menu.addClass("hidden");
}

/**
 * Hides all item associated with Advisor Option Menu
 *
 * @author Michael Simmons <msimmons@guidepointglobal.com>
 * @param {Integer} advisorID - ID of advisor
 */
var hideAllTagOptionMenuItems = function(advisorID) {
    var optionMenuImg = $("TagMenu_" + advisorID);
	//if (optionMenuImg.getProperty("rowHovered") != "Y") optionMenuImg.addClass("displayNone");
    $("TagOptionMenuWrapper_" + advisorID).addClass("displayNone");
}

/**
 * changes the tag list
 */
function onchangeTagList()
{
	dropdown = $('TagListDD');
	var myindex  = dropdown.selectedIndex;
	var SelValue = dropdown.options[myindex].value;
	var baseURL  = '/advisornetwork/groups/' + SelValue;
	top.location.href = baseURL;
}

/**
 * edit the group
 * @param {Object} groupId
 */
function editGroupAction(groupId)
{
	EFX.showOverlay($('editControlsDiv'));
	var newGroupName = $('NewTagName').value;
	var confirmed = confirm('Are you sure you want to edit the name of this group to: ' + newGroupName);

	if(confirmed)
	{
		var data = {"OldTagID":groupId, "NewTagName":newGroupName};
		var options = {
			method: 'post',
			encoding: 'utf-8',
			onComplete: function(response){
				alert('Group has been renamed');
				EFX.hideOverlay($('editControlsDiv'));
				window.location = '/advisornetwork/groups/'+response.html;
				//alert('/advisornetwork/groups/'+response.html);
			}
		}

		API.request('/advisornetwork/editTag', data, options);
	}
}

/**
 * delete the group
 * @param {Object} groupId
 */
function deleteGroupAction(groupId)
{
	var confirmed = confirm('Are you sure you want to remove this group?');

	if(confirmed)
	{
		EFX.showOverlay($('editControlsDiv'));
		var data = {"TagID":groupId};
		var options = {
			method: 'post',
			encoding: 'utf-8',
			onComplete: function(response){
				alert('Group has been deleted');
				EFX.hideOverlay($('editControlsDiv'));
				window.location = '/advisornetwork/groupslist';
			}
		}

		API.request('/advisornetwork/deleteTag', data, options);
	}
}

function saveNote ()
{
	EFX.showOverlay($("editNoteDiv"));
	EFX.showOverlay($("showNoteDiv"));
	var noteVal = $("Note").value;

	if (!noteVal) {
		alert("Please type a note before saving.");
		EFX.hideOverlay($("editNoteDiv"));
		EFX.hideOverlay($("showNoteDiv"));
		return;
	}

	var data = {
		ID: $("NoteID").value,
		Note: noteVal,
		ObjectID: $("ObjectID").value,
		ObjectName: $("ObjectName").value,
		RelatedObjectName: $("RelatedObjectName").value,
		RelatedObjectID: $("RelatedObjectID").value
	};

	var options = {
		onComplete: function(response){
			
			if (response === false) {
				noteFailedToSave();
			} else {
				noteSavedCallback();
			}

			EFX.hideOverlay($("editNoteDiv"));
			EFX.hideOverlay($("showNoteDiv"));
		}
	};

	API.request("/notes/save", data, options);
}

function noteFailedToSave() {
	alert("Note failed to save.");
	EFX.hideOverlay($('editNoteDiv'));
	EFX.hideOverlay($('showNoteDiv'));
}

function noteSavedCallback() {
	
	print_r("in call back");
	var data = {
		ID: $("NoteID").value,
		ObjectName: $("ObjectName").value,
		ObjectID: $("ObjectID").value,
		RelatedObjectName: $("RelatedObjectName").value,
		RelatedObjectID: $("RelatedObjectID").value
	};
	
	var options = {
		onComplete: function(resp){
			
			print_r("in call back on complete");
			print_r(resp);
			
			if (resp && resp["html"] && $("notesFormWrapper")) {
				$("notesFormWrapper").set("html", resp["html"]);
			}
		}
	};

	API.request('/notes/buildNoteBlock', data, options);
}

function swapSearchType(anchor) {
	var advanceDiv = $("advancedDiv");
	var basicDiv = $("basicDiv");
	
	if (advanceDiv.hasClass("hidden")) {
		// Basic is expanded
		advanceDiv.removeClass("hidden");
		basicDiv.addClass("hidden");
		anchor.innerHTML = "Basic Search &gt;&gt;";
	} else {
		// Advanced is expanded
		advanceDiv.addClass("hidden");
		basicDiv.removeClass("hidden");
		anchor.innerHTML = "Advanced Search &gt;&gt;";
	}
}

function closeRequest(req_id)
{
	if (confirm('Your Project Manager will be notified of this change. Are you sure you want to close this Request?')) {
		//EFX.showOverlay($('requestDetailsTable'));
		var data = {};

		var options = {
			method: 'post',
			encoding: 'utf-8',
			onComplete: function(response){
				//EFX.hideOverlay($('requestDetailsTable'));
				window.location.reload();
			}
		};

		API.request('/requests/close/'+req_id, data, options);
	}
}

function submitRating(advID){
	var rating = 0;
	for(var i = 0; i < document.rateAdvisor.rating.length; i++ )
	{
		if (document.rateAdvisor.rating[i].checked == true) {
			rating = document.rateAdvisor.rating[i].value;
			break;
		}
	}

	var data = {
		AdvisorID: advID,
		Rating: rating
	};

	var options = {
		method: 'post',
		encoding: 'utf-8',
		onComplete: function(response){
			var msgStat = $('messageStatus');
			msgStat.set('html', 'Rating saved');
			msgStat.removeClass('hidden');
			(function(){msgStat.addClass('hidden')}).delay(3000);
			(function(){$('ratingDiv').addClass('displayNone')}).delay(3000);
		}
	};

	API.request('/advisornetwork/rating/', data, options);
}

function requestEvent(){
	EFX.showOverlay($('eventRequestFormDiv'));
	var data = {
		eventTitle: $('eventTitle').get('value'),
		StartDate: $('StartDate').get('value'),
		//EndDate: $('EndDate').get('value'),
		eventLocation: $('eventLocation').get('value'),
		eventDetails: $('eventDetails').get('value')
	};

	var options = {
		method: 'post',
		encoding: 'utf-8',
		onComplete: function(response){
			EFX.hideOverlay($('eventRequestFormDiv'));
			var msgStat = $('messageStatus');
			msgStat.set('html', 'An email has been sent to the Events Coordinator');
			msgStat.removeClass('hidden');
			(function(){msgStat.addClass('hidden')}).delay(3000);
		}
	};

	API.request('/events/createEvent/', data, options);
}

function accSwap(clt_id){
		var data = {};

		var options = {
			method: 'post',
			encoding: 'utf-8',
			onComplete: function(response){
				//EFX.hideOverlay($('requestDetailsTable'));
				window.location.reload();
			}
		};

		API.request('/clients/setaccount/'+clt_id, data, options);
}
