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');
};