kodiak 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ /* application.fonts */
2
+
3
+ // Bebas
4
+ @font-face {
5
+ font-family: 'Bebas';
6
+ src: url('/fonts/BebasNeue-webfont.eot');
7
+ src: url('/fonts/BebasNeue-webfont.eot?#iefix') format('embedded-opentype'),
8
+ url('/fonts/BebasNeue-webfont.woff') format('woff'),
9
+ url('/fonts/BebasNeue-webfont.ttf') format('truetype'),
10
+ url('/fonts/BebasNeue-webfont.svg#BebasNeueRegular') format('svg');
11
+ font-weight: normal;
12
+ font-style: normal;
13
+ }
14
+
15
+ // Pictos
16
+ @font-face {
17
+ font-family: 'Pictos';
18
+ src: url('/fonts/pictos-web.eot');
19
+ src: url('/fonts/pictos-web.eot?#iefix') format('embedded-opentype'),
20
+ url('/fonts/pictos-web.woff') format('woff'),
21
+ url('/fonts/pictos-web.ttf') format('truetype'),
22
+ url('/fonts/pictos-web.svg#webfontIyfZbseF') format('svg');
23
+ font-weight: normal;
24
+ font-style: normal;
25
+ }
26
+
@@ -0,0 +1,419 @@
1
+ @import "../../../lib/stylesheets/less/global.reset";
2
+ @import "../../../lib/stylesheets/less/global.methods";
3
+ @import "../../../lib/stylesheets/less/global.utility";
4
+ @import "application.fonts";
5
+
6
+ // global vars
7
+ @radius: 5px;
8
+ @pad: 20px;
9
+ @marg: 15px;
10
+
11
+ @blue: #43a8d8;
12
+ @red: #eb2020;
13
+ @green: #348013;
14
+
15
+ html {
16
+ width: 100%; height: 100%;
17
+ background: #000;
18
+ }
19
+
20
+ body {
21
+ min-width: 100%; height: 100%;
22
+ position: relative;
23
+ font: 13px/normal "Helvetica Neue", Arial, Helvetica, sans-serif;
24
+ color: #FFF;
25
+ background: #000;
26
+ .shadow();
27
+ }
28
+
29
+ h1, h2, h3, h4, h5 { font-weight: bold; }
30
+
31
+ h1 { font-size: 22px; margin-bottom: @marg; }
32
+ h2 { font-size: 20px; margin-bottom: 10px;}
33
+ h3 {
34
+ font-size: 18px;
35
+ color: #AAA;
36
+ margin-bottom: 5px;
37
+ a {
38
+ font-size: 13px;
39
+ line-height: 18px;
40
+ font-weight: normal;
41
+ text-decoration: underline;
42
+ }
43
+ }
44
+
45
+
46
+ h4 {
47
+ font-size: 15px;
48
+ a {
49
+ font-size: 13px;
50
+ margin-left: 5px;
51
+ font-weight: normal;
52
+ }
53
+ }
54
+
55
+ h5 {
56
+ font-size: 14px;
57
+ color: #777;
58
+ }
59
+
60
+ a {
61
+ color: @blue;
62
+ text-decoration: none;
63
+
64
+ &:hover {
65
+ color: @blue * 0.8;
66
+ text-decoration: underline;
67
+ }
68
+
69
+ &.delete, &.cancel {
70
+ color: @red;
71
+ &:hover {
72
+ color: @red * 0.8;
73
+ }
74
+ }
75
+
76
+ &.save {
77
+ color: @green;
78
+ &:hover {
79
+ color: @green * 0.8;
80
+ }
81
+ }
82
+
83
+ &.toggle-cancel {
84
+ &.active {
85
+ color: @red;
86
+ &:hover {
87
+ color: @red * 0.8;
88
+ }
89
+ }
90
+ }
91
+ }
92
+
93
+ button {
94
+ display: inline-block;
95
+ color: #000;
96
+ padding: 6px 12px;
97
+ .gradient(#DDD,#BBB,#DDD);
98
+ .highlight();
99
+
100
+ &:hover {
101
+ cursor: pointer;
102
+ .gradient(#FFF,#CCC,#DDD);
103
+ }
104
+
105
+ &:active {
106
+ .gradient(#CCC,#EEE,#DDD);
107
+ color: #000;
108
+ }
109
+ }
110
+
111
+
112
+ .button(){
113
+ color: #CCC;
114
+ padding: 5px 10px;
115
+ border: 1px solid #111;
116
+ text-decoration: none;
117
+ font-weight: normal;
118
+ -webkit-box-shadow: inset 0 1px 0px rgba(255,255,255,0.2);
119
+ -moz-box-shadow: inset 0 1px 0px rgba(255,255,255,0.2);
120
+ box-shadow: inset 0px 1px 0px rgba(255,255,255,0.2);
121
+ .rounded(3px);
122
+ .gradient(#555,#333,#444);
123
+
124
+
125
+ &:hover {
126
+ color: #FFF;
127
+ text-decoration: none;
128
+ .gradient(@blue, @blue*0.7, @blue);
129
+ }
130
+
131
+ &:active {
132
+ .gradient(@blue*0.7, @blue, @blue);
133
+ }
134
+
135
+ b {
136
+ margin-right: 5px;
137
+ }
138
+
139
+ &.add {
140
+ &:hover { .gradient(@green, @green*0.7, @green); }
141
+ &:active { .gradient(@green*0.7, @green, @green); }
142
+ }
143
+
144
+ &.delete {
145
+ &:hover { .gradient(@red,@red*0.7,@red); }
146
+ &:active { .gradient(@red*0.7,@red,@red); }
147
+ }
148
+ }
149
+
150
+
151
+ ul.sxs {
152
+ display: block;
153
+ li {
154
+ display: block;
155
+ float: left;
156
+ a {
157
+ display: block;
158
+ }
159
+ }
160
+ }
161
+
162
+ ul.actions {
163
+ margin: @marg 0;
164
+ li {
165
+ a {
166
+ .button();
167
+ }
168
+ &.left {
169
+ a {
170
+ border-right: 0;
171
+ .left-rounded(3px);
172
+ }
173
+ }
174
+ &.right {
175
+ a {
176
+ .right-rounded(3px);
177
+ }
178
+ }
179
+ }
180
+ }
181
+
182
+ .pictos { font-family: 'Pictos'; }
183
+ .light { font-weight: 300; }
184
+
185
+ b { .pictos(); }
186
+
187
+
188
+
189
+
190
+ // layout
191
+
192
+ @panel_width: 250px;
193
+
194
+ div#main {
195
+ position: absolute;
196
+ z-index: 0;
197
+ top: 0; right: 0;
198
+ left: @panel_width + (2 * @pad); bottom: 0;
199
+
200
+ div#map {
201
+ width: 100%; height: 100%;
202
+ }
203
+
204
+ div#loading {
205
+ display: none;
206
+ position: absolute;
207
+ top: 0; right: 0;
208
+ width: 100%; height: 100%;
209
+ z-index: 9999;
210
+ background: rgba(0,0,0,0.8);
211
+
212
+ img {
213
+ display: block;
214
+ width: auto; height: auto;
215
+ position: absolute;
216
+ top: 50%; left: 50%;
217
+ }
218
+ }
219
+ }
220
+
221
+ div#panels {
222
+ position: absolute;
223
+ z-index: 1;
224
+ top: 0; bottom: 0; left: 0;
225
+ background: rgba(0,0,0,0.5);
226
+ }
227
+
228
+ div.panel {
229
+ width: @panel_width;
230
+ position: absolute;
231
+ top: 0; bottom: 0; left: 0;
232
+ padding: @pad;
233
+ .gradient(#333,#111,#222);
234
+ }
235
+
236
+ div.panel div.panel {
237
+ display: none;
238
+ left: -100%;
239
+ .boxshadow(0, 0, 20px, 1);
240
+ }
241
+
242
+
243
+
244
+
245
+ ul.nav {
246
+ margin-bottom: @marg;
247
+
248
+ li {
249
+ display: block;
250
+ position: relative;
251
+
252
+ a {
253
+ display: block;
254
+ position: relative;
255
+ font-size: 18px;
256
+ line-height: 1;
257
+ font-weight: bold;
258
+ padding: 10px 0px;
259
+ border-top: 1px solid #444;
260
+ border-bottom: 1px solid #000;
261
+ text-decoration: none;
262
+ color: #AAA;
263
+ .shadow();
264
+
265
+ b {
266
+ font-size: 60%;
267
+ line-height: inherit;
268
+ }
269
+
270
+ b.check {
271
+ font-size: 100%;
272
+ margin-right: 10px;
273
+ color: #444;
274
+ }
275
+
276
+ &.active {
277
+ color: #FFF;
278
+ b.check {
279
+ color: @green;
280
+ text-shadow: 0 0 20px rgba(52, 128, 19, 0.5);
281
+ }
282
+ }
283
+
284
+ &:hover {
285
+ color: #FFF;
286
+ text-decoration: none;
287
+ b.check {
288
+ color: inerhit;
289
+ }
290
+ }
291
+
292
+ }
293
+
294
+ .mini {
295
+ .button();
296
+ position: absolute;
297
+ top: 10px; right: 0px;
298
+ font-size: 12px;
299
+ line-height: 1;
300
+ padding: 4px 8px;
301
+ }
302
+ }
303
+ }
304
+
305
+
306
+ ul.overlays {
307
+ margin-bottom: 10px;
308
+ padding: 10px 0;
309
+ border-top: 1px solid #444;
310
+ }
311
+
312
+
313
+
314
+ div#menu {
315
+
316
+ div#header {
317
+ margin-bottom: 10px;
318
+ .shadow();
319
+ h1 {
320
+ margin-bottom: 0;
321
+ }
322
+ }
323
+
324
+ ul#main-menu {
325
+ li {
326
+ a {
327
+ padding: 15px 0px 15px;
328
+ padding-left: 45px;
329
+ b {
330
+ display: block;
331
+ font-size: 22px;
332
+ color: #555;
333
+ border: 2px solid #555;
334
+ .rounded(4px);
335
+ padding: 2px 2px 1px;
336
+ position: absolute;
337
+ top: 10px; left: 0;
338
+ }
339
+ &.tucked {
340
+ display: none;
341
+ }
342
+ }
343
+ }
344
+ }
345
+
346
+ &.inactive {
347
+ width: 50px;
348
+ div#header {
349
+ display: none;
350
+ }
351
+
352
+ ul#main-menu {
353
+
354
+ li {
355
+ a {
356
+ width: 50px; height: 60px;
357
+ padding: 0;
358
+ span {
359
+ display: none;
360
+ }
361
+ b {
362
+ font-size: 31px;
363
+ padding: 4px 4px 3px;
364
+ left: 3px;
365
+ .gradient(rgba(0,0,0,0.1), rgba(0,0,0,0.5), #222);
366
+ &:hover {
367
+ color: #888;
368
+ border-color: #888;
369
+ .gradient( #333, #222, #222);
370
+ }
371
+ }
372
+ &.tucked {
373
+ display: block;
374
+ }
375
+ }
376
+ }
377
+ }
378
+ }
379
+ }
380
+
381
+ form {
382
+
383
+ label {
384
+ display: block;
385
+ margin-bottom: 5px;
386
+ font-weight: bold;
387
+ color: #CCC;
388
+ }
389
+
390
+ input {
391
+ display: block;
392
+ width: @panel_width - 10px;
393
+ padding: 5px;
394
+ font: inherit;
395
+ border: 1px solid #CCC;
396
+ margin-bottom: 10px;
397
+ .gradient(#DDD,#FFF,#FFF);
398
+ }
399
+
400
+
401
+ }
402
+
403
+
404
+
405
+ div.flyout {
406
+ display: none;
407
+ position: absolute;
408
+ top: @pad; left: 100%;
409
+ padding: @pad;
410
+ border: 1px solid rgba(0,0,0,0.9);
411
+ .gradient(rgba(0,0,0,0.75),rgba(0,0,0,0.9), #000);
412
+
413
+ h3 {
414
+ color: #FFF;
415
+ }
416
+ }
417
+
418
+
419
+
@@ -0,0 +1,451 @@
1
+ // require utils.hash
2
+ // require jquery
3
+
4
+ var Application = Application || function(data){
5
+
6
+ var self = this;
7
+ var fxspeed = 200;
8
+ var hash = new Utils.Hash();
9
+ var $loading = $("#loading");
10
+
11
+ //
12
+
13
+ self.initialize = function(){
14
+ self.map = new Map(data.map, "map");
15
+ self.panels.init();
16
+ self.layers.init();
17
+ self.overlays.init();
18
+ self.observe();
19
+ return self;
20
+ }
21
+
22
+ //
23
+
24
+ self.observe = function(){
25
+
26
+ $("a.flyout-trigger").live('click',function(e){
27
+ e.preventDefault();
28
+ var href = $(this).attr("href");
29
+ var $remote = $(href);
30
+
31
+
32
+
33
+
34
+ if( $remote.is(':hidden') ){
35
+ $remote.siblings('.flyout').slideUp(fxspeed);
36
+ $remote.slideDown(fxspeed);
37
+ }
38
+ else {
39
+ $remote.slideUp(fxspeed);
40
+ }
41
+ });
42
+ return self;
43
+ }
44
+
45
+
46
+
47
+
48
+
49
+
50
+ //
51
+
52
+ self.panels = {
53
+
54
+ init : function(){
55
+ this.build();
56
+ this.observe();
57
+ },
58
+
59
+ build : function(){
60
+
61
+ if( hash.element() ) {
62
+ var $panel = $(hash.element());
63
+ self.panels.show($panel);
64
+ } else {
65
+ $panel = $('#panel .panel').eq(0);
66
+ self.panels.show($panel);
67
+ }
68
+
69
+ },
70
+
71
+ observe : function(){
72
+
73
+ hash.onChange( function(){
74
+ var $panel = $(hash.element());
75
+ self.panels.show($panel);
76
+ });
77
+
78
+ $('.hash-trigger').live('click', function(e){
79
+ e.preventDefault();
80
+ e.stopPropagation();
81
+ var href = $(this).attr("href");
82
+ hash.set(href);
83
+ });
84
+
85
+ $('.panel').live('click',function(e){
86
+ if ( $(this).hasClass("active") ) {
87
+ e.stopPropagation();
88
+
89
+ var id = $(this).attr("id");
90
+
91
+ if ( id ) {
92
+ hash.set(id);
93
+ }
94
+
95
+ } else {
96
+ return false;
97
+ }
98
+ });
99
+ },
100
+
101
+ show : function($panel){
102
+ var fxs = 200;
103
+ var animation = {};
104
+ var css = {};
105
+
106
+ if ( $panel.parents('.panel').length ) {
107
+ animation.opacity = 1;
108
+
109
+ if ( $panel.parents('.panel').length == 1 ){
110
+ animation.left = "80px";
111
+ }
112
+ else {
113
+ animation.left = "20px";
114
+ }
115
+
116
+ if( $panel.is(':hidden') ){
117
+ css.display = "block";
118
+ css.opacity = 0;
119
+ }
120
+ }
121
+
122
+ $panel.parents('.panel').each(function(){
123
+ var css = {
124
+ display : 'block',
125
+ opacity : 1
126
+ };
127
+ if ( $(this).parents('.panel').length == 1 ){
128
+ css.left = "80px";
129
+ }
130
+ else {
131
+ css.left = "0px";
132
+ }
133
+ $(this).css(css).addClass("inactive");
134
+ });
135
+
136
+ $panel.css(css).animate(animation, fxs, function(){
137
+ $panel.removeClass("inactive").addClass("active");
138
+ });
139
+
140
+ $panel.siblings('.panel').each(function(){
141
+ $(this).removeClass("active").addClass("inactive").fadeOut(fxs, function(){
142
+ $(this).css("left","-100%");
143
+ });
144
+ });
145
+
146
+ $panel.children('.panel').each(function(){
147
+ $(this).removeClass("active").addClass("inactive").fadeOut(fxs, function(){
148
+ $(this).css("left","-100%");
149
+ });
150
+ });
151
+ }
152
+
153
+ };
154
+
155
+ //
156
+
157
+ self.layers = {
158
+
159
+ init : function(){
160
+ this.build();
161
+ this.observe();
162
+ },
163
+
164
+ build : function(){
165
+
166
+ self.loader.start();
167
+
168
+ var layers = self.map.layers;
169
+ self.map.layers = {};
170
+
171
+ for ( var index in layers ) {
172
+ var layer = layers[index];
173
+ self.map.layers[layer.id] = new Layer(layer);
174
+ }
175
+
176
+ self.layers.refresh();
177
+ },
178
+
179
+
180
+ observe : function(){
181
+
182
+ $(".layer-toggle").live('click', function(e){
183
+ e.preventDefault();
184
+ var id = $(this).attr("rel");
185
+ var layer = self.map.layers[id];
186
+ self.layers.toggle(layer, $(this));
187
+ });
188
+
189
+ $('.delete-layer').live('click', function(e){
190
+ e.preventDefault();
191
+ e.stopPropagation();
192
+ var href = $(this).attr("href");
193
+ var id = $(this).attr("data-layer-id");
194
+ var layer = self.map.layers[id];
195
+ if (confirm("Are you sure?")) {
196
+ self.layers.remove(layer, href);
197
+ }
198
+ });
199
+
200
+ $('#new-layer form').submit(function(e){
201
+ e.preventDefault();
202
+ self.loader.start();
203
+ var $map_id = $(this).children("input[name='map_id']");
204
+ var $name = $(this).children("input[name='name']");
205
+
206
+ var data = {
207
+ map_id : $map_id.val(),
208
+ name : $name.val()
209
+ }
210
+
211
+ $.post("/api/layers/create", data,
212
+ function(layer) {
213
+ self.map.layers[layer.id] = new Layer(layer);
214
+ $('#new-layer').slideUp(fxspeed);
215
+ $name.val('');
216
+ self.layers.refresh();
217
+ }, 'json'
218
+ );
219
+
220
+ });
221
+
222
+ },
223
+
224
+
225
+ refresh : function(){
226
+ self.loader.start();
227
+
228
+ $("#layers > ul.nav").fadeOut(fxspeed, function(){
229
+ $(this).remove();
230
+ });
231
+
232
+ $("#layers > .panel").fadeOut(fxspeed, function(){
233
+ $(this).remove();
234
+ });
235
+
236
+ $.post("/api/layers/index", {},
237
+ function(response) {
238
+ $("#layers").append(response);
239
+ self.panels.build();
240
+ self.loader.stop();
241
+ }
242
+ );
243
+ },
244
+
245
+
246
+ toggle : function(layer, $element){
247
+
248
+ if ( layer.hidden ) {
249
+ layer.show();
250
+ $element.addClass('active');
251
+ }
252
+ else {
253
+ layer.hide();
254
+ $element.removeClass('active');
255
+ }
256
+
257
+ },
258
+
259
+ remove : function(layer, href){
260
+ self.loader.start();
261
+ layer.hide();
262
+ var url = "/api/layers/delete/" + layer.id;
263
+ $.post(url, {}, function(response){
264
+ self.loader.stop();
265
+ hash.set(href);
266
+ var $anchor = $("#layers > ul.nav > li > a[rel='" + layer.id + "']");
267
+ var $li = $anchor.parent('li');
268
+ $li.delay(fxspeed).fadeOut(fxspeed);
269
+ });
270
+ }
271
+
272
+ };
273
+
274
+ //
275
+
276
+ self.overlays = {
277
+
278
+ init : function(){
279
+ this.build();
280
+ this.observe();
281
+ },
282
+
283
+ build : function(){
284
+ for ( var index in self.map.layers ) {
285
+ var layer = self.map.layers[index];
286
+
287
+ console.log(layer);
288
+
289
+
290
+ var overlays = layer.overlays;
291
+
292
+ layer.overlays = {};
293
+
294
+ for ( var index in overlays ) {
295
+ var overlay = overlays[index];
296
+ switch ( overlay.type ) {
297
+ case 'polygon' :
298
+ layer.overlays[overlay.id] = new Polygon(overlay);
299
+ break;
300
+ case 'marker' :
301
+ layer.overlays[overlay.id] = new Marker(overlay);
302
+ break;
303
+ case 'line' :
304
+ layer.overlays[overlay.id] = new Line(overlay);
305
+ break;
306
+ }
307
+ }
308
+ }
309
+
310
+
311
+ },
312
+
313
+ observe : function(){
314
+
315
+ $(".draw-overlay").click(function(e){
316
+ e.preventDefault();
317
+
318
+ var layer_id = $(this).siblings("input[name='layer_id']").val();
319
+
320
+ overlay = map.layers[layer_id].addOverlay({
321
+ layer_id : layer_id,
322
+ points: [{ lat: 0, lng: 0 },{ lat: 0, lng: 0 }],
323
+ strokeColor: "#FF00FF",
324
+ strokeOpacity: 0,
325
+ strokeWeight: 0,
326
+ fillColor: "#F0F",
327
+ fillOpacity: 0.5
328
+ });
329
+
330
+ overlay.draw();
331
+ });
332
+
333
+ $(".clear-overlay").click(function(e){
334
+ e.preventDefault();
335
+ overlay.remove();
336
+ });
337
+
338
+ $(".save-overlay").click(function(e){
339
+ e.preventDefault();
340
+ var name = $(this).siblings("input[name='name']").val();
341
+ if ( name == "" ){
342
+ alert("Please provide a name for this overlay");
343
+ return false;
344
+ }
345
+ else {
346
+ overlay.name = name;
347
+ self.overlays.save(overlay);
348
+ }
349
+ });
350
+
351
+ },
352
+
353
+ save : function(overlay){
354
+ self.loader.start();
355
+
356
+ var data = {
357
+ name : overlay.name,
358
+ layer_id : overlay.data.layer_id
359
+ };
360
+
361
+ $.post("/api/overlays/create", data,
362
+ function(data) {
363
+ overlay.id = data.id;
364
+
365
+ var points = overlay.data.points;
366
+
367
+ for ( var index in points ) {
368
+ points[index].overlay_id = overlay.id;
369
+ }
370
+
371
+ $.post("/api/points/create", { points: points },
372
+ function(response) {
373
+ self.loader.stop();
374
+ }
375
+ );
376
+ }
377
+ );
378
+ },
379
+
380
+ remove : function(overlay){
381
+
382
+ }
383
+
384
+ };
385
+
386
+
387
+
388
+
389
+ //
390
+
391
+ self.loader = {
392
+
393
+ start : function(){
394
+ $loading.fadeIn(fxspeed);
395
+ },
396
+
397
+ stop : function(){
398
+ $loading.delay(500).fadeOut(fxspeed);
399
+ }
400
+
401
+ };
402
+
403
+ //
404
+
405
+
406
+
407
+
408
+ // self.map.canvas.setOptions({ draggableCursor: 'crosshair' });
409
+ //
410
+ // self.data.paths = [];
411
+ // self.data.points = [];
412
+ //
413
+ // google.maps.event.addListener(self.map.canvas, 'click', function(mdEvent) {
414
+ //
415
+ // google.maps.event.addListener(self.map.canvas, 'mousemove', function(event) {
416
+ // self.addPoint({ lat: event.latLng.lat(), lng: event.latLng.lng() });
417
+ // });
418
+ //
419
+ // google.maps.event.addListener(self.map.canvas, 'click', function(event) {
420
+ // google.maps.event.clearListeners(self.map.canvas);
421
+ // google.maps.event.clearListeners(self.polygon);
422
+ // });
423
+ //
424
+ // google.maps.event.addListener(self.polygon, 'mousemove', function(event) {
425
+ // self.addPoint({ lat: event.latLng.lat(), lng: event.latLng.lng() });
426
+ // });
427
+ //
428
+ // google.maps.event.addListener(self.polygon, 'click', function(event) {
429
+ // google.maps.event.clearListeners(map.canvas);
430
+ // google.maps.event.clearListeners(self.polygon);
431
+ // });
432
+ //
433
+ // });
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+ return self.initialize();
451
+ };