devoops-rails 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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
+