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