Browse files

Merge branch 'master' of github.com:openlayers/ol3 into vector

  • Loading branch information...
2 parents 4918106 + 1f510d8 commit 4422e3e73b0fc56c3bf2b0e6fe918abd69852502 @tschaub tschaub committed Mar 7, 2013
Showing with 16,315 additions and 1,555 deletions.
  1. +202 −0 bin/closure/depswriter.py
  2. +114 −0 bin/closure/source.py
  3. +78 −0 bin/closure/treescan.py
  4. +57 −5 build.py
  5. +19 −15 build/loader_hosted_examples.js
  6. +47 −37 examples/anchored-elements.html
  7. +3 −4 examples/anchored-elements.js
  8. +60 −0 examples/animation.html
  9. +122 −0 examples/animation.js
  10. +52 −0 examples/bing-maps.html
  11. +26 −0 examples/bing-maps.js
  12. +1,109 −0 examples/bootstrap/css/bootstrap-responsive.css
  13. +9 −0 examples/bootstrap/css/bootstrap-responsive.min.css
  14. +6,158 −0 examples/bootstrap/css/bootstrap.css
  15. +9 −0 examples/bootstrap/css/bootstrap.min.css
  16. BIN examples/bootstrap/img/glyphicons-halflings-white.png
  17. BIN examples/bootstrap/img/glyphicons-halflings.png
  18. +2,276 −0 examples/bootstrap/js/bootstrap.js
  19. +6 −0 examples/bootstrap/js/bootstrap.min.js
  20. +62 −0 examples/brightness-contrast.html
  21. +47 −0 examples/brightness-contrast.js
  22. +50 −31 examples/canvas-tiles.html
  23. +4 −5 examples/canvas-tiles.js
  24. +40 −35 examples/epsg-4326.html
  25. +10 −6 examples/epsg-4326.js
  26. +204 −292 examples/example-list.html
  27. +15 −0 examples/examples.css
  28. +53 −0 examples/export-jpeg.html
  29. +26 −0 examples/export-jpeg.js
  30. +22 −0 examples/font-awesome/README.md
  31. +22 −0 examples/font-awesome/css/font-awesome-ie7.min.css
  32. +540 −0 examples/font-awesome/css/font-awesome.css
  33. +33 −0 examples/font-awesome/css/font-awesome.min.css
  34. BIN examples/font-awesome/font/FontAwesome.otf
  35. BIN examples/font-awesome/font/fontawesome-webfont.eot
  36. +284 −0 examples/font-awesome/font/fontawesome-webfont.svg
  37. BIN examples/font-awesome/font/fontawesome-webfont.ttf
  38. BIN examples/font-awesome/font/fontawesome-webfont.woff
  39. +12 −39 examples/full-screen.html
  40. +4 −21 examples/full-screen.js
  41. +62 −0 examples/hue-saturation.html
  42. +47 −0 examples/hue-saturation.js
  43. +52 −0 examples/mapquest.html
  44. +23 −0 examples/mapquest.js
  45. +53 −0 examples/mouse-position.html
  46. +32 −0 examples/mouse-position.js
  47. +52 −0 examples/scale-line.html
  48. +29 −0 examples/scale-line.js
  49. +67 −74 examples/side-by-side.html
  50. +4 −153 examples/side-by-side.js
  51. +52 −0 examples/simple.html
  52. +21 −0 examples/simple.js
  53. +40 −30 examples/stamen.html
  54. +16 −17 examples/stamen.js
  55. +0 −62 examples/style.css
  56. +52 −0 examples/tilejson.html
  57. +23 −0 examples/tilejson.js
  58. +0 −40 examples/two-layers.html
  59. +0 −56 examples/two-layers.js
  60. +39 −42 examples/wms-capabilities.html
  61. +40 −35 examples/wms-custom-proj.html
  62. +12 −11 examples/wms-custom-proj.js
  63. +52 −0 examples/wms-single-image.html
  64. +33 −0 examples/wms-single-image.js
  65. +52 −0 examples/wms-tiled.html
  66. +2 −3 examples/{wms.js → wms-tiled.js}
  67. +0 −47 examples/wms.html
  68. +17 −10 readme.md
  69. +37 −21 src/objectliterals.exports
  70. +1 −1 src/ol/collection.exports
  71. +37 −32 src/ol/collection.js
  72. +6 −5 src/ol/control/attributioncontrol.js
  73. +1 −0 src/ol/control/defaults.exports
  74. +42 −0 src/ol/control/defaults.js
  75. +13 −12 src/ol/control/mousepositioncontrol.js
  76. +2 −2 src/ol/control/scalelinecontrol.js
  77. +7 −5 src/ol/control/zoomcontrol.js
  78. +2 −2 src/ol/geolocation.js
  79. +1 −0 src/ol/interaction/defaults.exports
  80. +101 −0 src/ol/interaction/defaults.js
  81. +2 −0 src/ol/map.exports
  82. +60 −161 src/ol/map.js
  83. +10 −0 src/ol/parser/ogc/wmscapabilities.js
  84. +62 −0 src/ol/parser/ogc/wmscapabilities_v1_0_0.js
  85. +1 −1 src/ol/parser/ogc/wmtscapabilities_v1_0_0.js
  86. +8 −4 src/ol/projection.exports
  87. +151 −68 src/ol/projection.js
  88. +6 −2 src/ol/projection/epsg3857.js
  89. +7 −2 src/ol/projection/epsg4326.js
  90. +2 −1 src/ol/renderer/canvas/canvastilelayerrenderer.js
  91. +2 −1 src/ol/renderer/dom/domtilelayerrenderer.js
  92. +7 −5 src/ol/renderer/layerrenderer.js
  93. +2 −1 src/ol/renderer/webgl/webgltilelayerrenderer.js
  94. +3 −3 src/ol/source/bingmapssource.js
  95. +1 −1 src/ol/source/imagesource.js
  96. +1 −1 src/ol/source/imagetilesource.js
  97. +4 −5 src/ol/source/source.js
  98. +11 −9 src/ol/source/stamensource.js
  99. +2 −1 src/ol/source/staticimagesource.js
  100. +1 −1 src/ol/source/tiledwms.exports
  101. +3 −3 src/ol/source/tiledwmssource.js
  102. +4 −4 src/ol/source/tilejsonsource.js
  103. +1 −2 src/ol/source/tilesource.js
  104. +2 −2 src/ol/source/wms.js
  105. +1 −1 src/ol/source/xyzsource.js
  106. +0 −7 src/ol/tile.js
  107. +2 −10 src/ol/tilequeue.js
  108. +2 −0 src/ol/view2d.exports
  109. +63 −25 test/spec/ol/collection.test.js
  110. +1 −2 test/spec/ol/extent.test.js
  111. +8 −8 test/spec/ol/layer/layer.test.js
  112. +4 −3 test/spec/ol/map.test.js
  113. +45 −0 test/spec/ol/parser/ogc/wmscapabilities_v1_0_0.test.js
  114. +2,855 −0 test/spec/ol/parser/ogc/xml/wmscapabilities_v1_0_0.xml
  115. +5 −5 test/spec/ol/projection.epsg3857.test.js
  116. +66 −34 test/spec/ol/projection.test.js
  117. +2 −2 test/spec/ol/source/tilesource.test.js
  118. +5 −5 test/spec/ol/tilegrid.test.js
  119. +4 −23 test/spec/ol/tilequeue.test.js
  120. +2 −2 test/spec/ol/tileurlfunction.test.js
View
202 bin/closure/depswriter.py
@@ -0,0 +1,202 @@
+#!/usr/bin/env python
+#
+# Copyright 2009 The Closure Library Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+"""Generates out a Closure deps.js file given a list of JavaScript sources.
+
+Paths can be specified as arguments or (more commonly) specifying trees
+with the flags (call with --help for descriptions).
+
+Usage: depswriter.py [path/to/js1.js [path/to/js2.js] ...]
+"""
+
+import logging
+import optparse
+import os
+import posixpath
+import shlex
+import sys
+
+import source
+import treescan
+
+
+__author__ = 'nnaze@google.com (Nathan Naze)'
+
+
+def MakeDepsFile(source_map):
+ """Make a generated deps file.
+
+ Args:
+ source_map: A dict map of the source path to source.Source object.
+
+ Returns:
+ str, A generated deps file source.
+ """
+
+ # Write in path alphabetical order
+ paths = sorted(source_map.keys())
+
+ lines = []
+
+ for path in paths:
+ js_source = source_map[path]
+
+ # We don't need to add entries that don't provide anything.
+ if js_source.provides:
+ lines.append(_GetDepsLine(path, js_source))
+
+ return ''.join(lines)
+
+
+def _GetDepsLine(path, js_source):
+ """Get a deps.js file string for a source."""
+
+ provides = sorted(js_source.provides)
+ requires = sorted(js_source.requires)
+
+ return 'goog.addDependency(\'%s\', %s, %s);\n' % (path, provides, requires)
+
+
+def _GetOptionsParser():
+ """Get the options parser."""
+
+ parser = optparse.OptionParser(__doc__)
+
+ parser.add_option('--output_file',
+ dest='output_file',
+ action='store',
+ help=('If specified, write output to this path instead of '
+ 'writing to standard output.'))
+ parser.add_option('--root',
+ dest='roots',
+ default=[],
+ action='append',
+ help='A root directory to scan for JS source files. '
+ 'Paths of JS files in generated deps file will be '
+ 'relative to this path. This flag may be specified '
+ 'multiple times.')
+ parser.add_option('--root_with_prefix',
+ dest='roots_with_prefix',
+ default=[],
+ action='append',
+ help='A root directory to scan for JS source files, plus '
+ 'a prefix (if either contains a space, surround with '
+ 'quotes). Paths in generated deps file will be relative '
+ 'to the root, but preceded by the prefix. This flag '
+ 'may be specified multiple times.')
+ parser.add_option('--path_with_depspath',
+ dest='paths_with_depspath',
+ default=[],
+ action='append',
+ help='A path to a source file and an alternate path to '
+ 'the file in the generated deps file (if either contains '
+ 'a space, surround with whitespace). This flag may be '
+ 'specified multiple times.')
+ return parser
+
+
+def _NormalizePathSeparators(path):
+ """Replaces OS-specific path separators with POSIX-style slashes.
+
+ Args:
+ path: str, A file path.
+
+ Returns:
+ str, The path with any OS-specific path separators (such as backslash on
+ Windows) replaced with URL-compatible forward slashes. A no-op on systems
+ that use POSIX paths.
+ """
+ return path.replace(os.sep, posixpath.sep)
+
+
+def _GetRelativePathToSourceDict(root, prefix=''):
+ """Scans a top root directory for .js sources.
+
+ Args:
+ root: str, Root directory.
+ prefix: str, Prefix for returned paths.
+
+ Returns:
+ dict, A map of relative paths (with prefix, if given), to source.Source
+ objects.
+ """
+ # Remember and restore the cwd when we're done. We work from the root so
+ # that paths are relative from the root.
+ start_wd = os.getcwd()
+ os.chdir(root)
+
+ path_to_source = {}
+ for path in treescan.ScanTreeForJsFiles('.'):
+ prefixed_path = _NormalizePathSeparators(os.path.join(prefix, path))
+ path_to_source[prefixed_path] = source.Source(source.GetFileContents(path))
+
+ os.chdir(start_wd)
+
+ return path_to_source
+
+
+def _GetPair(s):
+ """Return a string as a shell-parsed tuple. Two values expected."""
+ try:
+ # shlex uses '\' as an escape character, so they must be escaped.
+ s = s.replace('\\', '\\\\')
+ first, second = shlex.split(s)
+ return (first, second)
+ except:
+ raise Exception('Unable to parse input line as a pair: %s' % s)
+
+
+def main():
+ """CLI frontend to MakeDepsFile."""
+ logging.basicConfig(format=(sys.argv[0] + ': %(message)s'),
+ level=logging.INFO)
+ options, args = _GetOptionsParser().parse_args()
+
+ path_to_source = {}
+
+ # Roots without prefixes
+ for root in options.roots:
+ path_to_source.update(_GetRelativePathToSourceDict(root))
+
+ # Roots with prefixes
+ for root_and_prefix in options.roots_with_prefix:
+ root, prefix = _GetPair(root_and_prefix)
+ path_to_source.update(_GetRelativePathToSourceDict(root, prefix=prefix))
+
+ # Source paths
+ for path in args:
+ path_to_source[path] = source.Source(source.GetFileContents(path))
+
+ # Source paths with alternate deps paths
+ for path_with_depspath in options.paths_with_depspath:
+ srcpath, depspath = _GetPair(path_with_depspath)
+ path_to_source[depspath] = source.Source(source.GetFileContents(srcpath))
+
+ # Make our output pipe.
+ if options.output_file:
+ out = open(options.output_file, 'w')
+ else:
+ out = sys.stdout
+
+ out.write('// This file was autogenerated by %s.\n' % sys.argv[0])
+ out.write('// Please do not edit.\n')
+
+ out.write(MakeDepsFile(path_to_source))
+
+
+if __name__ == '__main__':
+ main()
View
114 bin/closure/source.py
@@ -0,0 +1,114 @@
+# Copyright 2009 The Closure Library Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+"""Scans a source JS file for its provided and required namespaces.
+
+Simple class to scan a JavaScript file and express its dependencies.
+"""
+
+__author__ = 'nnaze@google.com'
+
+
+import re
+
+_BASE_REGEX_STRING = '^\s*goog\.%s\(\s*[\'"](.+)[\'"]\s*\)'
+_PROVIDE_REGEX = re.compile(_BASE_REGEX_STRING % 'provide')
+_REQUIRES_REGEX = re.compile(_BASE_REGEX_STRING % 'require')
+
+# This line identifies base.js and should match the line in that file.
+_GOOG_BASE_LINE = (
+ 'var goog = goog || {}; // Identifies this file as the Closure base.')
+
+
+class Source(object):
+ """Scans a JavaScript source for its provided and required namespaces."""
+
+ # Matches a "/* ... */" comment.
+ # Note: We can't definitively distinguish a "/*" in a string literal without a
+ # state machine tokenizer. We'll assume that a line starting with whitespace
+ # and "/*" is a comment.
+ _COMMENT_REGEX = re.compile(
+ r"""
+ ^\s* # Start of a new line and whitespace
+ /\* # Opening "/*"
+ .*? # Non greedy match of any characters (including newlines)
+ \*/ # Closing "*/""",
+ re.MULTILINE | re.DOTALL | re.VERBOSE)
+
+ def __init__(self, source):
+ """Initialize a source.
+
+ Args:
+ source: str, The JavaScript source.
+ """
+
+ self.provides = set()
+ self.requires = set()
+
+ self._source = source
+ self._ScanSource()
+
+ def __str__(self):
+ return 'Source %s' % self._path
+
+ def GetSource(self):
+ """Get the source as a string."""
+ return self._source
+
+ @classmethod
+ def _StripComments(cls, source):
+ return cls._COMMENT_REGEX.sub('', source)
+
+ def _ScanSource(self):
+ """Fill in provides and requires by scanning the source."""
+
+ source = self._StripComments(self.GetSource())
+
+ source_lines = source.splitlines()
+ for line in source_lines:
+ match = _PROVIDE_REGEX.match(line)
+ if match:
+ self.provides.add(match.group(1))
+ match = _REQUIRES_REGEX.match(line)
+ if match:
+ self.requires.add(match.group(1))
+
+ # Closure's base file implicitly provides 'goog'.
+ for line in source_lines:
+ if line == _GOOG_BASE_LINE:
+ if len(self.provides) or len(self.requires):
+ raise Exception(
+ 'Base files should not provide or require namespaces.')
+ self.provides.add('goog')
+
+
+def GetFileContents(path):
+ """Get a file's contents as a string.
+
+ Args:
+ path: str, Path to file.
+
+ Returns:
+ str, Contents of file.
+
+ Raises:
+ IOError: An error occurred opening or reading the file.
+
+ """
+ fileobj = open(path)
+ try:
+ return fileobj.read()
+ finally:
+ fileobj.close()
View
78 bin/closure/treescan.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 The Closure Library Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+"""Shared utility functions for scanning directory trees."""
+
+import os
+import re
+
+
+__author__ = 'nnaze@google.com (Nathan Naze)'
+
+
+# Matches a .js file path.
+_JS_FILE_REGEX = re.compile(r'^.+\.js$')
+
+
+def ScanTreeForJsFiles(root):
+ """Scans a directory tree for JavaScript files.
+
+ Args:
+ root: str, Path to a root directory.
+
+ Returns:
+ An iterable of paths to JS files, relative to cwd.
+ """
+ return ScanTree(root, path_filter=_JS_FILE_REGEX)
+
+
+def ScanTree(root, path_filter=None, ignore_hidden=True):
+ """Scans a directory tree for files.
+
+ Args:
+ root: str, Path to a root directory.
+ path_filter: A regular expression filter. If set, only paths matching
+ the path_filter are returned.
+ ignore_hidden: If True, do not follow or return hidden directories or files
+ (those starting with a '.' character).
+
+ Yields:
+ A string path to files, relative to cwd.
+ """
+
+ def OnError(os_error):
+ raise os_error
+
+ for dirpath, dirnames, filenames in os.walk(root, onerror=OnError):
+ # os.walk allows us to modify dirnames to prevent decent into particular
+ # directories. Avoid hidden directories.
+ for dirname in dirnames:
+ if ignore_hidden and dirname.startswith('.'):
+ dirnames.remove(dirname)
+
+ for filename in filenames:
+
+ # nothing that starts with '.'
+ if ignore_hidden and filename.startswith('.'):
+ continue
+
+ fullpath = os.path.join(dirpath, filename)
+
+ if path_filter and not path_filter.match(fullpath):
+ continue
+
+ yield os.path.normpath(fullpath)
View
62 build.py
@@ -30,6 +30,7 @@
variables.GIT = 'git'
variables.GJSLINT = 'gjslint'
variables.JAVA = 'java'
+ variables.JAR = 'jar'
variables.JSDOC = 'jsdoc'
variables.PYTHON = 'python'
variables.PHANTOMJS = 'phantomjs'
@@ -59,6 +60,8 @@
for path in ifind('examples')
if path.endswith('.js')
if not path.endswith('.combined.js')
+ if not path.startswith('examples/bootstrap')
+ if not path.startswith('examples/font-awesome')
if path != 'examples/Jugl.js'
if path != 'examples/example-list.js']
@@ -115,13 +118,13 @@ def build_ol_js(t):
report_sizes(t)
-@target('build/ol-simple.js', PLOVR_JAR, SRC, EXTERNAL_SRC, 'base.json', 'build/ol.json', 'build/ol-simple.json')
+@target('build/ol-simple.js', PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json', 'build/ol.json', 'build/ol-simple.json')
def build_ol_js(t):
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build', 'build/ol-simple.json')
report_sizes(t)
-@target('build/ol-whitespace.js', PLOVR_JAR, SRC, EXTERNAL_SRC, 'base.json', 'build/ol.json', 'build/ol-whitespace.json')
+@target('build/ol-whitespace.js', PLOVR_JAR, SRC, INTERNAL_SRC, 'base.json', 'build/ol.json', 'build/ol-whitespace.json')
def build_ol_js(t):
t.output('%(JAVA)s', '-jar', PLOVR_JAR, 'build', 'build/ol-whitespace.json')
report_sizes(t)
@@ -357,6 +360,37 @@ def jsdoc_BRANCH_timestamp(t):
t.touch()
+def split_example_file(example, dst_dir):
+ lines = open(example).readlines()
+
+ target_lines = []
+ target_require_lines = []
+
+ found_requires = False
+ found_code = False
+ for line in lines:
+ m = re.match(r'goog.require\(\'(.*)\'\);', line)
+ if m:
+ found_requires = True
+ target_require_lines.append(line)
+ elif found_requires:
+ if found_code or line not in ('\n', '\r\n'):
+ found_code = True
+ target_lines.append(line)
+
+ target = open(
+ os.path.join(dst_dir, os.path.basename(example)), 'w')
+ target_require = open(
+ os.path.join(dst_dir,
+ os.path.basename(example).replace('.js', '-require.js')), 'w')
+
+ target.writelines(target_lines)
+ target.close()
+
+ target_require.writelines(target_require_lines)
+ target_require.close()
+
+
@target('hostexamples', 'build', 'examples', phony=True)
def hostexamples(t):
examples_dir = 'build/gh-pages/%(BRANCH)s/examples'
@@ -365,22 +399,40 @@ def hostexamples(t):
t.makedirs(examples_dir)
t.rm_rf(build_dir)
t.makedirs(build_dir)
- t.cp(EXAMPLES, (path.replace('.html', '.js') for path in EXAMPLES),
- 'examples/style.css', examples_dir)
+ t.cp(EXAMPLES, 'examples/examples.css', examples_dir)
+ for example in [path.replace('.html', '.js') for path in EXAMPLES]:
+ split_example_file(example, examples_dir % vars(variables))
t.cp_r('examples/data', examples_dir + '/data')
+ t.cp_r('examples/bootstrap', examples_dir + '/bootstrap')
+ t.cp_r('examples/font-awesome', examples_dir + '/font-awesome')
t.cp('build/loader_hosted_examples.js', examples_dir + '/loader.js')
t.cp('build/ol.js', 'build/ol-simple.js', 'build/ol-whitespace.js',
'build/ol.css', build_dir)
t.cp('examples/example-list.html', examples_dir + '/index.html')
t.cp('examples/example-list.js', 'examples/example-list.xml',
'examples/Jugl.js', examples_dir)
+ t.rm_rf('build/gh-pages/%(BRANCH)s/closure-library')
+ t.makedirs('build/gh-pages/%(BRANCH)s/closure-library')
+ with t.chdir('build/gh-pages/%(BRANCH)s/closure-library'):
+ t.run('%(JAR)s', 'xf', '../../../../' + PLOVR_JAR, 'closure')
+ t.run('%(JAR)s', 'xf', '../../../../' + PLOVR_JAR, 'third_party')
+ t.rm_rf('build/gh-pages/%(BRANCH)s/ol')
+ t.makedirs('build/gh-pages/%(BRANCH)s/ol')
+ t.cp_r('src/ol', 'build/gh-pages/%(BRANCH)s/ol/ol')
+ t.run('%(PYTHON)s', 'bin/closure/depswriter.py',
+ '--root_with_prefix', 'src ../../../ol',
+ '--root', 'build/gh-pages/%(BRANCH)s/closure-library/closure/goog',
+ '--root_with_prefix', 'build/gh-pages/%(BRANCH)s/closure-library/third_party ../../third_party',
+ '--output_file', 'build/gh-pages/%(BRANCH)s/build/ol-deps.js')
@target('check-examples', 'hostexamples', phony=True)
def check_examples(t):
directory = 'build/gh-pages/%(BRANCH)s/'
examples = ['build/gh-pages/%(BRANCH)s/' + e for e in EXAMPLES]
- all_examples = [e + '?mode=whitespace' for e in examples] + \
+ all_examples = \
+ [e + '?mode=raw' for e in examples] + \
+ [e + '?mode=whitespace' for e in examples] + \
[e + '?mode=simple' for e in examples] + \
examples
for example in all_examples:
View
34 build/loader_hosted_examples.js
@@ -1,17 +1,15 @@
/**
- *
* Loader to add ol.css, ol.js and the example-specific js file to the
* documents.
*
* This loader is used for the hosted examples. It is used in place of the
* development loader (examples/loader.js).
*
- * ol.css, ol.js, ol-simple.js, and ol-whitespace.js are built with
- * Plovr/Closure. `build.py build` builds them. They are located in the
- * ../build/ directory, relatively to this script.
+ * ol.css, ol.js, ol-simple.js, ol-whitespace.js, and ol-deps.js are built
+ * by OL3's build.py script. They are located in the ../build/ directory,
+ * relatively to this script.
*
- * The script should be named loader.js. So it needs to be renamed to
- * loader.js from loader_hosted_examples.js.
+ * The script must be named loader.js.
*
* Usage:
*
@@ -59,17 +57,23 @@
var oljs = 'ol.js', mode;
if ('mode' in pageParams) {
mode = pageParams.mode.toLowerCase();
- if (mode != 'advanced') {
+ if (mode == 'debug') {
+ mode = 'raw';
+ }
+ if (mode != 'advanced' && mode != 'raw') {
oljs = 'ol-' + mode + '.js';
}
}
- document.write('<link rel="stylesheet" href="../build/ol.css" '+
- 'type="text/css">');
- document.write('<scr' + 'ipt type="text/javascript" ' +
- 'src="../build/' + oljs + '">' +
- '</scr' + 'ipt>');
- document.write('<scr' + 'ipt type="text/javascript" ' +
- 'src="' + encodeURIComponent(scriptParams.id) + '.js">' +
- '</scr' + 'ipt>');
+ var scriptId = encodeURIComponent(scriptParams.id);
+ document.write('<link rel="stylesheet" href="../build/ol.css" type="text/css">');
+ if (mode != 'raw') {
+ document.write('<scr' + 'ipt type="text/javascript" src="../build/' + oljs + '"></scr' + 'ipt>');
+ } else {
+ window.CLOSURE_NO_DEPS = true; // we've got our own deps file
+ document.write('<scr' + 'ipt type="text/javascript" src="../closure-library/closure/goog/base.js"></scr' + 'ipt>');
+ document.write('<scr' + 'ipt type="text/javascript" src="../build/ol-deps.js"></scr' + 'ipt>');
+ document.write('<scr' + 'ipt type="text/javascript" src="' + scriptId + '-require.js"></scr' + 'ipt>');
+ }
+ document.write('<scr' + 'ipt type="text/javascript" src="' + scriptId + '.js"></scr' + 'ipt>');
}());
View
84 examples/anchored-elements.html
@@ -1,31 +1,13 @@
-<!DOCTYPE html>
-<html>
+<!doctype html>
+<html lang="en">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
- <link rel="stylesheet" href="style.css" type="text/css">
+ <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" type="text/css">
+ <link rel="stylesheet" href="examples.css" type="text/css">
+ <link rel="stylesheet" href="bootstrap/css/bootstrap-responsive.min.css" type="text/css">
<style type="text/css">
- html, body, #map {
- margin: 0;
- padding: 0;
- width: 100%;
- height: 100%;
- }
- #text {
- position: absolute;
- top: 8px;
- right: 8px;
- z-index: 20000;
- background-color: white;
- padding: 0 0.5em 0.5em 0.5em;
- border-radius: 4px;
- }
- @media only screen and (max-width: 600px) {
- #text {
- display: none;
- }
- }
.overlay {
display: none;
font-size: 10pt;
@@ -41,8 +23,8 @@
text-shadow: black 0.1em 0.1em 0.2em;
}
#popup {
- width: 200px;
- margin-left: -107px;
+ width: 170px;
+ margin-left: -92px;
margin-bottom: 12px;
border-radius: 5px;
padding: 5px;
@@ -83,22 +65,50 @@
<title>Anchored elements example</title>
</head>
<body>
- <div id="map">
+
+ <div class="navbar navbar-inverse navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="brand" href="example-list.html">OpenLayers 3 Examples</a>
+ <ul class="nav pull-right">
+ <li><a href="https://github.com/openlayers/ol3"><i class="icon-github"></i></a></li>
+ <li><a href="https://twitter.com/openlayers"><i class="icon-twitter"></i></a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ <div class="container-fluid">
+
+ <div class="row-fluid">
+ <div class="span12">
+ <div id="map" class="map"></div>
+ </div>
+ </div>
+
+ <div class="row-fluid">
+
+ <div class="span4">
+ <h4 id="title">Anchored elements example</h4>
+ <p id="shortdesc">Demonstrates anchored elements.</p>
+ <div id="docs">
+ <p>See the <a href="anchored-elements.js" target="_blank">anchored-elements.js source</a> to see how this is done.</p>
+ </div>
+ <div id="tags">anchored elements, overlay, popup, mapquest, openaerial</div>
+ </div>
+
+ </div>
+
+ </div>
+
+ <div style="display: none;">
<!-- Clickable label for Vienna -->
<a class="overlay" id="vienna" target="_blank" href="http://en.wikipedia.org/wiki/Vienna">Vienna</a>
<!-- Popup -->
<div class="overlay arrow_box" id="popup"></div>
- <div id="text">
- <h1 id="title">Anchored elements example</h1>
- <div id="shortdesc">Demonstrates anchored elements.</div>
- <div id="docs">
- <p>See the
- <a href="anchored-elements.js" target="_blank">anchored-elements.js source</a>
- to see how this is done.</p>
- </div>
- </div>
</div>
- <div id="tags">anchored elements, overlay, popup, mapquest, openaerial</div>
+
<script src="loader.js?id=anchored-elements" type="text/javascript"></script>
+
</body>
</html>
View
7 examples/anchored-elements.js
@@ -1,5 +1,4 @@
goog.require('ol.AnchoredElement');
-goog.require('ol.Collection');
goog.require('ol.Coordinate');
goog.require('ol.Map');
goog.require('ol.RendererHints');
@@ -14,7 +13,7 @@ var layer = new ol.layer.TileLayer({
});
var map = new ol.Map({
- layers: new ol.Collection([layer]),
+ layers: [layer],
renderers: ol.RendererHints.createFromQueryData(),
target: 'map',
view: new ol.View2D({
@@ -26,7 +25,7 @@ var map = new ol.Map({
// Vienna label
var vienna = new ol.AnchoredElement({
map: map,
- position: ol.projection.transformWithCodes(
+ position: ol.projection.transform(
new ol.Coordinate(16.3725, 48.208889), 'EPSG:4326', 'EPSG:3857'),
element: document.getElementById('vienna')
});
@@ -40,7 +39,7 @@ map.addEventListener('click', function(evt) {
var coordinate = evt.getCoordinate();
popup.getElement().innerHTML =
'Welcome to ol3. The location you clicked was<br>' +
- ol.Coordinate.toStringHDMS(ol.projection.transformWithCodes(
+ ol.Coordinate.toStringHDMS(ol.projection.transform(
coordinate, 'EPSG:3857', 'EPSG:4326'));
popup.setPosition(coordinate);
});
View
60 examples/animation.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="chrome=1">
+ <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+ <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" type="text/css">
+ <link rel="stylesheet" href="examples.css" type="text/css">
+ <link rel="stylesheet" href="bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+ <title>Animation example</title>
+ </head>
+ <body>
+
+ <div class="navbar navbar-inverse navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="brand" href="example-list.html">OpenLayers 3 Examples</a>
+ <ul class="nav pull-right">
+ <li><a href="https://github.com/openlayers/ol3"><i class="icon-github"></i></a></li>
+ <li><a href="https://twitter.com/openlayers"><i class="icon-twitter"></i></a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ <div class="container-fluid">
+
+ <div class="row-fluid">
+ <div class="span12">
+ <div id="map" class="map"></div>
+ <button id="rotate-left"><i class="icon-arrow-left"></i></button>
+ <button>Rotate</button>
+ <button id="rotate-right"><i class="icon-arrow-right"></i></button>
+ </div>
+ <button id="pan-to-london">Pan to London</button>
+ <button id="elastic-to-moscow">Elastic to Moscow</button>
+ <button id="bounce-to-instanbul">Bounce to Instanbul</button>
+ <button id="spin-to-rome">Spin to Rome</button>
+ <button id="fly-to-bern">Fly to Bern</button>
+ </div>
+
+ <div class="row-fluid">
+
+ <div class="span4">
+ <h4 id="title">Animation example</h4>
+ <p id="shortdesc">Example animations.</p>
+ <div id="docs">
+ <p>See the <a href="animation.js" target="_blank">animation.js source</a> to see how this is done.</p>
+ </div>
+ <div id="tags">animation</div>
+ </div>
+
+ </div>
+
+ </div>
+
+ <script src="loader.js?id=animation" type="text/javascript"></script>
+
+ </body>
+</html>
View
122 examples/animation.js
@@ -0,0 +1,122 @@
+goog.require('ol.Coordinate');
+goog.require('ol.Map');
+goog.require('ol.RendererHints');
+goog.require('ol.View2D');
+goog.require('ol.animation');
+goog.require('ol.easing');
+goog.require('ol.layer.TileLayer');
+goog.require('ol.projection');
+goog.require('ol.source.OpenStreetMap');
+
+
+var london = ol.projection.transform(
+ new ol.Coordinate(-0.12755, 51.507222), 'EPSG:4326', 'EPSG:3857');
+var moscow = ol.projection.transform(
+ new ol.Coordinate(37.6178, 55.7517), 'EPSG:4326', 'EPSG:3857');
+var instanbul = ol.projection.transform(
+ new ol.Coordinate(28.9744, 41.0128), 'EPSG:4326', 'EPSG:3857');
+var rome = ol.projection.transform(
+ new ol.Coordinate(12.5, 41.9), 'EPSG:4326', 'EPSG:3857');
+var bern = ol.projection.transform(
+ new ol.Coordinate(7.4458, 46.95), 'EPSG:4326', 'EPSG:3857');
+
+var map = new ol.Map({
+ layers: [
+ new ol.layer.TileLayer({
+ source: new ol.source.OpenStreetMap()
+ })
+ ],
+ renderers: ol.RendererHints.createFromQueryData(),
+ target: 'map',
+ view: new ol.View2D({
+ center: instanbul,
+ zoom: 6
+ })
+});
+
+
+var rotateLeft = document.getElementById('rotate-left');
+rotateLeft.addEventListener('click', function() {
+ var rotateLeft = ol.animation.rotate({
+ duration: 2000,
+ rotation: -4 * Math.PI
+ });
+ map.addPreRenderFunction(rotateLeft);
+}, false);
+var rotateRight = document.getElementById('rotate-right');
+rotateRight.addEventListener('click', function() {
+ var rotateRight = ol.animation.rotate({
+ duration: 2000,
+ rotation: 4 * Math.PI
+ });
+ map.addPreRenderFunction(rotateRight);
+}, false);
+
+
+var panToLondon = document.getElementById('pan-to-london');
+panToLondon.addEventListener('click', function() {
+ var pan = ol.animation.pan({
+ source: map.getView().getView2D().getCenter(),
+ duration: 2000
+ });
+ map.addPreRenderFunction(pan);
+ map.getView().getView2D().setCenter(london);
+}, false);
+
+var elasticToMoscow = document.getElementById('elastic-to-moscow');
+elasticToMoscow.addEventListener('click', function() {
+ var pan = ol.animation.pan({
+ source: map.getView().getView2D().getCenter(),
+ duration: 2000,
+ easing: ol.easing.elastic
+ });
+ map.addPreRenderFunction(pan);
+ map.getView().getView2D().setCenter(moscow);
+}, false);
+
+var bounceToInstanbul = document.getElementById('bounce-to-instanbul');
+bounceToInstanbul.addEventListener('click', function() {
+ var pan = ol.animation.pan({
+ source: map.getView().getView2D().getCenter(),
+ duration: 2000,
+ easing: ol.easing.bounce
+ });
+ map.addPreRenderFunction(pan);
+ map.getView().getView2D().setCenter(instanbul);
+}, false);
+
+var spinToRome = document.getElementById('spin-to-rome');
+spinToRome.addEventListener('click', function() {
+ var duration = 2000;
+ var start = +new Date();
+ var pan = ol.animation.pan({
+ duration: duration,
+ source: map.getView().getView2D().getCenter(),
+ start: start
+ });
+ var rotate = ol.animation.rotate({
+ duration: duration,
+ rotation: 2 * Math.PI,
+ start: start
+ });
+ map.addPreRenderFunctions([pan, rotate]);
+ map.getView().getView2D().setCenter(rome);
+}, false);
+
+var flyToBern = document.getElementById('fly-to-bern');
+flyToBern.addEventListener('click', function() {
+ var duration = 2000;
+ var start = +new Date();
+ var pan = ol.animation.pan({
+ duration: duration,
+ source: map.getView().getView2D().getCenter(),
+ start: start
+ });
+ var bounce = ol.animation.bounce({
+ duration: duration,
+ resolution: 4 * map.getView().getView2D().getResolution(),
+ start: start
+ });
+ map.addPreRenderFunctions([pan, bounce]);
+ map.getView().getView2D().setCenter(bern);
+}, false);
View
52 examples/bing-maps.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="chrome=1">
+ <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+ <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" type="text/css">
+ <link rel="stylesheet" href="examples.css" type="text/css">
+ <link rel="stylesheet" href="bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+ <title>Bing Maps example</title>
+ </head>
+ <body>
+
+ <div class="navbar navbar-inverse navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="brand" href="example-list.html">OpenLayers 3 Examples</a>
+ <ul class="nav pull-right">
+ <li><a href="https://github.com/openlayers/ol3"><i class="icon-github"></i></a></li>
+ <li><a href="https://twitter.com/openlayers"><i class="icon-twitter"></i></a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+ <div class="container-fluid">
+
+ <div class="row-fluid">
+ <div class="span12">
+ <div id="map" class="map"></div>
+ </div>
+ </div>
+
+ <div class="row-fluid">
+
+ <div class="span4">
+ <h4 id="title">Bing Maps example</h4>
+ <p id="shortdesc">Example of a Bing Maps layer.</p>
+ <div id="docs">
+ <p>See the <a href="bing-maps.js" target="_blank">bing-maps.js source</a> to see how this is done.</p>
+ </div>
+ <div id="tags">bing, bing-maps</div>
+ </div>
+
+ </div>
+
+ </div>
+
+ <script src="loader.js?id=bing-maps" type="text/javascript"></script>
+
+ </body>
+</html>
View
26 examples/bing-maps.js
@@ -0,0 +1,26 @@
+goog.require('ol.Coordinate');
+goog.require('ol.Map');
+goog.require('ol.RendererHints');
+goog.require('ol.View2D');
+goog.require('ol.layer.TileLayer');
+goog.require('ol.projection');
+goog.require('ol.source.BingMaps');
+
+
+var map = new ol.Map({
+ layers: [
+ new ol.layer.TileLayer({
+ source: new ol.source.BingMaps({
+ key: 'AgtFlPYDnymLEe9zJ5PCkghbNiFZE9aAtTy3mPaEnEBXqLHtFuTcKoZ-miMC3w7R',
+ style: 'AerialWithLabels'
+ })
+ })
+ ],
+ renderers: ol.RendererHints.createFromQueryData(),
+ target: 'map',
+ view: new ol.View2D({
+ center: ol.projection.transform(
+ new ol.Coordinate(-123.1, 49.25), 'EPSG:4326', 'EPSG:3857'),
+ zoom: 8
+ })
+});
View
1,109 examples/bootstrap/css/bootstrap-responsive.css
@@ -0,0 +1,1109 @@
+/*!
+ * Bootstrap Responsive v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+ *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.hide-text {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.input-block-level {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+@-ms-viewport {
+ width: device-width;
+}
+
+.hidden {
+ display: none;
+ visibility: hidden;
+}
+
+.visible-phone {
+ display: none !important;
+}
+
+.visible-tablet {
+ display: none !important;
+}
+
+.hidden-desktop {
+ display: none !important;
+}
+
+.visible-desktop {
+ display: inherit !important;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .hidden-desktop {
+ display: inherit !important;
+ }
+ .visible-desktop {
+ display: none !important ;
+ }
+ .visible-tablet {
+ display: inherit !important;
+ }
+ .hidden-tablet {
+ display: none !important;
+ }
+}
+
+@media (max-width: 767px) {
+ .hidden-desktop {
+ display: inherit !important;
+ }
+ .visible-desktop {
+ display: none !important;
+ }
+ .visible-phone {
+ display: inherit !important;
+ }
+ .hidden-phone {
+ display: none !important;
+ }
+}
+
+.visible-print {
+ display: none !important;
+}
+
+@media print {
+ .visible-print {
+ display: inherit !important;
+ }
+ .hidden-print {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .row {
+ margin-left: -30px;
+ *zoom: 1;
+ }
+ .row:before,
+ .row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row:after {
+ clear: both;
+ }
+ [class*="span"] {
+ float: left;
+ min-height: 1px;
+ margin-left: 30px;
+ }
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container {
+ width: 1170px;
+ }
+ .span12 {
+ width: 1170px;
+ }
+ .span11 {
+ width: 1070px;
+ }
+ .span10 {
+ width: 970px;
+ }
+ .span9 {
+ width: 870px;
+ }
+ .span8 {
+ width: 770px;
+ }
+ .span7 {
+ width: 670px;
+ }
+ .span6 {
+ width: 570px;
+ }
+ .span5 {
+ width: 470px;
+ }
+ .span4 {
+ width: 370px;
+ }
+ .span3 {
+ width: 270px;
+ }
+ .span2 {
+ width: 170px;
+ }
+ .span1 {
+ width: 70px;
+ }
+ .offset12 {
+ margin-left: 1230px;
+ }
+ .offset11 {
+ margin-left: 1130px;
+ }
+ .offset10 {
+ margin-left: 1030px;
+ }
+ .offset9 {
+ margin-left: 930px;
+ }
+ .offset8 {
+ margin-left: 830px;
+ }
+ .offset7 {
+ margin-left: 730px;
+ }
+ .offset6 {
+ margin-left: 630px;
+ }
+ .offset5 {
+ margin-left: 530px;
+ }
+ .offset4 {
+ margin-left: 430px;
+ }
+ .offset3 {
+ margin-left: 330px;
+ }
+ .offset2 {
+ margin-left: 230px;
+ }
+ .offset1 {
+ margin-left: 130px;
+ }
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+ .row-fluid:before,
+ .row-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row-fluid:after {
+ clear: both;
+ }
+ .row-fluid [class*="span"] {
+ display: block;
+ float: left;
+ width: 100%;
+ min-height: 30px;
+ margin-left: 2.564102564102564%;
+ *margin-left: 2.5109110747408616%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .row-fluid [class*="span"]:first-child {
+ margin-left: 0;
+ }
+ .row-fluid .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 2.564102564102564%;
+ }
+ .row-fluid .span12 {
+ width: 100%;
+ *width: 99.94680851063829%;
+ }
+ .row-fluid .span11 {
+ width: 91.45299145299145%;
+ *width: 91.39979996362975%;
+ }
+ .row-fluid .span10 {
+ width: 82.90598290598291%;
+ *width: 82.8527914166212%;
+ }
+ .row-fluid .span9 {
+ width: 74.35897435897436%;
+ *width: 74.30578286961266%;
+ }
+ .row-fluid .span8 {
+ width: 65.81196581196582%;
+ *width: 65.75877432260411%;
+ }
+ .row-fluid .span7 {
+ width: 57.26495726495726%;
+ *width: 57.21176577559556%;
+ }
+ .row-fluid .span6 {
+ width: 48.717948717948715%;
+ *width: 48.664757228587014%;
+ }
+ .row-fluid .span5 {
+ width: 40.17094017094017%;
+ *width: 40.11774868157847%;
+ }
+ .row-fluid .span4 {
+ width: 31.623931623931625%;
+ *width: 31.570740134569924%;
+ }
+ .row-fluid .span3 {
+ width: 23.076923076923077%;
+ *width: 23.023731587561375%;
+ }
+ .row-fluid .span2 {
+ width: 14.52991452991453%;
+ *width: 14.476723040552828%;
+ }
+ .row-fluid .span1 {
+ width: 5.982905982905983%;
+ *width: 5.929714493544281%;
+ }
+ .row-fluid .offset12 {
+ margin-left: 105.12820512820512%;
+ *margin-left: 105.02182214948171%;
+ }
+ .row-fluid .offset12:first-child {
+ margin-left: 102.56410256410257%;
+ *margin-left: 102.45771958537915%;
+ }
+ .row-fluid .offset11 {
+ margin-left: 96.58119658119658%;
+ *margin-left: 96.47481360247316%;
+ }
+ .row-fluid .offset11:first-child {
+ margin-left: 94.01709401709402%;
+ *margin-left: 93.91071103837061%;
+ }
+ .row-fluid .offset10 {
+ margin-left: 88.03418803418803%;
+ *margin-left: 87.92780505546462%;
+ }
+ .row-fluid .offset10:first-child {
+ margin-left: 85.47008547008548%;
+ *margin-left: 85.36370249136206%;
+ }
+ .row-fluid .offset9 {
+ margin-left: 79.48717948717949%;
+ *margin-left: 79.38079650845607%;
+ }
+ .row-fluid .offset9:first-child {
+ margin-left: 76.92307692307693%;
+ *margin-left: 76.81669394435352%;
+ }
+ .row-fluid .offset8 {
+ margin-left: 70.94017094017094%;
+ *margin-left: 70.83378796144753%;
+ }
+ .row-fluid .offset8:first-child {
+ margin-left: 68.37606837606839%;
+ *margin-left: 68.26968539734497%;
+ }
+ .row-fluid .offset7 {
+ margin-left: 62.393162393162385%;
+ *margin-left: 62.28677941443899%;
+ }
+ .row-fluid .offset7:first-child {
+ margin-left: 59.82905982905982%;
+ *margin-left: 59.72267685033642%;
+ }
+ .row-fluid .offset6 {
+ margin-left: 53.84615384615384%;
+ *margin-left: 53.739770867430444%;
+ }
+ .row-fluid .offset6:first-child {
+ margin-left: 51.28205128205128%;
+ *margin-left: 51.175668303327875%;
+ }
+ .row-fluid .offset5 {
+ margin-left: 45.299145299145295%;
+ *margin-left: 45.1927623204219%;
+ }
+ .row-fluid .offset5:first-child {
+ margin-left: 42.73504273504273%;
+ *margin-left: 42.62865975631933%;
+ }
+ .row-fluid .offset4 {
+ margin-left: 36.75213675213675%;
+ *margin-left: 36.645753773413354%;
+ }
+ .row-fluid .offset4:first-child {
+ margin-left: 34.18803418803419%;
+ *margin-left: 34.081651209310785%;
+ }
+ .row-fluid .offset3 {
+ margin-left: 28.205128205128204%;
+ *margin-left: 28.0987452264048%;
+ }
+ .row-fluid .offset3:first-child {
+ margin-left: 25.641025641025642%;
+ *margin-left: 25.53464266230224%;
+ }
+ .row-fluid .offset2 {
+ margin-left: 19.65811965811966%;
+ *margin-left: 19.551736679396257%;
+ }
+ .row-fluid .offset2:first-child {
+ margin-left: 17.094017094017094%;
+ *margin-left: 16.98763411529369%;
+ }
+ .row-fluid .offset1 {
+ margin-left: 11.11111111111111%;
+ *margin-left: 11.004728132387708%;
+ }
+ .row-fluid .offset1:first-child {
+ margin-left: 8.547008547008547%;
+ *margin-left: 8.440625568285142%;
+ }
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 30px;
+ }
+ input.span12,
+ textarea.span12,
+ .uneditable-input.span12 {
+ width: 1156px;
+ }
+ input.span11,
+ textarea.span11,
+ .uneditable-input.span11 {
+ width: 1056px;
+ }
+ input.span10,
+ textarea.span10,
+ .uneditable-input.span10 {
+ width: 956px;
+ }
+ input.span9,
+ textarea.span9,
+ .uneditable-input.span9 {
+ width: 856px;
+ }
+ input.span8,
+ textarea.span8,
+ .uneditable-input.span8 {
+ width: 756px;
+ }
+ input.span7,
+ textarea.span7,
+ .uneditable-input.span7 {
+ width: 656px;
+ }
+ input.span6,
+ textarea.span6,
+ .uneditable-input.span6 {
+ width: 556px;
+ }
+ input.span5,
+ textarea.span5,
+ .uneditable-input.span5 {
+ width: 456px;
+ }
+ input.span4,
+ textarea.span4,
+ .uneditable-input.span4 {
+ width: 356px;
+ }
+ input.span3,
+ textarea.span3,
+ .uneditable-input.span3 {
+ width: 256px;
+ }
+ input.span2,
+ textarea.span2,
+ .uneditable-input.span2 {
+ width: 156px;
+ }
+ input.span1,
+ textarea.span1,
+ .uneditable-input.span1 {
+ width: 56px;
+ }
+ .thumbnails {
+ margin-left: -30px;
+ }
+ .thumbnails > li {
+ margin-left: 30px;
+ }
+ .row-fluid .thumbnails {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .row {
+ margin-left: -20px;
+ *zoom: 1;
+ }
+ .row:before,
+ .row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row:after {
+ clear: both;
+ }
+ [class*="span"] {
+ float: left;
+ min-height: 1px;
+ margin-left: 20px;
+ }
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container {
+ width: 724px;
+ }
+ .span12 {
+ width: 724px;
+ }
+ .span11 {
+ width: 662px;
+ }
+ .span10 {
+ width: 600px;
+ }
+ .span9 {
+ width: 538px;
+ }
+ .span8 {
+ width: 476px;
+ }
+ .span7 {
+ width: 414px;
+ }
+ .span6 {
+ width: 352px;
+ }
+ .span5 {
+ width: 290px;
+ }
+ .span4 {
+ width: 228px;
+ }
+ .span3 {
+ width: 166px;
+ }
+ .span2 {
+ width: 104px;
+ }
+ .span1 {
+ width: 42px;
+ }
+ .offset12 {
+ margin-left: 764px;
+ }
+ .offset11 {
+ margin-left: 702px;
+ }
+ .offset10 {
+ margin-left: 640px;
+ }
+ .offset9 {
+ margin-left: 578px;
+ }
+ .offset8 {
+ margin-left: 516px;
+ }
+ .offset7 {
+ margin-left: 454px;
+ }
+ .offset6 {
+ margin-left: 392px;
+ }
+ .offset5 {
+ margin-left: 330px;
+ }
+ .offset4 {
+ margin-left: 268px;
+ }
+ .offset3 {
+ margin-left: 206px;
+ }
+ .offset2 {
+ margin-left: 144px;
+ }
+ .offset1 {
+ margin-left: 82px;
+ }
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+ .row-fluid:before,
+ .row-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row-fluid:after {
+ clear: both;
+ }
+ .row-fluid [class*="span"] {
+ display: block;
+ float: left;
+ width: 100%;
+ min-height: 30px;
+ margin-left: 2.7624309392265194%;
+ *margin-left: 2.709239449864817%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .row-fluid [class*="span"]:first-child {
+ margin-left: 0;
+ }
+ .row-fluid .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 2.7624309392265194%;
+ }
+ .row-fluid .span12 {
+ width: 100%;
+ *width: 99.94680851063829%;
+ }
+ .row-fluid .span11 {
+ width: 91.43646408839778%;
+ *width: 91.38327259903608%;
+ }
+ .row-fluid .span10 {
+ width: 82.87292817679558%;
+ *width: 82.81973668743387%;
+ }
+ .row-fluid .span9 {
+ width: 74.30939226519337%;
+ *width: 74.25620077583166%;
+ }
+ .row-fluid .span8 {
+ width: 65.74585635359117%;
+ *width: 65.69266486422946%;
+ }
+ .row-fluid .span7 {
+ width: 57.18232044198895%;
+ *width: 57.12912895262725%;
+ }
+ .row-fluid .span6 {
+ width: 48.61878453038674%;
+ *width: 48.56559304102504%;
+ }
+ .row-fluid .span5 {
+ width: 40.05524861878453%;
+ *width: 40.00205712942283%;
+ }
+ .row-fluid .span4 {
+ width: 31.491712707182323%;
+ *width: 31.43852121782062%;
+ }
+ .row-fluid .span3 {
+ width: 22.92817679558011%;
+ *width: 22.87498530621841%;
+ }
+ .row-fluid .span2 {
+ width: 14.3646408839779%;
+ *width: 14.311449394616199%;
+ }
+ .row-fluid .span1 {
+ width: 5.801104972375691%;
+ *width: 5.747913483013988%;
+ }
+ .row-fluid .offset12 {
+ margin-left: 105.52486187845304%;
+ *margin-left: 105.41847889972962%;
+ }
+ .row-fluid .offset12:first-child {
+ margin-left: 102.76243093922652%;
+ *margin-left: 102.6560479605031%;
+ }
+ .row-fluid .offset11 {
+ margin-left: 96.96132596685082%;
+ *margin-left: 96.8549429881274%;
+ }
+ .row-fluid .offset11:first-child {
+ margin-left: 94.1988950276243%;
+ *margin-left: 94.09251204890089%;
+ }
+ .row-fluid .offset10 {
+ margin-left: 88.39779005524862%;
+ *margin-left: 88.2914070765252%;
+ }
+ .row-fluid .offset10:first-child {
+ margin-left: 85.6353591160221%;
+ *margin-left: 85.52897613729868%;
+ }
+ .row-fluid .offset9 {
+ margin-left: 79.8342541436464%;
+ *margin-left: 79.72787116492299%;
+ }
+ .row-fluid .offset9:first-child {
+ margin-left: 77.07182320441989%;
+ *margin-left: 76.96544022569647%;
+ }
+ .row-fluid .offset8 {
+ margin-left: 71.2707182320442%;
+ *margin-left: 71.16433525332079%;
+ }
+ .row-fluid .offset8:first-child {
+ margin-left: 68.50828729281768%;
+ *margin-left: 68.40190431409427%;
+ }
+ .row-fluid .offset7 {
+ margin-left: 62.70718232044199%;
+ *margin-left: 62.600799341718584%;
+ }
+ .row-fluid .offset7:first-child {
+ margin-left: 59.94475138121547%;
+ *margin-left: 59.838368402492065%;
+ }
+ .row-fluid .offset6 {
+ margin-left: 54.14364640883978%;
+ *margin-left: 54.037263430116376%;
+ }
+ .row-fluid .offset6:first-child {
+ margin-left: 51.38121546961326%;
+ *margin-left: 51.27483249088986%;
+ }
+ .row-fluid .offset5 {
+ margin-left: 45.58011049723757%;
+ *margin-left: 45.47372751851417%;
+ }
+ .row-fluid .offset5:first-child {
+ margin-left: 42.81767955801105%;
+ *margin-left: 42.71129657928765%;
+ }
+ .row-fluid .offset4 {
+ margin-left: 37.01657458563536%;
+ *margin-left: 36.91019160691196%;
+ }
+ .row-fluid .offset4:first-child {
+ margin-left: 34.25414364640884%;
+ *margin-left: 34.14776066768544%;
+ }
+ .row-fluid .offset3 {
+ margin-left: 28.45303867403315%;
+ *margin-left: 28.346655695309746%;
+ }
+ .row-fluid .offset3:first-child {
+ margin-left: 25.69060773480663%;
+ *margin-left: 25.584224756083227%;
+ }
+ .row-fluid .offset2 {
+ margin-left: 19.88950276243094%;
+ *margin-left: 19.783119783707537%;
+ }
+ .row-fluid .offset2:first-child {
+ margin-left: 17.12707182320442%;
+ *margin-left: 17.02068884448102%;
+ }
+ .row-fluid .offset1 {
+ margin-left: 11.32596685082873%;
+ *margin-left: 11.219583872105325%;
+ }
+ .row-fluid .offset1:first-child {
+ margin-left: 8.56353591160221%;
+ *margin-left: 8.457152932878806%;
+ }
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 20px;
+ }
+ input.span12,
+ textarea.span12,
+ .uneditable-input.span12 {
+ width: 710px;
+ }
+ input.span11,
+ textarea.span11,
+ .uneditable-input.span11 {
+ width: 648px;
+ }
+ input.span10,
+ textarea.span10,
+ .uneditable-input.span10 {
+ width: 586px;
+ }
+ input.span9,
+ textarea.span9,
+ .uneditable-input.span9 {
+ width: 524px;
+ }
+ input.span8,
+ textarea.span8,
+ .uneditable-input.span8 {
+ width: 462px;
+ }
+ input.span7,
+ textarea.span7,
+ .uneditable-input.span7 {
+ width: 400px;
+ }
+ input.span6,
+ textarea.span6,
+ .uneditable-input.span6 {
+ width: 338px;
+ }
+ input.span5,
+ textarea.span5,
+ .uneditable-input.span5 {
+ width: 276px;
+ }
+ input.span4,
+ textarea.span4,
+ .uneditable-input.span4 {
+ width: 214px;
+ }
+ input.span3,
+ textarea.span3,
+ .uneditable-input.span3 {
+ width: 152px;
+ }
+ input.span2,
+ textarea.span2,
+ .uneditable-input.span2 {
+ width: 90px;
+ }
+ input.span1,
+ textarea.span1,
+ .uneditable-input.span1 {
+ width: 28px;
+ }
+}
+
+@media (max-width: 767px) {
+ body {
+ padding-right: 20px;
+ padding-left: 20px;
+ }
+ .navbar-fixed-top,
+ .navbar-fixed-bottom,
+ .navbar-static-top {
+ margin-right: -20px;
+ margin-left: -20px;
+ }
+ .container-fluid {
+ padding: 0;
+ }
+ .dl-horizontal dt {
+ float: none;
+ width: auto;
+ clear: none;
+ text-align: left;
+ }
+ .dl-horizontal dd {
+ margin-left: 0;
+ }
+ .container {
+ width: auto;
+ }
+ .row-fluid {
+ width: 100%;
+ }
+ .row,
+ .thumbnails {
+ margin-left: 0;
+ }
+ .thumbnails > li {
+ float: none;
+ margin-left: 0;
+ }
+ [class*="span"],
+ .uneditable-input[class*="span"],
+ .row-fluid [class*="span"] {
+ display: block;
+ float: none;
+ width: 100%;
+ margin-left: 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .span12,
+ .row-fluid .span12 {
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .row-fluid [class*="offset"]:first-child {
+ margin-left: 0;
+ }
+ .input-large,
+ .input-xlarge,
+ .input-xxlarge,
+ input[class*="span"],
+ select[class*="span"],
+ textarea[class*="span"],
+ .uneditable-input {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .input-prepend input,
+ .input-append input,
+ .input-prepend input[class*="span"],
+ .input-append input[class*="span"] {
+ display: inline-block;
+ width: auto;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 0;
+ }
+ .modal {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ left: 20px;
+ width: auto;
+ margin: 0;
+ }
+ .modal.fade {
+ top: -100px;
+ }
+ .modal.fade.in {
+ top: 20px;
+ }
+}
+
+@media (max-width: 480px) {
+ .nav-collapse {
+ -webkit-transform: translate3d(0, 0, 0);
+ }
+ .page-header h1 small {
+ display: block;
+ line-height: 20px;
+ }
+ input[type="checkbox"],
+ input[type="radio"] {
+ border: 1px solid #ccc;
+ }
+ .form-horizontal .control-label {
+ float: none;
+ width: auto;
+ padding-top: 0;
+ text-align: left;
+ }
+ .form-horizontal .controls {
+ margin-left: 0;
+ }
+ .form-horizontal .control-list {
+ padding-top: 0;
+ }
+ .form-horizontal .form-actions {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+ .media .pull-left,
+ .media .pull-right {
+ display: block;
+ float: none;
+ margin-bottom: 10px;
+ }
+ .media-object {
+ margin-right: 0;
+ margin-left: 0;
+ }
+ .modal {
+ top: 10px;
+ right: 10px;
+ left: 10px;
+ }
+ .modal-header .close {
+ padding: 10px;
+ margin: -10px;
+ }
+ .carousel-caption {
+ position: static;
+ }
+}
+
+@media (max-width: 979px) {
+ body {
+ padding-top: 0;
+ }
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ position: static;
+ }
+ .navbar-fixed-top {
+ margin-bottom: 20px;
+ }
+ .navbar-fixed-bottom {
+ margin-top: 20px;
+ }
+ .navbar-fixed-top .navbar-inner,
+ .navbar-fixed-bottom .navbar-inner {
+ padding: 5px;
+ }
+ .navbar .container {
+ width: auto;
+ padding: 0;
+ }
+ .navbar .brand {
+ padding-right: 10px;
+ padding-left: 10px;
+ margin: 0 0 0 -5px;
+ }
+ .nav-collapse {
+ clear: both;
+ }
+ .nav-collapse .nav {
+ float: none;
+ margin: 0 0 10px;
+ }
+ .nav-collapse .nav > li {
+ float: none;
+ }
+ .nav-collapse .nav > li > a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > .divider-vertical {
+ display: none;
+ }
+ .nav-collapse .nav .nav-header {
+ color: #777777;
+ text-shadow: none;
+ }
+ .nav-collapse .nav > li > a,
+ .nav-collapse .dropdown-menu a {
+ padding: 9px 15px;
+ font-weight: bold;
+ color: #777777;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ }
+ .nav-collapse .btn {
+ padding: 4px 10px 4px;
+ font-weight: normal;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ }
+ .nav-collapse .dropdown-menu li + li a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > li > a:hover,
+ .nav-collapse .nav > li > a:focus,
+ .nav-collapse .dropdown-menu a:hover,
+ .nav-collapse .dropdown-menu a:focus {
+ background-color: #f2f2f2;
+ }
+ .navbar-inverse .nav-collapse .nav > li > a,
+ .navbar-inverse .nav-collapse .dropdown-menu a {
+ color: #999999;
+ }
+ .navbar-inverse .nav-collapse .nav > li > a:hover,
+ .navbar-inverse .nav-collapse .nav > li > a:focus,
+ .navbar-inverse .nav-collapse .dropdown-menu a:hover,
+ .navbar-inverse .nav-collapse .dropdown-menu a:focus {
+ background-color: #111111;
+ }
+ .nav-collapse.in .btn-group {
+ padding: 0;
+ margin-top: 5px;
+ }
+ .nav-collapse .dropdown-menu {
+ position: static;
+ top: auto;
+ left: auto;
+ display: none;
+ float: none;
+ max-width: none;
+ padding: 0;
+ margin: 0 15px;
+ background-color: transparent;
+ border: none;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ }
+ .nav-collapse .open > .dropdown-menu {
+ display: block;
+ }
+ .nav-collapse .dropdown-menu:before,
+ .nav-collapse .dropdown-menu:after {
+ display: none;
+ }
+ .nav-collapse .dropdown-menu .divider {
+ display: none;
+ }
+ .nav-collapse .nav > li > .dropdown-menu:before,
+ .nav-collapse .nav > li > .dropdown-menu:after {
+ display: none;
+ }
+ .nav-collapse .navbar-form,
+ .nav-collapse .navbar-search {
+ float: none;
+ padding: 10px 15px;
+ margin: 10px 0;
+ border-top: 1px solid #f2f2f2;
+ border-bottom: 1px solid #f2f2f2;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ }
+ .navbar-inverse .nav-collapse .navbar-form,