├── .gitignore ├── NetAssessApp.Rproj ├── R ├── agePyramid.R ├── cormatdb.R └── voronoi.R ├── README.md ├── data ├── netassess.sqlite ├── tracts.rda ├── us_bounds.rda └── usborder.rda ├── global.R ├── server.R ├── shinyapps └── ebailey78 │ ├── .gitignore │ └── NetAssessApp.dcf └── www ├── css ├── L.Control.Sidebar.css ├── bootstrap-theme.min.css ├── bootstrap.min.css ├── floaters.css ├── font-awesome.min.css ├── images │ ├── layers-2x.png │ ├── layers.png │ ├── marker-icon-2x.png │ ├── marker-icon.png │ ├── marker-shadow.png │ ├── spritesheet-2x.png │ └── spritesheet.png ├── leaflet.contextmenu.css ├── leaflet.css ├── leaflet.draw.css ├── netassess.css ├── select2-spinner.gif ├── select2.css ├── select2.png ├── select2x2.png └── tour.css ├── data └── sites.geojson ├── fonts ├── FontAwesome.otf ├── fontawesome-webfont.eot ├── fontawesome-webfont.svg ├── fontawesome-webfont.ttf └── fontawesome-webfont.woff ├── images ├── area_served.png ├── biasLegend.png ├── cont_us.png ├── corLegend.png ├── csv.png ├── csv_dark.png ├── glyphicons_094_vector_path_square.png ├── glyphicons_096_vector_path_polygon.png ├── glyphicons_197_remove.png ├── notrend.png ├── o3_65.png ├── o3_70.png ├── o3_75.png ├── pbe.png ├── pm25_35.png ├── probLegend.png └── rembias.png ├── index.html └── js ├── L.Control.Sidebar.js ├── easy-button.js ├── esri-leaflet.js ├── floaters.js ├── jquery-1.11.1.min.js ├── leaflet.contextmenu.js ├── leaflet.draw.js ├── leaflet.js ├── netassess-leaflet.js ├── netassess-shiny.js ├── netassess.js ├── select2.min.js └── tour.js /.gitignore: -------------------------------------------------------------------------------- 1 | .Rproj.user 2 | .Rhistory 3 | .RData 4 | www/images/temp 5 | -------------------------------------------------------------------------------- /NetAssessApp.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: ISO8859-1 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | -------------------------------------------------------------------------------- /R/agePyramid.R: -------------------------------------------------------------------------------- 1 | library(ggplot2) 2 | library(plyr) 3 | 4 | agePyramid <- function(df, id) { 5 | 6 | m <- df[df$id == id, grep("^m_", colnames(df))] 7 | f <- df[df$id == id, grep("^f_", colnames(df))] 8 | r <- gsub("_", "-", substr(colnames(m), 3, 10)) 9 | r[length(r)] <- "Over 84" 10 | 11 | m <- as.data.frame(cbind(r, t(m), deparse.level = 0), stringsAsFactors = FALSE) 12 | m$gender = "Male" 13 | 14 | f <- as.data.frame(cbind(r, t(f), deparse.level = 0), stringsAsFactors = FALSE) 15 | f$gender = "Female" 16 | 17 | d <- rbind(m, f) 18 | colnames(d) <- c("Age", "Count", "Gender") 19 | rownames(d) <- NULL 20 | d$Age <- factor(d$Age, levels = r) 21 | d$Count <- as.numeric(d$Count) 22 | d$Gender <- as.factor(d$Gender) 23 | 24 | m <- max(d$Count) 25 | s <- 10^floor(log10(m)) 26 | ss <- seq(-ceiling(m/s) * s, ceiling(m/s) * s, s) 27 | 28 | gg <- suppressWarnings({ggplot(d) + theme_bw(base_size = 16) + 29 | geom_bar(subset=plyr::.(Gender=="Male"), aes(x=Age, y=Count*(-1), fill = Gender), stat = "identity") + 30 | geom_bar(subset=plyr::.(Gender=="Female"), aes(x=Age, y=Count, fill = Gender), stat = "identity") + 31 | scale_y_continuous(breaks=ss, labels = abs(ss)) + ylab("Count") + 32 | coord_flip() + theme(legend.position="bottom")}) 33 | 34 | return(gg) 35 | 36 | } -------------------------------------------------------------------------------- /R/cormatdb.R: -------------------------------------------------------------------------------- 1 | cormatData <- function(data) { 2 | 3 | d <- data[order(data$Site_Key), ] 4 | site.info <- unique(d[, c("Site_Key", "State_Code", "County_Code", "Site_ID")]) 5 | site.info$id <- sprintf("%02i-%03i-%04i", site.info$State_Code, site.info$County_Code, site.info$Site_ID) 6 | sites <- unique(d$Site_Key) #create list of unique AQSIDs 7 | k <- 1 8 | tot <- length(sites) - 1 9 | 10 | results_table <- data.frame() #create empty data frame 11 | for(i in seq(tot)) { 12 | for(j in seq(i+1, length(sites))) { 13 | sub_data=subset(d,d$Site_Key==sites[i] | d$Site_Key==sites[j]) 14 | c1 <- c(sub_data$Latitude[sub_data$Site_Key == sites[i]][1], sub_data$Longitude[sub_data$Site_Key == sites[i]][1]) 15 | c2 <- c(sub_data$Latitude[sub_data$Site_Key == sites[j]][1], sub_data$Longitude[sub_data$Site_Key == sites[j]][1]) 16 | distance.km <- round(earth.dist(c1[2], c1[1], c2[2], c2[1]),0) 17 | results <- list() 18 | sub_data=dcast(sub_data,sub_data$Date~sub_data$Site_Key, fun.aggregate=mean, value.var = "Value") 19 | results$key1 <- sites[i] 20 | results$key2 <- sites[j] 21 | results$cor <- round(cor(sub_data[2],sub_data[3],use="pairwise.complete.obs",method="pearson"),3) 22 | results$com <- sum(complete.cases(sub_data)) 23 | results$dif <- signif(mean((abs(sub_data[,2]-sub_data[,3]))/((sub_data[,2]+sub_data[,3])/2), na.rm = TRUE), 3) 24 | results$dis <- round(earth.dist(c1[2], c1[1], c2[2], c2[1]), 0) 25 | results_table <- rbind(results_table, results) 26 | } 27 | } 28 | 29 | results_table$site1 = sapply(results_table$key1, function(site) {site.info$id[site.info$Site_Key == site]}) 30 | results_table$site2 = sapply(results_table$key2, function(site) {site.info$id[site.info$Site_Key == site]}) 31 | 32 | return(results_table) 33 | 34 | } 35 | 36 | cormatChart <- function(cormat_data, parameter, pmType) { 37 | 38 | chart_label <- switch(as.character(parameter), 39 | "44201" = "8-Hour Daily Max Ozone Correlation Matrix", 40 | "88101" = "", 41 | "88502" = "Daily PM2.5 Non-FEM (88502) Correlation Matrix") 42 | 43 | if(parameter == "88101") { 44 | chart_label <- switch(as.character(pmType), 45 | "fem" = "Daily PM2.5 FEM Only (88101) Correlation Matrix", 46 | "frm" = "Daily PM2.5 FRM Only (88101) Correlation Matrix", 47 | "both" = "Daily PM2.5 FRM/FEM (88101) Correlation Matrix") 48 | } 49 | 50 | makeMatrix <- function(df) { 51 | val <- colnames(df)[!colnames(df) %in% c("site1", "site2")] 52 | cast <- dcast(df, site2~site1, fun.aggregate=mean, value.var = val) 53 | rownames(cast) <- cast$site2 54 | cast <- cast[,2:ncol(cast)] 55 | as.matrix(cast) 56 | } 57 | 58 | # Create the matrices 59 | cor <- makeMatrix(cormat_data[, c("site1", "site2", "cor")]) 60 | dif <- makeMatrix(cormat_data[, c("site1", "site2", "dif")]) 61 | dis <- t(makeMatrix(cormat_data[, c("site1", "site2", "dis")])) 62 | dis[lower.tri(dis)] <- "" 63 | dis[is.nan(dis)] == "" 64 | 65 | # colfunc=colorRampPalette(c("white","yellow","orange","red","purple"))(11) 66 | colfunc <- c("#FFFFFF", "#FFFF99", "#FFFF32", "#FFEC00", "#FFC900", "#FFA500", 67 | "#FF6200", "#FF2000", "#EB0630", "#C51390", "#A020F0") 68 | #Create color palette that runs from 0 to 1.1 and apply it to average abs.diferrence results 69 | dif <- matrix(cut(dif,breaks=seq(from=0,to=1.1,by=.1),labels=colfunc,include.lowest=TRUE,right=TRUE), 70 | nrow = nrow(cor), dimnames = list(rownames(cor), colnames(cor))) 71 | 72 | #Set up screens for layout 73 | split.screen(rbind(c(0,.9,0,1),c(.9,1,0.1,.5),c(.9,1,.55,.8),c(0,1,0,.1))) 74 | 75 | #Plot correlation matrix: width of ellipse=pearson corr;color=average absolute difference; number=distance in KM 76 | screen(1) 77 | par(plt=c(0,0.8,0,1),new=TRUE) 78 | plotcorr(cor,type="lower",col=dif,diag=TRUE,cex.lab=2, cex.main = 2.5, mar=c(3,0,3,1),outline=TRUE, main=paste(chart_label,"- All Valid Pairs")) 79 | text(expand.grid(y=seq(nrow(dis)),x=seq(nrow(dis), 1)),labels=dis,font=2,cex=1.5,col="blue",srt=45) 80 | 81 | #Plot ellipse legend 82 | screen(2) 83 | par(plt=c(.9,1,0.1,.5),new=TRUE) 84 | y=0.1 85 | x=0.15 86 | # corrlist=(c(1.0,0.8,0.6,0.4,0.2,0)) 87 | corrlist=seq(0, 1, by = 0.2) 88 | 89 | subplot(plot(ellipse(1), axes = FALSE, type="l",xlab="",ylab="", col = "white"), x=x, y=y, size=c(0.1,0.1)) #Something is not working with the first ellipse - it is plotting in the wrong position 90 | 91 | for (i in corrlist) { 92 | subplot(plot(ellipse(i), axes = FALSE, type="l",xlab="",ylab=""), x=x, y=y, size=c(.2,.2)) #Something is not working with the first ellipse - it is plotting in the wrong position 93 | text(x=x+.15, y = y, labels = as.character(i), cex=1.5) 94 | y=y+.15 95 | } 96 | 97 | text(x=.05,y=.15,adj=0,labels="Pearson Correlation (r)",cex=1.5,srt=90) 98 | 99 | #Plot avg relative difference legend 100 | screen(3) 101 | par(plt=c(.9,1,.6,1),new=TRUE) 102 | gradient.rect(.1,0,.2,.9,nslices=10,col=colfunc,gradient="Y") 103 | text(x=.3, y=seq(from=0, to=.8 ,by=.16), labels = c(seq(from=0,to=1,by=.2)),cex=1.5) 104 | text(x =0.05, y=0,adj=0,labels="Average Relative Difference",srt=90,cex=1.5) 105 | 106 | #Paste note on distance values 107 | screen(4) 108 | par(plt=c(0,1,0,.1),new=TRUE) 109 | text(x=.2,y=.5,labels="values in ellipse = distance in kilometers",col="blue", cex=2.5,mar=c(0,0,0,0)) 110 | 111 | close.screen(all.screens=TRUE) 112 | 113 | } -------------------------------------------------------------------------------- /R/voronoi.R: -------------------------------------------------------------------------------- 1 | voronoi <- function(ids, lats, longs, boundary) { 2 | 3 | # Create a dataframe from the user's inputs 4 | df <- cbind(ids, lats, longs) 5 | # Create a SpatialPointsDataFrame 6 | points <- SpatialPointsDataFrame(list(longs, lats), data.frame(ids)) 7 | # Extract the coordinates from the SpatialPointsDataFrame 8 | crds <- coordinates(points) 9 | # If a boundary files was provided, use that to calculate a bounding box when 10 | # calculating the voronoi polygons vertices 11 | if(!missing(boundary)) { 12 | bb <- bbox(boundary) 13 | bb2 <- bbox(points) 14 | bb[1,1] <- min(bb[1,1], bb2[1,1]) 15 | bb[2,1] <- min(bb[2,1], bb2[2,1]) 16 | bb[1,2] <- max(bb[1,2], bb2[1,2]) 17 | bb[2,2] <- max(bb[2,2], bb2[2,2]) 18 | rw <- as.numeric(t(bb)) 19 | z <- deldir(crds[,1], crds[,2], rw=rw) 20 | } else { 21 | z <- deldir(crds[,1], crds[,2]) 22 | } 23 | # Create a list of the voronoi polygons, the create and empty vector 'poly' 24 | # of same length to store new polygons 25 | w <- tile.list(z) 26 | polys <- vector(mode="list", length=length(w)) 27 | # Loop through the list, w, creating polygon objects for each in the poly 28 | # vector 29 | for(i in seq(along = polys)) { 30 | pcrds <- cbind(w[[i]]$x, w[[i]]$y) 31 | pcrds <- rbind(pcrds, pcrds[1, ]) 32 | polys[[i]] <- Polygons(list(Polygon(pcrds)), ID=ids[i]) 33 | } 34 | # Create a SpatialPolygons Object to store the new polygons 35 | SP <- SpatialPolygons(polys) 36 | # If a boundary file was provided, perform a final clip to that boundary file 37 | # NOTE: This can be slow, and appears to be the biggest bottleneck in the 38 | # script. 39 | if(!missing(boundary)) SP <- gIntersection(SP, boundary, byid = TRUE) 40 | # Use the SP object to create a SpatialPolygonsDataFrame that has the polygons 41 | # plus additional information like the the monitor id. 42 | pid <- sapply(slot(SP, "polygons"), function(x) slot(x, "ID")) 43 | pid2 <- as.numeric(sapply(pid, function(x) unlist(strsplit(x, " "))[1])) 44 | points <- points[points$ids %in% pid2, ] 45 | crds <- coordinates(points) 46 | voronoi <- SpatialPolygonsDataFrame(SP, data=data.frame(pnt_x=crds[,1], 47 | pnt_y = crds[,2], id = pid2, row.names=pid, stringsAsFactors = FALSE)) 48 | # Return the SpatialPolygonsDataFrameObject 49 | return(voronoi) 50 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | NetAssessApp 2 | ============ 3 | 4 | This is a shiny app to modernize the nettools package created by Mike Rizzo. To run the app: 5 | 6 | ```shiny::runGitHub("LADCO/NetAssessApp", ref = "eric")``` 7 | 8 | or view the newest "stable" version on shinyapps.io: 9 | 10 | https://ladco.shinyapps.io/NetAssessApp/ 11 | -------------------------------------------------------------------------------- /data/netassess.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/data/netassess.sqlite -------------------------------------------------------------------------------- /data/tracts.rda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/data/tracts.rda -------------------------------------------------------------------------------- /data/us_bounds.rda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/data/us_bounds.rda -------------------------------------------------------------------------------- /data/usborder.rda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/data/usborder.rda -------------------------------------------------------------------------------- /global.R: -------------------------------------------------------------------------------- 1 | library(RSQLite) # database 2 | library(sp) # areaserved 3 | library(deldir) # areaserved 4 | library(rgeos) # areaserved 5 | library(rgdal) # areaserved 6 | library(reshape2) # cormat 7 | library(plotrix) # cormat 8 | library(ellipse) # cormat 9 | library(Hmisc) # cormat 10 | 11 | source("R/voronoi.R") 12 | source("R/agePyramid.R") 13 | source("R/cormatdb.R") 14 | 15 | load("data/tracts.rda") 16 | load("data/usborder.rda") 17 | 18 | td <- normalizePath("./www/images/temp") 19 | unlink(td, recursive = TRUE, force = TRUE) 20 | dir.create(td) 21 | 22 | options(stringsAsFactors = FALSE) 23 | 24 | db <- dbConnect(SQLite(), dbname = "data/netassess.sqlite") 25 | 26 | # Create the list object for populating the state dropdown on the area of 27 | # interest floater 28 | states <- unique(dbGetQuery(db, "SELECT CODE, NAME FROM states")) 29 | state.list <- states$CODE 30 | names(state.list) <- states$NAME 31 | 32 | # Create the list object for populating the CBSA dropdown on the area of 33 | # interest floater 34 | cbsa <- dbGetQuery(db, "SELECT CODE, NAME FROM cbsas") 35 | cbsa.list <- cbsa$CODE 36 | names(cbsa.list) <- cbsa$NAME 37 | 38 | # Create the list object for populating the CSA dropdown on the area of interest 39 | # floater 40 | csa <- dbGetQuery(db, "SELECT CODE, NAME FROM csas") 41 | csa.list <- csa$CODE 42 | names(csa.list) <- csa$NAME 43 | 44 | params <- dbGetQuery(db, "SELECT Parameter_Code, Parameter_Desc FROM params") 45 | params.list <- params$Parameter_Code 46 | names(params.list) <- paste(params$Parameter_Code, params$Parameter_Desc, sep = " - ") 47 | params.list <- c("Choose Parameter of Interest" = -1, params.list) 48 | 49 | createSites <- function() { 50 | 51 | jsonArray <- function(a, quote = FALSE) { 52 | if(quote) { 53 | op <- paste0('["', paste0(a, collapse = '", "'), '"]') 54 | } else { 55 | op <- paste0("[", paste0(a, collapse = ", "), "]") 56 | } 57 | return(op) 58 | } 59 | 60 | jsonObject <- function(o) { 61 | 62 | n <- paste0('"', names(o), '"') 63 | p <- sapply(o, function(x) { 64 | if((substr(x, 1, 1) == "[" & substr(x, nchar(x), nchar(x)) == "]") | 65 | (substr(x, 1, 1) == "{" & substr(x, nchar(x), nchar(x)) == "}")) { 66 | op <- x 67 | } else { 68 | op <- paste0('"', x, '"') 69 | } 70 | return(op) 71 | }) 72 | paste0("{", paste(n, p, sep = ": ", collapse = ", "), "}") 73 | 74 | } 75 | 76 | mons <- dbGetQuery(db, "SELECT * FROM sites") 77 | latlng <- paste(mons$Latitude, mons$Longitude, sep = "_") 78 | dup <- duplicated(latlng) 79 | s <- mons[!dup, ] 80 | d <- mons[dup, ] 81 | sites <- sapply(seq(nrow(s)), function(r) { 82 | 83 | alt <- d$Latitude == s$Latitude[r] & d$Longitude == s$Longitude[r] 84 | key <- s$Key[r] 85 | site_id <- sprintf("%02i-%03i-%04i", s$State_Code[r], s$County_Code[r], s$Site_ID[r]) 86 | if(sum(alt) > 0) { 87 | key <- c(key, d$Key[alt]) 88 | site_id <- c(site_id, sprintf("%02i-%03i-%04i", d$State_Code[alt], d$County_Code[alt], d$Site_ID[alt])) 89 | s$Count[r] <- s$Count[r] + sum(d$Count[alt]) 90 | s$Crit_Count[r] <- s$Crit_Count[r] + sum(d$Crit_Count[alt]) 91 | s$HAP_Count[r] <- s$HAP_Count[r] + sum(d$HAP_Count[alt]) 92 | s$Met_Count[r] <- s$Met_Count[r] + sum(d$Met_Count[alt]) 93 | } 94 | key <- jsonArray(key) 95 | site_id <- jsonArray(site_id, TRUE) 96 | 97 | properties <- c(key = key, site_id = site_id, as.list(s[r, c("State_Code", "County_Code", "Street_Address", "Count", "Crit_Count", "HAP_Count", "Met_Count")])) 98 | properties$Street_Address <- gsub("'", "'", properties$Street_Address, fixed = TRUE) 99 | properties$Street_Address <- gsub('"', """, properties$Street_Address, fixed = TRUE) 100 | properties <- jsonObject(properties) 101 | geometry <- jsonObject(list(type = "Point", coordinates = jsonArray(c(s$Longitude[r], s$Latitude[r])))) 102 | 103 | return(jsonObject(list(type = "Feature", geometry = geometry, properties = properties))) 104 | 105 | }) 106 | 107 | write(jsonObject(list(type = "FeatureCollection", features = jsonArray(sites))), file = "www/data/sites.geojson") 108 | 109 | } 110 | 111 | createSites() 112 | 113 | areaPolygons<- function(spPoly, proj4string = NULL) { 114 | if(class(spPoly)[[1]] != "SpatialPolygonsDataFrame" & class(spPoly)[[1]] != "SpatialPolygons") { 115 | stop("spPoly must be a SpatialPolygonsDataFrame or a SpatialPolygons object.") 116 | } 117 | require(sp) 118 | require(rgdal) 119 | if(!is.null(proj4string)) { 120 | if(class(proj4string)[[1]] != "CRS") { 121 | stop("The proj4string must be of class CRS") 122 | } 123 | spP <- spTransform(spPoly, CRS = proj4string) 124 | } 125 | else { 126 | spP <- spPoly 127 | } 128 | 129 | areas <- lapply(spP@polygons, function(x) { 130 | list(round(x@area * 0.000001, 0), unlist(strsplit(x@ID, " "))[[1]]) 131 | }) 132 | 133 | areas <- do.call(rbind, areas) 134 | colnames(areas) <- c("area", "id") 135 | 136 | return(areas) 137 | 138 | } 139 | 140 | # Create function to calculate distance in kilometers between two points on the earth 141 | earth.dist <- function (long1, lat1, long2, lat2){ 142 | rad = pi/180 143 | a1 = lat1 * rad 144 | a2 = long1 * rad 145 | b1 = lat2 * rad 146 | b2 = long2 * rad 147 | dlon = b2 - a2 148 | dlat = b1 - a1 149 | a = (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2 150 | c = 2 * atan2(sqrt(a), sqrt(1 - a)) 151 | R = 6378.145 152 | d = R * c 153 | return(d) 154 | } 155 | 156 | needParams <- function(param, strict = FALSE, message = FALSE, 157 | params = c("44201", "88101", "88502")) { 158 | op <- message 159 | if(!is.null(param)) { 160 | if(strict) { 161 | if(param %in% params) { 162 | op <- NULL 163 | } 164 | } else { 165 | if(param != "-1") { 166 | op <- NULL 167 | } 168 | } 169 | } 170 | return(op) 171 | } -------------------------------------------------------------------------------- /shinyapps/ebailey78/.gitignore: -------------------------------------------------------------------------------- 1 | NetAssessApp.dcf 2 | -------------------------------------------------------------------------------- /shinyapps/ebailey78/NetAssessApp.dcf: -------------------------------------------------------------------------------- 1 | name: NetAssessApp 2 | account: ebailey78 3 | bundleId: 142107 4 | url: http://ebailey78.shinyapps.io/NetAssessApp 5 | -------------------------------------------------------------------------------- /www/css/L.Control.Sidebar.css: -------------------------------------------------------------------------------- 1 | .leaflet-sidebar { 2 | position: absolute; 3 | height: 100%; 4 | -webkit-box-sizing: border-box; 5 | -moz-box-sizing: border-box; 6 | box-sizing: border-box; 7 | padding: 10px; 8 | z-index: 2000; } 9 | .leaflet-sidebar.left { 10 | left: -500px; 11 | transition: left 0.5s, width 0.5s; 12 | padding-right: 0; } 13 | .leaflet-sidebar.left.visible { 14 | left: 0; } 15 | .leaflet-sidebar.right { 16 | right: -500px; 17 | transition: right 0.5s, width 0.5s; 18 | padding-left: 0; } 19 | .leaflet-sidebar.right.visible { 20 | right: 0; } 21 | .leaflet-sidebar > .leaflet-control { 22 | height: 100%; 23 | width: 100%; 24 | overflow: auto; 25 | -webkit-overflow-scrolling: touch; 26 | -webkit-box-sizing: border-box; 27 | -moz-box-sizing: border-box; 28 | box-sizing: border-box; 29 | padding: 8px 24px; 30 | font-size: 1.1em; 31 | background: white; 32 | box-shadow: 0 1px 7px rgba(0, 0, 0, 0.65); 33 | -webkit-border-radius: 4px; 34 | border-radius: 4px; } 35 | .leaflet-touch .leaflet-sidebar > .leaflet-control { 36 | box-shadow: none; 37 | border: 2px solid rgba(0, 0, 0, 0.2); 38 | background-clip: padding-box; } 39 | @media (max-width: 767px) { 40 | .leaflet-sidebar { 41 | width: 100%; 42 | padding: 0; } 43 | .leaflet-sidebar.left.visible ~ .leaflet-left { 44 | left: 100%; } 45 | .leaflet-sidebar.right.visible ~ .leaflet-right { 46 | right: 100%; } 47 | .leaflet-sidebar.left { 48 | left: -100%; } 49 | .leaflet-sidebar.left.visible { 50 | left: 0; } 51 | .leaflet-sidebar.right { 52 | right: -100%; } 53 | .leaflet-sidebar.right.visible { 54 | right: 0; } 55 | .leaflet-sidebar > .leaflet-control { 56 | box-shadow: none; 57 | -webkit-border-radius: 0; 58 | border-radius: 0; } 59 | .leaflet-touch .leaflet-sidebar > .leaflet-control { 60 | border: 0; } } 61 | @media (min-width: 768px) and (max-width: 991px) { 62 | .leaflet-sidebar { 63 | width: 305px; } 64 | .leaflet-sidebar.left.visible ~ .leaflet-left { 65 | left: 305px; } 66 | .leaflet-sidebar.right.visible ~ .leaflet-right { 67 | right: 305px; } } 68 | @media (min-width: 992px) and (max-width: 1199px) { 69 | .leaflet-sidebar { 70 | width: 390px; } 71 | .leaflet-sidebar.left.visible ~ .leaflet-left { 72 | left: 390px; } 73 | .leaflet-sidebar.right.visible ~ .leaflet-right { 74 | right: 390px; } } 75 | @media (min-width: 1200px) { 76 | .leaflet-sidebar { 77 | width: 460px; } 78 | .leaflet-sidebar.left.visible ~ .leaflet-left { 79 | left: 460px; } 80 | .leaflet-sidebar.right.visible ~ .leaflet-right { 81 | right: 460px; } } 82 | .leaflet-sidebar .close { 83 | position: absolute; 84 | right: 20px; 85 | top: 20px; 86 | width: 31px; 87 | height: 31px; 88 | color: #333; 89 | font-size: 25pt; 90 | line-height: 1em; 91 | text-align: center; 92 | background: white; 93 | -webkit-border-radius: 16px; 94 | border-radius: 16px; 95 | cursor: pointer; 96 | z-index: 8; } 97 | 98 | .leaflet-left { 99 | transition: left 0.5s; } 100 | 101 | .leaflet-right { 102 | transition: right 0.5s; } 103 | -------------------------------------------------------------------------------- /www/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.2 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /*! 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=084d4b65561978c26725) 9 | * Config saved to config.json and https://gist.github.com/084d4b65561978c26725 10 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-o-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#e0e0e0));background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top, #337ab7 0, #265a88 100%);background-image:-o-linear-gradient(top, #337ab7 0, #265a88 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#265a88));background-image:linear-gradient(to bottom, #337ab7 0, #265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#245580}.btn-primary:hover,.btn-primary:focus{background-color:#265a88;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary:disabled,.btn-primary[disabled]{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#419641));background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#2aabd2));background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#eb9316));background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c12e2a));background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-o-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#f8f8f8));background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-o-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dbdbdb), to(#e2e2e2));background-image:linear-gradient(to bottom, #dbdbdb 0, #e2e2e2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-o-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #3c3c3c), to(#222));background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false)}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-o-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #080808), to(#0f0f0f));background-image:linear-gradient(to bottom, #080808 0, #0f0f0f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#c8e5bc));background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#b9def0));background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#f8efc0));background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-o-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#e7c3c3));background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ebebeb), to(#f5f5f5));background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-o-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#286090));background-image:linear-gradient(to bottom, #337ab7 0, #286090 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#449d44));background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#31b0d5));background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#ec971f));background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c9302c));background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top, #337ab7 0, #2b669a 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2b669a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2b669a));background-image:linear-gradient(to bottom, #337ab7 0, #2b669a 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#d0e9c6));background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#c4e3f3));background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#faf2cc));background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-o-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#ebcccc));background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e8e8e8), to(#f5f5f5));background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} -------------------------------------------------------------------------------- /www/css/bootstrap.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.2 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /*! 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=084d4b65561978c26725) 9 | * Config saved to config.json and https://gist.github.com/084d4b65561978c26725 10 | *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed} -------------------------------------------------------------------------------- /www/css/floaters.css: -------------------------------------------------------------------------------- 1 | .float-panel { 2 | position: absolute; 3 | overflow: hidden; 4 | background-color: #FFFFFF; 5 | border: solid 1px #CCC; 6 | border-radius: 5px; 7 | box-shadow: 3px 3px 3px #555; 8 | padding: 20px; 9 | box-sizing: border-box; 10 | } 11 | 12 | .float-panel.open { 13 | z-index: 100; 14 | height: auto; 15 | display: block; 16 | padding-bottom: 20px; 17 | } 18 | 19 | .float-panel.on-top { 20 | z-index: 100; 21 | } 22 | 23 | .float-panel:not(.on-top) { 24 | z-index: 50; 25 | } 26 | 27 | .float-panel.closed { 28 | z-index: 1 !important; 29 | height: auto; 30 | } 31 | 32 | .float-panel.minimized { 33 | display: block; 34 | z-index: 50; 35 | height: 25px !important; 36 | padding-bottom: 0px; 37 | overflow-y: hidden; 38 | resize: none !important; 39 | } 40 | 41 | /* Class for the grabbable top bar of the popups */ 42 | 43 | .float-handle { 44 | position: absolute; 45 | font-family: 'Roboto Condensed', sans-serif; 46 | font-weight: bold; 47 | border-top-left-radius: 5px; 48 | border-top-right-radius: 5px; 49 | padding-left: 10px; 50 | top: 0px; 51 | left: 0px; 52 | width: 100%; 53 | padding-left: 15px; 54 | padding-right: 15px; 55 | background-color: #2c3e50; 56 | height: 25px; 57 | line-height: 25px; 58 | color: white; 59 | } 60 | 61 | /* Classes for the close and minimize buttons on popups */ 62 | 63 | .float-panel .close { 64 | 65 | position: absolute; 66 | color: white !important; 67 | right: 3px; 68 | top: 4px; 69 | width: 19px; 70 | height: 19px; 71 | color: #333; 72 | font-size: 15px; 73 | line-height: 1em; 74 | text-align: center; 75 | cursor: pointer; 76 | z-index: 8; 77 | 78 | } 79 | 80 | .float-panel .minimize { 81 | 82 | position: absolute; 83 | color: white !important; 84 | top: 9px; 85 | width: 19px; 86 | height: 19px; 87 | color: #333; 88 | font-size: 15px; 89 | line-height: 1em; 90 | text-align: center; 91 | cursor: pointer; 92 | z-index: 8; 93 | 94 | } 95 | 96 | .float-panel a.close:hover, .float-panel a.minimize:hover { 97 | color: #476481; 98 | } 99 | 100 | .shiny-plot-output > img { 101 | width: 100%; 102 | height: 100%; 103 | } -------------------------------------------------------------------------------- /www/css/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} -------------------------------------------------------------------------------- /www/css/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/images/layers-2x.png -------------------------------------------------------------------------------- /www/css/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/images/layers.png -------------------------------------------------------------------------------- /www/css/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/images/marker-icon-2x.png -------------------------------------------------------------------------------- /www/css/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/images/marker-icon.png -------------------------------------------------------------------------------- /www/css/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/images/marker-shadow.png -------------------------------------------------------------------------------- /www/css/images/spritesheet-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/images/spritesheet-2x.png -------------------------------------------------------------------------------- /www/css/images/spritesheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/images/spritesheet.png -------------------------------------------------------------------------------- /www/css/leaflet.contextmenu.css: -------------------------------------------------------------------------------- 1 | .leaflet-contextmenu { 2 | display: none; 3 | box-shadow: 0 1px 7px rgba(0,0,0,0.4); 4 | -webkit-border-radius: 4px; 5 | border-radius: 4px; 6 | padding: 4px 0; 7 | background-color: #fff; 8 | cursor: default; 9 | -webkit-user-select: none; 10 | -moz-user-select: none; 11 | user-select: none; 12 | } 13 | 14 | .leaflet-contextmenu a.leaflet-contextmenu-item { 15 | display: block; 16 | color: #222; 17 | font-size: 12px; 18 | line-height: 20px; 19 | text-decoration: none; 20 | padding: 0 12px; 21 | border-top: 1px solid transparent; 22 | border-bottom: 1px solid transparent; 23 | cursor: default; 24 | outline: none; 25 | } 26 | 27 | .leaflet-contextmenu a.leaflet-contextmenu-item-disabled { 28 | opacity: 0.5; 29 | } 30 | 31 | .leaflet-contextmenu a.leaflet-contextmenu-item.over { 32 | background-color: #f4f4f4; 33 | border-top: 1px solid #f0f0f0; 34 | border-bottom: 1px solid #f0f0f0; 35 | } 36 | 37 | .leaflet-contextmenu a.leaflet-contextmenu-item-disabled.over { 38 | background-color: inherit; 39 | border-top: 1px solid transparent; 40 | border-bottom: 1px solid transparent; 41 | } 42 | 43 | .leaflet-contextmenu-icon { 44 | margin: 2px 8px 0 0; 45 | width: 16px; 46 | height: 16px; 47 | float: left; 48 | border: 0; 49 | } 50 | 51 | .leaflet-contextmenu-separator { 52 | border-bottom: 1px solid #ccc; 53 | margin: 5px 0; 54 | } -------------------------------------------------------------------------------- /www/css/leaflet.css: -------------------------------------------------------------------------------- 1 | /* required styles */ 2 | 3 | .leaflet-map-pane, 4 | .leaflet-tile, 5 | .leaflet-marker-icon, 6 | .leaflet-marker-shadow, 7 | .leaflet-tile-pane, 8 | .leaflet-tile-container, 9 | .leaflet-overlay-pane, 10 | .leaflet-shadow-pane, 11 | .leaflet-marker-pane, 12 | .leaflet-popup-pane, 13 | .leaflet-overlay-pane svg, 14 | .leaflet-zoom-box, 15 | .leaflet-image-layer, 16 | .leaflet-layer { 17 | position: absolute; 18 | left: 0; 19 | top: 0; 20 | } 21 | .leaflet-container { 22 | overflow: hidden; 23 | -ms-touch-action: none; 24 | } 25 | .leaflet-tile, 26 | .leaflet-marker-icon, 27 | .leaflet-marker-shadow { 28 | -webkit-user-select: none; 29 | -moz-user-select: none; 30 | user-select: none; 31 | -webkit-user-drag: none; 32 | } 33 | .leaflet-marker-icon, 34 | .leaflet-marker-shadow { 35 | display: block; 36 | } 37 | /* map is broken in FF if you have max-width: 100% on tiles */ 38 | .leaflet-container img { 39 | max-width: none !important; 40 | } 41 | /* stupid Android 2 doesn't understand "max-width: none" properly */ 42 | .leaflet-container img.leaflet-image-layer { 43 | max-width: 15000px !important; 44 | } 45 | .leaflet-tile { 46 | filter: inherit; 47 | visibility: hidden; 48 | } 49 | .leaflet-tile-loaded { 50 | visibility: inherit; 51 | } 52 | .leaflet-zoom-box { 53 | width: 0; 54 | height: 0; 55 | } 56 | /* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ 57 | .leaflet-overlay-pane svg { 58 | -moz-user-select: none; 59 | } 60 | 61 | .leaflet-tile-pane { z-index: 2; } 62 | .leaflet-objects-pane { z-index: 3; } 63 | .leaflet-overlay-pane { z-index: 4; } 64 | .leaflet-shadow-pane { z-index: 5; } 65 | .leaflet-marker-pane { z-index: 6; } 66 | .leaflet-popup-pane { z-index: 7; } 67 | 68 | .leaflet-vml-shape { 69 | width: 1px; 70 | height: 1px; 71 | } 72 | .lvml { 73 | behavior: url(#default#VML); 74 | display: inline-block; 75 | position: absolute; 76 | } 77 | 78 | 79 | /* control positioning */ 80 | 81 | .leaflet-control { 82 | position: relative; 83 | z-index: 7; 84 | pointer-events: auto; 85 | } 86 | .leaflet-top, 87 | .leaflet-bottom { 88 | position: absolute; 89 | z-index: 1000; 90 | pointer-events: none; 91 | } 92 | .leaflet-top { 93 | top: 0; 94 | } 95 | .leaflet-right { 96 | right: 0; 97 | } 98 | .leaflet-bottom { 99 | bottom: 0; 100 | } 101 | .leaflet-left { 102 | left: 0; 103 | } 104 | .leaflet-control { 105 | float: left; 106 | clear: both; 107 | } 108 | .leaflet-right .leaflet-control { 109 | float: right; 110 | } 111 | .leaflet-top .leaflet-control { 112 | margin-top: 10px; 113 | } 114 | .leaflet-bottom .leaflet-control { 115 | margin-bottom: 10px; 116 | } 117 | .leaflet-left .leaflet-control { 118 | margin-left: 10px; 119 | } 120 | .leaflet-right .leaflet-control { 121 | margin-right: 10px; 122 | } 123 | 124 | 125 | /* zoom and fade animations */ 126 | 127 | .leaflet-fade-anim .leaflet-tile, 128 | .leaflet-fade-anim .leaflet-popup { 129 | opacity: 0; 130 | -webkit-transition: opacity 0.2s linear; 131 | -moz-transition: opacity 0.2s linear; 132 | -o-transition: opacity 0.2s linear; 133 | transition: opacity 0.2s linear; 134 | } 135 | .leaflet-fade-anim .leaflet-tile-loaded, 136 | .leaflet-fade-anim .leaflet-map-pane .leaflet-popup { 137 | opacity: 1; 138 | } 139 | 140 | .leaflet-zoom-anim .leaflet-zoom-animated { 141 | -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); 142 | -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); 143 | -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1); 144 | transition: transform 0.25s cubic-bezier(0,0,0.25,1); 145 | } 146 | .leaflet-zoom-anim .leaflet-tile, 147 | .leaflet-pan-anim .leaflet-tile, 148 | .leaflet-touching .leaflet-zoom-animated { 149 | -webkit-transition: none; 150 | -moz-transition: none; 151 | -o-transition: none; 152 | transition: none; 153 | } 154 | 155 | .leaflet-zoom-anim .leaflet-zoom-hide { 156 | visibility: hidden; 157 | } 158 | 159 | 160 | /* cursors */ 161 | 162 | .leaflet-clickable { 163 | cursor: pointer; 164 | } 165 | .leaflet-container { 166 | cursor: -webkit-grab; 167 | cursor: -moz-grab; 168 | } 169 | .leaflet-popup-pane, 170 | .leaflet-control { 171 | cursor: auto; 172 | } 173 | .leaflet-dragging .leaflet-container, 174 | .leaflet-dragging .leaflet-clickable { 175 | cursor: move; 176 | cursor: -webkit-grabbing; 177 | cursor: -moz-grabbing; 178 | } 179 | 180 | 181 | /* visual tweaks */ 182 | 183 | .leaflet-container { 184 | background: #ddd; 185 | outline: 0; 186 | } 187 | .leaflet-container a { 188 | color: #0078A8; 189 | } 190 | .leaflet-container a.leaflet-active { 191 | outline: 2px solid orange; 192 | } 193 | .leaflet-zoom-box { 194 | border: 2px dotted #38f; 195 | background: rgba(255,255,255,0.5); 196 | } 197 | 198 | 199 | /* general typography */ 200 | .leaflet-container { 201 | font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; 202 | } 203 | 204 | 205 | /* general toolbar styles */ 206 | 207 | .leaflet-bar { 208 | box-shadow: 0 1px 5px rgba(0,0,0,0.65); 209 | border-radius: 4px; 210 | } 211 | .leaflet-bar a, 212 | .leaflet-bar a:hover { 213 | background-color: #fff; 214 | border-bottom: 1px solid #ccc; 215 | width: 26px; 216 | height: 26px; 217 | line-height: 26px; 218 | display: block; 219 | text-align: center; 220 | text-decoration: none; 221 | color: black; 222 | } 223 | .leaflet-bar a, 224 | .leaflet-control-layers-toggle { 225 | background-position: 50% 50%; 226 | background-repeat: no-repeat; 227 | display: block; 228 | } 229 | .leaflet-bar a:hover { 230 | background-color: #f4f4f4; 231 | } 232 | .leaflet-bar a:first-child { 233 | border-top-left-radius: 4px; 234 | border-top-right-radius: 4px; 235 | } 236 | .leaflet-bar a:last-child { 237 | border-bottom-left-radius: 4px; 238 | border-bottom-right-radius: 4px; 239 | border-bottom: none; 240 | } 241 | .leaflet-bar a.leaflet-disabled { 242 | cursor: default; 243 | background-color: #f4f4f4; 244 | color: #bbb; 245 | } 246 | 247 | .leaflet-touch .leaflet-bar a { 248 | width: 30px; 249 | height: 30px; 250 | line-height: 30px; 251 | } 252 | 253 | 254 | /* zoom control */ 255 | 256 | .leaflet-control-zoom-in, 257 | .leaflet-control-zoom-out { 258 | font: bold 18px 'Lucida Console', Monaco, monospace; 259 | text-indent: 1px; 260 | } 261 | .leaflet-control-zoom-out { 262 | font-size: 20px; 263 | } 264 | 265 | .leaflet-touch .leaflet-control-zoom-in { 266 | font-size: 22px; 267 | } 268 | .leaflet-touch .leaflet-control-zoom-out { 269 | font-size: 24px; 270 | } 271 | 272 | 273 | /* layers control */ 274 | 275 | .leaflet-control-layers { 276 | box-shadow: 0 1px 5px rgba(0,0,0,0.4); 277 | background: #fff; 278 | border-radius: 5px; 279 | } 280 | .leaflet-control-layers-toggle { 281 | background-image: url(images/layers.png); 282 | width: 36px; 283 | height: 36px; 284 | } 285 | .leaflet-retina .leaflet-control-layers-toggle { 286 | background-image: url(images/layers-2x.png); 287 | background-size: 26px 26px; 288 | } 289 | .leaflet-touch .leaflet-control-layers-toggle { 290 | width: 44px; 291 | height: 44px; 292 | } 293 | .leaflet-control-layers .leaflet-control-layers-list, 294 | .leaflet-control-layers-expanded .leaflet-control-layers-toggle { 295 | display: none; 296 | } 297 | .leaflet-control-layers-expanded .leaflet-control-layers-list { 298 | display: block; 299 | position: relative; 300 | } 301 | .leaflet-control-layers-expanded { 302 | padding: 6px 10px 6px 6px; 303 | color: #333; 304 | background: #fff; 305 | } 306 | .leaflet-control-layers-selector { 307 | margin-top: 2px; 308 | position: relative; 309 | top: 1px; 310 | } 311 | .leaflet-control-layers label { 312 | display: block; 313 | } 314 | .leaflet-control-layers-separator { 315 | height: 0; 316 | border-top: 1px solid #ddd; 317 | margin: 5px -10px 5px -6px; 318 | } 319 | 320 | 321 | /* attribution and scale controls */ 322 | 323 | .leaflet-container .leaflet-control-attribution { 324 | background: #fff; 325 | background: rgba(255, 255, 255, 0.7); 326 | margin: 0; 327 | } 328 | .leaflet-control-attribution, 329 | .leaflet-control-scale-line { 330 | padding: 0 5px; 331 | color: #333; 332 | } 333 | .leaflet-control-attribution a { 334 | text-decoration: none; 335 | } 336 | .leaflet-control-attribution a:hover { 337 | text-decoration: underline; 338 | } 339 | .leaflet-container .leaflet-control-attribution, 340 | .leaflet-container .leaflet-control-scale { 341 | font-size: 11px; 342 | } 343 | .leaflet-left .leaflet-control-scale { 344 | margin-left: 5px; 345 | } 346 | .leaflet-bottom .leaflet-control-scale { 347 | margin-bottom: 5px; 348 | } 349 | .leaflet-control-scale-line { 350 | border: 2px solid #777; 351 | border-top: none; 352 | line-height: 1.1; 353 | padding: 2px 5px 1px; 354 | font-size: 11px; 355 | white-space: nowrap; 356 | overflow: hidden; 357 | -moz-box-sizing: content-box; 358 | box-sizing: content-box; 359 | 360 | background: #fff; 361 | background: rgba(255, 255, 255, 0.5); 362 | } 363 | .leaflet-control-scale-line:not(:first-child) { 364 | border-top: 2px solid #777; 365 | border-bottom: none; 366 | margin-top: -2px; 367 | } 368 | .leaflet-control-scale-line:not(:first-child):not(:last-child) { 369 | border-bottom: 2px solid #777; 370 | } 371 | 372 | .leaflet-touch .leaflet-control-attribution, 373 | .leaflet-touch .leaflet-control-layers, 374 | .leaflet-touch .leaflet-bar { 375 | box-shadow: none; 376 | } 377 | .leaflet-touch .leaflet-control-layers, 378 | .leaflet-touch .leaflet-bar { 379 | border: 2px solid rgba(0,0,0,0.2); 380 | background-clip: padding-box; 381 | } 382 | 383 | 384 | /* popup */ 385 | 386 | .leaflet-popup { 387 | position: absolute; 388 | text-align: center; 389 | } 390 | .leaflet-popup-content-wrapper { 391 | padding: 1px; 392 | text-align: left; 393 | border-radius: 12px; 394 | } 395 | .leaflet-popup-content { 396 | margin: 13px 19px; 397 | line-height: 1.4; 398 | } 399 | .leaflet-popup-content p { 400 | margin: 18px 0; 401 | } 402 | .leaflet-popup-tip-container { 403 | margin: 0 auto; 404 | width: 40px; 405 | height: 20px; 406 | position: relative; 407 | overflow: hidden; 408 | } 409 | .leaflet-popup-tip { 410 | width: 17px; 411 | height: 17px; 412 | padding: 1px; 413 | 414 | margin: -10px auto 0; 415 | 416 | -webkit-transform: rotate(45deg); 417 | -moz-transform: rotate(45deg); 418 | -ms-transform: rotate(45deg); 419 | -o-transform: rotate(45deg); 420 | transform: rotate(45deg); 421 | } 422 | .leaflet-popup-content-wrapper, 423 | .leaflet-popup-tip { 424 | background: white; 425 | 426 | box-shadow: 0 3px 14px rgba(0,0,0,0.4); 427 | } 428 | .leaflet-container a.leaflet-popup-close-button { 429 | position: absolute; 430 | top: 0; 431 | right: 0; 432 | padding: 4px 4px 0 0; 433 | text-align: center; 434 | width: 18px; 435 | height: 14px; 436 | font: 16px/14px Tahoma, Verdana, sans-serif; 437 | color: #c3c3c3; 438 | text-decoration: none; 439 | font-weight: bold; 440 | background: transparent; 441 | } 442 | .leaflet-container a.leaflet-popup-close-button:hover { 443 | color: #999; 444 | } 445 | .leaflet-popup-scrolled { 446 | overflow: auto; 447 | border-bottom: 1px solid #ddd; 448 | border-top: 1px solid #ddd; 449 | } 450 | 451 | .leaflet-oldie .leaflet-popup-content-wrapper { 452 | zoom: 1; 453 | } 454 | .leaflet-oldie .leaflet-popup-tip { 455 | width: 24px; 456 | margin: 0 auto; 457 | 458 | -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; 459 | filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); 460 | } 461 | .leaflet-oldie .leaflet-popup-tip-container { 462 | margin-top: -1px; 463 | } 464 | 465 | .leaflet-oldie .leaflet-control-zoom, 466 | .leaflet-oldie .leaflet-control-layers, 467 | .leaflet-oldie .leaflet-popup-content-wrapper, 468 | .leaflet-oldie .leaflet-popup-tip { 469 | border: 1px solid #999; 470 | } 471 | 472 | 473 | /* div icon */ 474 | 475 | .leaflet-div-icon { 476 | background: #fff; 477 | border: 1px solid #666; 478 | } 479 | -------------------------------------------------------------------------------- /www/css/leaflet.draw.css: -------------------------------------------------------------------------------- 1 | /* ================================================================== */ 2 | /* Toolbars 3 | /* ================================================================== */ 4 | 5 | .leaflet-draw-section { 6 | position: relative; 7 | } 8 | 9 | .leaflet-draw-toolbar { 10 | margin-top: 12px; 11 | } 12 | 13 | .leaflet-draw-toolbar-top { 14 | margin-top: 0; 15 | } 16 | 17 | .leaflet-draw-toolbar-notop a:first-child { 18 | border-top-right-radius: 0; 19 | } 20 | 21 | .leaflet-draw-toolbar-nobottom a:last-child { 22 | border-bottom-right-radius: 0; 23 | } 24 | 25 | .leaflet-draw-toolbar a { 26 | background-image: url('images/spritesheet.png'); 27 | background-repeat: no-repeat; 28 | } 29 | 30 | .leaflet-retina .leaflet-draw-toolbar a { 31 | background-image: url('images/spritesheet-2x.png'); 32 | background-size: 270px 30px; 33 | } 34 | 35 | .leaflet-draw a { 36 | display: block; 37 | text-align: center; 38 | text-decoration: none; 39 | } 40 | 41 | /* ================================================================== */ 42 | /* Toolbar actions menu 43 | /* ================================================================== */ 44 | 45 | .leaflet-draw-actions { 46 | display: none; 47 | list-style: none; 48 | margin: 0; 49 | padding: 0; 50 | position: absolute; 51 | left: 26px; /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */ 52 | top: 0; 53 | white-space: nowrap; 54 | } 55 | 56 | .leaflet-touch .leaflet-draw-actions { 57 | left: 32px; 58 | } 59 | 60 | .leaflet-right .leaflet-draw-actions { 61 | right:26px; 62 | left:auto; 63 | } 64 | 65 | .leaflet-touch .leaflet-right .leaflet-draw-actions { 66 | right:32px; 67 | left:auto; 68 | } 69 | 70 | .leaflet-draw-actions li { 71 | display: inline-block; 72 | } 73 | 74 | .leaflet-draw-actions li:first-child a { 75 | border-left: none; 76 | } 77 | 78 | .leaflet-draw-actions li:last-child a { 79 | -webkit-border-radius: 0 4px 4px 0; 80 | border-radius: 0 4px 4px 0; 81 | } 82 | 83 | .leaflet-right .leaflet-draw-actions li:last-child a { 84 | -webkit-border-radius: 0; 85 | border-radius: 0; 86 | } 87 | 88 | .leaflet-right .leaflet-draw-actions li:first-child a { 89 | -webkit-border-radius: 4px 0 0 4px; 90 | border-radius: 4px 0 0 4px; 91 | } 92 | 93 | .leaflet-draw-actions a { 94 | background-color: #919187; 95 | border-left: 1px solid #AAA; 96 | color: #FFF; 97 | font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif; 98 | line-height: 28px; 99 | text-decoration: none; 100 | padding-left: 10px; 101 | padding-right: 10px; 102 | height: 28px; 103 | } 104 | 105 | .leaflet-touch .leaflet-draw-actions a { 106 | font-size: 12px; 107 | line-height: 30px; 108 | height: 30px; 109 | } 110 | 111 | .leaflet-draw-actions-bottom { 112 | margin-top: 0; 113 | } 114 | 115 | .leaflet-draw-actions-top { 116 | margin-top: 1px; 117 | } 118 | 119 | .leaflet-draw-actions-top a, 120 | .leaflet-draw-actions-bottom a { 121 | height: 27px; 122 | line-height: 27px; 123 | } 124 | 125 | .leaflet-draw-actions a:hover { 126 | background-color: #A0A098; 127 | } 128 | 129 | .leaflet-draw-actions-top.leaflet-draw-actions-bottom a { 130 | height: 26px; 131 | line-height: 26px; 132 | } 133 | 134 | /* ================================================================== */ 135 | /* Draw toolbar 136 | /* ================================================================== */ 137 | 138 | .leaflet-draw-toolbar .leaflet-draw-draw-polyline { 139 | background-position: -2px -2px; 140 | } 141 | 142 | .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polyline { 143 | background-position: 0 -1px; 144 | } 145 | 146 | .leaflet-draw-toolbar .leaflet-draw-draw-polygon { 147 | background-position: -31px -2px; 148 | } 149 | 150 | .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-polygon { 151 | background-position: -29px -1px; 152 | } 153 | 154 | .leaflet-draw-toolbar .leaflet-draw-draw-rectangle { 155 | background-position: -62px -2px; 156 | } 157 | 158 | .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-rectangle { 159 | background-position: -60px -1px; 160 | } 161 | 162 | .leaflet-draw-toolbar .leaflet-draw-draw-circle { 163 | background-position: -92px -2px; 164 | } 165 | 166 | .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-circle { 167 | background-position: -90px -1px; 168 | } 169 | 170 | .leaflet-draw-toolbar .leaflet-draw-draw-marker { 171 | background-position: -122px -2px; 172 | } 173 | 174 | .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-draw-marker { 175 | background-position: -120px -1px; 176 | } 177 | 178 | /* ================================================================== */ 179 | /* Edit toolbar 180 | /* ================================================================== */ 181 | 182 | .leaflet-draw-toolbar .leaflet-draw-edit-edit { 183 | background-position: -152px -2px; 184 | } 185 | 186 | .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit { 187 | background-position: -150px -1px; 188 | } 189 | 190 | .leaflet-draw-toolbar .leaflet-draw-edit-remove { 191 | background-position: -182px -2px; 192 | } 193 | 194 | .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove { 195 | background-position: -180px -1px; 196 | } 197 | 198 | .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled { 199 | background-position: -212px -2px; 200 | } 201 | 202 | .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled { 203 | background-position: -210px -1px; 204 | } 205 | 206 | .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled { 207 | background-position: -242px -2px; 208 | } 209 | 210 | .leaflet-touch .leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled { 211 | background-position: -240px -2px; 212 | } 213 | 214 | /* ================================================================== */ 215 | /* Drawing styles 216 | /* ================================================================== */ 217 | 218 | .leaflet-mouse-marker { 219 | background-color: #fff; 220 | cursor: crosshair; 221 | } 222 | 223 | .leaflet-draw-tooltip { 224 | background: rgb(54, 54, 54); 225 | background: rgba(0, 0, 0, 0.5); 226 | border: 1px solid transparent; 227 | -webkit-border-radius: 4px; 228 | border-radius: 4px; 229 | color: #fff; 230 | font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif; 231 | margin-left: 20px; 232 | margin-top: -21px; 233 | padding: 4px 8px; 234 | position: absolute; 235 | visibility: hidden; 236 | white-space: nowrap; 237 | z-index: 6; 238 | } 239 | 240 | .leaflet-draw-tooltip:before { 241 | border-right: 6px solid black; 242 | border-right-color: rgba(0, 0, 0, 0.5); 243 | border-top: 6px solid transparent; 244 | border-bottom: 6px solid transparent; 245 | content: ""; 246 | position: absolute; 247 | top: 7px; 248 | left: -7px; 249 | } 250 | 251 | .leaflet-error-draw-tooltip { 252 | background-color: #F2DEDE; 253 | border: 1px solid #E6B6BD; 254 | color: #B94A48; 255 | } 256 | 257 | .leaflet-error-draw-tooltip:before { 258 | border-right-color: #E6B6BD; 259 | } 260 | 261 | .leaflet-draw-tooltip-single { 262 | margin-top: -12px 263 | } 264 | 265 | .leaflet-draw-tooltip-subtext { 266 | color: #f8d5e4; 267 | } 268 | 269 | .leaflet-draw-guide-dash { 270 | font-size: 1%; 271 | opacity: 0.6; 272 | position: absolute; 273 | width: 5px; 274 | height: 5px; 275 | } 276 | 277 | /* ================================================================== */ 278 | /* Edit styles 279 | /* ================================================================== */ 280 | 281 | .leaflet-edit-marker-selected { 282 | background: rgba(254, 87, 161, 0.1); 283 | border: 4px dashed rgba(254, 87, 161, 0.6); 284 | -webkit-border-radius: 4px; 285 | border-radius: 4px; 286 | } 287 | 288 | .leaflet-edit-move { 289 | cursor: move; 290 | } 291 | 292 | .leaflet-edit-resize { 293 | cursor: pointer; 294 | } 295 | 296 | /* ================================================================== */ 297 | /* Old IE styles 298 | /* ================================================================== */ 299 | 300 | .leaflet-oldie .leaflet-draw-toolbar { 301 | border: 1px solid #999; 302 | } -------------------------------------------------------------------------------- /www/css/netassess.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Open Sans', sans-serif; 3 | padding: 0px; 4 | margin: 0px; 5 | overflow: hidden; 6 | background-color: rgba(208, 207, 212, 1); 7 | } 8 | 9 | #map { 10 | position: absolute; 11 | left: 0px; 12 | top: 40px; 13 | z-index: 5; 14 | } 15 | 16 | #menubar { 17 | font-family: 'Roboto Condensed', sans-serif; 18 | position: absolute; 19 | top: 0px; 20 | left: 0px; 21 | width: 100%; 22 | line-height: 40px; 23 | color: #FFFFFF; 24 | background-color: #2C3E50; 25 | /* box-shadow: 0px 3px 2px -1px rgba(44,62,80,0.5);*/ 26 | z-index: 6; 27 | } 28 | 29 | #appTitle { 30 | display: inline-table; 31 | line-height: 16px; 32 | height: 40px; 33 | border-collapse: collapse; 34 | color: #FFFFFF; 35 | padding-left: 10px; 36 | } 37 | 38 | #appTitle .title { 39 | font-size: 20px; 40 | font-weight: bold; 41 | padding-left: 10px; 42 | vertical-align: bottom; 43 | } 44 | 45 | #appTitle .version { 46 | font-size: 13px; 47 | font-weight: normal; 48 | text-align: left; 49 | } 50 | 51 | #appTitle .subtitle { 52 | line-height: 11px; 53 | font-size: 11px; 54 | padding-left: 10px; 55 | vertical-align: top; 56 | } 57 | 58 | #menuControls { 59 | display: inline-block; 60 | float: right; 61 | padding-right: 10px; 62 | height: 40px; 63 | vertical-align: text-top; 64 | } 65 | 66 | .menu-bar-item { 67 | display: inline-block; 68 | height: 100%; 69 | min-width: 40px; 70 | padding: 0px; 71 | margin: 0px; 72 | box-sizing: border-box; 73 | -moz-box-sizing: border-box; 74 | background-color: #476481; 75 | background: none; 76 | overflow: hidden; 77 | } 78 | 79 | .menu-bar-item.menu-bar-button { 80 | cursor: pointer; 81 | line-height: 40px; 82 | padding-top: 8px; 83 | text-align: center; 84 | font-size: 24px; 85 | color: #FFF; 86 | } 87 | 88 | .menu-bar-item.menu-bar-button:hover { 89 | background-color: #476481; 90 | } 91 | 92 | .menu-bar-item > div { 93 | padding-top: 6px; 94 | } 95 | 96 | .hidden-marker { 97 | visibility: hidden; 98 | } 99 | 100 | .header { 101 | color: #2c3e50; 102 | font-weight: 700; 103 | font-size: 1.1em; 104 | line-height: 1.1em; 105 | margin-bottom: 0px; 106 | padding-bottom: 2px; 107 | border-bottom: solid 1px rgba(44,62,80,0.75); 108 | box-shadow: 0px 1px 1px -1px rgba(44,62,80,0.5); 109 | } 110 | 111 | /* Special Classes for Area Served */ 112 | 113 | /* Free Form area served buttons */ 114 | .draw-buttons { 115 | width: 100%; 116 | margin: auto; 117 | text-align: center; 118 | padding-bottom: 20px; 119 | } 120 | 121 | .draw-button { 122 | width: 50px; 123 | height: 50px; 124 | text-align: center; 125 | vertical-align: middle; 126 | padding: 5px; 127 | margin: 0px; 128 | } 129 | 130 | /* Predefined Area Selection Classes */ 131 | .area-select { 132 | width: 100%; 133 | margin: auto; 134 | text-align: center; 135 | } 136 | 137 | .area-select select { 138 | margin-top: 5px; 139 | width: 100%; 140 | } 141 | 142 | /* Popup Classes */ 143 | 144 | .popup-table { 145 | width: 200px; 146 | margin-top: 10px; 147 | font-size: 12px; 148 | border-collapse: collapse; 149 | } 150 | 151 | .popup-table td { 152 | border-bottom: solid 1px lightgrey; 153 | 154 | } 155 | 156 | .popup-table tr td:first-child { 157 | width: 30%; 158 | text-align: right; 159 | font-weight: bold; 160 | vertical-align: top; 161 | padding-right: 5px; 162 | border-right: solid 1px lightgrey; 163 | } 164 | 165 | .popup-table.bias tr td:first-child { 166 | width: 60%; 167 | } 168 | 169 | .popup-table.bias tr td:last-child { 170 | width: 40%; 171 | } 172 | 173 | .popup-table tr td:last-child { 174 | width: 70%; 175 | padding-left: 5px; 176 | text-align: left; 177 | vertical-align: top; 178 | } 179 | 180 | .popup-trend { 181 | margin-top: 5px; 182 | } 183 | 184 | .popup-trend > img { 185 | width: 200px; 186 | height: 100px; 187 | cursor: pointer; 188 | background: grey; 189 | } 190 | 191 | div.loading { 192 | z-index: 300; 193 | position: absolute; 194 | left: 48%; 195 | top: 48%; 196 | background-color: #EEE; 197 | border: solid 1px #CCC; 198 | border-radius: 3px; 199 | box-shadow: 3px 3px 3px #555; 200 | padding: 10px; 201 | font-size: 50px; 202 | font-weight: bold; 203 | color: #555; 204 | } 205 | 206 | div.loading.hidden { 207 | display: none; 208 | } 209 | 210 | #alert { 211 | 212 | position: absolute; 213 | top: 50px; 214 | left: 25%; 215 | z-index: 1; 216 | padding: 15px; 217 | background-color: rgba(217,237,247, 0.6); 218 | border: 1px solid #31708F; 219 | border-radius: 4px; 220 | width: 50%; 221 | margin: auto; 222 | color: #31708F; 223 | 224 | } 225 | 226 | #alert-heading { 227 | font-size: 1.2em; 228 | padding-bottom: 5px; 229 | padding-top: 0px; 230 | font-weight: bold; 231 | } 232 | 233 | #alert-close { 234 | position: absolute; 235 | top: 5px; 236 | right: 10px; 237 | cursor: pointer; 238 | } 239 | 240 | #alert:hover { 241 | background-color: rgb(217,237,247); 242 | } 243 | 244 | #alert.alert-open { 245 | z-index: 250 !important; 246 | } 247 | 248 | .area-info-text { 249 | padding-top: 10px; 250 | padding-left: 5px; 251 | } 252 | 253 | /* This fixes the problem of the image overlays disappearing when you zoom in 254 | Found here: https://github.com/Leaflet/Leaflet/issues/2282 */ 255 | .leaflet-container img.leaflet-image-layer { 256 | max-width: none !important; 257 | } 258 | 259 | /* Fixes misaligned icons in easy buttons */ 260 | .leaflet-bar a > i.fa { 261 | line-height: 26px !important; 262 | } 263 | 264 | .shiny-download-link { 265 | text-decoration: none; 266 | color: #444; 267 | text-align: left; 268 | } 269 | 270 | .shiny-download-link > i { 271 | font-size: 20px; 272 | } 273 | 274 | .shiny-download-link:hover { 275 | text-decoration: underline; 276 | color: #111; 277 | } 278 | 279 | #downloadFloater table { 280 | border-collapse: collapse; 281 | width: 90%; 282 | } 283 | #downloadFloater td:first-child { 284 | padding: 5px; 285 | width: 30px; 286 | vertical-align: bottom; 287 | text-align: left; 288 | } 289 | #downloadFloater td:last-child { 290 | 291 | } 292 | #downloadFloater td { 293 | border-bottom: solid black 1px; 294 | } 295 | 296 | tr.disabled { 297 | background-color: #EEE; 298 | color: #999; 299 | } 300 | 301 | tr.disabled a { 302 | pointer-events: none; 303 | color: #999; 304 | } 305 | 306 | .sidebar > h1 { 307 | color: #2C3E50; 308 | padding-bottom: 0px; 309 | border-bottom: solid 2px rgba(44,62,80,0.75); 310 | box-shadow: 0px 1px 1px -1px rgba(44,62,80,0.5); 311 | 312 | } 313 | 314 | .sidebar > h1 > i { 315 | font-size: 1.5em; 316 | } 317 | 318 | #menubarHelp tr { 319 | border-bottom: solid 2px rgba(44,62,80,0.75); 320 | box-shadow: 0px 1px 1px -1px rgba(44,62,80,0.5); 321 | } 322 | 323 | #menubarHelp td:last-child { 324 | font-size: 12px; 325 | padding-left: 10px; 326 | padding-top: 10px; 327 | } 328 | 329 | #menubarHelp td:last-child > div { 330 | text-align: justify; 331 | padding-top: 5px; 332 | } 333 | 334 | #menubarHelp td:first-child > i, #menubarHelp td:first-child > div { 335 | background-color: #2C3E50; 336 | width: 40px; 337 | height: 40px; 338 | line-height: 40px; 339 | font-size: 24px; 340 | color: white; 341 | text-align: center; 342 | } 343 | 344 | #menubarHelp td:first-child img { 345 | position: relative; 346 | top: 8px; 347 | } 348 | -------------------------------------------------------------------------------- /www/css/select2-spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/select2-spinner.gif -------------------------------------------------------------------------------- /www/css/select2.css: -------------------------------------------------------------------------------- 1 | /* 2 | Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014 3 | */ 4 | .select2-container { 5 | margin: 0; 6 | position: relative; 7 | display: inline-block; 8 | /* inline-block for ie7 */ 9 | zoom: 1; 10 | *display: inline; 11 | vertical-align: middle; 12 | } 13 | 14 | .select2-container, 15 | .select2-drop, 16 | .select2-search, 17 | .select2-search input { 18 | /* 19 | Force border-box so that % widths fit the parent 20 | container without overlap because of margin/padding. 21 | More Info : http://www.quirksmode.org/css/box.html 22 | */ 23 | -webkit-box-sizing: border-box; /* webkit */ 24 | -moz-box-sizing: border-box; /* firefox */ 25 | box-sizing: border-box; /* css3 */ 26 | } 27 | 28 | .select2-container .select2-choice { 29 | display: block; 30 | height: 26px; 31 | padding: 0 0 0 8px; 32 | overflow: hidden; 33 | position: relative; 34 | 35 | border: 1px solid #aaa; 36 | white-space: nowrap; 37 | line-height: 26px; 38 | color: #444; 39 | text-decoration: none; 40 | 41 | border-radius: 4px; 42 | 43 | background-clip: padding-box; 44 | 45 | -webkit-touch-callout: none; 46 | -webkit-user-select: none; 47 | -moz-user-select: none; 48 | -ms-user-select: none; 49 | user-select: none; 50 | 51 | background-color: #fff; 52 | background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff)); 53 | background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%); 54 | background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%); 55 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0); 56 | background-image: linear-gradient(to top, #eee 0%, #fff 50%); 57 | } 58 | 59 | html[dir="rtl"] .select2-container .select2-choice { 60 | padding: 0 8px 0 0; 61 | } 62 | 63 | .select2-container.select2-drop-above .select2-choice { 64 | border-bottom-color: #aaa; 65 | 66 | border-radius: 0 0 4px 4px; 67 | 68 | background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff)); 69 | background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%); 70 | background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%); 71 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); 72 | background-image: linear-gradient(to bottom, #eee 0%, #fff 90%); 73 | } 74 | 75 | .select2-container.select2-allowclear .select2-choice .select2-chosen { 76 | margin-right: 42px; 77 | } 78 | 79 | .select2-container .select2-choice > .select2-chosen { 80 | margin-right: 26px; 81 | display: block; 82 | overflow: hidden; 83 | 84 | white-space: nowrap; 85 | 86 | text-overflow: ellipsis; 87 | float: none; 88 | width: auto; 89 | } 90 | 91 | html[dir="rtl"] .select2-container .select2-choice > .select2-chosen { 92 | margin-left: 26px; 93 | margin-right: 0; 94 | } 95 | 96 | .select2-container .select2-choice abbr { 97 | display: none; 98 | width: 12px; 99 | height: 12px; 100 | position: absolute; 101 | right: 24px; 102 | top: 8px; 103 | 104 | font-size: 1px; 105 | text-decoration: none; 106 | 107 | border: 0; 108 | background: url('select2.png') right top no-repeat; 109 | cursor: pointer; 110 | outline: 0; 111 | } 112 | 113 | .select2-container.select2-allowclear .select2-choice abbr { 114 | display: inline-block; 115 | } 116 | 117 | .select2-container .select2-choice abbr:hover { 118 | background-position: right -11px; 119 | cursor: pointer; 120 | } 121 | 122 | .select2-drop-mask { 123 | border: 0; 124 | margin: 0; 125 | padding: 0; 126 | position: fixed; 127 | left: 0; 128 | top: 0; 129 | min-height: 100%; 130 | min-width: 100%; 131 | height: auto; 132 | width: auto; 133 | opacity: 0; 134 | z-index: 9998; 135 | /* styles required for IE to work */ 136 | background-color: #fff; 137 | filter: alpha(opacity=0); 138 | } 139 | 140 | .select2-drop { 141 | width: 100%; 142 | margin-top: -1px; 143 | position: absolute; 144 | z-index: 9999; 145 | top: 100%; 146 | 147 | background: #fff; 148 | color: #000; 149 | border: 1px solid #aaa; 150 | border-top: 0; 151 | 152 | border-radius: 0 0 4px 4px; 153 | 154 | -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); 155 | box-shadow: 0 4px 5px rgba(0, 0, 0, .15); 156 | } 157 | 158 | .select2-drop.select2-drop-above { 159 | margin-top: 1px; 160 | border-top: 1px solid #aaa; 161 | border-bottom: 0; 162 | 163 | border-radius: 4px 4px 0 0; 164 | 165 | -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); 166 | box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); 167 | } 168 | 169 | .select2-drop-active { 170 | border: 1px solid #5897fb; 171 | border-top: none; 172 | } 173 | 174 | .select2-drop.select2-drop-above.select2-drop-active { 175 | border-top: 1px solid #5897fb; 176 | } 177 | 178 | .select2-drop-auto-width { 179 | border-top: 1px solid #aaa; 180 | width: auto; 181 | } 182 | 183 | .select2-drop-auto-width .select2-search { 184 | padding-top: 4px; 185 | } 186 | 187 | .select2-container .select2-choice .select2-arrow { 188 | display: inline-block; 189 | width: 18px; 190 | height: 100%; 191 | position: absolute; 192 | right: 0; 193 | top: 0; 194 | 195 | border-left: 1px solid #aaa; 196 | border-radius: 0 4px 4px 0; 197 | 198 | background-clip: padding-box; 199 | 200 | background: #ccc; 201 | background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); 202 | background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); 203 | background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); 204 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0); 205 | background-image: linear-gradient(to top, #ccc 0%, #eee 60%); 206 | } 207 | 208 | html[dir="rtl"] .select2-container .select2-choice .select2-arrow { 209 | left: 0; 210 | right: auto; 211 | 212 | border-left: none; 213 | border-right: 1px solid #aaa; 214 | border-radius: 4px 0 0 4px; 215 | } 216 | 217 | .select2-container .select2-choice .select2-arrow b { 218 | display: block; 219 | width: 100%; 220 | height: 100%; 221 | background: url('select2.png') no-repeat 0 1px; 222 | } 223 | 224 | html[dir="rtl"] .select2-container .select2-choice .select2-arrow b { 225 | background-position: 2px 1px; 226 | } 227 | 228 | .select2-search { 229 | display: inline-block; 230 | width: 100%; 231 | min-height: 26px; 232 | margin: 0; 233 | padding-left: 4px; 234 | padding-right: 4px; 235 | 236 | position: relative; 237 | z-index: 10000; 238 | 239 | white-space: nowrap; 240 | } 241 | 242 | .select2-search input { 243 | width: 100%; 244 | height: auto !important; 245 | min-height: 26px; 246 | padding: 4px 20px 4px 5px; 247 | margin: 0; 248 | 249 | outline: 0; 250 | font-family: sans-serif; 251 | font-size: 1em; 252 | 253 | border: 1px solid #aaa; 254 | border-radius: 0; 255 | 256 | -webkit-box-shadow: none; 257 | box-shadow: none; 258 | 259 | background: #fff url('select2.png') no-repeat 100% -22px; 260 | background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); 261 | background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); 262 | background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); 263 | background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; 264 | } 265 | 266 | html[dir="rtl"] .select2-search input { 267 | padding: 4px 5px 4px 20px; 268 | 269 | background: #fff url('select2.png') no-repeat -37px -22px; 270 | background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); 271 | background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); 272 | background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); 273 | background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; 274 | } 275 | 276 | .select2-drop.select2-drop-above .select2-search input { 277 | margin-top: 4px; 278 | } 279 | 280 | .select2-search input.select2-active { 281 | background: #fff url('select2-spinner.gif') no-repeat 100%; 282 | background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); 283 | background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); 284 | background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); 285 | background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; 286 | } 287 | 288 | .select2-container-active .select2-choice, 289 | .select2-container-active .select2-choices { 290 | border: 1px solid #5897fb; 291 | outline: none; 292 | 293 | -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3); 294 | box-shadow: 0 0 5px rgba(0, 0, 0, .3); 295 | } 296 | 297 | .select2-dropdown-open .select2-choice { 298 | border-bottom-color: transparent; 299 | -webkit-box-shadow: 0 1px 0 #fff inset; 300 | box-shadow: 0 1px 0 #fff inset; 301 | 302 | border-bottom-left-radius: 0; 303 | border-bottom-right-radius: 0; 304 | 305 | background-color: #eee; 306 | background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee)); 307 | background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%); 308 | background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%); 309 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); 310 | background-image: linear-gradient(to top, #fff 0%, #eee 50%); 311 | } 312 | 313 | .select2-dropdown-open.select2-drop-above .select2-choice, 314 | .select2-dropdown-open.select2-drop-above .select2-choices { 315 | border: 1px solid #5897fb; 316 | border-top-color: transparent; 317 | 318 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee)); 319 | background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%); 320 | background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%); 321 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); 322 | background-image: linear-gradient(to bottom, #fff 0%, #eee 50%); 323 | } 324 | 325 | .select2-dropdown-open .select2-choice .select2-arrow { 326 | background: transparent; 327 | border-left: none; 328 | filter: none; 329 | } 330 | html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow { 331 | border-right: none; 332 | } 333 | 334 | .select2-dropdown-open .select2-choice .select2-arrow b { 335 | background-position: -18px 1px; 336 | } 337 | 338 | html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b { 339 | background-position: -16px 1px; 340 | } 341 | 342 | .select2-hidden-accessible { 343 | border: 0; 344 | clip: rect(0 0 0 0); 345 | height: 1px; 346 | margin: -1px; 347 | overflow: hidden; 348 | padding: 0; 349 | position: absolute; 350 | width: 1px; 351 | } 352 | 353 | /* results */ 354 | .select2-results { 355 | max-height: 200px; 356 | padding: 0 0 0 4px; 357 | margin: 4px 4px 4px 0; 358 | position: relative; 359 | overflow-x: hidden; 360 | overflow-y: auto; 361 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 362 | } 363 | 364 | html[dir="rtl"] .select2-results { 365 | padding: 0 4px 0 0; 366 | margin: 4px 0 4px 4px; 367 | } 368 | 369 | .select2-results ul.select2-result-sub { 370 | margin: 0; 371 | padding-left: 0; 372 | } 373 | 374 | .select2-results li { 375 | list-style: none; 376 | display: list-item; 377 | background-image: none; 378 | } 379 | 380 | .select2-results li.select2-result-with-children > .select2-result-label { 381 | font-weight: bold; 382 | } 383 | 384 | .select2-results .select2-result-label { 385 | padding: 3px 7px 4px; 386 | margin: 0; 387 | cursor: pointer; 388 | 389 | min-height: 1em; 390 | 391 | -webkit-touch-callout: none; 392 | -webkit-user-select: none; 393 | -moz-user-select: none; 394 | -ms-user-select: none; 395 | user-select: none; 396 | } 397 | 398 | .select2-results-dept-1 .select2-result-label { padding-left: 20px } 399 | .select2-results-dept-2 .select2-result-label { padding-left: 40px } 400 | .select2-results-dept-3 .select2-result-label { padding-left: 60px } 401 | .select2-results-dept-4 .select2-result-label { padding-left: 80px } 402 | .select2-results-dept-5 .select2-result-label { padding-left: 100px } 403 | .select2-results-dept-6 .select2-result-label { padding-left: 110px } 404 | .select2-results-dept-7 .select2-result-label { padding-left: 120px } 405 | 406 | .select2-results .select2-highlighted { 407 | background: #3875d7; 408 | color: #fff; 409 | } 410 | 411 | .select2-results li em { 412 | background: #feffde; 413 | font-style: normal; 414 | } 415 | 416 | .select2-results .select2-highlighted em { 417 | background: transparent; 418 | } 419 | 420 | .select2-results .select2-highlighted ul { 421 | background: #fff; 422 | color: #000; 423 | } 424 | 425 | .select2-results .select2-no-results, 426 | .select2-results .select2-searching, 427 | .select2-results .select2-ajax-error, 428 | .select2-results .select2-selection-limit { 429 | background: #f4f4f4; 430 | display: list-item; 431 | padding-left: 5px; 432 | } 433 | 434 | /* 435 | disabled look for disabled choices in the results dropdown 436 | */ 437 | .select2-results .select2-disabled.select2-highlighted { 438 | color: #666; 439 | background: #f4f4f4; 440 | display: list-item; 441 | cursor: default; 442 | } 443 | .select2-results .select2-disabled { 444 | background: #f4f4f4; 445 | display: list-item; 446 | cursor: default; 447 | } 448 | 449 | .select2-results .select2-selected { 450 | display: none; 451 | } 452 | 453 | .select2-more-results.select2-active { 454 | background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%; 455 | } 456 | 457 | .select2-results .select2-ajax-error { 458 | background: rgba(255, 50, 50, .2); 459 | } 460 | 461 | .select2-more-results { 462 | background: #f4f4f4; 463 | display: list-item; 464 | } 465 | 466 | /* disabled styles */ 467 | 468 | .select2-container.select2-container-disabled .select2-choice { 469 | background-color: #f4f4f4; 470 | background-image: none; 471 | border: 1px solid #ddd; 472 | cursor: default; 473 | } 474 | 475 | .select2-container.select2-container-disabled .select2-choice .select2-arrow { 476 | background-color: #f4f4f4; 477 | background-image: none; 478 | border-left: 0; 479 | } 480 | 481 | .select2-container.select2-container-disabled .select2-choice abbr { 482 | display: none; 483 | } 484 | 485 | 486 | /* multiselect */ 487 | 488 | .select2-container-multi .select2-choices { 489 | height: auto !important; 490 | height: 1%; 491 | margin: 0; 492 | padding: 0 5px 0 0; 493 | position: relative; 494 | 495 | border: 1px solid #aaa; 496 | cursor: text; 497 | overflow: hidden; 498 | 499 | background-color: #fff; 500 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff)); 501 | background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%); 502 | background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%); 503 | background-image: linear-gradient(to bottom, #eee 1%, #fff 15%); 504 | } 505 | 506 | html[dir="rtl"] .select2-container-multi .select2-choices { 507 | padding: 0 0 0 5px; 508 | } 509 | 510 | .select2-locked { 511 | padding: 3px 5px 3px 5px !important; 512 | } 513 | 514 | .select2-container-multi .select2-choices { 515 | min-height: 26px; 516 | } 517 | 518 | .select2-container-multi.select2-container-active .select2-choices { 519 | border: 1px solid #5897fb; 520 | outline: none; 521 | 522 | -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3); 523 | box-shadow: 0 0 5px rgba(0, 0, 0, .3); 524 | } 525 | .select2-container-multi .select2-choices li { 526 | float: left; 527 | list-style: none; 528 | } 529 | html[dir="rtl"] .select2-container-multi .select2-choices li 530 | { 531 | float: right; 532 | } 533 | .select2-container-multi .select2-choices .select2-search-field { 534 | margin: 0; 535 | padding: 0; 536 | white-space: nowrap; 537 | } 538 | 539 | .select2-container-multi .select2-choices .select2-search-field input { 540 | padding: 5px; 541 | margin: 1px 0; 542 | 543 | font-family: sans-serif; 544 | font-size: 100%; 545 | color: #666; 546 | outline: 0; 547 | border: 0; 548 | -webkit-box-shadow: none; 549 | box-shadow: none; 550 | background: transparent !important; 551 | } 552 | 553 | .select2-container-multi .select2-choices .select2-search-field input.select2-active { 554 | background: #fff url('select2-spinner.gif') no-repeat 100% !important; 555 | } 556 | 557 | .select2-default { 558 | color: #999 !important; 559 | } 560 | 561 | .select2-container-multi .select2-choices .select2-search-choice { 562 | padding: 3px 5px 3px 18px; 563 | margin: 3px 0 3px 5px; 564 | position: relative; 565 | 566 | line-height: 13px; 567 | color: #333; 568 | cursor: default; 569 | border: 1px solid #aaaaaa; 570 | 571 | border-radius: 3px; 572 | 573 | -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); 574 | box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); 575 | 576 | background-clip: padding-box; 577 | 578 | -webkit-touch-callout: none; 579 | -webkit-user-select: none; 580 | -moz-user-select: none; 581 | -ms-user-select: none; 582 | user-select: none; 583 | 584 | background-color: #e4e4e4; 585 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0); 586 | background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee)); 587 | background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); 588 | background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); 589 | background-image: linear-gradient(to top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); 590 | } 591 | html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice 592 | { 593 | margin: 3px 5px 3px 0; 594 | padding: 3px 18px 3px 5px; 595 | } 596 | .select2-container-multi .select2-choices .select2-search-choice .select2-chosen { 597 | cursor: default; 598 | } 599 | .select2-container-multi .select2-choices .select2-search-choice-focus { 600 | background: #d4d4d4; 601 | } 602 | 603 | .select2-search-choice-close { 604 | display: block; 605 | width: 12px; 606 | height: 13px; 607 | position: absolute; 608 | right: 3px; 609 | top: 4px; 610 | 611 | font-size: 1px; 612 | outline: none; 613 | background: url('select2.png') right top no-repeat; 614 | } 615 | html[dir="rtl"] .select2-search-choice-close { 616 | right: auto; 617 | left: 3px; 618 | } 619 | 620 | .select2-container-multi .select2-search-choice-close { 621 | left: 3px; 622 | } 623 | 624 | html[dir="rtl"] .select2-container-multi .select2-search-choice-close { 625 | left: auto; 626 | right: 2px; 627 | } 628 | 629 | .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover { 630 | background-position: right -11px; 631 | } 632 | .select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close { 633 | background-position: right -11px; 634 | } 635 | 636 | /* disabled styles */ 637 | .select2-container-multi.select2-container-disabled .select2-choices { 638 | background-color: #f4f4f4; 639 | background-image: none; 640 | border: 1px solid #ddd; 641 | cursor: default; 642 | } 643 | 644 | .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice { 645 | padding: 3px 5px 3px 5px; 646 | border: 1px solid #ddd; 647 | background-image: none; 648 | background-color: #f4f4f4; 649 | } 650 | 651 | .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none; 652 | background: none; 653 | } 654 | /* end multiselect */ 655 | 656 | 657 | .select2-result-selectable .select2-match, 658 | .select2-result-unselectable .select2-match { 659 | text-decoration: underline; 660 | } 661 | 662 | .select2-offscreen, .select2-offscreen:focus { 663 | clip: rect(0 0 0 0) !important; 664 | width: 1px !important; 665 | height: 1px !important; 666 | border: 0 !important; 667 | margin: 0 !important; 668 | padding: 0 !important; 669 | overflow: hidden !important; 670 | position: absolute !important; 671 | outline: 0 !important; 672 | left: 0px !important; 673 | top: 0px !important; 674 | } 675 | 676 | .select2-display-none { 677 | display: none; 678 | } 679 | 680 | .select2-measure-scrollbar { 681 | position: absolute; 682 | top: -10000px; 683 | left: -10000px; 684 | width: 100px; 685 | height: 100px; 686 | overflow: scroll; 687 | } 688 | 689 | /* Retina-ize icons */ 690 | 691 | @media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) { 692 | .select2-search input, 693 | .select2-search-choice-close, 694 | .select2-container .select2-choice abbr, 695 | .select2-container .select2-choice .select2-arrow b { 696 | background-image: url('select2x2.png') !important; 697 | background-repeat: no-repeat !important; 698 | background-size: 60px 40px !important; 699 | } 700 | 701 | .select2-search input { 702 | background-position: 100% -21px !important; 703 | } 704 | } 705 | -------------------------------------------------------------------------------- /www/css/select2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/select2.png -------------------------------------------------------------------------------- /www/css/select2x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/css/select2x2.png -------------------------------------------------------------------------------- /www/css/tour.css: -------------------------------------------------------------------------------- 1 | #tour { 2 | box-sizing: border-box; 3 | font-size: 15px; 4 | position: absolute; 5 | width: 400px; 6 | height: 300px; 7 | border-radius: 5px; 8 | z-index: 10000; 9 | border: solid 2px black; 10 | background-color: #EFEFEF; 11 | } 12 | 13 | #tour .close { 14 | position:absolute; 15 | top: 10px; 16 | right: 10px; 17 | color: #ddd; 18 | cursor: pointer; 19 | } 20 | 21 | #tour .close:hover{ 22 | color: #999; 23 | } 24 | 25 | #tour .header { 26 | font-family: 'Roboto Condensed', sans-serif; 27 | position: absolute; 28 | left: 15px; 29 | top: 15px; 30 | width: 370px; 31 | } 32 | 33 | #tour .content { 34 | position: absolute; 35 | width: 365px; 36 | height: 210px; 37 | left: 15px; 38 | top: 45px; 39 | overflow-y: scroll; 40 | text-align: justify; 41 | padding-right: 5px; 42 | } 43 | 44 | #tour #tourNext { 45 | position: absolute; 46 | right: 10px; 47 | bottom: 10px; 48 | } 49 | 50 | #tour .tourCookie { 51 | position: absolute; 52 | left: 10px; 53 | bottom: 10px; 54 | } 55 | 56 | .tour-arrow-border { 57 | border-style: solid; 58 | border-width: 10px; 59 | height: 0px; 60 | width: 0px; 61 | position: absolute; 62 | } 63 | 64 | .tour-arrow { 65 | border-style: solid; 66 | border-width: 10px; 67 | height: 0px; 68 | width: 0px; 69 | position: absolute; 70 | } -------------------------------------------------------------------------------- /www/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /www/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /www/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /www/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /www/images/area_served.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/area_served.png -------------------------------------------------------------------------------- /www/images/biasLegend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/biasLegend.png -------------------------------------------------------------------------------- /www/images/cont_us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/cont_us.png -------------------------------------------------------------------------------- /www/images/corLegend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/corLegend.png -------------------------------------------------------------------------------- /www/images/csv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/csv.png -------------------------------------------------------------------------------- /www/images/csv_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/csv_dark.png -------------------------------------------------------------------------------- /www/images/glyphicons_094_vector_path_square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/glyphicons_094_vector_path_square.png -------------------------------------------------------------------------------- /www/images/glyphicons_096_vector_path_polygon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/glyphicons_096_vector_path_polygon.png -------------------------------------------------------------------------------- /www/images/glyphicons_197_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/glyphicons_197_remove.png -------------------------------------------------------------------------------- /www/images/notrend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/notrend.png -------------------------------------------------------------------------------- /www/images/o3_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/o3_65.png -------------------------------------------------------------------------------- /www/images/o3_70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/o3_70.png -------------------------------------------------------------------------------- /www/images/o3_75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/o3_75.png -------------------------------------------------------------------------------- /www/images/pbe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/pbe.png -------------------------------------------------------------------------------- /www/images/pm25_35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/pm25_35.png -------------------------------------------------------------------------------- /www/images/probLegend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/probLegend.png -------------------------------------------------------------------------------- /www/images/rembias.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LADCO/NetAssessApp/e51930af299bc9f4517a01fd9443d04ab3d23961/www/images/rembias.png -------------------------------------------------------------------------------- /www/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | NetAssess 7 | 8 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 92 | 93 | 94 | 95 | 147 | 148 | 197 | 198 | 211 | 212 | 213 | 214 | 230 | 231 | 232 | 233 |
234 |

Draw an Area of Interest

235 |

Use the buttons below to define your own area of interest:

236 |
237 | 238 | 239 | 240 |
241 |
Select Predefined Area
242 |

Select and area type with the radio buttons, then select a specific area from the dropdown menu:

243 |
244 |
245 | 246 | 250 | 254 | 258 | 262 | 263 |
264 |
265 |
266 | 267 |
268 | 269 | 270 | 271 | 272 | 273 |
274 |

Location

275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 |
297 | 298 |

Parameters

299 | 300 | 301 | 302 | 303 | 304 | 305 |
306 | 307 |
308 |

Monitor

309 |
310 |

Parameter

311 |
312 |

Geography

313 |
314 |

Demographics

315 |
316 |
317 |
318 |

Exceedence Probability 75ppb

319 |
320 |
321 | 322 |
323 |
324 |

To save chart, right-click and select Save Image as

325 |
326 | 327 |
328 | 329 |

To save chart, right-click and select Save Image as

330 |
331 | 332 |
333 | 334 | 335 | 342 | 343 | 350 | 351 | 352 | 353 | 360 | 361 | 368 | 369 | 370 | 371 | 376 | 377 | 382 | 383 | 384 | 385 | 389 | 390 | 391 | 395 | 396 | 397 | 416 | 417 |
336 | 337 | 338 | 339 | 340 | 341 | Existing Site 344 | 345 | 346 | 347 | 348 | 349 | Existing Site (selected)
354 | 355 | 356 | 357 | 358 | 359 | New Site 362 | 363 | 364 | 365 | 366 | 367 | New Site (selected)
372 | 373 | 374 | 375 | Area of Interest 378 | 379 | 380 | 381 | Area Served Polygon
418 |
419 | 420 |
421 |

Click the icon next to the data type you want to download. Grayed out options are unavailable.

422 | 423 | 424 | 427 | 430 | 431 | 432 | 435 | 438 | 439 | 440 | 443 | 446 | 447 | 448 | 451 | 454 | 455 |
425 | 426 | 428 | Site Data 429 |
433 | 434 | 436 | Area Served Data 437 |
441 | 442 | 444 | Correlation Data 445 |
449 | 450 | 452 | Removal Bias Data 453 |
456 |
457 | 458 | 459 |
460 | 461 |
462 |
463 |
464 | 465 | 466 |
467 | 468 | 469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 | 480 | 481 |
482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | -------------------------------------------------------------------------------- /www/js/L.Control.Sidebar.js: -------------------------------------------------------------------------------- 1 | L.Control.Sidebar = L.Control.extend({ 2 | 3 | includes: L.Mixin.Events, 4 | 5 | options: { 6 | closeButton: true, 7 | position: 'left', 8 | autoPan: true, 9 | }, 10 | 11 | initialize: function (placeholder, options) { 12 | L.setOptions(this, options); 13 | 14 | // Find content container 15 | var content = this._contentContainer = L.DomUtil.get(placeholder); 16 | 17 | // Remove the content container from its original parent 18 | content.parentNode.removeChild(content); 19 | 20 | var l = 'leaflet-'; 21 | 22 | // Create sidebar container 23 | var container = this._container = 24 | L.DomUtil.create('div', l + 'sidebar ' + this.options.position); 25 | 26 | // Style and attach content container 27 | L.DomUtil.addClass(content, l + 'control'); 28 | container.appendChild(content); 29 | 30 | // Create close button and attach it if configured 31 | if (this.options.closeButton) { 32 | var close = this._closeButton = 33 | L.DomUtil.create('a', 'close', container); 34 | close.innerHTML = '×'; 35 | } 36 | }, 37 | 38 | addTo: function (map) { 39 | var container = this._container; 40 | var content = this._contentContainer; 41 | 42 | // Attach event to close button 43 | if (this.options.closeButton) { 44 | var close = this._closeButton; 45 | 46 | L.DomEvent.on(close, 'click', this.hide, this); 47 | } 48 | 49 | L.DomEvent 50 | .on(container, 'transitionend', 51 | this._handleTransitionEvent, this) 52 | .on(container, 'webkitTransitionEnd', 53 | this._handleTransitionEvent, this); 54 | 55 | // Attach sidebar container to controls container 56 | var controlContainer = map._controlContainer; 57 | controlContainer.insertBefore(container, controlContainer.firstChild); 58 | 59 | this._map = map; 60 | 61 | // Make sure we don't drag the map when we interact with the content 62 | var stop = L.DomEvent.stopPropagation; 63 | L.DomEvent 64 | .on(content, 'contextmenu', stop) 65 | .on(content, 'click', stop) 66 | .on(content, 'mousedown', stop) 67 | .on(content, 'touchstart', stop) 68 | .on(content, 'dblclick', stop) 69 | .on(content, 'mousewheel', stop) 70 | .on(content, 'MozMousePixelScroll', stop); 71 | 72 | return this; 73 | }, 74 | 75 | removeFrom: function (map) { 76 | //if the control is visible, hide it before removing it. 77 | this.hide(); 78 | 79 | var content = this._contentContainer; 80 | 81 | // Remove sidebar container from controls container 82 | var controlContainer = map._controlContainer; 83 | controlContainer.removeChild(this._container); 84 | 85 | //disassociate the map object 86 | this._map = null; 87 | 88 | // Unregister events to prevent memory leak 89 | var stop = L.DomEvent.stopPropagation; 90 | L.DomEvent 91 | .off(content, 'contextmenu', stop) 92 | .off(content, 'click', stop) 93 | .off(content, 'mousedown', stop) 94 | .off(content, 'touchstart', stop) 95 | .off(content, 'dblclick', stop) 96 | .off(content, 'mousewheel', stop) 97 | .off(content, 'MozMousePixelScroll', stop); 98 | 99 | L.DomEvent 100 | .off(container, 'transitionend', 101 | this._handleTransitionEvent, this) 102 | .off(container, 'webkitTransitionEnd', 103 | this._handleTransitionEvent, this); 104 | 105 | if (this._closeButton && this._close) { 106 | var close = this._closeButton; 107 | 108 | L.DomEvent.off(close, 'click', this.hide, this); 109 | } 110 | 111 | return this; 112 | }, 113 | 114 | isVisible: function () { 115 | return L.DomUtil.hasClass(this._container, 'visible'); 116 | }, 117 | 118 | show: function () { 119 | if (!this.isVisible()) { 120 | L.DomUtil.addClass(this._container, 'visible'); 121 | if (this.options.autoPan) { 122 | this._map.panBy([-this.getOffset() / 2, 0], { 123 | duration: 0.5 124 | }); 125 | } 126 | this.fire('show'); 127 | } 128 | }, 129 | 130 | hide: function (e) { 131 | if (this.isVisible()) { 132 | L.DomUtil.removeClass(this._container, 'visible'); 133 | if (this.options.autoPan) { 134 | this._map.panBy([this.getOffset() / 2, 0], { 135 | duration: 0.5 136 | }); 137 | } 138 | this.fire('hide'); 139 | } 140 | if(e) { 141 | L.DomEvent.stopPropagation(e); 142 | } 143 | }, 144 | 145 | toggle: function () { 146 | if (this.isVisible()) { 147 | this.hide(); 148 | } else { 149 | this.show(); 150 | } 151 | }, 152 | 153 | getContainer: function () { 154 | return this._contentContainer; 155 | }, 156 | 157 | getCloseButton: function () { 158 | return this._closeButton; 159 | }, 160 | 161 | setContent: function (content) { 162 | this.getContainer().innerHTML = content; 163 | return this; 164 | }, 165 | 166 | getOffset: function () { 167 | if (this.options.position === 'right') { 168 | return -this._container.offsetWidth; 169 | } else { 170 | return this._container.offsetWidth; 171 | } 172 | }, 173 | 174 | _handleTransitionEvent: function (e) { 175 | if (e.propertyName == 'left' || e.propertyName == 'right') 176 | this.fire(this.isVisible() ? 'shown' : 'hidden'); 177 | } 178 | }); 179 | 180 | L.control.sidebar = function (placeholder, options) { 181 | return new L.Control.Sidebar(placeholder, options); 182 | }; 183 | -------------------------------------------------------------------------------- /www/js/easy-button.js: -------------------------------------------------------------------------------- 1 | L.Control.EasyButtons = L.Control.extend({ 2 | options: { 3 | position: 'topright', 4 | title: '', 5 | intentedIcon: 'fa-circle-o' 6 | }, 7 | 8 | onAdd: function () { 9 | var container = L.DomUtil.create('div', 'leaflet-bar leaflet-control'); 10 | 11 | this.link = L.DomUtil.create('a', 'leaflet-bar-part', container); 12 | L.DomUtil.create('i', 'fa fa-lg ' + this.options.intentedIcon , this.link); 13 | this.link.href = '#'; 14 | 15 | L.DomEvent.on(this.link, 'click', this._click, this); 16 | this.link.title = this.options.title; 17 | 18 | return container; 19 | }, 20 | 21 | intendedFunction: function(){ alert('no function selected');}, 22 | 23 | _click: function (e) { 24 | L.DomEvent.stopPropagation(e); 25 | L.DomEvent.preventDefault(e); 26 | this.intendedFunction(); 27 | }, 28 | }); 29 | 30 | L.easyButton = function( btnIcon , btnFunction , btnTitle , btnMap ) { 31 | var newControl = new L.Control.EasyButtons; 32 | if (btnIcon) newControl.options.intentedIcon = btnIcon; 33 | 34 | if ( typeof btnFunction === 'function'){ 35 | newControl.intendedFunction = btnFunction; 36 | } 37 | 38 | if (btnTitle) newControl.options.title = btnTitle; 39 | 40 | if ( btnMap == '' ){ 41 | // skip auto addition 42 | } else if ( btnMap ) { 43 | btnMap.addControl(newControl); 44 | } else { 45 | map.addControl(newControl); 46 | } 47 | return newControl; 48 | }; 49 | -------------------------------------------------------------------------------- /www/js/floaters.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | $.floater = function(id, opt) { 4 | return new $.Floater(id, opt); 5 | } 6 | 7 | $.Floater = function(id, opt) { 8 | 9 | var $floater = $(id); 10 | var $this = this; 11 | 12 | this.floater = $floater; 13 | 14 | opt = $.extend({title: "Floater", cursor: "move", close: true, minimize: true, resize: false, width: 400, top: "50px", left: "50px"}, opt); 15 | 16 | $floater.css({width: opt.width}); 17 | 18 | if(opt.hasOwnProperty("height")) { 19 | $floater.css({height: opt.height}) 20 | } 21 | 22 | if(opt.hasOwnProperty("right")) { 23 | $floater.css({right: opt.right}); 24 | } else { 25 | $floater.css({left: opt.left}); 26 | } 27 | 28 | if(opt.resize) { 29 | $floater.css({resize: "horizontal"}); 30 | } 31 | 32 | $floater.addClass("float-panel closed") 33 | 34 | var $el = $floater.prepend("
" + opt.title + "
").find(".float-handle"); 35 | 36 | $el.css('cursor', "move").on("mousedown", function(e) { 37 | var $drag = $(this).addClass('active-handle').parent().addClass('draggable'); 38 | var z_idx = $drag.css('z-index'), 39 | drg_h = $drag.outerHeight(), 40 | drg_w = $drag.outerWidth(), 41 | pos_y = $drag.offset().top + drg_h - e.pageY, 42 | pos_x = $drag.offset().left + drg_w - e.pageX; 43 | 44 | $(".float-panel").removeClass("on-top"); 45 | 46 | $drag.addClass("on-top").parents().on("mousemove", function(e) { 47 | $('.draggable').offset({ 48 | top:e.pageY + pos_y - drg_h, 49 | left:e.pageX + pos_x - drg_w 50 | }).on("mouseup", function() { 51 | $(this).removeClass('draggable'); 52 | }); 53 | }); 54 | e.preventDefault(); // disable selection 55 | }).on("mouseup", function() { 56 | $(this).removeClass('active-handle').parent().removeClass('draggable'); 57 | }); 58 | 59 | $floater.on("click", function() { 60 | $(".float-panel").removeClass("on-top"); 61 | $floater.addClass("on-top"); 62 | }) 63 | 64 | if(opt.minimize == true) { 65 | var min = $floater.append("").find(".minimize"); 66 | if(opt.close == true) { 67 | min.css({right: "25px"}) 68 | } else { 69 | min.css({right: "5px"}) 70 | } 71 | min.on("click", function() { 72 | $floater.toggleClass("minimized").removeClass("open").removeClass("closed"); 73 | $this.checkBottom(); 74 | }) 75 | } 76 | 77 | if(opt.close == true) { 78 | var clo = $floater.append("").find(".close"); 79 | clo.on("click", function() {$floater.addClass("closed").removeClass("open").removeClass("on-top").removeClass("minimized");}) 80 | } 81 | 82 | this.checkBottom = function() { 83 | var h = $floater[0].offsetHeight; 84 | var p = $floater.offset(); 85 | var sh = window.innerHeight; 86 | if(h + p.top > sh) { 87 | $floater.css({top: (sh - (h + 10)) + "px"}) 88 | } 89 | } 90 | 91 | this.open = function() { 92 | $(".float-panel").removeClass("on-top"); 93 | $floater.addClass("open on-top").removeClass("closed").removeClass("minimized"); 94 | $this.checkBottom(); 95 | } 96 | 97 | this.close = function() { 98 | $floater.addClass("closed").removeClass("open").removeClass("on-top").removeClass("minimized"); 99 | } 100 | 101 | this.minimize = function() { 102 | $floater.toggleClass("minimized").removeClass("open").removeClass("closed"); 103 | } 104 | 105 | this.updateTitle = function(title) { 106 | $floater.find(".float-handle").text(title) 107 | } 108 | 109 | if(opt.hasOwnProperty("bottom")) { 110 | if(opt.hasOwnProperty("height")) { 111 | $floater.css({bottom: opt.bottom}); 112 | } else { 113 | var h = $floater[0].offsetHeight; 114 | var sh = window.innerHeight; 115 | var t = sh - (h + parseInt(opt.bottom, 10)); 116 | $floater.css({top: t + "px"}) 117 | } 118 | } else { 119 | $floater.css({top: opt.top}); 120 | } 121 | 122 | return this; 123 | 124 | }; 125 | 126 | })(jQuery); 127 | 128 | -------------------------------------------------------------------------------- /www/js/leaflet.contextmenu.js: -------------------------------------------------------------------------------- 1 | /* 2 | Leaflet.contextmenu, A context menu for Leaflet. 3 | (c) 2014, Adam Ratcliffe, TomTom International BV 4 | */ 5 | L.Map.mergeOptions({contextmenuItems:[]});L.Map.ContextMenu=L.Handler.extend({statics:{BASE_CLS:"leaflet-contextmenu"},initialize:function(map){L.Handler.prototype.initialize.call(this,map);this._items=[];this._visible=false;var container=this._container=L.DomUtil.create("div",L.Map.ContextMenu.BASE_CLS,map._container);container.style.zIndex=1e4;container.style.position="absolute";if(map.options.contextmenuWidth){container.style.width=map.options.contextmenuWidth+"px"}this._createItems();L.DomEvent.on(container,"click",L.DomEvent.stop).on(container,"mousedown",L.DomEvent.stop).on(container,"dblclick",L.DomEvent.stop).on(container,"contextmenu",L.DomEvent.stop)},addHooks:function(){L.DomEvent.on(document,L.Browser.touch?"touchstart":"mousedown",this._onMouseDown,this).on(document,"keydown",this._onKeyDown,this);this._map.on({contextmenu:this._show,mouseout:this._hide,mousedown:this._hide,movestart:this._hide,zoomstart:this._hide},this)},removeHooks:function(){L.DomEvent.off(document,"keydown",this._onKeyDown,this);this._map.off({contextmenu:this._show,mouseout:this._hide,mousedown:this._hide,movestart:this._hide,zoomstart:this._hide},this)},showAt:function(point,data){if(point instanceof L.LatLng){point=this._map.latLngToContainerPoint(point)}this._showAtPoint(point,data)},hide:function(){this._hide()},addItem:function(options){return this.insertItem(options)},insertItem:function(options,index){index=index!==undefined?index:this._items.length;var item=this._createItem(this._container,options,index);this._items.push(item);this._sizeChanged=true;this._map.fire("contextmenu.additem",{contextmenu:this,el:item.el,index:index});return item.el},removeItem:function(item){var container=this._container;if(!isNaN(item)){item=container.children[item]}if(item){this._removeItem(L.Util.stamp(item));this._sizeChanged=true;this._map.fire("contextmenu.removeitem",{contextmenu:this,el:item})}},removeAllItems:function(){var item;while(this._container.children.length){item=this._container.children[0];this._removeItem(L.Util.stamp(item))}},hideAllItems:function(){var item,i,l;for(i=0,l=this._items.length;i'}else if(options.iconCls){html=''}el.innerHTML=html+options.text;el.href="#";L.DomEvent.on(el,"mouseover",this._onItemMouseOver,this).on(el,"mouseout",this._onItemMouseOut,this).on(el,"mousedown",L.DomEvent.stopPropagation).on(el,"click",callback);return{id:L.Util.stamp(el),el:el,callback:callback}},_removeItem:function(id){var item,el,i,l;for(i=0,l=this._items.length;imapSize.x){container.style.left="auto";container.style.right=Math.max(mapSize.x-pt.x,0)+"px"}else{container.style.left=Math.max(pt.x,0)+"px";container.style.right="auto"}if(pt.y+containerSize.y>mapSize.y){container.style.top="auto";container.style.bottom=Math.max(mapSize.y-pt.y,0)+"px"}else{container.style.top=Math.max(pt.y,0)+"px";container.style.bottom="auto"}},_getElementSize:function(el){var size=this._size,initialDisplay=el.style.display;if(!size||this._sizeChanged){size={};el.style.left="-999999px";el.style.right="auto";el.style.display="block";size.x=el.offsetWidth;size.y=el.offsetHeight;el.style.left="auto";el.style.display=initialDisplay;this._sizeChanged=false}return size},_onMouseDown:function(e){this._hide()},_onKeyDown:function(e){var key=e.keyCode;if(key===27){this._hide()}},_onItemMouseOver:function(e){L.DomUtil.addClass(e.target,"over")},_onItemMouseOut:function(e){L.DomUtil.removeClass(e.target,"over")}});L.Map.addInitHook("addHandler","contextmenu",L.Map.ContextMenu);L.Mixin.ContextMenu={_initContextMenu:function(){this._items=[];this.on("contextmenu",this._showContextMenu,this)},_showContextMenu:function(e){var itemOptions,pt,i,l;if(this._map.contextmenu){pt=this._map.mouseEventToContainerPoint(e.originalEvent);if(!this.options.contextmenuInheritItems){this._map.contextmenu.hideAllItems()}for(i=0,l=this.options.contextmenuItems.length;i point.lat) != (coords[j].lat > point.lat)) && 344 | (point.lng < (coords[j].lng - coords[i].lng) * (point.lat - coords[i].lat) / (coords[j].lat - coords[i].lat) + coords[i].lng)) { 345 | inside = !inside; 346 | } 347 | 348 | j = i; 349 | } 350 | 351 | if(inside) {pip = true}; 352 | 353 | } else { 354 | if(t.inPolygon(polygon, pip)) {pip = true;} 355 | } 356 | 357 | }) 358 | 359 | } 360 | 361 | return pip; 362 | 363 | }, 364 | keyCheck: function(keys) { 365 | keys = Array.isArray(keys) == false ? [keys]: keys; 366 | var myKey = this.properties.key; 367 | var inc = false; 368 | myKey = Array.isArray(myKey) == false ? [myKey]: myKey; 369 | for(var i = 0; i < myKey.length; i++) { 370 | if(keys.indexOf(myKey[i]) != -1) { 371 | inc = true; 372 | break; 373 | } 374 | } 375 | return inc; 376 | } 377 | 378 | }) 379 | 380 | L.siteMarker = function(latlng, options, properties, parent) { 381 | return new L.SiteMarker(latlng, options, properties, parent) 382 | } -------------------------------------------------------------------------------- /www/js/netassess-shiny.js: -------------------------------------------------------------------------------- 1 | netAssess.shinyBindings = {}; 2 | 3 | netAssess.shinyBindings.customAnchor = new Shiny.InputBinding(); 4 | $.extend(netAssess.shinyBindings.customAnchor, { 5 | find: function(scope) { 6 | return $(scope).find(".shiny-custom-anchor"); 7 | }, 8 | getValue: function(el) { 9 | return $(el).data("anchorData"); 10 | }, 11 | setValue: function(el, value) { 12 | $(el).data("anchorData", value) 13 | $(el).trigger("anchorupdate"); 14 | }, 15 | subscribe: function(el, callback) { 16 | $(el).on("anchorupdate", callback) 17 | }, 18 | unsubscribe: function(el) { 19 | $(el).off("anchorupdate") 20 | }, 21 | initialize: function(el) { 22 | el.updateAnchor = function(data) { 23 | $(this).data("shinyInputBinding").setValue(this, data); 24 | } 25 | } 26 | 27 | }) 28 | Shiny.inputBindings.register(netAssess.shinyBindings.customAnchor); 29 | 30 | Shiny.addCustomMessageHandler("updateVisibleMonitors", function(data) { 31 | netAssess.layerGroups.sites.setVisibleSites(data); 32 | }) 33 | 34 | Shiny.addCustomMessageHandler("displayPredefinedArea", function(data) { 35 | 36 | var x = L.featureGroup(null); 37 | for(var i = 0; i < data.coords.length; i++) { 38 | L.polygon(data.coords[i], {fill: false}).addTo(x) 39 | } 40 | 41 | netAssess.draw.disable(); 42 | netAssess.setAOI(x); 43 | 44 | }); 45 | 46 | Shiny.addCustomMessageHandler("updateAreaServed", function(data) { 47 | 48 | var areaServed = netAssess.layerGroups.areaServed; 49 | areaServed.clearLayers(); 50 | 51 | var areaSelectStyle = {fillColor: '#666', weight: 2, opacity: 0.75, color: 'white', dashArray: '3', fillOpacity: 0.4} 52 | 53 | for(var i = 0; i < data.length; i++) { 54 | 55 | if(data[i].coords.length == 1) { 56 | var a = L.polygon(data[i].coords[0], {id: data[i].id}).addTo(areaServed) 57 | } else { 58 | var a = L.multiPolygon([data[i].coords], {id: data[i].id}).addTo(areaServed) 59 | } 60 | 61 | a.setStyle(areaSelectStyle) 62 | .on("mouseover", function(e) { 63 | var layer = e.target; 64 | layer.setStyle({ 65 | weight: 5, 66 | color: '#666', 67 | dashArray: '', 68 | fillOpacity: 0.7 69 | }); 70 | if(!L.Browser.id && !L.Browser.opera) { 71 | layer.bringToFront(); 72 | netAssess.layerGroups.sites.bringToFront(); 73 | netAssess.layerGroups.newSites.bringToFront(); 74 | netAssess.layerGroups.rembias.bringToFront(); 75 | netAssess.layerGroups.cormap.bringToFront(); 76 | } 77 | }) 78 | .on("mouseout", function(e) { 79 | e.target.setStyle(areaSelectStyle); 80 | }) 81 | .on("click", function(e) { 82 | var layer = e.target; 83 | if(layer.hasOwnProperty("options")) { 84 | document.getElementById("clickedAreaServed").updateAnchor(layer.options.id); 85 | } else if(layer.hasOwnProperty("_options")) { 86 | document.getElementById("clickedAreaServed").updateAnchor(layer._options.id); 87 | } 88 | var $param = $("#paramOfInterest").val(); 89 | var $thresh = $("#areaServedThreshold"); 90 | if($param == "44201") { 91 | $thresh.html("(" + $("#ozoneNAAQS").val() + ")"); 92 | } else if(["88101", "88502"].indexOf($param) != -1) { 93 | $thresh.html("(35μg/m3)"); 94 | } else { 95 | $thresh.html(""); 96 | } 97 | netAssess.floaters.areaServed.open(); 98 | $("#map").trigger("areaClick") 99 | }) 100 | 101 | netAssess.layerGroups.sites.bringToFront(); 102 | netAssess.layerGroups.newSites.bringToFront(); 103 | netAssess.layerGroups.rembias.bringToFront(); 104 | netAssess.layerGroups.cormap.bringToFront(); 105 | netAssess.loading.hide(); 106 | 107 | } 108 | 109 | }) 110 | 111 | Shiny.addCustomMessageHandler("updateTrendChart", function(data) { 112 | $(".popup-trend").find("img").attr("src", data) 113 | }) 114 | 115 | Shiny.addCustomMessageHandler("rembiasUpdate", function(data) { 116 | netAssess.updateBiasLayer(data); 117 | }) 118 | 119 | Shiny.addCustomMessageHandler("showCormat", function(data) { 120 | netAssess.loading.hide(); 121 | netAssess.floaters.cormat.open(); 122 | }) 123 | 124 | Shiny.addCustomMessageHandler("loading", function(data) { 125 | if(data == "show") { 126 | netAssess.loading.show(); 127 | } else { 128 | netAssess.loading.hide(); 129 | } 130 | }) 131 | 132 | Shiny.addCustomMessageHandler("updateCorMap", function(data) { 133 | netAssess.updateCorLayer(data) 134 | }) 135 | 136 | Shiny.addCustomMessageHandler("showAlert", function(data) { 137 | netAssess.showAlert(data.header, data.body) 138 | }) -------------------------------------------------------------------------------- /www/js/tour.js: -------------------------------------------------------------------------------- 1 | netAssess.tour = {slides: [], slideCount: 0, width: 400, height: 300, active: true} 2 | 3 | netAssess.tour.makeSlide = function(options) { 4 | 5 | options = $.extend({ 6 | position: "center", 7 | title: "NetAssess", 8 | text: "Welcome to NetAssess!", 9 | target: "#map", 10 | runbefore: function() {}, 11 | runafter: function() {} 12 | }, options) 13 | 14 | netAssess.tour.slides.push(options) 15 | 16 | } 17 | 18 | netAssess.tour.makeSlide({text: "

This tool is meant to assist with 5-year Network Assessments as required by 40 CFR §58.10(d).

You can start by running through this quick tour, or close this box with the 'x' in the top right corner and jump right in to the tool. You can also refer to the NetAssess Documentation Site for more detailed information about the App.

"}) 19 | 20 | netAssess.tour.makeSlide({title: "Menu Bar", 21 | text: "

Above is the menu bar. The menu bar is how you will access most of the functionality of the tool. Each icon above is a button that gives you access to a tool or function of the NetAssess App.

", 22 | target: "#menuControls", 23 | position: "below" 24 | }) 25 | 26 | netAssess.tour.makeSlide({title: "Layers", 27 | text: "

This is the Layers control. Use the Layers control to switch between different base maps and to turn different tool layers on and off.

Basemaps are the background map. Right now, the grey basemap is displayed, there is also a streets basemap, and satellite basemap from which to choose. The grey basemap is best for viewing output from the NetAssess Tools.

Tool layers give you the ability to hide the output of tools when you are done with them and bring it back later if you need to.

", 28 | target: ".leaflet-control-layers-toggle", 29 | position: "right" 30 | }) 31 | 32 | netAssess.tour.makeSlide({title: "More Options", 33 | text: "These buttons open side panels that offer additional settings and information.", 34 | target: ".leaflet-top.leaflet-right", 35 | position: "left" 36 | }) 37 | 38 | netAssess.tour.makeSlide({title: "Legend", 39 | text: "This is the legend. The legend explains what the symbols on the map mean. Pay attention to the legend because it will change depending on which tools your are using, and which layers you have displayed.", 40 | target: "#legendFloater", 41 | position: "above" 42 | }) 43 | 44 | netAssess.tour.makeSlide({title: "Using NetAssess", 45 | text: "

Now we will cover how to get started using the tools.

Important
The following steps do not require you to make any selections. The app will make appropriate selections to illustrate the functionality. Please only press the 'Next' button when you are ready to move to the next step." 46 | }) 47 | netAssess.tour.makeSlide({title: "Parameter of Interest", 48 | text: "The first step in the assessment process should be selecting a parameter of interest. You do that with the parameter selection dropdown to the right. You can scroll through the list to find your parameter or use the search box to search by name or AQS code. Once you select a parameter the map will update to show the locations of known sites monitoring for that parameter. We have selected 44201 - OZONE for this example.", 49 | target: "#s2id_paramOfInterest", 50 | position: "left", 51 | runbefore: 52 | function() { 53 | if($("#paramOfInterest").select2("val") != "44201") { 54 | $("#paramOfInterest").select2("val", "44201"); 55 | $("#paramOfInterest").trigger("change"); 56 | } 57 | } 58 | }) 59 | 60 | netAssess.tour.makeSlide({title: "Sites", 61 | text: "Once a parameter of interest is selected, all the sites that monitor that parameter will be displayed as red circles on the map. You can click on a site to open a popup that contains basic information about that site including the AQS Site ID, the address, basic information about what is monitored there, and, if you have selected a criteria pollutant, a graph depicting the last ten years of design values for that site." 62 | }) 63 | 64 | netAssess.tour.makeSlide({title: "Area of Interest", 65 | text: "Next, you will need to select an Area of Interest. Your Area of Interest focuses your analysis on a specific area of the country. You open the Area of Interest dialog by clicking the button above.", 66 | target: "#aoiButton", 67 | position: "below", 68 | runafter: netAssess.floaters.aoi.open}); 69 | 70 | netAssess.tour.makeSlide({title: "Area of Interest", 71 | text: "From the Area of Interest dialog you can select an area of interest in several ways. You can draw an area free-hand, with the 'Draw an Area of Interest' controls.
Allows you to draw a many-sided polygon by clicking the map where vertices should be. Click the location of your first vertex to close the polygon and finalize the shape.
Allows you to define a rectangular area by clicking a dragging over the area you are interested in on the map.
If you start a drawing and change you mind, this allows you to cancel the drawing.
", 72 | target: "#cancelDrawButton", 73 | position: "right"}) 74 | 75 | netAssess.tour.makeSlide({title: "Area of Interest", 76 | text: "Or you can also select a predefined area such as a State, CBSA, or CSA.
  1. Click the cicle to the left of the Area Type you want.
  2. The dropdown will update to reflect your choice.
  3. Use the dropdown to select the specific area you are interested in.
You can scroll through the list to locate your area, or use the text box to filter your choices. For this example, the state of North Dakota has been selected.", 77 | target: "#areaSelect", 78 | position: "right", 79 | runbefore: 80 | function() { 81 | $("[name='areaSelect'][value='State']").trigger("click"); 82 | setTimeout(function() { 83 | $("#areaSelectSelect").select2("val", "38"); 84 | $("#areaSelectSelect").trigger("change"); 85 | }, 500) 86 | }, 87 | runafter: netAssess.floaters.aoi.close 88 | }) 89 | 90 | netAssess.tour.makeSlide({title: "Site Selection", 91 | text: "Notice the sites within the area of interest (North Dakota) have gotten brighter and larger to indicate they are selected. You can also right-click on sites to open a menu that allows you to select, deselect, or hide those sites individually." 92 | }) 93 | 94 | netAssess.tour.makeSlide({title: "New Sites", 95 | text: "At this point, you may want to add new sites to your monitoring network. This can be done with the new sites tool. Click this button, then click the location on the map where you want the new monitor to be placed. The NetAssess App will then determine the state, county, and census tract of the location selected and ask you for a name, and which pollutants should be monitored. New sites are depicted as green circles and are treated just like regular sites for the purposes of Area Served calculations.", 96 | target: "#newSiteButton", 97 | position: "below" 98 | }) 99 | 100 | netAssess.tour.makeSlide({title: "Area Served", 101 | text: "Area Served provides information about the area surrounding monitors in you area of interest. Clicking the button will calculate the Area Served by each monitor and draw polygons on the map representing those areas. You can then click on a polygon to get more information about that area.", 102 | target: "#areaServedButton", 103 | position: "below", 104 | runafter: function() { 105 | $("#areaServedButton").trigger("click"); 106 | } 107 | }) 108 | 109 | netAssess.tour.makeSlide({title: "Area Served", 110 | text: "In a moment, grey polygons will appear around the selected sites. Each grey polygon represents the area that is closer to the monitor within it than any other monitor in the network. Clicking on a polygon will open a new dialog with information about that area.", 111 | runafter: function() { 112 | var key = Object.keys(netAssess.layerGroups.areaServed._layers)[1]; 113 | netAssess.layerGroups.areaServed._layers[key].fire("click"); 114 | } 115 | }) 116 | 117 | netAssess.tour.makeSlide({title: "Area Served Information", 118 | text: "The Area Served Information window will appear to the right. The Area Served Information window gives you geographic and demographic information about the area you clicked.", 119 | target: "#areaServedFloater", 120 | position: "left" 121 | }) 122 | 123 | netAssess.tour.makeSlide({title: "Area Served Information", 124 | text: "This includes charts that break the population down by age and race, for potental environmental justice analysis. You can click these plots to see larger versions.", 125 | target: "#areaServedAgePlot", 126 | position: "left" 127 | }) 128 | netAssess.tour.makeSlide({title: "Area Served Information", 129 | text: "If you have selected Ozone or PM2.5 you will also be given the exceedence probability of the census tract with the highest exceedence probability found within the area served by the site.", 130 | target: "#naaqsProb", 131 | position: "left", 132 | runafter: netAssess.floaters.areaServed.close 133 | }) 134 | netAssess.tour.makeSlide({title: "Correlation Matrix", 135 | text: "

The correlation matrix gives you information about how concentrations at monitors within your area of interest compare to one another. This tool currently only works with

  • 44201 - OZONE
  • 88101 - PM2.5 - LOCAL CONDITIONS
  • 88502 - ACCEPTABLE PM2.5 AQI & SPECIATION MASS
", 136 | target: "#cormatButton", 137 | position: "below", 138 | runafter: 139 | function() { 140 | $("#cormatButton").trigger("click"); 141 | } 142 | }) 143 | 144 | netAssess.tour.makeSlide({title: "Correlation Matrix", 145 | text: "The correlation matrix will open to the left. Each monitor-monitor comparison is represented by an ellipse. The eccentricity (flatness) of the ellipse represents the correlation between the monitors. (Flatter equals more correlation), the color of the ellipse represents the average relative difference between the monitors, and the number inside the ellipse is the distance, in kilometers, between the two monitors.", 146 | target: "#cormatFloater", 147 | position: "right", 148 | runafter: netAssess.floaters.cormat.close 149 | }); 150 | 151 | netAssess.tour.makeSlide({title: "Exceedance Probabilities", 152 | text: "Exceedance Probabilities have been calculated for ozone and PM2.5. This information is available by census tract for all of the continental United States. You can view this information on the map by turning on the 'Ozone Probability' or 'PM2.5 Probability' layers from the Layers Control. The PM2.5 probability layer is currently displayed. Notice that the legend has added a scale describing what the colors represent.", 153 | target: ".leaflet-control-layers-toggle", 154 | position: "right", 155 | runbefore: function() {netAssess.map.addLayer(netAssess.overlays.pm25)}, 156 | runafter: function() {netAssess.map.removeLayer(netAssess.overlays.pm25)} 157 | }) 158 | 159 | netAssess.tour.makeSlide({title: "Removal Bias", 160 | text: "The removal bias tool finds the nearest neighbors to each selected monitor and then uses the concentrations at that those sites to interpolate the concentration at the monitoring site using an inverse distance weighted average. It then compares that interpolation to the actual concentrations measured at the site. If there is little difference (low bias) that may indicate that the monitor is redundant and could be removed. This tool is only available for:
  • 44201 - OZONE
  • 88101 - PM2.5 - LOCAL CONDITIONS
  • 88502 - ACCEPTABLE PM2.5 AQI & SPECIATION MASS
.", 161 | target: "#rembiasButton", 162 | position: "below", 163 | runbefore: function() { 164 | $("#rembiasButton").trigger("click"); 165 | } 166 | }) 167 | netAssess.tour.makeSlide({title: "Removal Bias", 168 | text: "Once the tool has run, the sites with data available will become larger and colored differently. The color represents the mean removal bias calculated for that site. Shades of red represent positive bias, while blues represent negative bias. The darker the color, the more removal bias. Refer to the legend for interpretation of the colors. Clicking on a site will open a popup that gives more information about the removal bias at that location." 169 | }) 170 | 171 | netAssess.tour.makeSlide({title: "Zoom to Area of Interest", 172 | text: "This button can be used to zoom in to your area of interest, once you have defined one.", 173 | target: "#aoiZoomButton", 174 | position: "below" 175 | }) 176 | 177 | netAssess.tour.makeSlide({title: "Navigation", 178 | text: "This button will zoom you out to view the entire continental United States.", 179 | target: "#fullExtentButton", 180 | position: "below" 181 | }) 182 | 183 | netAssess.tour.makeSlide({title: "Download Data", 184 | text: "All data calculated by the NetAssess app is available for download as csv files. Clicking this button will open a dialog where you can choose the data you want to download.", 185 | target: "#downloadDataButton", 186 | position: "below", 187 | runafter: netAssess.floaters.download.open 188 | }) 189 | 190 | netAssess.tour.makeSlide({title: "Download Data", 191 | text: "Click the download icon next to a data type to download that data. If the data type is greyed out that mean that you haven't made sufficient selections to generate that data yet.", 192 | target: "#downloadFloater", 193 | position: "below", 194 | runafter: netAssess.floaters.download.close 195 | }) 196 | 197 | 198 | netAssess.tour.makeSlide({title: "Reset App", 199 | text: "This button will reset the app to its beginning state. All calculated layers will be erased all selections will be removed, and all settings will be restored to their default.", 200 | target: "#resetAppButton", 201 | position: "below", 202 | }) 203 | 204 | netAssess.tour.makeSlide({title: "Settings", 205 | text: "There are several options you can set that will change aspects of how the NetAssess App will function. You can access these options in the Settings sidebar.", 206 | runbefore: function() {netAssess.sidebars.settings.show()} 207 | }) 208 | 209 | netAssess.tour.makeSlide({title: "Area Served", 210 | text: "By default, the area served tool clips the polygons it creates on the U.S. border. There may be times when you will want to clip the polygons on your area of interest (e.g. your state) or you may not want to clip at all. You can adjust that here.", 211 | target: "#areaServedSettings", 212 | position: "left" 213 | }) 214 | 215 | netAssess.tour.makeSlide({title: "Exceedance Probability", 216 | text: "For ozone, you can adjust what threshold the NetAssess App uses when calculating exceedance probability.", 217 | target: "#exceedanceProbabilitySettings", 218 | position: "left" 219 | }) 220 | 221 | netAssess.tour.makeSlide({title: "PM2.5 Options", 222 | text: "AQS Code 88101 can contain both Federal Reference Method (FRM) and Federal Equivalence Method (FEM) data. This setting lets you decide which data to use when calculating correlations.", 223 | target: "#pm25Settings", 224 | position: "left", 225 | runafter: function() {netAssess.sidebars.settings.hide()} 226 | }) 227 | 228 | netAssess.tour.makeSlide({title: "Conclusion", 229 | text: "This concludes the tour. If you feel we have left something out, please let us know.

You can check the 'Don't show again' box below to prevent this tour from opening automatically the next time you visit the app. You can always reopen it from the 'Help' sidebar to the right.", 230 | runbefore: function() {netAssess.resetApp()} 231 | }) 232 | 233 | $(document).ready(function() { 234 | 235 | var name = "showtour" 236 | var showTour = "true"; 237 | var ca = document.cookie.split(';'); 238 | for(var i=0; i < ca.length; i++) { 239 | var c = ca[i]; 240 | while (c.charAt(0)==' ') c = c.substring(1); 241 | if (c.indexOf(name) != -1) showTour = c.substring(name.length+1,c.length); 242 | } 243 | 244 | if(showTour == "true") { 245 | netAssess.tour.active = true; 246 | document.getElementById("tourGone").checked = false; 247 | } else { 248 | netAssess.tour.active = false; 249 | document.getElementById("tourGone").checked = true; 250 | } 251 | 252 | if(netAssess.tour.active) { 253 | netAssess.tour.advance() 254 | } 255 | 256 | }) 257 | 258 | netAssess.tour.setPosition = function(target, position) { 259 | 260 | var rect = $(target)[0].getBoundingClientRect(); 261 | 262 | var rect_center = {x: (rect.width / 2) + rect.left, 263 | y: (rect.height / 2) + rect.top 264 | } 265 | 266 | var arrowPos = { 267 | "left": "", 268 | "top": "", 269 | "display": "none", 270 | "border-left-color": "transparent", 271 | "border-top-color": "transparent", 272 | "border-right-color": "transparent", 273 | "border-bottom-color": "transparent" 274 | } 275 | 276 | switch(position) { 277 | case "center": 278 | var position = { 279 | top: rect_center.y - (netAssess.tour.height / 2), 280 | left: rect_center.x - (netAssess.tour.width / 2), 281 | display: "block" 282 | } 283 | arrowPos.top = ""; 284 | arrowPos.left = ""; 285 | arrowPos.display = "none"; 286 | var arrowBorderPos = {}; 287 | $.extend(arrowBorderPos, arrowPos); 288 | break; 289 | 290 | case "above": 291 | var position = { 292 | top: rect.top - (netAssess.tour.height + 15), 293 | left: rect_center.x - (netAssess.tour.width / 2), 294 | display: "block" 295 | }; 296 | arrowPos.top = netAssess.tour.height - 5; 297 | arrowPos.left = netAssess.tour.width / 2; 298 | arrowPos.display = "block"; 299 | arrowPos["border-top-color"] = "#EFEFEF"; 300 | var arrowBorderPos = {}; 301 | $.extend(arrowBorderPos, arrowPos); 302 | arrowBorderPos.top = arrowBorderPos.top + 2.5 303 | arrowBorderPos["border-top-color"] = "black"; 304 | break; 305 | 306 | case "below": 307 | var position = { 308 | top: rect.bottom + 15, 309 | left: rect_center.x - (netAssess.tour.width / 2), 310 | display: "block" 311 | }; 312 | arrowPos.top = -20; 313 | arrowPos.left = (netAssess.tour.width / 2) - 10; 314 | arrowPos.display = "block"; 315 | arrowPos["border-bottom-color"] = "#EFEFEF"; 316 | var arrowBorderPos = {}; 317 | $.extend(arrowBorderPos, arrowPos); 318 | arrowBorderPos.top = arrowBorderPos.top - 2.5 319 | arrowBorderPos["border-bottom-color"] = "black"; 320 | break; 321 | 322 | case "left": 323 | var position = { 324 | top: rect_center.y - (netAssess.tour.height / 2), 325 | left: rect.left - (netAssess.tour.width + 15), 326 | display: "block" 327 | } 328 | arrowPos.top = (netAssess.tour.height / 2) - 10; 329 | arrowPos.left = netAssess.tour.width - 5; 330 | arrowPos.display = "block"; 331 | arrowPos["border-left-color"] = "#EFEFEF"; 332 | var arrowBorderPos = {}; 333 | $.extend(arrowBorderPos, arrowPos); 334 | arrowBorderPos.left = arrowBorderPos.left + 2.5; 335 | arrowBorderPos["border-left-color"] = "black"; 336 | break; 337 | 338 | case "right": 339 | var position = { 340 | top: rect_center.y - (netAssess.tour.height / 2), 341 | left: rect.right + 15, 342 | display: "block" 343 | } 344 | arrowPos.top = (netAssess.tour.height / 2) - 10; 345 | arrowPos.left = -20; 346 | arrowPos.display = "block"; 347 | arrowPos["border-right-color"] = "#EFEFEF"; 348 | var arrowBorderPos = {}; 349 | $.extend(arrowBorderPos, arrowPos); 350 | arrowBorderPos.left = arrowBorderPos.left - 2.5; 351 | arrowBorderPos["border-right-color"] = "black"; 352 | break; 353 | 354 | default: 355 | console.log("Unrecognized 'position' to setPosition function.") 356 | } 357 | 358 | var w = window.innerWidth; 359 | var h = window.innerHeight; 360 | 361 | if(position.left < 0) { 362 | var offset_x = 5 + (position.left + netAssess.tour.width); 363 | } else if((position.left + netAssess.tour.width) > w) { 364 | var offset_x = 5 + ((position.left + netAssess.tour.width) - w); 365 | } else { 366 | var offset_x = 0; 367 | } 368 | 369 | position.left = parseInt(position.left - offset_x, 10) + "px"; 370 | arrowPos.left = parseInt(arrowPos.left + offset_x, 10) + "px"; 371 | arrowBorderPos.left = parseInt(arrowBorderPos.left + offset_x, 10) + "px"; 372 | 373 | if(position.top < 0) { 374 | var offset_y = 5 - position.top; 375 | } else if((position.top + netAssess.tour.height) > h) { 376 | var offset_y = (position.top + netAssess.tour.height) - h; 377 | } else { 378 | var offset_y = 0; 379 | } 380 | 381 | position.top = parseInt(position.top + offset_y, 10) + "px"; 382 | arrowPos.top = parseInt(arrowPos.top - offset_y, 10) + "px"; 383 | arrowBorderPos.top = parseInt(arrowBorderPos.top - offset_y, 10) + "px"; 384 | 385 | var $tour = $("#tour"); 386 | $tour.css(position); 387 | $tour.find(".tour-arrow").css(arrowPos); 388 | $tour.find(".tour-arrow-border").css(arrowBorderPos); 389 | 390 | } 391 | 392 | netAssess.tour.advance = function() { 393 | 394 | var tour = netAssess.tour; 395 | var $tour = $("#tour"); 396 | 397 | var cnt = tour.slideCount; 398 | 399 | if(cnt > 0) tour.slides[cnt - 1].runafter(); 400 | tour.slides[cnt].runbefore(); 401 | 402 | $tour.find(".header").html(tour.slides[cnt].title); 403 | $tour.find(".content")[0].scrollTop = 0; 404 | $tour.find(".content").html(tour.slides[cnt].text); 405 | tour.setPosition(tour.slides[cnt].target, tour.slides[cnt].position); 406 | 407 | 408 | 409 | tour.slideCount++ 410 | 411 | } 412 | 413 | netAssess.tour.close = function() { 414 | netAssess.tour.active = false; 415 | $("#tour").css("display", "none") 416 | $("*").off(".tour"); 417 | } 418 | 419 | $("#tourNext").on("click", function() { 420 | 421 | if(netAssess.tour.slideCount == netAssess.tour.slides.length - 1) { 422 | $("#tourNext").text("Close") 423 | } else { 424 | $("#tourNext").text("Next") 425 | } 426 | if(netAssess.tour.slideCount == netAssess.tour.slides.length) { 427 | netAssess.tour.close() 428 | } else { 429 | netAssess.tour.advance() 430 | } 431 | 432 | }) 433 | 434 | $("#tour .close").on("click", netAssess.tour.close); 435 | 436 | $("#tour #tourGone").on("click", function(e) { 437 | var d = new Date(); 438 | d.setTime(d.getTime() + (60*24*60*60*1000)); 439 | var expires = "expires="+d.toUTCString(); 440 | 441 | if(this.checked) { 442 | document.cookie = "showtour=false; " + expires 443 | } else { 444 | document.cookie = "showtour=true; " + expires 445 | } 446 | 447 | }) 448 | 449 | $("#openTour").on("click", function() { 450 | if(netAssess.tour.active == false) { 451 | netAssess.tour.slideCount = 0; 452 | netAssess.tour.active = true; 453 | netAssess.tour.advance(); 454 | netAssess.sidebars.help.hide(); 455 | } 456 | }) 457 | 458 | // Disabled the Next button until the page has a chance to load to avoid the 459 | // user clicking it too early and messing everything up... 460 | $("#tourNext").attr("disabled", true); 461 | $(document).ready(function() { 462 | setTimeout(function() {$("#tourNext").attr("disabled", false)}, 1500) 463 | }) --------------------------------------------------------------------------------