YAHOO.example.FnMultipleFields = function(){
    var titlesArray = allTitles;
    // Define a custom search function for the DataSource
    var matchNames = function(sQuery) {
        // Case insensitive matching
        var query = sQuery.toLowerCase(),
            contact,
            i=0,
            l=titlesArray.length,
            matches = [];
        
        // Match against each name of each contact
        for(; i<l; i++) {
            contact = titlesArray[i];
            if((contact.title.toLowerCase().indexOf(query) > -1) ||
                (contact.model && (contact.model.toLowerCase().indexOf(query) > -1))) {
                matches[matches.length] = contact;
            }
        }
 
        return matches;
    };
 
    // Use a FunctionDataSource
    var oDS = new YAHOO.util.FunctionDataSource(matchNames);
    oDS.responseSchema = {
        fields: ["id", "title", "model", "nname"]
    }
 
    // Instantiate AutoComplete
    var oAC = new YAHOO.widget.AutoComplete("searchText", "suggest", oDS);
    oAC.useShadow = true;
    oAC.resultTypeList = false;
    
    
    // Custom formatter to highlight the matching letters
    oAC.formatResult = function(oResultData, sQuery, sResultMatch) {
        var query = sQuery.toLowerCase(),
            title = oResultData.title,
            model = oResultData.model || "", // Guard against null value
            query = sQuery.toLowerCase(),
            titleMatchIndex = title.toLowerCase().indexOf(query),
            modelMatchIndex = model.toLowerCase().indexOf(query),
            //nnameMatchIndex = nname.toLowerCase().indexOf(query),
            displayfname, displaylname, displaynname;
            
        if(titleMatchIndex > -1) {
            displayfname = highlightMatch(title, query, titleMatchIndex);
        }
        else {
            displayfname = title;
        }
 
        if(modelMatchIndex > -1) {
            displaylname = highlightMatch(model, query, modelMatchIndex);
        }
        else {
            displaylname = model;
        }
 
        /*if(nnameMatchIndex > -1) {
            displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
        }
        else {
            displaynname = nname ? "(" + nname + ")" : "";
        }*/
		if (displaylname != ""){
			displaylname = " (" + displaylname + ") "
		}
        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 myHiddenField = YAHOO.util.Dom.get("myHidden");
    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
        
        // update hidden form field with the selected item's ID
        //myHiddenField.value = oData.id;
        
        myAC.getInputEl().value = oData.title;// + " " + oData.lname + (oData.nname ? " (" + oData.nname + ")" : "");
    };
    oAC.itemSelectEvent.subscribe(myHandler);
    
    return {
        oDS: oDS,
        oAC: oAC 
    };
}();
