﻿/**
 *	PB 19/06/09;
 *
 * custom xc implimentation of yui's autocomplete, inc custom filtering via the 
 * overrideable method filterResults();
 */
function addAutoComplete(o) {
    
    // create yui data source;
    var ds = new YAHOO.util.XHRDataSource(BasePath + "_WebServices/XcelPrototype.svc/GetStationsBySearchText");
    ds.responseType = YAHOO.util.XHRDataSource.TYPE_JSON;
    
    // define returned results schema; 
    ds.responseSchema = { 
        resultsList : "Result",
        fields : [ 
            { key: "Name" },
            { key: "StationCode" }
        ]
    };
    
    // bridge to jQuery custom event subscription;
    var onAutoCompleteChange = function(evt, args) {
        $(document).trigger('autocompletechange', {
            element: args[0]._elTextbox,
            value: args[2][0],
            selected: args[1]
        });
    };


	var ac = new YAHOO.widget.AutoComplete(o.input, o.container, ds);
	ac.applyLocalFilter = true; 
	ac.queryMatchContains = true; 
	ac.maxResultsDisplayed = 20; 
	ac.minQueryLength = 3; 
	ac.prehighlightClassName = "yui-ac-prehighlight"; 
	ac.useShadow = true;
	ac.forceSelection = true;

    // bind jQuery bridge handler;
	ac.itemSelectEvent.subscribe(onAutoCompleteChange);
	
    // customise the query before service call;
	ac.generateRequest = function(sQuery) { 
        return '/'+sQuery; 
    };
	
	// overridden YUI method;
	ac.filterResults = function(sQuery , oFullResponse , oParsedResponse , oCallback){
	
		// If AC has passed a query string value back to itself, grab it
		if(oCallback && oCallback.argument && oCallback.argument.query) {
			sQuery = oCallback.argument.query;
		}

		// Only if a query string is available to match against
		if(sQuery && sQuery !== "") {
			// First make a copy of the oParseResponse
			oParsedResponse = YAHOO.widget.AutoComplete._cloneObject(oParsedResponse);
	        
			var allResults = oParsedResponse.results, // the array of results
				filteredResults = [], // container for filtered results

			sQuery = decodeURIComponent(sQuery.toLowerCase()); 
	        
			// NEW FILTER START; 
			 
			var pattern1 = new RegExp("\\b"+sQuery, "g");
			var pattern2 = new RegExp("\\["+sQuery, "g");	// regex for location codes;
			var pattern3 = new RegExp("^"+sQuery, "g");		// default filter;	
			var pattern4 = new RegExp("^LONDON", "g");
			
			// Loop through each result object...
			for(var i = allResults.length-1; i >= 0; i--) {
                //console.log(allResults[i].Name);
				var oResult = allResults[i].Name + ' ['+allResults[i].StationCode+']';
                
				if(YAHOO.lang.isString(oResult)) {

					// try and match subsequent words if the station is in London else...;
					if(	oResult.toLowerCase().search(pattern1) != -1 &&
						oResult.toLowerCase().search(pattern4) != -1 ){
						//console.log(1, 4,oResult);
						filteredResults.unshift(oResult);
					}
					// ...try location code, these need to be prioritised, else...;
					else if( oResult.toLowerCase().search(pattern2) != -1 ){
					    //console.log(2,oResult);
						filteredResults.unshift(oResult);
					}
					// ...try start of string;
					else if( oResult.toLowerCase().search(pattern3) != -1 ){
					    //console.log(3,oResult);
						filteredResults.unshift(oResult);
					} else {};
				}
			};
			// NEW FILTER END;
			oParsedResponse.results = filteredResults;
		};
		return oParsedResponse;
	};
	
	// another override method;
	ac.formatResult = function(oResultData, sQuery, sResultMatch) {
	    var num = null;
	    //console.log(oResultData);
	    sResultMatch = sResultMatch.replace(/\[(\d{2,3})\]/g, function(m, n) {
	        num = n;
	        return '[All stations]';
	    });
        var sMarkup = '<span class="sc'+(num !== null ? num : '')+'" rel="'+(num !== null ? num : '')+'">'+sResultMatch+'</span>';
        return sMarkup;
    };	
};