tx.Exporter = function(){
	var lists = tx.data.conn.query('select * from list');
	
	var doc = new runtime.flash.xml.XMLDocument();
	
	var root = doc.createElement('simple-tasks');
	doc.appendChild(root);
	
	root.attributes['version'] = '2.0';
	
	for(var i = 0, len = lists.length; i < len; i++){
		var list = lists[i];
		
		var listNode = doc.createElement('list');
		root.appendChild(listNode);
		
		for(var k in list){
			if(list.hasOwnProperty(k)){
				listNode.attributes[k] = String(list[k]);
			}
		}
		
		var tasks = tx.data.conn.queryBy('select * from task where listId = ?', [list.listId]);
		for(var j = 0, jlen = tasks.length; j < jlen; j++){
			var task = tasks[j];
			
			var taskNode = doc.createElement('task');
			listNode.appendChild(taskNode);
			
			for(var t in task){
				if(task.hasOwnProperty(t)){
					taskNode.attributes[t] = String(task[t]);
				}
			}
		}
	}
	
	var file = new air.File(air.File.documentsDirectory.nativePath + air.File.separator + 'tasks.xml');
	
	file.addEventListener('select', function(e){
		var target = e.target;
		var stream = new air.FileStream();
        stream.open(target, air.FileMode.WRITE);
		stream.writeUTFBytes('');
        stream.writeUTFBytes(doc.toString());
        stream.close();
	});
	
	// I wonder why no filter for Save As?
	// var filter = new air.FileFilter("Tasks XML File", "*.xml");
	file.browseForSave('Save As');
};