var $ggnJpIm = function(){
//http://developer.yahoo.com/yui/docs/YAHOO.widget.AutoComplete.html
	var myContacts = $ggnJpData;
	// Define a custom search function for the DataSource
	var matchNames = function(sQuery) {
		// Case insensitive matching
		var query = decodeURIComponent(sQuery).toLowerCase().replace(/ /g, ""), //hzy2010-12-15 05:21:52+0800	一定要先decodeURIComponent再replace，否则空格会以%20的形态出现
		    contact,
		    i=0,
		    l=myContacts.length,
		    matches = [];
		if(query == '')
			return matches;
		// Match against each name of each contact
		var $maxReturn = 10;
		for(; i<l; i++) {
			contact = myContacts[i];
			if( hzyJpSearch(query,contact) ||
					(contact.code.toLowerCase().replace(/ /g, "").indexOf(query) > -1) ||
					(contact.abbr.toLowerCase().replace(/ /g, "").indexOf(query) > -1)) {
				matches[matches.length] = contact;
			}
			if(matches.length > $maxReturn)
				break;
		}
		return matches;
	};

	var hzyJpSearch = function(nQuery,row) {
		//(contact.jp.toLowerCase().replace(/ /g, "").indexOf(query) > -1)
		var str = row.jp.toLowerCase().replace(/ /g, "");
		if(str.indexOf(',') <= -1) {
			return (str.indexOf(nQuery) > -1);
		} else {
			//多音字
			var arr = new Array();
			var notEntBraces = true;
			for(var i=0;i<str.length;i++) {
				if(str.charAt(i) == '(')
					notEntBraces = false;
				if(notEntBraces)
					arr.push(str.charAt(i));
				else {
					var tmpArr = new Array();
					var k = 1;
					while (str.charAt(i+k) != ')') {
						if(str.charAt(i+k) != ',')
							tmpArr.push(str.charAt(i+k));
						k++;
					}
					arr.push(tmpArr);
					notEntBraces = true;
					i+=k;
				}
			}
			//aaa.innerHTML = var_dump(arr);

			for(var i=0;i<arr.length;i++) {
				if(nQuery.length <= arr.length - i && sStrSearch(nQuery.charAt(0), arr[i])) {
					var found = true;
					for(var w=1;w<nQuery.length;w++) {
						found = found && sStrSearch(nQuery.charAt(w), arr[i+w]);
						if(!found)
							break;
						if(w == nQuery.length - 1)
							return true;
					}
				}
			}
			return false;
		}
	}

	var sStrSearch = function (q,i) {
		// q is a single char
		if(is_array(i)) {
			for(var k=0;k<i.length;k++) {
				if(i[k] == q) {
					return true;
				}
			}
			return false;
		} else {
			if(i == q)
				return true;
			else
				return false;
		}
	}
	// Use a FunctionDataSource
	var oDS = new YAHOO.util.FunctionDataSource(matchNames);
	oDS.responseSchema = {
		fields: ["code", "abbr", "jp"]
	}

	// Instantiate AutoComplete
	var oAC = new YAHOO.widget.AutoComplete("myInput", "myContainer", oDS);
	oAC.useShadow = true;
	oAC.resultTypeList = false;


	// Custom formatter to highlight the matching letters
	oAC.formatResult = function(oResultData, sQuery, sResultMatch) {
		var query = sQuery.toLowerCase(),
		    jp = oResultData.jp,
		    abbr = oResultData.abbr,
		    code = oResultData.code || "", // Guard against null value
		    query = sQuery.toLowerCase(),
		    fnameMatchIndex = abbr.toLowerCase().indexOf(query),
		    lnameMatchIndex = code.toLowerCase().indexOf(query),
		    nnameMatchIndex = jp.toLowerCase().indexOf(query),
		    displayfname, displaylname, displaynname;

		if(fnameMatchIndex > -1) {
			displayfname = highlightMatch(abbr, query, fnameMatchIndex);
		} else {
			displayfname = abbr;
		}

		if(lnameMatchIndex > -1) {
			displaylname = highlightMatch(code, query, lnameMatchIndex);
		} else {
			displaylname = code;
		}

		if(nnameMatchIndex > -1) {
			displaynname = "(" + highlightMatch(jp, query, nnameMatchIndex) + ")";
		} else {
			displaynname = jp ? "(" + jp + ")" : "";
		}

		return displayfname + " " + displaylname + " " + displaynname;
	};

	// Helper function for the formatter
	var highlightMatch = function(full, snippet, matchindex) {
		return full.substring(0, matchindex) + 
			"<span class='match'>" + 
			full.substr(matchindex, snippet.length) + 
			"</span>" +
			full.substring(matchindex + snippet.length);
	};

	// Define an event handler to populate a hidden form field
	// when an item gets selected and populate the input field
	var myHandler = function(sType, aArgs) {
		var myAC = aArgs[0]; // reference back to the AC instance
		var elLI = aArgs[1]; // reference to the selected LI element
		var oData = aArgs[2]; // object literal of selected item's result data

		myAC.getInputEl().value = oData.code;
		window.location.href = "http://ggn.cc/ggn/" + oData.code;
	};
	oAC.itemSelectEvent.subscribe(myHandler);
	oAC.useIFrame = true;

	return {
		oDS: oDS,
		oAC: oAC
	};
}();

