/*
 *	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
 *
 *      Modified for Panasonic Support Site Redesign
 */

(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?)
		
	
	if(options.addToBody == 'yes')
		$results.addClass(options.resultsClass).appendTo('body');
	else
		$results.addClass(options.resultsClass).insertAfter($input);
	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
	    $input.keypress(resetPosition2);
	}
	else
	{
		$input.keydown(processKey);		// onkeydown repeats arrow keys in IE/Safari
	    $input.keydown(resetPosition2);
	}
	
	function resetPosition() {
		// requires jquery.dimension plugin
		var offset = $input.offset();
		if(options.addToBody == 'yes') {
		$results.css({
			top: (offset.top + input.offsetHeight) + 'px',
			left: offset.left + 'px'
		});
		}
	}
	
	function resetPosition2() {
		// requires jquery.dimension plugin
		var offset = $input.offset();
		if(options.addToBody == 'yes') {
		$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();
				selectOnlyCurrentResult();
				break;
		
			case 40: // down
				nextResult();
				selectOnlyCurrentResult();
				break;
			case 9:  // tab
			case 13: // return
				enterCurrentResult();
				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 retrieveText(q) {
		$.get( options.buildUrl( q), options.buildQueryString( q), function(txt) {
			$results.hide();
			var items = parseTxt(txt, q);
			displayItems( q, items);
			addToCache( q, items, items.length);
		});
	}
	function retrieveJSON(q) {
	    //q = q.replace('-','');
	    //q = q.replace('/','');
	    //removes all special characters from search string
	    q = q.replace(/[^a-zA-Z 0-9]+/g,'');
	    //alert(q);
	    //q = q.replace(/^\s+|\s+$/g, '');
		$.getJSONP( options.buildUrl( q), q.toUpperCase(), function(data) {
			$results.hide();
			displayItems( q.toUpperCase(), data.results);
			addToCache( q, data.results, data.results.length);
		});
	}


	function suggest() {
		var q = $.trim($input.val());
		if (q.length >= options.minchars) {
			cached = checkCache(q);
			
			if (cached) {
				displayItems( q.toUpperCase(), cached['items']);
			} else {
				retrieveJSON( q);
			}
		} 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 applyTemplate( v, t, q) {
	        try {
        		if (v === '') return t;
			return t.replace(/{([^{}]*)}/g,
				function(a, b) {
					var r;
					if (b.indexOf('.') !== -1) { // handle dot notation in {}, such as {Thumbnail.Url}
						var ary = b.split('.');
						var obj = d;
						for (var i = 0; i < ary.length; i++)
							obj = obj[ary[i]];
						r = obj;
					} else
						r = applyTypedCharCSS(v[b],q);
					if (typeof r === 'string' || typeof r === 'number') return r; else throw (a);
				}
			);
		} catch (ex) {
			alert('Invalid JSON property ' + ex + ' found when trying to apply resultTemplate.\nPlease check your spelling and try again.');
		}
        }
        
	function applyTypedCharCSS(val, q) {
		if (val) {
			val = val.replace(
			new RegExp(q, 'ig'), 
			function(q) { return '<span class="' + options.matchClass + '">' + q + '</span>' }
			);
		}
		return val;
	}

        
	function displayItems(q, items) {
		if (!items || !items.length) {
			$results.hide();
			return;
		}
		$results.empty();
		var nDisplayed = 0;
		for (var i = 0; i < items.length; i++) {
			var rowData = items[ i];
			//rowData[options.displayValue] = applyTypedCharCSS(rowData[options.displayValue], q);
			if( options.testRow( rowData, q)) {
//			var displayValue = items[ i] [options.displayValue];
//			if( displayValue && displayValue.indexOf( q) >= 0) {
				var $row = $('<li>' + applyTemplate( items[i], options.displayTemplate, q) + '</li>')
					.mouseover(function() {
						$results.children('li').removeClass(options.selectClass);
						$(this).addClass(options.selectClass);
					})
					.click(function(e) {
						e.preventDefault(); 
						e.stopPropagation();
						selectCurrentResult();
					})
					.attr( 'val', rowData[ options.displayValue]);

				$results.append( $row);
				nDisplayed++;
				if( options.maxRows != 0 && nDisplayed >= options.maxRows) break;
			}
		}
		if( nDisplayed == 0) {
			$results.hide();
			return;
		}
//		alert( $results.html());
		$results.show();
	}
		
	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 = {name: $.trim(tokens[i])};
			items[ items.length] = token;
		}
		return items;
	}
		
	function getCurrentResult() {
	
		if (!$results.is(':visible'))
			return false;
	
		var $currentResult = $results.children('li.' + options.selectClass);
		
		if (!$currentResult.length)
			$currentResult = false;
			
		return $currentResult;
	}
		
	function selectCurrentResult() {
		
		$currentResult = getCurrentResult();
	
		if ($currentResult) {
			$input.val($currentResult.attr( 'val'));
			$results.hide();
			
			if (options.onSelect)
				options.onSelect.apply($input[0]);
				
		}
	
	}
	
	function enterCurrentResult() {
		$currentResult = getCurrentResult();
	
		if ($currentResult) {
			$input.val($currentResult.attr( 'val'));
			$results.hide();
			
			if (options.onSelect)
				options.onSelect.apply($input[0]);
			if (options.onEnter)
				options.onEnter.apply($input[0]);
				
		}
	}
	


	function selectOnlyCurrentResult() {
		
		$currentResult = getCurrentResult();
	
		if ($currentResult) {
			$input.val($currentResult.attr( 'val'));
		}
	
	}

		
		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 || 2;
		options.delimiter = options.delimiter || '\n';
		options.onSelect = options.onSelect || false;
		options.maxCacheSize = options.maxCacheSize || 1000;

		options.displayValue = options.displayValue || 'name';
		options.displayTemplate = options.displayTemplate || '{name}';
		options.maxRows = options.maxRows || 0;
		options.buildUrl = options.buildUrl || function( q) { return options.source;};
		options.buildQueryString = options.buildQueryString || function( q) { return { 'q': q}; };
		options.testRow = options.testRow || function( row, q) { return true; }
		options.addToBody = options.addToBody || 'yes';
		this.each(function() {
			new $.suggest(this, options);
		});

		return this;
		
	};
	
})(jQuery);
	
jQuery.noConflict();

jQuery(document).ready( function() 
{
    jQuery('input.pnSearch').suggest('vSupportSuggest', 
    {
        onEnter: function() {return submitSupportSearch();}

        , resultsClass: 'ac_results_home'        
        , minchars: 2
        , maxRows: 10
        , displayValue: 'pn'
        , displayTemplate: '{pn}'
        , buildUrl: function( q) 
        {
            //final on staging
            if( !q || q.length < 2) return;
           
//            if( !q || q.length == 2) return 'http://images.panasonic.com/webapp/wcs/stores/servlet/vSupportSuggest?storeId=15001&searchString='+q+'&callback=?';
            if( !q || q.length == 2) return 'http://www.panasonic.com/business/provideo/support/includes/data/autocomplete.asp?storeId=15001&searchString='+q+'&callback=?';
        
            if( !q || q.length > 2) 
            {
                return 'http://www.panasonic.com/business/provideo/support/includes/data/autocomplete.asp?storeId=15001&searchString='+q.substr( 0, 2).toUpperCase()+'&callback=?';
//                return 'http://images.panasonic.com/webapp/wcs/stores/servlet/vSupportSuggest?storeId=15001&searchString='+q.substr( 0, 2).toUpperCase()+'&callback=?';
            }
        }
        , testRow: function( row, q) 
        { 
            if( !row || !q ||q.length < 2) return false;
            var t = q.replace( /-/g, "");
            var v = row.ky;
            return v && v.indexOf(t) >= 0;
        }
    });
});