V4.Search = function() {

    var site = '';
    var initHeaderSearchBar = function() {
        $U.addPlaceholderText($('#v4SearchText'),"search");
        $('#v4SearchText').focus(showSearch)
                .autocomplete({
            source: dataSource,
            minLength: 1, // Minimum number of characters
            delay: 0, // Delay (ms) after typing
            appendTo: "#v4SearchResults",
            select: selectHandler,
            search: function() {
                $('#v4Search').addClass('hideControls');
            },
            close: function() {
                $('#v4Search').removeClass('hideControls');
            }
        })
                .data("autocomplete")
                ._renderItem = listRenderer;

        $('#v4SearchText').data("autocomplete")._renderMenu = menuRenderer;

        $('#v4Search input[name="searchSwitch"]').click(function() {
            site = $(this).val();
            var formAction = (site == 'v4') ? '/4viewers/search' : '/search/';
            var queryParam = (site == 'v4') ? 'freeText' : 'q';
            $('#v4SearchForm').attr('action', formAction);
            $('#v4SearchText').attr('name', queryParam);
            $('#v4SearchText').autocomplete('close').autocomplete('search');
        });
        $('#searchSwitchv4').attr('checked', 'checked');
        site = $('#v4Search input[name="searchSwitch"]:checked').val();
    };
    var init = function() {
        initHeaderSearchBar();
    };
    var showSearch = function() {
        if (!$('#v4Search').hasClass('active')) {
            $(this).val(($(this).val() == 'Search') ? '' : $(this).val());
            $('#v4Search').addClass('active');
            $('html').click(hideSearch);
        }
    };

    var hideSearch = function(e) {
        if ($(e.target).parents('#v4Search').length == 0) {
            $('#v4Search').removeClass('active');
            $('html').unbind('click', hideSearch);
            $('#v4SearchText').focus(showSearch);
        }
    };


    var menuRenderer = function(ul, items) {
        var self = this;
        $.each(items, function(index, item) {
            if (index < 5) {
                self._renderItem(ul, item);
            }
        });
    };

    var listRenderer = function(ul, item) {
        return $("<li></li>")
                .data("item.autocomplete", item)
                .append('<a>' + item.label + '</a>')
                .appendTo(ul);
    };

    var selectHandler = function(event, ui) {
        $U.redirectTo(ui.item.url);
    };

    var dataSource = function(request, response) {
        var url, data;
        if (site == 'v4') {
            return [];
        } else {
            // for local           url = "http://int.channel4.com/search/predictive/";
            url = "/search/predictive/";
            data = "q=" + (("term" in request) ? request.term : "");
            //            data = {"results": [{"imgUrl":"/assets/programmes/images/james-browns-supermodel-salon/f760faa5-dd95-4f55-bb85-292465c15140_60x34.jpg", "value": "James Brown\'s Supermodel Salon", "siteUrl":"http://www.channel4.com/programmes/james-browns-supermodel-salon"},
            //                                {"imgUrl":"/assets/programmes/images/jamie-cooks-christmas/jamie-cooks-christmas_60x34.jpg", "value": "Jamie Cooks Christmas", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamie-cooks-christmas/jamie-cooks-christmas-08-12-09_p_1.html"},
            //                                {"imgUrl":"/assets/programmes/images/jamie-does/9fb153ff-9998-4b20-acc0-84faa38e84f6_60x34.jpg","value": "Jamie Does...", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamie-does/"},
            //                                {"imgUrl":"/assets/programmes/images/jamie-oliver-eat-to-save-your-life/jamie-oliver-eat-to-save-your-life_60x34.jpg","value": "Jamie Oliver: Eat to Save Your Life", "siteUrl":"http://www.channel4.com/food/on-tv/the-big-food-fight/eat-to-save-your-life-07-12-18_p_1.html"},
            //                                {"imgUrl":"/assets/programmes/images/jamie-saves-our-bacon/jamie-saves-our-bacon_60x34.jpg","value": "Jamie Saves Our Bacon", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamie-saves-our-bacon/"},
            //                                {"imgUrl":"/assets/programmes/images/jamie-at-home/jamie-at-home_60x34.jpg","value": "Jamie at Home", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamie-at-home/"},
            //                                {"imgUrl":"/assets/programmes/images/jamie-at-home-christmas-special/e4f48596-7977-4543-a291-b220bbfb5356_60x34.jpg","value": "Jamie at Home Christmas Special", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamie-at-home/"},
            //                                {"imgUrl":"/assets/programmes/images/jamies-30-minute-meals/4f40f286-2540-4750-80a8-3242f26ff9b3_60x34.jpg","value": "Jamie\'s 30-Minute Meals", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamie-s-30-minute-meals/index.html"},
            //                                {"imgUrl":"/assets/programmes/images/jamies-american-food-revolution/53b22e28-1c16-4a7f-9517-964d5e23d417_60x34.jpg","value": "Jamie\'s American Food Revolution", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamie-s-american-food-revolution/"},
            //                                {"imgUrl":"/assets/programmes/images/jamies-american-road-trip/96dd9d49-cb0e-42db-9883-e15395f87f74_60x34.jpg","value": "Jamie\'s American Road Trip", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamies-american-road-trip/"},
            //                                {"imgUrl":"/assets/programmes/images/jamies-family-christmas/ba036dbb-04cd-4257-964d-1744483c6007_60x34.jpg","value": "Jamie\'s Family Christmas", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamie-s-family-christmas_p_1.html"},
            //                                {"imgUrl":"/assets/programmes/images/jamies-fowl-dinners/jamies-fowl-dinners_60x34.jpg","value": "Jamie\'s Fowl Dinners", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamies-fowl-dinners/index.html"},
            //                                {"imgUrl":"/assets/programmes/images/jamies-great-escape/jamies-great-escape_60x34.jpg","value": "Jamie\'s Great Escape", "siteUrl":"http://www.channel4.com/food/on-tv/jamie-oliver/jamies-great-escape/index.html"},
            //                                {"imgUrl":"/assets/programmes/images/jamies-kitchen/ecb37dd2-b49d-4acf-a304-6beb89ad291c_60x34.jpg","value": "Jamie\'s Kitchen", "siteUrl":"http://www.channel4.com/life/microsites/J/jamie/index.html"},
            //                                {"imgUrl":"/assets/programmes/images/jamies-ministry-of-food/jamies-ministry-of-food_60x34.jpg","value": "Jamie\'s Ministry of Food", "siteUrl":"http://www.jamiesministryoffood.com/content/c4/home.html"}
            //                                ]};
            //        }

            $.ajax({
                url: url,
                data: data,
                dataType: 'text',
                success: function(data) {
                    if (data) {
                        data = eval('(' + data + ')');
                        if ("results" in data) {
                            var results = data.results;
                            if (typeof results == "object") {
                                var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
                                response($.map(results, function(item, index) {
                                    if (!request.term || matcher.test(item.value))
                                        return {
                                            label: '<img src="' + item.imgUrl + '" /><p>' + item.value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(request.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>") + '</p>',
                                            value: item.value,
                                            url: item.siteUrl
                                        };
                                }));
                            }
                        }
                    }

                }
            });
        }
    };

    var predictiveFaqInit = function(element) {
        element.attr('autocomplete','off');

        $('<div id="faqPredictiveResults"></div>').appendTo(element.parents('.searchBar'));

        element.autocomplete({
            source: faqDataSource,
            minLength: 0, // Minimum number of characters
            delay: 0, // Delay (ms) after typing
            appendTo: "#faqPredictiveResults",
            select: selectHandler,
            position: {
                my : "left top",
                at: "left bottom",
                collision:"flip"
            }
        })
        .data("autocomplete")
        ._renderItem = listRenderer;

        element.data("autocomplete")._renderMenu = menuRenderer;
    };

    var faqData;

    var faqDataSource = function(request, response) {
        var renderResults = function(results) {
            var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), "i");
            response($.map(results, function(item, index) {
                if (!request.term || matcher.test(item.displayText))
                    return {
                        label: '<p>' + item.displayText.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + $.ui.autocomplete.escapeRegex(request.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>") + '</p>',
                        value: item.displayText,
                        url: item.url
                    };
            }));
        };
        if(faqData){
            return renderResults(faqData);
        }
        var url = "/4viewers/faq/search/predictive/";
        $.ajax({
            url: url,
            success: function(data) {
                if (data) {
                    data = eval(data);
                    if (typeof data == "object") {
                        faqData=data;
                        return renderResults(faqData);
                    }
                }

            }
        });
    };

    return {
        init: init,
        predictiveFaqInit:predictiveFaqInit
    };
}();
