devoops-rails 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +9 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +69 -0
  5. data/Rakefile +2 -0
  6. data/app/assets/images/devoops-rails/8962691008_7f489395c9_m.jpg +0 -0
  7. data/app/assets/images/devoops-rails/8985207189_01ea27882d_m.jpg +0 -0
  8. data/app/assets/images/devoops-rails/9036958611_fa1bb7f827_m.jpg +0 -0
  9. data/app/assets/images/devoops-rails/9041440555_2175b32078_m.jpg +0 -0
  10. data/app/assets/images/devoops-rails/avatar.jpg +0 -0
  11. data/app/assets/images/devoops-rails/chevron-left.png +0 -0
  12. data/app/assets/images/devoops-rails/chevron-right.png +0 -0
  13. data/app/assets/images/devoops-rails/devoops_getdata.gif +0 -0
  14. data/app/assets/images/devoops-rails/devoops_pattern_b10.png +0 -0
  15. data/app/assets/images/devoops-rails/logo-200.png +0 -0
  16. data/app/assets/images/devoops-rails/logo.png +0 -0
  17. data/app/assets/images/devoops-rails/sort-asc.png +0 -0
  18. data/app/assets/images/devoops-rails/sort-desc.png +0 -0
  19. data/app/assets/images/devoops-rails/sort.png +0 -0
  20. data/app/assets/images/devoops-rails/times.png +0 -0
  21. data/app/assets/images/devoops-rails/ui-accordion-down.png +0 -0
  22. data/app/assets/images/devoops-rails/ui-accordion-right.png +0 -0
  23. data/app/assets/images/devoops-rails/ui-left.png +0 -0
  24. data/app/assets/images/devoops-rails/ui-right.png +0 -0
  25. data/app/assets/javascripts/devoops-rails/devoops.js +2198 -0
  26. data/app/assets/stylesheets/devoops-rails/devoops.css.erb +2360 -0
  27. data/lib/devoops-rails.rb +1 -0
  28. data/lib/devoops/rails.rb +2 -0
  29. data/lib/devoops/rails/engine.rb +9 -0
  30. data/lib/devoops/rails/version.rb +5 -0
  31. metadata +31 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a63ca3f5a0fb7a0eeab340a5d31af1a89697dceb
4
- data.tar.gz: 7f4edf4739e1d9c6f54bb73a32710eea86fa30ac
3
+ metadata.gz: e7c4ccb88d82f3414f4c465c568143bfaf6e2b3c
4
+ data.tar.gz: ec266a440127c6de40fccf54dfcd3a0ce4904b0a
5
5
  SHA512:
6
- metadata.gz: 05ae9c4193756b4e608253239d392e74db449a24de2ae85a6a4ec4eb15f3941f6913d10c21ab2a8a329f4f398346a304b369cee6102c6251119d54a445f1b83f
7
- data.tar.gz: 19d0680dfa7d569d5b67c12ee1f11d3891c4aed9a58b338931d66f0eb827179975ab4311e796e28546f0e1393b54782d9b6b59fc305cdca8a185078b9297de0d
6
+ metadata.gz: c30119650448669172e439745920ec0393017db2ead4c3e95309d9c5ff48901ad9f95a6d244ddc57ecd683ee9ff31f699b9ea515b19f09e403b60ab02aaadb45
7
+ data.tar.gz: 7f846c4e17f3c57438cc63c79d8a6236433d45389b9d70d6d74504ba0b51e039fc50bd4e70954e85ea505364afcc0982fce02a5833c00f8252e09a807e87b308
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+ source 'https://rails-assets.org'
3
+
4
+ # Specify your gem's dependencies in devoops-rails.gemspec
5
+ gem 'rails-assets-bootstrap', '3.1.0'
6
+ gem 'font-awesome-rails', '4.0.3.2'
7
+ gem 'rails-assets-jquery', '2.1.0'
8
+ gem 'rails-assets-jquery-ui', '1.10.4'
9
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Dener W P do Carmo
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,69 @@
1
+ # Devoops::Rails
2
+
3
+ Made for use [devoops template (bootstrap v3)](https://github.com/devoopsme/devoops)
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'devoops-rails'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install devoops-rails
18
+
19
+ ## Usage
20
+
21
+ Include this source in the Gemfile to use rails-assets gems:
22
+
23
+ ```ruby
24
+ source 'https://rails-assets.org'
25
+ ```
26
+
27
+ And include the dependencies in Gemfile:
28
+
29
+ ```ruby
30
+ gem 'rails-assets-bootstrap', '3.1.0'
31
+ gem 'rails-bootstrap-helpers'
32
+ gem 'bootstrap-datepicker-rails', '~> 1.3.0.1'
33
+ gem "font-awesome-rails"
34
+ gem 'rails-assets-jquery', '2.1.0'
35
+ gem 'rails-assets-jquery-ui', '1.10.4'
36
+ ```
37
+
38
+ Add the following to your application.js:
39
+
40
+ ```ruby
41
+ //= require jquery
42
+ //= require jquery-ui
43
+ //= require turbolinks
44
+ //= require bootstrap
45
+ //= require devoops-rails/devoops
46
+ //= require_tree .
47
+ ```
48
+
49
+ Also add the following to your application.css:
50
+
51
+ ```ruby
52
+ *= require_self
53
+ *= require_tree .
54
+ *= require bootstrap
55
+ *= require jquery-ui
56
+ *= require font-awesome
57
+ *= require devoops-rails/devoops
58
+ */
59
+ ```
60
+ Just using basic components. Fullcalendar, tinymce, xcharts, fineuploader, fancybox and others plugins are not implemented yet.
61
+ To test devoops layout, use the same code in the index.html from root path of devoops source.
62
+
63
+ ## Contributing
64
+
65
+ 1. Fork it ( https://github.com/denerblack/devoops-rails/fork )
66
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
67
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
68
+ 4. Push to the branch (`git push origin my-new-feature`)
69
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,2198 @@
1
+ //
2
+ // Main script of DevOOPS v1.0 Bootstrap Theme
3
+ //
4
+ "use strict";
5
+ /*-------------------------------------------
6
+ Main scripts used by theme
7
+ ---------------------------------------------*/
8
+ //
9
+ // Function for load content from url and put in $('.ajax-content') block
10
+ //
11
+ function LoadAjaxContent(url){
12
+ $('.preloader').show();
13
+ $.ajax({
14
+ mimeType: 'text/html; charset=utf-8', // ! Need set mimeType only when run from local file
15
+ url: url,
16
+ type: 'GET',
17
+ success: function(data) {
18
+ $('#ajax-content').html(data);
19
+ $('.preloader').hide();
20
+ },
21
+ error: function (jqXHR, textStatus, errorThrown) {
22
+ alert(errorThrown);
23
+ },
24
+ dataType: "html",
25
+ async: false
26
+ });
27
+ }
28
+ //
29
+ // Function maked all .box selector is draggable, to disable for concrete element add class .no-drop
30
+ //
31
+ function WinMove(){
32
+ $( "div.box").not('.no-drop')
33
+ .draggable({
34
+ revert: true,
35
+ zIndex: 2000,
36
+ cursor: "crosshair",
37
+ handle: '.box-name',
38
+ opacity: 0.8
39
+ })
40
+ .droppable({
41
+ tolerance: 'pointer',
42
+ drop: function( event, ui ) {
43
+ var draggable = ui.draggable;
44
+ var droppable = $(this);
45
+ var dragPos = draggable.position();
46
+ var dropPos = droppable.position();
47
+ draggable.swap(droppable);
48
+ setTimeout(function() {
49
+ var dropmap = droppable.find('[id^=map-]');
50
+ var dragmap = draggable.find('[id^=map-]');
51
+ if (dragmap.length > 0 || dropmap.length > 0){
52
+ dragmap.resize();
53
+ dropmap.resize();
54
+ }
55
+ else {
56
+ draggable.resize();
57
+ droppable.resize();
58
+ }
59
+ }, 50);
60
+ setTimeout(function() {
61
+ draggable.find('[id^=map-]').resize();
62
+ droppable.find('[id^=map-]').resize();
63
+ }, 250);
64
+ }
65
+ });
66
+ }
67
+ //
68
+ // Swap 2 elements on page. Used by WinMove function
69
+ //
70
+ jQuery.fn.swap = function(b){
71
+ b = jQuery(b)[0];
72
+ var a = this[0];
73
+ var t = a.parentNode.insertBefore(document.createTextNode(''), a);
74
+ b.parentNode.insertBefore(a, b);
75
+ t.parentNode.insertBefore(b, t);
76
+ t.parentNode.removeChild(t);
77
+ return this;
78
+ };
79
+ //
80
+ // Screensaver function
81
+ // used on locked screen, and write content to element with id - canvas
82
+ //
83
+ function ScreenSaver(){
84
+ var canvas = document.getElementById("canvas");
85
+ var ctx = canvas.getContext("2d");
86
+ // Size of canvas set to fullscreen of browser
87
+ var W = window.innerWidth;
88
+ var H = window.innerHeight;
89
+ canvas.width = W;
90
+ canvas.height = H;
91
+ // Create array of particles for screensaver
92
+ var particles = [];
93
+ for (var i = 0; i < 25; i++) {
94
+ particles.push(new Particle());
95
+ }
96
+ function Particle(){
97
+ // location on the canvas
98
+ this.location = {x: Math.random()*W, y: Math.random()*H};
99
+ // radius - lets make this 0
100
+ this.radius = 0;
101
+ // speed
102
+ this.speed = 3;
103
+ // random angle in degrees range = 0 to 360
104
+ this.angle = Math.random()*360;
105
+ // colors
106
+ var r = Math.round(Math.random()*255);
107
+ var g = Math.round(Math.random()*255);
108
+ var b = Math.round(Math.random()*255);
109
+ var a = Math.random();
110
+ this.rgba = "rgba("+r+", "+g+", "+b+", "+a+")";
111
+ }
112
+ // Draw the particles
113
+ function draw() {
114
+ // re-paint the BG
115
+ // Lets fill the canvas black
116
+ // reduce opacity of bg fill.
117
+ // blending time
118
+ ctx.globalCompositeOperation = "source-over";
119
+ ctx.fillStyle = "rgba(0, 0, 0, 0.02)";
120
+ ctx.fillRect(0, 0, W, H);
121
+ ctx.globalCompositeOperation = "lighter";
122
+ for(var i = 0; i < particles.length; i++){
123
+ var p = particles[i];
124
+ ctx.fillStyle = "white";
125
+ ctx.fillRect(p.location.x, p.location.y, p.radius, p.radius);
126
+ // Lets move the particles
127
+ // So we basically created a set of particles moving in random direction
128
+ // at the same speed
129
+ // Time to add ribbon effect
130
+ for(var n = 0; n < particles.length; n++){
131
+ var p2 = particles[n];
132
+ // calculating distance of particle with all other particles
133
+ var yd = p2.location.y - p.location.y;
134
+ var xd = p2.location.x - p.location.x;
135
+ var distance = Math.sqrt(xd*xd + yd*yd);
136
+ // draw a line between both particles if they are in 200px range
137
+ if(distance < 200){
138
+ ctx.beginPath();
139
+ ctx.lineWidth = 1;
140
+ ctx.moveTo(p.location.x, p.location.y);
141
+ ctx.lineTo(p2.location.x, p2.location.y);
142
+ ctx.strokeStyle = p.rgba;
143
+ ctx.stroke();
144
+ //The ribbons appear now.
145
+ }
146
+ }
147
+ // We are using simple vectors here
148
+ // New x = old x + speed * cos(angle)
149
+ p.location.x = p.location.x + p.speed*Math.cos(p.angle*Math.PI/180);
150
+ // New y = old y + speed * sin(angle)
151
+ p.location.y = p.location.y + p.speed*Math.sin(p.angle*Math.PI/180);
152
+ // You can read about vectors here:
153
+ // http://physics.about.com/od/mathematics/a/VectorMath.htm
154
+ if(p.location.x < 0) p.location.x = W;
155
+ if(p.location.x > W) p.location.x = 0;
156
+ if(p.location.y < 0) p.location.y = H;
157
+ if(p.location.y > H) p.location.y = 0;
158
+ }
159
+ }
160
+ setInterval(draw, 30);
161
+ }
162
+ //
163
+ // Helper for draw Google Chart
164
+ //
165
+ function drawGoogleChart(chart_data, chart_options, element, chart_type) {
166
+ // Function for visualize Google Chart
167
+ var data = google.visualization.arrayToDataTable(chart_data);
168
+ var chart = new chart_type(document.getElementById(element));
169
+ chart.draw(data, chart_options);
170
+ }
171
+ //
172
+ // Function for Draw Knob Charts
173
+ //
174
+ function DrawKnob(elem){
175
+ elem.knob({
176
+ change : function (value) {
177
+ //console.log("change : " + value);
178
+ },
179
+ release : function (value) {
180
+ //console.log(this.$.attr('value'));
181
+ console.log("release : " + value);
182
+ },
183
+ cancel : function () {
184
+ console.log("cancel : ", this);
185
+ },
186
+ draw : function () {
187
+ // "tron" case
188
+ if(this.$.data('skin') == 'tron') {
189
+ var a = this.angle(this.cv); // Angle
190
+ var sa = this.startAngle; // Previous start angle
191
+ var sat = this.startAngle; // Start angle
192
+ var ea; // Previous end angle
193
+ var eat = sat + a; // End angle
194
+ var r = 1;
195
+ this.g.lineWidth = this.lineWidth;
196
+ this.o.cursor
197
+ && (sat = eat - 0.3)
198
+ && (eat = eat + 0.3);
199
+ if (this.o.displayPrevious) {
200
+ ea = this.startAngle + this.angle(this.v);
201
+ this.o.cursor
202
+ && (sa = ea - 0.3)
203
+ && (ea = ea + 0.3);
204
+ this.g.beginPath();
205
+ this.g.strokeStyle = this.pColor;
206
+ this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, sa, ea, false);
207
+ this.g.stroke();
208
+ }
209
+ this.g.beginPath();
210
+ this.g.strokeStyle = r ? this.o.fgColor : this.fgColor ;
211
+ this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, sat, eat, false);
212
+ this.g.stroke();
213
+ this.g.lineWidth = 2;
214
+ this.g.beginPath();
215
+ this.g.strokeStyle = this.o.fgColor;
216
+ this.g.arc( this.xy, this.xy, this.radius - this.lineWidth + 1 + this.lineWidth * 2 / 3, 0, 2 * Math.PI, false);
217
+ this.g.stroke();
218
+ return false;
219
+ }
220
+ }
221
+ });
222
+ // Example of infinite knob, iPod click wheel
223
+ var v;
224
+ var up = 0;
225
+ var down=0;
226
+ var i=0;
227
+ var $idir = $("div.idir");
228
+ var $ival = $("div.ival");
229
+ var incr = function() { i++; $idir.show().html("+").fadeOut(); $ival.html(i); }
230
+ var decr = function() { i--; $idir.show().html("-").fadeOut(); $ival.html(i); };
231
+ $("input.infinite").knob(
232
+ {
233
+ min : 0,
234
+ max : 20,
235
+ stopper : false,
236
+ change : function () {
237
+ if(v > this.cv){
238
+ if(up){
239
+ decr();
240
+ up=0;
241
+ } else {
242
+ up=1;down=0;
243
+ }
244
+ } else {
245
+ if(v < this.cv){
246
+ if(down){
247
+ incr();
248
+ down=0;
249
+ } else {
250
+ down=1;up=0;
251
+ }
252
+ }
253
+ }
254
+ v = this.cv;
255
+ }
256
+ });
257
+ }
258
+ //
259
+ // Create OpenLayers map with required options and return map as object
260
+ //
261
+ function drawMap(lon, lat, elem, layers) {
262
+ var LayersArray = [];
263
+ // Map initialization
264
+ var map = new OpenLayers.Map(elem);
265
+ // Add layers on map
266
+ map.addLayers(layers);
267
+ // WGS 1984 projection
268
+ var epsg4326 = new OpenLayers.Projection("EPSG:4326");
269
+ //The map projection (Spherical Mercator)
270
+ var projectTo = map.getProjectionObject();
271
+ // Max zoom = 17
272
+ var zoom=10;
273
+ map.zoomToMaxExtent();
274
+ // Set longitude/latitude
275
+ var lonlat = new OpenLayers.LonLat(lon, lat);
276
+ map.setCenter(lonlat.transform(epsg4326, projectTo), zoom);
277
+ var layerGuest = new OpenLayers.Layer.Vector("You are here");
278
+ // Define markers as "features" of the vector layer:
279
+ var guestMarker = new OpenLayers.Feature.Vector(
280
+ new OpenLayers.Geometry.Point(lon, lat).transform(epsg4326, projectTo)
281
+ );
282
+ layerGuest.addFeatures(guestMarker);
283
+ LayersArray.push(layerGuest);
284
+ map.addLayers(LayersArray);
285
+ // If map layers > 1 then show checker
286
+ if (layers.length > 1){
287
+ map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':true}));
288
+ }
289
+ // Link to current position
290
+ map.addControl(new OpenLayers.Control.Permalink());
291
+ // Show current mouse coords
292
+ map.addControl(new OpenLayers.Control.MousePosition({ displayProjection: epsg4326 }));
293
+ return map
294
+ }
295
+ //
296
+ // Function for create 2 dates in human-readable format (with leading zero)
297
+ //
298
+ function PrettyDates(){
299
+ var currDate = new Date();
300
+ var year = currDate.getFullYear();
301
+ var month = currDate.getMonth() + 1;
302
+ var startmonth = 1;
303
+ if (month > 3){
304
+ startmonth = month -2;
305
+ }
306
+ if (startmonth <=9){
307
+ startmonth = '0'+startmonth;
308
+ }
309
+ if (month <= 9) {
310
+ month = '0'+month;
311
+ }
312
+ var day= currDate.getDate();
313
+ if (day <= 9) {
314
+ day = '0'+day;
315
+ }
316
+ var startdate = year +'-'+ startmonth +'-01';
317
+ var enddate = year +'-'+ month +'-'+ day;
318
+ return [startdate, enddate];
319
+ }
320
+ //
321
+ // Function set min-height of window (required for this theme)
322
+ //
323
+ function SetMinBlockHeight(elem){
324
+ elem.css('min-height', window.innerHeight - 49)
325
+ }
326
+ //
327
+ // Helper for correct size of Messages page
328
+ //
329
+ function MessagesMenuWidth(){
330
+ var W = window.innerWidth;
331
+ var W_menu = $('#sidebar-left').outerWidth();
332
+ var w_messages = (W-W_menu)*16.666666666666664/100;
333
+ $('#messages-menu').width(w_messages);
334
+ }
335
+ //
336
+ // Function for change panels of Dashboard
337
+ //
338
+ function DashboardTabChecker(){
339
+ $('#content').on('click', 'a.tab-link', function(e){
340
+ e.preventDefault();
341
+ $('div#dashboard_tabs').find('div[id^=dashboard]').each(function(){
342
+ $(this).css('visibility', 'hidden').css('position', 'absolute');
343
+ });
344
+ var attr = $(this).attr('id');
345
+ $('#'+'dashboard-'+attr).css('visibility', 'visible').css('position', 'relative');
346
+ $(this).closest('.nav').find('li').removeClass('active');
347
+ $(this).closest('li').addClass('active');
348
+ });
349
+ }
350
+ //
351
+ // Helper for run TinyMCE editor with textarea's
352
+ //
353
+ function TinyMCEStart(elem, mode){
354
+ var plugins = [];
355
+ if (mode == 'extreme'){
356
+ plugins = [ "advlist anchor autolink autoresize autosave bbcode charmap code contextmenu directionality ",
357
+ "emoticons fullpage fullscreen hr image insertdatetime layer legacyoutput",
358
+ "link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace",
359
+ "tabfocus table template textcolor visualblocks visualchars wordcount"]
360
+ }
361
+ tinymce.init({selector: elem,
362
+ theme: "modern",
363
+ plugins: plugins,
364
+ //content_css: "css/style.css",
365
+ toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image | print preview media fullpage | forecolor backcolor emoticons",
366
+ style_formats: [
367
+ {title: 'Header 2', block: 'h2', classes: 'page-header'},
368
+ {title: 'Header 3', block: 'h3', classes: 'page-header'},
369
+ {title: 'Header 4', block: 'h4', classes: 'page-header'},
370
+ {title: 'Header 5', block: 'h5', classes: 'page-header'},
371
+ {title: 'Header 6', block: 'h6', classes: 'page-header'},
372
+ {title: 'Bold text', inline: 'b'},
373
+ {title: 'Red text', inline: 'span', styles: {color: '#ff0000'}},
374
+ {title: 'Red header', block: 'h1', styles: {color: '#ff0000'}},
375
+ {title: 'Example 1', inline: 'span', classes: 'example1'},
376
+ {title: 'Example 2', inline: 'span', classes: 'example2'},
377
+ {title: 'Table styles'},
378
+ {title: 'Table row 1', selector: 'tr', classes: 'tablerow1'}
379
+ ]
380
+ });
381
+ }
382
+ //
383
+ // Helper for draw Sparkline plots on Dashboard page
384
+ //
385
+ function SparkLineDrawBarGraph(elem, arr, color){
386
+ if (color) {
387
+ var stacked_color = color;
388
+ }
389
+ else {
390
+ stacked_color = '#6AA6D6'
391
+ }
392
+ elem.sparkline(arr, { type: 'bar', barWidth: 7, highlightColor: '#000', barSpacing: 2, height: 40, stackedBarColor: stacked_color});
393
+ }
394
+ //
395
+ // Helper for open ModalBox with requested header, content and bottom
396
+ //
397
+ //
398
+ function OpenModalBox(header, inner, bottom){
399
+ var modalbox = $('#modalbox');
400
+ modalbox.find('.modal-header-name span').html(header);
401
+ modalbox.find('.devoops-modal-inner').html(inner);
402
+ modalbox.find('.devoops-modal-bottom').html(bottom);
403
+ modalbox.fadeIn('fast');
404
+ $('body').addClass("body-expanded");
405
+ }
406
+ //
407
+ // Close modalbox
408
+ //
409
+ //
410
+ function CloseModalBox(){
411
+ var modalbox = $('#modalbox');
412
+ modalbox.fadeOut('fast', function(){
413
+ modalbox.find('.modal-header-name span').children().remove();
414
+ modalbox.find('.devoops-modal-inner').children().remove();
415
+ modalbox.find('.devoops-modal-bottom').children().remove();
416
+ $('body').removeClass("body-expanded");
417
+ });
418
+ }
419
+ //
420
+ // Beauty tables plugin (navigation in tables with inputs in cell)
421
+ // Created by DevOOPS.
422
+ //
423
+ (function( $ ){
424
+ $.fn.beautyTables = function() {
425
+ var table = this;
426
+ var string_fill = false;
427
+ this.on('keydown', function(event) {
428
+ var target = event.target;
429
+ var tr = $(target).closest("tr");
430
+ var col = $(target).closest("td");
431
+ if (target.tagName.toUpperCase() == 'INPUT'){
432
+ if (event.shiftKey === true){
433
+ switch(event.keyCode) {
434
+ case 37: // left arrow
435
+ col.prev().children("input[type=text]").focus();
436
+ break;
437
+ case 39: // right arrow
438
+ col.next().children("input[type=text]").focus();
439
+ break;
440
+ case 40: // down arrow
441
+ if (string_fill==false){
442
+ tr.next().find('td:eq('+col.index()+') input[type=text]').focus();
443
+ }
444
+ break;
445
+ case 38: // up arrow
446
+ if (string_fill==false){
447
+ tr.prev().find('td:eq('+col.index()+') input[type=text]').focus();
448
+ }
449
+ break;
450
+ }
451
+ }
452
+ if (event.ctrlKey === true){
453
+ switch(event.keyCode) {
454
+ case 37: // left arrow
455
+ tr.find('td:eq(1)').find("input[type=text]").focus();
456
+ break;
457
+ case 39: // right arrow
458
+ tr.find('td:last-child').find("input[type=text]").focus();
459
+ break;
460
+ case 40: // down arrow
461
+ if (string_fill==false){
462
+ table.find('tr:last-child td:eq('+col.index()+') input[type=text]').focus();
463
+ }
464
+ break;
465
+ case 38: // up arrow
466
+ if (string_fill==false){
467
+ table.find('tr:eq(1) td:eq('+col.index()+') input[type=text]').focus();
468
+ }
469
+ break;
470
+ }
471
+ }
472
+ if (event.keyCode == 13 || event.keyCode == 9 ) {
473
+ event.preventDefault();
474
+ col.next().find("input[type=text]").focus();
475
+ }
476
+ if (string_fill==false){
477
+ if (event.keyCode == 34) {
478
+ event.preventDefault();
479
+ table.find('tr:last-child td:last-child').find("input[type=text]").focus();}
480
+ if (event.keyCode == 33) {
481
+ event.preventDefault();
482
+ table.find('tr:eq(1) td:eq(1)').find("input[type=text]").focus();}
483
+ }
484
+ }
485
+ });
486
+ table.find("input[type=text]").each(function(){
487
+ $(this).on('blur', function(event){
488
+ var target = event.target;
489
+ var col = $(target).parents("td");
490
+ if(table.find("input[name=string-fill]").prop("checked")==true) {
491
+ col.nextAll().find("input[type=text]").each(function() {
492
+ $(this).val($(target).val());
493
+ });
494
+ }
495
+ });
496
+ })
497
+ };
498
+ })( jQuery );
499
+ //
500
+ // Beauty Hover Plugin (backlight row and col when cell in mouseover)
501
+ //
502
+ //
503
+ (function( $ ){
504
+ $.fn.beautyHover = function() {
505
+ var table = this;
506
+ table.on('mouseover','td', function() {
507
+ var idx = $(this).index();
508
+ var rows = $(this).closest('table').find('tr');
509
+ rows.each(function(){
510
+ $(this).find('td:eq('+idx+')').addClass('beauty-hover');
511
+ });
512
+ })
513
+ .on('mouseleave','td', function(e) {
514
+ var idx = $(this).index();
515
+ var rows = $(this).closest('table').find('tr');
516
+ rows.each(function(){
517
+ $(this).find('td:eq('+idx+')').removeClass('beauty-hover');
518
+ });
519
+ });
520
+ };
521
+ })( jQuery );
522
+ //
523
+ // Function convert values of inputs in table to JSON data
524
+ //
525
+ //
526
+ function Table2Json(table) {
527
+ var result = {};
528
+ table.find("tr").each(function () {
529
+ var oneRow = [];
530
+ var varname = $(this).index();
531
+ $("td", this).each(function (index) { if (index != 0) {oneRow.push($("input", this).val());}});
532
+ result[varname] = oneRow;
533
+ });
534
+ var result_json = JSON.stringify(result);
535
+ OpenModalBox('Table to JSON values', result_json);
536
+ }
537
+ /*-------------------------------------------
538
+ Demo graphs for Flot Chart page (charts_flot.html)
539
+ ---------------------------------------------*/
540
+ //
541
+ // Graph1 created in element with id = box-one-content
542
+ //
543
+ function FlotGraph1(){
544
+ // We use an inline data source in the example, usually data would
545
+ // be fetched from a server
546
+ var data = [],
547
+ totalPoints = 300;
548
+ function getRandomData() {
549
+ if (data.length > 0)
550
+ data = data.slice(1);
551
+ // Do a random walk
552
+ while (data.length < totalPoints) {
553
+ var prev = data.length > 0 ? data[data.length - 1] : 50,
554
+ y = prev + Math.random() * 10 - 5;
555
+ if (y < 0) {
556
+ y = 0;
557
+ } else if (y > 100) {
558
+ y = 100;
559
+ }
560
+ data.push(y);
561
+ }
562
+ // Zip the generated y values with the x values
563
+ var res = [];
564
+ for (var i = 0; i < data.length; ++i) {
565
+ res.push([i, data[i]])
566
+ }
567
+ return res;
568
+ }
569
+ var updateInterval = 30;
570
+ var plot = $.plot("#box-one-content", [ getRandomData() ], {
571
+ series: {
572
+ shadowSize: 0 // Drawing is faster without shadows
573
+ },
574
+ yaxis: {min: 0, max: 100},
575
+ xaxis: {show: false }
576
+ });
577
+ function update() {
578
+ plot.setData([getRandomData()]);
579
+ // Since the axes don't change, we don't need to call plot.setupGrid()
580
+ plot.draw();
581
+ setTimeout(update, updateInterval);
582
+ }
583
+ update();
584
+ }
585
+ //
586
+ // Graph2 created in element with id = box-two-content
587
+ //
588
+ function FlotGraph2(){
589
+ var sin = [];
590
+ var cos = [];
591
+ var tan = [];
592
+ for (var i = 0; i < 14; i += 0.1) {
593
+ sin.push([i, Math.sin(i)]);
594
+ cos.push([i, Math.cos(i)]);
595
+ tan.push([i, Math.tan(i)/4]);
596
+ }
597
+ var plot = $.plot("#box-two-content", [
598
+ { data: sin, label: "sin(x) = -0.00"},
599
+ { data: cos, label: "cos(x) = -0.00" },
600
+ { data: tan, label: "tan(x)/4 = -0.00" }
601
+ ], {
602
+ series: {
603
+ lines: {
604
+ show: true
605
+ }
606
+ },
607
+ crosshair: {
608
+ mode: "x"
609
+ },
610
+ grid: {
611
+ hoverable: true,
612
+ autoHighlight: false
613
+ },
614
+ yaxis: {
615
+ min: -5.2,
616
+ max: 5.2
617
+ }
618
+ });
619
+ var legends = $("#box-two-content .legendLabel");
620
+ legends.each(function () {
621
+ // fix the widths so they don't jump around
622
+ $(this).css('width', $(this).width());
623
+ });
624
+ var updateLegendTimeout = null;
625
+ var latestPosition = null;
626
+ function updateLegend() {
627
+ updateLegendTimeout = null;
628
+ var pos = latestPosition;
629
+ var axes = plot.getAxes();
630
+ if (pos.x < axes.xaxis.min || pos.x > axes.xaxis.max ||
631
+ pos.y < axes.yaxis.min || pos.y > axes.yaxis.max) {
632
+ return;
633
+ }
634
+ var i, j, dataset = plot.getData();
635
+ for (i = 0; i < dataset.length; ++i) {
636
+ var series = dataset[i];
637
+ // Find the nearest points, x-wise
638
+ for (j = 0; j < series.data.length; ++j) {
639
+ if (series.data[j][0] > pos.x) {
640
+ break;
641
+ }
642
+ }
643
+ // Now Interpolate
644
+ var y, p1 = series.data[j - 1], p2 = series.data[j];
645
+ if (p1 == null) {
646
+ y = p2[1];
647
+ } else if (p2 == null) {
648
+ y = p1[1];
649
+ } else {
650
+ y = p1[1] + (p2[1] - p1[1]) * (pos.x - p1[0]) / (p2[0] - p1[0]);
651
+ }
652
+ legends.eq(i).text(series.label.replace(/=.*/, "= " + y.toFixed(2)));
653
+ }
654
+ }
655
+ $("#box-two-content").bind("plothover", function (event, pos, item) {
656
+ latestPosition = pos;
657
+ if (!updateLegendTimeout) {
658
+ updateLegendTimeout = setTimeout(updateLegend, 50);
659
+ }
660
+ });
661
+ }
662
+ //
663
+ // Graph3 created in element with id = box-three-content
664
+ //
665
+ function FlotGraph3(){
666
+ var d1 = [];
667
+ for (var i = 0; i <= 60; i += 1) {
668
+ d1.push([i, parseInt(Math.random() * 30 - 10)]);
669
+ }
670
+ function plotWithOptions(t) {
671
+ $.plot("#box-three-content", [{
672
+ data: d1,
673
+ color: "rgb(30, 180, 20)",
674
+ threshold: {
675
+ below: t,
676
+ color: "rgb(200, 20, 30)"
677
+ },
678
+ lines: {
679
+ steps: true
680
+ }
681
+ }]);
682
+ }
683
+ plotWithOptions(0);
684
+ }
685
+ //
686
+ // Graph4 created in element with id = box-four-content
687
+ //
688
+ function FlotGraph4(){
689
+ var d1 = [];
690
+ for (var i = 0; i < 14; i += 0.5) {
691
+ d1.push([i, Math.sin(i)]);
692
+ }
693
+ var d2 = [[0, 3], [4, 8], [8, 5], [9, 13]];
694
+ var d3 = [];
695
+ for (var i = 0; i < 14; i += 0.5) {
696
+ d3.push([i, Math.cos(i)]);
697
+ }
698
+ var d4 = [];
699
+ for (var i = 0; i < 14; i += 0.1) {
700
+ d4.push([i, Math.sqrt(i * 10)]);
701
+ }
702
+ var d5 = [];
703
+ for (var i = 0; i < 14; i += 0.5) {
704
+ d5.push([i, Math.sqrt(i)]);
705
+ }
706
+ var d6 = [];
707
+ for (var i = 0; i < 14; i += 0.5 + Math.random()) {
708
+ d6.push([i, Math.sqrt(2*i + Math.sin(i) + 5)]);
709
+ }
710
+ $.plot("#box-four-content", [{
711
+ data: d1,
712
+ lines: { show: true, fill: true }
713
+ }, {
714
+ data: d2,
715
+ bars: { show: true }
716
+ }, {
717
+ data: d3,
718
+ points: { show: true }
719
+ }, {
720
+ data: d4,
721
+ lines: { show: true }
722
+ }, {
723
+ data: d5,
724
+ lines: { show: true },
725
+ points: { show: true }
726
+ }, {
727
+ data: d6,
728
+ lines: { show: true, steps: true }
729
+ }]);
730
+ }
731
+ /*-------------------------------------------
732
+ Demo graphs for Morris Chart page (charts_morris.html)
733
+ ---------------------------------------------*/
734
+ //
735
+ // Graph1 created in element with id = morris-chart-1
736
+ //
737
+ function MorrisChart1(){
738
+ var day_data = [
739
+ {"period": "2013-10-01", "licensed": 3407, "sorned": 660},
740
+ {"period": "2013-09-30", "licensed": 3351, "sorned": 629},
741
+ {"period": "2013-09-29", "licensed": 3269, "sorned": 618},
742
+ {"period": "2013-09-20", "licensed": 3246, "sorned": 661},
743
+ {"period": "2013-09-19", "licensed": 3257, "sorned": 667},
744
+ {"period": "2013-09-18", "licensed": 3248, "sorned": 627},
745
+ {"period": "2013-09-17", "licensed": 3171, "sorned": 660},
746
+ {"period": "2013-09-16", "licensed": 3171, "sorned": 676},
747
+ {"period": "2013-09-15", "licensed": 3201, "sorned": 656},
748
+ {"period": "2013-09-10", "licensed": 3215, "sorned": 622}
749
+ ];
750
+ Morris.Bar({
751
+ element: 'morris-chart-1',
752
+ data: day_data,
753
+ xkey: 'period',
754
+ ykeys: ['licensed', 'sorned'],
755
+ labels: ['Licensed', 'SORN'],
756
+ xLabelAngle: 60
757
+ });
758
+ }
759
+ //
760
+ // Graph2 created in element with id = morris-chart-2
761
+ //
762
+ function MorrisChart2(){
763
+ // Use Morris.Area instead of Morris.Line
764
+ Morris.Area({
765
+ element: 'morris-chart-2',
766
+ data: [
767
+ {x: '2011 Q1', y: 3, z: 3, m: 1},
768
+ {x: '2011 Q2', y: 2, z: 0, m: 7},
769
+ {x: '2011 Q3', y: 2, z: 5, m: 2},
770
+ {x: '2011 Q4', y: 4, z: 4, m: 5},
771
+ {x: '2012 Q1', y: 6, z: 1, m: 11},
772
+ {x: '2012 Q2', y: 4, z: 4, m: 3},
773
+ {x: '2012 Q3', y: 4, z: 4, m: 7},
774
+ {x: '2012 Q4', y: 4, z: 4, m: 9}
775
+ ],
776
+ xkey: 'x',
777
+ ykeys: ['y', 'z', 'm'],
778
+ labels: ['Y', 'Z', 'M']
779
+ })
780
+ .on('click', function(i, row){
781
+ console.log(i, row);
782
+ });
783
+ }
784
+ //
785
+ // Graph3 created in element with id = morris-chart-3
786
+ //
787
+ function MorrisChart3(){
788
+ var decimal_data = [];
789
+ for (var x = 0; x <= 360; x += 10) {
790
+ decimal_data.push({ x: x, y: Math.sin(Math.PI * x / 180).toFixed(4), z: Math.cos(Math.PI * x / 180).toFixed(4) });
791
+ }
792
+ Morris.Line({
793
+ element: 'morris-chart-3',
794
+ data: decimal_data,
795
+ xkey: 'x',
796
+ ykeys: ['y', 'z'],
797
+ labels: ['sin(x)', 'cos(x)'],
798
+ parseTime: false,
799
+ goals: [-1, 0, 1]
800
+ });
801
+ }
802
+ //
803
+ // Graph4 created in element with id = morris-chart-4
804
+ //
805
+ function MorrisChart4(){
806
+ // Use Morris.Bar
807
+ Morris.Bar({
808
+ element: 'morris-chart-4',
809
+ data: [
810
+ {x: '2011 Q1', y: 0},
811
+ {x: '2011 Q2', y: 1},
812
+ {x: '2011 Q3', y: 2},
813
+ {x: '2011 Q4', y: 3},
814
+ {x: '2012 Q1', y: 4},
815
+ {x: '2012 Q2', y: 5},
816
+ {x: '2012 Q3', y: 6},
817
+ {x: '2012 Q4', y: 7},
818
+ {x: '2013 Q1', y: 8},
819
+ {x: '2013 Q2', y: 7},
820
+ {x: '2013 Q3', y: 6},
821
+ {x: '2013 Q4', y: 5},
822
+ {x: '2014 Q1', y: 9}
823
+ ],
824
+ xkey: 'x',
825
+ ykeys: ['y'],
826
+ labels: ['Y'],
827
+ barColors: function (row, series, type) {
828
+ if (type === 'bar') {
829
+ var red = Math.ceil(255 * row.y / this.ymax);
830
+ return 'rgb(' + red + ',0,0)';
831
+ }
832
+ else {
833
+ return '#000';
834
+ }
835
+ }
836
+ });
837
+ }
838
+ //
839
+ // Graph5 created in element with id = morris-chart-5
840
+ //
841
+ function MorrisChart5(){
842
+ Morris.Area({
843
+ element: 'morris-chart-5',
844
+ data: [
845
+ {period: '2010 Q1', iphone: 2666, ipad: null, itouch: 2647},
846
+ {period: '2010 Q2', iphone: 2778, ipad: 2294, itouch: 2441},
847
+ {period: '2010 Q3', iphone: 4912, ipad: 1969, itouch: 2501},
848
+ {period: '2010 Q4', iphone: 3767, ipad: 3597, itouch: 5689},
849
+ {period: '2011 Q1', iphone: 6810, ipad: 1914, itouch: 2293},
850
+ {period: '2011 Q2', iphone: 5670, ipad: 4293, itouch: 1881},
851
+ {period: '2011 Q3', iphone: 4820, ipad: 3795, itouch: 1588},
852
+ {period: '2011 Q4', iphone: 15073, ipad: 5967, itouch: 5175},
853
+ {period: '2012 Q1', iphone: 10687, ipad: 4460, itouch: 2028},
854
+ {period: '2012 Q2', iphone: 8432, ipad: 5713, itouch: 1791}
855
+ ],
856
+ xkey: 'period',
857
+ ykeys: ['iphone', 'ipad', 'itouch'],
858
+ labels: ['iPhone', 'iPad', 'iPod Touch'],
859
+ pointSize: 2,
860
+ hideHover: 'auto'
861
+ });
862
+ }
863
+ /*-------------------------------------------
864
+ Demo graphs for Google Chart page (charts_google.html)
865
+ ---------------------------------------------*/
866
+ //
867
+ // One function for create all graphs on Google Chart page
868
+ //
869
+ function DrawAllCharts(){
870
+ // Chart 1
871
+ var chart1_data = [
872
+ ['Smartphones', 'PC', 'Notebooks', 'Monitors','Routers', 'Switches' ],
873
+ ['01.01.2014', 1234, 2342, 344, 232,131],
874
+ ['02.01.2014', 1254, 232, 314, 232, 331],
875
+ ['03.01.2014', 2234, 342, 298, 232, 665],
876
+ ['04.01.2014', 2234, 42, 559, 232, 321],
877
+ ['05.01.2014', 1999, 82, 116, 232, 334],
878
+ ['06.01.2014', 1634, 834, 884, 232, 191],
879
+ ['07.01.2014', 321, 342, 383, 232, 556],
880
+ ['08.01.2014', 845, 112, 499, 232, 731]
881
+ ];
882
+ var chart1_options = {
883
+ title: 'Sales of company',
884
+ hAxis: {title: 'Date', titleTextStyle: {color: 'red'}},
885
+ backgroundColor: '#fcfcfc',
886
+ vAxis: {title: 'Quantity', titleTextStyle: {color: 'blue'}}
887
+ };
888
+ var chart1_element = 'google-chart-1';
889
+ var chart1_type = google.visualization.ColumnChart;
890
+ drawGoogleChart(chart1_data, chart1_options, chart1_element, chart1_type);
891
+ // Chart 2
892
+ var chart2_data = [
893
+ ['Height', 'Width'],
894
+ ['Samsung', 74.5],
895
+ ['Apple', 31.24],
896
+ ['LG', 12.10],
897
+ ['Huawei', 11.14],
898
+ ['Sony', 8.3],
899
+ ['Nokia', 7.4],
900
+ ['Blackberry', 6.8],
901
+ ['HTC', 6.63],
902
+ ['Motorola', 3.5],
903
+ ['Other', 43.15]
904
+ ];
905
+ var chart2_options = {
906
+ title: 'Smartphone marketshare 2Q 2013',
907
+ backgroundColor: '#fcfcfc'
908
+ };
909
+ var chart2_element = 'google-chart-2';
910
+ var chart2_type = google.visualization.PieChart;
911
+ drawGoogleChart(chart2_data, chart2_options, chart2_element, chart2_type);
912
+ // Chart 3
913
+ var chart3_data = [
914
+ ['Age', 'Weight'],
915
+ [ 8, 12],
916
+ [ 4, 5.5],
917
+ [ 11, 14],
918
+ [ 4, 5],
919
+ [ 3, 3.5],
920
+ [ 6.5, 7]
921
+ ];
922
+ var chart3_options = {
923
+ title: 'Age vs. Weight comparison',
924
+ hAxis: {title: 'Age', minValue: 0, maxValue: 15},
925
+ vAxis: {title: 'Weight', minValue: 0, maxValue: 15},
926
+ legend: 'none',
927
+ backgroundColor: '#fcfcfc'
928
+ };
929
+ var chart3_element = 'google-chart-3';
930
+ var chart3_type = google.visualization.ScatterChart;
931
+ drawGoogleChart(chart3_data, chart3_options, chart3_element, chart3_type);
932
+ // Chart 4
933
+ var chart4_data = [
934
+ ['ID', 'Life Expectancy', 'Fertility Rate', 'Region', 'Population'],
935
+ ['CAN', 80.66, 1.67, 'North America', 33739900],
936
+ ['DEU', 79.84, 1.36, 'Europe', 81902307],
937
+ ['DNK', 78.6, 1.84, 'Europe', 5523095],
938
+ ['EGY', 72.73, 2.78, 'Middle East', 79716203],
939
+ ['GBR', 80.05, 2, 'Europe', 61801570],
940
+ ['IRN', 72.49, 1.7, 'Middle East', 73137148],
941
+ ['IRQ', 68.09, 4.77, 'Middle East', 31090763],
942
+ ['ISR', 81.55, 2.96, 'Middle East', 7485600],
943
+ ['RUS', 68.6, 1.54, 'Europe', 141850000],
944
+ ['USA', 78.09, 2.05, 'North America', 307007000]
945
+ ];
946
+ var chart4_options = {
947
+ title: 'Correlation between life expectancy, fertility rate and population of some world countries (2010)',
948
+ hAxis: {title: 'Life Expectancy'},
949
+ vAxis: {title: 'Fertility Rate'},
950
+ backgroundColor: '#fcfcfc',
951
+ bubble: {textStyle: {fontSize: 11}}
952
+ };
953
+ var chart4_element = 'google-chart-4';
954
+ var chart4_type = google.visualization.BubbleChart;
955
+ drawGoogleChart(chart4_data, chart4_options, chart4_element, chart4_type);
956
+ // Chart 5
957
+ var chart5_data = [
958
+ ['Country', 'Popularity'],
959
+ ['Germany', 200],
960
+ ['United States', 300],
961
+ ['Brazil', 400],
962
+ ['Canada', 500],
963
+ ['France', 600],
964
+ ['RU', 700]
965
+ ];
966
+ var chart5_options = {
967
+ backgroundColor: '#fcfcfc',
968
+ enableRegionInteractivity: true
969
+ };
970
+ var chart5_element = 'google-chart-5';
971
+ var chart5_type = google.visualization.GeoChart;
972
+ drawGoogleChart(chart5_data, chart5_options, chart5_element, chart5_type);
973
+ // Chart 6
974
+ var chart6_data = [
975
+ ['Year', 'Sales', 'Expenses'],
976
+ ['2004', 1000, 400],
977
+ ['2005', 1170, 460],
978
+ ['2006', 660, 1120],
979
+ ['2007', 1030, 540],
980
+ ['2008', 2080, 740],
981
+ ['2009', 1949, 690],
982
+ ['2010', 2334, 820]
983
+ ];
984
+ var chart6_options = {
985
+ backgroundColor: '#fcfcfc',
986
+ title: 'Company Performance'
987
+ };
988
+ var chart6_element = 'google-chart-6';
989
+ var chart6_type = google.visualization.LineChart;
990
+ drawGoogleChart(chart6_data, chart6_options, chart6_element, chart6_type);
991
+ // Chart 7
992
+ var chart7_data = [
993
+ ['Task', 'Hours per Day'],
994
+ ['Work', 11],
995
+ ['Eat', 2],
996
+ ['Commute', 2],
997
+ ['Watch TV', 2],
998
+ ['Sleep', 7]
999
+ ];
1000
+ var chart7_options = {
1001
+ backgroundColor: '#fcfcfc',
1002
+ title: 'My Daily Activities',
1003
+ pieHole: 0.4
1004
+ };
1005
+ var chart7_element = 'google-chart-7';
1006
+ var chart7_type = google.visualization.PieChart;
1007
+ drawGoogleChart(chart7_data, chart7_options, chart7_element, chart7_type);
1008
+ // Chart 8
1009
+ var chart8_data = [
1010
+ ['Generation', 'Descendants'],
1011
+ [0, 1], [1, 33], [2, 269], [3, 2013]
1012
+ ];
1013
+ var chart8_options = {
1014
+ backgroundColor: '#fcfcfc',
1015
+ title: 'Descendants by Generation',
1016
+ hAxis: {title: 'Generation', minValue: 0, maxValue: 3},
1017
+ vAxis: {title: 'Descendants', minValue: 0, maxValue: 2100},
1018
+ trendlines: {
1019
+ 0: {
1020
+ type: 'exponential',
1021
+ visibleInLegend: true
1022
+ }
1023
+ }
1024
+ };
1025
+ var chart8_element = 'google-chart-8';
1026
+ var chart8_type = google.visualization.ScatterChart;
1027
+ drawGoogleChart(chart8_data, chart8_options, chart8_element, chart8_type);
1028
+ }
1029
+ /*-------------------------------------------
1030
+ Demo graphs for xCharts page (charts_xcharts.html)
1031
+ ---------------------------------------------*/
1032
+ //
1033
+ // Graph1 created in element with id = xchart-1
1034
+ //
1035
+ function xGraph1(){
1036
+ var tt = document.createElement('div'),
1037
+ leftOffset = -(~~$('html').css('padding-left').replace('px', '') + ~~$('body').css('margin-left').replace('px', '')),
1038
+ topOffset = -32;
1039
+ tt.className = 'ex-tooltip';
1040
+ document.body.appendChild(tt);
1041
+ var data = {
1042
+ "xScale": "time",
1043
+ "yScale": "linear",
1044
+ "main": [
1045
+ {
1046
+ "className": ".xchart-class-1",
1047
+ "data": [
1048
+ {
1049
+ "x": "2012-11-05",
1050
+ "y": 6
1051
+ },
1052
+ {
1053
+ "x": "2012-11-06",
1054
+ "y": 6
1055
+ },
1056
+ {
1057
+ "x": "2012-11-07",
1058
+ "y": 8
1059
+ },
1060
+ {
1061
+ "x": "2012-11-08",
1062
+ "y": 3
1063
+ },
1064
+ {
1065
+ "x": "2012-11-09",
1066
+ "y": 4
1067
+ },
1068
+ {
1069
+ "x": "2012-11-10",
1070
+ "y": 9
1071
+ },
1072
+ {
1073
+ "x": "2012-11-11",
1074
+ "y": 6
1075
+ },
1076
+ {
1077
+ "x": "2012-11-12",
1078
+ "y": 16
1079
+ },
1080
+ {
1081
+ "x": "2012-11-13",
1082
+ "y": 4
1083
+ },
1084
+ {
1085
+ "x": "2012-11-14",
1086
+ "y": 9
1087
+ },
1088
+ {
1089
+ "x": "2012-11-15",
1090
+ "y": 2
1091
+ }
1092
+ ]
1093
+ }
1094
+ ]
1095
+ };
1096
+ var opts = {
1097
+ "dataFormatX": function (x) { return d3.time.format('%Y-%m-%d').parse(x); },
1098
+ "tickFormatX": function (x) { return d3.time.format('%A')(x); },
1099
+ "mouseover": function (d, i) {
1100
+ var pos = $(this).offset();
1101
+ $(tt).text(d3.time.format('%A')(d.x) + ': ' + d.y)
1102
+ .css({top: topOffset + pos.top, left: pos.left + leftOffset})
1103
+ .show();
1104
+ },
1105
+ "mouseout": function (x) {
1106
+ $(tt).hide();
1107
+ }
1108
+ };
1109
+ var myChart = new xChart('line-dotted', data, '#xchart-1', opts);
1110
+ }
1111
+ //
1112
+ // Graph2 created in element with id = xchart-2
1113
+ //
1114
+ function xGraph2(){
1115
+ var data = {
1116
+ "xScale": "ordinal",
1117
+ "yScale": "linear",
1118
+ "main": [
1119
+ {
1120
+ "className": ".xchart-class-2",
1121
+ "data": [
1122
+ {
1123
+ "x": "Apple",
1124
+ "y": 575
1125
+ },
1126
+ {
1127
+ "x": "Facebook",
1128
+ "y": 163
1129
+ },
1130
+ {
1131
+ "x": "Microsoft",
1132
+ "y": 303
1133
+ },
1134
+ {
1135
+ "x": "Cisco",
1136
+ "y": 121
1137
+ },
1138
+ {
1139
+ "x": "Google",
1140
+ "y": 393
1141
+ }
1142
+ ]
1143
+ }
1144
+ ]
1145
+ };
1146
+ var myChart = new xChart('bar', data, '#xchart-2');
1147
+ }
1148
+ //
1149
+ // Graph3 created in element with id = xchart-3
1150
+ //
1151
+ function xGraph3(){
1152
+ var data = {
1153
+ "xScale": "time",
1154
+ "yScale": "linear",
1155
+ "type": "line",
1156
+ "main": [
1157
+ {
1158
+ "className": ".xchart-class-3",
1159
+ "data": [
1160
+ {
1161
+ "x": "2012-11-05",
1162
+ "y": 1
1163
+ },
1164
+ {
1165
+ "x": "2012-11-06",
1166
+ "y": 6
1167
+ },
1168
+ {
1169
+ "x": "2012-11-07",
1170
+ "y": 13
1171
+ },
1172
+ {
1173
+ "x": "2012-11-08",
1174
+ "y": -3
1175
+ },
1176
+ {
1177
+ "x": "2012-11-09",
1178
+ "y": -4
1179
+ },
1180
+ {
1181
+ "x": "2012-11-10",
1182
+ "y": 9
1183
+ },
1184
+ {
1185
+ "x": "2012-11-11",
1186
+ "y": 6
1187
+ },
1188
+ {
1189
+ "x": "2012-11-12",
1190
+ "y": 7
1191
+ },
1192
+ {
1193
+ "x": "2012-11-13",
1194
+ "y": -2
1195
+ },
1196
+ {
1197
+ "x": "2012-11-14",
1198
+ "y": -7
1199
+ }
1200
+ ]
1201
+ }
1202
+ ]
1203
+ };
1204
+ var opts = {
1205
+ "dataFormatX": function (x) { return d3.time.format('%Y-%m-%d').parse(x); },
1206
+ "tickFormatX": function (x) { return d3.time.format('%A')(x); }
1207
+ };
1208
+ var myChart = new xChart('line', data, '#xchart-3', opts);
1209
+ }
1210
+ /*-------------------------------------------
1211
+ Demo graphs for CoinDesk page (charts_coindesk.html)
1212
+ ---------------------------------------------*/
1213
+ //
1214
+ // Main function for CoinDesk API Page
1215
+ // (we get JSON data and make 4 graph from this)
1216
+ //
1217
+ function CoinDeskGraph(){
1218
+ var dates = PrettyDates();
1219
+ var startdate = dates[0];
1220
+ var enddate = dates[1];
1221
+ // Load JSON data from CoinDesk API
1222
+ var jsonURL = 'http://api.coindesk.com/v1/bpi/historical/close.json?start='+startdate+'&end='+enddate;
1223
+ $.getJSON(jsonURL, function(result){
1224
+ // Create array of data for xChart
1225
+ $.each(result.bpi, function(key, val){
1226
+ xchart_data.push({'x': key,'y':val});
1227
+ });
1228
+ // Set handler for resize and create xChart plot
1229
+ var graphXChartResize;
1230
+ $('#coindesk-xchart').resize(function(){
1231
+ clearTimeout(graphXChartResize);
1232
+ graphXChartResize = setTimeout(DrawCoinDeskXCharts, 500);
1233
+ });
1234
+ DrawCoinDeskXCharts();
1235
+ // Create array of data for Google Chart
1236
+ $.each(result.bpi, function(key, val){
1237
+ google_data.push([key,val]);
1238
+ });
1239
+ // Set handler for resize and create Google Chart plot
1240
+ var graphGChartResize;
1241
+ $('#coindesk-google-chart').resize(function(){
1242
+ clearTimeout(graphGChartResize);
1243
+ graphGChartResize = setTimeout(DrawCoinDeskGoogleCharts, 500);
1244
+ });
1245
+ DrawCoinDeskGoogleCharts();
1246
+ // Create array of data for Flot and Sparkline
1247
+ $.each(result.bpi, function(key, val){
1248
+ var parseDate=key;
1249
+ parseDate=parseDate.split("-");
1250
+ var newDate=parseDate[1]+"/"+parseDate[2]+"/"+parseDate[0];
1251
+ var new_date = new Date(newDate).getTime();
1252
+ exchange_rate.push([new_date,val]);
1253
+ });
1254
+ // Create Flot plot (not need bind to resize, cause Flot use plugin 'resize')
1255
+ DrawCoinDeskFlot();
1256
+ // Set handler for resize and create Sparkline plot
1257
+ var graphSparklineResize;
1258
+ $('#coindesk-sparklines').resize(function(){
1259
+ clearTimeout(graphSparklineResize);
1260
+ graphSparklineResize = setTimeout(DrawCoinDeskSparkLine, 500);
1261
+ });
1262
+ DrawCoinDeskSparkLine();
1263
+ });
1264
+ }
1265
+ //
1266
+ // Draw Sparkline Graph on Coindesk page
1267
+ //
1268
+ function DrawCoinDeskSparkLine(){
1269
+ $('#coindesk-sparklines').sparkline(exchange_rate, { height: '100%', width: '100%' });
1270
+ }
1271
+ //
1272
+ // Draw xChart Graph on Coindesk page
1273
+ //
1274
+ function DrawCoinDeskXCharts(){
1275
+ var data = {
1276
+ "xScale": "ordinal",
1277
+ "yScale": "linear",
1278
+ "main": [
1279
+ {
1280
+ "className": ".pizza",
1281
+ "data": xchart_data
1282
+ }
1283
+ ]
1284
+ };
1285
+ var myChart = new xChart('line-dotted', data, '#coindesk-xchart');
1286
+ }
1287
+ //
1288
+ // Draw Flot Graph on Coindesk page
1289
+ //
1290
+ function DrawCoinDeskFlot(){
1291
+ var data1 = [
1292
+ { data: exchange_rate, label: "Bitcoin exchange rate ($)" }
1293
+ ];
1294
+ var options = {
1295
+ canvas: true,
1296
+ xaxes: [
1297
+ { mode: "time" }
1298
+ ],
1299
+ yaxes: [
1300
+ { min: 0 },
1301
+ {
1302
+ position: "right",
1303
+ alignTicksWithAxis: 1,
1304
+ tickFormatter: function (value, axis) {
1305
+ return value.toFixed(axis.tickDecimals) + "€";
1306
+ }
1307
+ }
1308
+ ],
1309
+ legend: { position: "sw" }
1310
+ };
1311
+ $.plot("#coindesk-flot", data1, options);
1312
+ }
1313
+ //
1314
+ // Draw Google Chart Graph on Coindesk page
1315
+ //
1316
+ function DrawCoinDeskGoogleCharts(){
1317
+ var google_options = {
1318
+ backgroundColor: '#fcfcfc',
1319
+ title: 'Coindesk Exchange Rate'
1320
+ };
1321
+ var google_element = 'coindesk-google-chart';
1322
+ var google_type = google.visualization.LineChart;
1323
+ drawGoogleChart(google_data, google_options, google_element, google_type);
1324
+ }
1325
+ /*-------------------------------------------
1326
+ Scripts for DataTables page (tables_datatables.html)
1327
+ ---------------------------------------------*/
1328
+ //
1329
+ // Function for table, located in element with id = datatable-1
1330
+ //
1331
+ function TestTable1(){
1332
+ $('#datatable-1').dataTable( {
1333
+ "aaSorting": [[ 0, "asc" ]],
1334
+ "sDom": "<'box-content'<'col-sm-6'f><'col-sm-6 text-right'l><'clearfix'>>rt<'box-content'<'col-sm-6'i><'col-sm-6 text-right'p><'clearfix'>>",
1335
+ "sPaginationType": "bootstrap",
1336
+ "oLanguage": {
1337
+ "sSearch": "",
1338
+ "sLengthMenu": '_MENU_'
1339
+ }
1340
+ });
1341
+ }
1342
+ //
1343
+ // Function for table, located in element with id = datatable-2
1344
+ //
1345
+ function TestTable2(){
1346
+ var asInitVals = [];
1347
+ var oTable = $('#datatable-2').dataTable( {
1348
+ "aaSorting": [[ 0, "asc" ]],
1349
+ "sDom": "<'box-content'<'col-sm-6'f><'col-sm-6 text-right'l><'clearfix'>>rt<'box-content'<'col-sm-6'i><'col-sm-6 text-right'p><'clearfix'>>",
1350
+ "sPaginationType": "bootstrap",
1351
+ "oLanguage": {
1352
+ "sSearch": "",
1353
+ "sLengthMenu": '_MENU_'
1354
+ },
1355
+ bAutoWidth: false
1356
+ });
1357
+ var header_inputs = $("#datatable-2 thead input");
1358
+ header_inputs.on('keyup', function(){
1359
+ /* Filter on the column (the index) of this element */
1360
+ oTable.fnFilter( this.value, header_inputs.index(this) );
1361
+ })
1362
+ .on('focus', function(){
1363
+ if ( this.className == "search_init" ){
1364
+ this.className = "";
1365
+ this.value = "";
1366
+ }
1367
+ })
1368
+ .on('blur', function (i) {
1369
+ if ( this.value == "" ){
1370
+ this.className = "search_init";
1371
+ this.value = asInitVals[header_inputs.index(this)];
1372
+ }
1373
+ });
1374
+ header_inputs.each( function (i) {
1375
+ asInitVals[i] = this.value;
1376
+ });
1377
+ }
1378
+ //
1379
+ // Function for table, located in element with id = datatable-3
1380
+ //
1381
+ function TestTable3(){
1382
+ $('#datatable-3').dataTable( {
1383
+ "aaSorting": [[ 0, "asc" ]],
1384
+ "sDom": "T<'box-content'<'col-sm-6'f><'col-sm-6 text-right'l><'clearfix'>>rt<'box-content'<'col-sm-6'i><'col-sm-6 text-right'p><'clearfix'>>",
1385
+ "sPaginationType": "bootstrap",
1386
+ "oLanguage": {
1387
+ "sSearch": "",
1388
+ "sLengthMenu": '_MENU_'
1389
+ },
1390
+ "oTableTools": {
1391
+ "sSwfPath": "plugins/datatables/copy_csv_xls_pdf.swf",
1392
+ "aButtons": [
1393
+ "copy",
1394
+ "print",
1395
+ {
1396
+ "sExtends": "collection",
1397
+ "sButtonText": 'Save <span class="caret" />',
1398
+ "aButtons": [ "csv", "xls", "pdf" ]
1399
+ }
1400
+ ]
1401
+ }
1402
+ });
1403
+ }
1404
+ /*-------------------------------------------
1405
+ Functions for Dashboard page (dashboard.html)
1406
+ ---------------------------------------------*/
1407
+ //
1408
+ // Helper for random change data (only test data for Sparkline plots)
1409
+ //
1410
+ function SmallChangeVal(val) {
1411
+ var new_val = Math.floor(100*Math.random());
1412
+ var plusOrMinus = Math.random() < 0.5 ? -1 : 1;
1413
+ var result = val[0]+new_val*plusOrMinus;
1414
+ if (parseInt(result) > 1000){
1415
+ return [val[0] - new_val]
1416
+ }
1417
+ if (parseInt(result) < 0){
1418
+ return [val[0] + new_val]
1419
+ }
1420
+ return [result];
1421
+ }
1422
+ //
1423
+ // Make array of random data
1424
+ //
1425
+ function SparklineTestData(){
1426
+ var arr = [];
1427
+ for (var i=1; i<9; i++){
1428
+ arr.push([Math.floor(1000*Math.random())])
1429
+ }
1430
+ return arr;
1431
+ }
1432
+ //
1433
+ // Redraw Knob charts on Dashboard (panel- servers)
1434
+ //
1435
+ function RedrawKnob(elem){
1436
+ elem.animate({
1437
+ value: Math.floor(100*Math.random())
1438
+ },{
1439
+ duration: 3000,
1440
+ easing:'swing',
1441
+ progress: function()
1442
+ {
1443
+ $(this).val(parseInt(Math.ceil(elem.val()))).trigger('change');
1444
+ }
1445
+ });
1446
+ }
1447
+ //
1448
+ // Draw 3 Sparkline plot in Dashboard header
1449
+ //
1450
+ function SparklineLoop(){
1451
+ SparkLineDrawBarGraph($('#sparkline-1'), sparkline_arr_1.map(SmallChangeVal));
1452
+ SparkLineDrawBarGraph($('#sparkline-2'), sparkline_arr_2.map(SmallChangeVal), '#7BC5D3');
1453
+ SparkLineDrawBarGraph($('#sparkline-3'), sparkline_arr_3.map(SmallChangeVal), '#B25050');
1454
+ }
1455
+ //
1456
+ // Draw Morris charts on Dashboard (panel- Statistics + 3 donut)
1457
+ //
1458
+ function MorrisDashboard(){
1459
+ Morris.Line({
1460
+ element: 'stat-graph',
1461
+ data: [
1462
+ {"period": "2014-01", "Win8": 13.4, "Win7": 55.3, 'Vista': 1.5, 'NT': 0.3, 'XP':11, 'Linux': 4.9, 'Mac': 9.6 , 'Mobile':4},
1463
+ {"period": "2013-12", "Win8": 10, "Win7": 55.9, 'Vista': 1.5, 'NT': 3.1, 'XP':11.6, 'Linux': 4.8, 'Mac': 9.2 , 'Mobile':3.8},
1464
+ {"period": "2013-11", "Win8": 8.6, "Win7": 56.4, 'Vista': 1.6, 'NT': 3.7, 'XP':11.7, 'Linux': 4.8, 'Mac': 9.6 , 'Mobile':3.7},
1465
+ {"period": "2013-10", "Win8": 9.9, "Win7": 56.7, 'Vista': 1.6, 'NT': 1.4, 'XP':12.4, 'Linux': 4.9, 'Mac': 9.6 , 'Mobile':3.3},
1466
+ {"period": "2013-09", "Win8": 10.2, "Win7": 56.8, 'Vista': 1.6, 'NT': 0.4, 'XP':13.5, 'Linux': 4.8, 'Mac': 9.3 , 'Mobile':3.3},
1467
+ {"period": "2013-08", "Win8": 9.6, "Win7": 55.9, 'Vista': 1.7, 'NT': 0.4, 'XP':14.7, 'Linux': 5, 'Mac': 9.2 , 'Mobile':3.4},
1468
+ {"period": "2013-07", "Win8": 9, "Win7": 56.2, 'Vista': 1.8, 'NT': 0.4, 'XP':15.8, 'Linux': 4.9, 'Mac': 8.7 , 'Mobile':3.2},
1469
+ {"period": "2013-06", "Win8": 8.6, "Win7": 56.3, 'Vista': 2, 'NT': 0.4, 'XP':15.4, 'Linux': 4.9, 'Mac': 9.1 , 'Mobile':3.2},
1470
+ {"period": "2013-05", "Win8": 7.9, "Win7": 56.4, 'Vista': 2.1, 'NT': 0.4, 'XP':15.7, 'Linux': 4.9, 'Mac': 9.7 , 'Mobile':2.6},
1471
+ {"period": "2013-04", "Win8": 7.3, "Win7": 56.4, 'Vista': 2.2, 'NT': 0.4, 'XP':16.4, 'Linux': 4.8, 'Mac': 9.7 , 'Mobile':2.2},
1472
+ {"period": "2013-03", "Win8": 6.7, "Win7": 55.9, 'Vista': 2.4, 'NT': 0.4, 'XP':17.6, 'Linux': 4.7, 'Mac': 9.5 , 'Mobile':2.3},
1473
+ {"period": "2013-02", "Win8": 5.7, "Win7": 55.3, 'Vista': 2.4, 'NT': 0.4, 'XP':19.1, 'Linux': 4.8, 'Mac': 9.6 , 'Mobile':2.2},
1474
+ {"period": "2013-01", "Win8": 4.8, "Win7": 55.3, 'Vista': 2.6, 'NT': 0.5, 'XP':19.9, 'Linux': 4.8, 'Mac': 9.3 , 'Mobile':2.2}
1475
+ ],
1476
+ xkey: 'period',
1477
+ ykeys: ['Win8', 'Win7','Vista','NT','XP', 'Linux', 'Mac', 'Mobile'],
1478
+ labels: ['Win8', 'Win7','Vista','NT','XP', 'Linux', 'Mac', 'Mobile']
1479
+ });
1480
+ Morris.Donut({
1481
+ element: 'morris_donut_1',
1482
+ data: [
1483
+ {value: 70, label: 'pay', formatted: 'at least 70%' },
1484
+ {value: 15, label: 'client', formatted: 'approx. 15%' },
1485
+ {value: 10, label: 'buy', formatted: 'approx. 10%' },
1486
+ {value: 5, label: 'hosted', formatted: 'at most 5%' }
1487
+ ],
1488
+ formatter: function (x, data) { return data.formatted; }
1489
+ });
1490
+ Morris.Donut({
1491
+ element: 'morris_donut_2',
1492
+ data: [
1493
+ {value: 20, label: 'office', formatted: 'current' },
1494
+ {value: 35, label: 'store', formatted: 'approx. 35%' },
1495
+ {value: 20, label: 'shop', formatted: 'approx. 20%' },
1496
+ {value: 25, label: 'cars', formatted: 'at most 25%' }
1497
+ ],
1498
+ formatter: function (x, data) { return data.formatted; }
1499
+ });
1500
+ Morris.Donut({
1501
+ element: 'morris_donut_3',
1502
+ data: [
1503
+ {value: 17, label: 'current', formatted: 'current' },
1504
+ {value: 22, label: 'week', formatted: 'last week' },
1505
+ {value: 10, label: 'month', formatted: 'last month' },
1506
+ {value: 25, label: 'period', formatted: 'period' },
1507
+ {value: 25, label: 'year', formatted: 'this year' }
1508
+ ],
1509
+ formatter: function (x, data) { return data.formatted; }
1510
+ });
1511
+ }
1512
+ //
1513
+ // Draw SparkLine example Charts for Dashboard (table- Tickers)
1514
+ //
1515
+ function DrawSparklineDashboard(){
1516
+ SparklineLoop();
1517
+ setInterval(SparklineLoop, 1000);
1518
+ var sparkline_clients = [[309],[223], [343], [652], [455], [18], [912],[15]];
1519
+ $('.bar').each(function(){
1520
+ $(this).sparkline(sparkline_clients.map(SmallChangeVal), {type: 'bar', barWidth: 5, highlightColor: '#000', barSpacing: 2, height: 30, stackedBarColor: '#6AA6D6'});
1521
+ });
1522
+ var sparkline_table = [ [1,341], [2,464], [4,564], [5,235], [6,335], [7,535], [8,642], [9,342], [10,765] ];
1523
+ $('.td-graph').each(function(){
1524
+ var arr = $.map( sparkline_table, function(val, index) {
1525
+ return [[val[0], SmallChangeVal([val[1]])]];
1526
+ });
1527
+ $(this).sparkline( arr ,
1528
+ {defaultPixelsPerValue: 10, minSpotColor: null, maxSpotColor: null, spotColor: null,
1529
+ fillColor: false, lineWidth: 2, lineColor: '#5A8DB6'});
1530
+ });
1531
+ }
1532
+ //
1533
+ // Draw Knob Charts for Dashboard (for servers)
1534
+ //
1535
+ function DrawKnobDashboard(){
1536
+ var srv_monitoring_selectors = [
1537
+ $("#knob-srv-1"),$("#knob-srv-2"),$("#knob-srv-3"),
1538
+ $("#knob-srv-4"),$("#knob-srv-5"),$("#knob-srv-6")
1539
+ ];
1540
+ srv_monitoring_selectors.forEach(DrawKnob);
1541
+ setInterval(function(){
1542
+ srv_monitoring_selectors.forEach(RedrawKnob);
1543
+ }, 3000);
1544
+ }
1545
+ /*-------------------------------------------
1546
+ Function for File upload page (form_file_uploader.html)
1547
+ ---------------------------------------------*/
1548
+ function FileUpload(){
1549
+ $('#bootstrapped-fine-uploader').fineUploader({
1550
+ template: 'qq-template-bootstrap',
1551
+ classes: {
1552
+ success: 'alert alert-success',
1553
+ fail: 'alert alert-error'
1554
+ },
1555
+ thumbnails: {
1556
+ placeholders: {
1557
+ waitingPath: "assets/waiting-generic.png",
1558
+ notAvailablePath: "assets/not_available-generic.png"
1559
+ }
1560
+ },
1561
+ request: {
1562
+ endpoint: 'server/handleUploads'
1563
+ },
1564
+ validation: {
1565
+ allowedExtensions: ['jpeg', 'jpg', 'gif', 'png']
1566
+ }
1567
+ });
1568
+ }
1569
+ /*-------------------------------------------
1570
+ Function for OpenStreetMap page (maps.html)
1571
+ ---------------------------------------------*/
1572
+ //
1573
+ // Load GeoIP JSON data and draw 3 maps
1574
+ //
1575
+ function LoadTestMap(){
1576
+ $.getJSON("http://www.telize.com/geoip?callback=?",
1577
+ function(json) {
1578
+ var osmap = new OpenLayers.Layer.OSM("OpenStreetMap");//создание слоя карты
1579
+ var googlestreets = new OpenLayers.Layer.Google("Google Streets", {numZoomLevels: 22,visibility: false});
1580
+ var googlesattelite = new OpenLayers.Layer.Google( "Google Sattelite", {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22});
1581
+ var map1_layers = [googlestreets,osmap, googlesattelite];
1582
+ // Create map in element with ID - map-1
1583
+ var map1 = drawMap(json.longitude, json.latitude, "map-1", map1_layers);
1584
+ $("#map-1").resize(function(){ setTimeout(map1.updateSize(), 500); });
1585
+ // Create map in element with ID - map-2
1586
+ var osmap1 = new OpenLayers.Layer.OSM("OpenStreetMap");//создание слоя карты
1587
+ var map2_layers = [osmap1];
1588
+ var map2 = drawMap(json.longitude, json.latitude, "map-2", map2_layers);
1589
+ $("#map-2").resize(function(){ setTimeout(map2.updateSize(), 500); });
1590
+ // Create map in element with ID - map-3
1591
+ var sattelite = new OpenLayers.Layer.Google( "Google Sattelite", {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22});
1592
+ var map3_layers = [sattelite];
1593
+ var map3 = drawMap(json.longitude, json.latitude, "map-3", map3_layers);
1594
+ $("#map-3").resize(function(){ setTimeout(map3.updateSize(), 500); });
1595
+ }
1596
+ );
1597
+ }
1598
+ /*-------------------------------------------
1599
+ Function for Fullscreen Map page (map_fullscreen.html)
1600
+ ---------------------------------------------*/
1601
+ //
1602
+ // Create Fullscreen Map
1603
+ //
1604
+ function FullScreenMap(){
1605
+ $.getJSON("http://www.telize.com/geoip?callback=?",
1606
+ function(json) {
1607
+ var osmap = new OpenLayers.Layer.OSM("OpenStreetMap");//создание слоя карты
1608
+ var googlestreets = new OpenLayers.Layer.Google("Google Streets", {numZoomLevels: 22,visibility: false});
1609
+ var googlesattelite = new OpenLayers.Layer.Google( "Google Sattelite", {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22});
1610
+ var map1_layers = [googlestreets,osmap, googlesattelite];
1611
+ var map_fs = drawMap(json.longitude, json.latitude, "full-map", map1_layers);
1612
+ }
1613
+ );
1614
+ }
1615
+ /*-------------------------------------------
1616
+ Function for Flickr Gallery page (gallery_flickr.html)
1617
+ ---------------------------------------------*/
1618
+ //
1619
+ // Load data from Flicks, parse and create gallery
1620
+ //
1621
+ function displayFlickrImages(data){
1622
+ var res;
1623
+ $.each(data.items, function(i,item){
1624
+ if (i >11) { return false;}
1625
+ res = "<a href=" + item.link + " title=" + item.title + " target=\"_blank\"><img alt=" + item.title + " src=" + item.media.m + " /></a>";
1626
+ $('#box-one-content').append(res);
1627
+ });
1628
+ setTimeout(function(){
1629
+ $("#box-one-content").justifiedGallery({
1630
+ 'usedSuffix':'lt240',
1631
+ 'justifyLastRow':true,
1632
+ 'rowHeight':150,
1633
+ 'fixedHeight':false,
1634
+ 'captions':true,
1635
+ 'margins':1
1636
+ });
1637
+ $('#box-one-content').fadeIn('slow');
1638
+ }, 100);
1639
+ }
1640
+ /*-------------------------------------------
1641
+ Function for Form Layout page (form layouts.html)
1642
+ ---------------------------------------------*/
1643
+ //
1644
+ // Example form validator function
1645
+ //
1646
+ function DemoFormValidator(){
1647
+ $('#defaultForm').bootstrapValidator({
1648
+ message: 'This value is not valid',
1649
+ fields: {
1650
+ username: {
1651
+ message: 'The username is not valid',
1652
+ validators: {
1653
+ notEmpty: {
1654
+ message: 'The username is required and can\'t be empty'
1655
+ },
1656
+ stringLength: {
1657
+ min: 6,
1658
+ max: 30,
1659
+ message: 'The username must be more than 6 and less than 30 characters long'
1660
+ },
1661
+ regexp: {
1662
+ regexp: /^[a-zA-Z0-9_\.]+$/,
1663
+ message: 'The username can only consist of alphabetical, number, dot and underscore'
1664
+ }
1665
+ }
1666
+ },
1667
+ country: {
1668
+ validators: {
1669
+ notEmpty: {
1670
+ message: 'The country is required and can\'t be empty'
1671
+ }
1672
+ }
1673
+ },
1674
+ acceptTerms: {
1675
+ validators: {
1676
+ notEmpty: {
1677
+ message: 'You have to accept the terms and policies'
1678
+ }
1679
+ }
1680
+ },
1681
+ email: {
1682
+ validators: {
1683
+ notEmpty: {
1684
+ message: 'The email address is required and can\'t be empty'
1685
+ },
1686
+ emailAddress: {
1687
+ message: 'The input is not a valid email address'
1688
+ }
1689
+ }
1690
+ },
1691
+ website: {
1692
+ validators: {
1693
+ uri: {
1694
+ message: 'The input is not a valid URL'
1695
+ }
1696
+ }
1697
+ },
1698
+ phoneNumber: {
1699
+ validators: {
1700
+ digits: {
1701
+ message: 'The value can contain only digits'
1702
+ }
1703
+ }
1704
+ },
1705
+ color: {
1706
+ validators: {
1707
+ hexColor: {
1708
+ message: 'The input is not a valid hex color'
1709
+ }
1710
+ }
1711
+ },
1712
+ zipCode: {
1713
+ validators: {
1714
+ usZipCode: {
1715
+ message: 'The input is not a valid US zip code'
1716
+ }
1717
+ }
1718
+ },
1719
+ password: {
1720
+ validators: {
1721
+ notEmpty: {
1722
+ message: 'The password is required and can\'t be empty'
1723
+ },
1724
+ identical: {
1725
+ field: 'confirmPassword',
1726
+ message: 'The password and its confirm are not the same'
1727
+ }
1728
+ }
1729
+ },
1730
+ confirmPassword: {
1731
+ validators: {
1732
+ notEmpty: {
1733
+ message: 'The confirm password is required and can\'t be empty'
1734
+ },
1735
+ identical: {
1736
+ field: 'password',
1737
+ message: 'The password and its confirm are not the same'
1738
+ }
1739
+ }
1740
+ },
1741
+ ages: {
1742
+ validators: {
1743
+ lessThan: {
1744
+ value: 100,
1745
+ inclusive: true,
1746
+ message: 'The ages has to be less than 100'
1747
+ },
1748
+ greaterThan: {
1749
+ value: 10,
1750
+ inclusive: false,
1751
+ message: 'The ages has to be greater than or equals to 10'
1752
+ }
1753
+ }
1754
+ }
1755
+ }
1756
+ });
1757
+ }
1758
+ //
1759
+ // Function for Dynamically Change input size on Form Layout page
1760
+ //
1761
+ function FormLayoutExampleInputLength(selector){
1762
+ var steps = [
1763
+ "col-sm-1",
1764
+ "col-sm-2",
1765
+ "col-sm-3",
1766
+ "col-sm-4",
1767
+ "col-sm-5",
1768
+ "col-sm-6",
1769
+ "col-sm-7",
1770
+ "col-sm-8",
1771
+ "col-sm-9",
1772
+ "col-sm-10",
1773
+ "col-sm-11",
1774
+ "col-sm-12"
1775
+ ];
1776
+ selector.slider({
1777
+ range: 'min',
1778
+ value: 1,
1779
+ min: 0,
1780
+ max: 11,
1781
+ step: 1,
1782
+ slide: function(event, ui) {
1783
+ if (ui.value < 1) {
1784
+ return false;
1785
+ }
1786
+ var input = $("#form-styles");
1787
+ var f = input.parent();
1788
+ f.removeClass();
1789
+ f.addClass(steps[ui.value]);
1790
+ input.attr("placeholder",'.'+steps[ui.value]);
1791
+ }
1792
+ });
1793
+ }
1794
+ /*-------------------------------------------
1795
+ Functions for Progressbar page (ui_progressbars.html)
1796
+ ---------------------------------------------*/
1797
+ //
1798
+ // Function for Knob clock
1799
+ //
1800
+ function RunClock() {
1801
+ var second = $(".second");
1802
+ var minute = $(".minute");
1803
+ var hour = $(".hour");
1804
+ var d = new Date();
1805
+ var s = d.getSeconds();
1806
+ var m = d.getMinutes();
1807
+ var h = d.getHours();
1808
+ if (h > 11) {h = h-12;}
1809
+ $('#knob-clock-value').html(h+':'+m+':'+s);
1810
+ second.val(s).trigger("change");
1811
+ minute.val(m).trigger("change");
1812
+ hour.val(h).trigger("change");
1813
+ }
1814
+ //
1815
+ // Function for create test sliders on Progressbar page
1816
+ //
1817
+ function CreateAllSliders(){
1818
+ $(".slider-default").slider();
1819
+ var slider_range_min_amount = $(".slider-range-min-amount");
1820
+ var slider_range_min = $(".slider-range-min");
1821
+ var slider_range_max = $(".slider-range-max");
1822
+ var slider_range_max_amount = $(".slider-range-max-amount");
1823
+ var slider_range = $(".slider-range");
1824
+ var slider_range_amount = $(".slider-range-amount");
1825
+ slider_range_min.slider({
1826
+ range: "min",
1827
+ value: 37,
1828
+ min: 1,
1829
+ max: 700,
1830
+ slide: function( event, ui ) {
1831
+ slider_range_min_amount.val( "$" + ui.value );
1832
+ }
1833
+ });
1834
+ slider_range_min_amount.val("$" + slider_range_min.slider( "value" ));
1835
+ slider_range_max.slider({
1836
+ range: "max",
1837
+ min: 1,
1838
+ max: 100,
1839
+ value: 2,
1840
+ slide: function( event, ui ) {
1841
+ slider_range_max_amount.val( ui.value );
1842
+ }
1843
+ });
1844
+ slider_range_max_amount.val(slider_range_max.slider( "value" ));
1845
+ slider_range.slider({
1846
+ range: true,
1847
+ min: 0,
1848
+ max: 500,
1849
+ values: [ 75, 300 ],
1850
+ slide: function( event, ui ) {
1851
+ slider_range_amount.val( "$" + ui.values[ 0 ] + " - $" + ui.values[ 1 ] );
1852
+ }
1853
+ });
1854
+ slider_range_amount.val( "$" + slider_range.slider( "values", 0 ) +
1855
+ " - $" + slider_range.slider( "values", 1 ) );
1856
+ $( "#equalizer > div.progress > div" ).each(function() {
1857
+ // read initial values from markup and remove that
1858
+ var value = parseInt( $( this ).text(), 10 );
1859
+ $( this ).empty().slider({
1860
+ value: value,
1861
+ range: "min",
1862
+ animate: true,
1863
+ orientation: "vertical"
1864
+ });
1865
+ });
1866
+ }
1867
+ /*-------------------------------------------
1868
+ Function for jQuery-UI page (ui_jquery-ui.html)
1869
+ ---------------------------------------------*/
1870
+ //
1871
+ // Function for make all Date-Time pickers on page
1872
+ //
1873
+ function AllTimePickers(){
1874
+ $('#datetime_example').datetimepicker({});
1875
+ $('#time_example').timepicker({
1876
+ hourGrid: 4,
1877
+ minuteGrid: 10,
1878
+ timeFormat: 'hh:mm tt'
1879
+ });
1880
+ $('#date3_example').datepicker({ numberOfMonths: 3, showButtonPanel: true});
1881
+ $('#date3-1_example').datepicker({ numberOfMonths: 3, showButtonPanel: true});
1882
+ $('#date_example').datepicker({});
1883
+ }
1884
+ /*-------------------------------------------
1885
+ Function for Calendar page (calendar.html)
1886
+ ---------------------------------------------*/
1887
+ //
1888
+ // Example form validator function
1889
+ //
1890
+ function DrawCalendar(){
1891
+ /* initialize the external events
1892
+ -----------------------------------------------------------------*/
1893
+ $('#external-events div.external-event').each(function() {
1894
+ // create an Event Object (http://arshaw.com/fullcalendar/docs/event_data/Event_Object/)
1895
+ var eventObject = {
1896
+ title: $.trim($(this).text()) // use the element's text as the event title
1897
+ };
1898
+ // store the Event Object in the DOM element so we can get to it later
1899
+ $(this).data('eventObject', eventObject);
1900
+ // make the event draggable using jQuery UI
1901
+ $(this).draggable({
1902
+ zIndex: 999,
1903
+ revert: true, // will cause the event to go back to its
1904
+ revertDuration: 0 // original position after the drag
1905
+ });
1906
+ });
1907
+ /* initialize the calendar
1908
+ -----------------------------------------------------------------*/
1909
+ var calendar = $('#calendar').fullCalendar({
1910
+ header: {
1911
+ left: 'prev,next today',
1912
+ center: 'title',
1913
+ right: 'month,agendaWeek,agendaDay'
1914
+ },
1915
+ selectable: true,
1916
+ selectHelper: true,
1917
+ select: function(start, end, allDay) {
1918
+ var form = $('<form id="event_form">'+
1919
+ '<div class="form-group has-success has-feedback">'+
1920
+ '<label">Event name</label>'+
1921
+ '<div>'+
1922
+ '<input type="text" id="newevent_name" class="form-control" placeholder="Name of event">'+
1923
+ '</div>'+
1924
+ '<label>Description</label>'+
1925
+ '<div>'+
1926
+ '<textarea rows="3" id="newevent_desc" class="form-control" placeholder="Description"></textarea>'+
1927
+ '</div>'+
1928
+ '</div>'+
1929
+ '</form>');
1930
+ var buttons = $('<button id="event_cancel" type="cancel" class="btn btn-default btn-label-left">'+
1931
+ '<span><i class="fa fa-clock-o txt-danger"></i></span>'+
1932
+ 'Cancel'+
1933
+ '</button>'+
1934
+ '<button type="submit" id="event_submit" class="btn btn-primary btn-label-left pull-right">'+
1935
+ '<span><i class="fa fa-clock-o"></i></span>'+
1936
+ 'Add'+
1937
+ '</button>');
1938
+ OpenModalBox('Add event', form, buttons);
1939
+ $('#event_cancel').on('click', function(){
1940
+ CloseModalBox();
1941
+ });
1942
+ $('#event_submit').on('click', function(){
1943
+ var new_event_name = $('#newevent_name').val();
1944
+ if (new_event_name != ''){
1945
+ calendar.fullCalendar('renderEvent',
1946
+ {
1947
+ title: new_event_name,
1948
+ description: $('#newevent_desc').val(),
1949
+ start: start,
1950
+ end: end,
1951
+ allDay: allDay
1952
+ },
1953
+ true // make the event "stick"
1954
+ );
1955
+ }
1956
+ CloseModalBox();
1957
+ });
1958
+ calendar.fullCalendar('unselect');
1959
+ },
1960
+ editable: true,
1961
+ droppable: true, // this allows things to be dropped onto the calendar !!!
1962
+ drop: function(date, allDay) { // this function is called when something is dropped
1963
+ // retrieve the dropped element's stored Event Object
1964
+ var originalEventObject = $(this).data('eventObject');
1965
+ // we need to copy it, so that multiple events don't have a reference to the same object
1966
+ var copiedEventObject = $.extend({}, originalEventObject);
1967
+ // assign it the date that was reported
1968
+ copiedEventObject.start = date;
1969
+ copiedEventObject.allDay = allDay;
1970
+ // render the event on the calendar
1971
+ // the last `true` argument determines if the event "sticks" (http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/)
1972
+ $('#calendar').fullCalendar('renderEvent', copiedEventObject, true);
1973
+ // is the "remove after drop" checkbox checked?
1974
+ if ($('#drop-remove').is(':checked')) {
1975
+ // if so, remove the element from the "Draggable Events" list
1976
+ $(this).remove();
1977
+ }
1978
+ },
1979
+ eventRender: function (event, element, icon) {
1980
+ if (event.description != "") {
1981
+ element.attr('title', event.description);
1982
+ }
1983
+ },
1984
+ eventClick: function(calEvent, jsEvent, view) {
1985
+ var form = $('<form id="event_form">'+
1986
+ '<div class="form-group has-success has-feedback">'+
1987
+ '<label">Event name</label>'+
1988
+ '<div>'+
1989
+ '<input type="text" id="newevent_name" value="'+ calEvent.title +'" class="form-control" placeholder="Name of event">'+
1990
+ '</div>'+
1991
+ '<label>Description</label>'+
1992
+ '<div>'+
1993
+ '<textarea rows="3" id="newevent_desc" class="form-control" placeholder="Description">'+ calEvent.description +'</textarea>'+
1994
+ '</div>'+
1995
+ '</div>'+
1996
+ '</form>');
1997
+ var buttons = $('<button id="event_cancel" type="cancel" class="btn btn-default btn-label-left">'+
1998
+ '<span><i class="fa fa-clock-o txt-danger"></i></span>'+
1999
+ 'Cancel'+
2000
+ '</button>'+
2001
+ '<button id="event_delete" type="cancel" class="btn btn-danger btn-label-left">'+
2002
+ '<span><i class="fa fa-clock-o txt-danger"></i></span>'+
2003
+ 'Delete'+
2004
+ '</button>'+
2005
+ '<button type="submit" id="event_change" class="btn btn-primary btn-label-left pull-right">'+
2006
+ '<span><i class="fa fa-clock-o"></i></span>'+
2007
+ 'Save changes'+
2008
+ '</button>');
2009
+ OpenModalBox('Change event', form, buttons);
2010
+ $('#event_cancel').on('click', function(){
2011
+ CloseModalBox();
2012
+ });
2013
+ $('#event_delete').on('click', function(){
2014
+ calendar.fullCalendar('removeEvents' , function(ev){
2015
+ return (ev._id == calEvent._id);
2016
+ });
2017
+ CloseModalBox();
2018
+ });
2019
+ $('#event_change').on('click', function(){
2020
+ calEvent.title = $('#newevent_name').val();
2021
+ calEvent.description = $('#newevent_desc').val();
2022
+ calendar.fullCalendar('updateEvent', calEvent);
2023
+ CloseModalBox()
2024
+ });
2025
+ }
2026
+ });
2027
+ $('#new-event-add').on('click', function(event){
2028
+ event.preventDefault();
2029
+ var event_name = $('#new-event-title').val();
2030
+ var event_description = $('#new-event-desc').val();
2031
+ if (event_name != ''){
2032
+ var event_template = $('<div class="external-event" data-description="'+event_description+'">'+event_name+'</div>');
2033
+ $('#events-templates-header').after(event_template);
2034
+ var eventObject = {
2035
+ title: event_name,
2036
+ description: event_description
2037
+ };
2038
+ // store the Event Object in the DOM element so we can get to it later
2039
+ event_template.data('eventObject', eventObject);
2040
+ event_template.draggable({
2041
+ zIndex: 999,
2042
+ revert: true,
2043
+ revertDuration: 0
2044
+ });
2045
+ }
2046
+ });
2047
+ }
2048
+ //
2049
+ // Load scripts and draw Calendar
2050
+ //
2051
+ function DrawFullCalendar(){
2052
+ LoadCalendarScript(DrawCalendar);
2053
+ }
2054
+ //////////////////////////////////////////////////////
2055
+ //////////////////////////////////////////////////////
2056
+ //
2057
+ // MAIN DOCUMENT READY SCRIPT OF DEVOOPS THEME
2058
+ //
2059
+ // In this script main logic of theme
2060
+ //
2061
+ //////////////////////////////////////////////////////
2062
+ //////////////////////////////////////////////////////
2063
+ $(document).ready(function () {
2064
+ $('.show-sidebar').on('click', function () {
2065
+ $('div#main').toggleClass('sidebar-show');
2066
+ setTimeout(MessagesMenuWidth, 250);
2067
+ });
2068
+ var ajax_url = location.hash.replace(/^#/, '');
2069
+ if (ajax_url.length < 1) {
2070
+ ajax_url = 'ajax/dashboard.html';
2071
+ }
2072
+ LoadAjaxContent(ajax_url);
2073
+ $('.main-menu').on('click', 'a', function (e) {
2074
+ var parents = $(this).parents('li');
2075
+ var li = $(this).closest('li.dropdown');
2076
+ var another_items = $('.main-menu li').not(parents);
2077
+ another_items.find('a').removeClass('active');
2078
+ another_items.find('a').removeClass('active-parent');
2079
+ if ($(this).hasClass('dropdown-toggle') || $(this).closest('li').find('ul').length == 0) {
2080
+ $(this).addClass('active-parent');
2081
+ var current = $(this).next();
2082
+ if (current.is(':visible')) {
2083
+ li.find("ul.dropdown-menu").slideUp('fast');
2084
+ li.find("ul.dropdown-menu a").removeClass('active')
2085
+ }
2086
+ else {
2087
+ another_items.find("ul.dropdown-menu").slideUp('fast');
2088
+ current.slideDown('fast');
2089
+ }
2090
+ }
2091
+ else {
2092
+ if (li.find('a.dropdown-toggle').hasClass('active-parent')) {
2093
+ var pre = $(this).closest('ul.dropdown-menu');
2094
+ pre.find("li.dropdown").not($(this).closest('li')).find('ul.dropdown-menu').slideUp('fast');
2095
+ }
2096
+ }
2097
+ if ($(this).hasClass('active') == false) {
2098
+ $(this).parents("ul.dropdown-menu").find('a').removeClass('active');
2099
+ $(this).addClass('active')
2100
+ }
2101
+ if ($(this).hasClass('ajax-link')) {
2102
+ e.preventDefault();
2103
+ if ($(this).hasClass('add-full')) {
2104
+ $('#content').addClass('full-content');
2105
+ }
2106
+ else {
2107
+ $('#content').removeClass('full-content');
2108
+ }
2109
+ var url = $(this).attr('href');
2110
+ window.location.hash = url;
2111
+ LoadAjaxContent(url);
2112
+ }
2113
+ if ($(this).attr('href') == '#') {
2114
+ e.preventDefault();
2115
+ }
2116
+ });
2117
+ var height = window.innerHeight - 49;
2118
+ $('#main').css('min-height', height)
2119
+ .on('click', '.expand-link', function (e) {
2120
+ var body = $('body');
2121
+ e.preventDefault();
2122
+ var box = $(this).closest('div.box');
2123
+ var button = $(this).find('i');
2124
+ button.toggleClass('fa-expand').toggleClass('fa-compress');
2125
+ box.toggleClass('expanded');
2126
+ body.toggleClass('body-expanded');
2127
+ var timeout = 0;
2128
+ if (body.hasClass('body-expanded')) {
2129
+ timeout = 100;
2130
+ }
2131
+ setTimeout(function () {
2132
+ box.toggleClass('expanded-padding');
2133
+ }, timeout);
2134
+ setTimeout(function () {
2135
+ box.resize();
2136
+ box.find('[id^=map-]').resize();
2137
+ }, timeout + 50);
2138
+ })
2139
+ .on('click', '.collapse-link', function (e) {
2140
+ e.preventDefault();
2141
+ var box = $(this).closest('div.box');
2142
+ var button = $(this).find('i');
2143
+ var content = box.find('div.box-content');
2144
+ content.slideToggle('fast');
2145
+ button.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down');
2146
+ setTimeout(function () {
2147
+ box.resize();
2148
+ box.find('[id^=map-]').resize();
2149
+ }, 50);
2150
+ })
2151
+ .on('click', '.close-link', function (e) {
2152
+ e.preventDefault();
2153
+ var content = $(this).closest('div.box');
2154
+ content.remove();
2155
+ });
2156
+ $('#locked-screen').on('click', function (e) {
2157
+ e.preventDefault();
2158
+ $('body').addClass('body-screensaver');
2159
+ $('#screensaver').addClass("show");
2160
+ ScreenSaver();
2161
+ });
2162
+ $('body').on('click', 'a.close-link', function(e){
2163
+ e.preventDefault();
2164
+ CloseModalBox();
2165
+ });
2166
+ $('#top-panel').on('click','a', function(e){
2167
+ if ($(this).hasClass('ajax-link')) {
2168
+ e.preventDefault();
2169
+ if ($(this).hasClass('add-full')) {
2170
+ $('#content').addClass('full-content');
2171
+ }
2172
+ else {
2173
+ $('#content').removeClass('full-content');
2174
+ }
2175
+ var url = $(this).attr('href');
2176
+ window.location.hash = url;
2177
+ LoadAjaxContent(url);
2178
+ }
2179
+ });
2180
+ $('#search').on('keydown', function(e){
2181
+ if (e.keyCode == 13){
2182
+ e.preventDefault();
2183
+ $('#content').removeClass('full-content');
2184
+ ajax_url = 'ajax/page_search.html';
2185
+ window.location.hash = ajax_url;
2186
+ LoadAjaxContent(ajax_url);
2187
+ }
2188
+ });
2189
+ $('#screen_unlock').on('mouseover', function(){
2190
+ var header = 'Enter current username and password';
2191
+ var form = $('<div class="form-group"><label class="control-label">Username</label><input type="text" class="form-control" name="username" /></div>'+
2192
+ '<div class="form-group"><label class="control-label">Password</label><input type="password" class="form-control" name="password" /></div>');
2193
+ var button = $('<div class="text-center"><a href="index.html" class="btn btn-primary">Unlock</a></div>');
2194
+ OpenModalBox(header, form, button);
2195
+ });
2196
+ });
2197
+
2198
+