function Weblink_ServerInterface(){
	var SI = this;
	this.$ = $(this);
	this.getModuleInfo = function(device,json){
		if(!json){
			json = false;
		}
		var uri = '/weblink/device/get-info/serial/'+device.get('Serial')+(json?'':'/view/true');
		//location.href = (uri);
		$.ajax({
			url:uri,
			type:'GET',
			dataType:(json?'json':'html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getOptions = function(device,conf){
		if(conf instanceof Weblink_Device_ModuleConf){
			var uri = '/weblink/device/get-options/eeprom/'+conf.toString()+'/serial/'+device.get('Serial');
			$.ajax({
				url:uri,
				type:'GET',
				dataType:'json',
				success:function(data){SI.$.triggerHandler('dataLoaded',[data]);},
				error:function(){SI.$.triggerHandler('errorLoading');}
				});
			}
		};
	this.setOptions = function(device,conf){
		
		if(conf instanceof Weblink_Device_ModuleConf){
			var updates = conf.getChanges();
			var changes = new Array();
			for(x in updates){
				if(updates[x]!=0 && !updates[x]) continue;
				changes.push(x+':'+updates[x]); 
			}
			changes = changes.join(',');
			var uri = '/weblink/device/set-options/eeprom/'+conf.toString()+'/serial/'+device.get('Serial')+'/updates/'+changes;
			$.ajax({
				url:uri,
				type:'GET',
				dataType:'json',
				success:function(data){SI.$.triggerHandler('dataLoaded',[data]);},
				error:function(){SI.$.triggerHandler('errorLoading');}
				});
			}
		};
	this.getCompatibleProtocol = function(device,json){
		if(!json){
			json = false;
		}
		var uri = '/weblink/device/get-compatible-protocol-list/serial/'+device.get('Serial')+(json?'':'/view/true');
		//location.href = (uri);
		$.ajax({
			url:uri,
			type:'POST',
			data : {options : device.get('options')},
			dataType:(json?'json':'html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getCompatibleFirmware = function(device,json,protocol){
		if(!json){
			json = false;
		}
		var uri = '/weblink/device/get-compatible-firmware-list/serial/'+device.get('Serial')+(protocol?'/protocol/'+protocol:'')+(json?'':'/view/true');
		//location.href = (uri);
		$.ajax({
			url:uri,
			type:'GET',
			dataType:(json?'json':'html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getCompatibleMake = function(device,year,json,protocol){
		if(!json){
			json = false;
		}
		var uri = '/weblink/device/get-compatible-make-list/serial/'+device.get('Serial')+(year?'/year/'+year:'')+(protocol?'/protocol/'+protocol:'')+(json?'':'/view/true');
		//alert(uri);
		//location.href = (uri);
		$.ajax({
			url:uri,
			type:'GET',
			dataType:(json?'json':'html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getCompatibleYear = function(device,make,json,protocol){
		if(!json){
			json = false;
		}
		var uri = '/weblink/device/get-compatible-year-list/serial/'+device.get('Serial')+(make?'/make/'+make:'')+(protocol?'/protocol/'+protocol:'')+(json?'':'/view/true');
		//location.href = (uri);
		$.ajax({
			url:uri,
			type:'GET',
			dataType:(json?'json':'html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getCompatibleVehicle = function(device,make,year,json,protocol){
		if(!json){
			json = false;
		}
		var uri = '/weblink/device/get-compatible-vehicle-list/serial/'+device.get('Serial')+(make?'/make/'+make:'')+(year?'/year/'+year:'')+(protocol?'/protocol/'+protocol:'')+(json?'':'/view/true');
		//location.href = (uri);
		//alert(uri);
		$.ajax({
			url:uri,
			type:'GET',
			dataType:(json?'json':'html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	
	this.getVehicle = function(vehicle) {
		var uri = '/ajax/search/get-vehicle-list/vehicle_id/'+vehicle;
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('json'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getFirmwareCoverage = function(firmware){
		var uri = '/ajax/product/get-vehicle-coverage/firmware_id/'+firmware;
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getFirmwareForVehicle = function(device,vehicle,protocol){
		var uri = '/weblink/device/get-best-firmware-for-vehicle/serial/'+device.get('Serial')+'/vehicle_id/'+vehicle+(protocol?'/protocol/'+protocol:'');
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('json'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	
	this.getFirmwareDetail = function(device,vehicle,firmware){
		var uri = '/weblink/flash/get-firmware-detail';
		if(vehicle && vehicle.id){
			uri += '/vehicle/'+vehicle.id;
		}
		if(firmware && firmware.id){
			uri += '/firmware/'+firmware.id;
		} else {
			throw "No firmware id specified";
		}
		
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getModuleCode = function(device,firmware){
		var uri = '/weblink/flash5/get-code';
		if(firmware && firmware.id){
			uri += '/firmware/'+firmware.id;
		}
		uri += '/serial/'+device.get('Serial');
		uri += '/bootloader/'+device.get('BootLoader');
		
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('json'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getStarterCode = function(device,firmware){
		var uri = '/weblink/flash5/get-starter-code';
		if(firmware && firmware.id){
			uri += '/firmware/'+firmware.id;
		}
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('json'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
			});
	};
	this.getStarterManufacturer = function(conf){
		var uri = '/weblink/starter/get-manufacturer/eeprom/'+conf.toString();
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('json'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
		});
	};
	this.getStarterInfo = function(manuf,hardware,firmware,json){
		if(!json) json = false;
		json=true;
		var uri = '/weblink/starter/get-info/manufacturer/'+manuf.id+'/hardware/'+hardware.toString()+'/firmware/'+firmware.toString()+(json?'':'/view/true');
		$.ajax({
			url:uri,
			type:'GET',
			dataType:(json?'json':'html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
		});
	};

	this.getStarterFeatures = function(firmware,eeprom){
		
		var uri = '/weblink/starter/get-features/firmware/'+firmware.id+'/eeprom/'+eeprom.toString();
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('html'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
		});
	};
	this.getStarterFeatureAddresses = function(firmware){
		var uri = '/weblink/starter/get-feature-addresses/firmware/'+firmware.id;
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('json'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
		});
	};
	this.setStarterFeatures = function(firmware,eeprom){
		var uri = '/weblink/starter/set-features/firmware/'+firmware.id+'/eeprom/'+eeprom.toString()+'/updates/'+eeprom.getChanges();
		$.ajax({
			url:uri,
			type:'GET',
			dataType:('json'),
			success : function(data){SI.$.triggerHandler('dataLoaded',[data]);},
			error:function(){SI.$.triggerHandler('errorLoading');}
		});
	};
}