97682d02f19168248e01dc4cb3f20f9abdc9787d
[redakcja.git] / project / static / js / models.js
1 /*globals Editor fileId SplitView PanelContainerView*/
2 var documentsUrl = '/api/documents/';
3
4
5 Editor.Model = Editor.Object.extend({
6   synced: false,
7   data: null
8 });
9
10
11 Editor.XMLModel = Editor.Model.extend({
12   _className: 'Editor.XMLModel',
13   serverURL: null,
14   
15   init: function(serverURL) {
16     this._super();
17     this.serverURL = serverURL;
18   },
19   
20   getData: function() {
21     if (!this.data) {
22       this.reload();
23     }
24     return this.data;
25   },
26   
27   load: function() {
28     if (!this.get('synced')) {
29       $.ajax({
30         url: this.serverURL,
31         dataType: 'text',
32         success: this.reloadSucceeded.bind(this)
33       });
34     }
35   },
36   
37   reloadSucceeded: function(data) {
38     this.set('data', data);
39     this.set('synced', true);
40   }
41 });
42
43
44 Editor.HTMLModel = Editor.Model.extend({
45   _className: 'Editor.HTMLModel',
46   serverURL: null,
47   data: '',
48   
49   init: function(serverURL) {
50     this._super();
51     this.serverURL = serverURL;
52   },
53   
54   load: function() {
55     if (!this.get('synced')) {
56       $.ajax({
57         url: this.serverURL,
58         dataType: 'text',
59         success: this.reloadSucceeded.bind(this)
60       });
61     }
62   },
63   
64   reloadSucceeded: function(data) {
65     this.set('data', data);
66     this.set('synced', true);
67   }
68 });
69
70
71 Editor.DocumentModel = Editor.Model.extend({
72   _className: 'Editor.DocumentModel',
73   data: null, // name, text_url, latest_rev, latest_shared_rev, parts_url, dc_url, size
74   contentModels: {},
75   
76   init: function() {
77     this._super();
78     this.load();
79   },
80   
81   load: function() {
82     console.log('DocumentModel#load');
83     $.ajax({
84       cache: false,
85       url: documentsUrl + fileId,
86       dataType: 'json',
87       success: this.successfulLoad.bind(this)
88     });
89   },
90   
91   successfulLoad: function(data) {
92     console.log('DocumentModel#successfulLoad:', data);
93     this.set('data', data);
94     this.contentModels = {
95       'xml': new Editor.XMLModel(data.text_url),
96       'html': new Editor.HTMLModel(data.html_url)
97     };
98     for (var key in this.contentModels) {
99       this.contentModels[key].addObserver(this, 'data', this.contentModelDataChanged.bind(this));
100     }
101   },
102   
103   contentModelDataChanged: function(property, value, contentModel) {
104     console.log('data of', contentModel.description(), 'changed!');
105     for (var key in this.contentModels) {
106       if (this.contentModels[key].guid() != contentModel.guid()) {
107         console.log(this.contentModels[key].description(), 'frozen');
108         this.contentModels[key].set('synced', false);
109       }
110     }
111   }
112 });
113
114
115 var leftPanelView, rightPanelContainer, doc;
116
117 $(function() {
118   doc = new Editor.DocumentModel();
119   var splitView = new SplitView('#splitview', doc);
120   leftPanelView = new PanelContainerView('#left-panel-container', doc);
121   rightPanelContainer = new PanelContainerView('#right-panel-container', doc);
122 });