var DataFilter = new Class(
{
	hiddenFrameUrl: "history.cfm",
	allOrPaged: "page",
	profile: false,
	profileData: { },
	profileStart: function(request) 
	{
		this.profileData[request] = new Array();
		this.profileData[request].push(new Date().getTime());
	},
	
	profileStop: function(request)
	{
		this.profileData[request] = this.profileData[request] ? this.profileData[request] : new Array();
		this.profileData[request].push(new Date().getTime());
	},
	
	profileResults: function()
	{
		var results = "";
		for(x in this.profileData)
		{
			if(x && this.profileData[x][0] && this.profileData[x][1])
			{
				results += (x + " = " + (this.profileData[x][1] - this.profileData[x][0]) + "\n");
			}
		}
		
		return results;
	},
	
	initialize: function(configuration)
	{
		this.config = configuration;
		this.pageStart = 1;
		this.pageSize = this.config.pageSize;
		this.spinner = new Spinner();
		
		if(typeof dump == "undefined") { window.dump = function() { }; }
		
		// request initialization data
		var request = { method: "get", onComplete: this.initializeDone.bind(this) };
		var ajax = new Ajax(this.config.initService, request);
		this.spinner.wait();
		
		this.profileStart("Init Request");
		ajax.request();
		
		// compensate links for frameset
		$$("a").each(function(a){ a.target = "_parent"; });
		
		// fix print stylesheets
		this.fixPrintStylesheets();
	},
	
	initializeDone: function(text, xml)
	{		
		this.profileStop("Init Request");
		var response = null;
		try { response = Json.evaluate(text); } catch(e) { }
		if(!response || response.error)
		{		
			alert("An error occurred loading this page.");
		}
		else
		{
			this.profileStart("Build Init Elements");
			this.initData = response;
			this.buildFilters(response.filters);
			this.buildResultsTable(response.results);			
			$("filter").style.display = "block";
			this.profileStop("Build Init Elements");
			
			// activate the control frame (if it is loaded yet)
			window.activate = this.activate.bind(this);
			window.domReady = true;
			window.OGReportHeaders = response.results;
			if(window.parent.frames.control.domReady)
				window.parent.frames.control.historyControl();
		}			
		this.spinner.done();
	},
	
	refresh: function(changeFilters, changeHistory)
	{		
		if(changeFilters)
		{
			this.sortBy = null;
			this.sortOrder = null;
			this.pageStart = 1;
			this.pageSize = this.config.pageSize;
			window.curSortBy = this.initData.defaults.sortColumn;
			window.curSortOrder = this.initData.defaults.sortOrder;
		}
		
		var queryString = this.getFilterState();		
		if(changeHistory)
		{
			this.profileStart("Hidden Frame Transfer");		
			window.open(this.hiddenFrameUrl + "?" + queryString, "control");
		}
		else
		{
			this.activate(queryString);
		}
	},
	
	activate: function(queryString)
	{
		if(!this.initData) { return; }
		this.profileStop("Hidden Frame Transfer");
		this.spinner.wait();
		
		queryString = this.normalizeQueryString(queryString);
		this.activeQueryString = queryString;
		this.setFilterState(queryString);
		
		var request = { method: "get", onComplete: this.activateDone.bind(this) };
		var ajax = new Ajax(this.config.queryService + "?" + queryString, request);		
		this.profileStart("Query Request");
		ajax.request();
	},
	
	activateDone: function(text, xml)
	{
		this.profileStop("Query Request");
		var response = null;
		var printed = false;
		
		if(Cookie.get("showAll") == "yes")
		{
			allOrPaged = "all";
		}
		else
		{
			allOrPaged = "page";
		}
		
		try { response = Json.evaluate(text); } catch(e) { }
		
		if(!response || response.error)
		{		
			alert("An error occurred loading your search results.");
		}
		else
		{	
			if(response.id == this.latestQueryId)
			{		
				if(this.profile) { this.profileStart("Build Results Elements"); }
				
				this.latestResponse = response;
						
				$$("#filter .summary").each(function(element) { element.style.display = "none"; });				
				if(!response.results || response.results.length == 0)
				{
					$$("#filter .overview .none").each(function(element) { element.style.display = "block"; });
				}
				else
				{
					$$("#filter .overview .print_all").each(function(element) { element.style.display = "block"; });
					$$("#filter .overview .print_all_bottom").each(function(element) { element.style.display = "block"; });
				}

				if((response.results && response.results.length > 0 && response.results.length == response.count) || allOrPaged == "all")
				{					
					$$("#filter .overview .all").each(function(element) { element.style.display = "block"; });
					if(response.count > this.config.pageSize)
					{
						$$("#filter .overview .show_paged").each(function(element) { element.style.display = "block"; });
						$$("#filter .overview .show_paged_bottom").each(function(element) { element.style.display = "block"; });
					}
				}
				else if(response.results && response.results.length > 0)
				{
					var pageStart = this.pageStart;
					var end = (this.pageStart + response.results.length) - 1;
					var total = response.count;
					
					$$("#filter .overview .paged").each(function(element) { element.style.display = "block"; });
					$$("#filter .overview .start").each(function(element) { element.setHTML(pageStart); });
					$$("#filter .overview .end").each(function(element) { element.setHTML(end); });
					$$("#filter .overview .total").each(function(element) { element.setHTML(total); });
					$$("#filter .overview .show_all").each(function(element) { element.style.display = "block"; });
					$$("#filter .overview .show_all_bottom").each(function(element) { element.style.display = "block"; });
					$$("#filter .overview .pagination").each(function(element) { element.style.display = "block"; });
					
					// pagination
					var pagination = $E("#filter .pagination");
					var previous = pagination.getElement(".previous_page");
					var next = pagination.getElement(".next_page");
					var pages = pagination.getElement(".pages");					
					var current = Math.floor(this.pageStart / this.pageSize) + 1;

					// 'previous' button
					previous.onclick = this.showPage.bind(this).pass(current - 1);
					previous.style.display = (current != 1) ? "inline" : "none";					
					
					pages.setHTML("");					
					for(var i=1;((i-1)*this.pageSize)<response.count;i++)
					{
						var page = $(document.createElement(current == i ? "span" : "a"));
						page.href = "javascript:void(0);";
						page.onclick = this.showPage.bind(this).pass(i);	
						if(i != 1)
						{
							var divider = $(document.createElement("span"));
							divider.setHTML("&nbsp;&nbsp;|&nbsp;&nbsp;");
							pages.appendChild(divider);
						}
						
						page.setHTML(i);
						pages.appendChild(page);
					}
					
					next.onclick = this.showPage.bind(this).pass(current + 1);
					next.style.display = (this.pageStart + this.pageSize <= response.count) ? "inline" : "none";
				}

				this.populateResultsTable(response.results);			
				this.profileStop("Build Results Elements");
				
				// fix page links to support the "back" button
				this.fixPageLinks();
			
				// custom callback
				if(this.config.onSearch)
					this.config.onSearch.bind(this).delay(10);
					
				if(this.printFlag)
				{
					printed = true;
					this.spinner.element.style.display = "none";
					window.print();
				}
			}			
		}
		
		this.spinner.done();
		this.printFlag = false;	
	
		// Make sure the appropriate arrow is indicated on the sort column
		// This fixes a bug in the Filter feature
		$$("#filter .results thead a").each(function(a)
		{
			a.removeClass("sort_asc");
			a.removeClass("sort_desc");
			if(window.curSortBy.indexOf(a.sortBy) == 0) {
				a.addClass("sort_" + window.curSortOrder);
			}
		});			
	},
	
	showAll: function()
	{
		if(this.latestResponse)
		{
			Cookie.set("showAll", "yes");
			this.pageStart = 1;
			this.pageSize = this.latestResponse.count;
			this.refresh(false, false);
		}
	},
	
	showPage: function(page)
	{
		Cookie.set("showAll", "no");
		this.pageStart = ((page - 1) * this.pageSize) + 1;
		this.pageSize = this.config.pageSize;
		this.refresh(false, false);		
	},
	
	printAll: function()
	{
		this.printFlag = true;
		this.showAll();
	},
	
	setFilterState: function(queryString)
	{
		var state = new Object();
		var sets = queryString.split("&");		
		sets.each(function(set) 
		{
			pair = set.split("=");
			if(pair.length > 1)
			{
				state[unescape(pair[0])] = new Object();
				pair[1].split(/%3B|;/).each(function(value) { state[unescape(pair[0])][unescape(value)] = true; });
			}
		});
		
		// set checkboxes
		$$("#filter input.query_box").each(function(box)
		{
			// Condition does not work with encoded chars (replaced below) => box.checked = (state[box.parentNode.fieldValue] && state[box.parentNode.fieldValue][box.parentNode.queryValue] == true);
			if(state[box.parentNode.fieldValue] && state[box.parentNode.fieldValue][box.parentNode.queryValue] == true)
			{
				box.checked = true;
			}
			
			box.checkParent();
		});
		
		// set sort fields
		$$("#filter .results thead a").each(function(a)
		{
			a.removeClass("sort_asc");
			a.removeClass("sort_desc");
			if(state.sortBy && state.sortBy[a.sortBy])
			{
				a.addClass("sort_" + 
					((state.sortOrder && state.sortOrder["desc"]) ? "desc" : "asc"));
			}
		});
		
		if(state.pageSize)
		{
			for(size in state.pageSize) { this.pageSize = size.toInt(); }
		}
		
		if(state.pageStart)
		{
			for(start in state.pageStart) { this.pageStart = start.toInt(); }
		}
	},
	
	getFilterState: function()
	{
		var state = new Object();
		
		state.pageStart = this.pageStart;
		state.pageSize = this.pageSize;
		if(this.sortBy && this.sortOrder) 
		{ 
			state.sortBy = this.sortBy; 
			state.sortOrder = this.sortOrder; 
		}
		
		// collect each query checkbox
		$$("#filter input.query_box").each(function(box)
		{
			if(box.checked)
			{
				var field = box.parentNode.fieldValue;
				var value = box.parentNode.queryValue;
				state[field] = state[field] ? (state[field] + ";" + value) : value;
			}
		});
				
		var queryString = Object.toQueryString(state);
		return queryString;
	},
	
	normalizeQueryString: function(queryString)
	{
		queryString = queryString ? queryString : "";
		this.latestQueryId = new Date().getTime();
		var defaults = 
		{
			id:        this.latestQueryId,
			pageStart: "1",
			pageSize:  this.config.pageSize,
			sortBy:    this.initData.defaults.sortColumn,
			sortOrder: this.initData.defaults.sortOrder
		};
		
		for(key in defaults)
		{
			if(queryString.indexOf(key + "=") == -1) 
				queryString += "&" + key + "=" + defaults[key];
		}
		
		// replace any existing id or redirect
		if(queryString.charAt(0) != '&') { queryString = ("&" + queryString); }
		queryString = queryString.replace(/&id=\d+/, ("&id=" + this.latestQueryId));
		if(queryString.charAt(0) != '&') { queryString = queryString.substr(1); }
		
		return queryString;
	},
	
	/**
	 *  uses init-query data to build HTML for the filter boxes
	 *
	 */
	buildFilters: function(filters)
	{
		var container = $E("#filter .filters tr");
		filters.each(function(filter)
		{
			// determine if any of the options have child options
			var hasChildren = false;
			filter.options.each(function(option) { if(option.children && option.children.length > 0) { hasChildren = true; } });
			var td = $(document.createElement("td"));
			td.addClass("filter_" + filter.field.replace(" ", "_"));
			
			// add title
			var title = $(document.createElement("div"));			
			title.addClass("filter_title");
			title.setHTML(filter.title);
			td.appendChild(title);
			
			// separate filter groups
			if(hasChildren)
			{
				td.addClass("multiple");
				filter.options.each(function(option)
				{					
					var group = $(document.createElement("div"));
					var gutter = $(document.createElement("div"));
					var children = $(document.createElement("div"));
					var arrow = $(document.createElement("a"));
					
					group.addClass("filter_group");
					gutter.addClass("gutter");
					children.addClass("children");
					arrow.addClass("filter_arrow");
					arrow.href = "javascript:void(0);";
					
					// open and close functions
					var delay = 100;
					group.open = function() { group.removeClass.bind(group).pass("closed_item").delay(delay); group.addClass.bind(group).pass("open_item").delay(delay); };
					group.close = function() { group.removeClass("open_item"); group.addClass("closed_item"); };
					group.toggle = function() { if(group.hasClass("open_item")) { group.close(); } else { group.open(); } };
					arrow.onclick = function() { group.toggle(); }
															
					// add filter
					var item = $(document.createElement("div"));
					item.queryValue = null;
					item.addClass("filter_item");
					var boxType = (option.children && option.children.length > 0) ? "parent" : "query";
					item.setHTML("<input class=\"" + boxType + "_box\" type=\"checkbox\" /> " + option.title + " (" + option.count + ")");
					gutter.appendChild(item);
					item.appendChild(children);
					group.appendChild(gutter);
					
					// add children
					var parentValue = option.title;
					if(option.children && option.children.length > 0)
					{
						group.appendChild(arrow);
						group.addClass("closed_item");
						option.children.each(function(child)
						{
							var item = $(document.createElement("div"));
							item.queryValue = parentValue + "@" + child.title;
							item.fieldValue = filter.field;
							item.addClass("filter_item");
							item.setHTML("<input class=\"query_box child_box\" type=\"checkbox\" /> " + child.title + " (" + child.count + ")");
							children.appendChild(item);
						});
					}
					else
					{
						item.queryValue = parentValue;
						item.fieldValue = filter.field;
					}					

					td.appendChild(group);
				});
			}
			// combined filter group
			else
			{
				var group = $(document.createElement("div"));				
				var gutter = $(document.createElement("div"));
				group.addClass("filter_group");
				gutter.addClass("gutter");				
				group.appendChild(gutter);
				gutter.setHTML("<table cellpadding=\"0\" cellspacing=\"0\"><tr></tr></table>");
				
				var tr = gutter.getElement("tr");
				var perColumn = Math.ceil(filter.options.length / filter.columns);
				for(var i=0;i<filter.columns;i++)
				{
					var column = $(document.createElement("td"));
					for(var j=0;j<perColumn;j++)					
					{
						var option = filter.options[(i*perColumn)+j];
						if(option)
						{
							var item = $(document.createElement("div"));
							item.addClass("filter_item");
							item.setHTML("<input class=\"query_box\" type=\"checkbox\" /> " + option.title + " (" + option.count + ")");
							item.queryValue = option.title;
							item.fieldValue = filter.field;
							column.appendChild(item);
						}
					}
					tr.appendChild(column);
				}
				
				td.appendChild(group);		
			}
			
			// add the finished column
			td.addClass("column");
			container.appendChild(td);
		});
		
		// add parent-level onClick handler
		$$("input.parent_box").each(function(box)
		{
			box.onclick = function()
			{
				var checked = box.checked;
				$(box.parentNode).getElements("input.child_box").each(function(child)
				{
					child.checked = checked;
				});

				this.refresh(true, false);
				
			}.bind(this);
		}.bind(this));
		
		// add child-level onClick handler
		$$("input.query_box").each(function(box)
		{
			box.onclick = function()
			{			
				box.checkParent();	
				this.refresh(true, false);
				
			}.bind(this);
			
			box.checkParent = function()
			{
				if(box.hasClass("child_box"))
				{
					var allChecked = true;
					var anyChecked = false;
					$(box.parentNode.parentNode).getElements(".child_box").each(function(child)
					{
						anyChecked = anyChecked | child.checked;
						allChecked = allChecked & child.checked;
					});
					
					// check, uncheck parent box if all children are checked, unchecked
					var parent = $(box.parentNode.parentNode.parentNode).getElement(".parent_box")
					parent.checked = allChecked;
					
					// open parent group if any child is checked
					if(anyChecked)
					{						
						$(box.parentNode.parentNode.parentNode.parentNode.parentNode).open();
					}
				}				
			}.bind(this);
		}.bind(this));	
	},
	
	buildResultsTable: function(columns, container)
	{
		container = container ? container : $E("#filter .results thead tr");
		
		// Grab the current sortBy and sortOrder
		if (window.curSortBy == undefined) { 
			window.curSortBy = this.initData.defaults.sortColumn;
			window.curSortOrder = this.initData.defaults.sortOrder;
			}
		
		// Roll the columns and rebuild the links
		columns.each(function(column) 
		{
			var td = $(document.createElement("td"));
			var link = $(document.createElement("a"));
			link.href = "javascript:void(0)";
			link.setHTML(column.title);
			link.sortBy = column.fields[0];			
			link.onclick = function()
			{

				$$("#filter .results thead a").each(function(element) 
				{
					element.removeClass("sort_asc");
					element.removeClass("sort_desc");
				});
				
				// this.sortOrder = (link.sortBy == window.curSortBy ? (window.curSortOrder == "asc" ? "desc" : "asc") : column.sortOrder);
				this.sortOrder = (window.curSortBy.indexOf(link.sortBy) == 0 ? (window.curSortOrder == "asc" ? "desc" : "asc") : column.sortOrder);
				//link.addClass("sort_" + this.sortOrder);
				window.curSortOrder = this.sortOrder;
				this.sortBy = link.sortBy;
				window.curSortBy = this.sortBy;
				this.refresh(false, false);			
			}.bind(this);
			
			td.addClass("column_" + column.fields[0].replace(" ", "_"));
			td.appendChild(link);
			container.appendChild(td);
			
		}.bind(this));

		$$("#filter .overview .show_all a").each(function(a) { a.onclick = this.showAll.bind(this);	}.bind(this));
		$$("#filter .overview .show_all_bottom a").each(function(a) { a.onclick = this.showAll.bind(this);	}.bind(this));
		$$("#filter .overview .print_all a").each(function(a) { a.onclick = this.printAll.bind(this); }.bind(this));
		$$("#filter .overview .print_all_bottom a").each(function(a) { a.onclick = this.printAll.bind(this); }.bind(this));
		$$("#filter .overview .show_paged a").each(function(a) { a.onclick = this.showPage.bind(this).pass(1); }.bind(this));
		$$("#filter .overview .show_paged_bottom a").each(function(a) { a.onclick = this.showPage.bind(this).pass(1); }.bind(this));
	},
	
	populateResultsTable: function(rows)
	{
		var container = $E("#filter .results tbody");
		
		var hrefArray = location.href.split('/');
		// alert(hrefArray[hrefArray.length - 2]);
		var reportCatz = ['products','commentary','investment-reports','',];
		// if (location.href.indexOf('products/filter.cfm') != -1) { 
			var rpt_header = $E("#filter .results thead");
			// var rpt_overview = $E("#filter .results thead");			
			ReportHeader = null;
			NoRSText = '<span style="font-size:18px;text-align:center;font-weight: normal;">No results found. Please change your selections above.</span>';	
			if (ReportHeader == null) { 
				OGHeaderText = rpt_header.innerHTML;	
				ReportHeader = 1;
				}	
			// No results returned
			if (rows && rows.length == 0) { 
				while(rpt_header.firstChild) { rpt_header.removeChild(rpt_header.firstChild); }
				var tr = $(document.createElement("tr"));
				var td = $(document.createElement("td"));
				td.addClass('noResults');
				td.setHTML(NoRSText);
				tr.appendChild(td);
				rpt_header.appendChild(tr);	
				}
			// Records returned
			else { 
				while(rpt_header.firstChild) { rpt_header.removeChild(rpt_header.firstChild); }
				var tr = $(document.createElement("tr"));
				rpt_header.appendChild(tr);
				this.buildResultsTable(window.OGReportHeaders);
				}
			// }
		while(container.firstChild) { container.removeChild(container.firstChild); }

		var i = 0;	
			
		if(rows && rows.length > 0) rows.each(function(row)
		{
			// document.getElementById("report_hdr").innerHTML = OGHeaderText;
			// document.getElementById("report_overview").innerHTML = OGOverviewText;
						
			var tr = $(document.createElement("tr"));
			tr.addClass((++i % 2) == 0 ? "even" : "odd");
			tr.data = row;
			
			this.initData.results.each(function(column)
			{
				var td = $(document.createElement("td"));
				td.addClass("column_" + column.fields[0].replace(" ", "_"));
				var content = "";
				var subAdvised = false;
				
				column.fields.each(function(field)
				{
					var linked = (column.links && column.links[field] && row[column.links[field]]);
					if(linked)
					{
						var url = row[column.links[field]];
						var target = (url.indexOf("http://") != -1 || /\.pdf$/.test(url)) ? "_blank" : "_parent";
						//content += "<a target=\"" + target + "\" href=\"" + url + "\" style=\"font-family:'Lucida Sans Unicode','Lucida Grande','Arial Unicode MS';\">";
						content += "<a target=\"" + target + "\" href=\"" + url + "\">";
						if (url.indexOf('leggmason') != -1) { 
							subAdvised = true;
							}
					}
					
					if(typeof row[field] == "string")
					{
						content += row[field];
					}
					else
					{
						content += row[field].join(", ");
					}
					
					if(linked)
					{
						var sChar = "&#8480;"; //special characters for "Sevice Mark"
						var sPos = content.indexOf(sChar);
						
						if(sPos != -1)//&#8480; is found within the content
						{
							var sLen = sChar.length;
							var sContent = content;
							var preStr = "";
							var postStr = "";
							//var newChar = "<font face=\"Lucida Sans Unicode,Lucida Grande,Arial Unicode MS\" size=\"2\">" + sChar + "</font>";
							var newChar = "<font style=\"font-family:'Lucida Sans Unicode','Lucida Grande','Arial Unicode MS'; font-size:14px;\">" + sChar + "</font>";
							
							//while(sPos != -1)
							//{
								preStr = sContent.substring(0,sPos);
								postStr = sContent.substring(sPos + sLen, sContent.length);
								sContent = preStr + newChar + postStr;
								//sPos = sContent.indexOf(sChar);
							//}
							content = sContent;
						}
						
						content += "</a>";
						if (subAdvised == true) { 
							content += "<strong>This is a Western Asset sub-advised fund.</strong><br>";
							}
					}					
				});
				
				td.setHTML(content ? content : "&nbsp;");
				tr.appendChild(td);	
			});
			
			container.appendChild(tr);
			
		}.bind(this));
	},
	
	fixPageLinks: function()
	{
		var queryString = this.activeQueryString;
		var baseUrl = this.hiddenFrameUrl + "?" + queryString;
		var spinner = this.spinner;
		$$("a").each(function(a)
		{
			if(!a.fixedLink && !a.onclick && a.href && a.href.indexOf("javascript:") == -1)
			{
				if(a.target == "_blank")				
				{
					a.fixedLink = true;
					a.onclick = function() { window.open(a.href, "_blank"); return false; };
				}
				else
				{
					a.fixedLink = true;
					a.fixedUrl = baseUrl + "&redirect=" + escape(a.href);
					a.onclick = function()
					{
						Cookie.set("suppress_redirect", "true");
						spinner.element.style.visibility = "hidden";
						window.open(a.fixedUrl, "control");
						return false;
					};
				}
			}
		});
	},
	
	fixPrintStylesheets: function()
	{
		$("container").addClass("filter_page");
	}
	
});

function XMLEncode(text)
{
	var output = "";
	for(var i=0;i<text.length;i++)
	{
		var character = text.charAt(i);
		if(true)
		{			
			character = character.charCodeAt(0);
			output += "&#x" + character.toString(16) + ";";
		}
		else
		{
			output += character;
		}
	}
	
	return output;
}



var Spinner = new Class(
{	
	delay: 500,
	
	initialize: function()
	{
		this.waiting = 0;
		this.started = 0;
		this.element = $(document.createElement("div"));
		this.element.addClass("spinner");
		
		this.element.innerHTML = "<div class=\"liner\"><img src=\"/common/img/loader.gif\" alt=\"Loading...\" /></div>";
		document.body.appendChild(this.element);
	},
	
	wait: function()
	{
		var getViewportHeight = function()
		{
			if (window.innerHeight!=window.undefined) return window.innerHeight;
			if (document.compatMode=='CSS1Compat') return document.documentElement.clientHeight;
			if (document.body) return document.body.clientHeight; 
			return window.undefined; 
		};
		
		this.waiting++;	
		if(this.waiting == 1)
		{
			this.started = new Date().getTime();
			this.element.style.top = (Window.getScrollTop() + (getViewportHeight() / 2)) + "px";
			this.element.style.display = "block"; 
			
			if(navigator.userAgent.indexOf("Gecko") != -1)
			{
				$$("#filter .filter_group").each(function(group) { group.style.overflow = "hidden"; });
			}
		}
	},
	
	done: function()
	{
		var hide = function() 
		{ 
			if(this.waiting == 0) 
			{
				$$(".spinner").each(function(spinner) { spinner.style.display = "none"; });
				
				if(navigator.userAgent.indexOf("Gecko") != -1)
				{
					$$("#filter .filter_group").each(function(group) { group.style.overflow = "auto"; });
				}
			}
		}.bind(this);
		
		this.waiting = Math.max(0, this.waiting - 1);
		if(this.waiting == 0)
		{
			var now = new Date().getTime();
			if(now - this.started < this.delay)
				hide.delay(this.delay - (now - this.started));
			else
				hide();
				
			this.started = 0;
		}
	}
});