(function( $ ){
	var methods = {
		init : function ( options ) { 
			if ($(this).length == 0) {
				console.log("Ocodes search failed to initialise: selector not found: " + this);
				return false;
			}
			
			// Create some defaults, extending them with any options that were provided
			var settings = $.extend( {
				'cssprefix'		: 'ocodes-',
				'phonenumber'	: '62626',
				'baseurl'		: 'http://ocod.es/json/',
				'defaulttext'	: 'Enter O-code...',
			}, options);

			var htmlStr = '<form action="" class="ocodeswidget">' +
				'<span class="' + settings.cssprefix + 'search-img-left"> </span>' +
				'<input type="text" class="' + settings.cssprefix + 'search-text toggle" value="' + settings.defaulttext + '" title="Enter the O-code to jump to" />' + 
				'<span class="' + settings.cssprefix + 'search-img-right"> </span>' +
				'<input type="submit" class="' + settings.cssprefix + 'search-submit" value="GO" />' +
				'</form>';
						
			return this.each(function(){
				
				var $this = $(this),
					data = $this.data('ocodeswidget');
				
				$this.html(htmlStr);
				
				var searchForm = $this.find('form.ocodeswidget');
				searchForm.bind("submit", function () { $this.ocodeswidget('search'); return false; });
				var textField = $this.find('input.' + settings.cssprefix + 'search-text');
				textField.bind("focus", function () { $this.ocodeswidget('focusSearch'); });
				textField.bind("blur", function () { $this.ocodeswidget('blurSearch'); });
				
				// If the plugin hasn't been initialized yet
				if ( ! data ) {					
					$(this).data('ocodeswidget', {
						target : $this,
						phonenumber	: settings.phonenumber,
						baseurl		: settings.baseurl,
						defaulttext	: settings.defaulttext,
						textField	: textField
					});					
				}
				
			});
			
		},
		
		focusSearch : function () {
			var $this = $(this),
				data = $this.data('ocodeswidget'),
				searchval = data.textField.val();
			if (searchval == '' || searchval == data.defaulttext) {
				data.textField.removeClass("toggle"); 
				data.textField.val("");
			}
		},

		blurSearch : function () {
			var $this = $(this),
				data = $this.data('ocodeswidget'),
				searchval = data.textField.val();
			if (searchval == '' || searchval == data.defaulttext) {
				data.textField.addClass("toggle"); 
				data.textField.val(data.defaulttext);
			}
		},
		
		search : function () {
			var $this = $(this),
				data = $this.data('ocodeswidget'),
				searchval = data.textField.val();
			
			if (searchval == '' || searchval == data.defaulttext) {
				alert("Please enter a code to search for.");
				return;
			}
			
			$.ajax({
				type: "POST",
				url: data.baseurl,
				data: { codestr : searchval, phone: data.phonenumber, _submit : 'Submit', _submitted_url : 1 },
				cache: true,
				//xhrFields: { withCredentials: true },
				dataType: "jsonp",
				success: function(data) { $this.ocodeswidget('searchresult', data); },
				error: function (jqXHR, textStatus, errorThrown) {
					console.log(" loading error: " + textStatus + " : " + errorThrown);
					return false;
				}
			})			
		},

		searchresult : function ( data ) {
			if (data.error) {
				alert(data.errortxt);
			}
			else {
				window.location = data.coderedirect;
			}
		}
	};
	
	$.fn.ocodeswidget = function( method ) {
	
		// Method calling logic
		if ( methods[method] ) {
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
		} else if ( typeof method === 'object' || ! method ) {
			return methods.init.apply( this, arguments );
		} else {
			$.error( 'Method ' +  method + ' does not exist on jQuery.ocodeswidget' );
		}
	};
})( jQuery );
