Mostly Javascript refactoring.
[redakcja.git] / platforma / static / js / wiki / wikiapi.js
diff --git a/platforma/static/js/wiki/wikiapi.js b/platforma/static/js/wiki/wikiapi.js
new file mode 100644 (file)
index 0000000..d151f9e
--- /dev/null
@@ -0,0 +1,211 @@
+(function($) {
+       
+       $.wikiapi = {};
+       
+       var noop = function() {};
+       var noops = {'success': noop, 'failure': noop};
+       
+       /*
+        * Return absolute reverse path of given named view.
+        * (at least he have it hard-coded in one place)
+        * 
+        * TODO: think of a way, not to hard-code it here ;) 
+        * 
+        */
+       function reverse() {
+               var vname = arguments[0];
+                       
+               if(vname == "ajax_document_text") {
+                       var path = "/" + arguments[1] + "/text";
+                       if (arguments[2] !== undefined) 
+                               path += "/" + arguments[2];
+                       return path;
+               }
+                       
+               if (vname == "ajax_document_history") {
+                       return "/" + arguments[1] + "/history";
+               }                       
+                                       
+               if(vname == "ajax_document_diff")
+                       return "/" + arguments[1] + "/diff/" + arguments[2] + "/" + arguments[3] 
+                       
+               console.log("Couldn't reverse match:", vname);
+               return "/404.html";             
+       };
+       
+       /*
+        * Document Abstraction  
+        */
+       function WikiDocument(element_id) {
+               var meta = $('#'+element_id);
+               
+               this.id = meta.attr('data-document-name');              
+               this.revision = $("*[data-key='revision']", meta).text();
+               this.gallery = $("*[data-key='gallery']", meta).text();
+               
+               this.text = null;
+               
+               this.has_local_changes = false;
+               this._lock = -1;
+               this._context_lock = -1;
+               this._lock_count = 0; 
+       }
+       
+//     WikiDocument.prototype.lock = function() {
+//             if(this._lock < 0) {
+//                     this._lock = Math.random();
+//                     this._context_lock = this._lock;
+//                     this._lock_count = 1;
+//                     return this._lock;
+//             }
+//             
+//             // reentrant locks 
+//             if(this._context_lock === this._lock) {
+//                     this._lock_count += 1;
+//                     return this._lock;
+//             }
+//             
+//             throw "Document operation in progress. Try again later."
+//     };
+//             
+//     WikiDocument.prototype.unlock = function(lockNumber) {
+//             if(this.locked === lockNumber) {
+//                     this._lock_count -= 1;
+//                     
+//                     if(this._lock_count === 0) {
+//                             this._lock = -1;
+//                             this._context_lock = -1;
+//                     };                      
+//                     return;
+//             }
+//             throw "Trying to unlock with wrong lockNumber";
+//     };
+//     
+//     /*
+//      * About to leave context of current lock.
+//      */
+//     WikiDocument.prototype.leaveContext = function() {
+//             var old = this._context_lock;
+//             this._context_lock = -1;
+//             return old;
+//     };
+       
+       /*
+        * Fetch text of this document.
+        */
+       WikiDocument.prototype.fetch = function(params) {               
+               params = $.extend({}, noops, params);
+               var self = this;
+               
+               $.ajax({
+                       method: "GET",
+                       url: reverse("ajax_document_text", self.id),
+                       dataType: 'json', 
+                       success: function(data) 
+                       {
+                               var changed = false;
+                               
+                               if (self.text === null || self.revision !== data.revision) {
+                                       self.text = data.text;
+                                       self.revision = data.revision;
+                                       self.gallery = data.gallery;                                    
+                                       changed = true;
+                               }
+                               
+                               self.has_local_changes = false;                         
+                               params['success'](self, changed);
+                       },
+                       error: function() {             
+                               params['failure'](self, "Nie udało się wczytać treści dokumentu.");
+                       }
+               });                                             
+       };
+       
+       /*
+        * Fetch history of this document.
+        * 
+        * from - First revision to fetch (default = 0)
+        * upto - Last revision to fetch (default = tip)
+        * 
+        */
+       WikiDocument.prototype.fetchHistory = function(params) {                
+               /* this doesn't modify anything, so no locks */         
+               params = $.extend({}, noops, params);           
+               var self = this;
+               
+               $.ajax({                        
+                       method: "GET",
+                       url: reverse("ajax_document_history", self.id),
+                       dataType: 'json',
+                       data: {"from": params['from'], "upto": params['upto']},
+                       success: function(data) {
+                               params['success'](self, data);
+                       },
+                       error: function() {
+                               params['failure'](self, "Nie udało się wczytać treści dokumentu.");
+                       }
+               });                                             
+       };
+       
+       /*
+        * Set document's text
+        */
+       WikiDocument.prototype.setText = function(text) {                               
+               this.text = text;
+               this.has_local_changes = true;                  
+       };
+       
+       /*
+        * Set document's gallery link
+        */
+       WikiDocument.prototype.setGallery = function(gallery) {                         
+               this.gallery = gallery;
+               this.has_local_changes = true;                  
+       };
+       
+       /*
+        * Save text back to the server
+        */
+       WikiDocument.prototype.save = function(comment, success, failure){
+               var self = this;
+               
+               if (!self.has_local_changes) {
+                       return success(self, "Nie ma zmian do zapisania.");
+               }
+               
+               /* you can't set text while some is fetching it (or saving) */
+               var metaComment = '<!--';
+               metaComment += '\n\tgallery:' + self.gallery;
+               metaComment += '\n-->'
+               
+               var data = {
+                       name: self.id,
+                       text: self.text,
+                       parent_revision: self.revision,
+                       comment: comment,
+               };
+               
+               $.ajax({
+                       url: reverse("ajax_document_text", self.id),
+                       type: "POST",
+                       dataType: "json",
+                       data: data,
+                       success: function(data){
+                               var changed = false;
+                               if (data.text) {
+                                       self.text = data.text;
+                                       self.revision = data.revision;
+                                       self.gallery = data.gallery;
+                                       changed = true;
+                               }
+                               success(self, changed);
+                       },
+                       error: function(){
+                               failure(self, "Nie udało się zapisać.");
+                       }
+               });             
+       }; /* end of save() */
+       
+       $.wikiapi.WikiDocument = WikiDocument;
+       
+})(jQuery);