/*
 * Juna Google Search 0.2
 * By Juna (http://www.juna.nl)
 * Copyright (c) 2011 Juna
 * 
 * Fixes: version 0.2 displays the text no results for query instead of undefined results for query
*/
(function($) {
    $.fn.junaGoogleSearch = function(options) {
        var defaults = {
            url : 'juna.nl',
            query : null,
            start : 0,
            replaceElement : '#GoogleSearchResults',
	        previousText : 'previous',
	        nextText : 'next',
	        noResultsText : 'No results for',
	        resultCountText : 'results for',
            loadingImage : 'img.GoogleSearchLoader',
            page : 'Default.html',
			resultsPerPage : 4,
			googleEventTracking : null
        };
        
        var options = $.extend(defaults, options);
        
        return this.each(function() {
            var el = $(this);
			var debug = true;

            //google.load('search', '1'); UNCOMMENT
            
            var loadSearchFromHash = function() {
                var request = window.location.hash.split('&');
                
                options.start = 0;
            
                for (i = 0; i < request.length; i++) {
                    var item = request[i].split('=');
                    item[0] = item[0].replace('#', '');
                    item[1] = decodeURI(item[1]);
            
                    if (item[0] == 'q') {
                        if (item[1] == options.query) {
                            return false;
                        }
                        options.query = item[1];
                    }
            
                    if (item[0] == 'url') {
                        options.url = item[1];
                    }
            
                    if (item[0] == 'start') {
                        options.start = parseInt(item[1]);
                    }
                }
            
                if (options.query != undefined || options.query != null) {
                    search(options.query, options.url, options.start);
					setInterval(loadSearchFromHash, 100);
                }
            }
            
            var search = function(query, searchUrl, start) {
                $(options.loadingImage).show();
            
                if (start == undefined) start = 0;
                var url = "http://ajax.googleapis.com/ajax/services/search/web?q=site:" + searchUrl + "+" + encodeURIComponent(query) + "&v=1.0&rsz=" + options.resultsPerPage + "&start=" + start;
            
                window.location.hash = 'start=' + start + '&q=' + encodeURIComponent(query) + '&url=' + encodeURIComponent(searchUrl);
            
                el.find('#q').val(query);
            
                $$ = $(options.replaceElement);
            
                $.getJSON(url + '&callback=?', function (data) {
                    if (data.responseData != null) {
            
                        $$.html('');
						
						if ( options.googleEventTracking == 'old' ) {
							pageTracker._trackEvent('Google Search', 'Search', query, data.responseStatus);
						}
						if ( options.googleEventTracking == 'new' ) {
							_gaq.push(['_trackEvent', 'Google Search', 'Search', query, data.responseStatus]);
						}
            
                        var results = data.responseData.results;
                        var pages = data.responseData.cursor.pages;
            
						$$.append('<p class="GoogleSearchResultCount">' + ( typeof( data.responseData.cursor.estimatedResultCount ) !== 'undefined' ? data.responseData.cursor.estimatedResultCount + ' ' + options.resultCountText : options.noResultsText ) + ' <strong>' + query + '</strong></p>');
            
                        for (var i = 0; i < results.length; i++) {  
                            $$.append('<div class="GoogleSearchResult">'
                                + '<p class="GoogleSearchResultTitle"><a href="' + decodeURI(results[i].unescapedUrl) + '">' + decodeURI(results[i].title) + '</a></p>'
                                + '<p class="GoogleSearchResultContent">' + results[i].content + '</p>'
                                + '<p class="GoogleSearchResultLink"><a href="' + decodeURI(results[i].unescapedUrl) + '">' + decodeURI(results[i].unescapedUrl) + '</a></p>'
                                + '</div>');
                        }
            
                        var data = '<div class="GoogleSearchPages">';
                        for (var i = 0; i < pages.length; i++) {
                            if (start != 0 && i == 0) {
                                data += '<a href="javascript:;" id="' + parseInt(start - options.resultsPerPage) + '">' + options.previousText + '</a>';
                            }
                            else if (i == 0) {
                                data += '<span class="disabled">' + options.previousText + '</span>';
                            }
            
                            if (start == pages[i].start) {
                                data += '<span class="current">' + pages[i].label + '</span>';
                            }
                            else {
                                data += '<a href="javascript:;" id="' + pages[i].start + '">' + pages[i].label + '</a>';
                            }
            
                            if (i + 1 == pages.length && start != pages[i].start) {
                                data += '<a href="javascript:;" id="' + parseInt(start + options.resultsPerPage) + '">' + options.nextText + '</a>';
                            }
                            else if (i + 1 == pages.length) {
                                data += '<span class="disabled">' + options.nextText + '</span>';
                            }
                        }
                        data += '</div>';
            
                        $$.append(data);
                    }
                    else {
						var error;
						if ( data.responseStatus == 200 || debug == false ) {
							error = '' + options.noResultsText + ' <strong>' + query + '<strong>.';
						}
						else {
							error = 'Status: <strong>' + data.responseStatus + '</strong> Details: <strong>' + data.responseDetails + '</strong>';
						}
						$$.html('<div class="error" id="GoogleSearchError">' + error + '</div>');
                    }
					
					$('.GoogleSearchPages a').click(function() {
						var start = parseInt($(this).attr('id'));
						search(options.query, options.url, start);
						
						return false;
					});
            
                    $(options.loadingImage).hide();
                });
            }
            
            loadSearchFromHash();
            
            el.find('#adiform_submit').click(function () {
                var q = el.find('#q').val();
        
                window.location.href = options.page + '#q=' + escape(q) + '&start=0&url=' + escape(options.url);
				
				loadSearchFromHash();
                
                return false;
            });
        
            el.find('#q').keypress(function (e) {
                var keyCode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
        
                if (keyCode == 13) {
                    var q = el.find('#q').val();
        
                    window.location.href = options.page + '#q=' + escape(q) + '&start=0&url=' + escape(options.url);
					
					loadSearchFromHash();
        
                    return false;
                } else {
                    return true;
                }
            });
        });
    };
})(jQuery);
