/**
 * Ajax Queue Plugin
 * 
 * Homepage: http://jquery.com/plugins/project/ajaxqueue
 * Documentation: http://docs.jquery.com/AjaxQueue
 */
(function($) {
	var ajax = $.ajax;
	var pendingRequests = {};
	
	$.ajax = function(settings) {
		settings = jQuery.extend(
			settings, 
			jQuery.extend(
				{}, 
				jQuery.ajaxSettings, 
				settings
			)
		);	
		var port = settings.port;
		
		switch(settings.mode) {
			case "abort": 
				if ( pendingRequests[port] ) {
					pendingRequests[port].abort();
				}
				return pendingRequests[port] = ajax.apply(this, arguments);
			case "queue": 
				var _old = settings.complete;
				settings.complete = function(){
					if ( _old )
						_old.apply( this, arguments );
					jQuery([ajax]).dequeue("ajax" + port );
				};
				
				jQuery([ ajax ]).queue("ajax" + port, function(){
					ajax( settings );
				});
				return;
			case "dequeue": 
				jQuery([ajax]).dequeue("ajax" + port );
				return;
		}
		return ajax.apply(this, arguments);
	};
	
})(jQuery);

(function($) {
	$.twse = function() {
		var $searchTimeout 	= undefined;
		var $input 			= $('#searchForm .search');

		// Prepare loading
		$('#topBar .languages ul').prepend(loaderHTML);
		$('#loading').hide();
		
		// Look for suggestions when typing keywords
		$input.bind('keyup', function(event) {
			// Remove precedent timeout
			if($searchTimeout != undefined) {
            	clearTimeout($searchTimeout);
			}
        
			$searchTimeout = setTimeout(function() {
                $searchTimeout = undefined;
                
                var inputVal = $input.val().replace(/^\s+/g,'').replace(/\s+$/g,'');
                
                if(currentKeywords == inputVal)
                	return;
                	
               	currentKeywords = inputVal;
                	
                // Put loading
                $('#loading').show();
                
                // Request JSON Suggestions
                $.ajax({
                	mode: 'abort',
                	port: 'ajaxSuggestions',
                	type: 'POST',
					url: ajaxSuggestionsURI,
					data: {
						'keywords': inputVal
					},
					dataType: 'json',
					success: function(msg){
						parseSuggestions(msg);
						$('#loading').hide();
					}
				});
        	}, 500);
		});
		
		// Switch suggestions
		$('#searchForm .suggestions span').live("click", function(){
		  	if($(this).hasClass('active'))
  			{
  				$(this).removeClass('active');
  				$('#searchForm .suggestions input[name=suggestions[' + $(this).text() + ']]').val('0');
  				
  				currentSuggestions[$(this).text()] = 0;
  			}
  			else
  			{
  				$(this).addClass('active');
  				$('#searchForm .suggestions input[name=suggestions[' + $(this).text() + ']]').val('1');
  				
  				currentSuggestions[$(this).text()] = 1;
  			}
		});
		
		// Load Whois
		var $dt = $('#results dt');
		if($dt.length > 0)
		{
			$dt.each(function(){
				var $this = this;
				var $span = $('span', this);
				var $domain = $('input[name=domain]', this).val();
				var $extension = $('input[name=extension]', this).val();
				
				if($span.hasClass('loading'))
				{
					$.ajax({
	                	mode: 'queue',
	                	port: 'ajaxWhois',
	                	type: 'POST',
						url: ajaxWhoisURI,
						data: {
							'domain': $domain,
							'extension': $extension
						},
						dataType: 'json',
						beforeSend: function()
						{
							$('#loading').show();
						},
						success: function(msg){
							if(msg['available'] == true)
							{
								$span.html(ajaxWhoisAvailableIMG)
									 .removeClass('loading')
									 .addClass('available');
						 		$($this).next('dd').html(ajaxWhoisAvailable);
							}
							else
							{
								var moreWhoisLink = '';
								
								$span.html(ajaxWhoisUnavailableIMG)
									 .removeClass('loading')
									 .addClass('unavailable');
						 		$($this).next('dd').html(moreWhoisLink + ajaxWhoisUnavailable);
							}
							$('#loading').hide();
						}
					});
				}
			});
			
			$.ajax({ mode: 'dequeue', port: 'ajaxWhois' });
		}
	};

	function parseSuggestions(suggestions)
	{
		var $suggestions 	= $('#searchForm .suggestions');
		var $suggestionsUl 	= $('#searchForm .suggestions ul');
		
		$('#searchForm .suggestions ul li, #searchForm .suggestions input').remove();
		
		jQuery.each(suggestions, function(k, v) {
			if(currentSuggestions[k] == 1)
				v = 1;
			
			$suggestions.append('<input type="text" name="suggestions[' + k + ']" value="' + v + '" />');
			$suggestionsUl.append('<li><span class="' +( (v == 0) ? '': 'active')+ '">' + k + '</span></li>');
		});
		
		
		if($('#searchForm .suggestions li').length == 0)
		{
			$('#searchForm .suggestions ul').prepend(ajaxNoSuggestion);
		}
		$('#searchForm .suggestions input').hide();
	}
	
	function in_array (needle, haystack, argStrict) {
	    var key = '', strict = !!argStrict;
	
	    if (strict) {
	        for (key in haystack) {
	            if (haystack[key] === needle) {
	                return true;
	            }
	        }
	    } else {
	        if (typeof(needle)=='string') {
	            str = haystack.toString();
	            return (str.search(needle) !== false);
	        }
	
	        for (key in haystack) {
	            if (haystack[key] == needle) {
	                return true;
	            }
	        }
	    }
	
	    return false;
	}


	function debug($obj) {
		if (window.console && window.console.log)
			window.console.log($obj);
	};
})(jQuery);