From e024953ebec2d9a581b00113f95d5b6f43fd0803 Mon Sep 17 00:00:00 2001 From: simon Date: Wed, 19 Aug 2020 17:00:08 +0300 Subject: [PATCH 001/294] simple web server added --- OsmAnd/AndroidManifest.xml | 1 + OsmAnd/assets/server/main.html | 238 +++++++ OsmAnd/res/layout/server_activity.xml | 51 ++ OsmAnd/res/values/strings.xml | 1 + OsmAnd/src/androidhttpweb/ServerActivity.java | 59 ++ OsmAnd/src/androidhttpweb/TinyWebServer.java | 614 ++++++++++++++++++ OsmAnd/src/appapis/queryfiles/AppApis.java | 134 ++++ .../plus/activities/MapActivityActions.java | 15 + 8 files changed, 1113 insertions(+) create mode 100644 OsmAnd/assets/server/main.html create mode 100644 OsmAnd/res/layout/server_activity.xml create mode 100644 OsmAnd/src/androidhttpweb/ServerActivity.java create mode 100644 OsmAnd/src/androidhttpweb/TinyWebServer.java create mode 100644 OsmAnd/src/appapis/queryfiles/AppApis.java diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml index e1508f6ba2..764a3402d4 100644 --- a/OsmAnd/AndroidManifest.xml +++ b/OsmAnd/AndroidManifest.xml @@ -408,6 +408,7 @@ + diff --git a/OsmAnd/assets/server/main.html b/OsmAnd/assets/server/main.html new file mode 100644 index 0000000000..db48cfbe30 --- /dev/null +++ b/OsmAnd/assets/server/main.html @@ -0,0 +1,238 @@ + + + + + + + + + BootsApp | Home + + + + + + + + + +
+
+
+

Company Inc.

+

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Ut unde quaerat consequatur?

+ Get Started +
+
+
+ +
+

Our Speciality

+
+
+ +

Device Compatible

+

Lorem ipsum dolor sit amet consectetur adipisicing elit. Illo, doloremque voluptatum. Ducimus.

+
+
+ +

Cloud Support

+

Lorem ipsum dolor sit amet consectetur adipisicing elit. Illo, doloremque voluptatum. Ducimus.

+
+
+ +

24/7 Call Support

+

Lorem ipsum dolor sit amet consectetur adipisicing elit. Illo, doloremque voluptatum. Ducimus.

+
+
+
+ +
+

Our Products

+ +
+
+ product-image +
+
+

Lorem ipsum dolor sit, amet consectetur adipisicing elit. Velit nobis officiis unde necessitatibus esse alias expedita quia doloremque assumenda. Cupiditate nam exercitationem voluptatem quidem ad dolore ullam aliquid culpa ducimus qui, ut dignissimos inventore veniam!

+
+
+
+
+

Lorem ipsum dolor sit, amet consectetur adipisicing elit. Velit nobis officiis unde necessitatibus esse alias expedita quia doloremque assumenda. Cupiditate nam exercitationem voluptatem !

+
+
+ product-image +
+
+
+
+ product-image +
+
+

Lorem ipsum dolor sit, amet consectetur adipisicing elit. Velit nobis officiis unde necessitatibus esse alias expedita quia doloremque assumenda. Cupiditate nam exercitationem voluptatem quidem ad dolore ullam aliquid culpa ducimus qui, ut dignissimos inventore veniam!

+
+
+ + +
+ +
+

Our Customers

+ +
+ +
+
+

Ready to get started

+ Try it for free
+
+
+ + + + + +
+
+
+ +
+
+ +
+
+ Follow us on + +
+ +
+ +
+   with   By Developers
+ 2018 © Developers.com
+ The images are taken from Unsplash.com to avoid copyright issues. +
+
+ + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/server_activity.xml b/OsmAnd/res/layout/server_activity.xml new file mode 100644 index 0000000000..51aa730efc --- /dev/null +++ b/OsmAnd/res/layout/server_activity.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 90990a2b78..bfe1b9cc85 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -11,6 +11,7 @@ Thx - Hardy --> + Web server In case of reverse direction Are you sure you want to close Plan route without saving? You will lose all changes. Street-level imagery diff --git a/OsmAnd/src/androidhttpweb/ServerActivity.java b/OsmAnd/src/androidhttpweb/ServerActivity.java new file mode 100644 index 0000000000..ee8a13223e --- /dev/null +++ b/OsmAnd/src/androidhttpweb/ServerActivity.java @@ -0,0 +1,59 @@ +package androidhttpweb; + +import android.net.TrafficStats; +import android.os.Bundle; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import net.osmand.plus.R; + +public class ServerActivity extends AppCompatActivity { + private boolean initialized = false; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.server_activity); + findViewById(R.id.Button01).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (!initialized) { + ((TextView) findViewById(R.id.TextView02)).setText("Click second button to deactivate server"); + initServer(); + } + } + }); + findViewById(R.id.Button03).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (initialized) { + ((TextView) findViewById(R.id.TextView02)).setText("Click first button to activate server"); + deInitServer(); + } + } + }); + } + + private void initServer() { + final String ip = "localhost"; + final int port = 9000; + final int THREAD_ID = 10000; + TrafficStats.setThreadStatsTag(THREAD_ID); + TinyWebServer.startServer(ip, port, "/web/public_html"); + TinyWebServer.object = ServerActivity.this; + } + + private void deInitServer() { + TinyWebServer.stopServer(); + initialized = false; + } + + @Override + protected void onDestroy() { + deInitServer(); + super.onDestroy(); + } +} diff --git a/OsmAnd/src/androidhttpweb/TinyWebServer.java b/OsmAnd/src/androidhttpweb/TinyWebServer.java new file mode 100644 index 0000000000..b71de2630f --- /dev/null +++ b/OsmAnd/src/androidhttpweb/TinyWebServer.java @@ -0,0 +1,614 @@ +/* + * The MIT License + * + * Copyright 2018 Sonu Auti http://sonuauti.com twitter @SonuAuti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package androidhttpweb; + +import android.net.TrafficStats; + +import java.io.BufferedWriter; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.lang.reflect.Method; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLDecoder; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; +import java.util.regex.Pattern; + +/** + * + * @author Sonu Auti @cis + */ +public class TinyWebServer extends Thread { + + /** + * @param args the command line arguments + */ + private static ServerSocket serverSocket; + private final Map lowerCaseHeader = new HashMap<>(); + + public static String CONTENT_TYPE = "text/html"; + private String CONTENT_DATE = ""; + private String CONN_TYPE = ""; + private String Content_Encoding = ""; + private String content_length = ""; + private String STATUS = "200"; + private boolean keepAlive = true; + private String SERVER_NAME = "Firefly http server v0.1"; + private static final String MULTIPART_FORM_DATA_HEADER = "multipart/form-data"; + private static final String ASCII_ENCODING = "US-ASCII"; + private String REQUEST_TYPE = "GET"; + private String HTTP_VER = "HTTP/1.1"; + + //all status + public static String PAGE_NOT_FOUND = "404"; + public static String OKAY = "200"; + public static String CREATED = "201"; + public static String ACCEPTED = "202"; + public static String NO_CONTENT = "204"; + public static String PARTIAL_NO_CONTENT = "206"; + public static String MULTI_STATUS = "207"; + public static String MOVED_PERMANENTLY = "301"; + public static String SEE_OTHER = "303"; + public static String NOT_MODIFIED = "304"; + public static String TEMP_REDIRECT = "307"; + public static String BAD_REQUEST = "400"; + public static String UNAUTHORIZED_REQUEST = "401"; + public static String FORBIDDEN = "403"; + public static String NOT_FOUND = "404"; + public static String METHOD_NOT_ALLOWED = "405"; + public static String NOT_ACCEPTABLE = "406"; + public static String REQUEST_TIMEOUT = "408"; + public static String CONFLICT = "409"; + public static String GONE = "410"; + public static String LENGTH_REQUIRED = "411"; + public static String PRECONDITION_FAILED = "412"; + + public static String PAYLOAD_TOO_LARGE = "413"; + public static String UNSUPPORTED_MEDIA_TYPE = "415"; + public static String RANGE_NOT_SATISFIABLE = "416"; + public static String EXPECTATION_FAILED = "417"; + public static String TOO_MANY_REQUESTS = "429"; + + public static String INTERNAL_ERROR = "500"; + public static String NOT_IMPLEMENTED = "501"; + public static String SERVICE_UNAVAILABLE = "503"; + public static String UNSUPPORTED_HTTP_VERSION = "505"; + + public static final String CONTENT_DISPOSITION_REGEX = "([ |\t]*Content-Disposition[ |\t]*:)(.*)"; + + public static final Pattern CONTENT_DISPOSITION_PATTERN = Pattern.compile(CONTENT_DISPOSITION_REGEX, Pattern.CASE_INSENSITIVE); + + public static final String CONTENT_TYPE_REGEX = "([ |\t]*content-type[ |\t]*:)(.*)"; + + public static final Pattern CONTENT_TYPE_PATTERN = Pattern.compile(CONTENT_TYPE_REGEX, Pattern.CASE_INSENSITIVE); + + public static final String CONTENT_DISPOSITION_ATTRIBUTE_REGEX = "[ |\t]*([a-zA-Z]*)[ |\t]*=[ |\t]*['|\"]([^\"^']*)['|\"]"; + + public static final Pattern CONTENT_DISPOSITION_ATTRIBUTE_PATTERN = Pattern.compile(CONTENT_DISPOSITION_ATTRIBUTE_REGEX); + + public static final String CONTENT_LENGTH_REGEX = "Content-Length:"; + public static final Pattern CONTENT_LENGTH_PATTERN = Pattern.compile(CONTENT_LENGTH_REGEX, Pattern.CASE_INSENSITIVE); + + public static final String USER_AGENT = "User-Agent:"; + public static final Pattern USER_AGENT_PATTERN = Pattern.compile(USER_AGENT, Pattern.CASE_INSENSITIVE); + + public static final String HOST_REGEX = "Host:"; + public static final Pattern CLIENT_HOST_PATTERN = Pattern.compile(HOST_REGEX, Pattern.CASE_INSENSITIVE); + + public static final String CONNECTION_TYPE_REGEX = "Connection:"; + public static final Pattern CONNECTION_TYPE_PATTERN = Pattern.compile(CONNECTION_TYPE_REGEX, Pattern.CASE_INSENSITIVE); + + public static final String ACCEPT_ENCODING_REGEX = "Accept-Encoding:"; + public static final Pattern ACCEPT_ENCODING_PATTERN = Pattern.compile(ACCEPT_ENCODING_REGEX, Pattern.CASE_INSENSITIVE); + + private static final String CONTENT_REGEX = "[ |\t]*([^/^ ^;^,]+/[^ ^;^,]+)"; + + private static final Pattern MIME_PATTERN = Pattern.compile(CONTENT_REGEX, Pattern.CASE_INSENSITIVE); + + private static final String CHARSET_REGEX = "[ |\t]*(charset)[ |\t]*=[ |\t]*['|\"]?([^\"^'^;^,]*)['|\"]?"; + + private static final Pattern CHARSET_PATTERN = Pattern.compile(CHARSET_REGEX, Pattern.CASE_INSENSITIVE); + + private static final String BOUNDARY_REGEX = "[ |\t]*(boundary)[ |\t]*=[ |\t]*['|\"]?([^\"^'^;^,]*)['|\"]?"; + + private static final Pattern BOUNDARY_PATTERN = Pattern.compile(BOUNDARY_REGEX, Pattern.CASE_INSENSITIVE); + + + public static String WEB_DIR_PATH="/"; + public static String SERVER_IP="localhost"; + public static int SERVER_PORT=9000; + public static boolean isStart=true; + public static String INDEX_FILE_NAME="index.html"; + public static Object object; + + public TinyWebServer(final String ip, final int port) throws IOException { + + InetAddress addr = InetAddress.getByName(ip); ////"172.31.0.186"); + serverSocket = new ServerSocket(port, 100, addr); + serverSocket.setSoTimeout(5000); //set timeout for listner + + } + + @Override + public void run() { + + while (isStart) { + try { + TrafficStats.setThreadStatsTag(1); + Socket newSocket = serverSocket.accept(); + Thread newClient = new EchoThread(newSocket); + newClient.start(); + } catch (SocketTimeoutException s) { + } catch (IOException e) { + } + + }//endof Never Ending while loop + + } + + public class EchoThread extends Thread { + + protected Socket socket; + protected boolean nb_open; + + public EchoThread(Socket clientSocket) { + this.socket = clientSocket; + this.nb_open = true; + } + + @Override + public void run() { + + try { + DataInputStream in = null; + DataOutputStream out = null; + + if (socket.isConnected()) { + in = new DataInputStream(socket.getInputStream()); + out = new DataOutputStream(socket.getOutputStream()); + } + + byte[] data = new byte[1500]; + //socket.setSoTimeout(60 * 1000 * 5); + + while (in.read(data) != -1) { + String recData = new String(data).trim(); + //System.out.println("received data: \n" + recData); + //System.out.println("------------------------------"); + String[] header = recData.split("\\r?\\n"); + + String contentLen = "0"; + String contentType = "text/html"; + String connectionType = "keep-alive"; + String hostname = ""; + String userAgent = ""; + String encoding = ""; + + String[] h1 = header[0].split(" "); + if (h1.length == 3) { + setRequestType(h1[0]); + setHttpVer(h1[2]); + } + + for (int h = 0; h < header.length; h++) { + String value = header[h].trim(); + + //System.out.println(header[h]+" -> "+CONTENT_LENGTH_PATTERN.matcher(header[h]).find()); + if (CONTENT_LENGTH_PATTERN.matcher(value).find()) { + contentLen = value.split(":")[1].trim(); + } else if (CONTENT_TYPE_PATTERN.matcher(value).find()) { + contentType = value.split(":")[1].trim(); + } else if (CONNECTION_TYPE_PATTERN.matcher(value).find()) { + connectionType = value.split(":")[1].trim(); + } else if (CLIENT_HOST_PATTERN.matcher(value).find()) { + hostname = value.split(":")[1].trim(); + } else if (USER_AGENT_PATTERN.matcher(value).find()) { + for (String ua : value.split(":")) { + if (!ua.equalsIgnoreCase("User-Agent:")) { + userAgent += ua.trim(); + } + } + } else if (ACCEPT_ENCODING_PATTERN.matcher(value).find()) { + encoding = value.split(":")[1].trim(); + } + + } + + if (!REQUEST_TYPE.equals("")) { + String postData = ""; + if (REQUEST_TYPE.equalsIgnoreCase("POST") && !contentLen.equals("0")) { + postData = header[header.length - 1]; + if (postData.length() > 0 && contentLen.length() > 0) { + int len = Integer.valueOf(contentLen); + postData = postData.substring(0, len); + // System.out.println("Post data -> " + contentLen + " ->" + postData); + } + } + + // System.out.println("contentLen ->" + contentLen + "\ncontentType ->" + contentType + "\nhostname ->" + hostname + "\nconnectionType-> " + connectionType + "\nhostname ->" + hostname + "\nuserAgent -> " + userAgent); + final String requestLocation = h1[1]; + if (requestLocation != null) { + processLocation(out, requestLocation, postData); + } + //System.out.println("requestLocation "+requestLocation); + } + + } + } catch (Exception er) { + er.printStackTrace(); + } + + } + + } + + public void processLocation(DataOutputStream out, String location, String postData) { + + String data = ""; + switch (location) { + case "/": + //root location, server index file + CONTENT_TYPE = "text/html"; + data=readFile(WEB_DIR_PATH+"/"+INDEX_FILE_NAME); + constructHeader(out, data.length() + "", data); + break; + default: + + System.out.println("url location -> " + location); + URL geturl = getDecodedUrl("http://localhost" + location); + String[] dirPath = geturl.getPath().split("/"); + String fullFilePath=geturl.getPath(); + if (dirPath.length > 1) { + String fileName = dirPath[dirPath.length - 1]; + HashMap qparms = (HashMap) splitQuery(geturl.getQuery()); + if(REQUEST_TYPE.equals("POST")){ + if (qparms==null){ qparms=new HashMap();} + qparms.put("_POST", postData); + } + //System.out.println("File name " + fileName); + //System.out.println("url parms " + qparms); + CONTENT_TYPE = getContentType(fileName); + if(!CONTENT_TYPE.equals("text/plain")){ + // System.out.println("Full file path - >"+fullFilePath +" "+CONTENT_TYPE); + + if(CONTENT_TYPE.equals("image/jpeg") || CONTENT_TYPE.equals("image/png") || CONTENT_TYPE.equals("video/mp4")){ + byte[] bytdata=readImageFiles(WEB_DIR_PATH+fullFilePath,CONTENT_TYPE); + //System.out.println(bytdata.length); + if(bytdata!=null){ + constructHeaderImage(out, bytdata.length+"", bytdata); + }else{ + pageNotFound(); + } + }else{ + data=readFile(WEB_DIR_PATH+fullFilePath); + if(!data.equals("")){ + constructHeader(out, data.length() + "", data); + }else{ + pageNotFound(); + } + } + }else{ + data = getResultByName(fileName, qparms); + constructHeader(out, data.length() + "", data); + } + + + } + + } + + } + + public URL getDecodedUrl(String parms) { + try { + //String decodedurl =URLDecoder.decode(parms,"UTF-8"); + URL aURL = new URL(parms); + return aURL; + } catch (Exception er) { + } + return null; + } + + public static HashMap splitQuery(String parms) { + try { + final HashMap query_pairs = new HashMap<>(); + final String[] pairs = parms.split("&"); + for (String pair : pairs) { + final int idx = pair.indexOf("="); + final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair; + if (!query_pairs.containsKey(key)) { + query_pairs.put(key, ""); + } + final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null; + query_pairs.put(key, value); + } + return query_pairs; + } catch (Exception er) { + } + return null; + } + + public String getResultByName(String name, HashMap qparms) { + try { + String ClassName = "appapis.queryfiles.AppApis"; + Class rClass = Class.forName(ClassName); // convert string classname to class + Object obj = rClass.newInstance(); // invoke empty constructor + Method getNameMethod = obj.getClass().getMethod(name, HashMap.class); + STATUS = TinyWebServer.OKAY; + return getNameMethod.invoke(obj, qparms).toString(); + } catch (Exception er) { + // er.printStackTrace(); + return pageNotFound(); + } + } + + public void setRequestType(String type) { + // System.out.println("REQUEST TYPE " + type); + this.REQUEST_TYPE = type; + } + + public void setHttpVer(String httpver) { + // System.out.println("REQUEST ver " + httpver); + this.HTTP_VER = httpver; + } + + public String getRequestType() { + return this.REQUEST_TYPE; + } + + public String getHttpVer() { + return this.HTTP_VER; + } + + public String pageNotFound() { + STATUS = NOT_FOUND; + CONTENT_TYPE = "text/html"; + //customize your page here + return "" + + "Page not found | Firefly web server" + + "

Requested page not found

"; + } + + //hashtable initilization for content types + static Hashtable mContentTypes = new Hashtable(); + + { + mContentTypes.put("js", "application/javascript"); + mContentTypes.put("php", "text/html"); + mContentTypes.put("java", "text/html"); + mContentTypes.put("json", "application/json"); + mContentTypes.put("png", "image/png"); + mContentTypes.put("jpg", "image/jpeg"); + mContentTypes.put("html", "text/html"); + mContentTypes.put("css", "text/css"); + mContentTypes.put("mp4", "video/mp4"); + mContentTypes.put("mov", "video/quicktime"); + mContentTypes.put("wmv", "video/x-ms-wmv"); + + } + + //get request content type + public static String getContentType(String path) { + String type = tryGetContentType(path); + if (type != null) { + return type; + } + return "text/plain"; + } + + //get request content type from path + public static String tryGetContentType(String path) { + int index = path.lastIndexOf("."); + if (index != -1) { + String e = path.substring(index + 1); + String ct = mContentTypes.get(e); + // System.out.println("content type: " + ct); + if (ct != null) { + return ct; + } + } + return null; + } + + private void constructHeader(DataOutputStream output, String size, String data) { + SimpleDateFormat gmtFrmt = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss 'GMT'", Locale.US); + gmtFrmt.setTimeZone(TimeZone.getTimeZone("GMT")); + PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(output)), false); + pw.append("HTTP/1.1 ").append(STATUS).append(" \r\n"); + if (this.CONTENT_TYPE != null) { + printHeader(pw, "Content-Type", this.CONTENT_TYPE); + } + printHeader(pw, "Date", gmtFrmt.format(new Date())); + printHeader(pw, "Connection", (this.keepAlive ? "keep-alive" : "close")); + printHeader(pw, "Content-Length", size); + printHeader(pw, "Server", SERVER_NAME); + pw.append("\r\n"); + pw.append(data); + pw.flush(); + //pw.close(); + } + + private void constructHeaderImage(DataOutputStream output, String size, byte[] data) { + try{ + + SimpleDateFormat gmtFrmt = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss 'GMT'", Locale.US); + gmtFrmt.setTimeZone(TimeZone.getTimeZone("GMT")); + PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(output)), false); + pw.append("HTTP/1.1 ").append(STATUS).append(" \r\n"); + if (this.CONTENT_TYPE != null) { + printHeader(pw, "Content-Type", this.CONTENT_TYPE); + } + printHeader(pw, "Date", gmtFrmt.format(new Date())); + printHeader(pw, "Connection", (this.keepAlive ? "keep-alive" : "close")); + printHeader(pw, "Content-Length", size); + printHeader(pw, "Server", SERVER_NAME); + pw.append("\r\n"); + pw.flush(); + output.write(data); + output.flush(); + //System.out.println("data sent success"); + + //pw.close(); + }catch(Exception er){er.printStackTrace();} + + } + + + @SuppressWarnings("static-method") + protected void printHeader(PrintWriter pw, String key, String value) { + pw.append(key).append(": ").append(value).append("\r\n"); + } + + public byte[] readImageFiles(String fileName, String filetype){ + try{ + File ifile=new File(fileName); + if(ifile.exists()){ + if(filetype.equalsIgnoreCase("image/png") || filetype.equalsIgnoreCase("image/jpeg") || filetype.equalsIgnoreCase("image/gif") || filetype.equalsIgnoreCase("image/jpg")){ + FileInputStream fis = new FileInputStream(fileName); + byte[] buffer = new byte[fis.available()]; + while (fis.read(buffer) != -1) {} + fis.close(); + return buffer; + } + }else{ + + } + }catch(Exception er){} + return null; + } + public String readFile(String fileName){ + String content=""; + try{ + File ifile=new File(fileName); + if(ifile.exists()){ + FileInputStream fis = new FileInputStream(fileName); + byte[] buffer = new byte[10]; + StringBuilder sb = new StringBuilder(); + while (fis.read(buffer) != -1) { + sb.append(new String(buffer)); + buffer = new byte[10]; + } + fis.close(); + content = sb.toString(); + }else{ + pageNotFound(); + return content; + } + }catch(Exception er){ + pageNotFound(); + return ""; + } + return content; + } + + + public static void init(String ip, int port, String public_dir){ + + SERVER_IP=ip; + SERVER_PORT=port; + WEB_DIR_PATH=public_dir; + scanFileDirectory(); + + } + + public static void startServer(String ip, int port, String public_dir){ + try { + + isStart=true; + init(ip,port,public_dir); + Thread t = new TinyWebServer(SERVER_IP, SERVER_PORT); + t.start(); + System.out.println("Server Started !"); + + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + } + } + + public static void stopServer(){ + if(isStart){ + try{ + isStart=false; + serverSocket.close(); + System.out.println("Server stopped running !"); + }catch(IOException er){ + er.printStackTrace(); + } + } + } + + + //scan for index file + public static void scanFileDirectory(){ + boolean isIndexFound=false; + try{ + File file=new File(WEB_DIR_PATH); + if(file.isDirectory()){ + File[] allFiles=file.listFiles(); + for (File allFile : allFiles) { + //System.out.println(allFile.getName().split("\\.")[0]); + if(allFile.getName().split("\\.")[0].equalsIgnoreCase("index")){ + TinyWebServer.INDEX_FILE_NAME=allFile.getName(); + isIndexFound=true; + } + } + } + + }catch(Exception er){} + + if(!isIndexFound){ + System.out.println("Index file not found !"); + } + } + + /* //use for testing + public static void main(String[] args) { + try { + + Thread t = new TinyWebServer(SERVER_IP, SERVER_PORT); + t.start(); + System.out.println("Server Started !"); + + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + } + }*/ + +} diff --git a/OsmAnd/src/appapis/queryfiles/AppApis.java b/OsmAnd/src/appapis/queryfiles/AppApis.java new file mode 100644 index 0000000000..30143abfc2 --- /dev/null +++ b/OsmAnd/src/appapis/queryfiles/AppApis.java @@ -0,0 +1,134 @@ +/* + * The MIT License + * + * Copyright 2018 Sonu Auti http://sonuauti.com twitter @SonuAuti + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package appapis.queryfiles; + + +import android.widget.Toast; + +import org.apache.commons.compress.utils.IOUtils; + +import androidhttpweb.ServerActivity; +import androidhttpweb.TinyWebServer; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Scanner; + + +/** + * + * @author cis + */ +public class AppApis { + + public AppApis(){ + } + + public String helloworld(HashMap qparms){ + //demo of simple html webpage from controller method + TinyWebServer.CONTENT_TYPE="text/html"; + return "Simple HTML and Javascript Demo\n" + + " \n" + + " \n" + + " \n" + + "

Say Hello !

\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + "
\n" + + " "; + } + + public String simplejson(HashMap qparms){ + //simple json output demo from controller method + String json = "{\"name\":\"sonu\",\"age\":29}"; + return json.toString(); + } + + public String simplegetparm(HashMap qparms){ + /* + qparms is hashmap of get and post parameter + + simply use qparms.get(key) to get parameter value + user _POST as key for post data + e.g to get post data use qparms.get("_POST"), return will be post method + data + */ + + System.out.println("output in simplehelloworld "+qparms); + String p=""; + if(qparms!=null){ + p=qparms.get("age")+""; + } + String json = "{\"name\":\"sonu\",\"age\":"+p+",\"isp\":yes}"; + return json.toString(); + } + + public String main(HashMap qparams){ + TinyWebServer.CONTENT_TYPE="text/html"; + final ServerActivity act = ((ServerActivity)(TinyWebServer.object)); + InputStream stream = null; + try { + stream = act.getAssets().open("server/main.html"); + } catch (IOException e) { + e.printStackTrace(); + } + Scanner s = new Scanner(stream).useDelimiter("\\A"); + String result = s.hasNext() ? s.next() : ""; + return result; + } + + public String button1Click(HashMap qparams){ + try { + final ServerActivity act = ((ServerActivity)(TinyWebServer.object)); + act.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(act,"Hello from btn1",Toast.LENGTH_LONG).show(); + } + }); + } + catch (Exception e){ + e.printStackTrace(); + } + TinyWebServer.CONTENT_TYPE="text/html"; + return ""; + } + + + public String button2Click(HashMap qparams){ + return "cancel"; + } + //implement web callback here and access them using method name +} diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index 57c499407f..d5d6470556 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -36,6 +36,7 @@ import net.osmand.data.QuadRect; import net.osmand.data.RotatedTileBox; import net.osmand.map.ITileSource; import net.osmand.plus.dialogs.SpeedCamerasBottomSheet; +import androidhttpweb.ServerActivity; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter.ItemClickListener; @@ -1011,6 +1012,20 @@ public class MapActivityActions implements DialogProvider { }).createItem()); */ + optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.web_server, mapActivity) + .setId("SERVER_ID") + .setIcon(R.drawable.mm_shop_computer) + .setListener(new ItemClickListener() { + @Override + public boolean onContextMenuClick(ArrayAdapter adapter, int itemId, int pos, boolean isChecked, int[] viewCoordinates) { + app.logEvent("drawer_help_open"); + Intent intent = new Intent(mapActivity, ServerActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + mapActivity.startActivity(intent); + return true; + } + }).createItem()); + optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.shared_string_help, mapActivity) .setId(DRAWER_HELP_ID) .setIcon(R.drawable.ic_action_help) From b565450820e3592c9db4a683e9cf588b4a42c7f4 Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 20 Aug 2020 11:37:26 +0300 Subject: [PATCH 002/294] move to nanohttpd --- OsmAnd/AndroidManifest.xml | 2 +- OsmAnd/build.gradle | 1 + OsmAnd/src/androidhttpweb/ServerActivity.java | 59 -- OsmAnd/src/androidhttpweb/TinyWebServer.java | 614 ------------------ OsmAnd/src/appapis/queryfiles/AppApis.java | 134 ---- .../plus/activities/MapActivityActions.java | 1 - .../plus/activities/ServerActivity.java | 95 +++ .../osmand/plus/server/OsmAndHttpServer.java | 29 + 8 files changed, 126 insertions(+), 809 deletions(-) delete mode 100644 OsmAnd/src/androidhttpweb/ServerActivity.java delete mode 100644 OsmAnd/src/androidhttpweb/TinyWebServer.java delete mode 100644 OsmAnd/src/appapis/queryfiles/AppApis.java create mode 100644 OsmAnd/src/net/osmand/plus/activities/ServerActivity.java create mode 100644 OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java diff --git a/OsmAnd/AndroidManifest.xml b/OsmAnd/AndroidManifest.xml index 764a3402d4..e7f238c5ab 100644 --- a/OsmAnd/AndroidManifest.xml +++ b/OsmAnd/AndroidManifest.xml @@ -408,7 +408,7 @@ - + diff --git a/OsmAnd/build.gradle b/OsmAnd/build.gradle index e33b1ca75f..48d2895f25 100644 --- a/OsmAnd/build.gradle +++ b/OsmAnd/build.gradle @@ -542,6 +542,7 @@ dependencies { //implementation 'com.atilika.kuromoji:kuromoji-ipadic:0.9.0' implementation 'com.squareup.picasso:picasso:2.71828' implementation 'me.zhanghai.android.materialprogressbar:library:1.4.2' + implementation 'org.nanohttpd:nanohttpd:2.2.0' // JS core implementation group: 'org.mozilla', name: 'rhino', version: '1.7.9' // size restrictions diff --git a/OsmAnd/src/androidhttpweb/ServerActivity.java b/OsmAnd/src/androidhttpweb/ServerActivity.java deleted file mode 100644 index ee8a13223e..0000000000 --- a/OsmAnd/src/androidhttpweb/ServerActivity.java +++ /dev/null @@ -1,59 +0,0 @@ -package androidhttpweb; - -import android.net.TrafficStats; -import android.os.Bundle; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; - -import net.osmand.plus.R; - -public class ServerActivity extends AppCompatActivity { - private boolean initialized = false; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.server_activity); - findViewById(R.id.Button01).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (!initialized) { - ((TextView) findViewById(R.id.TextView02)).setText("Click second button to deactivate server"); - initServer(); - } - } - }); - findViewById(R.id.Button03).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (initialized) { - ((TextView) findViewById(R.id.TextView02)).setText("Click first button to activate server"); - deInitServer(); - } - } - }); - } - - private void initServer() { - final String ip = "localhost"; - final int port = 9000; - final int THREAD_ID = 10000; - TrafficStats.setThreadStatsTag(THREAD_ID); - TinyWebServer.startServer(ip, port, "/web/public_html"); - TinyWebServer.object = ServerActivity.this; - } - - private void deInitServer() { - TinyWebServer.stopServer(); - initialized = false; - } - - @Override - protected void onDestroy() { - deInitServer(); - super.onDestroy(); - } -} diff --git a/OsmAnd/src/androidhttpweb/TinyWebServer.java b/OsmAnd/src/androidhttpweb/TinyWebServer.java deleted file mode 100644 index b71de2630f..0000000000 --- a/OsmAnd/src/androidhttpweb/TinyWebServer.java +++ /dev/null @@ -1,614 +0,0 @@ -/* - * The MIT License - * - * Copyright 2018 Sonu Auti http://sonuauti.com twitter @SonuAuti - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package androidhttpweb; - -import android.net.TrafficStats; - -import java.io.BufferedWriter; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.lang.reflect.Method; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.SocketTimeoutException; -import java.net.URL; -import java.net.URLDecoder; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; -import java.util.regex.Pattern; - -/** - * - * @author Sonu Auti @cis - */ -public class TinyWebServer extends Thread { - - /** - * @param args the command line arguments - */ - private static ServerSocket serverSocket; - private final Map lowerCaseHeader = new HashMap<>(); - - public static String CONTENT_TYPE = "text/html"; - private String CONTENT_DATE = ""; - private String CONN_TYPE = ""; - private String Content_Encoding = ""; - private String content_length = ""; - private String STATUS = "200"; - private boolean keepAlive = true; - private String SERVER_NAME = "Firefly http server v0.1"; - private static final String MULTIPART_FORM_DATA_HEADER = "multipart/form-data"; - private static final String ASCII_ENCODING = "US-ASCII"; - private String REQUEST_TYPE = "GET"; - private String HTTP_VER = "HTTP/1.1"; - - //all status - public static String PAGE_NOT_FOUND = "404"; - public static String OKAY = "200"; - public static String CREATED = "201"; - public static String ACCEPTED = "202"; - public static String NO_CONTENT = "204"; - public static String PARTIAL_NO_CONTENT = "206"; - public static String MULTI_STATUS = "207"; - public static String MOVED_PERMANENTLY = "301"; - public static String SEE_OTHER = "303"; - public static String NOT_MODIFIED = "304"; - public static String TEMP_REDIRECT = "307"; - public static String BAD_REQUEST = "400"; - public static String UNAUTHORIZED_REQUEST = "401"; - public static String FORBIDDEN = "403"; - public static String NOT_FOUND = "404"; - public static String METHOD_NOT_ALLOWED = "405"; - public static String NOT_ACCEPTABLE = "406"; - public static String REQUEST_TIMEOUT = "408"; - public static String CONFLICT = "409"; - public static String GONE = "410"; - public static String LENGTH_REQUIRED = "411"; - public static String PRECONDITION_FAILED = "412"; - - public static String PAYLOAD_TOO_LARGE = "413"; - public static String UNSUPPORTED_MEDIA_TYPE = "415"; - public static String RANGE_NOT_SATISFIABLE = "416"; - public static String EXPECTATION_FAILED = "417"; - public static String TOO_MANY_REQUESTS = "429"; - - public static String INTERNAL_ERROR = "500"; - public static String NOT_IMPLEMENTED = "501"; - public static String SERVICE_UNAVAILABLE = "503"; - public static String UNSUPPORTED_HTTP_VERSION = "505"; - - public static final String CONTENT_DISPOSITION_REGEX = "([ |\t]*Content-Disposition[ |\t]*:)(.*)"; - - public static final Pattern CONTENT_DISPOSITION_PATTERN = Pattern.compile(CONTENT_DISPOSITION_REGEX, Pattern.CASE_INSENSITIVE); - - public static final String CONTENT_TYPE_REGEX = "([ |\t]*content-type[ |\t]*:)(.*)"; - - public static final Pattern CONTENT_TYPE_PATTERN = Pattern.compile(CONTENT_TYPE_REGEX, Pattern.CASE_INSENSITIVE); - - public static final String CONTENT_DISPOSITION_ATTRIBUTE_REGEX = "[ |\t]*([a-zA-Z]*)[ |\t]*=[ |\t]*['|\"]([^\"^']*)['|\"]"; - - public static final Pattern CONTENT_DISPOSITION_ATTRIBUTE_PATTERN = Pattern.compile(CONTENT_DISPOSITION_ATTRIBUTE_REGEX); - - public static final String CONTENT_LENGTH_REGEX = "Content-Length:"; - public static final Pattern CONTENT_LENGTH_PATTERN = Pattern.compile(CONTENT_LENGTH_REGEX, Pattern.CASE_INSENSITIVE); - - public static final String USER_AGENT = "User-Agent:"; - public static final Pattern USER_AGENT_PATTERN = Pattern.compile(USER_AGENT, Pattern.CASE_INSENSITIVE); - - public static final String HOST_REGEX = "Host:"; - public static final Pattern CLIENT_HOST_PATTERN = Pattern.compile(HOST_REGEX, Pattern.CASE_INSENSITIVE); - - public static final String CONNECTION_TYPE_REGEX = "Connection:"; - public static final Pattern CONNECTION_TYPE_PATTERN = Pattern.compile(CONNECTION_TYPE_REGEX, Pattern.CASE_INSENSITIVE); - - public static final String ACCEPT_ENCODING_REGEX = "Accept-Encoding:"; - public static final Pattern ACCEPT_ENCODING_PATTERN = Pattern.compile(ACCEPT_ENCODING_REGEX, Pattern.CASE_INSENSITIVE); - - private static final String CONTENT_REGEX = "[ |\t]*([^/^ ^;^,]+/[^ ^;^,]+)"; - - private static final Pattern MIME_PATTERN = Pattern.compile(CONTENT_REGEX, Pattern.CASE_INSENSITIVE); - - private static final String CHARSET_REGEX = "[ |\t]*(charset)[ |\t]*=[ |\t]*['|\"]?([^\"^'^;^,]*)['|\"]?"; - - private static final Pattern CHARSET_PATTERN = Pattern.compile(CHARSET_REGEX, Pattern.CASE_INSENSITIVE); - - private static final String BOUNDARY_REGEX = "[ |\t]*(boundary)[ |\t]*=[ |\t]*['|\"]?([^\"^'^;^,]*)['|\"]?"; - - private static final Pattern BOUNDARY_PATTERN = Pattern.compile(BOUNDARY_REGEX, Pattern.CASE_INSENSITIVE); - - - public static String WEB_DIR_PATH="/"; - public static String SERVER_IP="localhost"; - public static int SERVER_PORT=9000; - public static boolean isStart=true; - public static String INDEX_FILE_NAME="index.html"; - public static Object object; - - public TinyWebServer(final String ip, final int port) throws IOException { - - InetAddress addr = InetAddress.getByName(ip); ////"172.31.0.186"); - serverSocket = new ServerSocket(port, 100, addr); - serverSocket.setSoTimeout(5000); //set timeout for listner - - } - - @Override - public void run() { - - while (isStart) { - try { - TrafficStats.setThreadStatsTag(1); - Socket newSocket = serverSocket.accept(); - Thread newClient = new EchoThread(newSocket); - newClient.start(); - } catch (SocketTimeoutException s) { - } catch (IOException e) { - } - - }//endof Never Ending while loop - - } - - public class EchoThread extends Thread { - - protected Socket socket; - protected boolean nb_open; - - public EchoThread(Socket clientSocket) { - this.socket = clientSocket; - this.nb_open = true; - } - - @Override - public void run() { - - try { - DataInputStream in = null; - DataOutputStream out = null; - - if (socket.isConnected()) { - in = new DataInputStream(socket.getInputStream()); - out = new DataOutputStream(socket.getOutputStream()); - } - - byte[] data = new byte[1500]; - //socket.setSoTimeout(60 * 1000 * 5); - - while (in.read(data) != -1) { - String recData = new String(data).trim(); - //System.out.println("received data: \n" + recData); - //System.out.println("------------------------------"); - String[] header = recData.split("\\r?\\n"); - - String contentLen = "0"; - String contentType = "text/html"; - String connectionType = "keep-alive"; - String hostname = ""; - String userAgent = ""; - String encoding = ""; - - String[] h1 = header[0].split(" "); - if (h1.length == 3) { - setRequestType(h1[0]); - setHttpVer(h1[2]); - } - - for (int h = 0; h < header.length; h++) { - String value = header[h].trim(); - - //System.out.println(header[h]+" -> "+CONTENT_LENGTH_PATTERN.matcher(header[h]).find()); - if (CONTENT_LENGTH_PATTERN.matcher(value).find()) { - contentLen = value.split(":")[1].trim(); - } else if (CONTENT_TYPE_PATTERN.matcher(value).find()) { - contentType = value.split(":")[1].trim(); - } else if (CONNECTION_TYPE_PATTERN.matcher(value).find()) { - connectionType = value.split(":")[1].trim(); - } else if (CLIENT_HOST_PATTERN.matcher(value).find()) { - hostname = value.split(":")[1].trim(); - } else if (USER_AGENT_PATTERN.matcher(value).find()) { - for (String ua : value.split(":")) { - if (!ua.equalsIgnoreCase("User-Agent:")) { - userAgent += ua.trim(); - } - } - } else if (ACCEPT_ENCODING_PATTERN.matcher(value).find()) { - encoding = value.split(":")[1].trim(); - } - - } - - if (!REQUEST_TYPE.equals("")) { - String postData = ""; - if (REQUEST_TYPE.equalsIgnoreCase("POST") && !contentLen.equals("0")) { - postData = header[header.length - 1]; - if (postData.length() > 0 && contentLen.length() > 0) { - int len = Integer.valueOf(contentLen); - postData = postData.substring(0, len); - // System.out.println("Post data -> " + contentLen + " ->" + postData); - } - } - - // System.out.println("contentLen ->" + contentLen + "\ncontentType ->" + contentType + "\nhostname ->" + hostname + "\nconnectionType-> " + connectionType + "\nhostname ->" + hostname + "\nuserAgent -> " + userAgent); - final String requestLocation = h1[1]; - if (requestLocation != null) { - processLocation(out, requestLocation, postData); - } - //System.out.println("requestLocation "+requestLocation); - } - - } - } catch (Exception er) { - er.printStackTrace(); - } - - } - - } - - public void processLocation(DataOutputStream out, String location, String postData) { - - String data = ""; - switch (location) { - case "/": - //root location, server index file - CONTENT_TYPE = "text/html"; - data=readFile(WEB_DIR_PATH+"/"+INDEX_FILE_NAME); - constructHeader(out, data.length() + "", data); - break; - default: - - System.out.println("url location -> " + location); - URL geturl = getDecodedUrl("http://localhost" + location); - String[] dirPath = geturl.getPath().split("/"); - String fullFilePath=geturl.getPath(); - if (dirPath.length > 1) { - String fileName = dirPath[dirPath.length - 1]; - HashMap qparms = (HashMap) splitQuery(geturl.getQuery()); - if(REQUEST_TYPE.equals("POST")){ - if (qparms==null){ qparms=new HashMap();} - qparms.put("_POST", postData); - } - //System.out.println("File name " + fileName); - //System.out.println("url parms " + qparms); - CONTENT_TYPE = getContentType(fileName); - if(!CONTENT_TYPE.equals("text/plain")){ - // System.out.println("Full file path - >"+fullFilePath +" "+CONTENT_TYPE); - - if(CONTENT_TYPE.equals("image/jpeg") || CONTENT_TYPE.equals("image/png") || CONTENT_TYPE.equals("video/mp4")){ - byte[] bytdata=readImageFiles(WEB_DIR_PATH+fullFilePath,CONTENT_TYPE); - //System.out.println(bytdata.length); - if(bytdata!=null){ - constructHeaderImage(out, bytdata.length+"", bytdata); - }else{ - pageNotFound(); - } - }else{ - data=readFile(WEB_DIR_PATH+fullFilePath); - if(!data.equals("")){ - constructHeader(out, data.length() + "", data); - }else{ - pageNotFound(); - } - } - }else{ - data = getResultByName(fileName, qparms); - constructHeader(out, data.length() + "", data); - } - - - } - - } - - } - - public URL getDecodedUrl(String parms) { - try { - //String decodedurl =URLDecoder.decode(parms,"UTF-8"); - URL aURL = new URL(parms); - return aURL; - } catch (Exception er) { - } - return null; - } - - public static HashMap splitQuery(String parms) { - try { - final HashMap query_pairs = new HashMap<>(); - final String[] pairs = parms.split("&"); - for (String pair : pairs) { - final int idx = pair.indexOf("="); - final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair; - if (!query_pairs.containsKey(key)) { - query_pairs.put(key, ""); - } - final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null; - query_pairs.put(key, value); - } - return query_pairs; - } catch (Exception er) { - } - return null; - } - - public String getResultByName(String name, HashMap qparms) { - try { - String ClassName = "appapis.queryfiles.AppApis"; - Class rClass = Class.forName(ClassName); // convert string classname to class - Object obj = rClass.newInstance(); // invoke empty constructor - Method getNameMethod = obj.getClass().getMethod(name, HashMap.class); - STATUS = TinyWebServer.OKAY; - return getNameMethod.invoke(obj, qparms).toString(); - } catch (Exception er) { - // er.printStackTrace(); - return pageNotFound(); - } - } - - public void setRequestType(String type) { - // System.out.println("REQUEST TYPE " + type); - this.REQUEST_TYPE = type; - } - - public void setHttpVer(String httpver) { - // System.out.println("REQUEST ver " + httpver); - this.HTTP_VER = httpver; - } - - public String getRequestType() { - return this.REQUEST_TYPE; - } - - public String getHttpVer() { - return this.HTTP_VER; - } - - public String pageNotFound() { - STATUS = NOT_FOUND; - CONTENT_TYPE = "text/html"; - //customize your page here - return "" - + "Page not found | Firefly web server" - + "

Requested page not found

"; - } - - //hashtable initilization for content types - static Hashtable mContentTypes = new Hashtable(); - - { - mContentTypes.put("js", "application/javascript"); - mContentTypes.put("php", "text/html"); - mContentTypes.put("java", "text/html"); - mContentTypes.put("json", "application/json"); - mContentTypes.put("png", "image/png"); - mContentTypes.put("jpg", "image/jpeg"); - mContentTypes.put("html", "text/html"); - mContentTypes.put("css", "text/css"); - mContentTypes.put("mp4", "video/mp4"); - mContentTypes.put("mov", "video/quicktime"); - mContentTypes.put("wmv", "video/x-ms-wmv"); - - } - - //get request content type - public static String getContentType(String path) { - String type = tryGetContentType(path); - if (type != null) { - return type; - } - return "text/plain"; - } - - //get request content type from path - public static String tryGetContentType(String path) { - int index = path.lastIndexOf("."); - if (index != -1) { - String e = path.substring(index + 1); - String ct = mContentTypes.get(e); - // System.out.println("content type: " + ct); - if (ct != null) { - return ct; - } - } - return null; - } - - private void constructHeader(DataOutputStream output, String size, String data) { - SimpleDateFormat gmtFrmt = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss 'GMT'", Locale.US); - gmtFrmt.setTimeZone(TimeZone.getTimeZone("GMT")); - PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(output)), false); - pw.append("HTTP/1.1 ").append(STATUS).append(" \r\n"); - if (this.CONTENT_TYPE != null) { - printHeader(pw, "Content-Type", this.CONTENT_TYPE); - } - printHeader(pw, "Date", gmtFrmt.format(new Date())); - printHeader(pw, "Connection", (this.keepAlive ? "keep-alive" : "close")); - printHeader(pw, "Content-Length", size); - printHeader(pw, "Server", SERVER_NAME); - pw.append("\r\n"); - pw.append(data); - pw.flush(); - //pw.close(); - } - - private void constructHeaderImage(DataOutputStream output, String size, byte[] data) { - try{ - - SimpleDateFormat gmtFrmt = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss 'GMT'", Locale.US); - gmtFrmt.setTimeZone(TimeZone.getTimeZone("GMT")); - PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(output)), false); - pw.append("HTTP/1.1 ").append(STATUS).append(" \r\n"); - if (this.CONTENT_TYPE != null) { - printHeader(pw, "Content-Type", this.CONTENT_TYPE); - } - printHeader(pw, "Date", gmtFrmt.format(new Date())); - printHeader(pw, "Connection", (this.keepAlive ? "keep-alive" : "close")); - printHeader(pw, "Content-Length", size); - printHeader(pw, "Server", SERVER_NAME); - pw.append("\r\n"); - pw.flush(); - output.write(data); - output.flush(); - //System.out.println("data sent success"); - - //pw.close(); - }catch(Exception er){er.printStackTrace();} - - } - - - @SuppressWarnings("static-method") - protected void printHeader(PrintWriter pw, String key, String value) { - pw.append(key).append(": ").append(value).append("\r\n"); - } - - public byte[] readImageFiles(String fileName, String filetype){ - try{ - File ifile=new File(fileName); - if(ifile.exists()){ - if(filetype.equalsIgnoreCase("image/png") || filetype.equalsIgnoreCase("image/jpeg") || filetype.equalsIgnoreCase("image/gif") || filetype.equalsIgnoreCase("image/jpg")){ - FileInputStream fis = new FileInputStream(fileName); - byte[] buffer = new byte[fis.available()]; - while (fis.read(buffer) != -1) {} - fis.close(); - return buffer; - } - }else{ - - } - }catch(Exception er){} - return null; - } - public String readFile(String fileName){ - String content=""; - try{ - File ifile=new File(fileName); - if(ifile.exists()){ - FileInputStream fis = new FileInputStream(fileName); - byte[] buffer = new byte[10]; - StringBuilder sb = new StringBuilder(); - while (fis.read(buffer) != -1) { - sb.append(new String(buffer)); - buffer = new byte[10]; - } - fis.close(); - content = sb.toString(); - }else{ - pageNotFound(); - return content; - } - }catch(Exception er){ - pageNotFound(); - return ""; - } - return content; - } - - - public static void init(String ip, int port, String public_dir){ - - SERVER_IP=ip; - SERVER_PORT=port; - WEB_DIR_PATH=public_dir; - scanFileDirectory(); - - } - - public static void startServer(String ip, int port, String public_dir){ - try { - - isStart=true; - init(ip,port,public_dir); - Thread t = new TinyWebServer(SERVER_IP, SERVER_PORT); - t.start(); - System.out.println("Server Started !"); - - } catch (IOException e) { - e.printStackTrace(); - } catch (Exception e) { - } - } - - public static void stopServer(){ - if(isStart){ - try{ - isStart=false; - serverSocket.close(); - System.out.println("Server stopped running !"); - }catch(IOException er){ - er.printStackTrace(); - } - } - } - - - //scan for index file - public static void scanFileDirectory(){ - boolean isIndexFound=false; - try{ - File file=new File(WEB_DIR_PATH); - if(file.isDirectory()){ - File[] allFiles=file.listFiles(); - for (File allFile : allFiles) { - //System.out.println(allFile.getName().split("\\.")[0]); - if(allFile.getName().split("\\.")[0].equalsIgnoreCase("index")){ - TinyWebServer.INDEX_FILE_NAME=allFile.getName(); - isIndexFound=true; - } - } - } - - }catch(Exception er){} - - if(!isIndexFound){ - System.out.println("Index file not found !"); - } - } - - /* //use for testing - public static void main(String[] args) { - try { - - Thread t = new TinyWebServer(SERVER_IP, SERVER_PORT); - t.start(); - System.out.println("Server Started !"); - - } catch (IOException e) { - e.printStackTrace(); - } catch (Exception e) { - } - }*/ - -} diff --git a/OsmAnd/src/appapis/queryfiles/AppApis.java b/OsmAnd/src/appapis/queryfiles/AppApis.java deleted file mode 100644 index 30143abfc2..0000000000 --- a/OsmAnd/src/appapis/queryfiles/AppApis.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * The MIT License - * - * Copyright 2018 Sonu Auti http://sonuauti.com twitter @SonuAuti - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package appapis.queryfiles; - - -import android.widget.Toast; - -import org.apache.commons.compress.utils.IOUtils; - -import androidhttpweb.ServerActivity; -import androidhttpweb.TinyWebServer; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Scanner; - - -/** - * - * @author cis - */ -public class AppApis { - - public AppApis(){ - } - - public String helloworld(HashMap qparms){ - //demo of simple html webpage from controller method - TinyWebServer.CONTENT_TYPE="text/html"; - return "Simple HTML and Javascript Demo\n" + - " \n" + - " \n" + - " \n" + - "

Say Hello !

\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - "
\n" + - " "; - } - - public String simplejson(HashMap qparms){ - //simple json output demo from controller method - String json = "{\"name\":\"sonu\",\"age\":29}"; - return json.toString(); - } - - public String simplegetparm(HashMap qparms){ - /* - qparms is hashmap of get and post parameter - - simply use qparms.get(key) to get parameter value - user _POST as key for post data - e.g to get post data use qparms.get("_POST"), return will be post method - data - */ - - System.out.println("output in simplehelloworld "+qparms); - String p=""; - if(qparms!=null){ - p=qparms.get("age")+""; - } - String json = "{\"name\":\"sonu\",\"age\":"+p+",\"isp\":yes}"; - return json.toString(); - } - - public String main(HashMap qparams){ - TinyWebServer.CONTENT_TYPE="text/html"; - final ServerActivity act = ((ServerActivity)(TinyWebServer.object)); - InputStream stream = null; - try { - stream = act.getAssets().open("server/main.html"); - } catch (IOException e) { - e.printStackTrace(); - } - Scanner s = new Scanner(stream).useDelimiter("\\A"); - String result = s.hasNext() ? s.next() : ""; - return result; - } - - public String button1Click(HashMap qparams){ - try { - final ServerActivity act = ((ServerActivity)(TinyWebServer.object)); - act.runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText(act,"Hello from btn1",Toast.LENGTH_LONG).show(); - } - }); - } - catch (Exception e){ - e.printStackTrace(); - } - TinyWebServer.CONTENT_TYPE="text/html"; - return ""; - } - - - public String button2Click(HashMap qparams){ - return "cancel"; - } - //implement web callback here and access them using method name -} diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java index d5d6470556..e91a3d5201 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivityActions.java @@ -36,7 +36,6 @@ import net.osmand.data.QuadRect; import net.osmand.data.RotatedTileBox; import net.osmand.map.ITileSource; import net.osmand.plus.dialogs.SpeedCamerasBottomSheet; -import androidhttpweb.ServerActivity; import net.osmand.plus.settings.backend.ApplicationMode; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter.ItemClickListener; diff --git a/OsmAnd/src/net/osmand/plus/activities/ServerActivity.java b/OsmAnd/src/net/osmand/plus/activities/ServerActivity.java new file mode 100644 index 0000000000..c5081fa10c --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/activities/ServerActivity.java @@ -0,0 +1,95 @@ +package net.osmand.plus.activities; + +import android.content.Context; +import android.net.TrafficStats; +import android.os.Bundle; +import android.os.StrictMode; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import net.osmand.plus.R; +import net.osmand.plus.server.OsmAndHttpServer; + +import java.io.IOException; + +public class ServerActivity extends AppCompatActivity { + private boolean initialized = false; + private OsmAndHttpServer server; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + enableStrictMode(); + super.onCreate(savedInstanceState); + setContentView(R.layout.server_activity); + findViewById(R.id.Button01).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (!initialized) { + updateTextView("Click second button to deactivate server"); + initServer(); + } + } + }); + findViewById(R.id.Button03).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (initialized) { + updateTextView("Click first button to activate server"); + deInitServer(); + } + } + }); + } + + public static void enableStrictMode() { + StrictMode.setThreadPolicy( + new StrictMode.ThreadPolicy.Builder() + .detectDiskReads() + .detectDiskWrites() + .detectNetwork() + .penaltyLog() + .build()); + StrictMode.setVmPolicy( + new StrictMode.VmPolicy.Builder() + .detectLeakedSqlLiteObjects() + .penaltyLog() + .build()); + } + + + private void updateTextView(String text) { + ((TextView) findViewById(R.id.TextView02)).setText(text); + } + + private void initServer() { + final int THREAD_ID = 10000; + TrafficStats.setThreadStatsTag(THREAD_ID); + try { + server = new OsmAndHttpServer(); + initialized = true; + updateTextView("Server started at: http://" + OsmAndHttpServer.HOSTNAME + + ":" + OsmAndHttpServer.PORT); + } catch (IOException e) { + Toast.makeText(this, + e.getLocalizedMessage(), + Toast.LENGTH_SHORT).show(); + e.printStackTrace(); + } + } + + private void deInitServer() { + server.closeAllConnections(); + server.stop(); + initialized = false; + } + + @Override + protected void onDestroy() { + deInitServer(); + super.onDestroy(); + } +} diff --git a/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java b/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java new file mode 100644 index 0000000000..7ba670eac8 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java @@ -0,0 +1,29 @@ +package net.osmand.plus.server; + +import java.io.IOException; +import java.util.Map; + +import fi.iki.elonen.NanoHTTPD; + +public class OsmAndHttpServer extends NanoHTTPD { + public static int PORT = 24990; + public static String HOSTNAME = "0.0.0.0"; + + public OsmAndHttpServer() throws IOException { + super(HOSTNAME,PORT); + start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); + System.out.println("\nRunning! Point your browsers to http://localhost:8080/ \n"); + } + + @Override + public Response serve(IHTTPSession session) { + String msg = "

Hello server

\n"; + Map parms = session.getParms(); + if (parms.get("username") == null) { + msg += "
\n

Your name:

\n" + "
\n"; + } else { + msg += "

Hello, " + parms.get("username") + "!

"; + } + return newFixedLengthResponse(msg + "\n"); + } +} From cd312207b8945b58db061090be7168848bdcd9df Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 20 Aug 2020 13:58:35 +0300 Subject: [PATCH 003/294] nanoserver started --- OsmAnd/assets/server/go.html | 65 +++++++++++++ .../plus/activities/ServerActivity.java | 2 + .../src/net/osmand/plus/server/ApiRouter.java | 91 +++++++++++++++++++ .../osmand/plus/server/OsmAndHttpServer.java | 24 +++-- .../plus/server/ServerSessionHandler.java | 24 +++++ 5 files changed, 197 insertions(+), 9 deletions(-) create mode 100644 OsmAnd/assets/server/go.html create mode 100644 OsmAnd/src/net/osmand/plus/server/ApiRouter.java create mode 100644 OsmAnd/src/net/osmand/plus/server/ServerSessionHandler.java diff --git a/OsmAnd/assets/server/go.html b/OsmAnd/assets/server/go.html new file mode 100644 index 0000000000..d797f1083f --- /dev/null +++ b/OsmAnd/assets/server/go.html @@ -0,0 +1,65 @@ + + + + + + + + + + + OsmAnd - Offline Mobile Maps and Navigation + + + + + + + + + + + +
+
+ +
+
LAT
+
LON
+
+
+
+
+
+
+
+ + Get it on Google Play + +
+
+ +
+
+ + Get it on Amazon + +
+
+
+
+
+ + +
+ + \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/activities/ServerActivity.java b/OsmAnd/src/net/osmand/plus/activities/ServerActivity.java index c5081fa10c..1313c13f2c 100644 --- a/OsmAnd/src/net/osmand/plus/activities/ServerActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/ServerActivity.java @@ -11,6 +11,7 @@ import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.server.OsmAndHttpServer; @@ -70,6 +71,7 @@ public class ServerActivity extends AppCompatActivity { TrafficStats.setThreadStatsTag(THREAD_ID); try { server = new OsmAndHttpServer(); + server.setAndroidContext((OsmandApplication)this.getApplication()); initialized = true; updateTextView("Server started at: http://" + OsmAndHttpServer.HOSTNAME + ":" + OsmAndHttpServer.PORT); diff --git a/OsmAnd/src/net/osmand/plus/server/ApiRouter.java b/OsmAnd/src/net/osmand/plus/server/ApiRouter.java new file mode 100644 index 0000000000..bfd6e4581d --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/server/ApiRouter.java @@ -0,0 +1,91 @@ +package net.osmand.plus.server; + +import android.util.Log; + +import net.osmand.plus.OsmandApplication; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; + +import fi.iki.elonen.NanoHTTPD; + +import static fi.iki.elonen.NanoHTTPD.newFixedLengthResponse; + +public class ApiRouter { + private OsmandApplication androidContext; + + public OsmandApplication getAndroidContext() { + return androidContext; + } + + public void setAndroidContext(OsmandApplication androidContext) { + this.androidContext = androidContext; + } + + public NanoHTTPD.Response route(NanoHTTPD.IHTTPSession session) { + Log.d("SERVER", "URI: " + session.getUri()); + if (session.getUri().contains("/scripts/") || + session.getUri().contains("/images/") || + session.getUri().contains("/css/") || + session.getUri().contains("/favicon.ico") + ) { + return getStatic(session.getUri()); + } else { + return getGoHtml(); + } + } + + public NanoHTTPD.Response getStatic(String uri) { + InputStream is = null; + if (androidContext != null) { + try { + is = androidContext.getAssets().open("server" + uri); + if (is.available() == 0){ + return ErrorResponses.response404; + } + return newFixedLengthResponse( + NanoHTTPD.Response.Status.OK, + "text/plain", + is, + is.available()); + } catch (IOException e) { + return ErrorResponses.response500; + } + } + return ErrorResponses.response500; + } + + public NanoHTTPD.Response getGoHtml() { + String responseText = ""; + if (androidContext != null) { + try { + InputStream is = androidContext.getAssets().open("server/go.html"); + StringBuilder sb = new StringBuilder(); + BufferedReader br = new BufferedReader(new InputStreamReader(is, + Charset.forName("UTF-8"))); + String str; + while ((str = br.readLine()) != null) { + sb.append(str); + } + br.close(); + responseText = sb.toString(); + } catch (IOException e) { + return ErrorResponses.response500; + } + } + return newFixedLengthResponse(responseText); + } + + static class ErrorResponses { + static NanoHTTPD.Response response404 = + newFixedLengthResponse(NanoHTTPD.Response.Status.NOT_FOUND, + NanoHTTPD.MIME_PLAINTEXT, "404 Not Found"); + + static NanoHTTPD.Response response500 = + newFixedLengthResponse(NanoHTTPD.Response.Status.INTERNAL_ERROR, + NanoHTTPD.MIME_PLAINTEXT, "500 Internal Server Error"); + } +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java b/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java index 7ba670eac8..2c13732547 100644 --- a/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java +++ b/OsmAnd/src/net/osmand/plus/server/OsmAndHttpServer.java @@ -1,5 +1,7 @@ package net.osmand.plus.server; +import net.osmand.plus.OsmandApplication; + import java.io.IOException; import java.util.Map; @@ -9,21 +11,25 @@ public class OsmAndHttpServer extends NanoHTTPD { public static int PORT = 24990; public static String HOSTNAME = "0.0.0.0"; + private ServerSessionHandler sessionHandler = new ServerSessionHandler(); + private OsmandApplication androidContext; + + public OsmandApplication getAndroidContext() { + return androidContext; + } + + public void setAndroidContext(OsmandApplication androidContext) { + this.androidContext = androidContext; + sessionHandler.setAndroidContext(androidContext); + } + public OsmAndHttpServer() throws IOException { super(HOSTNAME,PORT); start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); - System.out.println("\nRunning! Point your browsers to http://localhost:8080/ \n"); } @Override public Response serve(IHTTPSession session) { - String msg = "

Hello server

\n"; - Map parms = session.getParms(); - if (parms.get("username") == null) { - msg += "
\n

Your name:

\n" + "
\n"; - } else { - msg += "

Hello, " + parms.get("username") + "!

"; - } - return newFixedLengthResponse(msg + "\n"); + return sessionHandler.handle(session); } } diff --git a/OsmAnd/src/net/osmand/plus/server/ServerSessionHandler.java b/OsmAnd/src/net/osmand/plus/server/ServerSessionHandler.java new file mode 100644 index 0000000000..a4d2a5f253 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/server/ServerSessionHandler.java @@ -0,0 +1,24 @@ +package net.osmand.plus.server; + +import net.osmand.plus.OsmandApplication; + +import fi.iki.elonen.NanoHTTPD; + +public class ServerSessionHandler { + private OsmandApplication androidContext; + + private ApiRouter router = new ApiRouter(); + + public OsmandApplication getAndroidContext() { + return androidContext; + } + + public void setAndroidContext(OsmandApplication androidContext) { + this.androidContext = androidContext; + router.setAndroidContext(androidContext); + } + + public NanoHTTPD.Response handle(NanoHTTPD.IHTTPSession session) { + return router.route(session); + } +} From 75934afc32da0b574abcb2dee3cb33dd412a7fb3 Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 20 Aug 2020 15:25:14 +0300 Subject: [PATCH 004/294] map added --- OsmAnd/assets/server/css/admin.css | 110 + OsmAnd/assets/server/css/report.css | 606 + OsmAnd/assets/server/css/site.css | 3322 +++++ OsmAnd/assets/server/css/slick.css | 117 + OsmAnd/assets/server/css/src/slick.less | 98 + OsmAnd/assets/server/css/src/source_site.css | 2176 ++++ OsmAnd/assets/server/css/src/style.less | 1693 +++ OsmAnd/assets/server/css/src/vars.less | 43 + OsmAnd/assets/server/css/style.css | 2 + .../server/images/amazon-apps-store.png | Bin 0 -> 4408 bytes .../assets/server/images/app-store-badge.png | Bin 0 -> 6734 bytes OsmAnd/assets/server/images/logo-grey.png | Bin 0 -> 4510 bytes OsmAnd/assets/server/scripts/blog.js | 86 + OsmAnd/assets/server/scripts/go.js | 242 + .../server/scripts/jquery-1.11.1.min.js | 4 + OsmAnd/assets/server/scripts/jquery-1.11.2.js | 10346 ++++++++++++++++ .../assets/server/scripts/jquery-3.1.0.min.js | 4 + .../assets/server/scripts/jquery.ellipsis.js | 38 + OsmAnd/assets/server/scripts/js.cookie.js | 165 + OsmAnd/assets/server/scripts/mapselector.js | 29 + OsmAnd/assets/server/scripts/poll.js | 35 + OsmAnd/assets/server/scripts/slick.min.js | 18 + OsmAnd/assets/server/scripts/slider.js | 129 + .../src/net/osmand/plus/server/ApiRouter.java | 14 +- 24 files changed, 19276 insertions(+), 1 deletion(-) create mode 100644 OsmAnd/assets/server/css/admin.css create mode 100644 OsmAnd/assets/server/css/report.css create mode 100644 OsmAnd/assets/server/css/site.css create mode 100644 OsmAnd/assets/server/css/slick.css create mode 100644 OsmAnd/assets/server/css/src/slick.less create mode 100644 OsmAnd/assets/server/css/src/source_site.css create mode 100644 OsmAnd/assets/server/css/src/style.less create mode 100644 OsmAnd/assets/server/css/src/vars.less create mode 100644 OsmAnd/assets/server/css/style.css create mode 100644 OsmAnd/assets/server/images/amazon-apps-store.png create mode 100644 OsmAnd/assets/server/images/app-store-badge.png create mode 100644 OsmAnd/assets/server/images/logo-grey.png create mode 100644 OsmAnd/assets/server/scripts/blog.js create mode 100644 OsmAnd/assets/server/scripts/go.js create mode 100644 OsmAnd/assets/server/scripts/jquery-1.11.1.min.js create mode 100644 OsmAnd/assets/server/scripts/jquery-1.11.2.js create mode 100644 OsmAnd/assets/server/scripts/jquery-3.1.0.min.js create mode 100644 OsmAnd/assets/server/scripts/jquery.ellipsis.js create mode 100644 OsmAnd/assets/server/scripts/js.cookie.js create mode 100644 OsmAnd/assets/server/scripts/mapselector.js create mode 100644 OsmAnd/assets/server/scripts/poll.js create mode 100644 OsmAnd/assets/server/scripts/slick.min.js create mode 100644 OsmAnd/assets/server/scripts/slider.js diff --git a/OsmAnd/assets/server/css/admin.css b/OsmAnd/assets/server/css/admin.css new file mode 100644 index 0000000000..d303e304cf --- /dev/null +++ b/OsmAnd/assets/server/css/admin.css @@ -0,0 +1,110 @@ +body { + margin:0; + padding:20px; + max-width: 1250px; +} + +table { + border-collapse: collapse; +} + +.send-private-giveaway, .register-giveaway, .access-server-logs, .update-btc-report { + margin: 20px 0px; + border: 1px solid #e6e6e6; + width: 50%; + +} +.wrapper { + list-style-type: none; + padding: 0; + border-radius: 3px; + +} +.form-row { + display: flex; + justify-content: flex-start; + align-items: flex-start; + padding: 5px; + text-align: left; +} + +.form-row > label { + flex: 1; +} +.form-row > input { + flex: 1; + width: auto; +} +.form-row > button { + flex: 1; +} + +th, td { + text-align: left; + padding: 8px; +} + +tr:nth-child(even){background-color: #f2f2f2} +tr:hover {background-color: #d5d5d5;} + +th { + background-color: #4CAF50; + color: white; +} +.loader, +.loader:before, +.loader:after { + border-radius: 50%; + width: 2.5em; + height: 2.5em; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation: load7 1.8s infinite ease-in-out; + animation: load7 1.8s infinite ease-in-out; +} +.loader { + color: #00ffff; + font-size: 10px; + margin: 25px auto; + position: relative; + text-indent: -9999em; + -webkit-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); + -webkit-animation-delay: -0.16s; + animation-delay: -0.16s; +} +.loader:before, +.loader:after { + content: ''; + position: absolute; + top: 0; +} +.loader:before { + left: -3.5em; + -webkit-animation-delay: -0.32s; + animation-delay: -0.32s; +} +.loader:after { + left: 3.5em; +} +@-webkit-keyframes load7 { + 0%, + 80%, + 100% { + box-shadow: 0 2.5em 0 -1.3em; + } + 40% { + box-shadow: 0 2.5em 0 0; + } +} +@keyframes load7 { + 0%, + 80%, + 100% { + box-shadow: 0 2.5em 0 -1.3em; + } + 40% { + box-shadow: 0 2.5em 0 0; + } +} \ No newline at end of file diff --git a/OsmAnd/assets/server/css/report.css b/OsmAnd/assets/server/css/report.css new file mode 100644 index 0000000000..fc1c412959 --- /dev/null +++ b/OsmAnd/assets/server/css/report.css @@ -0,0 +1,606 @@ +::-webkit-input-placeholder {color:#000;} +::-moz-placeholder {color:#000;} +:-moz-placeholder {color:#000;} +:-ms-input-placeholder {color:#000;} +h2, h3 { + font-size: 20px; +} +.nav-holder { + padding: 0 20px; + background: #ff8e01; +} +.navigation { + max-width: 1100px; + margin: 0 auto; +} +.navigation li { + margin-right: 30px; +} +.navigation a { + display: block; + padding: 30px 0; + color: rgba(255, 255, 255, 0.5); + font-size: 15px; + font-weight: bold; + text-decoration: none; + text-transform: uppercase; + border-bottom: 4px solid #ff8e01; + outline: none; +} +.navigation a:hover { + color: #fff; +} +.navigation li { + display: inline-block; + vertical-align: middle; +} +.navigation li.active a, +.navigation li.active a:focus, +.navigation li.active a:hover { + color: #fff; + border-bottom: 4px solid #4464ad; +} +#month-selection { + margin-bottom: 10px; +} +#region-selection { + margin-bottom: 10px; +} +.infobox { + font-size: 16px; + line-height: 150%; +} +.infobox h2 { + font-size: 33px; +} +.infobox h3 { + margin-top: 35px; + font-weight: bold; +} +.infobox ul { + list-style-type: disc; + list-style-position: inside; +} +.report-period-group { + padding: 20px; + background: #f2f2f2; +} +.report-period-group.supporters { + float: left; + width: 30%; + height: 120px; +} +.supporters-total { + float: right; + width: 70%; + height: 120px; + border: 1px solid #ddd; + border-left: 0 none; +} +.supporters-total-holder:after { + content: ''; + display: table; + clear: both; + float: none; +} +.report-group { + display: inline-block; + vertical-align: top; +} +.report-group.period { + width: 100%; + max-width: 250px; + margin-right: 40px; +} +.supporters .report-group.period { + margin-right: 0; +} +.report-group.region { + width: 100%; + max-width: 420px; +} +.styled-select { + position: relative; + width: 100%; + height: 42px; + overflow: hidden; + background: #fff; + border: 1px solid #ccc; + border-radius: 2px; +} +.styled-select:before { + z-index: 0; + content: ''; + position: absolute; + top: 10px; + left: 10px; + width: 20px; + height: 20px; + background: url('../images/main-sprite.png') no-repeat; +} +.styled-select:after { + z-index: 0; + content: ''; + position: absolute; + top: 12px; + right: 10px; + width: 20px; + height: 20px; + background: url('../images/main-sprite.png') no-repeat -200px -80px; +} +.report-group.period .styled-select:before { + background-position: -251px -110px; +} +.report-group.region .styled-select:before { + background-position: -290px -110px; +} +.report-group.round .styled-select:before { + background-position: -290px -110px; +} + +.styled-select select { + position: relative; + z-index: 1; + display: block; + width: 110%; + height: 42px; + padding: 10px 45px 10px 35px; + border: 0 none; + border-radius: 0; + background: transparent; + text-overflow: ellipsis; +} +select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #000; +} +.report-total-div { + border: 1px solid #e6e6e6; + border-top: 0 none; +} +.overview-body { + padding: 15px 15px 0; +} +.overview-hint { + font-weight: bold; + margin: 5px 0 20px; +} +.overview-hint span { + color: #484dde; +} +.overview { + position: relative; + display: inline-block; + vertical-align: top; + padding-left: 50px; + margin-right: 80px; + margin-bottom: 20px; + text-align: left; +} +.overview:last-child { + margin-right: 0; +} +.overview:before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 40px; + height: 40px; + background: url('../images/main-sprite.png') no-repeat; +} +.overview-changes:before { + background-position: -0px -280px; +} +.overview-users:before { + background-position: -40px -280px; +} +.overview-region:before { + background-position: -80px -280px; +} +.overview-active_supporters:before { + background-position: -40px -280px; +} +.overview-register_supporters:before { + background-position: -120px -280px; +} +.overview-btc:before { + background-position: -160px -280px; +} +.overview-total_weight:before { + background-position: -200px -280px; +} +.overview p { + margin: 0; + margin-bottom: -10px; + font-size: 30px; + font-weight: bold; + line-height: 1.2; +} +.overview span { + color: #999; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 2px; +} +#report-ranking, +#users-ranking, +#support-country-table-header, +#support-table-header, +#recipients-table-header { + margin-top: 50px; + font-size: 20px; +} +#report-ranking span { + display: block; + font-size: 13px; + font-weight: normal; + color: #999; + text-transform: uppercase; +} +.table { + font-size: 14px; +} +.table thead span { + display: block; + color: #999; + font-size: 11px; + text-transform: uppercase; +} +.table tbody tr td { + padding: 12px; + font-weight: bold; +} +.table-bordered > thead > tr > td, +.table-bordered > thead > tr > th { + vertical-align: middle; + border-bottom-color: #ff8f00; + font-weight: normal; +} +.table-controls.hidden { + display: none; +} +.table-controls { + position: relative; + padding-right: 185px; +} +.tc.search { + position: relative; +} +.tc.search:before { + content: ''; + position: absolute; + top: 10px; + left: 12px; + width: 20px; + height: 20px; + background: url('../images/main-sprite.png') no-repeat -300px -80px; +} +.tc.search input { + max-width: 350px; + height: 42px; + padding-left: 40px; + border-radius: 2px; +} +.tc.entries { + position: absolute; + top: 0; + right: 0; + width: 100%; + max-width: 180px; + font-size: 14px; +} +.tc.entries .styled-select { + display: inline-block; + vertical-align: middle; + width: 80px; +} +.tc.entries .styled-select:before { + content: none; +} +.tc.entries label { + display: block; + text-align: right; +} +.tc.entries select { + display: inline-block; + vertical-align: middle; + width: 125%; + padding: 10px 0 10px 10px; +} +.sorting_desc, +.sorting_asc, +.sorting { + position: relative; +} +.sorting_desc:after, +.sorting_asc:after { + content: '' !important; + position: absolute; + top: 50%; + right: 0; + width: 20px; + height: 20px; + background: url('../images/main-sprite.png') no-repeat; + transform: translate(0, -50%); +} +.sorting_asc:after { + background-position: -160px -140px; +} +.sorting_desc:after { + background-position: -200px -140px; +} +.sorting:after { + content: '' !important; + position: absolute; + top: 50%; + right: 0; + width: 20px; + height: 20px; + background: url('../images/main-sprite.png') no-repeat -180px -140px; + transform: translate(0, -50%); +} +.pagination > .active > a, +.pagination > .active > a:focus, +.pagination > .active > a:hover, +.pagination > .active > span, +.pagination > .active > span:focus, +.pagination > .active > span:hover { + background-color: #ff8f00; + border-color: #ff8f00; +} +.pagination > li > a, +.pagination > li > span { + color: #000; +} +.pagination > li > a:hover, +.pagination > li > span:hover { + background-color: rgba(255, 143, 0, 0.5); + border-color: #ff8f00; + color: #fff; +} +.registration { + display: inline-block; + vertical-align: top; + width: 49%; + min-height: 420px; + padding: 20px; + margin-top: 20px; + margin-right: 1%; + background: #f2f2f2; +} +.registration.contributor-registration { + margin-right: 0; +} +.registration h4 { + margin-top: 0; + font-size: 20px; +} +.recipient-registration label { + margin-top: 10px; + font-size: 14px; + font-weight: normal; +} +.recipient-registration .form-control { + margin: 0; + border-radius: 2px; + height: 42px; + padding-left: 40px; +} +.recipient-registration .input-holder { + position: relative; +} + +#agree_osm_live { + margin-left: 5px; + margin-top: 3px; +} +.agree_osm_live_label { + position: relative; + cursor: pointer; + font-size: 14px; + margin-left: 7px; + margin-bottom: 15px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +.recipient-registration .input-holder:before { + content: ''; + position: absolute; + top: 10px; + left: 12px; + width: 20px; + height: 20px; + background: url('../images/main-sprite.png') no-repeat; +} +.recipient-registration .input-holder.input-user:before { + background-position: -180px -80px; +} +.recipient-registration .input-holder.input-pass:before { + height: 21px; + background-position: -172px -109px; +} +.recipient-registration .input-holder.input-bitcoin:before { + background-position: -210px -110px; +} +.recipient-registration .input-hint { + color: #999; + line-height: 1.4; +} +.recipient-registration .btn, +.recipient-registration .btn:active { + background: #575bde; + border: 1px solid #3d42bf; + color: #fff; + font-weight: bold; +} +.registration-badges img { + border: none; + height: 45px; + margin-bottom: 20px; +} +.contributor-registration p { + font-size: 14px; + line-height: 1.4; +} +.contributor-registration .btc-address { + padding: 15px 10px; + margin-bottom: 10px; + background: #ff8f00; + border-radius: 2px; + color: #fff; + font-size: 14px; + font-weight: bold; +} +#recipients-info-div { + margin-top: 20px; + margin-bottom: 20px; +} +.maincontainer { + background-color: white; +} +.full-width-banner { + width: 100%; + margin: 20px auto; +} +.full-width-banner img { + display: block; + max-width: 100%; +} + +.vlabel { + font-size: 16px; + font-weight: bold; +} +.form-control { + margin-bottom: 10px; +} +.tab-content { + margin-top: 25px; +} +.container { + max-width: 1135px; + margin: 10px auto 50px; +} +#recipients-table td:nth-child(7) { + word-break: break-all; + padding: 8px 5px !important; +} +@media screen and (max-width: 1200px) { + .nav-holder .navigation{ + max-width: 940px; + } +} +@media screen and (max-width: 991px) { + .nav-holder .navigation{ + max-width: 720px; + } + .report-group.period { + max-width: 420px; + margin-right: 0; + } + .supporters-total .overview { + margin-right: 20px; + } +} +@media screen and (max-width: 770px) { + .report-period-group.supporters { + float: none; + width: 100%; + height: 120px; + } + .supporters-total { + float: none; + width: 100%; + height: auto; + border: 1px solid #ddd; + border-top: 0 none; + } + .supporters-total:after { + content: ''; + display: table; + clear: both; + float: none; + } + .registration { + width: 100%; + min-height: auto; + margin-right: 0; + margin-bottom: 20px; + } +} +@media screen and (max-width: 650px) { + #recipients-table th:nth-child(4), + #recipients-table td:nth-child(4), + #recipients-table th:nth-child(3), + #recipients-table td:nth-child(3) { + display: none; + } + .navigation li a, + .navigation li.active a, + .navigation li.active a:focus, + .navigation li.active a:hover { + border-bottom: 0 none; + padding: 15px 0; + } +} +@media screen and (max-width: 550px) { + .table { + font-size: 13px; + } + .table thead { + font-size: 11px; + } + .table thead span { + text-transform: lowercase; + } + .table th, + .table td { + padding: 8px 2px !important; + vertical-align: middle !important; + font-weight: normal !important; + text-align: center; + + } + .table th.sorting_asc:before, + .table th.sorting_desc:before { + content: ''; + position: absolute; + left: 50%; + margin-left: -2px; + border: 4px solid transparent; + } + .table th.sorting_asc:before { + bottom: 1px; + border-top-color: #ff8f00; + } + .table th.sorting_desc:before { + top: 1px; + border-bottom-color: #ff8f00; + } + .table th:after { + content: none !important; + } + .table-controls { + padding-right: 145px; + } + .tc.entries { + font-size: 12px; + } + .tc.entries span { + display: inline-block; + vertical-align: middle; + width: 30%; + text-align: center; + } + .contributor-registration .btc-address { + word-break: break-all; + } +} diff --git a/OsmAnd/assets/server/css/site.css b/OsmAnd/assets/server/css/site.css new file mode 100644 index 0000000000..a2a8ad5390 --- /dev/null +++ b/OsmAnd/assets/server/css/site.css @@ -0,0 +1,3322 @@ +@font-face { + font-family: 'Roboto Regular'; + src: url('/fonts/Roboto-Regular-webfont.eot'); + src: url('/fonts/Roboto-Regular-webfont.eot?#iefix') format('embedded-opentype'), + url('/fonts/Roboto-Regular-webfont.woff') format('woff'), + url('/fonts/Roboto-Regular-webfont.ttf') format('truetype'), + url('/fonts/Roboto-Regular-webfont.svg#robotoregular') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Roboto Bold'; + src: url('/fonts/Roboto-Bold-webfont.eot'); + src: url('/fonts/Roboto-Bold-webfont.eot?#iefix') format('embedded-opentype'), + url('/fonts/Roboto-Bold-webfont.woff') format('woff'), + url('/fonts/Roboto-Bold-webfont.ttf') format('truetype'), + url('/fonts/Roboto-Bold-webfont.svg#robotobold') format('svg'); + font-family: 'Roboto Bold'; + font-style: normal; + +} +* { + box-sizing: border-box; +} +html, body { + height: 100%; +} +body { + font-family: 'Roboto Regular', Arial, Helvetica, sans-serif; + font-size:1.1em; + line-height:1.5em; + margin:0; + padding:0; +} +ul li { + margin:0; + padding:0; +} +h1, h2 { + -webkit-margin-before:0; + -webkit-margin-after:0; + margin-top:0; + margin-bottom:0; + font-weight:400; + font-size:3em; + letter-spacing:.06em; + padding-top:25px; + padding-bottom:25px; + line-height:1em; +} + +b { + font-family: 'Roboto Bold'; +} + +xmp, pre { + white-space:pre-wrap; +} +a::-moz-focus-inner { + border: 0; +} +.tech-oh { + overflow: hidden; +} +.maincontainer { + width: 100%; + height: auto; + background-color: #fff; + transition: transform .5s; +} +.maincontainer.menu-open { + position: fixed; + -webkit-transform: translate(-300px, 0); + transform: translate(-300px, 0); + transition: transform .5s; +} + +.main { + position: relative; + min-height: 100%; + margin: 0 auto; +} +.downloads .question { + padding: 20px; + border: 1px solid #ddd; + margin-bottom: 20px; +} +.downloads .subtitle { + position: relative; + padding-bottom: 15px; + margin-bottom: 20px; + border-bottom: 4px solid #fb0; +} +.downloads .version-link { + text-decoration: none; +} +.downloads .version-num { + color: #000; + font-size: 34px; + font-family: 'Roboto Bold'; +} +.downloads .date-stamp { + display: block; + color: #999; + font-size: 14px; + font-weight: normal; +} +.downloads .download-btn { + position: absolute; + top: 0; + right: 0; + padding: 5px 15px; + background: #ff8f00; + color: #fff; + font-size: 14px; + font-family: 'Roboto Bold'; + text-decoration: none; +} +.downloads ul { + list-style-type: disc; +} + +.header { + position: relative; + color: #fff; +} +.header-map { + position: absolute; + top: 0; + bottom: 0; + width: 100%; + background: #ededed url('/images/header_image.jpg') center center no-repeat; + background-size: cover; +} + +.shadowline { + position: relative; + z-index: 15; + width:100%; + height:100px; + background:rgba(21, 29, 45, 0.77); +} + +.menu-wrapper { + position: relative; + width: 100%; + height: 100%; + max-width: 1170px; + margin: 0 auto; +} +.menu-wrapper a { + outline: none; +} + +.headertitle { + position:absolute; + bottom:-15px; + left:20%; + right:20%; + background:#fff; + border:2px solid; + border-radius:15px; +} +.headerlogo-link { + display: inline-block; + vertical-align: middle; + padding: 10px 40px 5px; +} +.headerlogo { + width: 176px; + height: 77px; + background: url('/images/logo.png') center center no-repeat; + background-size: 100%; +} +.header-caption { + position: relative; + z-index: 10; + max-width: 1195px; + margin: 0 auto; +} +.headertext { + margin: 169px 0 109px; + padding: 0 40px; + font-size:50px; + line-height:1.6em; + font-family: 'Roboto Bold'; + letter-spacing:.06em; + text-transform: uppercase; + text-shadow: 0 0 3px #333; +} +.headertext.new-year, +.headertext.black-friday { + position: relative; +} +.headertext.new-year:before, +.headertext.black-friday:before { + content: ''; + position: absolute; + top: -20px; + left: 700px; + width: 305px; + height: 195px; + background-size: 100%; +} +.headertext.black-friday:before { + background: url('/images/banner_discount.png') no-repeat center center; +} +.headertext.new-year:before { + background: url('/images/banner_new_year.png') no-repeat center center; +} +.menu { + position: absolute; + top: 50%; + right: -182px; + margin-top: -12px; + font-family: Verdana, Arial; + font-family: 'Roboto Bold'; + letter-spacing: .06em; + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + text-transform: uppercase; +} +.menu-hamburger { + display: none; + position: absolute; + top: 30px; + right: 30px; + padding: 20px; + background: url('/images/main-sprite.png') no-repeat -260px -60px; + cursor: pointer; +} +.menu .mobile-sign { + display: none; + padding-bottom: 35px; + margin-bottom: 10px; + color: #667580; + border-bottom: 1px solid; +} +.menu { + font-size: 0; +} +.menu li { + display: inline-block; + vertical-align: middle; + font-size: 18px; + letter-spacing: 1.05px; + padding-right:55px; +} +.menu li.mobile-only { + display: none; +} +.menu a:hover { + color: #ff8f00; +} + +.menu .activeitem a { + color: #ff8f00; +} + +.header .badges { + padding-bottom: 180px; +} +.badges { + padding: 0 40px; +} +.badges a { + display: inline-block; + vertical-align: middle; + margin-right: 10px; +} +.badges img { + height:45px; + border:none; +} +.header .blogbutton { + position:absolute; + top:30%; + right:12%; + height:280px; + width:280px; + background-color:#ff8f00; + color:#fff; + text-align:center; + font-family: 'Roboto Bold'; + max-width:20%; + overflow:hidden; + -webkit-border-radius:10px; + -moz-border-radius:10px; + border-radius:10px; +} + +.badges li.survey { + float:none; + padding-left:0; + line-height:120px; + clear:left; +} + +.badges .surveylink { + background-color:#ff8f00; + color:#fff; + border-radius:5px; + text-decoration:none; + padding:10px 20px; +} + +.header .five { + font-size:120pt; + line-height:130pt; +} + +.header .years { + font-size:28pt; + letter-spacing:.15em; +} + +.header .joinus { + font-size:14pt; + padding-top:17px; + text-decoration:underline; + letter-spacing:.3em; +} + +.simpleheader { + color: #fff; + background: url('/images/header_image.jpg') center top no-repeat; + background-size: cover; +} + +.simpleheader .headertext { + padding: 100px 40px 20px; + margin: 0; +} + +.custom_build_it { + position: relative; + min-height: 730px; + color: #fff; + background: url('/images/build_it_banner.jpg') center bottom no-repeat; + background-size: cover; +} + +.api_header_holder { + position: absolute; + bottom: 0; + left: 50%; + width: 100%; + max-width: 1270px; + -webkit-transform: translate(-44%, 0); + -moz-transform: translate(-44%, 0); + transform: translate(-44%, 0); +} + +.api_header_holder .header_img { + position: absolute; + left: 0; + bottom: 0; + width: 320px; + height: 520px; + background: url('/images/nexus_on_banner.png') 0 0 no-repeat; +} + +.api_header_holder .headertext { + margin: 0 0 185px 350px; + font-size: 80px; + font-weight: 400; + line-height: 1.2; + text-transform: none; +} +.api_main .acticlestitles { + max-width: 330px; +} +.api_main .article { + padding-right: 0; +} +.api-section { + padding-right: 20px; +} +.api_main .list-header { + font-family: 'Roboto Bold'; +} +.api_main .list { + margin-bottom: 30px; +} +.api_main .list li { + font-size: 0.9em; + position: relative; + padding-left: 16px; +} +.api_main .list li:before { + content: ''; + position: absolute; + top: 11px; + left: 0; + width: 3px; + height: 3px; + border-radius: 50%; + background: #ccc; +} +.api_main .highlighted-box { + padding: 20px 40px; + background: #f2f2f2; + border-radius: 5px; +} +.api_main .highlighted-box.sidebar-merge { + border-radius: 5px 0 0 5px; + margin-bottom: 65px; +} +.api_main .github-link { + display: inline-block; + vertical-align: middle; +} +.api_main .github-link:before { + content: ''; + display: inline-block; + vertical-align: middle; + width: 25px; + height: 25px; + margin-right: 10px; + background: url('/images/github-link-ico.jpg') no-repeat 0 0; +} +.sidebar-holder.api-demo { + border-radius: 0 5px 5px 0; +} +.sidebar-holder { + position: absolute; + width: 100%; +} +.sidebar-holder.api-sample { + border-radius: 5px; +} +.api-demo, +.api-sample { + background: #f2f2f2; + padding-bottom: 30px; +} +.api_main .api-demo h2, +.api_main .api-sample h2 { + font-size: 0.9em; + font-family: 'Roboto Bold'; + font-family: 'Roboto Bold'; + letter-spacing: 8px; + text-align: center; + text-transform: uppercase; +} +.api-demo .img-preview, +.api-sample .img-preview { + position: relative; + max-width: 285px; + height: 335px; + margin: 0 22px; +} +.api-demo .img-preview { + background: url('/images/api_phone_demo.png') no-repeat center top; + background-size: 100%; +} +.api-sample .img-preview { + background: url('/images/api_phone_sample.png') no-repeat center top; + background-size: 100%; +} +.api-demo .img-preview:before, +.api-sample .img-preview:before { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 80px; + background: -moz-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(242,242,242,1) 100%); + background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(242,242,242,1) 100%); + background: linear-gradient(to bottom, rgba(255,255,255,0) 0%,rgba(242,242,242,1) 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#f2f2f2',GradientType=0 ); +} +.api-download-btn { + display: block; + width: 170px; + height: 50px; + margin: 30px auto 0; +} +.google-play-demo { + background: url('/images/en-play-badge.png') no-repeat center center; + background-size: 100%; +} +.download-sample { + padding: 12px 0; + background: #f80; + border-radius: 5px; + color: #fff; + font-family: 'Roboto Bold'; + text-align: center; + text-transform: uppercase; + text-decoration: none; +} +.sidebar-merge .api-demo, +.sidebar-merge .api-sample { + display: none; +} +.specialevent +{ + position:relative; + background:#fff; + height:650px; +} + +.specialeventwrap +{ + width:900px; + position:absolute; + left:50%; + margin-top:-60px; +} + +.specialeventcontent +{ + position:relative; + left:-50%; + border-radius:15px; + background:#fff; +} + +.specialeventtext +{ + width:85%; + padding-top:20px; + overflow:hidden; + line-height:1.6em; + font-size:18px; + margin:0 auto; +} + +.specialeventtext p,.specialeventtext ul +{ + padding-bottom:10px; +} + +.specialeventtext .beforelist +{ + padding-bottom:0; + margin-bottom:5px; +} + +.specialeventtext.hidden +{ + color:#fff; + padding-bottom:60px; + width:900px; +} + +.specialevent .headertitletext +{ + letter-spacing:0; + font-family: 'Roboto Bold'; +} + +.headertitletext { + text-align:center; + color:#000; + line-height:1.6em; + font-size:22px; + padding:3px 0; +} + +.featurestitle { + padding:25px 40px; + text-align:center; +} + +.featurestitle p { + margin: 0; + color:#c1c1c1; + font-size:1.2em; +} + +.featurestitle h2 { + color:#ffa516; +} + +.featurescontainer { + position: relative; + max-width: 1100px; + margin: 50px auto; + font-size: 0; + text-align: center; +} + +.featureblock { + display: inline-block; + vertical-align: top; + width: 50%; + max-width: 520px; + min-height: 550px; + margin-top: 15px; + padding: 0 20px 30px; + font-size: 18px; + text-align: left; +} + + +.featureblocktitle { + position: relative; + min-height: 100px; + border-bottom: 6px solid #ff8f00; + margin-bottom: 40px; +} + + +.featureblocktitle h2 { + position: absolute; + top: 50%; + left: 0; + -webkit-transform: translate(0, -50%); + transform: translate(0, -50%); + max-width: 480px; + padding: 0 0 0 70px; + margin: 0; + font-size: 40px; + line-height: 1; +} +.featureblocktitle.feature-opensource h2 { + line-height: 1; +} +.featureblocktitle h2 .subheader { + display: block; + color: #737373; + font-size: 18px; +} +.featureblocktitle:before { + content: ''; + position: absolute; + top: 15px; + left: 0; + width: 60px; + height: 60px; + margin-right: 15px; + background: url('/images/main-sprite.png') no-repeat 0 0; +} +.featureblocktitle.feature-map:before { + background-position: -80px 0; +} +.featureblocktitle.feature-bike:before { + background-position: -160px 0; +} +.featureblocktitle.feature-opensource:before { + background-position: -240px 0; +} + +.featureblocktitle .warning { + color:#ff8f00; + font-size:.6em; + letter-spacing:0; +} + + + +.mapexample { + background: #fff; + position: relative; + padding-top: 20px; + padding-bottom: 20px; +} + +.mapcontainer { + position: relative; + background: url('/images/cycling-default.png') center center no-repeat; + height: 450px; + background-size: cover; + margin: 0 auto 40px; +} + +.selectbox { + position: absolute; + top: 20px; + right: 15%; + width: 157px; + padding:15px; + border-radius:5px; + background-color: #fff; +} +.selectbox .selecttitle { + padding: 19px 5px 6px; + color: #2196F3; + font-size: 14px; + font-family: 'Roboto Bold'; +} +.selectbox .selecttitle.first { + padding-top:2px; +} +.selectbox ul { + padding-left:0; + margin:0; +} +.selectbox ul li { + line-height:1.2em; + font-size:.6em; +} +.selectbox input { + padding-top:5px; + cursor:pointer; +} +.selectbox label { + cursor:pointer; +} + +.screenshots { + background: #fff; + position: relative; + overflow: hidden; + padding: 20px 40px 100px; +} + +.arrow +{ + cursor:pointer; + position:absolute; + top:50%; +} +.images.ios { + display: none; +} +.screenshots .screenshot { + padding: 0 15px; +} +.screenshot-preview-holder { + display: none; + z-index: 100; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100vh; + min-height: 100%; + background: rgba(255, 255, 255, .8); +} +.screenshot.in-preview { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} +.sliderheader { + position: relative; +} +.sliderheader h2 { + padding-bottom: 50px; +} +.sliderheader .switch { + position: absolute; + top: 25px; + right: 15px; + font-size: 0; + color: #fff; + text-align: center; + cursor: pointer; +} +.sliderheader .switch .button { + display: inline-block; + vertical-align: middle; + width: 105px; + padding: 15px; + background: #d4d4d4; + font-size: 18px; + text-align: center; +} +.switch .button:first-child { + border-radius: 8px 0 0 8px; +} +.switch .button:last-child { + border-radius: 0 8px 8px 0; +} + +.sliderheader .switch .button.active { + background-color:#ff8f00; +} +.slick-arrow { + position: absolute; + top: 50%; + width: 40px; + height: 55px; + border: 0 none; + font-size: 0; +} +.slick-arrow::-moz-focus-inner { + border: 0; +} +.slick-arrow:focus { + outline:0; +} +.slick-arrow.slick-prev { + left: -50px; + background: url('/images/main-sprite.png') no-repeat -80px -100px; +} +.slick-arrow.slick-next { + right: -50px; + background: url('/images/main-sprite.png') no-repeat -120px -100px; +} +.blogcontainerwrap { + background: #fff; + line-height: 1.7em; +} +.blogcontainer { + max-width: 1100px; + overflow: hidden; + padding-bottom: 20px; + margin: 0 auto; + font-size: 0; +} +.blogcontainer > div { + display: inline-block; + vertical-align: top; + width: 50%; + font-size: 18px; + padding: 0 40px; +} +.blogcontainer > div:first-child { + padding-right: 20px; +} +.blogcontainer > div:last-child { + padding-left: 150px; +} +.blogitem h3 +{ + font-size:1.2em; + color:#76B6F6; + font-weight:400; + margin:0; +} + +.blogitem p +{ + margin-top:5px; +} + +.blogitem .readmore +{ + text-align:left; + display:inline-block; + margin-bottom:40px; +} + +.blogitem .date +{ + float:right; + color:#9A9A9A; +} + +.imageholder +{ + text-align:center; + margin:10px; +} + +.imageholder img +{ + border:1px solid #ddd; + max-width:300px; + padding:10px; +} + +.articles .textlist +{ + margin-bottom:50px; +} + +.pds-box.osmand +{ + border-radius:0; +} + +.footer { + position: relative; + background-color: #292f33; +} +.footercontent { + padding: 25px 40px; + font-size: 0; +} + +.logoblock { + display: inline-block; + vertical-align: top; + width: 40%; + font-size: 18px; +} + +.menublock { + display: inline-block; + vertical-align: top; + width: 60%; + font-size: 18px; +} +.menublock .footerlinks { + display: inline-block; + vertical-align: top; + width: 48%; + max-width: 285px; + margin-right: 15px; + text-align: left; +} + +.footerlogo { + display: block; + width:200px; + height:77px; + background:url('/images/logo.png') center -10px no-repeat; + background-size: 100%; +} + +.footer .contactus { + display: inline-block; + padding: 15px 20px 15px 15px; + margin-top: 7px; + margin-right: 15px; + border: 1px solid #394247; + border-radius: 3px; + color: #fff; + font-size: 15px; + text-decoration: none; + outline: none; +} + +.footer .contactus:before { + content: ''; + display: inline-block; + vertical-align: baseline; + width: 20px; + height: 20px; + margin-right: 20px; + margin-bottom: -2px; + background: url('/images/main-sprite.png') no-repeat -160px -57px; +} + +.footerlinkstitle { + border-bottom: 1px solid #2f4445; + color: #698d8f; + font-size: .7em; + font-family: 'Roboto Bold'; + text-transform: uppercase; +} + +.footer ul { + padding-left: 0; + padding-bottom: 40px; + list-style-type: none; + font-size: .8em; +} + +.footer ul li { + line-height: 1.8em; +} + +.article-menu-wrapper { + position: relative; + z-index: 1000; + display: inline-block; + vertical-align: top; + width: 30%; + padding-top: 1em; + font-size: 18px; +} +.modal-menu-button { + display: none; + position: absolute; + z-index: 10; + top: 0; + right: 10px; + width: 40px; + height: 40px; + background: url('/images/main-sprite.png') no-repeat -40px -100px; + cursor: pointer; + transition: transform .5s; +} +.modal-menu-button.active { + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); + transition: transform .5s; +} +.article { + display: inline-block; + vertical-align: top; + width: 70%; + padding-right: 20px; + margin-top: 1em; + font-size: 18px; +} +.article h3 { + font-family: 'Roboto Bold'; + letter-spacing: 0.05em; + padding-top: 20px; + color: #333333; +} +.article h1, .article h2 { + letter-spacing: 0.04em; +} +.article p { + line-height: 1.7em; +} +.article a { + color: #454ade; +} +.article ul, article li { + margin:0; + padding:0; + padding-top: 15px; + padding-left:15px; + list-style-type:disc; + list-style-position: inside; +} + +.article > iframe { + max-width: 100%; +} +.article-menu { + background: #fff; +} +.articlelinklist { + font-size: 16px; +} +.articlelinklist a, +.articlelinklist a:visited { + color: #454ade; +} +.articlelinklist a:hover { + color: #ff8f00; +} +.articlelinklist a:before { + content: ''; + display: inline-block; + vertical-align: middle; + width: 3px; + height: 3px; + margin-right: 10px; + border-radius: 50%; + background: #b8b9de; +} + +.articles { + padding: 0 20px 40px; +} +.articlescontainer { + position: relative; + max-width: 1100px; + margin: 0 auto; + font-size: 0; +} +.acticlestitles { + max-width: 300px; + padding: 20px; + border:1px solid #e6e6e6; +} + +.acticlestitles h2 { + padding: 0 0 22px; + border-bottom: 4px solid #f80; + font-size:1.2em; + font-family: 'Roboto Bold'; + letter-spacing:.2em; + font-variant: small-caps; +} +.acticlestitles h2:not(:first-child) { + padding-top: 15px; +} + +.acticlestitles ul li { + padding: 10px 0 10px 10px; + border-bottom: 1px solid #e6e7ec; +} + +.acticlestitles ul li.last { + padding-bottom:0; +} + +.textlist { + padding-left: 30px; + list-style-type: disc; +} + +.textlist li { + padding-top: 10px; +} + +.article h1, +.article h2 { + font-size:34px; +} + +.article img { + max-width: 100%; +} + +.article .rightimage { + max-width: 450px; +} + +.article .centeredimageblog { + margin: 30px auto 0; + text-align: center; +} + + +.article .centeredimageblog img { + max-width: 300px; + padding: 10px; + margin-top: 10px; + margin-right: 10px; + margin-bottom: 20px; + border: 1px solid #ccc; +} + +.article .centeredimageblog.wide img { + width: auto; + height: 300px; +} + +.article .imageblog img { + max-width: 100%; + padding: 10px; + margin-top: 10px; + margin-right: 10px; + margin-bottom: 20px; +} + +/* Add style for new image block in blog */ +.article .blogimageblock { + margin: 30px auto 0; + text-align: center; + border-radius: 6px; + background-color: #fafafa; + border: 1px solid #e6e6e6; +} + +.article .blogimageblock img { + max-width: 300px; + padding: 10px; + margin-top: 20px; + margin-right: 10px; + margin-bottom: 20px; +} + + +.article .noborder img { + padding: 0; + border: none; +} + +.article .leftimage { + max-width: 200px; + padding: 10px; + border: 1px solid #ccc; +} + +.social_network_button { + display: inline-block; + vertical-align: middle; + line-height: 1em; +} + +.share_buttons .gplus { + max-width: 86px; +} + +.share_buttons { + max-width: 300px; + margin: 0 auto 21px; +} + +.fb +{ + padding:2px; +} + +.fb-like +{ + width:80px; +} + +.fb-like span,.fb-like iframe +{ + width:80px!important; + height:21px!important; +} + +.discount +{ + background:url(images/discount-badge.png) center top no-repeat; + background-size:contain; + position:absolute; + top:35%; + right:15%; + width:200px; + height:200px; +} + +.dvrlogo +{ + background:url(images/ic_dvr_mainicon.png) left top no-repeat; + background-size:contain; + width:80px; + height:80px; + margin:0 auto; +} + +.nearlogotext +{ + vertical-align:top; + display:inline-block; + padding:15px; +} + +.appstorebadge img +{ + width:100px; + display:block; + margin:0 auto; +} + +#map +{ + position:absolute; + top:65px; + bottom:50px; + width:100%; +} + + + +.whatyousay { + background: #ededed; + position: relative; + padding: 20px 40px; +} +.whatyousaycontainer .badgescontainer { + width: 100%; + max-width: 1100px; + margin: 20px auto; + text-align:center; + font-size: 0; +} +.whatyousayblock { + display: inline-block; + vertical-align: top; + width: 48.5%; + padding: 0 1%; + margin-bottom: 30px; + font-size: 18px; + text-align: left; +} +.whatyousaymessage { + position: relative; + max-width: 460px; + padding: 20px; + margin: 0 auto; + background-color: #fff; + border-radius: 7px; + box-shadow: 2px 2px 5px #cac8c3; + font-style: italic; + line-height: 1.5em; +} +.whatyousaymessage::before { + content: ''; + position: absolute; + left: 30px; + bottom: -20px; + width: 0; + height: 0; + border: 10px solid transparent; + border-top-color: #cac8c3; +} +.whatyousaymessage::after { + content: ''; + position: absolute; + left: 28px; + bottom: -21px; + width: 0; + height: 0; + border: 12px solid transparent; + border-top-color: #fff; +} +.whatyousayblock .signature { + max-width: 460px; + padding-left:10px; + margin: 20px auto 0; +} +.whatyousayblock .signature .source { + color:#9e9e9e; + font-size:.9em; + margin-top: 5px; +} +.mapexampleheader,.giveawayheader h2 { + padding: 25px 40px; +} + +.pluginscontainer .readmore { + color:#adadad; + text-decoration:none; + border-bottom:1px solid #d6d6d6; +} + +.pluginscontainer .readmore a { + color:#adadad; + text-decoration:none; +} + +.featurecontainer { + padding: 7px; + border: 1px solid #ededed; +} + +.featurecontainer.sub { + padding: 0; + margin-top: -1px; + font-size: 0; +} +.featurecontainer.sub:nth-child(2n+1) { + margin-bottom: 20px; +} + +.featurecontainer.last +{ + margin-top:30px; + margin-bottom:30px; +} + +.feature { + position:relative; + min-height:410px; +} + +.feature.firstusage { + background-image:url('/images/features/first_usage.jpg'); +} + +.feature.navigation { + background-image:url('/images/features/nav_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} + +.feature.profnavigation { + background-image:url('/images/features/prof_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} + +.feature.subscription { + background-image:url('/images/features/ol_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.measure-distance { + background-image:url('/images/features/distance_3.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.ruler { + background-image:url('/images/features/rul_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.quickaction { + background-image:url('/images/features/qa_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.tracker { + background-image:url('/images/features/features_osmand_tracker.jpg'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.favorites { + background-image:url('/images/features/fav_feat.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + } +.feature.markers { + background-image:url('/images/features/markers.jpg'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} +.feature.mapillary { + background-image:url('/images/features/mapillary.png'); + } +.feature.travel { + background-image:url('/images/features/travel.png'); +} + +.feature .description { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + max-width: 430px; + background-color: rgba(255,143,0,.9); + color: #fff; +} + +.feature .descriptioncontent { + position: relative; + padding: 40px; +} + +.feature h2 { + padding: 40px; + font-size: 34px; +} + +.feature .description p { + margin: 0 0 100px; + padding: 0 40px; +} + +.feature .readmore { + position: absolute; + left: 40px; + bottom: 40px; + border-bottom: 1px solid #fff; + color: #fff; + text-decoration: none; +} + +.subfeature { + display: inline-block; + vertical-align: top; + width: 50%; + font-size: 17px; +} +.subfeature:first-child { + border-right: 1px solid #ededed; +} + +.subfeaturecontent +{ + padding:25px 25px 25px 75px; +} + +.subfeature .subfeatureheader { + position: relative; + color: #619cd4; + font-size: 30px; + line-height: 1.2; +} + +.subfeature .text { + height: 110px; + overflow: hidden; + margin-bottom: 10px; + padding: 10px 20px 0 0; +} +.subfeature .text.lesslines { + height: 95px; +} + +.plugin { + position: relative; + display: inline-block; + vertical-align: top; + width: 48.5%; + min-height: 340px; + padding: 30px; + margin-bottom: 30px; + border: 1px solid #ededed; +} +.plugin:nth-child(even) { + margin-right: 2%; +} + +.plugin .pluginpicture { + height: 230px; + border:1px solid #ededed; + background-position: center center; + background-size: cover; +} + +.plugin h2 { + padding-bottom: 10px; + color: #5473ff; + font-size: 28px; + line-height: 40px; + letter-spacing: 0; +} + +.plugin .plugintext { + height: 100px; + margin-bottom: 60px; + overflow: hidden; +} + +.plugin .buttonscontainer { + position: absolute; + left: 30px; + right: 30px; + bottom: 30px; +} +.plugin .buttons { + font-size: 14px; +} + +.plugin .buttons .pricetype { + display: inline-block; + vertical-align: middle; + background-color:#ededed; + color:#9a9a9a; + font-family: 'Roboto Bold'; + padding:10px 15px; + margin-right: -6px; +} + +.plugin .buttons .readmore { + position: absolute; + top: 10px; + right: 0; + margin-top: 0; +} + +.plugin .buttons .getbutton { + display: inline-block; + vertical-align: middle; + padding: 10px 15px; + margin-right: 20px; + background-color: #7acc2e; +} + +.plugin .buttons .getbutton a { + color:#fff; + font-family: 'Roboto Bold'; + text-decoration:none; +} + +.plugin .buttons .getbutton a:visited { + color: #fff; + text-decoration: none; +} + +.featuresheader { + position: relative; + margin: 30px auto; + text-align: center; + overflow: hidden; +} +.featuresheader:before { + content: ''; + position: absolute; + z-index: 0; + top: 50%; + left: 0; + width: 100%; + height: 4px; + margin-top: -2px; + background: #ffba00; +} + +.featuresheader .featuresheadertext { + position: relative; + z-index: 1; + display: inline-block; + padding: 0 19px; + background: #fff; + font-family: 'Roboto Bold'; + letter-spacing: .3em; +} + +.plugin .onlinemaps { + background-image: url('/images/features/online_maps_main.png'); +} + +.plugin .contourlines { + background-image: url('/images/features/contour_lines_main.png'); +} + +.plugin .triprecordingtool { + background-image: url('/images/features/trip_recording_tool_main.png'); +} + +.plugin .skimaps { + background-image: url('/images/features/ski_maps_main.png'); +} + +.plugin .nauticalcharts { + background-image: url('/images/features/nautical_charts_main.png'); +} + +.plugin .audiovideo { + background-image: url('/images/features/audio_video_note_main.png'); +} + +.plugin .osmediting { + background-image: url('/images/features/osm_editing_main.png'); +} + +.plugin .measure-distance { + background-image: url('/images/features/distance_3.png'); +} + +.plugin .planningtool { + background-image: url('/images/features/planning_tool_main.png'); +} + +.plugin .parking { + background-image: url('/images/features/parking_main.png'); +} + +.plugin .development { + background-image: url('/images/features/development_main.png'); +} + +.subfeature .subfeatureheader:before { + content: ''; + position: absolute; + top: 0; + left: -50px; + width: 30px; + height: 30px; + background:url('/images/main-sprite.png') no-repeat 0 0; +} +.subfeature .install .subfeatureheader:before { + background-position: -5px -66px; +} +.subfeature .viewmap .subfeatureheader:before { + background-position: -45px -66px; +} +.subfeature .plantrip .subfeatureheader:before { + background-position: -85px -66px; +} + +.subfeature .search .subfeatureheader:before { + background-position: -125px -66px; +} + +.code { + font-style:italic; +} + +.list li { + padding-bottom:10px; + color:#000; +} + +.subtitle, +.subtitle h2 { + font-size:1.3em; + margin-top:10px; + font-family: 'Roboto Bold'; +} +.subtitle.mobile-subtitle { + display: none; +} + +.blocksubtitle { + margin-top: 10px; + margin-bottom: 15px; + font-size: 1.2em; + font-family: 'Roboto Bold'; +} + +.blocksubsubtitle { + margin-top: 10px; + font-size: 1.1em; + font-family: 'Roboto Bold'; +} + +.content { + padding:5px 15px 15px; +} + +.content ul { + padding-left:20px; +} + +.help h1 { + font-size:41px; + letter-spacing:.03em; + margin-top:20px; + margin-bottom:10px; +} + +.contributorsbanner { + width:100%; +} + +.about h3 +{ + margin-top:90px; +} + +.versions .version +{ + border:1px solid #e6e6e6; + padding:20px; +} + +.mainlist li +{ + border-bottom:1px solid #F3F3F3; + padding:15px; +} + +h1.sub +{ + background-color:#536DFE; + margin-top:0; +} + +h1.sub small +{ + display:block; + font-weight:400; + margin-top:5px; +} + +.toc .list li { + color: #d2d2d2; +} + +.toc .subtitle { + margin-bottom: 10px; + font-weight:400; +} + +.download { + width:24px; + height:24px; + padding-left:15px; + vertical-align:bottom; +} + +.imgcontainer +{ + margin:20px 30px; +} + +.legendcontainer +{ + margin:0; +} + +.clear +{ + clear:both; +} + +.disabled +{ + cursor:default; +} + +.osmlive h1 +{ + margin-top:30px; +} + +.osmlive h3 +{ + margin-top:50px; +} + +.osmlive .submenucontainer +{ + height:70px; + width:100%; + background-color:#ff8f00; + color:#fff; + overflow:hidden; +} + +.osmlive .submenu +{ + width:1100px; + padding-top:23px; + letter-spacing:.2em; + font-size:1em; + margin:0 auto; +} + +.osmlive .submenu li +{ + float:left; + padding-right:40px; +} + +.osmlive .tabcontent +{ + width:100%; + background-color:#fff; +} + +.osmlive .article ul +{ + list-style-type:disc; + padding-left:25px; +} + +.osmlive .article ul li +{ + padding-bottom:15px; +} + +.osmlive .formcontainer +{ + width:100%; + margin-top:30px; +} + +.osmlive .formcontainer .column +{ + background-color:#ededed; + width:470px; + padding:30px; +} + +.osmlive .formcontainer .column.left +{ + float:left; +} + +.osmlive input +{ + height:50px; + width:465px; + border:1px solid #d6d6d6; + font-size:1.1em; + padding-left:45px; + margin:5px 0; +} + +.osmlive .info +{ + color:#adadad; +} + +.osmlive .row +{ + margin-bottom:35px; + position:relative; +} + +.osmlive .column h3 +{ + margin-top:0; + margin-bottom:30px; +} + +.osmlive .textbox i +{ + position:absolute; + top:22px; + left:15px; + color:#9a9a9a; +} + +.osmlive .btn +{ + height:45px; + width:130px; + font-size:18px; + color:#fff; + font-family: 'Roboto Bold'; + border:none; + background-color:#619CD4; + border-radius:5px; + cursor:pointer; +} + +.osmlive form +{ + margin-bottom:0; +} + +.osmlive p +{ + line-height:2em; +} + +.osmlive .column p +{ + line-height:1.4em; + margin-top:5px; +} + +.osmlive .column h4 +{ + margin-bottom:0; + margin-top:40px; +} + +.osmlive .address +{ + background-color:#ff8f00; + color:#fff; + border-radius:5px; + width:440px; + margin-bottom:20px; + padding:10px 15px; +} + +.osmlive .googleplay +{ + height:50px; +} + +ul,.mainlist +{ + list-style-type:none; + margin:0; + padding:0; +} + +a,a:visited +{ + color:#454ade; +} + +.menu a,.footer .contactus a,.footer ul a +{ + color:#fff; + text-decoration:none; +} + +.badges li.first,.screenshots .first,.noleftpadding +{ + padding-left:0; +} + +.simpleheader .headercontent,.simpleheader .shadowlinecontent,.mapexampleheader,.giveawayheader,.footercontent { + max-width: 1100px; + margin: 0 auto; +} + +.simpleheader .shadowline,.screenshots .images,.sliderheader,.article .textandimagecontainer,.plugin .buttons,.osmlive .textbox +{ + position:relative; +} + +.specialeventtext .signature,.about .surname,.definition +{ + font-family: 'Roboto Bold'; +} + +.specialeventlist,.features .categorydescription +{ + list-style-type:disc; + padding-left:25px; + line-height:1.7em; +} + +.specialeventlist li,.features .categorydescription li,.mainlist li.last +{ + border-bottom:none; +} + +.slider,.whatyousaycontainer +{ + position:relative; + max-width:1100px; + margin:0 auto; +} + +.blogitem h3 a,.blogitem h3 a:visited,.acticlestitles ul a,.list li a +{ + text-decoration:none; +} + +.blogitem .readmore a,.articles .date +{ + color:#9A9A9A; +} + +.share_buttons .twitter,.share_buttons .fb +{ + width:100px; +} + +.plugin.odd,.osmlive .formcontainer .column.right +{ + float:right; +} + +.legend,.osmlive .article +{ + width:100%; +} + +.dvr-features { + position: relative; + overflow: hidden; + background: #fff; + padding-bottom: 80px; + padding-top: 40px; +} +.dvr-features h2 { + text-align: center; + color: rgb(255, 143, 0) +} +.dvr-featurescontent { + max-width: 1180px; + padding: 0 40px; + margin: 0 auto; + font-size: 0; +} +.dvr-features .column { + display: inline-block; + vertical-align: top; + width: 45%; +} +.dvr-features .column:first-of-type { + margin-right: 10%; +} +.dvr-features ul li { + border-bottom: 1px solid #efefef; + height: 50px; + font-size: 18px; +} +.dvr-features ul li:last-child { + border-bottom: none; +} +.dvr-features .column div { + height: 50px; + display: table; +} +.dvr-features span { + display: table-cell; + vertical-align: middle; +} +.dvr-features .column div:before { + content: ''; + width: 30px; + height: 30px; + display: inline-block; + margin: 10px 10px 0 0; + background: url('/images/main-sprite.png') no-repeat; +} +.dvr-features .column .ipad-supported:before { + background-position: -205px -165px; +} +.dvr-features .column .webserver:before { + background-position: -5px -247px; +} +.dvr-features .column .carmode:before { + background-position: -5px -165px; +} +.dvr-features .column .portrait-landscape:before { + background-position: -85px -205px; +} +.dvr-features .column .gpx:before { + background-position: -85px -165px; +} +.dvr-features .column .help:before { + background-position: -125px -165px; +} +.dvr-features .column .videogallery:before { + background-position: -285px -205px; +} +.dvr-features .column .favorites:before { + background-position: -45px -165px; +} +.dvr-features .column .photo:before { + background-position: -45px -205px; +} +.dvr-features .column .ios7:before { + background-position: -165px -165px; +} +.dvr-features .column .location-reading:before { + background-position: -245px -165px; +} +.dvr-features .column .password-protection:before { + background-position: -5px -205px; +} +.dvr-features .column .power-saving:before { + background-position: -125px -205px; +} +.dvr-features .column .recover-video-recording:before { + background-position: -165px -205px; +} +.dvr-features .column .simple-interface:before { + background-position: -205px -205px; +} +.dvr-features .column .subtitles:before { + background-position: -245px -205px; +} +.dvr-features .column .speedlimit:before { + background-position: -45px -245px; +} +.dvr-features .column .map-providers:before { + background-position: -285px -165px; +} + + +/**********************slider**************************/ +.slideswrapper { + position: relative; + padding: 50px 0; +} +.slides { + position: relative; + z-index: 1; + max-width: 440px; + margin: 0 auto; +} +.wrapper-image { + position: absolute; + z-index: 0; + top: 30px; + left: 50%; + margin-left: -308px; +} +.wrapper-image img{ + width: 616px; +} +.slick-dots { + position: absolute; + bottom: -50px; + width: 100%; + text-align: center; +} +.slick-dots li { + display: inline-block; + vertical-align: middle; + width: 9px; + height: 9px; + border-radius: 50%; + background: #aeaeae; + margin-right: 5px; +} +.slick-dots li.slick-active { + background: #ff8f00; +} +.slick-dots li button { + display: none; +} + +@media screen and (max-width: 1550px) { + .menu { + right: 0; + } + .headertext { + margin: 100px 0 70px; + } +} +@media screen and (max-width: 1420px) { + .api_header_holder { + -webkit-transform: translate(-50%, 0); + -moz-transform: translate(-50%, 0); + transform: translate(-50%, 0); + } +} +@media screen and (max-width: 1300px) { + .api_header_holder { + max-width: 870px; + } + .api_header_holder .header_img { + display: none; + } + .api_header_holder .headertext { + margin: 0 0 220px 0; + } +} +@media screen and (max-width: 1200px) { + .screenshots .screenshot { + padding: 0 2px; + } + .slick-arrow { + top: auto; + bottom: -60px; + } + .slick-arrow.slick-prev { + left: 20px; + } + .slick-arrow.slick-next { + right: 20px; + } + +} +@media screen and (min-width: 1100px) { + .featureblock:nth-child(2n) { + margin-left: 30px; + } + .featureblock:nth-child(2n-1) { + margin-right: 30px; + } +} +@media screen and (max-width: 1100px) { + .featureblock { + width: 100%; + max-width: 800px; + min-height: auto; + padding: 0 40px 30px; + } + .selectbox { + right: 20px; + width: 100%; + max-width: 450px; + padding: 15px; + } + .selectbox:after { + content: ''; + position: absolute; + top: 30px; + right: 20px; + width: 20px; + height: 20px; + background: url('/images/main-sprite.png') no-repeat -160px -80px; + transition: all .5s; + } + .selectbox.active:after { + transition: all .5s; + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); + } + .selectbox .selecttitle { + padding: 0; + color: #9e9e9e; + font-size: 13px; + font-weight: 400; + } + .selectbox .selecttitle.first { + padding-top: 0; + } + .selectbox .selecttitle:not(.first) { + display: none; + } + .selectbox .selecttitle .selected-map { + margin: 0; + color: #000; + font-size: 18px; + font-family: 'Roboto Bold'; + text-transform: uppercase; + } + .selectbox ul { + display: none; + padding-left:0; + margin:0; + } + .selectbox.active ul { + display: block; + } + .selectbox input { + padding-top:0px; + } + .theme-selector { + position: absolute; + right: 20px; + bottom: 5px; + } + ul.theme-selector li { + padding: 10px; + font-size: 14px; + } + .map-selector input, + .theme-selector input { + display: none; + } + .theme-selector label.active { + border-bottom: 1px dashed #ff8f00; + } + .map-selector { + padding-top: 25px; + } + ul.map-selector li { + margin-bottom: 15px; + font-size: 16px; + text-transform: uppercase; + } + ul.map-selector li:last-child { + margin-bottom: 0; + } + .logoblock { + width: 100%; + margin-bottom: 40px; + } + .logoblock:after { + content: ''; + display: table; + float: none; + clear: both; + } + .menublock { + width: 100%; + } + .menublock .footerlinks { + max-width: none; + } + .footerlogo { + float: left; + } + .footer .contactus { + float: right; + } + .subfeature .subfeatureheader { + font-size: 28px; + } + .dvr-features ul li { + font-size: 16px; + height: auto; + padding: 3px 0; + } + .headertext.black-friday:before { + left: auto; + right: 20px; + width: 240px; + } +} +.tab-content { + position: relative; +} +.loading { + display: none; + position: absolute; + top: 0; + left: 50%; + width: 60px; + height: 60px; + margin-left: -30px; + background: url('/images/spinner.gif') no-repeat center center; +} +.loading.active { + display: block; +} +@media screen and (max-width: 1075px) { + .menu-hamburger, + .menu .mobile-sign { + display: block; + } + .menu { + display: none; + top: 0; + right: 0; + width: 100%; + max-width: 300px; + height: 100vh; + padding: 20px 40px 0; + margin-top: 0; + background: #292f33; + -webkit-transform: translate(100%, 0); + transform: translate(100%, 0); + transition: all .5s; + overflow-x: hidden; + overflow-y: scroll; + } + .menu.active { + display: block; + } + .menu li { + display: block; + padding-top: 18px; + padding-bottom: 18px; + font-weight: 400; + } + .menu li.mobile-only { + display: block; + } + .custom_build_it { + min-height: 570px; + } + .api_header_holder { + max-width: 715px; + } + .api_header_holder .headertext { + margin: 0 0 170px 0; + font-size: 64px; + } + .api_main .api-demo h2, + .api_main .api-sample h2 { + letter-spacing: 5px; + } +} +@media screen and (max-width: 900px) { + .sliderheader h2, + .whatyousaycontainer h2, + .mapexampleheader h2, + .giveawayheader h2, + .blogcontainer h2 { + font-size: 30px; + } + .sliderheader .switch .button { + width: 75px; + padding: 10px; + background: #d4d4d4; + font-size: 14px; + } + .whatyousayblock { + width: 100%; + } + .blogcontainer > div { + width: 100%; + max-width: 800px; + } + .blogcontainer > div:first-child { + padding-right: 40px; + } + .blogcontainer > div:last-child { + padding-left: 40px; + } + /* CSS to restyle poll on main. Look at all those importants! */ + .blogcontainer .PDS_Poll .pds-box { + width: auto !important; + } + .blogcontainer .PDS_Poll .pds-box .pds-vote-button { + display: inline-block; + vertical-align: middle; + float: none !important; + } + .blogcontainer .PDS_Poll .pds-box .pds-links { + display: inline-block !important; + vertical-align: middle; + padding: 3px 25px !important; + margin-left: 10px; + background: #ff6d00; + border-radius: 5px; + line-height: 25px; + font-family: "Lucida Grande", Verdana, Arial; + } + .pds-view-results { + color: #fff !important; + text-decoration: none !important; + } + .pds-answer-group .pds-answer-input { + float: none !important; + display: inline-block !important; + vertical-align: middle; + } + .pds-answer-group .pds-input-label { + float: none !important; + display: inline-block !important; + vertical-align: middle; + width: auto !important; + } + .blogcontainer .PDS_Poll .pds-box .pds-links .pds-pd-link { + display: none !important; + } + .social-widgets { + display: none; + } + .article-menu-wrapper { + position: absolute; + top: -80px; + right: 0; + width: auto; + } + .sidebar-holder { + display: none; + } + .sidebar-merge .api-demo, + .sidebar-merge .api-sample { + display: block; + } + .api-section.sidebar-merge { + padding-right: 0; + } + .api-demo .img-preview, + .api-sample .img-preview { + margin: 0 auto; + } + .article-menu { + display: none; + } + .acticlestitles { + max-width: 350px; + } + .modal-menu-button { + display: block; + } + .article { + width: 100%; + padding-right: 0; + } + .toc { + display: none; + } + .subtitle.mobile-subtitle { + display: block; + padding-bottom: 10px; + border-bottom: 4px solid #ffbb00; + } + .question { + border-bottom: 1px solid #e6e7ec; + font-size: 12px; + } + .question .subtitle { + position: relative; + margin: 0; + padding: 10px 0 10px 30px; + color: #454ade; + font-weight: normal; + } + .question .subtitle:before { + content: ''; + position: absolute; + top: 14px; + left: 0; + width: 20px; + height: 20px; + background: url('/images/main-sprite.png') no-repeat -180px -62px; + } + .question.active .subtitle:before { + background-position: -200px -62px; + } + .question .content { + display: none; + padding-left: 30px; + font-size: 15px; + } + h3.help { + font-size: 15px; + } + h3.help a { + color: #454ade; + } + .downloads .question .subtitle { + border-bottom: 0 none; + padding: 10px 0 0px 30px + } + .map .content { + padding: 0; + } + .custom_build_it { + min-height: 470px; + } + .api_header_holder { + max-width: 580px; + } + .api_header_holder .headertext { + margin: 0 0 130px 0; + font-size: 50px; + } + .headertext.black-friday:before { + top: -100px; + } +} +@media screen and (max-width: 800px) { + .subfeature { + width: 100%; + } + .subfeature:first-child { + border-right: 0 none; + border-bottom: 1px solid #ededed; + } + .plugin { + width: 100%; + } + .plugin:nth-child(even) { + margin-right: 0; + } + .headertext.black-friday:before { + top: -130px; + width: 150px; + } +} +@media screen and (max-width: 650px) { + .headertext { + font-size: 30px; + margin: 100px 0 50px; + } + .header .badges { + padding-bottom: 80px; + } + .menu li { + padding-top: 10px; + padding-bottom: 10px; + font-size: 13px; + } + .menublock .footerlinks { + width: 45%; + margin-right: 1%; + } + .article-menu-wrapper { + top: -67px; + } + .wrapper-image { + display: none; + } + .dvr-features .column { + width: 100%; + margin-right: 0; + } +} +@media screen and (max-width: 580px) { + .custom_build_it { + min-height: 370px; + } + .api_header_holder { + max-width: 580px; + } + .api_header_holder .headertext { + margin: 0 0 95px 0; + font-size: 40px; + } +} +@media screen and (max-width: 550px) { + .headerlogo { + width: 120px; + } + .menu li { + padding-right: 35px; + } + .featurestitle h2 { + font-size: 2em; + } + .featureblocktitle:before { + top: 25px; + width: 40px; + height: 40px; + background: url('/images/main-sprite.png') no-repeat 0 0; + background-size: 205px; + } + .featureblocktitle.feature-map:before { + background-position: -51px 0; + } + .featureblocktitle.feature-bike:before { + background-position: -102px 0; + } + .featureblocktitle.feature-opensource:before { + background-position: -153px 0; + } + .featureblocktitle h2 { + font-size: 24px; + } + .screenshots { + padding: 20px 0 100px; + } + .sliderheader { + padding: 0 40px; + } + .feature .description h2 { + font-size: 22px; + font-family: 'Roboto Bold'; + } + .subfeature .subfeatureheader { + font-size: 24px; + font-family: 'Roboto Bold'; + } + .dvr-featurescontent { + padding: 0 20px; + } +} +@media screen and (max-width: 500px) { + .selectbox { + left: 20px; + width: auto; + } + .custom_build_it { + min-height: 300px; + } + .api_header_holder .headertext { + margin: 0 0 65px 0; + font-size: 32px; + } + .headertext.black-friday { + margin: 120px 0 30px; + } + .headertext.black-friday:before { + top: -150px; + left: 50%; + margin-left: -75px; + } +} +@media screen and (max-width: 470px) { + .sliderheader h2 { + padding-bottom: 10px; + } + .sliderheader .switch { + position: static; + padding-bottom: 20px; + text-align: left; + } + .footerlogo { + float: none; + } + .footer .contactus { + float: none; + } + .menublock .footerlinks { + width: 100%; + margin-right: 0; + } +} +@media screen and (max-width: 450px) { + .plugin .buttons .readmore { + border-bottom: 0 none; + text-align: center; + text-decoration: underline; + } + .custom_build_it { + min-height: 290px; + } + .api_header_holder .headertext { + font-size: 27px; + } +} +@media screen and (max-width: 360px) { + .menu-hamburger { + right: 10px; + } + .headertext { + padding: 0 20px; + font-size: 24px; + } + .badges { + padding: 0 20px; + } + .featurestitle { + padding: 25px 20px; + } + .featureblock { + padding: 0 20px; + } + .sliderheader { + padding: 0; + } + .sliderheader h2, + .sliderheader .switch { + padding-left: 40px; + } + .screenshots { + padding: 20px 0 50px; + } + .blogcontainer > div { + padding: 0 20px; + } + .blogcontainer > div:first-child { + padding-right: 20px; + } + .blogcontainer > div:last-child { + padding-left: 20px; + } + .question .content { + padding-left: 0; + } + .api_header_holder .headertext { + font-size: 24px; + } + .api-demo .img-preview, + .api-sample .img-preview { + height: 235px; + } +} +@media screen and (max-width: 320px) { + .menu-hamburger.in-menu { + right: -270px; + } +} +@media screen and (orientation: landscape) { + .menu { + + } +} + +/***************go page ****************************/ +.gocontainer +{ + height:100%; +} + +.gocontainer .goheader +{ + border-bottom:1px solid #ccc; + width:100%; + -webkit-box-shadow:2px 2px 5px #CAC8C3; + -moz-box-shadow:2px 2px 5px #CAC8C3; + box-shadow:2px 2px 5px #CAC8C3; + position:absolute; + top:0; + height:63px; +} + +.gocontainer .goheader img +{ + height:100%; + padding:3px 7px 5px 12px; +} + +.gocontainer .coordinatescontainer +{ + width:auto; + float:right; + padding-top:6px; + padding-right:12px; +} + +.gocontainer .coordinatescontainer div +{ + position:relative; + +} + +.gocontainer .coordinatescontainer .title +{ + font-size:13px; + color:#9A9A9A; + position:absolute; + bottom:-1px; + left:-28px; +} + +.gocontainer .coordinatescontainer .coordinate +{ + font-family: 'Roboto Bold'; + color:#000; + padding-left:5px; + font-size:15px; + line-height:25px; +} + +.gocontainer .gofooter +{ + position:absolute; + bottom:0; + width:100%; + background-color:#43464D; + -webkit-box-shadow:2px -2px 5px #CAC8C3; + -moz-box-shadow:2px -2px 5px #CAC8C3; + box-shadow:2px -2px 5px #CAC8C3; + height:50px; + overflow:hidden; +} + +.gocontainer .gobadges +{ + width:100%; + max-width: 360px; + margin: 0 auto; + margin-top:4px; +} + +.gocontainer .badgecontainer +{ + float:left; + width:35%; + height:50px; +} + +.gocontainer .gobadges .badgecontainer img +{ + max-height:100%; + max-width:100%; + padding:6px; +} + +.gocontainer .gobadges .google img +{ + padding:0; + height:44.58px; +} + +.gocontainer .gobadges .apple img +{ + height:41.51px; + margin-top:1px; +} + +.gocontainer .gobadges .amazon +{ + width:30%; +} + +.gocontainer .gobadges .amazon img +{ + height:42.58px; +} + +.gocontainer .overlay +{ + width:100%; + height:100%; + background-color:rgba(200, 200, 200, 0.7); + z-index:1000; + position:absolute; +} + +.gocontainer .popup +{ + z-index:1001; + background-color:#fff; + position:absolute; + width:80%; + top:10%; + overflow:hidden; + text-align:center; + padding:7%; + border-radius: 15px; + left:10%; + max-height:90%; +} + +.gocontainer .popup .logo +{ + height:50px; + background:url("images/logo-grey.png") no-repeat; + background-size:contain; + background-position:center; + margin-bottom:5%; + +} +.gocontainer .popup h1 +{ + font-size:21px; + letter-spacing:0.07em; + font-family:verdana; + text-transform:uppercase; + border-top:1px solid #ccc; + font-weight:bold; + padding-bottom:5px; + padding-top:40px; +} + +.gocontainer .popup p +{ + font-size:18px; + color:#9A9A9A; + font-style:italic; +} + +.gocontainer .popup .button +{ + width:100%; + height:45px; + line-height:45px; + overflow:hidden; + color:#fff; + display:inline-block; + margin-bottom:7px; + border-radius: 5px; + text-decoration:none; +} + + /* The Modal (background) */ + .modal { + display: none; /* Hidden by default */ + position: fixed; /* Stay in place */ + z-index: 1; /* Sit on top */ + left: 0; + top: 0; + width: 100%; /* Full width */ + height: 100%; /* Full height */ + overflow: auto; /* Enable scroll if needed */ + background-color: rgb(0,0,0); /* Fallback color */ + background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ + -webkit-animation-name: fadeIn; /* Fade in the background */ + -webkit-animation-duration: 0.4s; + animation-name: fadeIn; + animation-duration: 0.4s + } + + /* Modal Content */ + .modal-content { + position: fixed; + bottom: 0; + background-color: #fefefe; + width: 100%; + -webkit-animation-name: slideIn; + -webkit-animation-duration: 0.4s; + animation-name: slideIn; + animation-duration: 0.4s + } + + /* The Close Button */ + .close-params { + margin-top: 25px; + color: white; + float: right; + font-size: 28px; + font-family: 'Roboto Bold'; + } + + .close-params:hover, + .close-params:focus { + color: #000; + text-decoration: none; + cursor: pointer; + } + + .modal-header { + padding: 2px 16px; + background-color: #ff8f00; + color: white; + } + + .modal-body {padding: 2px 16px;} + + /* Add Animation */ + @-webkit-keyframes slideIn { + from {bottom: -300px; opacity: 0} + to {bottom: 0; opacity: 1} + } + + @keyframes slideIn { + from {bottom: -300px; opacity: 0} + to {bottom: 0; opacity: 1} + } + + @-webkit-keyframes fadeIn { + from {opacity: 0} + to {opacity: 1} + } + + @keyframes fadeIn { + from {opacity: 0} + to {opacity: 1} + } +.gocontainer .popup .yes +{ + background-color:rgb(255, 143, 0); +} + +.gocontainer .popup .no +{ + background-color:rgb(123, 161, 50); +} + +.gocontainer .popup .cancel +{ + border:1px solid #ccc; + background-color:#fff; + color:#000; + margin-bottom:0; +} +@media (orientation:landscape) +{ + .gocontainer .popup + { + padding:4%; + } + .gocontainer .popup .logo + { + display:none; + } + .gocontainer .popup h1 + { + padding-top:0; + border-top:none; + } +} + +.quote { + font-size: 1.8em; + font-family: 'Roboto Bold'; + color: #212121; + line-height: 1.3em; + letter-spacing: 0.02em; +} + +/*.gocontainer .popup .buttons +{ + width:80%; + position:absolute; + bottom:5%; + left:10%; +}*/ + + +.giveaway { + position: relative; + border: 1px solid #e6e6e6; + /* margin: 25px 150px; */ + margin: 0 auto; + max-width: 1100px; + font-size: 18px; + display:flex; + flex-direction:row; + flex-wrap:wrap; + justify-content: space-between; + align-items: stretch; + align-content: flex-start; +} + +.giveaway-picture { + flex-grow:1; + flex-basis:50%; + background-image:url("/images/giveaway_image.jpg"); + background-repeat: no-repeat; + background-size: cover; + background-position: center; +} + +.giveaway-message { + flex-grow:1; + flex-basis:50%; +} + +.giveaway img { + max-width: 100%; + max-height: 100%; +} + +.giveaway-form { + background-color: #f2f2f2; + padding: 24px 30px; +} + +.giveaway-form-subtitle { + font-weight:bold; + margin-bottom: 8px; + margin-top:24px; + letter-spacing:1.2px; +} + +.first-subtitle{ + margin-top:0; +} + +.giveaway-form-devices { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + align-content: flex-start; +} + +.giveaway-form-device{ + flex-grow:1; + flex-basis: 50%; + display: flex; + flex-direction:row; + flex-wrap:nowrap; + justify-content: flex-start; + align-items: center; +} + +.giveaway-form-user{ + display:flex; + flex-direction:row; + flex-wrap:wrap; + justify-content: space-between; + align-items:center; + align-content:center; +} + +.giveaway-submit { + flex-basis: 100px; + flex-grow:0; + background: #575bde; + color: #fff; + font-weight: bold; + font-size: 16px; + font-weight: 400; + text-align: center; + white-space: nowrap; + vertical-align: middle; + border: 1px solid #3d42bf; + border-radius: 2px; + height:36px; + cursor: pointer; +} + +.giveaway-submit-disabled { + background: #666; +} + +.giveaway-submit-success { + background: green; +} + +#register_giveaway_success, #register_giveaway_failed { + margin-top: 8px; + font-weight: 400; +} + + +.giveaway-email { + flex-grow:1; + margin-right:24px; + font-size:16px; + line-height:36px; + height:34px; + padding:0 8px; + outline: none; +} + +@media (max-width: 1100px) { + .giveaway { + margin: 0 auto; + } +} + +@media (max-width: 768px) { +.giveaway-picture { + order:1; + flex-basis:100%; + height:180px; + } + + .giveaway-message { + order:2; + } +} + + +.giveaway-content { + padding: 0px 30px 30px 30px; +} + +.giveaway h4 { + font-size: 20px; + line-height: 0px; + padding-top: 14px; + letter-spacing: 0.04em; +} + + + + +/* Clear floats after the columns */ +.giveaway:after { + content: ""; + display: table; + clear: both; +} + +.giveaway a { + display: inline-block; + letter-spacing:1.2px; + text-decoration: none; +} + +.giveaway a:hover { + text-decoration: :underline; +} + +.form-control { + margin: 0; + height: 42px; + display: block; + width: 95%; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 2px; +} + +.dropbtn { + padding: 5px; + cursor: pointer; + color: #4C51D9; + width: 67px; + padding-left: 14px; + background: #FFFFFF; + border-radius: 6px 6px 6px 6px; +} +.dropdown-content { + display: none; + position: absolute; + background-color: #FFFFFF; + width: 178px; + border-radius: 6px 0px 6px 6px; + padding: 5px 0; + right: 23px; +} +.show_dropdown{ + display: block; +} +.showed_dropdown{ + border-radius: 6px 6px 0 0; +} +.lang_switcher{ + width: 50px; + padding-right: 90px!important; +} +.dropbtn::after { + background: rgba(0, 0, 0, 0) url("/images/arrow-down.png") no-repeat scroll center center; + content: ""; + height: 16px; + position: absolute; + right: 35px; + top: 10px; + width: 10px; +} +.dropdown-content a { + padding: 14px; + text-decoration: none; + display: block; + font-family: Roboto Regular; + font-style: normal; + font-weight: normal; + line-height: normal; + font-size: 16px; + letter-spacing: 0.03em; + text-transform: none; + color: #000000; +} +.dropdown-content a:hover{ + background: #F0F0F0; + color: #4C51D9; + cursor: pointer; +} +.dropdown-content a.current{ + background: #FF8800; + color: #FFFFFF; +} +@media screen and (max-width: 1075px) { + .menu li.desktop-only { + display: none; + } + .dropbtn::after { + right: 206px; + top: 138px; + } + .dropdown-content{ + right: 82px; + border-radius: 0px 6px 6px 6px; + } +} + +@media screen and (max-width: 650px) { + + .dropbtn::after { + right: 206px; + top: 124px; + } +} diff --git a/OsmAnd/assets/server/css/slick.css b/OsmAnd/assets/server/css/slick.css new file mode 100644 index 0000000000..5a26826fa4 --- /dev/null +++ b/OsmAnd/assets/server/css/slick.css @@ -0,0 +1,117 @@ +/* Slider */ +.slick-slider +{ + position: relative; + + display: block; + box-sizing: border-box; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + -webkit-touch-callout: none; + -khtml-user-select: none; + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} + +.slick-list +{ + position: relative; + + display: block; + overflow: hidden; + + margin: 0; + padding: 0; +} +.slick-list:focus +{ + outline: none; +} +.slick-list.dragging +{ + cursor: pointer; + cursor: hand; +} + +.slick-slider .slick-track, +.slick-slider .slick-list +{ + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.slick-track +{ + position: relative; + top: 0; + left: 0; + + display: block; +} +.slick-track:before, +.slick-track:after +{ + display: table; + + content: ''; +} +.slick-track:after +{ + clear: both; +} +.slick-loading .slick-track +{ + visibility: hidden; +} + +.slick-slide +{ + display: none; + float: left; + + height: 100%; + min-height: 1px; +} +[dir='rtl'] .slick-slide +{ + float: right; +} +.slick-slide img +{ + display: block; +} +.slick-slide.slick-loading img +{ + display: none; +} +.slick-slide.dragging img +{ + pointer-events: none; +} +.slick-initialized .slick-slide +{ + display: block; +} +.slick-loading .slick-slide +{ + visibility: hidden; +} +.slick-vertical .slick-slide +{ + display: block; + + height: auto; + + border: 1px solid transparent; +} +.slick-arrow.slick-hidden { + display: none; +} \ No newline at end of file diff --git a/OsmAnd/assets/server/css/src/slick.less b/OsmAnd/assets/server/css/src/slick.less new file mode 100644 index 0000000000..2fa0fb2ec1 --- /dev/null +++ b/OsmAnd/assets/server/css/src/slick.less @@ -0,0 +1,98 @@ +/* Slider */ + +.slick-slider { + position: relative; + display: block; + box-sizing: border-box; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} +.slick-list { + position: relative; + overflow: hidden; + display: block; + margin: 0; + padding: 0; + + &:focus { + outline: none; + } + + &.dragging { + cursor: pointer; + cursor: hand; + } +} +.slick-slider .slick-track, +.slick-slider .slick-list { + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.slick-track { + position: relative; + left: 0; + top: 0; + display: block; + + &:before, + &:after { + content: ""; + display: table; + } + + &:after { + clear: both; + } + + .slick-loading & { + visibility: hidden; + } +} +.slick-slide { + float: left; + height: 100%; + min-height: 1px; + [dir="rtl"] & { + float: right; + } + img { + display: block; + } + &.slick-loading img { + display: none; + } + + display: none; + + &.dragging img { + pointer-events: none; + } + + .slick-initialized & { + display: block; + } + + .slick-loading & { + visibility: hidden; + } + + .slick-vertical & { + display: block; + height: auto; + border: 1px solid transparent; + } +} +.slick-arrow.slick-hidden { + display: none; +} diff --git a/OsmAnd/assets/server/css/src/source_site.css b/OsmAnd/assets/server/css/src/source_site.css new file mode 100644 index 0000000000..e1cb743923 --- /dev/null +++ b/OsmAnd/assets/server/css/src/source_site.css @@ -0,0 +1,2176 @@ +@font-face { + font-family: 'Roboto Regular'; + src: url('Roboto-Regular-webfont.eot'); + src: url('Roboto-Regular-webfont.eot?#iefix') format('embedded-opentype'), + url('Roboto-Regular-webfont.woff') format('woff'), + url('Roboto-Regular-webfont.ttf') format('truetype'), + url('Roboto-Regular-webfont.svg#robotoregular') format('svg'); + font-weight: normal; + font-style: normal; +} +* { + box-sizing: border-box; +} +html, body { + height: 100%; +} +body { + font-family: 'Roboto Regular', Arial, Helvetica, sans-serif; + font-size:1.1em; + line-height:1.4em; + margin:0; + padding:0; +} +ul li { + margin:0; + padding:0; +} +h1, h2 { + -webkit-margin-before:0; + -webkit-margin-after:0; + margin-top:0; + margin-bottom:0; + font-weight:400; + font-size:3em; + letter-spacing:.06em; + padding-top:25px; + padding-bottom:25px; + line-height:1em; +} +xmp, pre { + white-space:pre-wrap; +} +a::-moz-focus-inner { + border: 0; +} +.tech-oh { + overflow: hidden; +} +.maincontainer { + width: 100%; + height: auto; + background-color: #fff; + transition: transform .5s; +} +.maincontainer.menu-open { + position: fixed; + transform: translate(-300px, 0); + transition: transform .5s; +} + +.main { + position: relative; + min-height: 100%; + margin: 0 auto; +} + +.header { + position: relative; + color: #fff; +} +.header-map { + position: absolute; + top: 0; + bottom: 0; + width: 100%; + background: #ededed url('images/header_image.jpg') center center no-repeat; + background-size: cover; +} + +.shadowline { + position: relative; + z-index: 15; + width:100%; + height:100px; + background:rgba(21, 29, 45, 0.77); +} + +.menu-wrapper { + position: relative; + width: 100%; + height: 100%; + max-width: 1170px; + margin: 0 auto; +} +.menu-wrapper a { + outline: none; +} + +.headertitle { + position:absolute; + bottom:-15px; + left:20%; + right:20%; + background:#fff; + border:2px solid; + border-radius:15px; +} +.headerlogo-link { + display: inline-block; + vertical-align: middle; + padding: 5px 40px; +} +.headerlogo { + width: 176px; + height: 77px; + background: url('images/logo.png') center center no-repeat; + background-size: 100%; +} +.header-caption { + position: relative; + z-index: 10; + max-width: 1195px; + margin: 0 auto; +} +.headertext { + margin: 169px 0 109px; + padding: 0 40px; + font-size:50px; + line-height:1.6em; + font-weight: bold; + letter-spacing:.06em; + text-transform: uppercase; + text-shadow: 0 0 3px #333; +} +.menu { + position: absolute; + top: 50%; + right: -182px; + margin-top: -12px; + font-family: Verdana, Arial; + font-weight: 700; + letter-spacing: .06em; + transform: translate(0, 0); + text-transform: uppercase; +} +.menu-hamburger { + display: none; + position: absolute; + top: 30px; + right: 30px; + padding: 20px; + background: url('images/main-sprite.png') no-repeat -260px -60px; + cursor: pointer; +} +.menu .mobile-sign { + display: none; + padding-bottom: 35px; + margin-bottom: 10px; + color: #667580; + border-bottom: 1px solid; +} +.menu { + font-size: 0; +} +.menu li { + display: inline-block; + vertical-align: middle; + font-size: 18px; + letter-spacing: 1.05px; + padding-right:55px; +} +.menu a:hover { + color: #ff8f00; +} + +.menu .activeitem a { + color: #ff8f00; +} + +.header .badges { + padding-bottom: 180px; +} +.badges { + padding: 0 40px; +} +.badges a { + display: inline-block; + vertical-align: middle; + margin-right: 10px; +} +.badges img { + height:45px; + border:none; +} +.header .blogbutton { + position:absolute; + top:30%; + right:12%; + height:280px; + width:280px; + background-color:#ff8f00; + color:#fff; + text-align:center; + font-weight:700; + max-width:20%; + overflow:hidden; + -webkit-border-radius:10px; + -moz-border-radius:10px; + border-radius:10px; +} + +.badges li.survey { + float:none; + padding-left:0; + line-height:120px; + clear:left; +} + +.badges .surveylink { + background-color:#ff8f00; + color:#fff; + border-radius:5px; + text-decoration:none; + padding:10px 20px; +} + +.header .five { + font-size:120pt; + line-height:130pt; +} + +.header .years { + font-size:28pt; + letter-spacing:.15em; +} + +.header .joinus { + font-size:14pt; + padding-top:17px; + text-decoration:underline; + letter-spacing:.3em; +} + +.simpleheader { + color: #fff; + background: url('images/header_image.jpg') center top no-repeat; + background-size: cover; +} + +.simpleheader .headertext { + padding: 60px 40px; + margin: 0; +} + +.specialevent +{ + position:relative; + background:#fff; + height:650px; +} + +.specialeventwrap +{ + width:900px; + position:absolute; + left:50%; + margin-top:-60px; +} + +.specialeventcontent +{ + position:relative; + left:-50%; + border-radius:15px; + background:#fff; +} + +.specialeventtext +{ + width:85%; + padding-top:20px; + overflow:hidden; + line-height:1.6em; + font-size:18px; + margin:0 auto; +} + +.specialeventtext p,.specialeventtext ul +{ + padding-bottom:10px; +} + +.specialeventtext .beforelist +{ + padding-bottom:0; + margin-bottom:5px; +} + +.specialeventtext.hidden +{ + color:#fff; + padding-bottom:60px; + width:900px; +} + +.specialevent .headertitletext +{ + letter-spacing:0; + font-weight:700; +} + +.headertitletext { + text-align:center; + color:#000; + line-height:1.6em; + font-size:22px; + padding:3px 0; +} + +.featurestitle { + padding:25px 40px; + text-align:center; +} + +.featurestitle p { + margin: 0; + color:#c1c1c1; + font-size:1.2em; +} + +.featurestitle h2 { + color:#ffa516; +} + +.featurescontainer { + position: relative; + max-width: 1100px; + margin: 50px auto; + font-size: 0; + text-align: center; +} + +.featureblock { + display: inline-block; + vertical-align: top; + width: 50%; + max-width: 520px; + min-height: 550px; + margin-top: 15px; + padding: 0 20px 30px; + font-size: 18px; + text-align: left; +} + + +.featureblocktitle { + position: relative; + min-height: 100px; + border-bottom: 6px solid #ff8f00; + margin-bottom: 40px; +} + + +.featureblocktitle h2 { + position: absolute; + top: 50%; + left: 0; + transform: translate(0, -50%); + max-width: 480px; + padding-left: 70px; + margin: 0; + font-size: 40px; +} +.featureblocktitle.feature-opensource h2 { + line-height: 1; +} +.featureblocktitle h2 .subheader { + display: block; + color: #737373; + font-size: 18px; +} +.featureblocktitle:before { + content: ''; + position: absolute; + top: 15px; + left: 0; + width: 60px; + height: 60px; + margin-right: 15px; + background: url('images/main-sprite.png') no-repeat 0 0; +} +.featureblocktitle.feature-map:before { + background-position: -80px 0; +} +.featureblocktitle.feature-bike:before { + background-position: -160px 0; +} +.featureblocktitle.feature-opensource:before { + background-position: -240px 0; +} + +.featureblocktitle .warning { + color:#ff8f00; + font-size:.6em; + letter-spacing:0; +} + + + +.mapexample { + background: #fff; + position: relative; + padding-top: 20px; + padding-bottom: 20px; +} + +.mapcontainer { + position: relative; + background: url('images/cycling-default.png') center center no-repeat; + height: 450px; + background-size: cover; + margin: 0 auto 40px; +} + +.selectbox { + position: absolute; + top: 20px; + right: 15%; + width: 157px; + padding:15px; + border-radius:5px; + background-color: #fff; +} +.selectbox .selecttitle { + padding: 19px 5px 6px; + color: #2196F3; + font-size: 14px; + font-weight: 700; +} +.selectbox .selecttitle.first { + padding-top:2px; +} +.selectbox ul { + padding-left:0; + margin:0; +} +.selectbox ul li { + line-height:1.2em; + font-size:.6em; +} +.selectbox input { + padding-top:5px; + cursor:pointer; +} +.selectbox label { + cursor:pointer; +} + +.screenshots { + background: #fff; + position: relative; + overflow: hidden; + padding: 20px 40px 100px; +} + +.arrow +{ + cursor:pointer; + position:absolute; + top:50%; +} +.images.ios { + display: none; +} +.screenshots .screenshot { + padding: 0 15px; +} +.screenshot-preview-holder { + display: none; + z-index: 100; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100vh; + min-height: 100%; + background: rgba(255, 255, 255, .8); +} +.screenshot.in-preview { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} +.sliderheader { + position: relative; +} +.sliderheader h2 { + padding-bottom: 50px; +} +.sliderheader .switch { + position: absolute; + top: 25px; + right: 15px; + font-size: 0; + color: #fff; + text-align: center; + cursor: pointer; +} +.sliderheader .switch .button { + display: inline-block; + vertical-align: middle; + width: 105px; + padding: 15px; + background: #d4d4d4; + font-size: 18px; + text-align: center; +} +.switch .button:first-child { + border-radius: 8px 0 0 8px; +} +.switch .button:last-child { + border-radius: 0 8px 8px 0; +} + +.sliderheader .switch .button.active { + background-color:#ff8f00; +} +.slick-arrow { + position: absolute; + top: 50%; + width: 40px; + height: 55px; + border: 0 none; + font-size: 0; +} +.slick-arrow::-moz-focus-inner { + border: 0; +} +.slick-arrow.slick-prev { + left: -50px; + background: url('images/main-sprite.png') no-repeat -80px -100px; +} +.slick-arrow.slick-next { + right: -50px; + background: url('images/main-sprite.png') no-repeat -120px -100px; +} +.blogcontainerwrap { + background: #fff; + line-height: 1.7em; +} +.blogcontainer { + max-width: 1100px; + overflow: hidden; + padding-bottom: 20px; + margin: 0 auto; + font-size: 0; +} +.blogcontainer > div { + display: inline-block; + vertical-align: top; + width: 50%; + font-size: 18px; + padding: 0 40px; +} +.blogcontainer > div:first-child { + padding-right: 20px; +} +.blogcontainer > div:last-child { + padding-left: 150px; +} +.blogitem h3 +{ + font-size:1.2em; + color:#76B6F6; + font-weight:400; + margin:0; +} + +.blogitem p +{ + margin-top:5px; +} + +.blogitem .readmore +{ + text-align:left; + display:inline-block; + margin-bottom:40px; +} + +.blogitem .date +{ + float:right; + color:#9A9A9A; +} + +.imageholder +{ + text-align:center; + margin:10px; +} + +.imageholder img +{ + border:1px solid #ddd; + max-width:300px; + padding:10px; +} + +.articles .textlist +{ + margin-bottom:50px; +} + +.pds-box.osmand +{ + border-radius:0; +} + +.footer { + position: relative; + background-color: #292f33; +} +.footercontent { + padding: 25px 40px; + font-size: 0; +} + +.logoblock { + display: inline-block; + vertical-align: top; + width: 40%; + font-size: 18px; +} + +.menublock { + display: inline-block; + vertical-align: top; + width: 60%; + font-size: 18px; +} +.menublock .footerlinks { + display: inline-block; + vertical-align: top; + width: 30%; + max-width: 200px; + margin-right: 15px; +} + +.footerlogo { + display: block; + width:200px; + height:77px; + background:url('images/logo.png') center -10px no-repeat; + background-size: 100%; +} + +.footer .contactus { + display: inline-block; + padding: 15px 20px 15px 15px; + margin-top: 7px; + margin-right: 15px; + border: 1px solid #394247; + border-radius: 3px; + color: #fff; + font-size: 15px; + text-decoration: none; + outline: none; +} + +.footer .contactus:before { + content: ''; + display: inline-block; + vertical-align: baseline; + width: 20px; + height: 20px; + margin-right: 20px; + margin-bottom: -2px; + background: url('images/main-sprite.png') no-repeat -160px -57px; +} + +.footerlinkstitle { + border-bottom: 1px solid #2f4445; + color: #698d8f; + font-size: .7em; + font-weight: 700; + text-transform: uppercase; +} + +.footer ul { + padding-left: 0; + padding-bottom: 40px; + list-style-type: none; + font-size: .8em; +} + +.footer ul li { + line-height: 1.8em; +} + +.article-menu-wrapper { + position: relative; + z-index: 1000; + display: inline-block; + vertical-align: top; + width: 30%; + padding-top: 1em; + font-size: 18px; +} +.modal-menu-button { + display: none; + position: absolute; + z-index: 10; + top: 0; + right: 10px; + width: 40px; + height: 40px; + background: url('images/main-sprite.png') no-repeat -40px -100px; + cursor: pointer; + transition: transform .5s; +} +.modal-menu-button.active { + transform: rotate(-180deg); + transition: transform .5s; +} +.article { + display: inline-block; + vertical-align: top; + width: 70%; + padding-right: 20px; + margin-top: 1em; + font-size: 18px; +} +.article-menu { + background: #fff; +} +.articlelinklist { + font-size: 14px; +} +.articlelinklist a, +.articlelinklist a:visited { + color: #454ade; +} +.articlelinklist a:hover { + color: #ff8f00; +} +.articlelinklist a:before { + content: ''; + display: inline-block; + vertical-align: middle; + width: 3px; + height: 3px; + margin-right: 10px; + border-radius: 50%; + background: #b8b9de; +} + +.articles { + padding: 0 20px; +} +.articlescontainer { + position: relative; + max-width: 1100px; + margin: 0 auto; + font-size: 0; +} +.acticlestitles { + max-width: 300px; + padding: 20px; + border:1px solid #e6e6e6; +} + +.acticlestitles h2 { + padding: 0 0 15px; + border-bottom: 4px solid #f80; + font-size:.9em; + font-weight:700; + letter-spacing:.2em; +} +.acticlestitles h2:not(:first-child) { + padding-top: 15px; +} + +.acticlestitles ul li { + padding: 10px 0 10px 10px; + border-bottom: 1px solid #e6e7ec; +} + +.acticlestitles ul li.last { + padding-bottom:0; +} + +.textlist { + padding-left: 30px; + list-style-type: disc; +} + +.textlist li { + padding-top: 10px; +} + +.article h1, +.article h2 { + font-size:34px; +} + +.article img { + max-width: 100%; +} + +.article .rightimage { + max-width: 450px; +} + +.article .centeredimageblog { + margin: 30px auto 0; + text-align: center; +} + +.article .centeredimageblog img { + max-width: 200px; + padding: 10px; + margin-right: 10px; + margin-bottom: 20px; + border: 1px solid #ccc; +} + +.article .centeredimageblog.wide img { + width: auto; + height: 300px; +} + +.article .noborder img { + padding: 0; + border: none; +} + +.article .leftimage { + max-width: 200px; + padding: 10px; + border: 1px solid #ccc; +} + +.social_network_button { + display: inline-block; + vertical-align: middle; + line-height: 1em; +} + +.share_buttons .gplus { + max-width: 86px; +} + +.share_buttons { + max-width: 300px; + margin: 0 auto 21px; +} + +.fb +{ + padding:2px; +} + +.fb-like +{ + width:80px; +} + +.fb-like span,.fb-like iframe +{ + width:80px!important; + height:21px!important; +} + +.discount +{ + background:url(images/discount-badge.png) center top no-repeat; + background-size:contain; + position:absolute; + top:35%; + right:15%; + width:200px; + height:200px; +} + +.dvrlogo +{ + background:url(images/ic_dvr_mainicon.png) left top no-repeat; + background-size:contain; + width:80px; + height:80px; + margin:0 auto; +} + +.nearlogotext +{ + vertical-align:top; + display:inline-block; + padding:15px; +} + +.appstorebadge img +{ + width:100px; + display:block; + margin:0 auto; +} + +#map +{ + position:absolute; + top:65px; + bottom:50px; + width:100%; +} + +.gocontainer +{ + height:100%; +} + +.goheader +{ + border-bottom:1px solid #ccc; + width:100%; + -webkit-box-shadow:2px 2px 5px #CAC8C3; + -moz-box-shadow:2px 2px 5px #CAC8C3; + box-shadow:2px 2px 5px #CAC8C3; + position:absolute; + top:0; + height:63px; +} + +.goheader img +{ + height:48px; + padding:7px 7px 5px 20px; +} + +.gofooter +{ + position:absolute; + bottom:0; + width:100%; + background:#fff; + -webkit-box-shadow:2px -2px 5px #CAC8C3; + -moz-box-shadow:2px -2px 5px #CAC8C3; + box-shadow:2px -2px 5px #CAC8C3; +} + +.coordinatescontainer +{ + width:100px; + float:right; + padding-top:14px; + padding-right:20px; +} + +.coordinatescontainer .coordinatetitle +{ + font-size:10pt; + color:#9A9A9A; + padding-bottom:3px; +} + +.coordinatescontainer .coordinate +{ + font-weight:700; + color:#000; + padding-left:5px; + font-size:12pt; +} + +.gobadges +{ + height:50px; + background-color:#43464D; + overflow:hidden; +} + +.badgescontainer { + width:360px; + margin:0 auto; +} + +.gobadges .badgecontainer +{ + float:left; + width:32%; + max-width:120px; + height:50px; +} + +.gobadges .badgecontainer img +{ + max-width: 100px; + height: 35px; + padding: 8px; +} + +.gobadges .apple img +{ + padding-left: 1px; + max-width: 114px; +} + +.whatyousay { + background: #ededed; + position: relative; + padding: 20px 40px; +} +.whatyousaycontainer .badgescontainer { + width: 100%; + max-width: 1100px; + margin: 20px auto; + text-align:center; + font-size: 0; +} +.whatyousayblock { + display: inline-block; + vertical-align: top; + width: 48.5%; + padding: 0 1%; + margin-bottom: 30px; + font-size: 18px; + text-align: left; +} +.whatyousaymessage { + position: relative; + max-width: 460px; + padding: 20px; + margin: 0 auto; + background-color: #fff; + border-radius: 7px; + box-shadow: 2px 2px 5px #cac8c3; + font-style: italic; + line-height: 1.5em; +} +.whatyousaymessage::before { + content: ''; + position: absolute; + left: 30px; + bottom: -20px; + width: 0; + height: 0; + border: 10px solid transparent; + border-top-color: #cac8c3; +} +.whatyousaymessage::after { + content: ''; + position: absolute; + left: 28px; + bottom: -21px; + width: 0; + height: 0; + border: 12px solid transparent; + border-top-color: #fff; +} +.whatyousayblock .signature { + max-width: 460px; + padding-left:10px; + margin: 20px auto 0; +} +.whatyousayblock .signature .source { + color:#9e9e9e; + font-size:.9em; + margin-top: 5px; +} +.mapexampleheader h2 { + padding: 25px 40px; +} + +.pluginscontainer .readmore { + color:#adadad; + text-decoration:none; + border-bottom:1px solid #d6d6d6; +} + +.pluginscontainer .readmore a { + color:#adadad; + text-decoration:none; +} + +.featurecontainer { + padding: 7px; + border: 1px solid #ededed; +} + +.featurecontainer.sub { + padding: 0; + margin-top: -1px; + font-size: 0; +} +.featurecontainer.sub:nth-child(2n+1) { + margin-bottom: 20px; +} + +.featurecontainer.last +{ + margin-top:30px; + margin-bottom:30px; +} + +.feature { + position:relative; + min-height:410px; +} + +.feature.firstusage { + background-image:url('images/features/first_usage.jpg'); +} + +.feature.navigation { + background-image:url('images/features/navigation.jpg'); +} + +.feature .description { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + max-width: 430px; + background-color: rgba(255,143,0,.9); + color: #fff; +} + +.feature .descriptioncontent { + position: relative; + padding: 40px; +} + +.feature h2 { + padding: 40px; + font-size: 34px; +} + +.feature .description p { + margin: 0 0 100px; + padding: 0 40px; +} + +.feature .readmore { + position: absolute; + left: 40px; + bottom: 40px; + border-bottom: 1px solid #fff; + color: #fff; + text-decoration: none; +} + +.subfeature { + display: inline-block; + vertical-align: top; + width: 50%; + font-size: 17px; +} +.subfeature:first-child { + border-right: 1px solid #ededed; +} + +.subfeaturecontent +{ + padding:25px 25px 25px 75px; +} + +.subfeature .subfeatureheader { + position: relative; + color: #619cd4; + font-size: 34px; +} + +.subfeature .text +{ + height:70px; + overflow:hidden; + margin-bottom:20px; + padding:20px 20px 0 0; +} + +.plugin { + position: relative; + display: inline-block; + vertical-align: top; + width: 48.5%; + min-height: 340px; + padding: 30px; + margin-bottom: 30px; + border: 1px solid #ededed; +} +.plugin:nth-child(even) { + margin-right: 2%; +} + +.plugin .pluginpicture { + height: 230px; + border:1px solid #ededed; + background-position: center center; + background-size: cover; +} + +.plugin h2 { + padding-bottom: 10px; + color: #5473ff; + font-size: 28px; + line-height: 40px; + letter-spacing: 0; +} + +.plugin .plugintext { + height: 100px; + margin-bottom: 60px; + overflow: hidden; +} + +.plugin .buttonscontainer { + position: absolute; + left: 30px; + right: 30px; + bottom: 30px; +} +.plugin .buttons { + font-size: 18px; +} + +.plugin .buttons .pricetype { + display: inline-block; + vertical-align: middle; + background-color:#ededed; + color:#9a9a9a; + font-weight:700; + padding:10px 15px; + margin-right: -6px; +} + +.plugin .buttons .readmore { + position: absolute; + top: 10px; + right: 30px; + margin-top: 0; +} + +.plugin .buttons .getbutton { + display: inline-block; + vertical-align: middle; + padding: 10px 15px; + margin-right: 20px; + background-color: #7acc2e; +} + +.plugin .buttons .getbutton a { + color:#fff; + font-weight:700; + text-decoration:none; +} + +.plugin .buttons .getbutton a:visited { + color: #fff; + text-decoration: none; +} + +.featuresheader { + position: relative; + margin: 30px auto; + text-align: center; + overflow: hidden; +} +.featuresheader:before { + content: ''; + position: absolute; + z-index: 0; + top: 50%; + left: 0; + width: 100%; + height: 4px; + margin-top: -2px; + background: #ffba00; +} + +.featuresheader .featuresheadertext { + position: relative; + z-index: 1; + display: inline-block; + padding: 0 19px; + background: #fff; + font-weight: 700; + letter-spacing: .3em; +} + +.plugin .onlinemaps { + background-image: url('images/features/online_maps_main.png'); +} + +.plugin .contourlines { + background-image: url('images/features/contour_lines_main.png'); +} + +.plugin .triprecordingtool { + background-image: url('images/features/trip_recording_tool_main.png'); +} + +.plugin .skimaps { + background-image: url('images/features/ski_maps_main.png'); +} + +.plugin .nauticalcharts { + background-image: url('images/features/nautical_charts_main.png'); +} + +.plugin .audiovideo { + background-image: url('images/features/audio_video_note_main.png'); +} + +.plugin .osmediting { + background-image: url('images/features/osm_editing_main.png'); +} + +.plugin .planningtool { + background-image: url('images/features/planning_tool_main.png'); +} + +.plugin .parking { + background-image: url('images/features/parking_main.png'); +} + +.plugin .development { + background-image: url('images/features/development_main.png'); +} + +.subfeature .subfeatureheader:before { + content: ''; + position: absolute; + top: 0; + left: -50px; + width: 30px; + height: 30px; + background:url('images/main-sprite.png') no-repeat 0 0; +} +.subfeature .install .subfeatureheader:before { + background-position: -5px -66px; +} +.subfeature .viewmap .subfeatureheader:before { + background-position: -45px -66px; +} +.subfeature .plantrip .subfeatureheader:before { + background-position: -85px -66px; +} + +.subfeature .search .subfeatureheader:before { + background-position: -125px -66px; +} + + + +.ellipsis { + white-space: nowrap; + overflow: hidden; +} + +.ellipsis.multiline { + white-space:normal; +} + +.code { + font-style:italic; +} + +.list li { + padding-bottom:10px; + color:#000; +} + +.subtitle, +.subtitle h2 { + font-size:1.3em; + margin-top:10px; + font-weight:700; +} +.subtitle.mobile-subtitle { + display: none; +} + +.blocksubtitle +{ + font-weight:700; + margin-top:10px; + font-size:1.2em; +} + +.blocksubsubtitle +{ + font-weight:700; + margin-top:10px; + font-size:1.1em; +} + +.content +{ + padding:5px 15px 15px; +} + +.content ul +{ + padding-left:20px; +} + +.help h1 +{ + font-size:41px; + letter-spacing:.03em; + margin-top:20px; + margin-bottom:10px; +} + +.contributorsbanner { + width:100%; +} + +.about h3 +{ + margin-top:90px; +} + +.versions .version +{ + border:1px solid #e6e6e6; + padding:20px; +} + +.mainlist li +{ + border-bottom:1px solid #F3F3F3; + padding:15px; +} + +h1.sub +{ + background-color:#536DFE; + margin-top:0; +} + +h1.sub small +{ + display:block; + font-weight:400; + margin-top:5px; +} + +.toc .list li { + color: #d2d2d2; +} + +.toc .subtitle { + margin-bottom: 10px; + font-weight:400; +} + +.download { + width:24px; + height:24px; + padding-left:15px; + vertical-align:bottom; +} + +.imgcontainer +{ + margin:20px 30px; +} + +.legendcontainer +{ + margin:0; +} + +.clear +{ + clear:both; +} + +.disabled +{ + cursor:default; +} + +.osmlive h1 +{ + margin-top:30px; +} + +.osmlive h3 +{ + margin-top:50px; +} + +.osmlive .submenucontainer +{ + height:70px; + width:100%; + background-color:#ff8f00; + color:#fff; + overflow:hidden; +} + +.osmlive .submenu +{ + width:1100px; + padding-top:23px; + letter-spacing:.2em; + font-size:1em; + margin:0 auto; +} + +.osmlive .submenu li +{ + float:left; + padding-right:40px; +} + +.osmlive .tabcontent +{ + width:100%; + background-color:#fff; +} + +.osmlive .article ul +{ + list-style-type:disc; + padding-left:25px; +} + +.osmlive .article ul li +{ + padding-bottom:15px; +} + +.osmlive .formcontainer +{ + width:100%; + margin-top:30px; +} + +.osmlive .formcontainer .column +{ + background-color:#ededed; + width:470px; + padding:30px; +} + +.osmlive .formcontainer .column.left +{ + float:left; +} + +.osmlive input +{ + height:50px; + width:465px; + border:1px solid #d6d6d6; + font-size:1.1em; + padding-left:45px; + margin:5px 0; +} + +.osmlive .info +{ + color:#adadad; +} + +.osmlive .row +{ + margin-bottom:35px; + position:relative; +} + +.osmlive .column h3 +{ + margin-top:0; + margin-bottom:30px; +} + +.osmlive .textbox i +{ + position:absolute; + top:22px; + left:15px; + color:#9a9a9a; +} + +.osmlive .btn +{ + height:45px; + width:130px; + font-size:18px; + color:#fff; + font-weight:700; + border:none; + background-color:#619CD4; + border-radius:5px; + cursor:pointer; +} + +.osmlive form +{ + margin-bottom:0; +} + +.osmlive p +{ + line-height:2em; +} + +.osmlive .column p +{ + line-height:1.4em; + margin-top:5px; +} + +.osmlive .column h4 +{ + margin-bottom:0; + margin-top:40px; +} + +.osmlive .address +{ + background-color:#ff8f00; + color:#fff; + border-radius:5px; + width:440px; + margin-bottom:20px; + padding:10px 15px; +} + +.osmlive .googleplay +{ + height:50px; +} + +ul,.mainlist +{ + list-style-type:none; + margin:0; + padding:0; +} + +a,a:visited +{ + color:#619CD4; +} + +.menu a,.footer .contactus a,.footer ul a +{ + color:#fff; + text-decoration:none; +} + +.badges li.first,.screenshots .first,.noleftpadding +{ + padding-left:0; +} + +.simpleheader .headercontent,.simpleheader .shadowlinecontent,.mapexampleheader,.footercontent { + max-width: 1100px; + margin: 0 auto; +} + +.simpleheader .shadowline,.screenshots .images,.sliderheader,.article .textandimagecontainer,.plugin .buttons,.osmlive .textbox +{ + position:relative; +} + +.specialeventtext .signature,.about .surname,.definition +{ + font-weight:700; +} + +.specialeventlist,.features .categorydescription +{ + list-style-type:disc; + padding-left:25px; + line-height:1.7em; +} + +.specialeventlist li,.features .categorydescription li,.mainlist li.last +{ + border-bottom:none; +} + +.slider,.whatyousaycontainer +{ + position:relative; + max-width:1100px; + margin:0 auto; +} + +.blogitem h3 a,.blogitem h3 a:visited,.acticlestitles ul a,.list li a +{ + text-decoration:none; +} + +.blogitem .readmore a,.articles .date +{ + color:#9A9A9A; +} + +.share_buttons .twitter,.share_buttons .fb +{ + width:100px; +} + +.plugin.odd,.osmlive .formcontainer .column.right +{ + float:right; +} + +.legend,.osmlive .article +{ + width:100%; +} + +@media screen and (max-width: 1550px) { + .menu { + right: 0; + } + .headertext { + margin: 100px 0 70px; + } +} +@media screen and (max-width: 1200px) { + .screenshots .screenshot { + padding: 0 2px; + } +} +@media screen and (min-width: 1100px) { + .featureblock:nth-child(2n) { + margin-left: 30px; + } + .featureblock:nth-child(2n-1) { + margin-right: 30px; + } +} +@media screen and (max-width: 1100px) { + .featureblock { + width: 100%; + max-width: 800px; + min-height: auto; + padding: 0 40px 30px; + } + .selectbox { + right: 20px; + width: 100%; + max-width: 450px; + padding: 15px; + } + .selectbox:after { + content: ''; + position: absolute; + top: 30px; + right: 20px; + width: 20px; + height: 20px; + background: url('images/main-sprite.png') no-repeat -160px -80px; + transition: all .5s; + } + .selectbox.active:after { + transition: all .5s; + transform: rotate(-180deg); + } + .selectbox .selecttitle { + padding: 0; + color: #9e9e9e; + font-size: 13px; + font-weight: 400; + } + .selectbox .selecttitle.first { + padding-top: 0; + } + .selectbox .selecttitle:not(.first) { + display: none; + } + .selectbox .selecttitle .selected-map { + margin: 0; + color: #000; + font-size: 18px; + font-weight: 700; + text-transform: uppercase; + } + .selectbox ul { + display: none; + padding-left:0; + margin:0; + } + .selectbox.active ul { + display: block; + } + .selectbox input { + padding-top:0px; + } + .theme-selector { + position: absolute; + right: 20px; + bottom: 5px; + } + ul.theme-selector li { + padding: 10px; + font-size: 14px; + } + .map-selector input, + .theme-selector input { + display: none; + } + .theme-selector label.active { + border-bottom: 1px dashed #ff8f00; + } + .map-selector { + padding-top: 25px; + } + ul.map-selector li { + margin-bottom: 15px; + font-size: 16px; + text-transform: uppercase; + } + ul.map-selector li:last-child { + margin-bottom: 0; + } + .logoblock { + width: 100%; + margin-bottom: 40px; + } + .logoblock:after { + content: ''; + display: table; + float: none; + clear: both; + } + .menublock { + width: 100%; + } + .footerlogo { + float: left; + } + .footer .contactus { + float: right; + } + .subfeature .subfeatureheader { + font-size: 28px; + } +} +@media screen and (max-width: 900px) { + .menu-hamburger, + .menu .mobile-sign { + display: block; + } + .menu { + display: none; + top: 0; + right: 0; + width: 100%; + max-width: 300px; + height: 100vh; + min-height: 800px; + padding: 20px 40px 0; + margin-top: 0; + background: #292f33; + transform: translate(100%, 0); + transition: all .5s; + } + .menu.active { + display: block; + } + .menu li { + display: block; + padding-top: 18px; + padding-bottom: 18px; + font-weight: 400; + } + .sliderheader h2, + .whatyousaycontainer h2, + .mapexampleheader h2, + .blogcontainer h2 { + font-size: 30px; + } + .sliderheader .switch .button { + width: 75px; + padding: 10px; + background: #d4d4d4; + font-size: 14px; + } + .whatyousayblock { + width: 100%; + } + .blogcontainer > div { + width: 100%; + max-width: 800px; + } + .blogcontainer > div:first-child { + padding-right: 40px; + } + .blogcontainer > div:last-child { + padding-left: 40px; + } + /* CSS to restyle poll on main. Look at all those importants! */ + .blogcontainer .PDS_Poll .pds-box { + width: auto !important; + } + .blogcontainer .PDS_Poll .pds-box .pds-vote-button { + display: inline-block; + vertical-align: middle; + float: none !important; + } + .blogcontainer .PDS_Poll .pds-box .pds-links { + display: inline-block !important; + vertical-align: middle; + padding: 3px 25px !important; + margin-left: 10px; + background: #ff6d00; + border-radius: 5px; + line-height: 25px; + font-family: "Lucida Grande", Verdana, Arial; + } + .pds-view-results { + color: #fff !important; + text-decoration: none !important; + } + .pds-answer-group .pds-answer-input { + float: none !important; + display: inline-block !important; + vertical-align: middle; + } + .pds-answer-group .pds-input-label { + float: none !important; + display: inline-block !important; + vertical-align: middle; + width: auto !important; + } + .blogcontainer .PDS_Poll .pds-box .pds-links .pds-pd-link { + display: none !important; + } + .social-widgets { + display: none; + } + .article-menu-wrapper { + position: absolute; + top: -120px; + right: 0; + width: auto; + } + .article-menu { + display: none; + } + .acticlestitles { + max-width: 350px; + } + .modal-menu-button { + display: block; + } + .article { + width: 100%; + padding-right: 0; + } + .toc { + display: none; + } + .subtitle.mobile-subtitle { + display: block; + padding-bottom: 10px; + border-bottom: 4px solid #ffbb00; + } + .question { + border-bottom: 1px solid #e6e7ec; + font-size: 12px; + } + .question .subtitle { + position: relative; + margin: 0; + padding: 10px 0 10px 30px; + color: #454ade; + font-weight: normal; + } + .question .subtitle:before { + content: ''; + position: absolute; + top: 14px; + left: 0; + width: 20px; + height: 20px; + background: url('images/main-sprite.png') no-repeat -180px -62px; + } + .question.active .subtitle:before { + background-position: -200px -62px; + } + .question .content { + display: none; + padding-left: 30px; + font-size: 15px; + } + h3.help { + font-size: 15px; + } + h3.help a { + color: #454ade; + } + .question .download { + position: absolute; + top: 50%; + right: 10px; + margin-top: -12px; + } + .map .content { + padding: 0; + } +} +@media screen and (max-width: 800px) { + .subfeature { + width: 100%; + } + .subfeature:first-child { + border-right: 0 none; + border-bottom: 1px solid #ededed; + } + .plugin { + width: 100%; + } + .plugin:nth-child(even) { + margin-right: 0; + } + .plugin .buttons { + font-size: 14px; + } +} +@media screen and (max-width: 650px) { + .headertext { + font-size: 30px; + margin: 100px 0 50px; + } + .header .badges { + padding-bottom: 80px; + } + .menu li { + padding-top: 10px; + padding-bottom: 10px; + font-size: 13px; + } + .menublock .footerlinks { + width: 45%; + max-width: none; + margin-right: 1%; + } + .article-menu-wrapper { + top: -102px; + } +} +@media screen and (max-width: 550px) { + .headerlogo { + width: 120px; + } + .menu li { + padding-right: 35px; + } + .featurestitle h2 { + font-size: 2em; + } + .featureblocktitle:before { + top: 25px; + width: 40px; + height: 40px; + background: url('images/main-sprite.png') no-repeat 0 0; + background-size: 205px; + } + .featureblocktitle.feature-map:before { + background-position: -51px 0; + } + .featureblocktitle.feature-bike:before { + background-position: -102px 0; + } + .featureblocktitle.feature-opensource:before { + background-position: -153px 0; + } + .featureblocktitle h2 { + font-size: 24px; + } + .screenshots { + padding: 20px 0 100px; + } + .sliderheader { + padding: 0 40px; + } + .feature .description h2 { + font-size: 22px; + font-weight: 700; + } + .subfeature .subfeatureheader { + font-size: 24px; + font-weight: 700; + } +} +@media screen and (max-width: 500px) { + .selectbox { + left: 20px; + width: auto; + } +} +@media screen and (max-width: 470px) { + .sliderheader h2 { + padding-bottom: 10px; + } + .sliderheader .switch { + position: static; + padding-bottom: 20px; + text-align: left; + } + .footerlogo { + float: none; + } + .footer .contactus { + float: none; + } +} +@media screen and (max-width: 450px) { + .plugin .buttonscontainer { + position: static; + } + .plugin .buttons .readmore { + position: static; + margin-top: 30px; + border-bottom: 0 none; + text-align: center; + text-decoration: underline; + } +} +@media screen and (max-width: 360px) { + .menu-hamburger { + right: 10px; + } + .headertext { + padding: 0 20px; + font-size: 24px; + } + .badges { + padding: 0 20px; + } + .featurestitle { + padding: 25px 20px; + } + .featureblock { + padding: 0 20px; + } + .sliderheader { + padding: 0; + } + .sliderheader h2, + .sliderheader .switch { + padding-left: 40px; + } + .screenshots { + padding: 20px 0 50px; + } + .blogcontainer > div { + padding: 0 20px; + } + .blogcontainer > div:first-child { + padding-right: 20px; + } + .blogcontainer > div:last-child { + padding-left: 20px; + } + .question .content { + padding-left: 0; + } +} +@media screen and (max-width: 320px) { + .menu-hamburger.in-menu { + right: -270px; + } +} diff --git a/OsmAnd/assets/server/css/src/style.less b/OsmAnd/assets/server/css/src/style.less new file mode 100644 index 0000000000..0333f45125 --- /dev/null +++ b/OsmAnd/assets/server/css/src/style.less @@ -0,0 +1,1693 @@ +@import 'vars.less'; +@import 'slick.less'; + +body +{ + font-family:Arial, Helvetica, sans-serif; + font-size:1.1em; + height:100%; + line-height:1.4em; + margin:0; + padding:0; +} + +ul li +{ + margin:0; + padding:0; +} + +h1 +{ + -webkit-margin-before:0; + -webkit-margin-after:0; + margin-top:0; + margin-bottom:0; + font-weight:400; + font-size:3em; + letter-spacing:.06em; + padding-top:25px; + padding-bottom:25px; + line-height:1em; +} + +xmp,pre +{ + white-space:pre-wrap; +} + +.maincontainer +{ + width:100%; + height:auto; + overflow:hidden; + background-color:#CFCFCF; + min-width:1250px; +} + +.main +{ + position:relative; + max-width:1920px; + min-height:100%; + margin:0 auto; +} + +.header +{ + position:relative; + color:#fff; + height:0; + padding-top:40%; + background:url(images/header_image.jpg) center top no-repeat; + background-size:contain; +} + +.shadowline +{ + position:absolute; + top:0; + width:100%; + height:100px; + background:rgba(21, 29, 45, 0.77); +} + +.headertitle +{ + position:absolute; + bottom:-15px; + left:20%; + right:20%; + background:#fff; + border:2px solid; + border-radius:15px; +} + +.headerlogo +{ + position:absolute; + top:5px; + left:21%; + width:200px; + height:77px; + background:url(images/logo.png) center top no-repeat; + background-size:contain; +} + +.headertext +{ + position:absolute; + top:35%; + left:21%; + font-size:50px; + letter-spacing:.06em; + line-height:1.6em; +} + +.menu +{ + position:absolute; + top:38px; + right:10%; + list-style-type:none; + font-family:Verdana, Arial; + font-weight:700; + letter-spacing:.06em; +} + +.menu { + font-size: 0; +} +.menu li +{ + display: inline-block; + vertical-align: middle; + font-size: 18px; + letter-spacing: 1.05px; + padding-right:55px; +} + +.menu .activeitem a +{ + color:#ff8f00; +} + +.badges +{ + position:absolute; + top:70%; + left:21%; +} + +.badges li +{ + float:left; + padding-left:15px; +} + +.badges li img +{ + height:45px; + border:none; +} + +.header .blogbutton +{ + position:absolute; + top:30%; + right:12%; + height:280px; + width:280px; + background-color:#ff8f00; + color:#fff; + text-align:center; + font-weight:700; + max-width:20%; + overflow:hidden; + -webkit-border-radius:10px; + -moz-border-radius:10px; + border-radius:10px; +} + +.badges li.survey +{ + float:none; + padding-left:0; + line-height:120px; + clear:left; +} + +.badges .surveylink +{ + background-color:#ff8f00; + color:#fff; + -webkit-border-radius:5px; + -moz-border-radius:5px; + border-radius:5px; + text-decoration:none; + padding:10px 20px; +} + +.header .five +{ + font-size:120pt; + line-height:130pt; +} + +.header .years +{ + font-size:28pt; + letter-spacing:.15em; +} + +.header .joinus +{ + font-size:14pt; + padding-top:17px; + text-decoration:underline; + letter-spacing:.3em; +} + +.simpleheader +{ + height:250px; + color:#fff; + background:url(images/header_image.jpg) center top no-repeat; +} + +.simpleheader .headertext +{ + position:relative; + top:0; + margin-top:35px; + left:0; +} + +.simpleheader .badges +{ + top:170px; + left:73%; +} + +.simpleheader .headerlogo +{ + position:relative; + top:0; + left:0; + margin-top:5px; + float:left; + margin-left:-25px; +} + +.simpleheader .menu +{ + position:relative; + float:right; + margin-top:38px; + left:0; + top:0; + margin-right:-55px; +} + +.specialevent +{ + position:relative; + background:#fff; + height:650px; +} + +.specialeventwrap +{ + width:900px; + position:absolute; + left:50%; + margin-top:-60px; +} + +.specialeventcontent +{ + position:relative; + left:-50%; + border-radius:15px; + background:#fff; +} + +.specialeventtext +{ + width:85%; + padding-top:20px; + overflow:hidden; + line-height:1.6em; + font-size:18px; + margin:0 auto; +} + +.specialeventtext p,.specialeventtext ul +{ + padding-bottom:10px; +} + +.specialeventtext .beforelist +{ + padding-bottom:0; + margin-bottom:5px; +} + +.specialeventtext.hidden +{ + color:#fff; + padding-bottom:60px; + width:900px; +} + +.specialevent .headertitletext +{ + letter-spacing:0; + font-weight:700; +} + +.headertitletext +{ + text-align:center; + color:#000; + line-height:1.6em; + font-size:22px; + padding:3px 0; +} + +.featurestitle +{ + text-align:center; + color:#000; + padding:25px 0; +} + +.featurestitle p +{ + color:#9A9A9A; + font-size:1.2em; +} + +.featurestitle h1 +{ + color:#ff8f00; + padding-bottom:0; +} + +.featurescontainer +{ + width:1100px; + position:relative; + margin:50px auto; +} + +.featureblock +{ + width:500px; + float:left; + padding-left:100px; + min-height:550px; + margin-top:15px; +} + +.featureblocktitle +{ + border-bottom:6px solid #ff8f00; + margin-bottom:40px; + position:relative; +} + +.featureblocktitle img +{ + position:absolute; + bottom:0; + left:0; + width:60px; + margin-bottom:30px; +} + +.featureblocktitle h1 +{ + float:left; + padding-left:95px; + padding-top:5px; + max-width:400px; + min-height:60px; + font-size:2.3em; + margin-bottom:0; +} + +.featureblocktitle .warning +{ + color:#ff8f00; + font-size:.6em; + letter-spacing:0; +} + +.mapexample +{ + background:#fff; + position:relative; + padding-top:20px; + padding-bottom:20px; +} + +.mapcontainer +{ + position:relative; + background:url(images/cycling-default.png) center center no-repeat; + height:450px; + background-size:cover; + margin:0 auto 40px; +} + +.selectbox +{ + width:157px; + position:absolute; + top:20px; + right:15%; + background-color:#fff; + -webkit-border-radius:5px; + -moz-border-radius:5px; + border-radius:5px; + padding:15px; +} + +.selectbox .selecttitle +{ + color:#2196F3; + font-weight:700; + font-size:14px; + padding:19px 5px 6px; +} + +.selectbox .selecttitle.first +{ + padding-top:2px; +} + +.selectbox ul +{ + padding-left:0; + margin:0; +} + +.selectbox ul li +{ + line-height:1.2em; + font-size:.6em; +} + +.selectbox input +{ + padding-top:5px; + cursor:pointer; +} + +.selectbox label +{ + cursor:pointer; +} + +.screenshots +{ + background:#FFF; + position:relative; + overflow:hidden; + padding:20px 20px 100px; +} + +.arrow +{ + cursor:pointer; + position:absolute; + top:50%; +} + +.left +{ + left:-60px; +} + +.right +{ + right:-50px; +} + +.screenshots .screenshot +{ + float:left; + padding-left:30px; + max-width:250px; + max-height:445px; +} + +.sliderheader h1 +{ + float:left; + padding-bottom:50px; +} + +.sliderheader .switch +{ + float:right; + text-align:center; + padding-top:35px; + color:#fff; + cursor:pointer; +} + +.sliderheader .switch .button +{ + float:left; + width:75px; + background:#D4D4D4; + padding:15px; +} + +.sliderheader .switch .button.left +{ + -webkit-border-radius:8px 0 0 8px; + -moz-border-radius:8px 0 0 8px; + border-radius:8px 0 0 8px; +} + +.sliderheader .switch .button.right +{ + -webkit-border-radius:0 8px 8px 0; + -moz-border-radius:0 8px 8px 0; + border-radius:0 8px 8px 0; +} + +.sliderheader .switch .button.active +{ + background-color:#ff8f00; +} + +.blogcontainerwrap +{ + background:#fff; + line-height:1.7em; + padding-bottom:25px; +} + +.blogcontainer +{ + width:1100px; + overflow:hidden; + margin:0 auto; +} + +.blogcontainer .leftcolumn +{ + float:left; + width:500px; +} + +.blogcontainer .rightcolumn +{ + float:right; + width:400px; + padding-bottom:10px; +} + +.blogitem h3 +{ + font-size:1.2em; + color:#76B6F6; + font-weight:400; + margin:0; +} + +.blogitem p +{ + margin-top:5px; +} + +.blogitem .readmore +{ + text-align:left; + display:inline-block; + margin-bottom:40px; +} + +.blogitem .date +{ + float:right; + color:#9A9A9A; +} + +.imageholder +{ + text-align:center; + margin:10px; +} + +.imageholder img +{ + border:1px solid #ddd; + max-width:300px; + padding:10px; +} + +.articles .textlist +{ + margin-bottom:50px; +} + +.pds-box.osmand +{ + border-radius:0; +} + +.footer +{ + position:relative; + background-color:#43464D; + line-height:1.7em; +} + +.logoblock +{ + float:left; + margin-top:15px; + margin-left:-25px; +} + +.menublock +{ + float:right; + width:600px; + margin-right:-60px; +} + +.footer .narrow +{ + width:24%; + float:left; +} + +.footer .wide +{ + width:38%; + float:left; +} + +.footerlogo +{ + background:url(images/logo.png) center top no-repeat; + width:200px; + height:77px; + background-size:contain; +} + +.footer .contactus +{ + width:200px; + margin-left:70px; + margin-top:15px; +} + +.footerlinkstitle +{ + color:#ff8f00; + margin-top:45px; + margin-bottom:10px; + font-weight:700; + font-size:.8em; +} + +.footer ul +{ + list-style-type:none; + font-size:.8em; + padding-left:0; + padding-bottom:40px; +} + +.footer ul li +{ + line-height:1.8em; +} + +.articlescontainer +{ + position:relative; + overflow:hidden; + width:1100px; + margin:0 auto; +} + +.acticlestitles +{ + float:right; + width:300px; + margin-top:20px; + border:1px solid #e6e6e6; + padding:20px; +} + +.acticlestitles h1 +{ + font-size:.9em; + padding-bottom:15px; + letter-spacing:.2em; + font-weight:700; + padding-top:0; +} + +.acticlestitles .delimiter +{ + border-top:4px solid #FF8601; + width:100%; + margin-bottom:15px; +} + +.acticlestitles ul li +{ + padding-bottom:10px; + padding-left:10px; +} + +.acticlestitles ul li.last +{ + padding-bottom:0; +} + +.textlist +{ + list-style-type:disc; + padding-left:30px; +} + +.textlist li +{ + padding-top:10px; +} + +.article +{ + float:left; + width:735px; + margin-bottom:25px; +} + +.article h1 +{ + font-size:34px; +} + +.article .rightimage +{ + float:right; + width:450px; +} + +.article .centeredimageblog +{ + width:735px; + text-align:center; + margin:30px auto 0; +} + +.article .centeredimageblog img +{ + width:200px; + margin-bottom:20px; + border:1px solid #ccc; + margin-right:10px; + padding:10px; +} + +.article .centeredimageblog.wide img +{ + width:auto; + max-height:300px; +} + +.article .noborder img +{ + border:none; + padding:0; +} + +.article .leftimage +{ + border:1px solid #ccc; + width:200px; + padding:10px; +} + +.social_network_button +{ + float:right; + line-height:1em; +} + +.share_buttons .gplus +{ + width:86px; +} + +.share_buttons +{ + width:300px; + margin:0 auto 21px; +} + +.fb +{ + padding:2px; +} + +.fb-like +{ + width:80px; +} + +.fb-like span,.fb-like iframe +{ + width:80px!important; + height:21px!important; +} + +.discount +{ + background:url(images/discount-badge.png) center top no-repeat; + background-size:contain; + position:absolute; + top:35%; + right:15%; + width:200px; + height:200px; +} + +.dvrlogo +{ + background:url(images/ic_dvr_mainicon.png) left top no-repeat; + background-size:contain; + width:80px; + height:80px; + margin:0 auto; +} + +.nearlogotext +{ + vertical-align:top; + display:inline-block; + padding:15px; +} + +.appstorebadge img +{ + width:100px; + display:block; + margin:0 auto; +} + +#map +{ + position:absolute; + top:65px; + bottom:50px; + width:100%; +} + +.gocontainer +{ + height:100%; +} + +.goheader +{ + border-bottom:1px solid #ccc; + width:100%; + -webkit-box-shadow:2px 2px 5px #CAC8C3; + -moz-box-shadow:2px 2px 5px #CAC8C3; + box-shadow:2px 2px 5px #CAC8C3; + position:absolute; + top:0; + height:63px; +} + +.goheader img +{ + height:48px; + padding:7px 7px 5px 20px; +} + +.gofooter +{ + position:absolute; + bottom:0; + width:100%; + background:#fff; + -webkit-box-shadow:2px -2px 5px #CAC8C3; + -moz-box-shadow:2px -2px 5px #CAC8C3; + box-shadow:2px -2px 5px #CAC8C3; +} + +.coordinatescontainer +{ + width:100px; + float:right; + padding-top:14px; + padding-right:20px; +} + +.coordinatescontainer .coordinatetitle +{ + font-size:10pt; + color:#9A9A9A; + padding-bottom:3px; +} + +.coordinatescontainer .coordinate +{ + font-weight:700; + color:#000; + padding-left:5px; + font-size:12pt; +} + +.gobadges +{ + height:50px; + background-color:#43464D; + overflow:hidden; +} + +.badgescontainer +{ + width:360px; + margin:0 auto; +} + +.gobadges .badgecontainer +{ + float:left; + width:32%; + max-width:120px; + height:50px; +} + +.gobadges .badgecontainer img +{ + max-width:100px; + height:35px; + padding:8px; +} + +.gobadges .apple img +{ + padding-left:1px; + max-width:114px; +} + +.whatyousay +{ + background:#EDEDED; + position:relative; + padding:20px; +} + +.whatyousaycontainer .titleicon +{ + position:absolute; + width:60px; + left:-80px; + top:30px; +} + +.whatyousaycontainer .badgescontainer +{ + text-align:center; + position:relative; + width:500px; + margin-bottom:20px; + margin-top:20px; +} + +.whatyousaycontainer .badges +{ + position:relative; + left:0; + top:0; + width:800px; +} + +.whatyousaycontainer .badges li +{ + padding-left:30px; +} + +.whatyousayblock +{ + float:left; + width:500px; + padding-left:90px; + min-height:230px; +} + +.whatyousaymessage +{ + position:relative; + background-color:#fff; + width:460px; + font-style:italic; + line-height:1.5em; + -webkit-border-radius:5px; + -moz-border-radius:7px; + border-radius:7px; + -webkit-box-shadow:2px 2px 5px #CAC8C3; + -moz-box-shadow:2px 2px 5px #CAC8C3; + box-shadow:2px 2px 5px #CAC8C3; + padding:20px; +} + +.whatyousayblock .signature +{ + padding-left:10px; + margin-top:20px; +} + +.whatyousayblock .signature .source +{ + color:#9A9A9A; + font-size:.9em; + margin-top:5px; +} + +.whatyousaymessage img +{ + position:absolute; + bottom:-14px; + left:28px; + width:20px; +} + +.pluginscontainer .readmore +{ + color:#adadad; + text-decoration:none; + border-bottom:1px solid #d6d6d6; +} + +.pluginscontainer .readmore a +{ + color:#adadad; + text-decoration:none; +} + +.featurecontainer +{ + border:1px solid #ededed; + padding:7px; +} + +.featurecontainer.sub +{ + margin-top:-1px; + padding:0; +} + +.featurecontainer.last +{ + margin-top:30px; + margin-bottom:30px; +} + +.feature +{ + position:relative; + min-height:410px; +} + +.feature.firstusage +{ + background-image:url(images/features/first_usage.jpg); +} + +.feature.navigation +{ + background-image:url(images/features/navigation.jpg); +} + +.feature .description +{ + width:40%; + position:absolute; + height:100%; + left:0; + top:0; + background-color:rgba(255,143,0,.9); + color:#fff; +} + +.feature .descriptioncontent +{ + position:relative; + padding:40px; +} + +.feature h1 +{ + font-size:34px; + padding:40px; +} + +.feature .description p +{ + margin:0 0 100px; + padding:0 40px; +} + +.feature .readmore +{ + position:absolute; + bottom:40px; + left:40px; + color:#fff; + text-decoration:none; + border-bottom:1px solid #fff; +} + +.subfeature +{ + float:left; + width:544px; +} + +.subfeature.odd +{ + border-left:1px solid #ededed; +} + +.subfeaturecontent +{ + padding:25px 25px 25px 75px; +} + +.subfeature .subfeatureheader +{ + font-size:34px; + color:#619CD4; +} + +.subfeature .text +{ + height:69px; + overflow:hidden; + margin-bottom:20px; + padding:20px 20px 0 0; +} + +.plugin +{ + float:left; + width:470px; + position:relative; + min-height:340px; + border:1px solid #ededed; + margin-bottom:30px; + padding:30px; +} + +.plugin .pluginpicture +{ + height:230px; + border:1px solid #ededed; +} + +.plugin h1 +{ + font-size:30px; + color:#619CD4; + padding-bottom:10px; + line-height:40px; + letter-spacing:0; +} + +.plugin .plugintext +{ + height:100px; + margin-bottom:60px; + overflow:hidden; +} + +.plugin .buttonscontainer +{ + position:absolute; + bottom:30px; + width:470px; +} + +.plugin .buttons .pricetype +{ + float:left; + background-color:#ededed; + color:#9a9a9a; + font-weight:700; + padding:10px 15px; +} + +.plugin .buttons .readmore +{ + float:right; + padding-top:15px; +} + +.plugin .buttons .getbutton +{ + float:left; + background-color:#7ACC2E; + margin-right:20px; + padding:10px 15px; +} + +.plugin .buttons .getbutton a +{ + color:#FFF; + text-decoration:none; + font-weight:700; +} + +.plugin .buttons .getbutton a:visited +{ + color:#FFF; + text-decoration:none; +} + +.featuresheader +{ + margin-bottom:30px; +} + +.featuresheader .headerpart +{ + float:left; + width:44%; + background:#ff8f00; + border:0; + height:3px; +} + +.featuresheader .featuresheadertext +{ + float:left; + letter-spacing:.11em; + font-weight:700; + padding:0 19px; +} + +.plugin .onlinemaps +{ + background:url(images/features/online_maps_main.png) no-repeat; +} + +.plugin .contourlines +{ + background:url(images/features/contour_lines_main.png) no-repeat; +} + +.plugin .triprecordingtool +{ + background:url(images/features/trip_recording_tool_main.png) no-repeat; +} + +.plugin .skimaps +{ + background:url(images/features/ski_maps_main.png) no-repeat; +} + +.plugin .nauticalcharts +{ + background:url(images/features/nautical_charts_main.png) no-repeat; +} + +.plugin .audiovideo +{ + background:url(images/features/audio_video_note_main.png) no-repeat; +} + +.plugin .osmediting +{ + background:url(images/features/osm_editing_main.png) no-repeat; +} + +.plugin .planningtool +{ + background:url(images/features/planning_tool_main.png) no-repeat; +} + +.plugin .parking +{ + background:url(images/features/parking_main.png) no-repeat; +} + +.plugin .development +{ + background:url(images/features/development_main.png) no-repeat; +} + +.subfeature .viewmap +{ + background:url(images/features/view_map_icon.png) no-repeat 25px 25px; +} + +.subfeature .search +{ + background:url(images/features/search_icon.png) no-repeat 25px 25px; +} + +.subfeature .plantrip +{ + background:url(images/features/plan_trip_icon.png) no-repeat 25px 25px; +} + +.subfeature .install +{ + background:url(images/features/install_icon.png) no-repeat 25px 25px; +} + +.ellipsis +{ + white-space:nowrap; + overflow:hidden; +} + +.ellipsis.multiline +{ + white-space:normal; +} + +.code +{ + font-style:italic; +} + +.list li +{ + padding-bottom:10px; + color:#000; +} + +.subtitle,.subtitle h2 +{ + font-size:1.3em; + margin-top:10px; + font-weight:700; +} + +.blocksubtitle +{ + font-weight:700; + margin-top:10px; + font-size:1.2em; +} + +.blocksubsubtitle +{ + font-weight:700; + margin-top:10px; + font-size:1.1em; +} + +.content +{ + padding:5px 15px 15px; +} + +.content ul +{ + padding-left:20px; +} + +.help h1 +{ + font-size:41px; + letter-spacing:.03em; + margin-top:20px; + margin-bottom:10px; +} + +.contributorsbanner +{ + width:100%; + background:url(images/help/contributors.png) center top no-repeat; + background-size:contain; + height:196px; +} + +.about h3 +{ + margin-top:90px; +} + +.versions .version +{ + border:1px solid #e6e6e6; + padding:20px; +} + +.mainlist li +{ + border-bottom:1px solid #F3F3F3; + padding:15px; +} + +h1.sub +{ + background-color:#536DFE; + margin-top:0; +} + +h1.sub small +{ + display:block; + font-weight:400; + margin-top:5px; +} + +.toc .list li +{ + color:#D2D2D2; +} + +.toc .subtitle +{ + font-weight:400; +} + +.download +{ + width:24px; + height:24px; + padding-left:15px; + vertical-align:bottom; +} + +.imgcontainer +{ + margin:20px 30px; +} + +.legendcontainer +{ + margin:0; +} + +.clear +{ + clear:both; +} + +.disabled +{ + cursor:default; +} + +.osmlive h1 +{ + margin-top:30px; +} + +.osmlive h3 +{ + margin-top:50px; +} + +.osmlive .submenucontainer +{ + height:70px; + width:100%; + background-color:#ff8f00; + color:#fff; + overflow:hidden; +} + +.osmlive .submenu +{ + width:1100px; + padding-top:23px; + letter-spacing:.2em; + font-size:1em; + margin:0 auto; +} + +.osmlive .submenu li +{ + float:left; + padding-right:40px; +} + +.osmlive .tabcontent +{ + width:100%; + background-color:#fff; +} + +.osmlive .article ul +{ + list-style-type:disc; + padding-left:25px; +} + +.osmlive .article ul li +{ + padding-bottom:15px; +} + +.osmlive .formcontainer +{ + width:100%; + margin-top:30px; +} + +.osmlive .formcontainer .column +{ + background-color:#ededed; + width:470px; + padding:30px; +} + +.osmlive .formcontainer .column.left +{ + float:left; +} + +.osmlive input +{ + height:50px; + width:465px; + border:1px solid #d6d6d6; + font-size:1.1em; + padding-left:45px; + margin:5px 0; +} + +.osmlive .info +{ + color:#adadad; +} + +.osmlive .row +{ + margin-bottom:35px; + position:relative; +} + +.osmlive .column h3 +{ + margin-top:0; + margin-bottom:30px; +} + +.osmlive .textbox i +{ + position:absolute; + top:22px; + left:15px; + color:#9a9a9a; +} + +.osmlive .btn +{ + height:45px; + width:130px; + font-size:18px; + color:#fff; + font-weight:700; + border:none; + background-color:#619CD4; + border-radius:5px; + cursor:pointer; +} + +.osmlive form +{ + margin-bottom:0; +} + +.osmlive p +{ + line-height:2em; +} + +.osmlive .column p +{ + line-height:1.4em; + margin-top:5px; +} + +.osmlive .column h4 +{ + margin-bottom:0; + margin-top:40px; +} + +.osmlive .address +{ + background-color:#ff8f00; + color:#fff; + border-radius:5px; + width:440px; + margin-bottom:20px; + padding:10px 15px; +} + +.osmlive .googleplay +{ + height:50px; +} + +ul,.mainlist +{ + list-style-type:none; + margin:0; + padding:0; +} + +a,a:visited +{ + color:#619CD4; +} + +.menu a,.footer .contactus a,.footer ul a +{ + color:#fff; + text-decoration:none; +} + +.badges li.first,.screenshots .first,.noleftpadding +{ + padding-left:0; +} + +.simpleheader .headercontent,.simpleheader .shadowlinecontent,.mapexampleheader,.footercontent +{ + width:1100px; + margin:0 auto; +} + +.simpleheader .shadowline,.screenshots .images,.sliderheader,.article .textandimagecontainer,.plugin .buttons,.osmlive .textbox +{ + position:relative; +} + +.specialeventtext .signature,.whatyousayblock .signature .name,.about .surname,.definition +{ + font-weight:700; +} + +.specialeventlist,.features .categorydescription +{ + list-style-type:disc; + padding-left:25px; + line-height:1.7em; +} + +.specialeventlist li,.features .categorydescription li,.mainlist li.last +{ + border-bottom:none; +} + +.features,.articles +{ + position:relative; + overflow:hidden; + background:#fff; +} + +.slider,.whatyousaycontainer +{ + position:relative; + width:1100px; + margin:0 auto; +} + +.blogitem h3 a,.blogitem h3 a:visited,.acticlestitles ul a,.list li a +{ + text-decoration:none; +} + +.blogitem .readmore a,.articles .date +{ + color:#9A9A9A; +} + +.share_buttons .twitter,.share_buttons .fb +{ + width:100px; +} + +.plugin.odd,.osmlive .formcontainer .column.right +{ + float:right; +} + +.legend,.osmlive .article +{ + width:100%; +} \ No newline at end of file diff --git a/OsmAnd/assets/server/css/src/vars.less b/OsmAnd/assets/server/css/src/vars.less new file mode 100644 index 0000000000..950406619b --- /dev/null +++ b/OsmAnd/assets/server/css/src/vars.less @@ -0,0 +1,43 @@ +@font-family: 'Roboto Regular'; +@text-color: #000; +@oposite-text-color: #fff; +@header-color: #536dfe; +@read-more-color: #adadad; +@brand-orange: #ff8f00; +@opacity-orange-overlay: 0.9; +@separator-bg: #ffbb00; + +@badge-free: #f3f3f3; +@badge-free-text: #737373; +@badge-paid: #62c452; +@badge-paid-text: #fff; + +@footer-bg: #292f33; +@footer-text-color: #fff; +@footer-header-color: #698d8f; +@footer-header-underline-color: #2f4445; +@footer-copyright-color: #525e66; +@footer-font-family: Arial; +@footer-contact-btn-border: #394247; + +@index-app-features-header: #ffa516; +@index-app-features-subheader: #c1c1c1; +@index-banner-btn-bg: #ffa516; +@index-header-color: #000; +@index-subheader-color: #737373; +@index-slider-btn-active: #ffa516; +@index-slider-btn-passive: #d4d4d4; +@index-recomendations-username: #212121; +@index-recomendations-service: #9e9e9e; +@index-news-link-color: #266ce0; +@index-news-read-more-link: #adadad; +@index-news-timestamp: #adadad; +@index-poll-btn-bg: #ff8f00; +@index-poll-result-btn-bg: #ff6c00; +@index-poll-radio-btn-active: #ff8f00; +@index-poll-radio-btn-border: #bbb; + +@blog-article-header: #536dfe; + +@help-question-link: #454ade; +@help-question-border: #e6e7ec; \ No newline at end of file diff --git a/OsmAnd/assets/server/css/style.css b/OsmAnd/assets/server/css/style.css new file mode 100644 index 0000000000..d49cea3634 --- /dev/null +++ b/OsmAnd/assets/server/css/style.css @@ -0,0 +1,2 @@ +/***********************EMPTY USED BY HELP inlining but already defined in site.css + *********************************************/ \ No newline at end of file diff --git a/OsmAnd/assets/server/images/amazon-apps-store.png b/OsmAnd/assets/server/images/amazon-apps-store.png new file mode 100644 index 0000000000000000000000000000000000000000..379a0d654cf045132a128893653c3e1905a3bed5 GIT binary patch literal 4408 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 eJtd^hpJ|mB{rpa7kiLDV5NWF$s5L' + link.title + ''); + } + + var articleid = $.urlParam(window.location.href, 'id'); + if (!articleid || articleid == null){ + articleid = blogArticles[0].id; + } + //hide share buttons + $('.share_buttons').css('display', 'none'); + updateMetaTags(getArticleById(articleid)); + var url = 'blog_articles' + '/' + articleid + ".html"; + $( ".article" ).load(url, function( response, status, xhr) { + if ( status != "error" ) { + + $('.share_buttons').css('display', 'block'); + setTimeout(fixTwitter, 5000); + } + }); + +} + +init(); + + +} \ No newline at end of file diff --git a/OsmAnd/assets/server/scripts/go.js b/OsmAnd/assets/server/scripts/go.js new file mode 100644 index 0000000000..37ab40caab --- /dev/null +++ b/OsmAnd/assets/server/scripts/go.js @@ -0,0 +1,242 @@ +var requestUtils={ + 'getParamValue':function(paramName){ + let value= (location.search.split(paramName + '=')[1]||'').split('&')[0]; + if (value && value.length > 0){ + return value; + } + return null; + }, + 'isIOS':function(){ + return /(iPad|iPhone|iPod)/g.test( navigator.userAgent ); + }, + 'redirect':function(newUrl){ + document.location = newUrl; + } +}; + +var goMap = { + 'config':{ + 'containerid': 'gocontainer', + 'defaults':{ + 'lat':51.505, + 'lon':-0.09, + 'zoom':13 + } + }, + 'utils':{ + 'getPointFromUrl':function(){ + let point = {}; + point.lat = requestUtils.getParamValue('lat'); + point.lon = requestUtils.getParamValue('lon'); + point.zoom = requestUtils.getParamValue('z'); + return point; + }, + 'isPointComplete':function(point){ + if (!point.lat || !point.lon){ + return false; + } + return true; + }, + 'extendPoint':function(initialPoint, newPoint){ + let point={}; + point.lat=newPoint.lat; + if (!point.lat || point.lat == null){ + point.lat = initialPoint.lat; + } + point.lon=newPoint.lon; + if (!point.lon || point.lon == null){ + point.lon = initialPoint.lon; + } + point.zoom=newPoint.zoom; + if (!point.zoom || point.zoom == null){ + point.zoom = initialPoint.zoom; + } + return point; + } + }, + 'init': function(config){ + if (config && typeof (config) == 'object') { + $.extend(goMap.config, config); + } + goMap.$container = $('#' + goMap.config.containerid); + goMap.$footer = goMap.$container.find('.gofooter'); + goMap.$latitude = goMap.$container.find('.latitude'); + goMap.$longitude = goMap.$container.find('.longitude'); + + let inputPoint = goMap.utils.getPointFromUrl(); + goMap.point = goMap.utils.extendPoint(goMap.config.defaults, inputPoint); + goMap.refreshCoordinates(); + + goMap.map =$.mapwidget(); + goMap.map.showPoint(goMap.point); + + let inputComplete = goMap.utils.isPointComplete(inputPoint); + if (inputComplete){ + goMap.map.addMarker(goMap.point); + } + goMap.point = goMap.utils.getPointFromUrl(); + }, + 'refreshCoordinates':function(){ + goMap.$latitude.text(goMap.point.lat); + goMap.$longitude.text(goMap.point.lon); + } +}; + +(function($) { + $.mapwidget = function(config) { + var loc = goMap.point.lat + '/' + goMap.point.lon; + var lparams = '?mlat='+goMap.point.lat + '&mlon=' + goMap.point.lon; + var mapobj={ + config: $.extend({ + 'mapid':'map', + 'maxzoom':20, + 'maxnativezoom':19, + 'sourceurl':'https://tile.osmand.net/hd/{z}/{x}/{y}.png', + 'attribution':'© OpenStreetMap contributors' + }, config), + init:function(){ + mapobj.map = L.map(mapobj.config.mapid); + L.tileLayer(mapobj.config.sourceurl, { + attribution: mapobj.config.attribution, + maxZoom: mapobj.config.maxzoom, + maxNativeZoom: mapobj.config.maxnativezoom + }).addTo(mapobj.map); + }, + showPoint:function(point){ + mapobj.map.setView([point.lat, point.lon], point.zoom); + }, + addMarker:function(point){ + L.marker([point.lat, point.lon]).addTo(mapobj.map); + } + }; + mapobj.init(); + return { + showPoint: mapobj.showPoint, + addMarker: mapobj.addMarker + }; + }; +})(jQuery); + +(function($) { + $.timer=function(config){ + var timerobj={ + config: $.extend({ + 'timeoutInMs':300, + 'maxActionDelayInMs':2000, + 'action':function(){}, + 'actionparams':null + }, config), + init:function(){ + timerobj.timer = null; + timerobj.startDate = null; + }, + start:function(){ + timerobj.cancel(); + timerobj.startDate = new Date(); + timerobj.timer=setTimeout(timerobj.onTimer, timerobj.config.timeoutInMs); + }, + cancel:function(){ + if (timerobj.timer != null){ + clearTimeout(timerobj.timer); + timerobj.timer = null; + timerobj.startDate = null; + } + }, + onTimer:function(){ + timerobj.timer= null; + let now = new Date(); + if(now - timerobj.startDate < timerobj.config.maxActionDelayInMs){ + timerobj.config.action(timerobj.config.actionparams); + } + } + }; + timerobj.init(); + return { + start:timerobj.start, + cancel:timerobj.cancel + }; + }; +})(jQuery); + +var iosAppRedirect = { + config:{ + appPrefix:'osmandmaps://', + containerid:'gocontainer', + cookieName:'OsmAndInstalled', + cookieNoExpirationTimeoutInDays:30 + }, + init:function(config){ + if (config && typeof (config) == 'object') { + $.extend(iosAppRedirect.config, config); + } + + if (!requestUtils.isIOS()){ + return; + } + iosAppRedirect.$container = $('#' + iosAppRedirect.config.containerid); + iosAppRedirect.$overlay = iosAppRedirect.$container.find('.overlay'); + iosAppRedirect.$popup = iosAppRedirect.$container.find('.popup'); + iosAppRedirect.$yesBtn = iosAppRedirect.$container.find('.yes'); + iosAppRedirect.$noBtn = iosAppRedirect.$container.find('.no'); + iosAppRedirect.$cancelBtn = iosAppRedirect.$container.find('.cancel'); + iosAppRedirect.applestorelink = iosAppRedirect.$container.find('.gobadges .apple a').attr('href'); + iosAppRedirect.applink = iosAppRedirect.config.appPrefix + document.location.search; + + + if (iosAppRedirect.isAppInstalled() === "yes"){ + iosAppRedirect.redirectToApp(); + return; + } + if (iosAppRedirect.isAppInstalled() === "no"){ + return; + } + + iosAppRedirect.$yesBtn.on('click', function(){ + iosAppRedirect.redirectToApp(); + iosAppRedirect.closePopup(); + }); + + iosAppRedirect.$noBtn.on('click', function(){ + iosAppRedirect.setCookie(true); + iosAppRedirect.closePopup(); + window.open(iosAppRedirect.applestorelink , '_blank'); + }); + + iosAppRedirect.$cancelBtn.on('click', function(){ + iosAppRedirect.setCookie(false); + iosAppRedirect.closePopup(); + }); + iosAppRedirect.openPopup(); + }, + isAppInstalled:function(){ + return Cookies.get('OsmAndInstalled'); + }, + redirectToApp:function(){ + iosAppRedirect.timer = $.timer({action:iosAppRedirect.clearCookie}); + iosAppRedirect.timer.start(); + requestUtils.redirect(iosAppRedirect.applink); + }, + setCookie:function(appInstalled){ + if (appInstalled === true){ + Cookies.set(iosAppRedirect.config.cookieName, "yes"); + }else{ + Cookies.set(iosAppRedirect.config.cookieName, "no", { expires: iosAppRedirect.config.cookieNoExpirationTimeoutInDays }); + } + }, + clearCookie:function(){ + Cookies.remove('OsmAndInstalled'); + }, + openPopup:function(){ + iosAppRedirect.$overlay.show(); + iosAppRedirect.$popup.show(); + }, + closePopup:function(){ + iosAppRedirect.$overlay.hide(); + iosAppRedirect.$popup.hide(); + } +}; + + $( document ).ready(function() { + goMap.init(); + iosAppRedirect.init(); + }); diff --git a/OsmAnd/assets/server/scripts/jquery-1.11.1.min.js b/OsmAnd/assets/server/scripts/jquery-1.11.1.min.js new file mode 100644 index 0000000000..ab28a24729 --- /dev/null +++ b/OsmAnd/assets/server/scripts/jquery-1.11.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="

",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("