﻿(function($){

	$.fn.bytbilSearch = function(options) {
		options = $.extend({}, $.fn.bytbilSearch.defaults, options);
		return this.each(function(){
			var form = $('<form/>')
				.addClass('bytbilform')
				.attr({ action: options.baseUrl+'Dispatch.aspx?type=form&fields='+options.fields, method: 'post', target: options.target })
				.submit(function(){
					$(this).find(':text').each(function(){
						$(this.form[$(this).data('name')]).val(this.value == $(this).data('lead') ? '' : this.value);
					});
					return true;
				});
			var f = options.fields.split(',');
			var brand = null, region = null, type = null;
			for (var i=0; i<f.length; i++) switch (f[i]) {
				case 'used': form.append(container('radioitem', [radio('bytbil_used', 'bytbil_u', true, function() { setTypeOptions(this.form, true, options.baseUrl); }), label('Begagnade', { 'for':'bytbil_u' }), radio('bytbil_used', 'bytbil_n', false, function() { setTypeOptions(this.form, false, options.baseUrl); }), label('Nya', { 'for':'bytbil_n' })])); break;
				case 'brand': form.append(brand = dropdownItem('Märke', 'bytbil_brand', emptyOption('Alla märken'), function(form, v) { setBrandOptions(form, v, options.baseUrl); })); break;
				case 'model': form.append(dropdownItem('Modell' ,'bytbil_model', emptyOption('Alla modeller'), null)); break;
				case 'version': form.append(textboxItem('Version' ,'bytbil_version', 'Sök version av modell...')); break;
				case 'year': form.append(dropdownPair('År', 'bytbil_yearfrom', getYears('Från', true), 'bytbil_yearto', getYears('Till', true))); break;
				case 'price': form.append(dropdownPair('Pris', 'bytbil_pricefrom', getPrices('Från'), 'bytbil_priceto', getPrices('Till'))); break;
				case 'km': form.append(dropdownPair('Mil', 'bytbil_kmfrom', getKm('Från'), 'bytbil_kmto', getKm('Till'))); break;
				case 'type': form.append(type = dropdownItem('Fordonstyp', 'bytbil_vehicletype', emptyOption('Kombi, sedan... (Alla)'), null)); break;
				case 'region': form.append(region = dropdownItem('Län', 'bytbil_region', emptyOption('Hela Sverige'), null)); break;
			}
			form.append(container('buttonitem', [button('Sök')]));
			$(this).append(form);

			getData('GetStartValues', { type: 'Car', used: 'Used' }, function(d) {
				if (brand != null) addOptions(brand.children('select'), d.brands);
				if (region != null) addOptions(region.children('select'), d.regions);
				if (type != null) addOptions(type.children('select'), d.vehicleTypes);
			}, options.baseUrl);
		});
	};
	
	$.fn.bytbilSearch.defaults = {
		fields: 'used,brand,model,version,year,price,km,type,region',
		baseUrl: 'http://www.bytbil.com/',
		target: '_blank'
	};

	function container(className, children) {
		var i = $('<div/>').addClass(className);
		for (c in children) i.append(children[c]);
		return i;
	}
	
	function item(children) {
		return container('item', children);
	}
	
	function label(text, attr) {
		return $('<label/>').attr(attr).text(text);
	}

	function radio(name, id, checked, click) {
		return $('<input/>').attr({ type: 'radio', name: name, id: id, value: id, checked: checked }).click(click);
	}

	function dropdown(name, items, change) {
		var d = $('<select/>').attr({ name: name });
		for (i in items) d.append($('<option/>').attr({ value: items[i].id }).text(items[i].name));
		if (change != null) d.change(function() { change(this.form, this.options[this.selectedIndex].value); });
		return d;
	}

	function dropdownItem(text, name, items, change) {
		return item([
			label(text, {}),
			dropdown(name, items, change)
		]);
	}

	function dropdownPair(text, name1, items1, name2, items2) {
		return item([
			label(text, {}),
			dropdown(name1, items1, null),
			dropdown(name2, items2, null)
		]).addClass('pair');
	}

	function textboxItem(text, name, lead) {
		return item([
			label(text, {}),
			$('<input/>').attr({ type:'text', value: lead })
				.focus(function() { if ($(this).val() == lead) $(this).val(''); })
				.blur(function() { if ($(this).val() == '') $(this).val(lead); })
				.data('lead', lead).data('name', name),
			$('<input/>').attr({ type: 'hidden', name: name })
		]);
	}

	function button(text) {
		return $('<input/>').attr({ type:'submit', value:text });
	}

	function getData(method, data, success, baseUrl) {
		data.method = method;
		$.ajax({ cache: true, url: baseUrl + 'savon/FormService.ashx', data: data, success: success, dataType: 'jsonp', jsonpCallback: 'cb_' + method });
	}

	function clearOptions(sel, keepFirst) {
		$(sel).children().remove(keepFirst ? '[value!=]' : '*');
	}

	function getOptions(sel, method, data, baseUrl) {
		clearOptions(sel, true);
		getData(method, data, function(d) { addOptions(sel, d); }, baseUrl);
	}

	function setOptions(sel, items, keepFirst) {
		clearOptions(sel, keepFirst);
		addOptions(sel, items);
	}

	function addOptions(sel, items) {
		for (i in items) sel.append($('<option/>').attr('value', items[i].id).text(items[i].name));
	}

	function getYears(name, used) {
		var items = emptyOption(name);
		var year = new Date().getFullYear() + 1;
		for (var cnt=used?32:3; cnt > 0; cnt--) {
			items.push({ id: year, name: year-- });
		}
		return items;
	}

	function getPrices(name) {
		var items = emptyOption(name);
		for (var p=10; p<=400; p+=p<100?10:20) {
			items.push({ id: p*1000, name: p+' 000' });
		}
		return items;
	}

	function getKm(name) {
		var items = emptyOption(name);
		for (var m=1; m<=20; m++) items.push({ id:m*10000, name:m+' 000' });
		return items;
	}

	function getUsed() {
		return $('input:radio[name=bytbil_used]:checked').val() == 'bytbil_u';
	}

	function usedName(used) {
		return used ? 'Used' : 'New';
	}

	function setTypeOptions(form, used, baseUrl) {
		setOptions($(form['bytbil_yearfrom']), getYears('Från', used), false);
		setOptions($(form['bytbil_yearto']), getYears('Till', used), false);
		getOptions($(form['bytbil_brand']), 'GetBrands', { type: 'Car', used: usedName(used) }, baseUrl);
		clearOptions($(form['bytbil_model']), true);
	}

	function setBrandOptions(form, v, baseUrl) {
		if (v.length) {
			getOptions($(form['bytbil_model']), 'GetModels', { type: 'Car', used: usedName(getUsed()), brand: v }, baseUrl);
		} else {
			clearOptions($(form['bytbil_model']), true);
		}
	}

	function emptyOption(name) {
		return [{ id:'', name:name }];
	}

})(jQuery);



//var BB = (function($){ return {

//	baseUrl: 'http://www.bytbil.com/',

//	container: function(className, children) {
//		var i = $('<div/>').addClass(className);
//		for (c in children) {
//			i.append(children[c]);
//		}
//		return i;
//	},

//	item: function(children) {
//		return BB.container('item', children);
//	},

//	label: function(text, attr) {
//		return $('<label/>').attr(attr).text(text);
//	},

//	radio: function(name, id, checked, click) {
//		return $('<input/>').attr({ type: 'radio', name: name, id: id, value: id, checked: checked }).click(click);
//	},

//	dropdown: function(name, items, change) {
//		var d = $('<select/>').attr({ name: name });
//		for (i in items) {
//			d.append($('<option/>').attr({ value: items[i].id }).text(items[i].name));
//		}
//		if (change != null) {
//			d.change(function() { change(this.form, this.options[this.selectedIndex].value); });
//		}
//		return d;
//	},

//	dropdownItem: function(label, name, items, change) {
//		return BB.item([
//			BB.label(label, {}),
//			BB.dropdown(name, items, change)
//		]);
//	},

//	dropdownPair: function(label, name1, items1, name2, items2) {
//		return BB.item([
//			BB.label(label, {}),
//			BB.dropdown(name1, items1, null),
//			BB.dropdown(name2, items2, null)
//		]).addClass('pair');
//	},

//	textboxItem: function(label, name, lead) {
//		return BB.item([
//			BB.label(label, {}),
//			$('<input/>').attr({ type:'text', value: lead })
//				.focus(function() { if ($(this).val() == lead) $(this).val(''); })
//				.blur(function() { if ($(this).val() == '') $(this).val(lead); })
//				.data('lead', lead).data('name', name),
//			$('<input/>').attr({ type: 'hidden', name: name })
//		]);
//	},

//	button: function(text) {
//		return $('<input/>').attr({ type:'submit', value:text });
//	},

//	getData: function(method, data, success) {
//		data.method = method;
//		$.ajax({ cache: true, url: BB.baseUrl + 'savon/FormService.ashx', data: data, success: success, dataType: 'jsonp', jsonpCallback: 'cb_' + method });
//	},

//	clearOptions: function(sel, keepFirst) {
//		$(sel).children().remove(keepFirst ? '[value!=]' : '*');
//	},

//	getOptions: function(sel, method, data) {
//		BB.clearOptions(sel, true);
//		BB.getData(method, data, function(d) { BB.addOptions(sel, d); });
//	},

//	setOptions: function(sel, items, keepFirst) {
//		BB.clearOptions(sel, keepFirst);
//		BB.addOptions(sel, items);
//	},

//	addOptions: function(sel, items) {
//		for (i in items) {
//			sel.append($('<option/>').attr('value', items[i].id).text(items[i].name));
//		}
//	},

//	getYears: function(name, used) {
//		var items = BB.emptyOption(name);
//		var year = new Date().getFullYear() + 1;
//		for (var cnt=used?32:3; cnt > 0; cnt--) {
//			items.push({ id: year, name: year-- });
//		}
//		return items;
//	},

//	getPrices: function(name) {
//		var items = BB.emptyOption(name);
//		for (var p=10; p<=400; p+=p<100?10:20) {
//			items.push({ id: p*1000, name: p+' 000' });
//		}
//		return items;
//	},

//	getKm: function(name) {
//		var items = BB.emptyOption(name);
//		for (var m=1; m<=20; m++) items.push({ id:m*10000, name:m+' 000' });
//		return items;
//	},

//	getUsed: function() {
//		return $('input:radio[name=bytbil_used]:checked').val() == 'bytbil_u';
//	},

//	usedName: function(used) {
//		return used ? 'Used' : 'New';
//	},

//	setTypeOptions: function(form, used) {
//		BB.setOptions($(form['bytbil_yearfrom']), BB.getYears('Från', used), false);
//		BB.setOptions($(form['bytbil_yearto']), BB.getYears('Till', used), false);
//		BB.getOptions($(form['bytbil_brand']), 'GetBrands', { type: 'Car', used: BB.usedName(used) });
//		BB.clearOptions($(form['bytbil_model']), true);
//	},

//	setBrandOptions: function(form, v) {
//		if (v.length) {
//			BB.getOptions($(form['bytbil_model']), 'GetModels', { type: 'Car', used: BB.usedName(BB.getUsed()), brand: v });
//		} else {
//			BB.clearOptions($(form['bytbil_model']), true);
//		}
//	},

//	emptyOption: function(name) {
//		return [{ id:'', name:name }];
//	},

//	addForm: function(obj, fields, target) {
//		var form = $('<form/>')
//			.addClass('bytbilform')
//			.attr({ action: BB.baseUrl+'Dispatch.aspx?type=form&fields='+fields, method: 'post', target: target })
//			.submit(function(){
//				$(this).find(':text').each(function(){
//					$(this.form[$(this).data('name')]).val(this.value == $(this).data('lead') ? '' : this.value);
//				});
//				return true;
//			});
//		var f = fields.split(',');
//		var brand = null, region = null, type = null;
//		for (var i=0; i<f.length; i++) switch (f[i]) {
//			case 'used': form.append(BB.container('radioitem', [BB.radio('bytbil_used', 'bytbil_u', true, function() { BB.setTypeOptions(this.form, true); }), BB.label('Begagnade', { 'for':'bytbil_u' }), BB.radio('bytbil_used', 'bytbil_n', false, function() { BB.setTypeOptions(this.form, false); }), BB.label('Nya', { 'for':'bytbil_n' })])); break;
//			case 'brand': form.append(brand = BB.dropdownItem('Märke', 'bytbil_brand', BB.emptyOption('Alla märken'), function(form, v) { BB.setBrandOptions(form, v); })); break;
//			case 'model': form.append(BB.dropdownItem('Modell' ,'bytbil_model', BB.emptyOption('Alla modeller'), null)); break;
//			case 'version': form.append(BB.textboxItem('Version' ,'bytbil_version', 'Sök version av modell...')); break;
//			case 'year': form.append(BB.dropdownPair('År', 'bytbil_yearfrom', BB.getYears('Från', true), 'bytbil_yearto', BB.getYears('Till', true))); break;
//			case 'price': form.append(BB.dropdownPair('Pris', 'bytbil_pricefrom', BB.getPrices('Från'), 'bytbil_priceto', BB.getPrices('Till'))); break;
//			case 'km': form.append(BB.dropdownPair('Mil', 'bytbil_kmfrom', BB.getKm('Från'), 'bytbil_kmto', BB.getKm('Till'))); break;
//			case 'type': form.append(type = BB.dropdownItem('Fordonstyp', 'bytbil_vehicletype', BB.emptyOption('Kombi, sedan... (Alla)'), null)); break;
//			case 'region': form.append(region = BB.dropdownItem('Län', 'bytbil_region', BB.emptyOption('Hela Sverige'), null)); break;
//		}
//		form.append(BB.container('buttonitem', [BB.button('Sök')]));
//		obj.append(form);

//		BB.getData('GetStartValues', { type: 'Car', used: 'Used' }, function(d) {
//			if (brand != null) BB.addOptions(brand.children('select'), d.brands);
//			if (region != null) BB.addOptions(region.children('select'), d.regions);
//			if (type != null) BB.addOptions(type.children('select'), d.vehicleTypes);
//		});
//	}

//};})(jQuery);
