oxidized-web 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of oxidized-web might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 63e3df8a73ba39702207ec2a5fe8eed506ae1500
4
- data.tar.gz: a3668faf064d7c74b08b7f8dbc7d3793d2b5cf2b
3
+ metadata.gz: 02cb31932cae7a05773e4bf65532e8418df4805c
4
+ data.tar.gz: 93445a2bfbcba0402e1d6c16a3436ca42225dcb9
5
5
  SHA512:
6
- metadata.gz: 65e00b053eda4d2a86040e001d420d506f35e3cf690d01f89caf56fbe391615246abfee351cad1b6debceb31467db7c77c47173ffeb1605950c06909a789acd5
7
- data.tar.gz: 91bd5b660ebffa10425081c19bc86bbd385653e87458e6665d1e486ee9666a61fda4e71bfe99873adc1f53c4b1b42f113a46659ff026a3cf579da6c3bd31befd
6
+ metadata.gz: 79dbf326a8326c41a7e776056232c71b5255820368a0ba32725288b244c5c0c91c4a913ab628c4a7f02f4447d0940a3d38162046c719a1c5b6a346228d4fcc61
7
+ data.tar.gz: 8e0dc817e03135375afe2becf8507dc691268299bfea54fe84b93ea828aa5717bb325f67ae995f7128fa1212e9bbb3bc6539a77c8ab5a71d0dd3f346a703f410
data/Rakefile CHANGED
@@ -3,7 +3,7 @@ begin
3
3
  require 'bundler'
4
4
  # Bundler.setup
5
5
  rescue LoadError
6
- warn 'bunler missing'
6
+ warn 'bundler missing'
7
7
  end
8
8
 
9
9
  gemspec = eval(File.read(Dir['*.gemspec'].first))
@@ -40,8 +40,12 @@ task :clean do
40
40
  FileUtils.rm_rf 'gems'
41
41
  end
42
42
 
43
+ desc 'Tag the release'
44
+ task :tag do
45
+ system "git tag #{gemspec.version}"
46
+ end
47
+
43
48
  desc 'Push to rubygems'
44
- task :push do
49
+ task :push => :tag do
45
50
  system "gem push gems/#{file}"
46
- system "git tag #{gemspec.version}"
47
51
  end
@@ -1,3 +1,5 @@
1
+ require 'json'
2
+
1
3
  module Oxidized
2
4
  module API
3
5
  class Web
@@ -21,9 +23,9 @@ module Oxidized
21
23
  end
22
24
  end
23
25
  end
24
-
26
+
25
27
  def run
26
- @thread = Thread.new { Rack::Handler::Puma.run @app, @opts }
28
+ @thread = Thread.new { Rack::Handler::Puma.run @app, @opts }
27
29
  end
28
30
  end
29
31
  end
@@ -0,0 +1,149 @@
1
+ module Oxidized
2
+ module API
3
+ class Mig
4
+ def initialize(hash_router_db, cloginrc, path_new_router)
5
+ @hash_router_db = hash_router_db
6
+ @cloginrc = cloginrc
7
+ @path_new_router = path_new_router
8
+ end
9
+
10
+ #read cloginrc and return a hash with node name, which a hash value which contains user, password, eventually enable
11
+ def cloginrc clogin_file
12
+ close_file = clogin_file
13
+ file = close_file.read
14
+ file = file.gsub("add", '')
15
+
16
+ hash = {}
17
+ file.each_line do |line|
18
+
19
+
20
+ #stock all device name, and password and enable if there is one
21
+ line = line.split(" ")
22
+ for i in 0..line.length
23
+ if line[i] == "user"
24
+ #add the equipment and user if not exist
25
+ unless hash[line[i + 1]]
26
+ hash[line[i + 1]] = {:user=>line[i + 2]}
27
+ end
28
+ #if the equipment exist, add password and enable password
29
+ elsif line[i] == "password"
30
+ if hash[line[i + 1]]
31
+ if line.length > i + 2
32
+ h = hash[line[i + 1]]
33
+ h[:password] = line[i + 2]
34
+ if /\s*/.match(line[i + 3])
35
+ h[:enable] = line[i + 3]
36
+ end
37
+ hash[line[i + 1]] = h
38
+ elsif line.length = i + 2
39
+ h = hash[line[i + 1]]
40
+ h[:password] = line[i + 2]
41
+ hash[line[i + 1]] = h
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ close_file.close
48
+ hash
49
+ end
50
+ def model_dico model
51
+ dico = {"cisco"=>"ios", "foundry"=>"ironware"}
52
+ model = model.gsub("\n", "")
53
+ if dico[model]
54
+ model = dico[model]
55
+ end
56
+ model
57
+ end
58
+
59
+ #add node and group for an equipment (take a list of router.db)
60
+ def rancid_group router_db_list
61
+ model = {}
62
+ hash = cloginrc @cloginrc
63
+ router_db_list.each do |router_db|
64
+ group = router_db[:group]
65
+ file_close = router_db[:file]
66
+ file = file_close.read
67
+ file = file.gsub(":up", '')
68
+ file.gsub(" ", '')
69
+
70
+ file.each_line do |line|
71
+ line = line.split(":")
72
+ node = line[0]
73
+ if hash[node]
74
+ h = hash[node]
75
+ model = model_dico line[1].to_s
76
+ h[:model] = model
77
+ h[:group] = group
78
+ end
79
+ end
80
+ file_close.close
81
+ end
82
+ hash
83
+ end
84
+
85
+ #write a router.db conf, need the hash and the path of the file we whish create
86
+ def write_router_db hash
87
+ router_db = File.new(@path_new_router, "w")
88
+ hash.each do |key, value|
89
+ line = key.to_s
90
+ line += ":" + value[:model].to_s
91
+ line += ":" + value[:user].to_s
92
+ line += ":" + value[:password].to_s
93
+ line += ":" + value[:group].to_s
94
+ if value[:enable]
95
+ line += ":" + value[:enable].to_s
96
+ end
97
+ router_db.puts(line)
98
+ end
99
+ router_db.close
100
+ end
101
+
102
+ def edit_conf_file path_conf, router_db_path
103
+ file_close = File.open(path_conf, "r")
104
+ file = file_close
105
+ file = file.read
106
+ source_reached = false
107
+ new_file = []
108
+ file.each_line do |line|
109
+ if source_reached
110
+ unless /^\w/.match(line)
111
+ next
112
+ end
113
+ source_reached = false
114
+ end
115
+ new_file.push(line)
116
+ if /source:/.match(line)
117
+ source_reached = true
118
+ new_file.push(" default: csv\n")
119
+ new_file.push(" csv:\n")
120
+ new_file.push(" file: " + router_db_path + "\n")
121
+ new_file.push(" delimiter: !ruby/regexp /:/\n")
122
+ new_file.push(" map:\n")
123
+ new_file.push(" name: 0\n")
124
+ new_file.push(" model: 1\n")
125
+ new_file.push(" username: 2\n")
126
+ new_file.push(" password: 3\n")
127
+ new_file.push(" group: 4\n")
128
+ new_file.push(" vars_map:\n")
129
+ new_file.push(" enable: 5\n")
130
+ next
131
+ end
132
+ end
133
+ file_close.close
134
+
135
+ new_conf = File.new(path_conf, "w")
136
+ new_file.each do |line|
137
+ new_conf.puts(line)
138
+ end
139
+ new_conf.close
140
+ end
141
+
142
+ def go_rancid_migration
143
+ hash = rancid_group @hash_router_db
144
+ write_router_db hash
145
+ edit_conf_file "#{ENV['HOME']}/.config/oxidized/config", @path_new_router
146
+ end
147
+ end
148
+ end
149
+ end
@@ -2,6 +2,7 @@ div.dataTables_length label {
2
2
  font-weight: normal;
3
3
  float: left;
4
4
  text-align: left;
5
+ width: 45%;
5
6
  }
6
7
 
7
8
  div.dataTables_length select {
@@ -11,6 +12,7 @@ div.dataTables_length select {
11
12
  div.dataTables_filter label {
12
13
  font-weight: normal;
13
14
  float: right;
15
+
14
16
  }
15
17
 
16
18
  div.dataTables_filter input {
@@ -0,0 +1,171 @@
1
+
2
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
3
+ * ColVis styles
4
+ */
5
+ div.ColVis {
6
+ float: right;
7
+ margin-bottom: 1em;
8
+ width: 60%
9
+
10
+
11
+ }
12
+
13
+ button.ColVis_Button,
14
+ ul.ColVis_collection li {
15
+ font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
16
+ font-size: 14px;
17
+ line-height: 1.42857;
18
+ position: relative;
19
+ float: right;
20
+ margin-right: 3px;
21
+ padding: 5px 8px;
22
+ border: 1px solid #999;
23
+ border-radius: 3px;
24
+ cursor: pointer;
25
+ *cursor: hand;
26
+ color: black !important;
27
+ white-space: nowrap;
28
+
29
+ }
30
+
31
+ .ColVis_Button:hover,
32
+ ul.ColVis_collection li:hover {
33
+ border: 1px solid #666;
34
+ text-decoration: none !important;
35
+
36
+ -webkit-box-shadow: 1px 1px 3px #999;
37
+ -moz-box-shadow: 1px 1px 3px #999;
38
+ -ms-box-shadow: 1px 1px 3px #999;
39
+ -o-box-shadow: 1px 1px 3px #999;
40
+ box-shadow: 1px 1px 3px #999;
41
+
42
+ background: #f3f3f3; /* Old browsers */
43
+ background: -webkit-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Chrome10+,Safari5.1+ */
44
+ background: -moz-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* FF3.6+ */
45
+ background: -ms-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* IE10+ */
46
+ background: -o-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Opera 11.10+ */
47
+ background: linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* W3C */
48
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 ); /* IE6-9 */
49
+ }
50
+
51
+ button.ColVis_Button {
52
+ height: 30px;
53
+ padding: 3px 8px;
54
+ }
55
+
56
+ button.ColVis_Button::-moz-focus-inner {
57
+ border: none !important;
58
+ padding: 0;
59
+ }
60
+
61
+ button.ColVis_Button:active {
62
+ outline: none;
63
+ }
64
+
65
+
66
+ div.ColVis_collectionBackground {
67
+ position: fixed;
68
+ top: 0;
69
+ left: 0;
70
+ height: 100%;
71
+ width: 100%;
72
+ background-color: black;
73
+ z-index: 1100;
74
+ }
75
+
76
+ ul.ColVis_collection {
77
+ list-style: none;
78
+ width: 150px;
79
+ padding: 8px 8px 4px 8px;
80
+ margin: 0;
81
+ border: 1px solid #ccc;
82
+ border: 1px solid rgba( 0, 0, 0, 0.4 );
83
+ background-color: #f3f3f3;
84
+ background-color: rgb( 255, 255, 255);
85
+ overflow: hidden;
86
+ z-index: 2002;
87
+
88
+ -webkit-border-radius: 5px;
89
+ -moz-border-radius: 5px;
90
+ -ms-border-radius: 5px;
91
+ -o-border-radius: 5px;
92
+ border-radius: 5px;
93
+
94
+ -webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
95
+ -moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
96
+ -ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
97
+ -o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
98
+ box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3);
99
+ }
100
+
101
+ ul.ColVis_collection li {
102
+ position: relative;
103
+ height: auto;
104
+ left: 0;
105
+ right: 0;
106
+ padding: 0.5em;
107
+
108
+ display: block;
109
+ float: none;
110
+ margin-bottom: 4px;
111
+
112
+ -webkit-box-shadow: 1px 1px 3px #999;
113
+ -moz-box-shadow: 1px 1px 3px #999;
114
+ -ms-box-shadow: 1px 1px 3px #999;
115
+ -o-box-shadow: 1px 1px 3px #999;
116
+ box-shadow: 1px 1px 3px #999;
117
+ }
118
+
119
+ ul.ColVis_collection li {
120
+ text-align: left;
121
+ }
122
+
123
+ ul.ColVis_collection li.ColVis_Button:hover {
124
+ border: 1px solid #999;
125
+ background-color: #f0f0f0;
126
+ }
127
+
128
+ ul.ColVis_collection li span {
129
+ display: inline-block;
130
+ padding-left: 0.5em;
131
+ cursor: pointer;
132
+ }
133
+
134
+
135
+ ul.ColVis_collection li.ColVis_Special {
136
+ border-color: #555;
137
+ background: rgb(237,237,237); /* Old browsers */
138
+ background: -webkit-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Chrome10+,Safari5.1+ */
139
+ background: -moz-linear-gradient(top, rgba(237,237,237,1) 0%, rgba(214,214,214,1) 77%, rgba(232,232,232,1) 100%); /* FF3.6+ */
140
+ background: -ms-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* IE10+ */
141
+ background: -o-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Opera 11.10+ */
142
+ background: linear-gradient(to bottom, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* W3C */
143
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ededed', endColorstr='#e8e8e8',GradientType=0 ); /* IE6-9 */
144
+ }
145
+
146
+ ul.ColVis_collection li.ColVis_Special:hover {
147
+ background: #e2e2e2; /* Old browsers */
148
+ background: -webkit-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Chrome10+,Safari5.1+ */
149
+ background: -moz-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* FF3.6+ */
150
+ background: -ms-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* IE10+ */
151
+ background: -o-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Opera 11.10+ */
152
+ background: linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* W3C */
153
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#e2e2e2',GradientType=0 ); /* IE6-9 */
154
+ }
155
+
156
+
157
+ span.ColVis_radio {
158
+ display: inline-block;
159
+ width: 20px;
160
+ }
161
+
162
+ div.ColVis_catcher {
163
+ position: absolute;
164
+ z-index: 1101;
165
+ }
166
+
167
+ .disabled {
168
+ color: #999;
169
+ }
170
+
171
+
@@ -0,0 +1,1123 @@
1
+ /*! ColVis 1.1.2
2
+ * ©2010-2015 SpryMedia Ltd - datatables.net/license
3
+ */
4
+
5
+ /**
6
+ * @summary ColVis
7
+ * @description Controls for column visibility in DataTables
8
+ * @version 1.1.2
9
+ * @file dataTables.colReorder.js
10
+ * @author SpryMedia Ltd (www.sprymedia.co.uk)
11
+ * @contact www.sprymedia.co.uk/contact
12
+ * @copyright Copyright 2010-2015 SpryMedia Ltd.
13
+ *
14
+ * This source file is free software, available under the following license:
15
+ * MIT license - http://datatables.net/license/mit
16
+ *
17
+ * This source file is distributed in the hope that it will be useful, but
18
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
20
+ *
21
+ * For details please refer to: http://www.datatables.net
22
+ */
23
+
24
+ (function(window, document, undefined) {
25
+
26
+
27
+ var factory = function( $, DataTable ) {
28
+ "use strict";
29
+
30
+ /**
31
+ * ColVis provides column visibility control for DataTables
32
+ *
33
+ * @class ColVis
34
+ * @constructor
35
+ * @param {object} DataTables settings object. With DataTables 1.10 this can
36
+ * also be and API instance, table node, jQuery collection or jQuery selector.
37
+ * @param {object} ColVis configuration options
38
+ */
39
+ var ColVis = function( oDTSettings, oInit )
40
+ {
41
+ /* Santiy check that we are a new instance */
42
+ if ( !this.CLASS || this.CLASS != "ColVis" )
43
+ {
44
+ alert( "Warning: ColVis must be initialised with the keyword 'new'" );
45
+ }
46
+
47
+ if ( typeof oInit == 'undefined' )
48
+ {
49
+ oInit = {};
50
+ }
51
+
52
+ var camelToHungarian = $.fn.dataTable.camelToHungarian;
53
+ if ( camelToHungarian ) {
54
+ camelToHungarian( ColVis.defaults, ColVis.defaults, true );
55
+ camelToHungarian( ColVis.defaults, oInit );
56
+ }
57
+
58
+
59
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
60
+ * Public class variables
61
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
62
+
63
+ /**
64
+ * @namespace Settings object which contains customisable information for
65
+ * ColVis instance. Augmented by ColVis.defaults
66
+ */
67
+ this.s = {
68
+ /**
69
+ * DataTables settings object
70
+ * @property dt
71
+ * @type Object
72
+ * @default null
73
+ */
74
+ "dt": null,
75
+
76
+ /**
77
+ * Customisation object
78
+ * @property oInit
79
+ * @type Object
80
+ * @default passed in
81
+ */
82
+ "oInit": oInit,
83
+
84
+ /**
85
+ * Flag to say if the collection is hidden
86
+ * @property hidden
87
+ * @type boolean
88
+ * @default true
89
+ */
90
+ "hidden": true,
91
+
92
+ /**
93
+ * Store the original visibility settings so they could be restored
94
+ * @property abOriginal
95
+ * @type Array
96
+ * @default []
97
+ */
98
+ "abOriginal": []
99
+ };
100
+
101
+
102
+ /**
103
+ * @namespace Common and useful DOM elements for the class instance
104
+ */
105
+ this.dom = {
106
+ /**
107
+ * Wrapper for the button - given back to DataTables as the node to insert
108
+ * @property wrapper
109
+ * @type Node
110
+ * @default null
111
+ */
112
+ "wrapper": null,
113
+
114
+ /**
115
+ * Activation button
116
+ * @property button
117
+ * @type Node
118
+ * @default null
119
+ */
120
+ "button": null,
121
+
122
+ /**
123
+ * Collection list node
124
+ * @property collection
125
+ * @type Node
126
+ * @default null
127
+ */
128
+ "collection": null,
129
+
130
+ /**
131
+ * Background node used for shading the display and event capturing
132
+ * @property background
133
+ * @type Node
134
+ * @default null
135
+ */
136
+ "background": null,
137
+
138
+ /**
139
+ * Element to position over the activation button to catch mouse events when using mouseover
140
+ * @property catcher
141
+ * @type Node
142
+ * @default null
143
+ */
144
+ "catcher": null,
145
+
146
+ /**
147
+ * List of button elements
148
+ * @property buttons
149
+ * @type Array
150
+ * @default []
151
+ */
152
+ "buttons": [],
153
+
154
+ /**
155
+ * List of group button elements
156
+ * @property groupButtons
157
+ * @type Array
158
+ * @default []
159
+ */
160
+ "groupButtons": [],
161
+
162
+ /**
163
+ * Restore button
164
+ * @property restore
165
+ * @type Node
166
+ * @default null
167
+ */
168
+ "restore": null
169
+ };
170
+
171
+ /* Store global reference */
172
+ ColVis.aInstances.push( this );
173
+
174
+ /* Constructor logic */
175
+ this.s.dt = $.fn.dataTable.Api ?
176
+ new $.fn.dataTable.Api( oDTSettings ).settings()[0] :
177
+ oDTSettings;
178
+
179
+ this._fnConstruct( oInit );
180
+ return this;
181
+ };
182
+
183
+
184
+
185
+ ColVis.prototype = {
186
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
187
+ * Public methods
188
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
189
+
190
+ /**
191
+ * Get the ColVis instance's control button so it can be injected into the
192
+ * DOM
193
+ * @method button
194
+ * @returns {node} ColVis button
195
+ */
196
+ button: function ()
197
+ {
198
+ return this.dom.wrapper;
199
+ },
200
+
201
+ /**
202
+ * Alias of `rebuild` for backwards compatibility
203
+ * @method fnRebuild
204
+ */
205
+ "fnRebuild": function ()
206
+ {
207
+ this.rebuild();
208
+ },
209
+
210
+ /**
211
+ * Rebuild the list of buttons for this instance (i.e. if there is a column
212
+ * header update)
213
+ * @method fnRebuild
214
+ */
215
+ rebuild: function ()
216
+ {
217
+ /* Remove the old buttons */
218
+ for ( var i=this.dom.buttons.length-1 ; i>=0 ; i-- ) {
219
+ this.dom.collection.removeChild( this.dom.buttons[i] );
220
+ }
221
+ this.dom.buttons.splice( 0, this.dom.buttons.length );
222
+ this.dom.groupButtons.splice(0, this.dom.groupButtons.length);
223
+
224
+ if ( this.dom.restore ) {
225
+ this.dom.restore.parentNode( this.dom.restore );
226
+ }
227
+
228
+ /* Re-add them (this is not the optimal way of doing this, it is fast and effective) */
229
+ this._fnAddGroups();
230
+ this._fnAddButtons();
231
+
232
+ /* Update the checkboxes */
233
+ this._fnDrawCallback();
234
+ },
235
+
236
+
237
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
238
+ * Private methods (they are of course public in JS, but recommended as private)
239
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
240
+
241
+ /**
242
+ * Constructor logic
243
+ * @method _fnConstruct
244
+ * @returns void
245
+ * @private
246
+ */
247
+ "_fnConstruct": function ( init )
248
+ {
249
+ this._fnApplyCustomisation( init );
250
+
251
+ var that = this;
252
+ var i, iLen;
253
+ this.dom.wrapper = document.createElement('div');
254
+ this.dom.wrapper.className = "ColVis";
255
+
256
+ this.dom.button = $( '<button />', {
257
+ 'class': !this.s.dt.bJUI ?
258
+ "ColVis_Button ColVis_MasterButton" :
259
+ "ColVis_Button ColVis_MasterButton ui-button ui-state-default"
260
+ } )
261
+ .append( '<span>'+this.s.buttonText+'</span>' )
262
+ .bind( this.s.activate=="mouseover" ? "mouseover" : "click", function (e) {
263
+ e.preventDefault();
264
+ that._fnCollectionShow();
265
+ } )
266
+ .appendTo( this.dom.wrapper )[0];
267
+
268
+ this.dom.catcher = this._fnDomCatcher();
269
+ this.dom.collection = this._fnDomCollection();
270
+ this.dom.background = this._fnDomBackground();
271
+
272
+ this._fnAddGroups();
273
+ this._fnAddButtons();
274
+
275
+ /* Store the original visibility information */
276
+ for ( i=0, iLen=this.s.dt.aoColumns.length ; i<iLen ; i++ )
277
+ {
278
+ this.s.abOriginal.push( this.s.dt.aoColumns[i].bVisible );
279
+ }
280
+
281
+ /* Update on each draw */
282
+ this.s.dt.aoDrawCallback.push( {
283
+ "fn": function () {
284
+ that._fnDrawCallback.call( that );
285
+ },
286
+ "sName": "ColVis"
287
+ } );
288
+
289
+ /* If columns are reordered, then we need to update our exclude list and
290
+ * rebuild the displayed list
291
+ */
292
+ $(this.s.dt.oInstance).bind( 'column-reorder.dt', function ( e, oSettings, oReorder ) {
293
+ for ( i=0, iLen=that.s.aiExclude.length ; i<iLen ; i++ ) {
294
+ that.s.aiExclude[i] = oReorder.aiInvertMapping[ that.s.aiExclude[i] ];
295
+ }
296
+
297
+ var mStore = that.s.abOriginal.splice( oReorder.iFrom, 1 )[0];
298
+ that.s.abOriginal.splice( oReorder.iTo, 0, mStore );
299
+
300
+ that.fnRebuild();
301
+ } );
302
+
303
+ $(this.s.dt.oInstance).bind( 'destroy.dt', function () {
304
+ $(that.dom.wrapper).remove();
305
+ } );
306
+
307
+ // Set the initial state
308
+ this._fnDrawCallback();
309
+ },
310
+
311
+
312
+ /**
313
+ * Apply any customisation to the settings from the DataTables initialisation
314
+ * @method _fnApplyCustomisation
315
+ * @returns void
316
+ * @private
317
+ */
318
+ "_fnApplyCustomisation": function ( init )
319
+ {
320
+ $.extend( true, this.s, ColVis.defaults, init );
321
+
322
+ // Slightly messy overlap for the camelCase notation
323
+ if ( ! this.s.showAll && this.s.bShowAll ) {
324
+ this.s.showAll = this.s.sShowAll;
325
+ }
326
+
327
+ if ( ! this.s.restore && this.s.bRestore ) {
328
+ this.s.restore = this.s.sRestore;
329
+ }
330
+
331
+ // CamelCase to Hungarian for the column groups
332
+ var groups = this.s.groups;
333
+ var hungarianGroups = this.s.aoGroups;
334
+ if ( groups ) {
335
+ for ( var i=0, ien=groups.length ; i<ien ; i++ ) {
336
+ if ( groups[i].title ) {
337
+ hungarianGroups[i].sTitle = groups[i].title;
338
+ }
339
+ if ( groups[i].columns ) {
340
+ hungarianGroups[i].aiColumns = groups[i].columns;
341
+ }
342
+ }
343
+ }
344
+ },
345
+
346
+
347
+ /**
348
+ * On each table draw, check the visibility checkboxes as needed. This allows any process to
349
+ * update the table's column visibility and ColVis will still be accurate.
350
+ * @method _fnDrawCallback
351
+ * @returns void
352
+ * @private
353
+ */
354
+ "_fnDrawCallback": function ()
355
+ {
356
+ var columns = this.s.dt.aoColumns;
357
+ var buttons = this.dom.buttons;
358
+ var groups = this.s.aoGroups;
359
+ var button;
360
+
361
+ for ( var i=0, ien=buttons.length ; i<ien ; i++ ) {
362
+ button = buttons[i];
363
+
364
+ if ( button.__columnIdx !== undefined ) {
365
+ $('input', button).prop( 'checked', columns[ button.__columnIdx ].bVisible );
366
+ }
367
+ }
368
+
369
+ var allVisible = function ( columnIndeces ) {
370
+ for ( var k=0, kLen=columnIndeces.length ; k<kLen ; k++ )
371
+ {
372
+ if ( columns[columnIndeces[k]].bVisible === false ) { return false; }
373
+ }
374
+ return true;
375
+ };
376
+ var allHidden = function ( columnIndeces ) {
377
+ for ( var m=0 , mLen=columnIndeces.length ; m<mLen ; m++ )
378
+ {
379
+ if ( columns[columnIndeces[m]].bVisible === true ) { return false; }
380
+ }
381
+ return true;
382
+ };
383
+
384
+ for ( var j=0, jLen=groups.length ; j<jLen ; j++ )
385
+ {
386
+ if ( allVisible(groups[j].aiColumns) )
387
+ {
388
+ $('input', this.dom.groupButtons[j]).prop('checked', true);
389
+ $('input', this.dom.groupButtons[j]).prop('indeterminate', false);
390
+ }
391
+ else if ( allHidden(groups[j].aiColumns) )
392
+ {
393
+ $('input', this.dom.groupButtons[j]).prop('checked', false);
394
+ $('input', this.dom.groupButtons[j]).prop('indeterminate', false);
395
+ }
396
+ else
397
+ {
398
+ $('input', this.dom.groupButtons[j]).prop('indeterminate', true);
399
+ }
400
+ }
401
+ },
402
+
403
+
404
+ /**
405
+ * Loop through the groups (provided in the settings) and create a button for each.
406
+ * @method _fnAddgroups
407
+ * @returns void
408
+ * @private
409
+ */
410
+ "_fnAddGroups": function ()
411
+ {
412
+ var nButton;
413
+
414
+ if ( typeof this.s.aoGroups != 'undefined' )
415
+ {
416
+ for ( var i=0, iLen=this.s.aoGroups.length ; i<iLen ; i++ )
417
+ {
418
+ nButton = this._fnDomGroupButton( i );
419
+ this.dom.groupButtons.push( nButton );
420
+ this.dom.buttons.push( nButton );
421
+ this.dom.collection.appendChild( nButton );
422
+ }
423
+ }
424
+ },
425
+
426
+
427
+ /**
428
+ * Loop through the columns in the table and as a new button for each one.
429
+ * @method _fnAddButtons
430
+ * @returns void
431
+ * @private
432
+ */
433
+ "_fnAddButtons": function ()
434
+ {
435
+ var
436
+ nButton,
437
+ columns = this.s.dt.aoColumns;
438
+
439
+ if ( $.inArray( 'all', this.s.aiExclude ) === -1 ) {
440
+ for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
441
+ {
442
+ if ( $.inArray( i, this.s.aiExclude ) === -1 )
443
+ {
444
+ nButton = this._fnDomColumnButton( i );
445
+ nButton.__columnIdx = i;
446
+ this.dom.buttons.push( nButton );
447
+ }
448
+ }
449
+ }
450
+
451
+ if ( this.s.order === 'alpha' ) {
452
+ this.dom.buttons.sort( function ( a, b ) {
453
+ var titleA = columns[ a.__columnIdx ].sTitle;
454
+ var titleB = columns[ b.__columnIdx ].sTitle;
455
+
456
+ return titleA === titleB ?
457
+ 0 :
458
+ titleA < titleB ?
459
+ -1 :
460
+ 1;
461
+ } );
462
+ }
463
+
464
+ if ( this.s.restore )
465
+ {
466
+ nButton = this._fnDomRestoreButton();
467
+ nButton.className += " ColVis_Restore";
468
+ this.dom.buttons.push( nButton );
469
+ }
470
+
471
+ if ( this.s.showAll )
472
+ {
473
+ nButton = this._fnDomShowXButton( this.s.showAll, true );
474
+ nButton.className += " ColVis_ShowAll";
475
+ this.dom.buttons.push( nButton );
476
+ }
477
+
478
+ if ( this.s.showNone )
479
+ {
480
+ nButton = this._fnDomShowXButton( this.s.showNone, false );
481
+ nButton.className += " ColVis_ShowNone";
482
+ this.dom.buttons.push( nButton );
483
+ }
484
+
485
+ $(this.dom.collection).append( this.dom.buttons );
486
+ },
487
+
488
+
489
+ /**
490
+ * Create a button which allows a "restore" action
491
+ * @method _fnDomRestoreButton
492
+ * @returns {Node} Created button
493
+ * @private
494
+ */
495
+ "_fnDomRestoreButton": function ()
496
+ {
497
+ var
498
+ that = this,
499
+ dt = this.s.dt;
500
+
501
+ return $(
502
+ '<li class="ColVis_Special '+(dt.bJUI ? 'ui-button ui-state-default' : '')+'">'+
503
+ this.s.restore+
504
+ '</li>'
505
+ )
506
+ .click( function (e) {
507
+ for ( var i=0, iLen=that.s.abOriginal.length ; i<iLen ; i++ )
508
+ {
509
+ that.s.dt.oInstance.fnSetColumnVis( i, that.s.abOriginal[i], false );
510
+ }
511
+ that._fnAdjustOpenRows();
512
+ that.s.dt.oInstance.fnAdjustColumnSizing( false );
513
+ that.s.dt.oInstance.fnDraw( false );
514
+ } )[0];
515
+ },
516
+
517
+
518
+ /**
519
+ * Create a button which allows show all and show node actions
520
+ * @method _fnDomShowXButton
521
+ * @returns {Node} Created button
522
+ * @private
523
+ */
524
+ "_fnDomShowXButton": function ( str, action )
525
+ {
526
+ var
527
+ that = this,
528
+ dt = this.s.dt;
529
+
530
+ return $(
531
+ '<li class="ColVis_Special '+(dt.bJUI ? 'ui-button ui-state-default' : '')+'">'+
532
+ str+
533
+ '</li>'
534
+ )
535
+ .click( function (e) {
536
+ for ( var i=0, iLen=that.s.abOriginal.length ; i<iLen ; i++ )
537
+ {
538
+ if (that.s.aiExclude.indexOf(i) === -1)
539
+ {
540
+ that.s.dt.oInstance.fnSetColumnVis( i, action, false );
541
+ }
542
+ }
543
+ that._fnAdjustOpenRows();
544
+ that.s.dt.oInstance.fnAdjustColumnSizing( false );
545
+ that.s.dt.oInstance.fnDraw( false );
546
+ } )[0];
547
+ },
548
+
549
+
550
+ /**
551
+ * Create the DOM for a show / hide group button
552
+ * @method _fnDomGroupButton
553
+ * @param {int} i Group in question, order based on that provided in settings
554
+ * @returns {Node} Created button
555
+ * @private
556
+ */
557
+ "_fnDomGroupButton": function ( i )
558
+ {
559
+ var
560
+ that = this,
561
+ dt = this.s.dt,
562
+ oGroup = this.s.aoGroups[i];
563
+
564
+ return $(
565
+ '<li class="ColVis_Special '+(dt.bJUI ? 'ui-button ui-state-default' : '')+'">'+
566
+ '<label>'+
567
+ '<input type="checkbox" />'+
568
+ '<span>'+oGroup.sTitle+'</span>'+
569
+ '</label>'+
570
+ '</li>'
571
+ )
572
+ .click( function (e) {
573
+ var showHide = !$('input', this).is(":checked");
574
+ if ( e.target.nodeName.toLowerCase() !== "li" )
575
+ {
576
+ showHide = ! showHide;
577
+ }
578
+
579
+ for ( var j=0 ; j < oGroup.aiColumns.length ; j++ )
580
+ {
581
+ that.s.dt.oInstance.fnSetColumnVis( oGroup.aiColumns[j], showHide );
582
+ }
583
+ } )[0];
584
+ },
585
+
586
+
587
+ /**
588
+ * Create the DOM for a show / hide button
589
+ * @method _fnDomColumnButton
590
+ * @param {int} i Column in question
591
+ * @returns {Node} Created button
592
+ * @private
593
+ */
594
+ "_fnDomColumnButton": function ( i )
595
+ {
596
+ var
597
+ that = this,
598
+ column = this.s.dt.aoColumns[i],
599
+ dt = this.s.dt;
600
+
601
+ var title = this.s.fnLabel===null ?
602
+ column.sTitle :
603
+ this.s.fnLabel( i, column.sTitle, column.nTh );
604
+
605
+ return $(
606
+ '<li '+(dt.bJUI ? 'class="ui-button ui-state-default"' : '')+'>'+
607
+ '<label>'+
608
+ '<input type="checkbox" />'+
609
+ '<span>'+title+'</span>'+
610
+ '</label>'+
611
+ '</li>'
612
+ )
613
+ .click( function (e) {
614
+ var showHide = !$('input', this).is(":checked");
615
+ if ( e.target.nodeName.toLowerCase() !== "li" )
616
+ {
617
+ if ( e.target.nodeName.toLowerCase() == "input" || that.s.fnStateChange === null )
618
+ {
619
+ showHide = ! showHide;
620
+ }
621
+ }
622
+
623
+ /* Need to consider the case where the initialiser created more than one table - change the
624
+ * API index that DataTables is using
625
+ */
626
+ var oldIndex = $.fn.dataTableExt.iApiIndex;
627
+ $.fn.dataTableExt.iApiIndex = that._fnDataTablesApiIndex.call(that);
628
+
629
+ // Optimisation for server-side processing when scrolling - don't do a full redraw
630
+ if ( dt.oFeatures.bServerSide )
631
+ {
632
+ that.s.dt.oInstance.fnSetColumnVis( i, showHide, false );
633
+ that.s.dt.oInstance.fnAdjustColumnSizing( false );
634
+ if (dt.oScroll.sX !== "" || dt.oScroll.sY !== "" )
635
+ {
636
+ that.s.dt.oInstance.oApi._fnScrollDraw( that.s.dt );
637
+ }
638
+ that._fnDrawCallback();
639
+ }
640
+ else
641
+ {
642
+ that.s.dt.oInstance.fnSetColumnVis( i, showHide );
643
+ }
644
+
645
+ $.fn.dataTableExt.iApiIndex = oldIndex; /* Restore */
646
+
647
+ if ( that.s.fnStateChange !== null )
648
+ {
649
+ if ( e.target.nodeName.toLowerCase() == "span" )
650
+ {
651
+ e.preventDefault();
652
+ }
653
+ that.s.fnStateChange.call( that, i, showHide );
654
+ }
655
+ } )[0];
656
+ },
657
+
658
+
659
+ /**
660
+ * Get the position in the DataTables instance array of the table for this
661
+ * instance of ColVis
662
+ * @method _fnDataTablesApiIndex
663
+ * @returns {int} Index
664
+ * @private
665
+ */
666
+ "_fnDataTablesApiIndex": function ()
667
+ {
668
+ for ( var i=0, iLen=this.s.dt.oInstance.length ; i<iLen ; i++ )
669
+ {
670
+ if ( this.s.dt.oInstance[i] == this.s.dt.nTable )
671
+ {
672
+ return i;
673
+ }
674
+ }
675
+ return 0;
676
+ },
677
+
678
+
679
+ /**
680
+ * Create the element used to contain list the columns (it is shown and
681
+ * hidden as needed)
682
+ * @method _fnDomCollection
683
+ * @returns {Node} div container for the collection
684
+ * @private
685
+ */
686
+ "_fnDomCollection": function ()
687
+ {
688
+ return $('<ul />', {
689
+ 'class': !this.s.dt.bJUI ?
690
+ "ColVis_collection" :
691
+ "ColVis_collection ui-buttonset ui-buttonset-multi"
692
+ } )
693
+ .css( {
694
+ 'display': 'none',
695
+ 'opacity': 0,
696
+ 'position': ! this.s.bCssPosition ?
697
+ 'absolute' :
698
+ ''
699
+ } )[0];
700
+ },
701
+
702
+
703
+ /**
704
+ * An element to be placed on top of the activate button to catch events
705
+ * @method _fnDomCatcher
706
+ * @returns {Node} div container for the collection
707
+ * @private
708
+ */
709
+ "_fnDomCatcher": function ()
710
+ {
711
+ var
712
+ that = this,
713
+ nCatcher = document.createElement('div');
714
+ nCatcher.className = "ColVis_catcher";
715
+
716
+ $(nCatcher).click( function () {
717
+ that._fnCollectionHide.call( that, null, null );
718
+ } );
719
+
720
+ return nCatcher;
721
+ },
722
+
723
+
724
+ /**
725
+ * Create the element used to shade the background, and capture hide events (it is shown and
726
+ * hidden as needed)
727
+ * @method _fnDomBackground
728
+ * @returns {Node} div container for the background
729
+ * @private
730
+ */
731
+ "_fnDomBackground": function ()
732
+ {
733
+ var that = this;
734
+
735
+ var background = $('<div></div>')
736
+ .addClass( 'ColVis_collectionBackground' )
737
+ .css( 'opacity', 0 )
738
+ .click( function () {
739
+ that._fnCollectionHide.call( that, null, null );
740
+ } );
741
+
742
+ /* When considering a mouse over action for the activation, we also consider a mouse out
743
+ * which is the same as a mouse over the background - without all the messing around of
744
+ * bubbling events. Use the catcher element to avoid messing around with bubbling
745
+ */
746
+ if ( this.s.activate == "mouseover" )
747
+ {
748
+ background.mouseover( function () {
749
+ that.s.overcollection = false;
750
+ that._fnCollectionHide.call( that, null, null );
751
+ } );
752
+ }
753
+
754
+ return background[0];
755
+ },
756
+
757
+
758
+ /**
759
+ * Show the show / hide list and the background
760
+ * @method _fnCollectionShow
761
+ * @returns void
762
+ * @private
763
+ */
764
+ "_fnCollectionShow": function ()
765
+ {
766
+ var that = this, i, iLen, iLeft;
767
+ var oPos = $(this.dom.button).offset();
768
+ var nHidden = this.dom.collection;
769
+ var nBackground = this.dom.background;
770
+ var iDivX = parseInt(oPos.left, 10);
771
+ var iDivY = parseInt(oPos.top + $(this.dom.button).outerHeight(), 10);
772
+
773
+ if ( ! this.s.bCssPosition )
774
+ {
775
+ nHidden.style.top = iDivY+"px";
776
+ nHidden.style.left = iDivX+"px";
777
+ }
778
+
779
+ $(nHidden).css( {
780
+ 'display': 'block',
781
+ 'opacity': 0
782
+ } );
783
+
784
+ nBackground.style.bottom ='0px';
785
+ nBackground.style.right = '0px';
786
+
787
+ var oStyle = this.dom.catcher.style;
788
+ oStyle.height = $(this.dom.button).outerHeight()+"px";
789
+ oStyle.width = $(this.dom.button).outerWidth()+"px";
790
+ oStyle.top = oPos.top+"px";
791
+ oStyle.left = iDivX+"px";
792
+
793
+ document.body.appendChild( nBackground );
794
+ document.body.appendChild( nHidden );
795
+ document.body.appendChild( this.dom.catcher );
796
+
797
+ /* This results in a very small delay for the end user but it allows the animation to be
798
+ * much smoother. If you don't want the animation, then the setTimeout can be removed
799
+ */
800
+ $(nHidden).animate({"opacity": 1}, that.s.iOverlayFade);
801
+ $(nBackground).animate({"opacity": 0.1}, that.s.iOverlayFade, 'linear', function () {
802
+ /* In IE6 if you set the checked attribute of a hidden checkbox, then this is not visually
803
+ * reflected. As such, we need to do it here, once it is visible. Unbelievable.
804
+ */
805
+ if ( $.browser && $.browser.msie && $.browser.version == "6.0" )
806
+ {
807
+ that._fnDrawCallback();
808
+ }
809
+ });
810
+
811
+ /* Visual corrections to try and keep the collection visible */
812
+ if ( !this.s.bCssPosition )
813
+ {
814
+ iLeft = ( this.s.sAlign=="left" ) ?
815
+ iDivX :
816
+ iDivX - $(nHidden).outerWidth() + $(this.dom.button).outerWidth();
817
+
818
+ nHidden.style.left = iLeft+"px";
819
+
820
+ var iDivWidth = $(nHidden).outerWidth();
821
+ var iDivHeight = $(nHidden).outerHeight();
822
+ var iDocWidth = $(document).width();
823
+
824
+ if ( iLeft + iDivWidth > iDocWidth )
825
+ {
826
+ nHidden.style.left = (iDocWidth-iDivWidth)+"px";
827
+ }
828
+ }
829
+
830
+ this.s.hidden = false;
831
+ },
832
+
833
+
834
+ /**
835
+ * Hide the show / hide list and the background
836
+ * @method _fnCollectionHide
837
+ * @returns void
838
+ * @private
839
+ */
840
+ "_fnCollectionHide": function ( )
841
+ {
842
+ var that = this;
843
+
844
+ if ( !this.s.hidden && this.dom.collection !== null )
845
+ {
846
+ this.s.hidden = true;
847
+
848
+ $(this.dom.collection).animate({"opacity": 0}, that.s.iOverlayFade, function (e) {
849
+ this.style.display = "none";
850
+ } );
851
+
852
+ $(this.dom.background).animate({"opacity": 0}, that.s.iOverlayFade, function (e) {
853
+ document.body.removeChild( that.dom.background );
854
+ document.body.removeChild( that.dom.catcher );
855
+ } );
856
+ }
857
+ },
858
+
859
+
860
+ /**
861
+ * Alter the colspan on any fnOpen rows
862
+ */
863
+ "_fnAdjustOpenRows": function ()
864
+ {
865
+ var aoOpen = this.s.dt.aoOpenRows;
866
+ var iVisible = this.s.dt.oApi._fnVisbleColumns( this.s.dt );
867
+
868
+ for ( var i=0, iLen=aoOpen.length ; i<iLen ; i++ ) {
869
+ aoOpen[i].nTr.getElementsByTagName('td')[0].colSpan = iVisible;
870
+ }
871
+ }
872
+ };
873
+
874
+
875
+
876
+
877
+
878
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
879
+ * Static object methods
880
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
881
+
882
+ /**
883
+ * Rebuild the collection for a given table, or all tables if no parameter given
884
+ * @method ColVis.fnRebuild
885
+ * @static
886
+ * @param object oTable DataTable instance to consider - optional
887
+ * @returns void
888
+ */
889
+ ColVis.fnRebuild = function ( oTable )
890
+ {
891
+ var nTable = null;
892
+ if ( typeof oTable != 'undefined' )
893
+ {
894
+ nTable = $.fn.dataTable.Api ?
895
+ new $.fn.dataTable.Api( oTable ).table().node() :
896
+ oTable.fnSettings().nTable;
897
+ }
898
+
899
+ for ( var i=0, iLen=ColVis.aInstances.length ; i<iLen ; i++ )
900
+ {
901
+ if ( typeof oTable == 'undefined' || nTable == ColVis.aInstances[i].s.dt.nTable )
902
+ {
903
+ ColVis.aInstances[i].fnRebuild();
904
+ }
905
+ }
906
+ };
907
+
908
+
909
+ ColVis.defaults = {
910
+ /**
911
+ * Mode of activation. Can be 'click' or 'mouseover'
912
+ * @property activate
913
+ * @type string
914
+ * @default click
915
+ */
916
+ active: 'click',
917
+
918
+ /**
919
+ * Text used for the button
920
+ * @property buttonText
921
+ * @type string
922
+ * @default Show / hide columns
923
+ */
924
+ buttonText: 'Show / hide columns',
925
+
926
+ /**
927
+ * List of columns (integers) which should be excluded from the list
928
+ * @property aiExclude
929
+ * @type array
930
+ * @default []
931
+ */
932
+ aiExclude: [],
933
+
934
+ /**
935
+ * Show restore button
936
+ * @property bRestore
937
+ * @type boolean
938
+ * @default false
939
+ */
940
+ bRestore: false,
941
+
942
+ /**
943
+ * Restore button text
944
+ * @property sRestore
945
+ * @type string
946
+ * @default Restore original
947
+ */
948
+ sRestore: 'Restore original',
949
+
950
+ /**
951
+ * Show Show-All button
952
+ * @property bShowAll
953
+ * @type boolean
954
+ * @default false
955
+ */
956
+ bShowAll: false,
957
+
958
+ /**
959
+ * Show All button text
960
+ * @property sShowAll
961
+ * @type string
962
+ * @default Restore original
963
+ */
964
+ sShowAll: 'Show All',
965
+
966
+ /**
967
+ * Position of the collection menu when shown - align "left" or "right"
968
+ * @property sAlign
969
+ * @type string
970
+ * @default left
971
+ */
972
+ sAlign: 'left',
973
+
974
+ /**
975
+ * Callback function to tell the user when the state has changed
976
+ * @property fnStateChange
977
+ * @type function
978
+ * @default null
979
+ */
980
+ fnStateChange: null,
981
+
982
+ /**
983
+ * Overlay animation duration in mS
984
+ * @property iOverlayFade
985
+ * @type integer|false
986
+ * @default 500
987
+ */
988
+ iOverlayFade: 500,
989
+
990
+ /**
991
+ * Label callback for column names. Takes three parameters: 1. the
992
+ * column index, 2. the column title detected by DataTables and 3. the
993
+ * TH node for the column
994
+ * @property fnLabel
995
+ * @type function
996
+ * @default null
997
+ */
998
+ fnLabel: null,
999
+
1000
+ /**
1001
+ * Indicate if the column list should be positioned by Javascript,
1002
+ * visually below the button or allow CSS to do the positioning
1003
+ * @property bCssPosition
1004
+ * @type boolean
1005
+ * @default false
1006
+ */
1007
+ bCssPosition: false,
1008
+
1009
+ /**
1010
+ * Group buttons
1011
+ * @property aoGroups
1012
+ * @type array
1013
+ * @default []
1014
+ */
1015
+ aoGroups: [],
1016
+
1017
+ /**
1018
+ * Button ordering - 'alpha' (alphabetical) or 'column' (table column
1019
+ * order)
1020
+ * @property order
1021
+ * @type string
1022
+ * @default column
1023
+ */
1024
+ order: 'column'
1025
+ };
1026
+
1027
+
1028
+
1029
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
1030
+ * Static object properties
1031
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1032
+
1033
+ /**
1034
+ * Collection of all ColVis instances
1035
+ * @property ColVis.aInstances
1036
+ * @static
1037
+ * @type Array
1038
+ * @default []
1039
+ */
1040
+ ColVis.aInstances = [];
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
1047
+ * Constants
1048
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1049
+
1050
+ /**
1051
+ * Name of this class
1052
+ * @constant CLASS
1053
+ * @type String
1054
+ * @default ColVis
1055
+ */
1056
+ ColVis.prototype.CLASS = "ColVis";
1057
+
1058
+
1059
+ /**
1060
+ * ColVis version
1061
+ * @constant VERSION
1062
+ * @type String
1063
+ * @default See code
1064
+ */
1065
+ ColVis.VERSION = "1.1.2";
1066
+ ColVis.prototype.VERSION = ColVis.VERSION;
1067
+
1068
+
1069
+
1070
+
1071
+
1072
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
1073
+ * Initialisation
1074
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
1075
+
1076
+ /*
1077
+ * Register a new feature with DataTables
1078
+ */
1079
+ if ( typeof $.fn.dataTable == "function" &&
1080
+ typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
1081
+ $.fn.dataTableExt.fnVersionCheck('1.7.0') )
1082
+ {
1083
+ $.fn.dataTableExt.aoFeatures.push( {
1084
+ "fnInit": function( oDTSettings ) {
1085
+ var init = oDTSettings.oInit;
1086
+ var colvis = new ColVis( oDTSettings, init.colVis || init.oColVis || {} );
1087
+ return colvis.button();
1088
+ },
1089
+ "cFeature": "C",
1090
+ "sFeature": "ColVis"
1091
+ } );
1092
+ }
1093
+ else
1094
+ {
1095
+ alert( "Warning: ColVis requires DataTables 1.7 or greater - www.datatables.net/download");
1096
+ }
1097
+
1098
+
1099
+ // Make ColVis accessible from the DataTables instance
1100
+ $.fn.dataTable.ColVis = ColVis;
1101
+ $.fn.DataTable.ColVis = ColVis;
1102
+
1103
+
1104
+ return ColVis;
1105
+ }; // /factory
1106
+
1107
+
1108
+ // Define as an AMD module if possible
1109
+ if ( typeof define === 'function' && define.amd ) {
1110
+ define( ['jquery', 'datatables'], factory );
1111
+ }
1112
+ else if ( typeof exports === 'object' ) {
1113
+ // Node/CommonJS
1114
+ factory( require('jquery'), require('datatables') );
1115
+ }
1116
+ else if ( jQuery && !jQuery.fn.dataTable.ColVis ) {
1117
+ // Otherwise simply initialise as normal, stopping multiple evaluation
1118
+ factory( jQuery, jQuery.fn.dataTable );
1119
+ }
1120
+
1121
+
1122
+ })(window, document);
1123
+