	
	/*
	 *	jquery.suggest 1.1 - 2007-08-06
	 *	
	 *	Uses code and techniques from following libraries:
	 *	1. http://www.dyve.net/jquery/?autocomplete
	 *	2. http://dev.jquery.com/browser/trunk/plugins/interface/iautocompleter.js	
	 *
	 *	All the new stuff written by Peter Vulgaris (www.vulgarisoip.com)	
	 *	Feel free to do whatever you want with this file
	 *
	 */
;if(window.jQuery) (function($){

		$.suggest = function(input, options) {
			var $input = $(input).attr("autocomplete", "off");
			var $results = $(document.createElement("ul"));

			var timeout = false;		// hold timeout ID for suggestion results to appear	
			var prevLength = 0;			// last recorded length of $input.val()
			var cache = [];				// cache MRU list
			var cacheSize = 0;			// size of cache in chars (bytes?)
			
			$results.addClass(options.resultsClass).appendTo('body');
				

			resetPosition();
			$(window)
				.load(resetPosition)		// just in case user is changing size of page while loading
				.resize(resetPosition);

			$input.blur(function() {
				setTimeout(function() { $results.hide() }, 200);
			});
			
			
			// help IE users if possible
			try {
				$results.bgiframe();
			} catch(e) { }


			// I really hate browser detection, but I don't see any other way
			if ($.browser.mozilla)
				$input.keypress(processKey);	// onkeypress repeats arrow keys in Mozilla/Opera
			else
				$input.keydown(processKey);		// onkeydown repeats arrow keys in IE/Safari
			



			function resetPosition() {
				// requires jquery.dimension plugin
				var offset = $input.offset();
				$results.css({
					top: (offset.top + input.offsetHeight) + 'px',
					left: offset.left + 'px'
				});
			}
			
			
			function processKey(e) {
				
				// handling up/down/escape requires results to be visible
				// handling enter/tab requires that AND a result to be selected
				if ((/27$|38$|40$/.test(e.keyCode) && $results.is(':visible')) ||
					(/^13$|^9$/.test(e.keyCode) && getCurrentResult())) {
		            
		            if (e.preventDefault)
		                e.preventDefault();
					if (e.stopPropagation)
		                e.stopPropagation();

					e.cancelBubble = true;
					e.returnValue = false;
				
					switch(e.keyCode) {
	
						case 38: // up
							prevResult();
							break;
				
						case 40: // down
							nextResult();
							break;
	
						case 9:  // tab
						case 13: // return
							selectCurrentResult();
							break;
							
						case 27: //	escape
							$results.hide();
							break;
	
					}
					
				} else if ($input.val().length != prevLength) {

					if (timeout) 
						clearTimeout(timeout);
					timeout = setTimeout(suggest, options.delay);
					prevLength = $input.val().length;
					
				}			
					
				
			}
			
			
			function suggest() {
			
				var q = $.trim($input.val());

				if (q.length >= options.minchars) {
					
					cached = checkCache(q);
					
					if (cached) {
					
						displayItems(cached['items']);
					
					} else {
					
						$.get(options.source, {q: q}, function(txt) {

							$results.hide();
							
							var items = parseTxt(txt, q);
							
							displayItems(items);
							addToCache(q, items, txt.length);
							
						});
						
						
					}
					
				} else {
				
					$results.hide();
					
				}
					
			}
			
			
			function checkCache(q) {

				for (var i = 0; i < cache.length; i++)
					if (cache[i]['q'] == q) {
						cache.unshift(cache.splice(i, 1)[0]);
						return cache[0];
					}
				
				return false;
			
			}
			
			function addToCache(q, items, size) {

				while (cache.length && (cacheSize + size > options.maxCacheSize)) {
					var cached = cache.pop();
					cacheSize -= cached['size'];
				}
				
				cache.push({
					q: q,
					size: size,
					items: items
					});
					
				cacheSize += size;
			
			}
			
			function displayItems(items) {
				
				if (!items)
					return;
					
				if (!items.length) {
					$results.hide();
					return;
				}
				
				var html = '';
				for (var i = 0; i < items.length; i++)
					html += '<li>' + items[i] + '</li>';

				$results.html(html).show();
				
				$results
					.children('li')
					.mouseover(function() {
						$results.children('li').removeClass(options.selectClass);
						$(this).addClass(options.selectClass);
					})
					.click(function(e) {
						//e.preventDefault(); 
						//e.stopPropagation();
						selectCurrentResult();
					});
							
			}
			
			function parseTxt(txt, q) {
				
				var items = [];
				var tokens = txt.split(options.delimiter);
				
				// parse returned data for non-empty items
				for (var i = 0; i < tokens.length; i++) {
					var token = $.trim(tokens[i]);
					if (token) {
						/*token = token.replace(
							new RegExp(q, 'ig'), 
							function(q) { return '<span class="' + options.matchClass + '">' + q + '</span>' }
							);	*/
						items[items.length] = token;
					}
				}
				
				return items;
			}
			
			function getCurrentResult() {
			
				if (!$results.is(':visible'))
					return false;
			
				var $currentResult = $results.children('li.' + options.selectClass);

				if (!$currentResult.length) {
					
					var $oneResult = $results.children('li');
					//$.dump($oneResult);
					if($oneResult.length == 1 && $oneResult[0].innerHTML != 'Sorry, no city found with that name.')
						return $oneResult;
					
					$currentResult = false;
				}
			
				return $currentResult;

			}
			
			function selectCurrentResult() {
			
				$currentResult = getCurrentResult();
				
				v = $('a',$currentResult);
				if(v.length > 0) {
					if($(v).attr('rel') == "iframe") {
						window.open($(v).attr('href'), "mcsearch");
					} else {
					window.location = $(v).attr('href');
					}
				}
				if ($currentResult) {
					$input.val($currentResult.text());
					$results.hide();
					
					if (options.onSelect)
						options.onSelect.apply($input[0]);
						
				}
			
			}
			
			function nextResult() {
			
				$currentResult = getCurrentResult();
			
				if ($currentResult)
					$currentResult
						.removeClass(options.selectClass)
						.next()
							.addClass(options.selectClass);
				else
					$results.children('li:first-child').addClass(options.selectClass);
			
			}
			
			function prevResult() {
			
				$currentResult = getCurrentResult();
			
				if ($currentResult)
					$currentResult
						.removeClass(options.selectClass)
						.prev()
							.addClass(options.selectClass);
				else
					$results.children('li:last-child').addClass(options.selectClass);
			
			}
	
		}
		
		$.fn.suggest = function(source, options) {
		
			if (!source)
				return;
		
			options = options || {};
			options.source = source;
			options.delay = options.delay || 100;
			options.resultsClass = options.resultsClass || 'ac_results';
			options.selectClass = options.selectClass || 'ac_over';
			options.matchClass = options.matchClass || 'ac_match';
			options.minchars = options.minchars || 1;
			options.delimiter = options.delimiter || '\n';
			options.onSelect = options.onSelect || false;
			options.maxCacheSize = options.maxCacheSize || 65536;
	
			this.each(function() {
				new $.suggest(this, options);
			});
	
			return this;
			
		};
		
	})(jQuery);
	


	jQuery.fn.dump = function(showTypes, showAttributes) {
		jQuery.dump($(this), showTypes, showAttributes);
		return this;
	};

	jQuery.dump = function(object, showTypes, showAttributes) {
	  var dump = '';
	  var st = typeof showTypes == 'undefined' ? true : showTypes;
	  var sa = typeof showAttributes == 'undefined' ? true : showAttributes;  
	  var winName = 'dumpWin';
	  var w = 760;
	  var h = 500;
	  var leftPos = screen.width ? (screen.width - w) / 2 : 0;
	  var topPos = screen.height ? (screen.height - h) / 2 : 0;
	  var settings = 'height=' + h + ',width=' + w + ',top=' + topPos + ',left=' + leftPos + ',scrollbars=yes,menubar=yes,status=yes,resizable=yes';
	  var title = 'Dump';
	  var script = 'function tRow(s) {t = s.parentNode.lastChild;tTarget(t, tSource(s)) ;}function tTable(s) {var switchToState = tSource(s) ;var table = s.parentNode.parentNode;for (var i = 1; i < table.childNodes.length; i++) {t = table.childNodes[i] ;if (t.style) {tTarget(t, switchToState);}}}function tSource(s) {if (s.style.fontStyle == "italic" || s.style.fontStyle == null) {s.style.fontStyle = "normal";s.title = "click to collapse";return "open";} else {s.style.fontStyle = "italic";s.title = "click to expand";return "closed" ;}}function tTarget (t, switchToState) {if (switchToState == "open") {t.style.display = "";} else {t.style.display = "none";}}';	

	 var _recurse = function (o, type) {
	    var i;
		var j = 0;
		var r = '';
		type = _dumpType(o);
		switch (type) {		
		  case 'regexp':
		    var t = type;
		    r += '<table' + _dumpStyles(t,'table') + '><tr><th colspan="2"' + _dumpStyles(t,'th') + '>' + t + '</th></tr>';
		    r += '<tr><td colspan="2"' + _dumpStyles(t,'td-value') + '><table' + _dumpStyles('arguments','table') + '><tr><td' + _dumpStyles('arguments','td-key') + '><i>RegExp: </i></td><td' + _dumpStyles(type,'td-value') + '>' + o + '</td></tr></table>';  
		    j++;
		    break;
		  case 'date':
		    var t = type;
		    r += '<table' + _dumpStyles(t,'table') + '><tr><th colspan="2"' + _dumpStyles(t,'th') + '>' + t + '</th></tr>';
		    r += '<tr><td colspan="2"' + _dumpStyles(t,'td-value') + '><table' + _dumpStyles('arguments','table') + '><tr><td' + _dumpStyles('arguments','td-key') + '><i>Date: </i></td><td' + _dumpStyles(type,'td-value') + '>' + o + '</td></tr></table>';  
		    j++;
		    break;
		  case 'function':
		    var t = type;
		    var a = o.toString().match(/^.*function.*?\((.*?)\)/im); 
		    var args = (a == null || typeof a[1] == 'undefined' || a[1] == '') ? 'none' : a[1];
		    r += '<table' + _dumpStyles(t,'table') + '><tr><th colspan="2"' + _dumpStyles(t,'th') + '>' + t + '</th></tr>';
		    r += '<tr><td colspan="2"' + _dumpStyles(t,'td-value') + '><table' + _dumpStyles('arguments','table') + '><tr><td' + _dumpStyles('arguments','td-key') + '><i>Arguments: </i></td><td' + _dumpStyles(type,'td-value') + '>' + args + '</td></tr><tr><td' + _dumpStyles('arguments','td-key') + '><i>Function: </i></td><td' + _dumpStyles(type,'td-value') + '>' + o + '</td></tr></table>';  
		    j++;
		    break;
		  case 'domelement':
		    var t = type;
			var attr = '';
			if (sa) {
			  for (i in o) {if (!/innerHTML|outerHTML/i.test(i)) {attr += i + ': ' + o[i] + '<br />';}}
			}
		    r += '<table' + _dumpStyles(t,'table') + '><tr><th colspan="2"' + _dumpStyles(t,'th') + '>' + t + '</th></tr>';
		    r += '<tr><td' + _dumpStyles(t,'td-key') + '><i>Node Name: </i></td><td' + _dumpStyles(type,'td-value') + '>' + o.nodeName.toLowerCase() + '</td></tr>';  
			r += '<tr><td' + _dumpStyles(t,'td-key') + '><i>Node Type: </i></td><td' + _dumpStyles(type,'td-value') + '>' + o.nodeType + '</td></tr>'; 
			r += '<tr><td' + _dumpStyles(t,'td-key') + '><i>Node Value: </i></td><td' + _dumpStyles(type,'td-value') + '>' + o.nodeValue + '</td></tr>';
			if (sa) {
			  r += '<tr><td' + _dumpStyles(t,'td-key') + '><i>Attributes: </i></td><td' + _dumpStyles(type,'td-value') + '>' + attr + '</td></tr>';  		
			  r += '<tr><td' + _dumpStyles(t,'td-key') + '><i>innerHTML: </i></td><td' + _dumpStyles(type,'td-value') + '>' + o.innerHTML + '</td></tr>'; 
			  if (typeof o.outerHTML != 'undefined') {
			    r += '<tr><td' + _dumpStyles(t,'td-key') + '><i>outerHTML: </i></td><td' + _dumpStyles(type,'td-value') + '>' + o.outerHTML + '</td></tr>'; 
			  }
			}
		    j++;
		    break;		
		}
		if (/object|array/.test(type)) {
	      for (i in o) {
		    var t = _dumpType(o[i]);
		    if (j < 1) {
		      r += '<table' + _dumpStyles(type,'table') + '><tr><th colspan="2"' + _dumpStyles(type,'th') + '>' + type + '</th></tr>';
			  j++;	  
		    }
		    if (typeof o[i] == 'object' && o[i] != null) { 
			  r += '<tr><td' + _dumpStyles(type,'td-key') + '>' + i + (st ? ' [' + t + ']' : '') + '</td><td' + _dumpStyles(type,'td-value') + '>' + _recurse(o[i], t) + '</td></tr>';	
		    } else if (typeof o[i] == 'function') {
			  r += '<tr><td' + _dumpStyles(type ,'td-key') + '>' + i + (st ? ' [' + t + ']' : '') + '</td><td' + _dumpStyles(type,'td-value') + '>' + _recurse(o[i], t) + '</td></tr>';  	
			} else {
			  r += '<tr><td' + _dumpStyles(type,'td-key') + '>' + i + (st ? ' [' + t + ']' : '') + '</td><td' + _dumpStyles(type,'td-value') + '>' + o[i] + '</td></tr>';  
		    }
		  }
		}
		if (j == 0) {
		  r += '<table' + _dumpStyles(type,'table') + '><tr><th colspan="2"' + _dumpStyles(type,'th') + '>' + type + ' [empty]</th></tr>'; 	
		}
		r += '</table>';
		return r;
	  };	
	  var _dumpStyles = function(type, use) {
	  var r = '';
	  var table = 'font-size:xx-small;font-family:verdana,arial,helvetica,sans-serif;cell-spacing:2px;';
	  var th = 'font-size:xx-small;font-family:verdana,arial,helvetica,sans-serif;text-align:left;color: white;padding: 5px;vertical-align :top;cursor:hand;cursor:pointer;';
	  var td = 'font-size:xx-small;font-family:verdana,arial,helvetica,sans-serif;vertical-align:top;padding:3px;';
	  var thScript = 'onClick="tTable(this);" title="click to collapse"';
	  var tdScript = 'onClick="tRow(this);" title="click to collapse"';
	  switch (type) {
		case 'string':
		case 'number':
		case 'boolean':
		case 'undefined':
		case 'object':
		  switch (use) {
			case 'table':  
			  r = ' style="' + table + 'background-color:#0000cc;"';
			  break;
			case 'th':
			  r = ' style="' + th + 'background-color:#4444cc;"' + thScript;
			  break;
			case 'td-key':
			  r = ' style="' + td + 'background-color:#ccddff;cursor:hand;cursor:pointer;"' + tdScript;
			  break;
			case 'td-value':
			  r = ' style="' + td + 'background-color:#fff;"';
			  break;
		  }
		  break;
		case 'array':
		  switch (use) {
			case 'table':  
			  r = ' style="' + table + 'background-color:#006600;"';
			  break;
			case 'th':
			  r = ' style="' + th + 'background-color:#009900;"' + thScript;
			  break;
			case 'td-key':
			  r = ' style="' + td + 'background-color:#ccffcc;cursor:hand;cursor:pointer;"' + tdScript;
			  break;
			case 'td-value':
			  r = ' style="' + td + 'background-color:#fff;"';
			  break;
		  }	
		  break;
		case 'function':
		  switch (use) {
			case 'table':  
			  r = ' style="' + table + 'background-color:#aa4400;"';
			  break;
			case 'th':
			  r = ' style="' + th + 'background-color:#cc6600;"' + thScript;
			  break;
			case 'td-key':
			  r = ' style="' + td + 'background-color:#fff;cursor:hand;cursor:pointer;"' + tdScript;
			  break;
			case 'td-value':
			  r = ' style="' + td + 'background-color:#fff;"';
			  break;
		  }	
		  break;
		case 'arguments':
		  switch (use) {
			case 'table':  
			  r = ' style="' + table + 'background-color:#dddddd;cell-spacing:3;"';
			  break;
			case 'td-key':
			  r = ' style="' + th + 'background-color:#eeeeee;color:#000000;cursor:hand;cursor:pointer;"' + tdScript;
			  break;	  
		  }	
		  break;
		case 'regexp':
		  switch (use) {
			case 'table':  
			  r = ' style="' + table + 'background-color:#CC0000;cell-spacing:3;"';
			  break;
			case 'th':
			  r = ' style="' + th + 'background-color:#FF0000;"' + thScript;
			  break;
			case 'td-key':
			  r = ' style="' + th + 'background-color:#FF5757;color:#000000;cursor:hand;cursor:pointer;"' + tdScript;
			  break;
			case 'td-value':
			  r = ' style="' + td + 'background-color:#fff;"';
			  break;		  
		  }	
		  break;
		case 'date':
		  switch (use) {
			case 'table':  
			  r = ' style="' + table + 'background-color:#663399;cell-spacing:3;"';
			  break;
			case 'th':
			  r = ' style="' + th + 'background-color:#9966CC;"' + thScript;
			  break;
			case 'td-key':
			  r = ' style="' + th + 'background-color:#B266FF;color:#000000;cursor:hand;cursor:pointer;"' + tdScript;
			  break;
			case 'td-value':
			  r = ' style="' + td + 'background-color:#fff;"';
			  break;		  
		  }	
		  break;
		case 'domelement':
		case 'document':
		case 'window':
		  switch (use) {
			case 'table':  
			  r = ' style="' + table + 'background-color:#FFCC33;cell-spacing:3;"';
			  break;
			case 'th':
			  r = ' style="' + th + 'background-color:#FFD966;"' + thScript;
			  break;
			case 'td-key':
			  r = ' style="' + th + 'background-color:#FFF2CC;color:#000000;cursor:hand;cursor:pointer;"' + tdScript;
			  break;
			case 'td-value':
			  r = ' style="' + td + 'background-color:#fff;"';
			  break;		  
		  }	
		  break;	  
	  }
	  return r;
	  };
	  var _dumpType = function (obj) {
	    var t = typeof(obj);
	    if (t == 'function') {
	      var f = obj.toString();
	      if ( ( /^\/.*\/[gi]??[gi]??$/ ).test(f)) {
	        return 'regexp';
	      } else if ((/^\[object.*\]$/i ).test(f)) {
	        t = 'object'
	      }
	    }
	    if (t != 'object') {
	      return t;
	    }
	    switch (obj) {
	      case null:
	        return 'null';
	      case window:
	        return 'window';
		  case document:
		    return 'document';
	      case window.event:
	        return 'event';
	    }
	    if (window.event && (event.type == obj.type)) {
	      return 'event';
	    }
	    var c = obj.constructor;
	    if (c != null) {
	      switch(c) {
	        case Array:
	          t = 'array';
	          break;
	        case Date:
	          return 'date';
	        case RegExp:
	          return 'regexp';
	        case Object:
	          t = 'object';	
	        break;
	        case ReferenceError:
	          return 'error';
	        default:
	          var sc = c.toString();
	          var m = sc.match(/\s*function (.*)\(/);
	          if (m != null) {
	            return 'object';
	          }
	      }
	    }
	    var nt = obj.nodeType;
	    if (nt != null) {
	      switch(nt) {
	        case 1:
	          return 'domelement';
	        case 3:
	          return 'string';
	      }
	    }
	    if (obj.toString != null) {
	      var ex = obj.toString();
	      var am = ex.match(/^\[object (.*)\]$/i);
	      if (am != null) {
	        var am = am[1];
	        switch(am.toLowerCase()) {
	          case 'event':
	            return 'event';
	          case 'nodelist':
	          case 'htmlcollection':
	          case 'elementarray':
	            return 'array';
	          case 'htmldocument':
	            return 'htmldocument';
	        }
	      }
	    }
	    return t;
	  };  
	  dump += (/string|number|undefined|boolean/.test(typeof(object)) || object == null) ? object : _recurse(object, typeof object);
	  winName = window.open('', '', settings);
	  if (jQuery.browser.msie || jQuery.browser.browser == 'opera' || jQuery.browser.browser == 'safari') {
		winName.document.write('<html><head><title> ' + title + ' </title><script type="text/javascript">' + script + '</script><head>');
		winName.document.write('<body>' + dump + '</body></html>');
	  } else {
		winName.document.body.innerHTML = dump;
		winName.document.title = title;
		var ffs = winName.document.createElement('script');
		ffs.setAttribute('type', 'text/javascript');
		ffs.appendChild(document.createTextNode(script));
		winName.document.getElementsByTagName('head')[0].appendChild(ffs);
	  }
	  winName.focus();  
	};