commit extjs-2.2.1
[extjs.git] / air / samples / tasks / js / Importer.js
1 /*\r
2  * Ext JS Library 0.30\r
3  * Copyright(c) 2006-2009, Ext JS, LLC.\r
4  * licensing@extjs.com\r
5  * \r
6  * http://extjs.com/license\r
7  */\r
8 \r
9 tx.Importer = function(){\r
10         function chooseFile(callback){\r
11                 var file = new air.File(air.File.documentsDirectory.nativePath);\r
12                 var filter = new air.FileFilter("Tasks XML File", "*.xml");\r
13                 \r
14                 file.addEventListener('select', function(e){\r
15                         doImport(e.target, callback);\r
16                 });\r
17                 \r
18                 file.browseForOpen('Open', [filter]);\r
19         }\r
20         \r
21         \r
22         /*\r
23          * This import function used to be clean and simple. The addition of asynchronous import and\r
24          * a progress bar changed that quickly. :) \r
25          */\r
26         function doImport(file, callback){\r
27                 \r
28                 Ext.Msg.progress('Import', 'Reading file...');\r
29                 \r
30                 var listTable = tx.data.conn.getTable('list', 'listId');\r
31                 var taskTable = tx.data.conn.getTable('task', 'taskId');\r
32                 var taskCount = 0;\r
33                 var visibleIndex = 0;\r
34                 var doUpdate = true;\r
35                 var f = String.format;\r
36                 \r
37                 function getProgress(index){\r
38                         if(taskCount > 0){\r
39                                 return (.8 * index) / taskCount;\r
40                         }else{\r
41                                 return .8;\r
42                         }\r
43                 }\r
44                 \r
45                 function readFile(){\r
46                         var stream = new air.FileStream();\r
47                         stream.open(file, air.FileMode.READ);\r
48                         var xml = stream.readUTFBytes(stream.bytesAvailable);\r
49                         stream.close();\r
50                                         \r
51                         Ext.Msg.updateProgress(.1, 'Parsing...');\r
52                         parse.defer(10, null, [xml]);\r
53                 }\r
54                 \r
55                 function parse(xml){\r
56                         try {\r
57                                 var doc = new runtime.flash.xml.XMLDocument();\r
58                                 doc.ignoreWhite = true;\r
59                                 doc.parseXML(xml);\r
60                                 \r
61                                 var lists = doc.firstChild.childNodes;\r
62                                 var count = lists.length;\r
63                                 \r
64                                 for (var i = 0; i < count; i++) {\r
65                                         taskCount += lists[i].childNodes.length;\r
66                                 }       \r
67                                 Ext.Msg.updateProgress(.15, '', 'Loading Tasks...');\r
68                                 loadLists(lists, 0);\r
69                         }catch(e){\r
70                                 air.trace(e);\r
71                                 alert('An error occured while trying to import the selected file.');\r
72                         }                       \r
73                 }\r
74                 \r
75                 function loadLists(lists, index){\r
76                         if(index < lists.length){\r
77                                 var list = lists[index];\r
78                                 listTable.save(list.attributes);\r
79                                 nextTask(list.childNodes, 0, lists, index);\r
80                         }\r
81                         else {\r
82                                 Ext.Msg.updateProgress(1, '', 'Completing import...');\r
83                                 callback.defer(10);\r
84                         }                               \r
85                 }               \r
86                 \r
87                 function nextTask(tasks, index, lists, listIndex){\r
88                         if(index < tasks.length){\r
89                                 Ext.Msg.updateProgress(\r
90                                         getProgress(++visibleIndex),\r
91                                         f('{0} of {1}', visibleIndex, taskCount)\r
92                                 );\r
93                                 loadTasks.defer(250, window, [tasks, index, lists, listIndex]);\r
94                         }\r
95                         else {\r
96                                 loadLists(lists, ++listIndex);\r
97                         }\r
98                 }\r
99                 \r
100                 function loadTasks(tasks, index, lists, listIndex){\r
101                         taskTable.save(tasks[index].attributes);\r
102                         nextTask(tasks, ++index, lists, listIndex);\r
103                 }\r
104                 \r
105                 readFile.defer(10);\r
106         }\r
107         \r
108         this.doImport = function(callback){\r
109                 chooseFile(callback);\r
110         }\r
111 };\r