            //<![CDATA[

            // String.neatTrim  trims a String down to a certain char count accounting for word boundaries
            String.prototype.neatTrim = function(n, delim){
                if (!delim)
                    delim = '...';
                if (this.length <= n)
                    return this;
                var s = this.replace(new RegExp("^(.{0," + n + "}\\b).*"), "$1" + delim);
				return s.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
            }

            var city = '';
            var pc = '';
            var d = new Object();
            var container;
            var currentCat = 0;
            var categories;
            var config;

            searchEngineURL = "/search-engine/XMLWebService.do";

            var queryString = window.location.search;
			queryString = parseQuery(queryString.substring(1,queryString.length));
            queryString.partnerId = (queryString.partnerId) ? queryString.partnerId : 'myspace';

			locString = window.location.search.toString();
			locDef = locString.indexOf("location");
			setLocation = "";
			if(locDef!=-1){
				setLocation = locString.substring(locDef+9,locDef+13);
			}

            var locString = window.location.toString();
            stagingEnvironment = false;
            if(locString.indexOf("search.stg.truelocal.com.au") != -1){
				stagingEnvironment = true;
			}

			mediaURL = "http://media.truelocal.com.au//config/ndmwidget/";
			if(stagingEnvironment){
				mediaURL = "http://media.stg.truelocal.com.au//config/ndmwidget/";
			}

			// Generic TrueLocal functions //
			debugOn = false;
			function debug(msg){
				if(debugOn){
					try {
						srcWin.document.write('\n'+msg);
					}catch(exception){
						srcWin = window.open('','srcWin');
						srcWin.document.open();
						srcWin.document.write('<xmp>'+msg);
					}
				}
			}

			function getObj(objID){
				return document.getElementById(objID);
			}

			function toggleActiveClass(linkObj){
				lnkActive = linkObj.className.indexOf("_active");
				if(lnkActive == "-1"){
					linkObj.className = linkObj.className+"_active";
				}else{
					linkObj.className = linkObj.className.substring(0,lnkActive);
				}
			}

			function doNothing(){}

			// Toggle for openning and closing the categories
			var curCategoryID = "";
			var curCatNum = 0;
			var catBuilt = false;
			var updateCall = false;

			function TL_showCategory(catID,catNum){
				if(catID!=curCategoryID){
					if(catBuilt){
						getObj(curCategoryID).style.display = "none";
						toggleActiveClass(getObj('TL_header_'+curCatNum));
					}else{
						catBuilt = true;
					}

					getObj(catID).style.display = "block";
					toggleActiveClass(getObj('TL_header_'+catNum));
					curCategoryID = catID;
					curCatNum = catNum;
				}
			}

			function TL_updateLocation(locObjValue,winEvent){
				getObj('TL_location').value = locObjValue;
			}

			function TL_catchEnterKey(winEvent){
					if(winEvent.keyCode == 13){ //Enter key pressed
						try {
							window.event.returnValue = false;
							updateAccordion();
							updateCall = true;
							return false;
						}catch(exception){}
					}
				}

            function parseQuery(q_str){
                var pairHalves;
                var queryVars = {};
                if (q_str == '')
                    return queryVars;
                var N_V_pairs = q_str.split("&");
                var l = N_V_pairs.length;
                for (var i = 0; i < l; i++) {
                    pairHalves = N_V_pairs[i].split("=");
                    queryVars[pairHalves[0]] = unescape(pairHalves[1]);
                }
                return queryVars;
            }

            function updateAccordion(){
                currentCat = 0;
                $('#TL_loading').toggle();
                $("#TL_searchAccordion").toggle();
                makeSearch(categories[currentCat].term, categories[currentCat].category);
            }

			function TL_checkAccordionStyle(){
				if(getObj('TL_header_'+curCatNum).className.indexOf("_active") == -1){
					toggleActiveClass(getObj('TL_header_'+curCatNum));
				}
			}

            function makeSearch(term, category){
                var url = 'TL_search_widget_proxy.php';
                var postData = {
                   url: searchEngineURL + '?term=' + term + '&refine=1&category=' + category + '&Type=keyword&includeServiceArea=false&partnerId=' + config.partnerId + '&location=' + $('#TL_categoryLocation').val() + '&count=' + config.resultsPerPage + '&resultsPerPage=' + config.resultsPerPage
                };
                $.post(postData.url, postData, searchCb);

				//if not using a proxy comment out the previous lines and uncomment the following lines
                //url += '?url=http://www.truelocal.com.au/XMLWebService.do?term=' + term + '&refine=1&category=' + category + '&Type=keyword&includeServiceArea=false&partnerId=' + config.apiPartner + '&location=' + $('#TL_categoryLocation').val() + '&count=' + config.resultsPerPage + '&resultsPerPage=' + config.resultsPerPage
                //$.get(url, searchCb);
            }

            function searchCb(data){
                if (data == null) {
                    $("#TL_searchAccordion").innerHTML = "no data returned--error!";
                    $("#TL_searchAccordion").toggle();
                    return;
                }

                categories[currentCat].data = data;
               	currentCat++;

                if (currentCat >= categories.length) {
                    writeData();
                }else {
                    makeSearch(categories[currentCat].term, categories[currentCat].category);
                }
            }

            function adjustAvgRating(rtgString){
				posDecimal = rtgString.indexOf(".");

				baseRating = rtgString.substring(0,posDecimal);

				ratingDecimal = rtgString.substring(posDecimal+1);
				if(ratingDecimal.length < 2){
					ratingDecimal += "0";
				}

				adjDecimal = parseInt(ratingDecimal);

				if(adjDecimal < 25){ adjRating = baseRating+"_0"; }
				if(adjDecimal > 24 && adjDecimal < 75){	adjRating = baseRating+"_5"; }
				if(adjDecimal > 75){
					adjRating = (parseInt(baseRating)+1)+"_0";
					if(adjRating == "6_0"){
						adjRating = "5_0";
					}
				}
				return adjRating;
			}


            function writeData(){
                for (var i = 0; i < categories.length; i++) {
                    var businessName = '', webSite = '', strapLine = '', phone = '', email = '';
                    var numReviews = '';
                    var avgRating = '';
                    var addressLine = '', html = '', suburb = '', postcode = '', state = '';
                    var url = '';
                    var productId = "";

                    html += '<ul class="accordionContent" id="accordion'+i+'">';

                    $('main>listing', categories[i].data).each(function(){

                        businessName = $('businessName', this).text();
                        phone = $('phoneNumber', this).text();
                        url = $('seoURL', this).text();

						productId = $('productId', this).text();

                        numReviews = "("+$('numberOfReviews', this).text()+")";
                        if(numReviews == "(0)"){
							numReviews = "";
						}

                        avgRating = adjustAvgRating($('averageRating', this).text());

                        html += '<li class="vcard">';
                        html += '<p class="lineitem"><a class="businessName" href="http://www.truelocal.com.au/business/' + url + '" target="_blank">' + businessName.neatTrim(35, '...') + '</a>';
                        html += '<span title="Rating" class="businessRating businessRating'+avgRating+'">&nbsp;</span><span title="Number of reviews" class="businessReviews">'+numReviews+'</span></p>';
                        html += '</li>';
                    });

                    //html += '<li class="moreWrap"><a class="more" href="http://truelocal.com.au/search/' + categories[i].term + '/' + $('#TL_categoryLocation').val() + '" target="_blank">FIND MORE LOCAL ' + String(categories[i].title).toUpperCase() + ' &raquo;</a></li>';
                    html += '<li class="moreWrap"><a class="more" href="http://truelocal.com.au/search/' + categories[i].term + '/' + $('#TL_categoryLocation').val() + '" target="_blank">Find more local ' + String(categories[i].title) + ' &raquo;</a></li>';
                    html += '</ul>';
                    debug(html);

                    $('#' + categories[i].id).html(html);
                }

                $('#TL_loading').toggle();
                $("#TL_searchAccordion").toggle();

                if(!updateCall){
					TL_showCategory(categories[0].id,'0');
				}else{
					catBuilt = false;
					curCatID = curCategoryID;
					curCategoryID = "";
					TL_showCategory(curCatID,curCatNum);
				}
				TL_checkAccordionStyle();
            }

            function configLoaded(){
                currentCat = 0;
                var compiledHTML = '';

				/* This part writes the headers and each of the category containers */
                for (var i = 0; i < categories.length; i++) {
					clickFunction = "javascript:TL_showCategory('"+categories[i].id+"','"+i+"')";
                    compiledHTML += '<a id="TL_header_'+i+'" class="TL_category_control" href="javascript:doNothing()" onclick="'+clickFunction+'">' + categories[i].title + '</a><div class="TL_category_div" id="' + categories[i].id + '"></div>';
                    if(i<categories.length-1){	compiledHTML += '<br/>'; }
                }

                // add accordion headers
                $("#TL_searchAccordion").html(compiledHTML);

                // update tracking param
                $('#TL_cmp').val(config.trackingParam);

				// set location
				if(setLocation == ""){
					$('#TL_categoryLocation').val(config.defaultPostCode);
					$('#TL_location').val(config.defaultCity + ' ' + config.defaultPostCode);
				}else{
					$('#TL_categoryLocation').val(setLocation);
					$('#TL_location').val(setLocation);
				}

				if(config.altCSS != ""){
					newCSS = document.createElement("link");
					newCSS.rel = "stylesheet";
					newCSS.href = config.altCSS;
					newCSS.type = "text/css";
					var headObj = document.getElementsByTagName("head")[0];
					headObj.appendChild(newCSS);
				}

               	updateAccordion();
           }

            $(function(){

                $('#TL_loading').toggle();

                $('#TL_updateButton').click(function(){
                    updateAccordion();
                    updateCall = true;
                    return false;
                });

                $('.TL_input_text').focus(function(){
                    textFieldValue = $(this).val();
                    $(this).val('');
                });
                $('.TL_input_text').bind("unfocus", function(){
                    if ($(this).val() == '')
                        $(this).val(textFieldValue);
                });

				$.getScript(mediaURL+"TL_search_widget_config_" + queryString.partnerId + ".js", configLoaded);

                //$.getJSON(mediaURL+"TL_search_widget_config_" + queryString.partnerId + ".js", configLoaded);
            });
            //]]>
