(function($){

	jQuery.fn.dataTableExt.oSort['currency-asc'] = function(a,b) {
		/* Remove any commas (assumes that if present all strings will have a fixed number of d.p) */
		var x = a == "-" ? 0 : a.replace( /,/g, "" );
		var y = b == "-" ? 0 : b.replace( /,/g, "" );
		
		/* Remove the currency sign */
		x = x.substring( 1 );
		y = y.substring( 1 );
		
		/* Parse and return */
		x = parseFloat( x );
		y = parseFloat( y );
		return x - y;
	};

	jQuery.fn.dataTableExt.oSort['currency-desc'] = function(a,b) {
		/* Remove any commas (assumes that if present all strings will have a fixed number of d.p) */
		var x = a == "-" ? 0 : a.replace( /,/g, "" );
		var y = b == "-" ? 0 : b.replace( /,/g, "" );
		
		/* Remove the currency sign */
		x = x.substring( 1 );
		y = y.substring( 1 );
		
		/* Parse and return */
		x = parseFloat( x );
		y = parseFloat( y );
		return y - x;
	};

	$.fn.WineSearcherWidget = function(params) {

		var settings = jQuery.extend({
			winename: true,
			vintage: true,
			keyword_mode: true,
			widesearch: true,
			location: true,
			ip: true,
			currencycode: true,
			autoexpend: true,
			winecount: true,

			keyword_mode_options:{
				A:'Default',
				X:'Exact Match',
				U:'Exclude Autions',
				T:'Auctions Only'
			},

			widesearch_options:{
				N:'Default',
				Y:'Wide Search',
				V:'Valuation'
			},

			location_options :{
				'ANY':'All countries',
				'world-wide-delivery':'World-Wide Delivery',
				'USA':'USA',
				'Europe':'Europe',
				'UK':'UK',
				'Andorra':'Andorra',
				'Argentina':'Argentina',
				'Australia':'Australia',
				'Austria':'Austria',
				'Barbados':'Barbados',
				'Belgium':'Belgium',
				'Bermuda':'Bermuda',
				'Bolivia':'Bolivia',
				'Brazil':'Brazil',
				'British Virgin Is.':'British Virgin Is.',
				'Bulgaria':'Bulgaria',
				'Canada':'Canada',
				'Cayman Islands':'Cayman Islands',
				'Chile':'Chile',
				'China':'China',
				'Costa Rica':'Costa Rica',
				'Croatia':'Croatia',
				'Cyprus':'Cyprus',
				'Czech Republic':'Czech Republic',
				'Denmark':'Denmark',
				'Dominican Republic':'Dominican Republic',
				'Estonia':'Estonia',
				'Finland':'Finland',
				'France':'France',
				'French West Indies':'French West Indies',
				'Germany':'Germany',
				'Greece':'Greece',
				'Guernsey':'Guernsey',
				'Hong Kong':'Hong Kong',
				'Hungary':'Hungary',
				'Iceland':'Iceland',
				'India':'India',
				'Ireland':'Ireland',
				'Israel':'Israel',
				'Italy':'Italy',
				'Japan':'Japan',
				'Jersey':'Jersey',
				'Lebanon':'Lebanon',
				'Liechtenstein':'Liechtenstein',
				'Lithuania':'Lithuania',
				'Luxembourg':'Luxembourg',
				'Macau':'Macau',
				'Malaysia':'Malaysia',
				'Malta':'Malta',
				'Martinique':'Martinique',
				'Mexico':'Mexico',
				'Monaco':'Monaco',
				'Nepal':'Nepal',
				'Netherlands':'Netherlands',
				'Netherlands Antilles':'Netherlands Antilles',
				'New Zealand':'New Zealand',
				'Norway':'Norway',
				'Panama':'Panama',
				'Peru':'Peru',
				'Philippines':'Philippines',
				'Poland':'Poland',
				'Portugal':'Portugal',
				'Romania':'Romania',
				'Russia':'Russia',
				'Singapore':'Singapore',
				'Slovakia':'Slovakia',
				'Slovenia':'Slovenia',
				'South Africa':'South Africa',
				'South Korea':'South Korea',
				'Spain':'Spain',
				'Sri Lanka':'Sri Lanka',
				'Sweden':'Sweden',
				'Switzerland':'Switzerland',
				'Taiwan':'Taiwan',
				'Thailand':'Thailand',
				'Turkey':'Turkey',
				'Ukraine':'Ukraine',
				'United Arab Emirates':'United Arab Emirates',
				'Uruguay':'Uruguay',
				'US Virgin Islands':'US Virgin Islands'
			},

			currency_options:{
				'USD':'US Dollar',
				'ARS':'Argentinian Peso',
				'AUD':'Australian Dollar',
				'BRL':'Brazilian Real',
				'CAD':'Canadian Dollar',
				'CLP':'Chilean Peso',
				'CNY':'Chinese Yuan',
				'CZK':'Czech Koruna',
				'DKK':'Danish Krone',
				'EUR':'Euro',
				'HKD':'Hong Kong Dollar',
				'HUF':'Hungarian Forint',
				'INR':'Indian Rupee',
				'ILS':'Israeli New Shekel',
				'MYR':'Malaysia Ringgit',
				'MXN':'Mexican Peso',
				'NOK':'Norwegian Kroner',
				'NZD':'NZ Dollar',
				'PHP':'Philippine Peso',
				'PLN':'Polish Zloty',
				'RON':'Romania New Lei',
				'RUB':'Russian Rouble',
				'ZAR':'SA Rand',
				'SGD':'Singapore Dollar',
				'KRW':'South Korean Won',
				'SEK':'Swedish Krone',
				'CHF':'Swiss Franc',
				'THB':'Thai Baht',
				'TRY':'Turkish Lira',
				'GBP':'UK Pound',
				'UAH':'Ukranian Hryvnia',
				'JPY':'Yen'
			},

			default_winename:false,
			default_vintage:false,
			default_keyword_mode:'A',
			default_widesearch:'Y',
			default_location:'UK',
			default_ip:false,
			default_currencycode:'GBP',
			default_autoexpend:false,
			default_winecount:false,
			
			preRender:function(){},
			loadingAnimation:'/images/ajax-loader.gif',
			postRender:function(table){},
			
			draw_winename: function(){
				var html = $('<p><label>winename:</label><input type="text" name="Xwinename" class="Xwinename" /></p>');
				return html;
			},
			draw_vintage: function(){
				var html = $('<p><label>vintage:</label><input type="text" name="Xvintage" class="Xvintage" /></p>');
				return html;
			},
			draw_keyword_mode: function(){
				var html = $('<p><label>keyword_mode:</label></p>');
				var select = $('<select name="Xkeyword_mode" class="Xkeyword_mode" />');
				
				for(key in this.keyword_mode_options)
					select.append($('<option value="'+key+'">'+this.keyword_mode_options[key]+'</option>'));
					
				html.append(select);
				return html;
			},
			draw_widesearch: function(){
				var html = $('<p><label>widesearch:</label></p>');
				var select = $('<select name="Xwidesearch" class="Xwidesearch" />');
				
				for(key in this.widesearch_options)
					select.append($('<option value="'+key+'">'+this.widesearch_options[key]+'</option>'));
					
				html.append(select);
				return html;
			},
			draw_location: function(default_location){
				var html = $('<p><label>location:</label></p>');
				var select = $('<select name="Xlocation" class="Xlocation" />');
				
				for(key in this.location_options){
					var option = $('<option value="'+key+'">'+this.location_options[key]+'</option>');
					if(key==default_location)
						option.attr('selected',true);
					select.append(option);
				}
					
				html.append(select);
				return html;
			},
			draw_ip: function(){
				var html = $('<p>ip:<input type="text" name="Xip" class="Xip" /></p>');
				return html;
			},
			draw_currencycode: function(default_currencycode){
				var html = $('<p><label>currencycode:</label></p>');
				var select = $('<select name="Xcurrencycode" class="Xcurrencycode" />');
				
				for(key in this.currency_options){
					var option = $('<option value="'+key+'">'+this.currency_options[key]+'</option>');
					if(key==default_currencycode)
						option.attr('selected',true);
					select.append(option);
				}
					
				html.append(select);
				return html;
			},
			draw_autoexpend: function(){
				var html = $('<p><label>autoexpend:</label><input type="text" name="Xautoexpend" class="Xautoexpend" value="Y"/></p>');
				return html;
			},
			draw_winecount: function(){
				var html = $('<p><label>winecount:</label><input type="text" name="Xwinecount" class="Xwinecount" /></p>');
				return html;
			},
			draw_submit: function(){
				var html = $('<input type="submit" value="Submit" />');
				return html;
			},
			search_using:$.WineSearcherQuery
		}, params);

		return this.each(function(index,element){
			var self = $(this);
		
			var e = 
				$('<form>')
					.attr('action','wine-select-api.php')
					.attr('method','get');
						
			e.append($('<input type="hidden" name="Xaffiliate" class="Xaffiliate" value="wine-valuation" />'));
			e.append($('<input type="hidden" name="Xformat" class="Xformat" value="J" />'));
			
			if(settings.winename) e.append(settings.draw_winename());
			if(settings.vintage) e.append(settings.draw_vintage());
			if(settings.keyword_mode) e.append(settings.draw_keyword_mode());
			if(settings.widesearch) e.append(settings.draw_widesearch());
			if(settings.location) e.append(settings.draw_location(settings.default_location));
			if(settings.state) e.append(settings.draw_state());
			if(settings.ip) e.append(settings.draw_ip());
			if(settings.currencycode) e.append(settings.draw_currencycode(settings.default_currencycode));
			if(settings.autoexpend) e.append(settings.draw_autoexpend());
			if(settings.winecount) e.append(settings.draw_winecount());

			e.append(settings.draw_submit());

			e.submit(function(){

				queryParams = {};

				e.find('select,input').each(function(i,el){
					var el = $(el);
					queryParams[el[0].name] = el.val();
				}); 
				
				self.find('.wine-searcher-result').remove();
				var result = $('<div class="wine-searcher-result"></div>');
				if(settings.loadingAnimation){
					result.append($('<img src="'+settings.loadingAnimation+'" />'));
				}
				self.append(result);

				queryParams.success = function(data){
					result.empty();
					result.WineSearcherDrawResults({
						data:jQuery.parseJSON(data),
						postRender:settings.postRender
					});
				};
				
				var data = $.WineSearcherQuery(queryParams);

				return false;
			});

			$(this).append(e);
		});
	};
	
	$.WineSearcherQuery = function(params) {

		var settings = jQuery.extend({
			url:"wine-select-api.php",
			
			Xformat:'J',
			Xaffiliate:'wine-valuation',
			Xwinename: 'Petrus',
			Xvintage: false,
			Xkeyword_mode: false,
			Xwidesearch: false,
			Xlocation: false,
			Xip: false,
			Xcurrencycode: false,
			Xautoexpend: false,
			Xwinecount: false,
			
			success: function(data){}
		}, params);
		
		var queryParams = {
			Xformat:settings.Xformat,
			Xaffiliate:settings.Xaffiliate,
			Xwinename:settings.Xwinename,
			Xvintage:settings.Xvintage,
			Xkeyword_mode:settings.Xkeyword_mode,
			Xwidesearch:settings.Xwidesearch,
			Xlocation:settings.Xlocation,
			Xip:settings.Xip,
			Xcurrencycode:settings.Xcurrencycode,
			Xautoexpend:settings.Xautoexpend,
			Xwinecount:settings.Xwinecount
		}
		
		$.ajax({
			url: settings.url,
			data: $.BuildQueryString(queryParams),
			success: settings.success
		});

	}
	
	$.fn.WineSearcherDrawResults = function(params){
	
		var settings = jQuery.extend({
			data:{},
			postRender:function(){},
			branchDraw:function(obj,depth){
				if(!depth) depth=0;
				var html=''
				for(key in obj){
					if(jQuery.isArray(obj[key]) || jQuery.isPlainObject(obj[key]))
					{
						html += key+'={';
						html += this.branchDraw(obj[key],depth+1);
						html += '}';
					}
					else
						html += '<p>'+key+' => '+obj[key]+'</p>';
				}
				return html;
			},
			drawVintages:function(vintages){
				var html = $('<tbody></tbody>');
				for(key in vintages)
				{
					var vintage = vintages[key]['wine-vintage'];
					var row = $(
					'<tr>'+
						//'<td><a target="blank" href="'+vintage['vintage']+'">'+vintage['vintage']+'</td>'+
						'<td>'+vintage['vintage']+'</td>'+

						'<td>&pound;'+(vintage['price-average']?vintage['price-average']:0)+'</td>'+
						'<td>&pound;'+(vintage['price-min']?vintage['price-min']:0)+'</td>'+
						'<td>&pound;'+(vintage['price-max']?vintage['price-max']:0)+'</td>'+
					'</tr>');
					
					/*row.find('a').click(function(){
						var e = $(this);
						e.closest('.wine-searcher-container').find('.Xvintage').val(e.attr('href'));
						return false; 
					});*/
					
					html.append($(row));
				}
				return html;
			},
			drawNames:function(names){
				var html = $('<tbody></tbody>');
				for(key in names)
				{
					var name = names[key]['name'];
					var row = $(
					'<tr>'+
						'<td>'+name['wine-name']+'</td>'+
						'<td>'+name['display-name']+'</td>'+
						'<td>'+name['region']+'</td>'+
						'<td>'+name['grape']+'</td>'+
						'<td>&pound;'+(name['price-average']?name['price-average']:0)+'</td>'+
						'<td>&pound;'+(name['price-min']?name['price-min']:0)+'</td>'+
						'<td>&pound;'+(name['price-max']?name['price-max']:0)+'</td>'+
					'</tr>');
					
					html.append($(row));
				}
				return html;
			},
			drawWines:function(wines){
				var html = $('<tbody></tbody>');
				for(key in wines)
				{
					var wine = wines[key]['wine'];
					var row = $(
					'<tr>'+ 
						'<td><a target="blank" href="'+wine['link']+'">'+wine['merchant']+'</a></td>'+
						'<td><a target="blank" href="'+wine['link']+'">'+wine['merchant-description']+'</a></td>'+
						'<td><a target="blank" href="'+wine['link']+'">'+wine['wine-description']+'</a></td>'+
						'<td><a target="blank" href="'+wine['link']+'">'+wine['vintage']+'</a></td>'+
						'<td><a target="blank" href="'+wine['link']+'">&pound;'+(wine['price']?wine['price']:0)+'</a></td>'+
						'<td><a target="blank" href="'+wine['link']+'">'+wine['bottle-size']+'</a></td>'+
					'</tr>');

					html.append($(row));
				}
				return html;
			}
		}, params); 
		
		return this.each(function(index,element){
			
			var data = settings.data['wine-searcher'];
			if(!data) return;
				
			var returnCode = data['return-code'];
			var version = data['list-version'];
			var comment = data['return-comment'];
			var location = data['list-location'];
			var state = data['list-state'];
			var currency = data['list-currency-code'];
			
			var vintages = data['wine-vintages'];
			var names = data['names'];
			var wines = data['wines'];
			
			if(returnCode!='0') 
			{
				$(this).append('<span class="wine-searcher-error">'+comment+'</span>');
				return;
			}
			
			if(jQuery.isArray(vintages)){
				var tableRow = $('<tr></tr>')
				tableRow.append($('<th>Year</th>'));
				tableRow.append($('<th>Avg. Price per Bottle</th>'));
				tableRow.append($('<th>Avg. price for a case of 12</th>'));
				//tableRow.append($('<th>Max</th>'));
				
				var headerRow = $('<thead></thead>');
				headerRow.append(tableRow);
				
				var table = $('<table class="wine-searcher-vintages" cellspacing="0" cellpadding="0"></table>');
				table.append(headerRow);
				table.append(settings.drawVintages(vintages));

				$(this).append(table); 
				settings.postRender(table);
			}
			
			if(jQuery.isArray(names)){
				var tableRow = $('<tr></tr>');
				tableRow.append($('<th>Wine Name</th>'));
				tableRow.append($('<th>Display Name</th>'));
				tableRow.append($('<th>Region</th>'));
				tableRow.append($('<th>Grape</th>'));
				tableRow.append($('<th>Avg</th>'));
				tableRow.append($('<th>Min</th>'));
				tableRow.append($('<th>Max</th>'));
			
				var headerRow = $('<thead></thead>');
				headerRow.append(tableRow);

				var table = $('<table class="wine-searcher-names" cellspacing="0" cellpadding="0"></table>');
				table.append(headerRow);
				table.append(settings.drawNames(names));
			
				$(this).append(table);
				settings.postRender(table);
			}
						
			if(jQuery.isArray(wines)){
				var tableRow = $('<tr></tr>');
				tableRow.append($('<th>Merchant</th>'));
				tableRow.append($('<th>Merchant Description</th>'));
				tableRow.append($('<th>Wine Description</th>'));
				tableRow.append($('<th>Vintage</th>'));
				tableRow.append($('<th>Price</th>'));
				tableRow.append($('<th>Bottle Size</th>'));

				var headerRow = $('<thead></thead>');
				headerRow.append(tableRow); 

				var table = $('<table class="wine-searcher-wines" cellspacing="0" cellpadding="0"></table>');
				table.append(headerRow);
				table.append(settings.drawWines(wines));
			
				$(this).append(table);
				settings.postRender(table);
			}
		});			
	};
	
	$.BuildQueryString = function(obj,params) {

		var settings = jQuery.extend({
			prefix:"?",
			separator:'&',
			suffix:'',
			
			ommitFalse: true,
			ommitNull:true,
			ommitUndefined:true,
			ommitBlank:true,
			escapeValues:escape
		}, params);
		
		var queryString = "";
		
		for(key in obj)
		{
		
			var val = obj[key];
			if(
				(settings.ommitFalse && val === false) ||
				(settings.ommitNull && val === null) ||
				(settings.ommitUndefined && val === undefined) ||
				(settings.ommitBlank && val === '')
			)
				continue;
				
			queryString += 
				(queryString?settings.separator:'')+
				key+"="+settings.escapeValues(obj[key]);
		}
		
		return queryString;
		
	}
})(jQuery);

