      1 (function ($, rf) {
      2
      3     rf.ui = rf.ui || {};
      4
      5     rf.ui.CollapsibleSubTable = function(id, f, options) {
      6         this.id = id;
      7         this.stateInput = options.stateInput;
      8         this.optionsInput = options.optionsInput;
      9         this.expandMode = options.expandMode || rf.ui.CollapsibleSubTable.MODE_CLNT;
     10         this.eventOptions = options.eventOptions;
     11         this.formId = f;
     12
     13         this.attachToDom();
     14     };
     15
     16     $.extend(rf.ui.CollapsibleSubTable, {
     17             MODE_AJAX: "ajax",
     18             MODE_SRV: "server",
     19             MODE_CLNT: "client",
     20             collapse: 0,
     21             expand: 1
     22         });
     23
     24     rf.BaseComponent.extend(rf.ui.CollapsibleSubTable);
     25     var $super = rf.ui.CollapsibleSubTable.$super;
     26
     27     $.extend(rf.ui.CollapsibleSubTable.prototype, (function () {
     28
     29         var element = function() {
     30             //use parent tbody as parent dom elem
     31             return $(document.getElementById(this.id)).parent();
     32         };
     33
     34         var stateInputElem = function() {
     35             return $(document.getElementById(this.stateInput));
     36         };
     37
     38         var optionsInputElem = function() {
     39             return $(document.getElementById(this.optionsInput));
     40         };
     41
     42         var ajax = function(e, options) {
     43             this.__switchState();
     44             rf.ajax(this.id, e, options);
     45         };
     46
     47         var server = function(options) {
     48             this.__switchState();
     49             $(document.getElementById(this.formId)).submit();
     50         };
     51
     52         var client = function(options) {
     53             if (this.isExpanded()) {
     54                 this.collapse(options);
     55             } else {
     56                 this.expand(options);
     57             }
     58         };
     59
     60
     61         return {
     62
     63             name: "CollapsibleSubTable",
     64
     65             switchState: function(e, options) {
     66                 if (this.expandMode == rf.ui.CollapsibleSubTable.MODE_AJAX) {
     67                     ajax.call(this, e, this.eventOptions, options);
     68                 } else if (this.expandMode == rf.ui.CollapsibleSubTable.MODE_SRV) {
     69                     server.call(this, options);
     70                 } else if (this.expandMode == rf.ui.CollapsibleSubTable.MODE_CLNT) {
     71                     client.call(this, options);
     72                 }
     73             },
     74
     75             collapse: function(options) {
     76                 this.setState(rf.ui.CollapsibleSubTable.collapse);
     77                 element.call(this).hide();
     78             },
     79
     80             expand: function(options) {
     81                 this.setState(rf.ui.CollapsibleSubTable.expand);
     82                 element.call(this).show();
     83             },
     84
     85             isExpanded: function() {
     86                 return (parseInt(this.getState()) == rf.ui.CollapsibleSubTable.expand);
     87             },
     88
     89             __switchState: function(options) {
     90                 var state = this.isExpanded() ? rf.ui.CollapsibleSubTable.collapse : rf.ui.CollapsibleSubTable.expand;
     91                 this.setState(state);
     92             },
     93
     94             getState: function() {
     95                 return stateInputElem.call(this).val();
     96             },
     97
     98             setState: function(state) {
     99                 stateInputElem.call(this).val(state)
    100             },
    101
    102             setOption: function(option) {
    103                 optionsInputElem.call(this).val(option);
    104             },
    105
    106             getMode: function() {
    107                 return this.expandMode;
    108             },
    109             destroy: function() {
    110                 $super.destroy.call(this);
    111             }
    112         };
    113
    114     })());
    115
    116 })(RichFaces.jQuery, window.RichFaces);