From: Maxious Date: Sat, 08 Oct 2011 12:55:48 +0000 Subject: Geocoding credits X-Git-Url: http://maxious.lambdacomplex.org/git/?p=busui.git&a=commitdiff&h=36eaa540522c44f974f4b8eaa7a561acc17e1320 --- Geocoding credits --- --- /dev/null +++ b/.box @@ -1,1 +1,5 @@ +shared_writable_dirs: + - /labs/tiles + - /lib/staticmaplite/cache +php_extensions: [pgsql, pdo, pdo_pgsql, curl] --- /dev/null +++ b/.gitignore @@ -1,1 +1,9 @@ +/labs/tiles/12 +/labs/tiles/13 +/labs/tiles/14 +/labs/tiles/15 +/labs/tiles/16 +/labs/tiles/17 +/labs/tiles/19 +/nbproject/private/ --- a/about.php +++ b/about.php @@ -1,31 +1,55 @@

-Busness Time - An ACT bus timetable webapp
-Based on the maxious-canberra-transit-feed (download, -last updated )
-Source code for the transit -feed and this -site available from github.
-Uses jQuery Mobile, PHP, PostgreSQL, OpenTripPlanner, OpenLayers, OpenStreetMap, Cloudmade Geocoder and Tile Service
-
-Feedback encouraged; contact maxious@lambdacomplex.org
+ Busness Time - An ACT bus timetable webapp
+ Based on the maxious-canberra-transit-feed (download, + last updated )
+ Source code for the transit + feed and this + site available from github.
+ Uses jQuery Mobile, PHP, PostgreSQL, OpenTripPlanner, OpenLayers, OpenStreetMap, Cloudmade Geocoder and Tile Service
+ Suburb Geocoding Based on Australian Bureau of Statistics data.
+ Street geocoding based on work by OpenStreetMap contributors

-Some icons by Joseph Wain / glyphish.com
-
-Disclaimer: The content of this website is of a general and informative nature. Please check with printed timetables or those available on http://action.act.gov.au before your trip. -Whilst every effort has been made to ensure the high quality and accuracy of the Site, the Author makes no warranty, -express or implied concerning the topicality, correctness, completeness or quality of the information, which is provided -"as is". The Author expressly disclaims all warranties, including but not limited to warranties of fitness for a particular purpose and warranties of merchantability. -All offers are not binding and without obligation. The Author expressly reserves the right, in his discretion, to suspend, -change, modify, add or remove portions of the Site and to restrict or terminate the use and accessibility of the Site -without prior notice. - + Feedback encouraged; contact maxious@lambdacomplex.org
+
+ Some icons by Joseph Wain / glyphish.com
+ Native clients also available for iPhone(cbrTimetable by Sandor Kolotenko + , ACT Buses by David Sullivan) + and Android (MyBus 2.0 by Imagine Team) +
+ GTFS-realtime API: + Alerts and Trip Updates (but only Cancelled or Stop Skipped) + Default format binary Protocol Buffer but can get JSON by adding ?ascii=yes +
+
+ Disclaimer: The content of this website is of a general and informative nature. Please check with printed timetables or those available on http://action.act.gov.au before your trip. + Whilst every effort has been made to ensure the high quality and accuracy of the Site, the Author makes no warranty, + express or implied concerning the topicality, correctness, completeness or quality of the information, which is provided + "as is". The Author expressly disclaims all warranties, including but not limited to warranties of fitness for a particular purpose and warranties of merchantability. + All offers are not binding and without obligation. The Author expressly reserves the right, in his discretion, to suspend, + change, modify, add or remove portions of the Site and to restrict or terminate the use and accessibility of the Site + without prior notice. + --- a/aws/awsStartup.sh +++ b/aws/awsStartup.sh @@ -5,35 +5,9 @@ #postgres postgres-server php-pg #http://www.how2forge.org/installing-lighttpd-with-php5-and-mysql-support-on-fedora-12 -cp /root/aws.php /tmp/ -mkdir /var/www/lib/staticmaplite/cache -chcon -h system_u:object_r:httpd_sys_content_t /var/www -chcon -R -h root:object_r:httpd_sys_content_t /var/www/* -chcon -R -t httpd_sys_content_rw_t /var/www/lib/staticmaplite/cache -chmod -R 777 /var/www/lib/staticmaplite/cache -chcon -R -t httpd_sys_content_rw_t /var/www/labs/tiles -chmod -R 777 /var/www/labs/tiles -wget http://s3-ap-southeast-1.amazonaws.com/busresources/cbrfeed.zip \ --O /var/www/cbrfeed.zip +sh busuiphp.sh +sh busuidb.sh +sh busuiotp.sh -createdb transitdata -createlang -d transitdata plpgsql -psql -d transitdata -f /var/www/lib/postgis.sql -# curl https://github.com/maxious/ACTBus-ui/raw/master/transitdata.cbrfeed.sql.gz -o transitdata.cbrfeed.sql.gz -#made with pg_dump transitdata | gzip -c > transitdata.cbrfeed.sql.gz -gunzip /var/www/transitdata.cbrfeed.sql.gz -psql -d transitdata -f /var/www/transitdata.cbrfeed.sql -#createuser transitdata -SDRP -#password transitdata -#psql -d transitdata -c \"GRANT SELECT ON TABLE agency,calendar,calendar_dates,routes,stop_times,stops,trips TO transitdata;\" -php /var/www/updatedb.php -wget http://s3-ap-southeast-1.amazonaws.com/busresources/Graph.obj \ --O /tmp/Graph.obj -rm -rfv /usr/share/tomcat6/webapps/opentripplanner* -wget http://s3-ap-southeast-1.amazonaws.com/busresources/opentripplanner-webapp.war \ --O /usr/share/tomcat6/webapps/opentripplanner-webapp.war -wget http://s3-ap-southeast-1.amazonaws.com/busresources/opentripplanner-api-webapp.war \ --O /usr/share/tomcat6/webapps/opentripplanner-api-webapp.war -/etc/init.d/tomcat6 restart --- /dev/null +++ b/aws/busuidb.sh @@ -1,1 +1,14 @@ - +createdb transitdata +createlang -d transitdata plpgsql +psql -d transitdata -f /var/www/lib/postgis.sql +# curl https://github.com/maxious/ACTBus-ui/raw/master/transitdata.cbrfeed.sql.gz -o transitdata.cbrfeed.sql.gz +#made with pg_dump transitdata | gzip -c > transitdata.cbrfeed.sql.gz +gunzip /var/www/transitdata.cbrfeed.sql.gz +psql -d transitdata -f /var/www/transitdata.cbrfeed.sql +#createuser transitdata -SDRP +#password transitdata +#psql -d transitdata -c "GRANT SELECT ON TABLE agency,calendar,calendar_dates,routes,stop_times,stops,trips TO transitdata;" +#psql -d transitdata -c "GRANT SELECT,INSERT ON TABLE myway_observations,myway_routes,myway_stops,myway_timingdeltas TO transitdata;" +#psql -d transitdata -c "GRANT SELECT,INSERT,UPDATE ON TABLE myway_routes,myway_stops TO transitdata;" +##psql -d transitdata -c "GRANT SELECT ON ALL TABLES IN SCHEMA public TO transitdata;" +php /var/www/updatedb.php --- /dev/null +++ b/aws/busuiotp.sh @@ -1,1 +1,10 @@ +wget http://s3-ap-southeast-1.amazonaws.com/busresources/Graph.obj \ +-O /tmp/Graph.obj +/etc/init.d/tomcat6 stop +rm -rfv /usr/share/tomcat6/webapps/opentripplanner* +wget http://s3-ap-southeast-1.amazonaws.com/busresources/opentripplanner-webapp.war \ +-O /usr/share/tomcat6/webapps/opentripplanner-webapp.war +wget http://s3-ap-southeast-1.amazonaws.com/busresources/opentripplanner-api-webapp.war \ +-O /usr/share/tomcat6/webapps/opentripplanner-api-webapp.war +/etc/init.d/tomcat6 restart --- /dev/null +++ b/aws/busuiotp.testing.sh @@ -1,1 +1,10 @@ +wget http://s3-ap-southeast-1.amazonaws.com/busresources/testing/Graph.obj \ +-O /tmp/Graph.obj +/etc/init.d/tomcat6 stop +rm -rfv /usr/share/tomcat6/webapps/opentripplanner* +wget http://s3-ap-southeast-1.amazonaws.com/busresources/testing/opentripplanner-webapp.war \ +-O /usr/share/tomcat6/webapps/opentripplanner-webapp.war +wget http://s3-ap-southeast-1.amazonaws.com/busresources/testing/opentripplanner-api-webapp.war \ +-O /usr/share/tomcat6/webapps/opentripplanner-api-webapp.war +/etc/init.d/tomcat6 restart --- /dev/null +++ b/aws/busuiphp.sh @@ -1,1 +1,12 @@ +cp /root/aws.php /tmp/ +chmod 777 /var/cache/lighttpd/compress/ +chcon -h system_u:object_r:httpd_sys_content_t /var/www +chcon -R -h root:object_r:httpd_sys_content_t /var/www/* + +chcon -R -t httpd_sys_content_rw_t /var/www/labs/tiles +chmod -R 777 /var/www/labs/tiles + +wget http://s3-ap-southeast-1.amazonaws.com/busresources/cbrfeed.zip \ +-O /var/www/cbrfeed.zip + --- /dev/null +++ b/aws/data-sources.xml @@ -1,1 +1,13 @@ + + + + + + + + + + + --- /dev/null +++ b/aws/transitdata.sql @@ -1,1 +1,13780 @@ - +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 9.0.4 +-- Dumped by pg_dump version 9.0.4 +-- Started on 2011-10-07 22:30:10 + +SET statement_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = off; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET escape_string_warning = off; + +-- +-- TOC entry 2772 (class 1262 OID 18349) +-- Name: transitdata; Type: DATABASE; Schema: -; Owner: postgres +-- + +CREATE DATABASE transitdata WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'English_Australia.1252' LC_CTYPE = 'English_Australia.1252'; + + +ALTER DATABASE transitdata OWNER TO postgres; + +\connect transitdata + +SET statement_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = off; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET escape_string_warning = off; + +-- +-- TOC entry 1170 (class 2612 OID 11574) +-- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: -; Owner: postgres +-- + +CREATE OR REPLACE PROCEDURAL LANGUAGE plpgsql; + + +ALTER PROCEDURAL LANGUAGE plpgsql OWNER TO postgres; + +SET search_path = public, pg_catalog; + +-- +-- TOC entry 1088 (class 0 OID 0) +-- Name: box2d; Type: SHELL TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE box2d; + + +-- +-- TOC entry 15 (class 1255 OID 18351) +-- Dependencies: 6 1088 +-- Name: box2d_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box2d_in(cstring) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_in'; + + +ALTER FUNCTION public.box2d_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 19 (class 1255 OID 18352) +-- Dependencies: 6 1088 +-- Name: box2d_out(box2d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box2d_out(box2d) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_out'; + + +ALTER FUNCTION public.box2d_out(box2d) OWNER TO postgres; + +-- +-- TOC entry 1087 (class 1247 OID 18350) +-- Dependencies: 15 6 19 +-- Name: box2d; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE box2d ( + INTERNALLENGTH = 16, + INPUT = box2d_in, + OUTPUT = box2d_out, + ALIGNMENT = int4, + STORAGE = plain +); + + +ALTER TYPE public.box2d OWNER TO postgres; + +-- +-- TOC entry 1091 (class 0 OID 0) +-- Name: box3d; Type: SHELL TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE box3d; + + +-- +-- TOC entry 20 (class 1255 OID 18355) +-- Dependencies: 6 1091 +-- Name: box3d_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box3d_in(cstring) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_in'; + + +ALTER FUNCTION public.box3d_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 21 (class 1255 OID 18356) +-- Dependencies: 6 1091 +-- Name: box3d_out(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box3d_out(box3d) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_out'; + + +ALTER FUNCTION public.box3d_out(box3d) OWNER TO postgres; + +-- +-- TOC entry 1090 (class 1247 OID 18354) +-- Dependencies: 21 6 20 +-- Name: box3d; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE box3d ( + INTERNALLENGTH = 48, + INPUT = box3d_in, + OUTPUT = box3d_out, + ALIGNMENT = double, + STORAGE = plain +); + + +ALTER TYPE public.box3d OWNER TO postgres; + +-- +-- TOC entry 1094 (class 0 OID 0) +-- Name: box3d_extent; Type: SHELL TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE box3d_extent; + + +-- +-- TOC entry 22 (class 1255 OID 18359) +-- Dependencies: 6 1094 +-- Name: box3d_extent_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box3d_extent_in(cstring) RETURNS box3d_extent + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_in'; + + +ALTER FUNCTION public.box3d_extent_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 23 (class 1255 OID 18360) +-- Dependencies: 6 1094 +-- Name: box3d_extent_out(box3d_extent); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box3d_extent_out(box3d_extent) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_extent_out'; + + +ALTER FUNCTION public.box3d_extent_out(box3d_extent) OWNER TO postgres; + +-- +-- TOC entry 1093 (class 1247 OID 18358) +-- Dependencies: 6 22 23 +-- Name: box3d_extent; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE box3d_extent ( + INTERNALLENGTH = 48, + INPUT = box3d_extent_in, + OUTPUT = box3d_extent_out, + ALIGNMENT = double, + STORAGE = plain +); + + +ALTER TYPE public.box3d_extent OWNER TO postgres; + +-- +-- TOC entry 1097 (class 0 OID 0) +-- Name: chip; Type: SHELL TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE chip; + + +-- +-- TOC entry 24 (class 1255 OID 18363) +-- Dependencies: 6 1097 +-- Name: chip_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION chip_in(cstring) RETURNS chip + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_in'; + + +ALTER FUNCTION public.chip_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 25 (class 1255 OID 18364) +-- Dependencies: 6 1097 +-- Name: chip_out(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION chip_out(chip) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_out'; + + +ALTER FUNCTION public.chip_out(chip) OWNER TO postgres; + +-- +-- TOC entry 1096 (class 1247 OID 18362) +-- Dependencies: 6 25 24 +-- Name: chip; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE chip ( + INTERNALLENGTH = variable, + INPUT = chip_in, + OUTPUT = chip_out, + ALIGNMENT = double, + STORAGE = extended +); + + +ALTER TYPE public.chip OWNER TO postgres; + +-- +-- TOC entry 1100 (class 0 OID 0) +-- Name: geography; Type: SHELL TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE geography; + + +-- +-- TOC entry 26 (class 1255 OID 18367) +-- Dependencies: 6 +-- Name: geography_analyze(internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_analyze(internal) RETURNS boolean + LANGUAGE c STRICT + AS '$libdir/postgis-1.5', 'geography_analyze'; + + +ALTER FUNCTION public.geography_analyze(internal) OWNER TO postgres; + +-- +-- TOC entry 27 (class 1255 OID 18368) +-- Dependencies: 6 1100 +-- Name: geography_in(cstring, oid, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_in(cstring, oid, integer) RETURNS geography + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_in'; + + +ALTER FUNCTION public.geography_in(cstring, oid, integer) OWNER TO postgres; + +-- +-- TOC entry 28 (class 1255 OID 18369) +-- Dependencies: 6 1100 +-- Name: geography_out(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_out(geography) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_out'; + + +ALTER FUNCTION public.geography_out(geography) OWNER TO postgres; + +-- +-- TOC entry 29 (class 1255 OID 18370) +-- Dependencies: 6 +-- Name: geography_typmod_in(cstring[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_typmod_in(cstring[]) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_typmod_in'; + + +ALTER FUNCTION public.geography_typmod_in(cstring[]) OWNER TO postgres; + +-- +-- TOC entry 30 (class 1255 OID 18371) +-- Dependencies: 6 +-- Name: geography_typmod_out(integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_typmod_out(integer) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_typmod_out'; + + +ALTER FUNCTION public.geography_typmod_out(integer) OWNER TO postgres; + +-- +-- TOC entry 1099 (class 1247 OID 18366) +-- Dependencies: 29 30 26 6 27 28 +-- Name: geography; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE geography ( + INTERNALLENGTH = variable, + INPUT = geography_in, + OUTPUT = geography_out, + TYPMOD_IN = geography_typmod_in, + TYPMOD_OUT = geography_typmod_out, + ANALYZE = geography_analyze, + ALIGNMENT = double, + STORAGE = main +); + + +ALTER TYPE public.geography OWNER TO postgres; + +-- +-- TOC entry 1103 (class 0 OID 0) +-- Name: geometry; Type: SHELL TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE geometry; + + +-- +-- TOC entry 31 (class 1255 OID 18374) +-- Dependencies: 6 +-- Name: geometry_analyze(internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_analyze(internal) RETURNS boolean + LANGUAGE c STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_analyze'; + + +ALTER FUNCTION public.geometry_analyze(internal) OWNER TO postgres; + +-- +-- TOC entry 32 (class 1255 OID 18375) +-- Dependencies: 6 1103 +-- Name: geometry_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_in(cstring) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_in'; + + +ALTER FUNCTION public.geometry_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 33 (class 1255 OID 18376) +-- Dependencies: 6 1103 +-- Name: geometry_out(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_out(geometry) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_out'; + + +ALTER FUNCTION public.geometry_out(geometry) OWNER TO postgres; + +-- +-- TOC entry 34 (class 1255 OID 18377) +-- Dependencies: 6 1103 +-- Name: geometry_recv(internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_recv(internal) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_recv'; + + +ALTER FUNCTION public.geometry_recv(internal) OWNER TO postgres; + +-- +-- TOC entry 35 (class 1255 OID 18378) +-- Dependencies: 6 1103 +-- Name: geometry_send(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_send(geometry) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_send'; + + +ALTER FUNCTION public.geometry_send(geometry) OWNER TO postgres; + +-- +-- TOC entry 1102 (class 1247 OID 18373) +-- Dependencies: 35 31 32 6 33 34 +-- Name: geometry; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE geometry ( + INTERNALLENGTH = variable, + INPUT = geometry_in, + OUTPUT = geometry_out, + RECEIVE = geometry_recv, + SEND = geometry_send, + ANALYZE = geometry_analyze, + DELIMITER = ':', + ALIGNMENT = int4, + STORAGE = main +); + + +ALTER TYPE public.geometry OWNER TO postgres; + +-- +-- TOC entry 1105 (class 1247 OID 18382) +-- Dependencies: 6 2410 +-- Name: geometry_dump; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE geometry_dump AS ( + path integer[], + geom geometry +); + + +ALTER TYPE public.geometry_dump OWNER TO postgres; + +-- +-- TOC entry 1108 (class 0 OID 0) +-- Name: gidx; Type: SHELL TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE gidx; + + +-- +-- TOC entry 36 (class 1255 OID 18384) +-- Dependencies: 6 1108 +-- Name: gidx_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION gidx_in(cstring) RETURNS gidx + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'gidx_in'; + + +ALTER FUNCTION public.gidx_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 37 (class 1255 OID 18385) +-- Dependencies: 6 1108 +-- Name: gidx_out(gidx); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION gidx_out(gidx) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'gidx_out'; + + +ALTER FUNCTION public.gidx_out(gidx) OWNER TO postgres; + +-- +-- TOC entry 1107 (class 1247 OID 18383) +-- Dependencies: 36 6 37 +-- Name: gidx; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE gidx ( + INTERNALLENGTH = variable, + INPUT = gidx_in, + OUTPUT = gidx_out, + ALIGNMENT = double, + STORAGE = plain +); + + +ALTER TYPE public.gidx OWNER TO postgres; + +-- +-- TOC entry 1111 (class 0 OID 0) +-- Name: pgis_abs; Type: SHELL TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE pgis_abs; + + +-- +-- TOC entry 38 (class 1255 OID 18388) +-- Dependencies: 6 1111 +-- Name: pgis_abs_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pgis_abs_in(cstring) RETURNS pgis_abs + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'pgis_abs_in'; + + +ALTER FUNCTION public.pgis_abs_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 39 (class 1255 OID 18389) +-- Dependencies: 6 1111 +-- Name: pgis_abs_out(pgis_abs); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pgis_abs_out(pgis_abs) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'pgis_abs_out'; + + +ALTER FUNCTION public.pgis_abs_out(pgis_abs) OWNER TO postgres; + +-- +-- TOC entry 1110 (class 1247 OID 18387) +-- Dependencies: 39 6 38 +-- Name: pgis_abs; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE pgis_abs ( + INTERNALLENGTH = 8, + INPUT = pgis_abs_in, + OUTPUT = pgis_abs_out, + ALIGNMENT = double, + STORAGE = plain +); + + +ALTER TYPE public.pgis_abs OWNER TO postgres; + +-- +-- TOC entry 1114 (class 0 OID 0) +-- Name: spheroid; Type: SHELL TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE spheroid; + + +-- +-- TOC entry 40 (class 1255 OID 18392) +-- Dependencies: 6 1114 +-- Name: spheroid_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION spheroid_in(cstring) RETURNS spheroid + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'ellipsoid_in'; + + +ALTER FUNCTION public.spheroid_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 41 (class 1255 OID 18393) +-- Dependencies: 6 1114 +-- Name: spheroid_out(spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION spheroid_out(spheroid) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'ellipsoid_out'; + + +ALTER FUNCTION public.spheroid_out(spheroid) OWNER TO postgres; + +-- +-- TOC entry 1113 (class 1247 OID 18391) +-- Dependencies: 6 41 40 +-- Name: spheroid; Type: TYPE; Schema: public; Owner: postgres +-- + +CREATE TYPE spheroid ( + INTERNALLENGTH = 65, + INPUT = spheroid_in, + OUTPUT = spheroid_out, + ALIGNMENT = double, + STORAGE = plain +); + + +ALTER TYPE public.spheroid OWNER TO postgres; + +-- +-- TOC entry 42 (class 1255 OID 18395) +-- Dependencies: 6 1102 +-- Name: _st_asgeojson(integer, geometry, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_asgeojson(integer, geometry, integer, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asGeoJson'; + + +ALTER FUNCTION public._st_asgeojson(integer, geometry, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 43 (class 1255 OID 18396) +-- Dependencies: 1099 6 +-- Name: _st_asgeojson(integer, geography, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_asgeojson(integer, geography, integer, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_as_geojson'; + + +ALTER FUNCTION public._st_asgeojson(integer, geography, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 44 (class 1255 OID 18397) +-- Dependencies: 1102 6 +-- Name: _st_asgml(integer, geometry, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_asgml(integer, geometry, integer, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asGML'; + + +ALTER FUNCTION public._st_asgml(integer, geometry, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 45 (class 1255 OID 18398) +-- Dependencies: 1099 6 +-- Name: _st_asgml(integer, geography, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_asgml(integer, geography, integer, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_as_gml'; + + +ALTER FUNCTION public._st_asgml(integer, geography, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 46 (class 1255 OID 18399) +-- Dependencies: 6 1102 +-- Name: _st_askml(integer, geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_askml(integer, geometry, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asKML'; + + +ALTER FUNCTION public._st_askml(integer, geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 47 (class 1255 OID 18400) +-- Dependencies: 1099 6 +-- Name: _st_askml(integer, geography, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_askml(integer, geography, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_as_kml'; + + +ALTER FUNCTION public._st_askml(integer, geography, integer) OWNER TO postgres; + +-- +-- TOC entry 49 (class 1255 OID 18402) +-- Dependencies: 6 1099 +-- Name: _st_bestsrid(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_bestsrid(geography) RETURNS integer + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_BestSRID($1,$1)$_$; + + +ALTER FUNCTION public._st_bestsrid(geography) OWNER TO postgres; + +-- +-- TOC entry 48 (class 1255 OID 18401) +-- Dependencies: 1099 6 1099 +-- Name: _st_bestsrid(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_bestsrid(geography, geography) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_bestsrid'; + + +ALTER FUNCTION public._st_bestsrid(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 50 (class 1255 OID 18403) +-- Dependencies: 1102 6 1102 +-- Name: _st_buffer(geometry, double precision, cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_buffer(geometry, double precision, cstring) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'buffer'; + + +ALTER FUNCTION public._st_buffer(geometry, double precision, cstring) OWNER TO postgres; + +-- +-- TOC entry 51 (class 1255 OID 18404) +-- Dependencies: 6 1102 1102 +-- Name: _st_contains(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_contains(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'contains'; + + +ALTER FUNCTION public._st_contains(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 52 (class 1255 OID 18405) +-- Dependencies: 6 1102 1102 +-- Name: _st_containsproperly(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_containsproperly(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'containsproperly'; + + +ALTER FUNCTION public._st_containsproperly(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 53 (class 1255 OID 18406) +-- Dependencies: 6 1102 1102 +-- Name: _st_coveredby(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_coveredby(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'coveredby'; + + +ALTER FUNCTION public._st_coveredby(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 54 (class 1255 OID 18407) +-- Dependencies: 1102 6 1102 +-- Name: _st_covers(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_covers(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'covers'; + + +ALTER FUNCTION public._st_covers(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 55 (class 1255 OID 18408) +-- Dependencies: 1099 6 1099 +-- Name: _st_covers(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_covers(geography, geography) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'geography_covers'; + + +ALTER FUNCTION public._st_covers(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 56 (class 1255 OID 18409) +-- Dependencies: 1102 6 1102 +-- Name: _st_crosses(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_crosses(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'crosses'; + + +ALTER FUNCTION public._st_crosses(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 57 (class 1255 OID 18410) +-- Dependencies: 1102 6 1102 +-- Name: _st_dfullywithin(geometry, geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_dfullywithin(geometry, geometry, double precision) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_dfullywithin'; + + +ALTER FUNCTION public._st_dfullywithin(geometry, geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 58 (class 1255 OID 18411) +-- Dependencies: 1099 1099 6 +-- Name: _st_distance(geography, geography, double precision, boolean); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_distance(geography, geography, double precision, boolean) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'geography_distance'; + + +ALTER FUNCTION public._st_distance(geography, geography, double precision, boolean) OWNER TO postgres; + +-- +-- TOC entry 59 (class 1255 OID 18412) +-- Dependencies: 1105 1170 6 1102 +-- Name: _st_dumppoints(geometry, integer[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_dumppoints(the_geom geometry, cur_path integer[]) RETURNS SETOF geometry_dump + LANGUAGE plpgsql + AS $$ +DECLARE + tmp geometry_dump; + tmp2 geometry_dump; + nb_points integer; + nb_geom integer; + i integer; + j integer; + g geometry; + +BEGIN + + RAISE DEBUG '%,%', cur_path, ST_GeometryType(the_geom); + + -- Special case (MULTI* OR GEOMETRYCOLLECTION) : iterate and return the DumpPoints of the geometries + SELECT ST_NumGeometries(the_geom) INTO nb_geom; + + IF (nb_geom IS NOT NULL) THEN + + i = 1; + FOR tmp2 IN SELECT (ST_Dump(the_geom)).* LOOP + + FOR tmp IN SELECT * FROM _ST_DumpPoints(tmp2.geom, cur_path || tmp2.path) LOOP + RETURN NEXT tmp; + END LOOP; + i = i + 1; + + END LOOP; + + RETURN; + END IF; + + + -- Special case (POLYGON) : return the points of the rings of a polygon + IF (ST_GeometryType(the_geom) = 'ST_Polygon') THEN + + FOR tmp IN SELECT * FROM _ST_DumpPoints(ST_ExteriorRing(the_geom), cur_path || ARRAY[1]) LOOP + RETURN NEXT tmp; + END LOOP; + + j := ST_NumInteriorRings(the_geom); + FOR i IN 1..j LOOP + FOR tmp IN SELECT * FROM _ST_DumpPoints(ST_InteriorRingN(the_geom, i), cur_path || ARRAY[i+1]) LOOP + RETURN NEXT tmp; + END LOOP; + END LOOP; + + RETURN; + END IF; + + + -- Special case (POINT) : return the point + IF (ST_GeometryType(the_geom) = 'ST_Point') THEN + + tmp.path = cur_path || ARRAY[1]; + tmp.geom = the_geom; + + RETURN NEXT tmp; + RETURN; + + END IF; + + + -- Use ST_NumPoints rather than ST_NPoints to have a NULL value if the_geom isn't + -- a LINESTRING or CIRCULARSTRING. + SELECT ST_NumPoints(the_geom) INTO nb_points; + + -- This should never happen + IF (nb_points IS NULL) THEN + RAISE EXCEPTION 'Unexpected error while dumping geometry %', ST_AsText(the_geom); + END IF; + + FOR i IN 1..nb_points LOOP + tmp.path = cur_path || ARRAY[i]; + tmp.geom := ST_PointN(the_geom, i); + RETURN NEXT tmp; + END LOOP; + +END +$$; + + +ALTER FUNCTION public._st_dumppoints(the_geom geometry, cur_path integer[]) OWNER TO postgres; + +-- +-- TOC entry 60 (class 1255 OID 18413) +-- Dependencies: 1102 6 1102 +-- Name: _st_dwithin(geometry, geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_dwithin(geometry, geometry, double precision) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_dwithin'; + + +ALTER FUNCTION public._st_dwithin(geometry, geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 61 (class 1255 OID 18414) +-- Dependencies: 1099 6 1099 +-- Name: _st_dwithin(geography, geography, double precision, boolean); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_dwithin(geography, geography, double precision, boolean) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'geography_dwithin'; + + +ALTER FUNCTION public._st_dwithin(geography, geography, double precision, boolean) OWNER TO postgres; + +-- +-- TOC entry 62 (class 1255 OID 18415) +-- Dependencies: 1102 6 1102 +-- Name: _st_equals(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_equals(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'geomequals'; + + +ALTER FUNCTION public._st_equals(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 63 (class 1255 OID 18416) +-- Dependencies: 1099 6 1099 +-- Name: _st_expand(geography, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_expand(geography, double precision) RETURNS geography + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_expand'; + + +ALTER FUNCTION public._st_expand(geography, double precision) OWNER TO postgres; + +-- +-- TOC entry 64 (class 1255 OID 18417) +-- Dependencies: 1102 6 1102 +-- Name: _st_intersects(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_intersects(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'intersects'; + + +ALTER FUNCTION public._st_intersects(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 65 (class 1255 OID 18418) +-- Dependencies: 1102 6 1102 +-- Name: _st_linecrossingdirection(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_linecrossingdirection(geometry, geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'ST_LineCrossingDirection'; + + +ALTER FUNCTION public._st_linecrossingdirection(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 66 (class 1255 OID 18419) +-- Dependencies: 1102 6 1102 1102 +-- Name: _st_longestline(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_longestline(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_longestline2d'; + + +ALTER FUNCTION public._st_longestline(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 67 (class 1255 OID 18420) +-- Dependencies: 1102 6 1102 +-- Name: _st_maxdistance(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_maxdistance(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_maxdistance2d_linestring'; + + +ALTER FUNCTION public._st_maxdistance(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 68 (class 1255 OID 18421) +-- Dependencies: 6 1102 1102 +-- Name: _st_orderingequals(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_orderingequals(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_same'; + + +ALTER FUNCTION public._st_orderingequals(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 69 (class 1255 OID 18422) +-- Dependencies: 1102 6 1102 +-- Name: _st_overlaps(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_overlaps(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'overlaps'; + + +ALTER FUNCTION public._st_overlaps(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 70 (class 1255 OID 18423) +-- Dependencies: 1099 6 1099 +-- Name: _st_pointoutside(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_pointoutside(geography) RETURNS geography + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_point_outside'; + + +ALTER FUNCTION public._st_pointoutside(geography) OWNER TO postgres; + +-- +-- TOC entry 71 (class 1255 OID 18424) +-- Dependencies: 1102 6 1102 +-- Name: _st_touches(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_touches(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'touches'; + + +ALTER FUNCTION public._st_touches(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 72 (class 1255 OID 18425) +-- Dependencies: 1102 6 1102 +-- Name: _st_within(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION _st_within(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'within'; + + +ALTER FUNCTION public._st_within(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 73 (class 1255 OID 18426) +-- Dependencies: 6 1170 +-- Name: addauth(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION addauth(text) RETURNS boolean + LANGUAGE plpgsql + AS $_$ +DECLARE + lockid alias for $1; + okay boolean; + myrec record; +BEGIN + -- check to see if table exists + -- if not, CREATE TEMP TABLE mylock (transid xid, lockcode text) + okay := 'f'; + FOR myrec IN SELECT * FROM pg_class WHERE relname = 'temp_lock_have_table' LOOP + okay := 't'; + END LOOP; + IF (okay <> 't') THEN + CREATE TEMP TABLE temp_lock_have_table (transid xid, lockcode text); + -- this will only work from pgsql7.4 up + -- ON COMMIT DELETE ROWS; + END IF; + + -- INSERT INTO mylock VALUES ( $1) +-- EXECUTE 'INSERT INTO temp_lock_have_table VALUES ( '|| +-- quote_literal(getTransactionID()) || ',' || +-- quote_literal(lockid) ||')'; + + INSERT INTO temp_lock_have_table VALUES (getTransactionID(), lockid); + + RETURN true::boolean; +END; +$_$; + + +ALTER FUNCTION public.addauth(text) OWNER TO postgres; + +-- +-- TOC entry 74 (class 1255 OID 18427) +-- Dependencies: 1102 6 1102 +-- Name: addbbox(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION addbbox(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_addBBOX'; + + +ALTER FUNCTION public.addbbox(geometry) OWNER TO postgres; + +-- +-- TOC entry 79 (class 1255 OID 18430) +-- Dependencies: 6 1170 +-- Name: addgeometrycolumn(character varying, character varying, integer, character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION addgeometrycolumn(character varying, character varying, integer, character varying, integer) RETURNS text + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + ret text; +BEGIN + SELECT AddGeometryColumn('','',$1,$2,$3,$4,$5) into ret; + RETURN ret; +END; +$_$; + + +ALTER FUNCTION public.addgeometrycolumn(character varying, character varying, integer, character varying, integer) OWNER TO postgres; + +-- +-- TOC entry 78 (class 1255 OID 18429) +-- Dependencies: 6 1170 +-- Name: addgeometrycolumn(character varying, character varying, character varying, integer, character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION addgeometrycolumn(character varying, character varying, character varying, integer, character varying, integer) RETURNS text + LANGUAGE plpgsql STABLE STRICT + AS $_$ +DECLARE + ret text; +BEGIN + SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6) into ret; + RETURN ret; +END; +$_$; + + +ALTER FUNCTION public.addgeometrycolumn(character varying, character varying, character varying, integer, character varying, integer) OWNER TO postgres; + +-- +-- TOC entry 77 (class 1255 OID 18428) +-- Dependencies: 6 1170 +-- Name: addgeometrycolumn(character varying, character varying, character varying, character varying, integer, character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION addgeometrycolumn(character varying, character varying, character varying, character varying, integer, character varying, integer) RETURNS text + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + catalog_name alias for $1; + schema_name alias for $2; + table_name alias for $3; + column_name alias for $4; + new_srid alias for $5; + new_type alias for $6; + new_dim alias for $7; + rec RECORD; + sr varchar; + real_schema name; + sql text; + +BEGIN + + -- Verify geometry type + IF ( NOT ( (new_type = 'GEOMETRY') OR + (new_type = 'GEOMETRYCOLLECTION') OR + (new_type = 'POINT') OR + (new_type = 'MULTIPOINT') OR + (new_type = 'POLYGON') OR + (new_type = 'MULTIPOLYGON') OR + (new_type = 'LINESTRING') OR + (new_type = 'MULTILINESTRING') OR + (new_type = 'GEOMETRYCOLLECTIONM') OR + (new_type = 'POINTM') OR + (new_type = 'MULTIPOINTM') OR + (new_type = 'POLYGONM') OR + (new_type = 'MULTIPOLYGONM') OR + (new_type = 'LINESTRINGM') OR + (new_type = 'MULTILINESTRINGM') OR + (new_type = 'CIRCULARSTRING') OR + (new_type = 'CIRCULARSTRINGM') OR + (new_type = 'COMPOUNDCURVE') OR + (new_type = 'COMPOUNDCURVEM') OR + (new_type = 'CURVEPOLYGON') OR + (new_type = 'CURVEPOLYGONM') OR + (new_type = 'MULTICURVE') OR + (new_type = 'MULTICURVEM') OR + (new_type = 'MULTISURFACE') OR + (new_type = 'MULTISURFACEM')) ) + THEN + RAISE EXCEPTION 'Invalid type name - valid ones are: + POINT, MULTIPOINT, + LINESTRING, MULTILINESTRING, + POLYGON, MULTIPOLYGON, + CIRCULARSTRING, COMPOUNDCURVE, MULTICURVE, + CURVEPOLYGON, MULTISURFACE, + GEOMETRY, GEOMETRYCOLLECTION, + POINTM, MULTIPOINTM, + LINESTRINGM, MULTILINESTRINGM, + POLYGONM, MULTIPOLYGONM, + CIRCULARSTRINGM, COMPOUNDCURVEM, MULTICURVEM + CURVEPOLYGONM, MULTISURFACEM, + or GEOMETRYCOLLECTIONM'; + RETURN 'fail'; + END IF; + + + -- Verify dimension + IF ( (new_dim >4) OR (new_dim <0) ) THEN + RAISE EXCEPTION 'invalid dimension'; + RETURN 'fail'; + END IF; + + IF ( (new_type LIKE '%M') AND (new_dim!=3) ) THEN + RAISE EXCEPTION 'TypeM needs 3 dimensions'; + RETURN 'fail'; + END IF; + + + -- Verify SRID + IF ( new_srid != -1 ) THEN + SELECT SRID INTO sr FROM spatial_ref_sys WHERE SRID = new_srid; + IF NOT FOUND THEN + RAISE EXCEPTION 'AddGeometryColumns() - invalid SRID'; + RETURN 'fail'; + END IF; + END IF; + + + -- Verify schema + IF ( schema_name IS NOT NULL AND schema_name != '' ) THEN + sql := 'SELECT nspname FROM pg_namespace ' || + 'WHERE text(nspname) = ' || quote_literal(schema_name) || + 'LIMIT 1'; + RAISE DEBUG '%', sql; + EXECUTE sql INTO real_schema; + + IF ( real_schema IS NULL ) THEN + RAISE EXCEPTION 'Schema % is not a valid schemaname', quote_literal(schema_name); + RETURN 'fail'; + END IF; + END IF; + + IF ( real_schema IS NULL ) THEN + RAISE DEBUG 'Detecting schema'; + sql := 'SELECT n.nspname AS schemaname ' || + 'FROM pg_catalog.pg_class c ' || + 'JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace ' || + 'WHERE c.relkind = ' || quote_literal('r') || + ' AND n.nspname NOT IN (' || quote_literal('pg_catalog') || ', ' || quote_literal('pg_toast') || ')' || + ' AND pg_catalog.pg_table_is_visible(c.oid)' || + ' AND c.relname = ' || quote_literal(table_name); + RAISE DEBUG '%', sql; + EXECUTE sql INTO real_schema; + + IF ( real_schema IS NULL ) THEN + RAISE EXCEPTION 'Table % does not occur in the search_path', quote_literal(table_name); + RETURN 'fail'; + END IF; + END IF; + + + -- Add geometry column to table + sql := 'ALTER TABLE ' || + quote_ident(real_schema) || '.' || quote_ident(table_name) + || ' ADD COLUMN ' || quote_ident(column_name) || + ' geometry '; + RAISE DEBUG '%', sql; + EXECUTE sql; + + + -- Delete stale record in geometry_columns (if any) + sql := 'DELETE FROM geometry_columns WHERE + f_table_catalog = ' || quote_literal('') || + ' AND f_table_schema = ' || + quote_literal(real_schema) || + ' AND f_table_name = ' || quote_literal(table_name) || + ' AND f_geometry_column = ' || quote_literal(column_name); + RAISE DEBUG '%', sql; + EXECUTE sql; + + + -- Add record in geometry_columns + sql := 'INSERT INTO geometry_columns (f_table_catalog,f_table_schema,f_table_name,' || + 'f_geometry_column,coord_dimension,srid,type)' || + ' VALUES (' || + quote_literal('') || ',' || + quote_literal(real_schema) || ',' || + quote_literal(table_name) || ',' || + quote_literal(column_name) || ',' || + new_dim::text || ',' || + new_srid::text || ',' || + quote_literal(new_type) || ')'; + RAISE DEBUG '%', sql; + EXECUTE sql; + + + -- Add table CHECKs + sql := 'ALTER TABLE ' || + quote_ident(real_schema) || '.' || quote_ident(table_name) + || ' ADD CONSTRAINT ' + || quote_ident('enforce_srid_' || column_name) + || ' CHECK (ST_SRID(' || quote_ident(column_name) || + ') = ' || new_srid::text || ')' ; + RAISE DEBUG '%', sql; + EXECUTE sql; + + sql := 'ALTER TABLE ' || + quote_ident(real_schema) || '.' || quote_ident(table_name) + || ' ADD CONSTRAINT ' + || quote_ident('enforce_dims_' || column_name) + || ' CHECK (ST_NDims(' || quote_ident(column_name) || + ') = ' || new_dim::text || ')' ; + RAISE DEBUG '%', sql; + EXECUTE sql; + + IF ( NOT (new_type = 'GEOMETRY')) THEN + sql := 'ALTER TABLE ' || + quote_ident(real_schema) || '.' || quote_ident(table_name) || ' ADD CONSTRAINT ' || + quote_ident('enforce_geotype_' || column_name) || + ' CHECK (GeometryType(' || + quote_ident(column_name) || ')=' || + quote_literal(new_type) || ' OR (' || + quote_ident(column_name) || ') is null)'; + RAISE DEBUG '%', sql; + EXECUTE sql; + END IF; + + RETURN + real_schema || '.' || + table_name || '.' || column_name || + ' SRID:' || new_srid::text || + ' TYPE:' || new_type || + ' DIMS:' || new_dim::text || ' '; +END; +$_$; + + +ALTER FUNCTION public.addgeometrycolumn(character varying, character varying, character varying, character varying, integer, character varying, integer) OWNER TO postgres; + +-- +-- TOC entry 80 (class 1255 OID 18431) +-- Dependencies: 1102 6 1102 1102 +-- Name: addpoint(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION addpoint(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_addpoint'; + + +ALTER FUNCTION public.addpoint(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 81 (class 1255 OID 18432) +-- Dependencies: 1102 6 1102 1102 +-- Name: addpoint(geometry, geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION addpoint(geometry, geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_addpoint'; + + +ALTER FUNCTION public.addpoint(geometry, geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 83 (class 1255 OID 18434) +-- Dependencies: 1102 6 1102 +-- Name: affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, $2, $3, 0, $4, $5, 0, 0, 0, 1, $6, $7, 0)$_$; + + +ALTER FUNCTION public.affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 82 (class 1255 OID 18433) +-- Dependencies: 6 1102 1102 +-- Name: affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_affine'; + + +ALTER FUNCTION public.affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 84 (class 1255 OID 18435) +-- Dependencies: 6 1102 +-- Name: area(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION area(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_area_polygon'; + + +ALTER FUNCTION public.area(geometry) OWNER TO postgres; + +-- +-- TOC entry 85 (class 1255 OID 18436) +-- Dependencies: 6 1102 +-- Name: area2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION area2d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_area_polygon'; + + +ALTER FUNCTION public.area2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 86 (class 1255 OID 18437) +-- Dependencies: 1102 6 +-- Name: asbinary(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION asbinary(geometry) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asBinary'; + + +ALTER FUNCTION public.asbinary(geometry) OWNER TO postgres; + +-- +-- TOC entry 87 (class 1255 OID 18438) +-- Dependencies: 6 1102 +-- Name: asbinary(geometry, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION asbinary(geometry, text) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asBinary'; + + +ALTER FUNCTION public.asbinary(geometry, text) OWNER TO postgres; + +-- +-- TOC entry 88 (class 1255 OID 18439) +-- Dependencies: 1102 6 +-- Name: asewkb(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION asewkb(geometry) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'WKBFromLWGEOM'; + + +ALTER FUNCTION public.asewkb(geometry) OWNER TO postgres; + +-- +-- TOC entry 89 (class 1255 OID 18440) +-- Dependencies: 6 1102 +-- Name: asewkb(geometry, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION asewkb(geometry, text) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'WKBFromLWGEOM'; + + +ALTER FUNCTION public.asewkb(geometry, text) OWNER TO postgres; + +-- +-- TOC entry 90 (class 1255 OID 18441) +-- Dependencies: 1102 6 +-- Name: asewkt(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION asewkt(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asEWKT'; + + +ALTER FUNCTION public.asewkt(geometry) OWNER TO postgres; + +-- +-- TOC entry 92 (class 1255 OID 18443) +-- Dependencies: 6 1102 +-- Name: asgml(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION asgml(geometry) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML(2, $1, 15, 0)$_$; + + +ALTER FUNCTION public.asgml(geometry) OWNER TO postgres; + +-- +-- TOC entry 91 (class 1255 OID 18442) +-- Dependencies: 1102 6 +-- Name: asgml(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION asgml(geometry, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML(2, $1, $2, 0)$_$; + + +ALTER FUNCTION public.asgml(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 93 (class 1255 OID 18444) +-- Dependencies: 1102 6 +-- Name: ashexewkb(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION ashexewkb(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asHEXEWKB'; + + +ALTER FUNCTION public.ashexewkb(geometry) OWNER TO postgres; + +-- +-- TOC entry 94 (class 1255 OID 18445) +-- Dependencies: 6 1102 +-- Name: ashexewkb(geometry, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION ashexewkb(geometry, text) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asHEXEWKB'; + + +ALTER FUNCTION public.ashexewkb(geometry, text) OWNER TO postgres; + +-- +-- TOC entry 96 (class 1255 OID 18447) +-- Dependencies: 6 1102 +-- Name: askml(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION askml(geometry) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML(2, transform($1,4326), 15)$_$; + + +ALTER FUNCTION public.askml(geometry) OWNER TO postgres; + +-- +-- TOC entry 95 (class 1255 OID 18446) +-- Dependencies: 6 1102 +-- Name: askml(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION askml(geometry, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML(2, transform($1,4326), $2)$_$; + + +ALTER FUNCTION public.askml(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 97 (class 1255 OID 18448) +-- Dependencies: 1102 6 +-- Name: askml(integer, geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION askml(integer, geometry, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML($1, transform($2,4326), $3)$_$; + + +ALTER FUNCTION public.askml(integer, geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 100 (class 1255 OID 18451) +-- Dependencies: 1102 6 +-- Name: assvg(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION assvg(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'assvg_geometry'; + + +ALTER FUNCTION public.assvg(geometry) OWNER TO postgres; + +-- +-- TOC entry 99 (class 1255 OID 18450) +-- Dependencies: 6 1102 +-- Name: assvg(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION assvg(geometry, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'assvg_geometry'; + + +ALTER FUNCTION public.assvg(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 98 (class 1255 OID 18449) +-- Dependencies: 6 1102 +-- Name: assvg(geometry, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION assvg(geometry, integer, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'assvg_geometry'; + + +ALTER FUNCTION public.assvg(geometry, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 101 (class 1255 OID 18452) +-- Dependencies: 6 1102 +-- Name: astext(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION astext(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asText'; + + +ALTER FUNCTION public.astext(geometry) OWNER TO postgres; + +-- +-- TOC entry 102 (class 1255 OID 18453) +-- Dependencies: 6 1102 1102 +-- Name: azimuth(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION azimuth(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_azimuth'; + + +ALTER FUNCTION public.azimuth(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 103 (class 1255 OID 18454) +-- Dependencies: 1170 1102 6 +-- Name: bdmpolyfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION bdmpolyfromtext(text, integer) RETURNS geometry + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +DECLARE + geomtext alias for $1; + srid alias for $2; + mline geometry; + geom geometry; +BEGIN + mline := MultiLineStringFromText(geomtext, srid); + + IF mline IS NULL + THEN + RAISE EXCEPTION 'Input is not a MultiLinestring'; + END IF; + + geom := multi(BuildArea(mline)); + + RETURN geom; +END; +$_$; + + +ALTER FUNCTION public.bdmpolyfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 75 (class 1255 OID 18455) +-- Dependencies: 1170 1102 6 +-- Name: bdpolyfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION bdpolyfromtext(text, integer) RETURNS geometry + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +DECLARE + geomtext alias for $1; + srid alias for $2; + mline geometry; + geom geometry; +BEGIN + mline := MultiLineStringFromText(geomtext, srid); + + IF mline IS NULL + THEN + RAISE EXCEPTION 'Input is not a MultiLinestring'; + END IF; + + geom := BuildArea(mline); + + IF GeometryType(geom) != 'POLYGON' + THEN + RAISE EXCEPTION 'Input returns more then a single polygon, try using BdMPolyFromText instead'; + END IF; + + RETURN geom; +END; +$_$; + + +ALTER FUNCTION public.bdpolyfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 76 (class 1255 OID 18456) +-- Dependencies: 1102 6 1102 +-- Name: boundary(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION boundary(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'boundary'; + + +ALTER FUNCTION public.boundary(geometry) OWNER TO postgres; + +-- +-- TOC entry 104 (class 1255 OID 18457) +-- Dependencies: 1102 6 +-- Name: box(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box(geometry) RETURNS box + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_BOX'; + + +ALTER FUNCTION public.box(geometry) OWNER TO postgres; + +-- +-- TOC entry 105 (class 1255 OID 18458) +-- Dependencies: 1090 6 +-- Name: box(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box(box3d) RETURNS box + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_BOX'; + + +ALTER FUNCTION public.box(box3d) OWNER TO postgres; + +-- +-- TOC entry 106 (class 1255 OID 18459) +-- Dependencies: 1093 1087 6 +-- Name: box2d(box3d_extent); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box2d(box3d_extent) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_BOX2DFLOAT4'; + + +ALTER FUNCTION public.box2d(box3d_extent) OWNER TO postgres; + +-- +-- TOC entry 107 (class 1255 OID 18460) +-- Dependencies: 1102 1087 6 +-- Name: box2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box2d(geometry) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_BOX2DFLOAT4'; + + +ALTER FUNCTION public.box2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 108 (class 1255 OID 18461) +-- Dependencies: 1087 1090 6 +-- Name: box2d(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box2d(box3d) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_BOX2DFLOAT4'; + + +ALTER FUNCTION public.box2d(box3d) OWNER TO postgres; + +-- +-- TOC entry 109 (class 1255 OID 18462) +-- Dependencies: 6 1090 1102 +-- Name: box3d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box3d(geometry) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_BOX3D'; + + +ALTER FUNCTION public.box3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 110 (class 1255 OID 18463) +-- Dependencies: 1087 6 1090 +-- Name: box3d(box2d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box3d(box2d) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_to_BOX3D'; + + +ALTER FUNCTION public.box3d(box2d) OWNER TO postgres; + +-- +-- TOC entry 111 (class 1255 OID 18464) +-- Dependencies: 1090 6 1093 +-- Name: box3d_extent(box3d_extent); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box3d_extent(box3d_extent) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_extent_to_BOX3D'; + + +ALTER FUNCTION public.box3d_extent(box3d_extent) OWNER TO postgres; + +-- +-- TOC entry 112 (class 1255 OID 18465) +-- Dependencies: 6 1090 +-- Name: box3dtobox(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION box3dtobox(box3d) RETURNS box + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT box($1)$_$; + + +ALTER FUNCTION public.box3dtobox(box3d) OWNER TO postgres; + +-- +-- TOC entry 113 (class 1255 OID 18466) +-- Dependencies: 1102 6 1102 +-- Name: buffer(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION buffer(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'buffer'; + + +ALTER FUNCTION public.buffer(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 114 (class 1255 OID 18467) +-- Dependencies: 1102 6 1102 +-- Name: buffer(geometry, double precision, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION buffer(geometry, double precision, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_Buffer($1, $2, $3)$_$; + + +ALTER FUNCTION public.buffer(geometry, double precision, integer) OWNER TO postgres; + +-- +-- TOC entry 115 (class 1255 OID 18468) +-- Dependencies: 1102 6 1102 +-- Name: buildarea(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION buildarea(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_buildarea'; + + +ALTER FUNCTION public.buildarea(geometry) OWNER TO postgres; + +-- +-- TOC entry 116 (class 1255 OID 18469) +-- Dependencies: 6 1102 +-- Name: bytea(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION bytea(geometry) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_bytea'; + + +ALTER FUNCTION public.bytea(geometry) OWNER TO postgres; + +-- +-- TOC entry 117 (class 1255 OID 18470) +-- Dependencies: 6 1102 1102 +-- Name: centroid(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION centroid(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'centroid'; + + +ALTER FUNCTION public.centroid(geometry) OWNER TO postgres; + +-- +-- TOC entry 119 (class 1255 OID 18472) +-- Dependencies: 6 +-- Name: checkauth(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION checkauth(text, text) RETURNS integer + LANGUAGE sql + AS $_$ SELECT CheckAuth('', $1, $2) $_$; + + +ALTER FUNCTION public.checkauth(text, text) OWNER TO postgres; + +-- +-- TOC entry 118 (class 1255 OID 18471) +-- Dependencies: 1170 6 +-- Name: checkauth(text, text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION checkauth(text, text, text) RETURNS integer + LANGUAGE plpgsql + AS $_$ +DECLARE + schema text; +BEGIN + IF NOT LongTransactionsEnabled() THEN + RAISE EXCEPTION 'Long transaction support disabled, use EnableLongTransaction() to enable.'; + END IF; + + if ( $1 != '' ) THEN + schema = $1; + ELSE + SELECT current_schema() into schema; + END IF; + + -- TODO: check for an already existing trigger ? + + EXECUTE 'CREATE TRIGGER check_auth BEFORE UPDATE OR DELETE ON ' + || quote_ident(schema) || '.' || quote_ident($2) + ||' FOR EACH ROW EXECUTE PROCEDURE CheckAuthTrigger(' + || quote_literal($3) || ')'; + + RETURN 0; +END; +$_$; + + +ALTER FUNCTION public.checkauth(text, text, text) OWNER TO postgres; + +-- +-- TOC entry 120 (class 1255 OID 18473) +-- Dependencies: 6 +-- Name: checkauthtrigger(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION checkauthtrigger() RETURNS trigger + LANGUAGE c + AS '$libdir/postgis-1.5', 'check_authorization'; + + +ALTER FUNCTION public.checkauthtrigger() OWNER TO postgres; + +-- +-- TOC entry 121 (class 1255 OID 18474) +-- Dependencies: 1102 1102 6 1102 +-- Name: collect(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION collect(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'LWGEOM_collect'; + + +ALTER FUNCTION public.collect(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 122 (class 1255 OID 18475) +-- Dependencies: 1102 1087 1087 6 +-- Name: combine_bbox(box2d, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION combine_bbox(box2d, geometry) RETURNS box2d + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_combine'; + + +ALTER FUNCTION public.combine_bbox(box2d, geometry) OWNER TO postgres; + +-- +-- TOC entry 123 (class 1255 OID 18476) +-- Dependencies: 6 1093 1102 1093 +-- Name: combine_bbox(box3d_extent, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION combine_bbox(box3d_extent, geometry) RETURNS box3d_extent + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'BOX3D_combine'; + + +ALTER FUNCTION public.combine_bbox(box3d_extent, geometry) OWNER TO postgres; + +-- +-- TOC entry 124 (class 1255 OID 18477) +-- Dependencies: 6 1102 1090 1090 +-- Name: combine_bbox(box3d, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION combine_bbox(box3d, geometry) RETURNS box3d + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'BOX3D_combine'; + + +ALTER FUNCTION public.combine_bbox(box3d, geometry) OWNER TO postgres; + +-- +-- TOC entry 125 (class 1255 OID 18478) +-- Dependencies: 1096 6 +-- Name: compression(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION compression(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getCompression'; + + +ALTER FUNCTION public.compression(chip) OWNER TO postgres; + +-- +-- TOC entry 126 (class 1255 OID 18479) +-- Dependencies: 1102 1102 6 +-- Name: contains(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION contains(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'contains'; + + +ALTER FUNCTION public.contains(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 127 (class 1255 OID 18480) +-- Dependencies: 1102 1102 6 +-- Name: convexhull(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION convexhull(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'convexhull'; + + +ALTER FUNCTION public.convexhull(geometry) OWNER TO postgres; + +-- +-- TOC entry 128 (class 1255 OID 18481) +-- Dependencies: 6 1102 1102 +-- Name: crosses(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION crosses(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'crosses'; + + +ALTER FUNCTION public.crosses(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 129 (class 1255 OID 18482) +-- Dependencies: 6 1096 +-- Name: datatype(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION datatype(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getDatatype'; + + +ALTER FUNCTION public.datatype(chip) OWNER TO postgres; + +-- +-- TOC entry 130 (class 1255 OID 18483) +-- Dependencies: 1102 1102 6 1102 +-- Name: difference(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION difference(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'difference'; + + +ALTER FUNCTION public.difference(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 131 (class 1255 OID 18484) +-- Dependencies: 1102 6 +-- Name: dimension(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dimension(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_dimension'; + + +ALTER FUNCTION public.dimension(geometry) OWNER TO postgres; + +-- +-- TOC entry 132 (class 1255 OID 18485) +-- Dependencies: 1170 6 +-- Name: disablelongtransactions(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION disablelongtransactions() RETURNS text + LANGUAGE plpgsql + AS $$ +DECLARE + rec RECORD; + +BEGIN + + -- + -- Drop all triggers applied by CheckAuth() + -- + FOR rec IN + SELECT c.relname, t.tgname, t.tgargs FROM pg_trigger t, pg_class c, pg_proc p + WHERE p.proname = 'checkauthtrigger' and t.tgfoid = p.oid and t.tgrelid = c.oid + LOOP + EXECUTE 'DROP TRIGGER ' || quote_ident(rec.tgname) || + ' ON ' || quote_ident(rec.relname); + END LOOP; + + -- + -- Drop the authorization_table table + -- + FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorization_table' LOOP + DROP TABLE authorization_table; + END LOOP; + + -- + -- Drop the authorized_tables view + -- + FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorized_tables' LOOP + DROP VIEW authorized_tables; + END LOOP; + + RETURN 'Long transactions support disabled'; +END; +$$; + + +ALTER FUNCTION public.disablelongtransactions() OWNER TO postgres; + +-- +-- TOC entry 133 (class 1255 OID 18486) +-- Dependencies: 1102 6 1102 +-- Name: disjoint(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION disjoint(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'disjoint'; + + +ALTER FUNCTION public.disjoint(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 134 (class 1255 OID 18487) +-- Dependencies: 1102 6 1102 +-- Name: distance(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION distance(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_mindistance2d'; + + +ALTER FUNCTION public.distance(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 135 (class 1255 OID 18488) +-- Dependencies: 1102 6 1102 +-- Name: distance_sphere(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION distance_sphere(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_distance_sphere'; + + +ALTER FUNCTION public.distance_sphere(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 136 (class 1255 OID 18489) +-- Dependencies: 6 1102 1102 1113 +-- Name: distance_spheroid(geometry, geometry, spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION distance_spheroid(geometry, geometry, spheroid) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_distance_ellipsoid'; + + +ALTER FUNCTION public.distance_spheroid(geometry, geometry, spheroid) OWNER TO postgres; + +-- +-- TOC entry 137 (class 1255 OID 18490) +-- Dependencies: 1102 6 1102 +-- Name: dropbbox(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dropbbox(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_dropBBOX'; + + +ALTER FUNCTION public.dropbbox(geometry) OWNER TO postgres; + +-- +-- TOC entry 140 (class 1255 OID 18493) +-- Dependencies: 6 1170 +-- Name: dropgeometrycolumn(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dropgeometrycolumn(character varying, character varying) RETURNS text + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + ret text; +BEGIN + SELECT DropGeometryColumn('','',$1,$2) into ret; + RETURN ret; +END; +$_$; + + +ALTER FUNCTION public.dropgeometrycolumn(character varying, character varying) OWNER TO postgres; + +-- +-- TOC entry 139 (class 1255 OID 18492) +-- Dependencies: 6 1170 +-- Name: dropgeometrycolumn(character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dropgeometrycolumn(character varying, character varying, character varying) RETURNS text + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + ret text; +BEGIN + SELECT DropGeometryColumn('',$1,$2,$3) into ret; + RETURN ret; +END; +$_$; + + +ALTER FUNCTION public.dropgeometrycolumn(character varying, character varying, character varying) OWNER TO postgres; + +-- +-- TOC entry 138 (class 1255 OID 18491) +-- Dependencies: 6 1170 +-- Name: dropgeometrycolumn(character varying, character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dropgeometrycolumn(character varying, character varying, character varying, character varying) RETURNS text + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + catalog_name alias for $1; + schema_name alias for $2; + table_name alias for $3; + column_name alias for $4; + myrec RECORD; + okay boolean; + real_schema name; + +BEGIN + + + -- Find, check or fix schema_name + IF ( schema_name != '' ) THEN + okay = 'f'; + + FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP + okay := 't'; + END LOOP; + + IF ( okay <> 't' ) THEN + RAISE NOTICE 'Invalid schema name - using current_schema()'; + SELECT current_schema() into real_schema; + ELSE + real_schema = schema_name; + END IF; + ELSE + SELECT current_schema() into real_schema; + END IF; + + -- Find out if the column is in the geometry_columns table + okay = 'f'; + FOR myrec IN SELECT * from geometry_columns where f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP + okay := 't'; + END LOOP; + IF (okay <> 't') THEN + RAISE EXCEPTION 'column not found in geometry_columns table'; + RETURN 'f'; + END IF; + + -- Remove ref from geometry_columns table + EXECUTE 'delete from geometry_columns where f_table_schema = ' || + quote_literal(real_schema) || ' and f_table_name = ' || + quote_literal(table_name) || ' and f_geometry_column = ' || + quote_literal(column_name); + + -- Remove table column + EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || '.' || + quote_ident(table_name) || ' DROP COLUMN ' || + quote_ident(column_name); + + RETURN real_schema || '.' || table_name || '.' || column_name ||' effectively removed.'; + +END; +$_$; + + +ALTER FUNCTION public.dropgeometrycolumn(character varying, character varying, character varying, character varying) OWNER TO postgres; + +-- +-- TOC entry 143 (class 1255 OID 18496) +-- Dependencies: 6 +-- Name: dropgeometrytable(character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dropgeometrytable(character varying) RETURNS text + LANGUAGE sql STRICT + AS $_$ SELECT DropGeometryTable('','',$1) $_$; + + +ALTER FUNCTION public.dropgeometrytable(character varying) OWNER TO postgres; + +-- +-- TOC entry 142 (class 1255 OID 18495) +-- Dependencies: 6 +-- Name: dropgeometrytable(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dropgeometrytable(character varying, character varying) RETURNS text + LANGUAGE sql STRICT + AS $_$ SELECT DropGeometryTable('',$1,$2) $_$; + + +ALTER FUNCTION public.dropgeometrytable(character varying, character varying) OWNER TO postgres; + +-- +-- TOC entry 141 (class 1255 OID 18494) +-- Dependencies: 1170 6 +-- Name: dropgeometrytable(character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dropgeometrytable(character varying, character varying, character varying) RETURNS text + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + catalog_name alias for $1; + schema_name alias for $2; + table_name alias for $3; + real_schema name; + +BEGIN + + IF ( schema_name = '' ) THEN + SELECT current_schema() into real_schema; + ELSE + real_schema = schema_name; + END IF; + + -- Remove refs from geometry_columns table + EXECUTE 'DELETE FROM geometry_columns WHERE ' || + 'f_table_schema = ' || quote_literal(real_schema) || + ' AND ' || + ' f_table_name = ' || quote_literal(table_name); + + -- Remove table + EXECUTE 'DROP TABLE ' + || quote_ident(real_schema) || '.' || + quote_ident(table_name); + + RETURN + real_schema || '.' || + table_name ||' dropped.'; + +END; +$_$; + + +ALTER FUNCTION public.dropgeometrytable(character varying, character varying, character varying) OWNER TO postgres; + +-- +-- TOC entry 144 (class 1255 OID 18497) +-- Dependencies: 6 1102 1105 +-- Name: dump(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dump(geometry) RETURNS SETOF geometry_dump + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_dump'; + + +ALTER FUNCTION public.dump(geometry) OWNER TO postgres; + +-- +-- TOC entry 145 (class 1255 OID 18498) +-- Dependencies: 1105 6 1102 +-- Name: dumprings(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION dumprings(geometry) RETURNS SETOF geometry_dump + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_dump_rings'; + + +ALTER FUNCTION public.dumprings(geometry) OWNER TO postgres; + +-- +-- TOC entry 146 (class 1255 OID 18499) +-- Dependencies: 1170 6 +-- Name: enablelongtransactions(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION enablelongtransactions() RETURNS text + LANGUAGE plpgsql + AS $$ +DECLARE + "query" text; + exists bool; + rec RECORD; + +BEGIN + + exists = 'f'; + FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorization_table' + LOOP + exists = 't'; + END LOOP; + + IF NOT exists + THEN + "query" = 'CREATE TABLE authorization_table ( + toid oid, -- table oid + rid text, -- row id + expires timestamp, + authid text + )'; + EXECUTE "query"; + END IF; + + exists = 'f'; + FOR rec IN SELECT * FROM pg_class WHERE relname = 'authorized_tables' + LOOP + exists = 't'; + END LOOP; + + IF NOT exists THEN + "query" = 'CREATE VIEW authorized_tables AS ' || + 'SELECT ' || + 'n.nspname as schema, ' || + 'c.relname as table, trim(' || + quote_literal(chr(92) || '000') || + ' from t.tgargs) as id_column ' || + 'FROM pg_trigger t, pg_class c, pg_proc p ' || + ', pg_namespace n ' || + 'WHERE p.proname = ' || quote_literal('checkauthtrigger') || + ' AND c.relnamespace = n.oid' || + ' AND t.tgfoid = p.oid and t.tgrelid = c.oid'; + EXECUTE "query"; + END IF; + + RETURN 'Long transactions support enabled'; +END; +$$; + + +ALTER FUNCTION public.enablelongtransactions() OWNER TO postgres; + +-- +-- TOC entry 147 (class 1255 OID 18500) +-- Dependencies: 6 1102 1102 +-- Name: endpoint(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION endpoint(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_endpoint_linestring'; + + +ALTER FUNCTION public.endpoint(geometry) OWNER TO postgres; + +-- +-- TOC entry 148 (class 1255 OID 18501) +-- Dependencies: 1102 6 1102 +-- Name: envelope(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION envelope(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_envelope'; + + +ALTER FUNCTION public.envelope(geometry) OWNER TO postgres; + +-- +-- TOC entry 149 (class 1255 OID 18502) +-- Dependencies: 6 1102 1102 +-- Name: equals(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION equals(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geomequals'; + + +ALTER FUNCTION public.equals(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 151 (class 1255 OID 18504) +-- Dependencies: 6 1087 +-- Name: estimated_extent(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION estimated_extent(text, text) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT SECURITY DEFINER + AS '$libdir/postgis-1.5', 'LWGEOM_estimated_extent'; + + +ALTER FUNCTION public.estimated_extent(text, text) OWNER TO postgres; + +-- +-- TOC entry 150 (class 1255 OID 18503) +-- Dependencies: 1087 6 +-- Name: estimated_extent(text, text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION estimated_extent(text, text, text) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT SECURITY DEFINER + AS '$libdir/postgis-1.5', 'LWGEOM_estimated_extent'; + + +ALTER FUNCTION public.estimated_extent(text, text, text) OWNER TO postgres; + +-- +-- TOC entry 152 (class 1255 OID 18505) +-- Dependencies: 1090 6 1090 +-- Name: expand(box3d, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION expand(box3d, double precision) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_expand'; + + +ALTER FUNCTION public.expand(box3d, double precision) OWNER TO postgres; + +-- +-- TOC entry 153 (class 1255 OID 18506) +-- Dependencies: 1087 1087 6 +-- Name: expand(box2d, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION expand(box2d, double precision) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_expand'; + + +ALTER FUNCTION public.expand(box2d, double precision) OWNER TO postgres; + +-- +-- TOC entry 154 (class 1255 OID 18507) +-- Dependencies: 6 1102 1102 +-- Name: expand(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION expand(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_expand'; + + +ALTER FUNCTION public.expand(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 155 (class 1255 OID 18508) +-- Dependencies: 6 1102 1102 +-- Name: exteriorring(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION exteriorring(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_exteriorring_polygon'; + + +ALTER FUNCTION public.exteriorring(geometry) OWNER TO postgres; + +-- +-- TOC entry 156 (class 1255 OID 18509) +-- Dependencies: 1096 6 +-- Name: factor(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION factor(chip) RETURNS real + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getFactor'; + + +ALTER FUNCTION public.factor(chip) OWNER TO postgres; + +-- +-- TOC entry 158 (class 1255 OID 18511) +-- Dependencies: 1087 6 1170 +-- Name: find_extent(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION find_extent(text, text) RETURNS box2d + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +DECLARE + tablename alias for $1; + columnname alias for $2; + myrec RECORD; + +BEGIN + FOR myrec IN EXECUTE 'SELECT extent("' || columnname || '") FROM "' || tablename || '"' LOOP + return myrec.extent; + END LOOP; +END; +$_$; + + +ALTER FUNCTION public.find_extent(text, text) OWNER TO postgres; + +-- +-- TOC entry 157 (class 1255 OID 18510) +-- Dependencies: 6 1170 1087 +-- Name: find_extent(text, text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION find_extent(text, text, text) RETURNS box2d + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +DECLARE + schemaname alias for $1; + tablename alias for $2; + columnname alias for $3; + myrec RECORD; + +BEGIN + FOR myrec IN EXECUTE 'SELECT extent("' || columnname || '") FROM "' || schemaname || '"."' || tablename || '"' LOOP + return myrec.extent; + END LOOP; +END; +$_$; + + +ALTER FUNCTION public.find_extent(text, text, text) OWNER TO postgres; + +-- +-- TOC entry 159 (class 1255 OID 18512) +-- Dependencies: 1170 6 +-- Name: find_srid(character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION find_srid(character varying, character varying, character varying) RETURNS integer + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +DECLARE + schem text; + tabl text; + sr int4; +BEGIN + IF $1 IS NULL THEN + RAISE EXCEPTION 'find_srid() - schema is NULL!'; + END IF; + IF $2 IS NULL THEN + RAISE EXCEPTION 'find_srid() - table name is NULL!'; + END IF; + IF $3 IS NULL THEN + RAISE EXCEPTION 'find_srid() - column name is NULL!'; + END IF; + schem = $1; + tabl = $2; +-- if the table contains a . and the schema is empty +-- split the table into a schema and a table +-- otherwise drop through to default behavior + IF ( schem = '' and tabl LIKE '%.%' ) THEN + schem = substr(tabl,1,strpos(tabl,'.')-1); + tabl = substr(tabl,length(schem)+2); + ELSE + schem = schem || '%'; + END IF; + + select SRID into sr from geometry_columns where f_table_schema like schem and f_table_name = tabl and f_geometry_column = $3; + IF NOT FOUND THEN + RAISE EXCEPTION 'find_srid() - couldnt find the corresponding SRID - is the geometry registered in the GEOMETRY_COLUMNS table? Is there an uppercase/lowercase missmatch?'; + END IF; + return sr; +END; +$_$; + + +ALTER FUNCTION public.find_srid(character varying, character varying, character varying) OWNER TO postgres; + +-- +-- TOC entry 160 (class 1255 OID 18513) +-- Dependencies: 1170 6 +-- Name: fix_geometry_columns(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION fix_geometry_columns() RETURNS text + LANGUAGE plpgsql + AS $$ +DECLARE + mislinked record; + result text; + linked integer; + deleted integer; + foundschema integer; +BEGIN + + -- Since 7.3 schema support has been added. + -- Previous postgis versions used to put the database name in + -- the schema column. This needs to be fixed, so we try to + -- set the correct schema for each geometry_colums record + -- looking at table, column, type and srid. + UPDATE geometry_columns SET f_table_schema = n.nspname + FROM pg_namespace n, pg_class c, pg_attribute a, + pg_constraint sridcheck, pg_constraint typecheck + WHERE ( f_table_schema is NULL + OR f_table_schema = '' + OR f_table_schema NOT IN ( + SELECT nspname::varchar + FROM pg_namespace nn, pg_class cc, pg_attribute aa + WHERE cc.relnamespace = nn.oid + AND cc.relname = f_table_name::name + AND aa.attrelid = cc.oid + AND aa.attname = f_geometry_column::name)) + AND f_table_name::name = c.relname + AND c.oid = a.attrelid + AND c.relnamespace = n.oid + AND f_geometry_column::name = a.attname + + AND sridcheck.conrelid = c.oid + AND sridcheck.consrc LIKE '(srid(% = %)' + AND sridcheck.consrc ~ textcat(' = ', srid::text) + + AND typecheck.conrelid = c.oid + AND typecheck.consrc LIKE + '((geometrytype(%) = ''%''::text) OR (% IS NULL))' + AND typecheck.consrc ~ textcat(' = ''', type::text) + + AND NOT EXISTS ( + SELECT oid FROM geometry_columns gc + WHERE c.relname::varchar = gc.f_table_name + AND n.nspname::varchar = gc.f_table_schema + AND a.attname::varchar = gc.f_geometry_column + ); + + GET DIAGNOSTICS foundschema = ROW_COUNT; + + -- no linkage to system table needed + return 'fixed:'||foundschema::text; + +END; +$$; + + +ALTER FUNCTION public.fix_geometry_columns() OWNER TO postgres; + +-- +-- TOC entry 161 (class 1255 OID 18514) +-- Dependencies: 1102 1102 6 +-- Name: force_2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION force_2d(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_2d'; + + +ALTER FUNCTION public.force_2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 162 (class 1255 OID 18515) +-- Dependencies: 1102 6 1102 +-- Name: force_3d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION force_3d(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dz'; + + +ALTER FUNCTION public.force_3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 163 (class 1255 OID 18516) +-- Dependencies: 6 1102 1102 +-- Name: force_3dm(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION force_3dm(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dm'; + + +ALTER FUNCTION public.force_3dm(geometry) OWNER TO postgres; + +-- +-- TOC entry 164 (class 1255 OID 18517) +-- Dependencies: 6 1102 1102 +-- Name: force_3dz(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION force_3dz(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dz'; + + +ALTER FUNCTION public.force_3dz(geometry) OWNER TO postgres; + +-- +-- TOC entry 165 (class 1255 OID 18518) +-- Dependencies: 6 1102 1102 +-- Name: force_4d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION force_4d(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_4d'; + + +ALTER FUNCTION public.force_4d(geometry) OWNER TO postgres; + +-- +-- TOC entry 166 (class 1255 OID 18519) +-- Dependencies: 6 1102 1102 +-- Name: force_collection(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION force_collection(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_collection'; + + +ALTER FUNCTION public.force_collection(geometry) OWNER TO postgres; + +-- +-- TOC entry 167 (class 1255 OID 18520) +-- Dependencies: 6 1102 1102 +-- Name: forcerhr(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION forcerhr(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_forceRHR_poly'; + + +ALTER FUNCTION public.forcerhr(geometry) OWNER TO postgres; + +-- +-- TOC entry 169 (class 1255 OID 18522) +-- Dependencies: 6 1099 1102 +-- Name: geography(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography(geometry) RETURNS geography + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_from_geometry'; + + +ALTER FUNCTION public.geography(geometry) OWNER TO postgres; + +-- +-- TOC entry 168 (class 1255 OID 18521) +-- Dependencies: 6 1099 1099 +-- Name: geography(geography, integer, boolean); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography(geography, integer, boolean) RETURNS geography + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_enforce_typmod'; + + +ALTER FUNCTION public.geography(geography, integer, boolean) OWNER TO postgres; + +-- +-- TOC entry 170 (class 1255 OID 18523) +-- Dependencies: 6 1099 1099 +-- Name: geography_cmp(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_cmp(geography, geography) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_cmp'; + + +ALTER FUNCTION public.geography_cmp(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 171 (class 1255 OID 18524) +-- Dependencies: 6 1099 1099 +-- Name: geography_eq(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_eq(geography, geography) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_eq'; + + +ALTER FUNCTION public.geography_eq(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 172 (class 1255 OID 18525) +-- Dependencies: 6 1099 1099 +-- Name: geography_ge(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_ge(geography, geography) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_ge'; + + +ALTER FUNCTION public.geography_ge(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 173 (class 1255 OID 18526) +-- Dependencies: 6 +-- Name: geography_gist_compress(internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gist_compress(internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'geography_gist_compress'; + + +ALTER FUNCTION public.geography_gist_compress(internal) OWNER TO postgres; + +-- +-- TOC entry 174 (class 1255 OID 18527) +-- Dependencies: 6 1102 +-- Name: geography_gist_consistent(internal, geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gist_consistent(internal, geometry, integer) RETURNS boolean + LANGUAGE c + AS '$libdir/postgis-1.5', 'geography_gist_consistent'; + + +ALTER FUNCTION public.geography_gist_consistent(internal, geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 175 (class 1255 OID 18528) +-- Dependencies: 6 +-- Name: geography_gist_decompress(internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gist_decompress(internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'geography_gist_decompress'; + + +ALTER FUNCTION public.geography_gist_decompress(internal) OWNER TO postgres; + +-- +-- TOC entry 176 (class 1255 OID 18529) +-- Dependencies: 6 +-- Name: geography_gist_join_selectivity(internal, oid, internal, smallint); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gist_join_selectivity(internal, oid, internal, smallint) RETURNS double precision + LANGUAGE c + AS '$libdir/postgis-1.5', 'geography_gist_join_selectivity'; + + +ALTER FUNCTION public.geography_gist_join_selectivity(internal, oid, internal, smallint) OWNER TO postgres; + +-- +-- TOC entry 177 (class 1255 OID 18530) +-- Dependencies: 6 +-- Name: geography_gist_penalty(internal, internal, internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gist_penalty(internal, internal, internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'geography_gist_penalty'; + + +ALTER FUNCTION public.geography_gist_penalty(internal, internal, internal) OWNER TO postgres; + +-- +-- TOC entry 178 (class 1255 OID 18531) +-- Dependencies: 6 +-- Name: geography_gist_picksplit(internal, internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gist_picksplit(internal, internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'geography_gist_picksplit'; + + +ALTER FUNCTION public.geography_gist_picksplit(internal, internal) OWNER TO postgres; + +-- +-- TOC entry 179 (class 1255 OID 18532) +-- Dependencies: 6 1087 1087 +-- Name: geography_gist_same(box2d, box2d, internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gist_same(box2d, box2d, internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'geography_gist_same'; + + +ALTER FUNCTION public.geography_gist_same(box2d, box2d, internal) OWNER TO postgres; + +-- +-- TOC entry 180 (class 1255 OID 18533) +-- Dependencies: 6 +-- Name: geography_gist_selectivity(internal, oid, internal, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gist_selectivity(internal, oid, internal, integer) RETURNS double precision + LANGUAGE c + AS '$libdir/postgis-1.5', 'geography_gist_selectivity'; + + +ALTER FUNCTION public.geography_gist_selectivity(internal, oid, internal, integer) OWNER TO postgres; + +-- +-- TOC entry 181 (class 1255 OID 18534) +-- Dependencies: 6 +-- Name: geography_gist_union(bytea, internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gist_union(bytea, internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'geography_gist_union'; + + +ALTER FUNCTION public.geography_gist_union(bytea, internal) OWNER TO postgres; + +-- +-- TOC entry 182 (class 1255 OID 18535) +-- Dependencies: 6 1099 1099 +-- Name: geography_gt(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_gt(geography, geography) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_gt'; + + +ALTER FUNCTION public.geography_gt(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 183 (class 1255 OID 18536) +-- Dependencies: 1099 1099 6 +-- Name: geography_le(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_le(geography, geography) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_le'; + + +ALTER FUNCTION public.geography_le(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 184 (class 1255 OID 18537) +-- Dependencies: 1099 1099 6 +-- Name: geography_lt(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_lt(geography, geography) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_lt'; + + +ALTER FUNCTION public.geography_lt(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 185 (class 1255 OID 18538) +-- Dependencies: 1099 1099 6 +-- Name: geography_overlaps(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_overlaps(geography, geography) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_overlaps'; + + +ALTER FUNCTION public.geography_overlaps(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 186 (class 1255 OID 18539) +-- Dependencies: 6 +-- Name: geography_typmod_dims(integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_typmod_dims(integer) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_typmod_dims'; + + +ALTER FUNCTION public.geography_typmod_dims(integer) OWNER TO postgres; + +-- +-- TOC entry 187 (class 1255 OID 18540) +-- Dependencies: 6 +-- Name: geography_typmod_srid(integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_typmod_srid(integer) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_typmod_srid'; + + +ALTER FUNCTION public.geography_typmod_srid(integer) OWNER TO postgres; + +-- +-- TOC entry 188 (class 1255 OID 18541) +-- Dependencies: 6 +-- Name: geography_typmod_type(integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geography_typmod_type(integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_typmod_type'; + + +ALTER FUNCTION public.geography_typmod_type(integer) OWNER TO postgres; + +-- +-- TOC entry 190 (class 1255 OID 18543) +-- Dependencies: 6 1102 +-- Name: geomcollfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomcollfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(GeomFromText($1)) = 'GEOMETRYCOLLECTION' + THEN GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.geomcollfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 189 (class 1255 OID 18542) +-- Dependencies: 6 1102 +-- Name: geomcollfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomcollfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(GeomFromText($1, $2)) = 'GEOMETRYCOLLECTION' + THEN GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.geomcollfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 192 (class 1255 OID 18545) +-- Dependencies: 6 1102 +-- Name: geomcollfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomcollfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(GeomFromWKB($1)) = 'GEOMETRYCOLLECTION' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.geomcollfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 191 (class 1255 OID 18544) +-- Dependencies: 6 1102 +-- Name: geomcollfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomcollfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(GeomFromWKB($1, $2)) = 'GEOMETRYCOLLECTION' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.geomcollfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 193 (class 1255 OID 18546) +-- Dependencies: 6 1093 1102 +-- Name: geometry(box3d_extent); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry(box3d_extent) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_LWGEOM'; + + +ALTER FUNCTION public.geometry(box3d_extent) OWNER TO postgres; + +-- +-- TOC entry 194 (class 1255 OID 18547) +-- Dependencies: 6 1102 1087 +-- Name: geometry(box2d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry(box2d) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_to_LWGEOM'; + + +ALTER FUNCTION public.geometry(box2d) OWNER TO postgres; + +-- +-- TOC entry 195 (class 1255 OID 18548) +-- Dependencies: 6 1102 1090 +-- Name: geometry(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry(box3d) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_LWGEOM'; + + +ALTER FUNCTION public.geometry(box3d) OWNER TO postgres; + +-- +-- TOC entry 196 (class 1255 OID 18549) +-- Dependencies: 6 1102 +-- Name: geometry(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'parse_WKT_lwgeom'; + + +ALTER FUNCTION public.geometry(text) OWNER TO postgres; + +-- +-- TOC entry 197 (class 1255 OID 18550) +-- Dependencies: 6 1102 1096 +-- Name: geometry(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry(chip) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_to_LWGEOM'; + + +ALTER FUNCTION public.geometry(chip) OWNER TO postgres; + +-- +-- TOC entry 198 (class 1255 OID 18551) +-- Dependencies: 6 1102 +-- Name: geometry(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry(bytea) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_bytea'; + + +ALTER FUNCTION public.geometry(bytea) OWNER TO postgres; + +-- +-- TOC entry 199 (class 1255 OID 18552) +-- Dependencies: 6 1102 1099 +-- Name: geometry(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry(geography) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geometry_from_geography'; + + +ALTER FUNCTION public.geometry(geography) OWNER TO postgres; + +-- +-- TOC entry 200 (class 1255 OID 18553) +-- Dependencies: 6 1102 1102 +-- Name: geometry_above(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_above(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_above'; + + +ALTER FUNCTION public.geometry_above(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 201 (class 1255 OID 18554) +-- Dependencies: 6 1102 1102 +-- Name: geometry_below(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_below(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_below'; + + +ALTER FUNCTION public.geometry_below(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 202 (class 1255 OID 18555) +-- Dependencies: 6 1102 1102 +-- Name: geometry_cmp(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_cmp(geometry, geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_cmp'; + + +ALTER FUNCTION public.geometry_cmp(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 203 (class 1255 OID 18556) +-- Dependencies: 6 1102 1102 +-- Name: geometry_contain(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_contain(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_contain'; + + +ALTER FUNCTION public.geometry_contain(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 204 (class 1255 OID 18557) +-- Dependencies: 1102 1102 6 +-- Name: geometry_contained(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_contained(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_contained'; + + +ALTER FUNCTION public.geometry_contained(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 205 (class 1255 OID 18558) +-- Dependencies: 1102 1102 6 +-- Name: geometry_eq(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_eq(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_eq'; + + +ALTER FUNCTION public.geometry_eq(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 206 (class 1255 OID 18559) +-- Dependencies: 6 1102 1102 +-- Name: geometry_ge(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_ge(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_ge'; + + +ALTER FUNCTION public.geometry_ge(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 207 (class 1255 OID 18560) +-- Dependencies: 6 +-- Name: geometry_gist_joinsel(internal, oid, internal, smallint); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_gist_joinsel(internal, oid, internal, smallint) RETURNS double precision + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_joinsel'; + + +ALTER FUNCTION public.geometry_gist_joinsel(internal, oid, internal, smallint) OWNER TO postgres; + +-- +-- TOC entry 208 (class 1255 OID 18561) +-- Dependencies: 6 +-- Name: geometry_gist_sel(internal, oid, internal, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_gist_sel(internal, oid, internal, integer) RETURNS double precision + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_sel'; + + +ALTER FUNCTION public.geometry_gist_sel(internal, oid, internal, integer) OWNER TO postgres; + +-- +-- TOC entry 209 (class 1255 OID 18562) +-- Dependencies: 1102 6 1102 +-- Name: geometry_gt(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_gt(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_gt'; + + +ALTER FUNCTION public.geometry_gt(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 210 (class 1255 OID 18563) +-- Dependencies: 6 1102 1102 +-- Name: geometry_le(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_le(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_le'; + + +ALTER FUNCTION public.geometry_le(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 211 (class 1255 OID 18564) +-- Dependencies: 1102 1102 6 +-- Name: geometry_left(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_left(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_left'; + + +ALTER FUNCTION public.geometry_left(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 212 (class 1255 OID 18565) +-- Dependencies: 6 1102 1102 +-- Name: geometry_lt(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_lt(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_lt'; + + +ALTER FUNCTION public.geometry_lt(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 213 (class 1255 OID 18566) +-- Dependencies: 1102 6 1102 +-- Name: geometry_overabove(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_overabove(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overabove'; + + +ALTER FUNCTION public.geometry_overabove(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 214 (class 1255 OID 18567) +-- Dependencies: 1102 1102 6 +-- Name: geometry_overbelow(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_overbelow(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overbelow'; + + +ALTER FUNCTION public.geometry_overbelow(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 215 (class 1255 OID 18568) +-- Dependencies: 6 1102 1102 +-- Name: geometry_overlap(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_overlap(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overlap'; + + +ALTER FUNCTION public.geometry_overlap(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 216 (class 1255 OID 18569) +-- Dependencies: 1102 6 1102 +-- Name: geometry_overleft(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_overleft(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overleft'; + + +ALTER FUNCTION public.geometry_overleft(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 217 (class 1255 OID 18570) +-- Dependencies: 1102 6 1102 +-- Name: geometry_overright(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_overright(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overright'; + + +ALTER FUNCTION public.geometry_overright(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 218 (class 1255 OID 18571) +-- Dependencies: 6 1102 1102 +-- Name: geometry_right(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_right(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_right'; + + +ALTER FUNCTION public.geometry_right(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 219 (class 1255 OID 18572) +-- Dependencies: 1102 6 1102 +-- Name: geometry_same(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_same(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_samebox'; + + +ALTER FUNCTION public.geometry_same(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 220 (class 1255 OID 18573) +-- Dependencies: 6 1102 1102 +-- Name: geometry_samebox(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometry_samebox(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_samebox'; + + +ALTER FUNCTION public.geometry_samebox(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 221 (class 1255 OID 18574) +-- Dependencies: 6 1102 +-- Name: geometryfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometryfromtext(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_text'; + + +ALTER FUNCTION public.geometryfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 222 (class 1255 OID 18575) +-- Dependencies: 6 1102 +-- Name: geometryfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometryfromtext(text, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_text'; + + +ALTER FUNCTION public.geometryfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 223 (class 1255 OID 18576) +-- Dependencies: 6 1102 1102 +-- Name: geometryn(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometryn(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_geometryn_collection'; + + +ALTER FUNCTION public.geometryn(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 224 (class 1255 OID 18577) +-- Dependencies: 6 1102 +-- Name: geometrytype(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geometrytype(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_getTYPE'; + + +ALTER FUNCTION public.geometrytype(geometry) OWNER TO postgres; + +-- +-- TOC entry 225 (class 1255 OID 18578) +-- Dependencies: 6 1102 +-- Name: geomfromewkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomfromewkb(bytea) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOMFromWKB'; + + +ALTER FUNCTION public.geomfromewkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 226 (class 1255 OID 18579) +-- Dependencies: 6 1102 +-- Name: geomfromewkt(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomfromewkt(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'parse_WKT_lwgeom'; + + +ALTER FUNCTION public.geomfromewkt(text) OWNER TO postgres; + +-- +-- TOC entry 227 (class 1255 OID 18580) +-- Dependencies: 6 1102 +-- Name: geomfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT geometryfromtext($1)$_$; + + +ALTER FUNCTION public.geomfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 228 (class 1255 OID 18581) +-- Dependencies: 6 1102 +-- Name: geomfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT geometryfromtext($1, $2)$_$; + + +ALTER FUNCTION public.geomfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 229 (class 1255 OID 18582) +-- Dependencies: 6 1102 +-- Name: geomfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomfromwkb(bytea) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_WKB'; + + +ALTER FUNCTION public.geomfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 230 (class 1255 OID 18583) +-- Dependencies: 6 1102 +-- Name: geomfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT setSRID(GeomFromWKB($1), $2)$_$; + + +ALTER FUNCTION public.geomfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 231 (class 1255 OID 18584) +-- Dependencies: 6 1102 1102 1102 +-- Name: geomunion(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION geomunion(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geomunion'; + + +ALTER FUNCTION public.geomunion(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 232 (class 1255 OID 18585) +-- Dependencies: 6 1170 +-- Name: get_proj4_from_srid(integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION get_proj4_from_srid(integer) RETURNS text + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +BEGIN + RETURN proj4text::text FROM spatial_ref_sys WHERE srid= $1; +END; +$_$; + + +ALTER FUNCTION public.get_proj4_from_srid(integer) OWNER TO postgres; + +-- +-- TOC entry 233 (class 1255 OID 18586) +-- Dependencies: 6 1087 1102 +-- Name: getbbox(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION getbbox(geometry) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_BOX2DFLOAT4'; + + +ALTER FUNCTION public.getbbox(geometry) OWNER TO postgres; + +-- +-- TOC entry 234 (class 1255 OID 18587) +-- Dependencies: 6 1102 +-- Name: getsrid(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION getsrid(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_getSRID'; + + +ALTER FUNCTION public.getsrid(geometry) OWNER TO postgres; + +-- +-- TOC entry 235 (class 1255 OID 18588) +-- Dependencies: 6 +-- Name: gettransactionid(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION gettransactionid() RETURNS xid + LANGUAGE c + AS '$libdir/postgis-1.5', 'getTransactionID'; + + +ALTER FUNCTION public.gettransactionid() OWNER TO postgres; + +-- +-- TOC entry 236 (class 1255 OID 18589) +-- Dependencies: 6 1102 +-- Name: hasbbox(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION hasbbox(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_hasBBOX'; + + +ALTER FUNCTION public.hasbbox(geometry) OWNER TO postgres; + +-- +-- TOC entry 237 (class 1255 OID 18590) +-- Dependencies: 6 1096 +-- Name: height(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION height(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getHeight'; + + +ALTER FUNCTION public.height(chip) OWNER TO postgres; + +-- +-- TOC entry 238 (class 1255 OID 18591) +-- Dependencies: 6 1102 1102 +-- Name: interiorringn(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION interiorringn(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_interiorringn_polygon'; + + +ALTER FUNCTION public.interiorringn(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 239 (class 1255 OID 18592) +-- Dependencies: 6 1102 1102 1102 +-- Name: intersection(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION intersection(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'intersection'; + + +ALTER FUNCTION public.intersection(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 240 (class 1255 OID 18593) +-- Dependencies: 6 1102 1102 +-- Name: intersects(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION intersects(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'intersects'; + + +ALTER FUNCTION public.intersects(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 241 (class 1255 OID 18594) +-- Dependencies: 6 1102 +-- Name: isclosed(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION isclosed(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_isclosed_linestring'; + + +ALTER FUNCTION public.isclosed(geometry) OWNER TO postgres; + +-- +-- TOC entry 242 (class 1255 OID 18595) +-- Dependencies: 6 1102 +-- Name: isempty(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION isempty(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_isempty'; + + +ALTER FUNCTION public.isempty(geometry) OWNER TO postgres; + +-- +-- TOC entry 243 (class 1255 OID 18596) +-- Dependencies: 6 1102 +-- Name: isring(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION isring(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'isring'; + + +ALTER FUNCTION public.isring(geometry) OWNER TO postgres; + +-- +-- TOC entry 244 (class 1255 OID 18597) +-- Dependencies: 6 1102 +-- Name: issimple(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION issimple(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'issimple'; + + +ALTER FUNCTION public.issimple(geometry) OWNER TO postgres; + +-- +-- TOC entry 245 (class 1255 OID 18598) +-- Dependencies: 6 1102 +-- Name: isvalid(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION isvalid(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'isvalid'; + + +ALTER FUNCTION public.isvalid(geometry) OWNER TO postgres; + +-- +-- TOC entry 246 (class 1255 OID 18599) +-- Dependencies: 6 1102 +-- Name: length(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION length(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_length_linestring'; + + +ALTER FUNCTION public.length(geometry) OWNER TO postgres; + +-- +-- TOC entry 247 (class 1255 OID 18600) +-- Dependencies: 6 1102 +-- Name: length2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION length2d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_length2d_linestring'; + + +ALTER FUNCTION public.length2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 248 (class 1255 OID 18601) +-- Dependencies: 6 1102 1113 +-- Name: length2d_spheroid(geometry, spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION length2d_spheroid(geometry, spheroid) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_length2d_ellipsoid'; + + +ALTER FUNCTION public.length2d_spheroid(geometry, spheroid) OWNER TO postgres; + +-- +-- TOC entry 249 (class 1255 OID 18602) +-- Dependencies: 6 1102 +-- Name: length3d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION length3d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_length_linestring'; + + +ALTER FUNCTION public.length3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 250 (class 1255 OID 18603) +-- Dependencies: 6 1102 1113 +-- Name: length3d_spheroid(geometry, spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION length3d_spheroid(geometry, spheroid) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_length_ellipsoid_linestring'; + + +ALTER FUNCTION public.length3d_spheroid(geometry, spheroid) OWNER TO postgres; + +-- +-- TOC entry 251 (class 1255 OID 18604) +-- Dependencies: 6 1102 1113 +-- Name: length_spheroid(geometry, spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION length_spheroid(geometry, spheroid) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_length_ellipsoid_linestring'; + + +ALTER FUNCTION public.length_spheroid(geometry, spheroid) OWNER TO postgres; + +-- +-- TOC entry 252 (class 1255 OID 18605) +-- Dependencies: 6 1102 1102 +-- Name: line_interpolate_point(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION line_interpolate_point(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_line_interpolate_point'; + + +ALTER FUNCTION public.line_interpolate_point(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 253 (class 1255 OID 18606) +-- Dependencies: 6 1102 1102 +-- Name: line_locate_point(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION line_locate_point(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_line_locate_point'; + + +ALTER FUNCTION public.line_locate_point(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 254 (class 1255 OID 18607) +-- Dependencies: 6 1102 1102 +-- Name: line_substring(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION line_substring(geometry, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_line_substring'; + + +ALTER FUNCTION public.line_substring(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 255 (class 1255 OID 18608) +-- Dependencies: 6 1102 1102 +-- Name: linefrommultipoint(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linefrommultipoint(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_line_from_mpoint'; + + +ALTER FUNCTION public.linefrommultipoint(geometry) OWNER TO postgres; + +-- +-- TOC entry 256 (class 1255 OID 18609) +-- Dependencies: 6 1102 +-- Name: linefromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linefromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1)) = 'LINESTRING' + THEN GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.linefromtext(text) OWNER TO postgres; + +-- +-- TOC entry 257 (class 1255 OID 18610) +-- Dependencies: 6 1102 +-- Name: linefromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linefromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = 'LINESTRING' + THEN GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.linefromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 259 (class 1255 OID 18612) +-- Dependencies: 6 1102 +-- Name: linefromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linefromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'LINESTRING' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.linefromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 258 (class 1255 OID 18611) +-- Dependencies: 6 1102 +-- Name: linefromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linefromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = 'LINESTRING' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.linefromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 260 (class 1255 OID 18613) +-- Dependencies: 6 1102 1102 +-- Name: linemerge(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linemerge(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'linemerge'; + + +ALTER FUNCTION public.linemerge(geometry) OWNER TO postgres; + +-- +-- TOC entry 261 (class 1255 OID 18614) +-- Dependencies: 1102 6 +-- Name: linestringfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linestringfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT LineFromText($1)$_$; + + +ALTER FUNCTION public.linestringfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 262 (class 1255 OID 18615) +-- Dependencies: 6 1102 +-- Name: linestringfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linestringfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT LineFromText($1, $2)$_$; + + +ALTER FUNCTION public.linestringfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 264 (class 1255 OID 18617) +-- Dependencies: 1102 6 +-- Name: linestringfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linestringfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'LINESTRING' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.linestringfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 263 (class 1255 OID 18616) +-- Dependencies: 1102 6 +-- Name: linestringfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION linestringfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = 'LINESTRING' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.linestringfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 265 (class 1255 OID 18618) +-- Dependencies: 1102 6 1102 +-- Name: locate_along_measure(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION locate_along_measure(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT locate_between_measures($1, $2, $2) $_$; + + +ALTER FUNCTION public.locate_along_measure(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 266 (class 1255 OID 18619) +-- Dependencies: 6 1102 1102 +-- Name: locate_between_measures(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION locate_between_measures(geometry, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_locate_between_m'; + + +ALTER FUNCTION public.locate_between_measures(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 269 (class 1255 OID 18622) +-- Dependencies: 6 +-- Name: lockrow(text, text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lockrow(text, text, text) RETURNS integer + LANGUAGE sql STRICT + AS $_$ SELECT LockRow(current_schema(), $1, $2, $3, now()::timestamp+'1:00'); $_$; + + +ALTER FUNCTION public.lockrow(text, text, text) OWNER TO postgres; + +-- +-- TOC entry 268 (class 1255 OID 18621) +-- Dependencies: 6 +-- Name: lockrow(text, text, text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lockrow(text, text, text, text) RETURNS integer + LANGUAGE sql STRICT + AS $_$ SELECT LockRow($1, $2, $3, $4, now()::timestamp+'1:00'); $_$; + + +ALTER FUNCTION public.lockrow(text, text, text, text) OWNER TO postgres; + +-- +-- TOC entry 270 (class 1255 OID 18623) +-- Dependencies: 6 +-- Name: lockrow(text, text, text, timestamp without time zone); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lockrow(text, text, text, timestamp without time zone) RETURNS integer + LANGUAGE sql STRICT + AS $_$ SELECT LockRow(current_schema(), $1, $2, $3, $4); $_$; + + +ALTER FUNCTION public.lockrow(text, text, text, timestamp without time zone) OWNER TO postgres; + +-- +-- TOC entry 267 (class 1255 OID 18620) +-- Dependencies: 6 1170 +-- Name: lockrow(text, text, text, text, timestamp without time zone); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lockrow(text, text, text, text, timestamp without time zone) RETURNS integer + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + myschema alias for $1; + mytable alias for $2; + myrid alias for $3; + authid alias for $4; + expires alias for $5; + ret int; + mytoid oid; + myrec RECORD; + +BEGIN + + IF NOT LongTransactionsEnabled() THEN + RAISE EXCEPTION 'Long transaction support disabled, use EnableLongTransaction() to enable.'; + END IF; + + EXECUTE 'DELETE FROM authorization_table WHERE expires < now()'; + + SELECT c.oid INTO mytoid FROM pg_class c, pg_namespace n + WHERE c.relname = mytable + AND c.relnamespace = n.oid + AND n.nspname = myschema; + + -- RAISE NOTICE 'toid: %', mytoid; + + FOR myrec IN SELECT * FROM authorization_table WHERE + toid = mytoid AND rid = myrid + LOOP + IF myrec.authid != authid THEN + RETURN 0; + ELSE + RETURN 1; + END IF; + END LOOP; + + EXECUTE 'INSERT INTO authorization_table VALUES ('|| + quote_literal(mytoid::text)||','||quote_literal(myrid)|| + ','||quote_literal(expires::text)|| + ','||quote_literal(authid) ||')'; + + GET DIAGNOSTICS ret = ROW_COUNT; + + RETURN ret; +END; +$_$; + + +ALTER FUNCTION public.lockrow(text, text, text, text, timestamp without time zone) OWNER TO postgres; + +-- +-- TOC entry 271 (class 1255 OID 18624) +-- Dependencies: 1170 6 +-- Name: longtransactionsenabled(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION longtransactionsenabled() RETURNS boolean + LANGUAGE plpgsql + AS $$ +DECLARE + rec RECORD; +BEGIN + FOR rec IN SELECT oid FROM pg_class WHERE relname = 'authorized_tables' + LOOP + return 't'; + END LOOP; + return 'f'; +END; +$$; + + +ALTER FUNCTION public.longtransactionsenabled() OWNER TO postgres; + +-- +-- TOC entry 272 (class 1255 OID 18625) +-- Dependencies: 6 +-- Name: lwgeom_gist_compress(internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lwgeom_gist_compress(internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_compress'; + + +ALTER FUNCTION public.lwgeom_gist_compress(internal) OWNER TO postgres; + +-- +-- TOC entry 273 (class 1255 OID 18626) +-- Dependencies: 6 1102 +-- Name: lwgeom_gist_consistent(internal, geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lwgeom_gist_consistent(internal, geometry, integer) RETURNS boolean + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_consistent'; + + +ALTER FUNCTION public.lwgeom_gist_consistent(internal, geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 274 (class 1255 OID 18627) +-- Dependencies: 6 +-- Name: lwgeom_gist_decompress(internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lwgeom_gist_decompress(internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_decompress'; + + +ALTER FUNCTION public.lwgeom_gist_decompress(internal) OWNER TO postgres; + +-- +-- TOC entry 275 (class 1255 OID 18628) +-- Dependencies: 6 +-- Name: lwgeom_gist_penalty(internal, internal, internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lwgeom_gist_penalty(internal, internal, internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_penalty'; + + +ALTER FUNCTION public.lwgeom_gist_penalty(internal, internal, internal) OWNER TO postgres; + +-- +-- TOC entry 276 (class 1255 OID 18629) +-- Dependencies: 6 +-- Name: lwgeom_gist_picksplit(internal, internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lwgeom_gist_picksplit(internal, internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_picksplit'; + + +ALTER FUNCTION public.lwgeom_gist_picksplit(internal, internal) OWNER TO postgres; + +-- +-- TOC entry 277 (class 1255 OID 18630) +-- Dependencies: 6 1087 1087 +-- Name: lwgeom_gist_same(box2d, box2d, internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lwgeom_gist_same(box2d, box2d, internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_same'; + + +ALTER FUNCTION public.lwgeom_gist_same(box2d, box2d, internal) OWNER TO postgres; + +-- +-- TOC entry 278 (class 1255 OID 18631) +-- Dependencies: 6 +-- Name: lwgeom_gist_union(bytea, internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION lwgeom_gist_union(bytea, internal) RETURNS internal + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_union'; + + +ALTER FUNCTION public.lwgeom_gist_union(bytea, internal) OWNER TO postgres; + +-- +-- TOC entry 279 (class 1255 OID 18632) +-- Dependencies: 6 1102 +-- Name: m(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION m(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_m_point'; + + +ALTER FUNCTION public.m(geometry) OWNER TO postgres; + +-- +-- TOC entry 280 (class 1255 OID 18633) +-- Dependencies: 6 1102 1102 1087 +-- Name: makebox2d(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makebox2d(geometry, geometry) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_construct'; + + +ALTER FUNCTION public.makebox2d(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 281 (class 1255 OID 18634) +-- Dependencies: 1090 1102 6 1102 +-- Name: makebox3d(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makebox3d(geometry, geometry) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_construct'; + + +ALTER FUNCTION public.makebox3d(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 282 (class 1255 OID 18635) +-- Dependencies: 1102 6 1102 1102 +-- Name: makeline(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makeline(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makeline'; + + +ALTER FUNCTION public.makeline(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 283 (class 1255 OID 18636) +-- Dependencies: 1102 6 1104 +-- Name: makeline_garray(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makeline_garray(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makeline_garray'; + + +ALTER FUNCTION public.makeline_garray(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 284 (class 1255 OID 18637) +-- Dependencies: 1102 6 +-- Name: makepoint(double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makepoint(double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'; + + +ALTER FUNCTION public.makepoint(double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 285 (class 1255 OID 18638) +-- Dependencies: 6 1102 +-- Name: makepoint(double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makepoint(double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'; + + +ALTER FUNCTION public.makepoint(double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 286 (class 1255 OID 18639) +-- Dependencies: 6 1102 +-- Name: makepoint(double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makepoint(double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'; + + +ALTER FUNCTION public.makepoint(double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 287 (class 1255 OID 18640) +-- Dependencies: 1102 6 +-- Name: makepointm(double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makepointm(double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint3dm'; + + +ALTER FUNCTION public.makepointm(double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 289 (class 1255 OID 18642) +-- Dependencies: 1102 6 1102 +-- Name: makepolygon(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makepolygon(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoly'; + + +ALTER FUNCTION public.makepolygon(geometry) OWNER TO postgres; + +-- +-- TOC entry 288 (class 1255 OID 18641) +-- Dependencies: 6 1104 1102 1102 +-- Name: makepolygon(geometry, geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION makepolygon(geometry, geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoly'; + + +ALTER FUNCTION public.makepolygon(geometry, geometry[]) OWNER TO postgres; + +-- +-- TOC entry 290 (class 1255 OID 18643) +-- Dependencies: 1102 6 1102 +-- Name: max_distance(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION max_distance(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_maxdistance2d_linestring'; + + +ALTER FUNCTION public.max_distance(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 291 (class 1255 OID 18644) +-- Dependencies: 6 1102 +-- Name: mem_size(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mem_size(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_mem_size'; + + +ALTER FUNCTION public.mem_size(geometry) OWNER TO postgres; + +-- +-- TOC entry 293 (class 1255 OID 18646) +-- Dependencies: 6 1102 +-- Name: mlinefromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mlinefromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1)) = 'MULTILINESTRING' + THEN GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mlinefromtext(text) OWNER TO postgres; + +-- +-- TOC entry 292 (class 1255 OID 18645) +-- Dependencies: 6 1102 +-- Name: mlinefromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mlinefromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(GeomFromText($1, $2)) = 'MULTILINESTRING' + THEN GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mlinefromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 295 (class 1255 OID 18648) +-- Dependencies: 1102 6 +-- Name: mlinefromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mlinefromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'MULTILINESTRING' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mlinefromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 294 (class 1255 OID 18647) +-- Dependencies: 6 1102 +-- Name: mlinefromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mlinefromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = 'MULTILINESTRING' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mlinefromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 297 (class 1255 OID 18650) +-- Dependencies: 6 1102 +-- Name: mpointfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mpointfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1)) = 'MULTIPOINT' + THEN GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mpointfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 296 (class 1255 OID 18649) +-- Dependencies: 6 1102 +-- Name: mpointfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mpointfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1,$2)) = 'MULTIPOINT' + THEN GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mpointfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 299 (class 1255 OID 18652) +-- Dependencies: 1102 6 +-- Name: mpointfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mpointfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'MULTIPOINT' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mpointfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 298 (class 1255 OID 18651) +-- Dependencies: 1102 6 +-- Name: mpointfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mpointfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1,$2)) = 'MULTIPOINT' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mpointfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 301 (class 1255 OID 18654) +-- Dependencies: 6 1102 +-- Name: mpolyfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mpolyfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1)) = 'MULTIPOLYGON' + THEN GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mpolyfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 300 (class 1255 OID 18653) +-- Dependencies: 6 1102 +-- Name: mpolyfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mpolyfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = 'MULTIPOLYGON' + THEN GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mpolyfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 303 (class 1255 OID 18656) +-- Dependencies: 1102 6 +-- Name: mpolyfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mpolyfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'MULTIPOLYGON' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mpolyfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 302 (class 1255 OID 18655) +-- Dependencies: 6 1102 +-- Name: mpolyfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION mpolyfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = 'MULTIPOLYGON' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.mpolyfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 304 (class 1255 OID 18657) +-- Dependencies: 6 1102 1102 +-- Name: multi(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multi(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_multi'; + + +ALTER FUNCTION public.multi(geometry) OWNER TO postgres; + +-- +-- TOC entry 306 (class 1255 OID 18659) +-- Dependencies: 6 1102 +-- Name: multilinefromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multilinefromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'MULTILINESTRING' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.multilinefromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 305 (class 1255 OID 18658) +-- Dependencies: 6 1102 +-- Name: multilinefromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multilinefromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = 'MULTILINESTRING' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.multilinefromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 307 (class 1255 OID 18660) +-- Dependencies: 6 1102 +-- Name: multilinestringfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multilinestringfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_MLineFromText($1)$_$; + + +ALTER FUNCTION public.multilinestringfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 308 (class 1255 OID 18661) +-- Dependencies: 6 1102 +-- Name: multilinestringfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multilinestringfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT MLineFromText($1, $2)$_$; + + +ALTER FUNCTION public.multilinestringfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 310 (class 1255 OID 18663) +-- Dependencies: 6 1102 +-- Name: multipointfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multipointfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT MPointFromText($1)$_$; + + +ALTER FUNCTION public.multipointfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 309 (class 1255 OID 18662) +-- Dependencies: 1102 6 +-- Name: multipointfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multipointfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT MPointFromText($1, $2)$_$; + + +ALTER FUNCTION public.multipointfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 312 (class 1255 OID 18665) +-- Dependencies: 6 1102 +-- Name: multipointfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multipointfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'MULTIPOINT' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.multipointfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 311 (class 1255 OID 18664) +-- Dependencies: 6 1102 +-- Name: multipointfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multipointfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1,$2)) = 'MULTIPOINT' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.multipointfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 314 (class 1255 OID 18667) +-- Dependencies: 6 1102 +-- Name: multipolyfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multipolyfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'MULTIPOLYGON' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.multipolyfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 313 (class 1255 OID 18666) +-- Dependencies: 1102 6 +-- Name: multipolyfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multipolyfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = 'MULTIPOLYGON' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.multipolyfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 316 (class 1255 OID 18669) +-- Dependencies: 1102 6 +-- Name: multipolygonfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multipolygonfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT MPolyFromText($1)$_$; + + +ALTER FUNCTION public.multipolygonfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 315 (class 1255 OID 18668) +-- Dependencies: 1102 6 +-- Name: multipolygonfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION multipolygonfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT MPolyFromText($1, $2)$_$; + + +ALTER FUNCTION public.multipolygonfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 317 (class 1255 OID 18670) +-- Dependencies: 6 1102 +-- Name: ndims(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION ndims(geometry) RETURNS smallint + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_ndims'; + + +ALTER FUNCTION public.ndims(geometry) OWNER TO postgres; + +-- +-- TOC entry 318 (class 1255 OID 18671) +-- Dependencies: 1102 6 1102 +-- Name: noop(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION noop(geometry) RETURNS geometry + LANGUAGE c STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_noop'; + + +ALTER FUNCTION public.noop(geometry) OWNER TO postgres; + +-- +-- TOC entry 319 (class 1255 OID 18672) +-- Dependencies: 1102 6 +-- Name: npoints(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION npoints(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_npoints'; + + +ALTER FUNCTION public.npoints(geometry) OWNER TO postgres; + +-- +-- TOC entry 320 (class 1255 OID 18673) +-- Dependencies: 6 1102 +-- Name: nrings(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION nrings(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_nrings'; + + +ALTER FUNCTION public.nrings(geometry) OWNER TO postgres; + +-- +-- TOC entry 321 (class 1255 OID 18674) +-- Dependencies: 1102 6 +-- Name: numgeometries(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION numgeometries(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_numgeometries_collection'; + + +ALTER FUNCTION public.numgeometries(geometry) OWNER TO postgres; + +-- +-- TOC entry 322 (class 1255 OID 18675) +-- Dependencies: 6 1102 +-- Name: numinteriorring(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION numinteriorring(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_numinteriorrings_polygon'; + + +ALTER FUNCTION public.numinteriorring(geometry) OWNER TO postgres; + +-- +-- TOC entry 323 (class 1255 OID 18676) +-- Dependencies: 1102 6 +-- Name: numinteriorrings(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION numinteriorrings(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_numinteriorrings_polygon'; + + +ALTER FUNCTION public.numinteriorrings(geometry) OWNER TO postgres; + +-- +-- TOC entry 324 (class 1255 OID 18677) +-- Dependencies: 1102 6 +-- Name: numpoints(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION numpoints(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_numpoints_linestring'; + + +ALTER FUNCTION public.numpoints(geometry) OWNER TO postgres; + +-- +-- TOC entry 325 (class 1255 OID 18678) +-- Dependencies: 6 1102 1102 +-- Name: overlaps(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION "overlaps"(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'overlaps'; + + +ALTER FUNCTION public."overlaps"(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 326 (class 1255 OID 18679) +-- Dependencies: 6 1102 +-- Name: perimeter(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION perimeter(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter_poly'; + + +ALTER FUNCTION public.perimeter(geometry) OWNER TO postgres; + +-- +-- TOC entry 327 (class 1255 OID 18680) +-- Dependencies: 6 1102 +-- Name: perimeter2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION perimeter2d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter2d_poly'; + + +ALTER FUNCTION public.perimeter2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 328 (class 1255 OID 18681) +-- Dependencies: 1102 6 +-- Name: perimeter3d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION perimeter3d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter_poly'; + + +ALTER FUNCTION public.perimeter3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 329 (class 1255 OID 18682) +-- Dependencies: 1104 6 1110 +-- Name: pgis_geometry_accum_finalfn(pgis_abs); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pgis_geometry_accum_finalfn(pgis_abs) RETURNS geometry[] + LANGUAGE c + AS '$libdir/postgis-1.5', 'pgis_geometry_accum_finalfn'; + + +ALTER FUNCTION public.pgis_geometry_accum_finalfn(pgis_abs) OWNER TO postgres; + +-- +-- TOC entry 330 (class 1255 OID 18683) +-- Dependencies: 6 1110 1110 1102 +-- Name: pgis_geometry_accum_transfn(pgis_abs, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pgis_geometry_accum_transfn(pgis_abs, geometry) RETURNS pgis_abs + LANGUAGE c + AS '$libdir/postgis-1.5', 'pgis_geometry_accum_transfn'; + + +ALTER FUNCTION public.pgis_geometry_accum_transfn(pgis_abs, geometry) OWNER TO postgres; + +-- +-- TOC entry 331 (class 1255 OID 18684) +-- Dependencies: 1102 6 1110 +-- Name: pgis_geometry_collect_finalfn(pgis_abs); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pgis_geometry_collect_finalfn(pgis_abs) RETURNS geometry + LANGUAGE c + AS '$libdir/postgis-1.5', 'pgis_geometry_collect_finalfn'; + + +ALTER FUNCTION public.pgis_geometry_collect_finalfn(pgis_abs) OWNER TO postgres; + +-- +-- TOC entry 332 (class 1255 OID 18685) +-- Dependencies: 6 1102 1110 +-- Name: pgis_geometry_makeline_finalfn(pgis_abs); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pgis_geometry_makeline_finalfn(pgis_abs) RETURNS geometry + LANGUAGE c + AS '$libdir/postgis-1.5', 'pgis_geometry_makeline_finalfn'; + + +ALTER FUNCTION public.pgis_geometry_makeline_finalfn(pgis_abs) OWNER TO postgres; + +-- +-- TOC entry 333 (class 1255 OID 18686) +-- Dependencies: 1110 6 1102 +-- Name: pgis_geometry_polygonize_finalfn(pgis_abs); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pgis_geometry_polygonize_finalfn(pgis_abs) RETURNS geometry + LANGUAGE c + AS '$libdir/postgis-1.5', 'pgis_geometry_polygonize_finalfn'; + + +ALTER FUNCTION public.pgis_geometry_polygonize_finalfn(pgis_abs) OWNER TO postgres; + +-- +-- TOC entry 334 (class 1255 OID 18687) +-- Dependencies: 1102 6 1110 +-- Name: pgis_geometry_union_finalfn(pgis_abs); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pgis_geometry_union_finalfn(pgis_abs) RETURNS geometry + LANGUAGE c + AS '$libdir/postgis-1.5', 'pgis_geometry_union_finalfn'; + + +ALTER FUNCTION public.pgis_geometry_union_finalfn(pgis_abs) OWNER TO postgres; + +-- +-- TOC entry 335 (class 1255 OID 18688) +-- Dependencies: 6 1102 +-- Name: point_inside_circle(geometry, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION point_inside_circle(geometry, double precision, double precision, double precision) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_inside_circle_point'; + + +ALTER FUNCTION public.point_inside_circle(geometry, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 336 (class 1255 OID 18689) +-- Dependencies: 1102 6 +-- Name: pointfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pointfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1)) = 'POINT' + THEN GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.pointfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 337 (class 1255 OID 18690) +-- Dependencies: 6 1102 +-- Name: pointfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pointfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = 'POINT' + THEN GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.pointfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 339 (class 1255 OID 18692) +-- Dependencies: 1102 6 +-- Name: pointfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pointfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'POINT' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.pointfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 338 (class 1255 OID 18691) +-- Dependencies: 6 1102 +-- Name: pointfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pointfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = 'POINT' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.pointfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 340 (class 1255 OID 18693) +-- Dependencies: 1102 6 1102 +-- Name: pointn(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pointn(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_pointn_linestring'; + + +ALTER FUNCTION public.pointn(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 341 (class 1255 OID 18694) +-- Dependencies: 1102 6 1102 +-- Name: pointonsurface(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION pointonsurface(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'pointonsurface'; + + +ALTER FUNCTION public.pointonsurface(geometry) OWNER TO postgres; + +-- +-- TOC entry 342 (class 1255 OID 18695) +-- Dependencies: 6 1102 +-- Name: polyfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION polyfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1)) = 'POLYGON' + THEN GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.polyfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 343 (class 1255 OID 18696) +-- Dependencies: 6 1102 +-- Name: polyfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION polyfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = 'POLYGON' + THEN GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.polyfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 345 (class 1255 OID 18698) +-- Dependencies: 1102 6 +-- Name: polyfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION polyfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'POLYGON' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.polyfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 344 (class 1255 OID 18697) +-- Dependencies: 1102 6 +-- Name: polyfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION polyfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = 'POLYGON' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.polyfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 347 (class 1255 OID 18700) +-- Dependencies: 6 1102 +-- Name: polygonfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION polygonfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT PolyFromText($1)$_$; + + +ALTER FUNCTION public.polygonfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 346 (class 1255 OID 18699) +-- Dependencies: 6 1102 +-- Name: polygonfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION polygonfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT PolyFromText($1, $2)$_$; + + +ALTER FUNCTION public.polygonfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 349 (class 1255 OID 18702) +-- Dependencies: 6 1102 +-- Name: polygonfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION polygonfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'POLYGON' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.polygonfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 348 (class 1255 OID 18701) +-- Dependencies: 1102 6 +-- Name: polygonfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION polygonfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1,$2)) = 'POLYGON' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.polygonfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 350 (class 1255 OID 18703) +-- Dependencies: 1104 1102 6 +-- Name: polygonize_garray(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION polygonize_garray(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'polygonize_garray'; + + +ALTER FUNCTION public.polygonize_garray(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 351 (class 1255 OID 18704) +-- Dependencies: 6 1170 +-- Name: populate_geometry_columns(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION populate_geometry_columns() RETURNS text + LANGUAGE plpgsql + AS $$ +DECLARE + inserted integer; + oldcount integer; + probed integer; + stale integer; + gcs RECORD; + gc RECORD; + gsrid integer; + gndims integer; + gtype text; + query text; + gc_is_valid boolean; + +BEGIN + SELECT count(*) INTO oldcount FROM geometry_columns; + inserted := 0; + + EXECUTE 'TRUNCATE geometry_columns'; + + -- Count the number of geometry columns in all tables and views + SELECT count(DISTINCT c.oid) INTO probed + FROM pg_class c, + pg_attribute a, + pg_type t, + pg_namespace n + WHERE (c.relkind = 'r' OR c.relkind = 'v') + AND t.typname = 'geometry' + AND a.attisdropped = false + AND a.atttypid = t.oid + AND a.attrelid = c.oid + AND c.relnamespace = n.oid + AND n.nspname NOT ILIKE 'pg_temp%'; + + -- Iterate through all non-dropped geometry columns + RAISE DEBUG 'Processing Tables.....'; + + FOR gcs IN + SELECT DISTINCT ON (c.oid) c.oid, n.nspname, c.relname + FROM pg_class c, + pg_attribute a, + pg_type t, + pg_namespace n + WHERE c.relkind = 'r' + AND t.typname = 'geometry' + AND a.attisdropped = false + AND a.atttypid = t.oid + AND a.attrelid = c.oid + AND c.relnamespace = n.oid + AND n.nspname NOT ILIKE 'pg_temp%' + LOOP + + inserted := inserted + populate_geometry_columns(gcs.oid); + END LOOP; + + -- Add views to geometry columns table + RAISE DEBUG 'Processing Views.....'; + FOR gcs IN + SELECT DISTINCT ON (c.oid) c.oid, n.nspname, c.relname + FROM pg_class c, + pg_attribute a, + pg_type t, + pg_namespace n + WHERE c.relkind = 'v' + AND t.typname = 'geometry' + AND a.attisdropped = false + AND a.atttypid = t.oid + AND a.attrelid = c.oid + AND c.relnamespace = n.oid + LOOP + + inserted := inserted + populate_geometry_columns(gcs.oid); + END LOOP; + + IF oldcount > inserted THEN + stale = oldcount-inserted; + ELSE + stale = 0; + END IF; + + RETURN 'probed:' ||probed|| ' inserted:'||inserted|| ' conflicts:'||probed-inserted|| ' deleted:'||stale; +END + +$$; + + +ALTER FUNCTION public.populate_geometry_columns() OWNER TO postgres; + +-- +-- TOC entry 352 (class 1255 OID 18705) +-- Dependencies: 1170 6 +-- Name: populate_geometry_columns(oid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION populate_geometry_columns(tbl_oid oid) RETURNS integer + LANGUAGE plpgsql + AS $$ +DECLARE + gcs RECORD; + gc RECORD; + gsrid integer; + gndims integer; + gtype text; + query text; + gc_is_valid boolean; + inserted integer; + +BEGIN + inserted := 0; + + -- Iterate through all geometry columns in this table + FOR gcs IN + SELECT n.nspname, c.relname, a.attname + FROM pg_class c, + pg_attribute a, + pg_type t, + pg_namespace n + WHERE c.relkind = 'r' + AND t.typname = 'geometry' + AND a.attisdropped = false + AND a.atttypid = t.oid + AND a.attrelid = c.oid + AND c.relnamespace = n.oid + AND n.nspname NOT ILIKE 'pg_temp%' + AND c.oid = tbl_oid + LOOP + + RAISE DEBUG 'Processing table %.%.%', gcs.nspname, gcs.relname, gcs.attname; + + DELETE FROM geometry_columns + WHERE f_table_schema = quote_ident(gcs.nspname) + AND f_table_name = quote_ident(gcs.relname) + AND f_geometry_column = quote_ident(gcs.attname); + + gc_is_valid := true; + + -- Try to find srid check from system tables (pg_constraint) + gsrid := + (SELECT replace(replace(split_part(s.consrc, ' = ', 2), ')', ''), '(', '') + FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s + WHERE n.nspname = gcs.nspname + AND c.relname = gcs.relname + AND a.attname = gcs.attname + AND a.attrelid = c.oid + AND s.connamespace = n.oid + AND s.conrelid = c.oid + AND a.attnum = ANY (s.conkey) + AND s.consrc LIKE '%srid(% = %'); + IF (gsrid IS NULL) THEN + -- Try to find srid from the geometry itself + EXECUTE 'SELECT srid(' || quote_ident(gcs.attname) || ') + FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1' + INTO gc; + gsrid := gc.srid; + + -- Try to apply srid check to column + IF (gsrid IS NOT NULL) THEN + BEGIN + EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' + ADD CONSTRAINT ' || quote_ident('enforce_srid_' || gcs.attname) || ' + CHECK (srid(' || quote_ident(gcs.attname) || ') = ' || gsrid || ')'; + EXCEPTION + WHEN check_violation THEN + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not apply constraint CHECK (srid(%) = %)', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), quote_ident(gcs.attname), gsrid; + gc_is_valid := false; + END; + END IF; + END IF; + + -- Try to find ndims check from system tables (pg_constraint) + gndims := + (SELECT replace(split_part(s.consrc, ' = ', 2), ')', '') + FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s + WHERE n.nspname = gcs.nspname + AND c.relname = gcs.relname + AND a.attname = gcs.attname + AND a.attrelid = c.oid + AND s.connamespace = n.oid + AND s.conrelid = c.oid + AND a.attnum = ANY (s.conkey) + AND s.consrc LIKE '%ndims(% = %'); + IF (gndims IS NULL) THEN + -- Try to find ndims from the geometry itself + EXECUTE 'SELECT ndims(' || quote_ident(gcs.attname) || ') + FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1' + INTO gc; + gndims := gc.ndims; + + -- Try to apply ndims check to column + IF (gndims IS NOT NULL) THEN + BEGIN + EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' + ADD CONSTRAINT ' || quote_ident('enforce_dims_' || gcs.attname) || ' + CHECK (ndims(' || quote_ident(gcs.attname) || ') = '||gndims||')'; + EXCEPTION + WHEN check_violation THEN + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not apply constraint CHECK (ndims(%) = %)', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname), quote_ident(gcs.attname), gndims; + gc_is_valid := false; + END; + END IF; + END IF; + + -- Try to find geotype check from system tables (pg_constraint) + gtype := + (SELECT replace(split_part(s.consrc, '''', 2), ')', '') + FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s + WHERE n.nspname = gcs.nspname + AND c.relname = gcs.relname + AND a.attname = gcs.attname + AND a.attrelid = c.oid + AND s.connamespace = n.oid + AND s.conrelid = c.oid + AND a.attnum = ANY (s.conkey) + AND s.consrc LIKE '%geometrytype(% = %'); + IF (gtype IS NULL) THEN + -- Try to find geotype from the geometry itself + EXECUTE 'SELECT geometrytype(' || quote_ident(gcs.attname) || ') + FROM ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1' + INTO gc; + gtype := gc.geometrytype; + --IF (gtype IS NULL) THEN + -- gtype := 'GEOMETRY'; + --END IF; + + -- Try to apply geometrytype check to column + IF (gtype IS NOT NULL) THEN + BEGIN + EXECUTE 'ALTER TABLE ONLY ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' + ADD CONSTRAINT ' || quote_ident('enforce_geotype_' || gcs.attname) || ' + CHECK ((geometrytype(' || quote_ident(gcs.attname) || ') = ' || quote_literal(gtype) || ') OR (' || quote_ident(gcs.attname) || ' IS NULL))'; + EXCEPTION + WHEN check_violation THEN + -- No geometry check can be applied. This column contains a number of geometry types. + RAISE WARNING 'Could not add geometry type check (%) to table column: %.%.%', gtype, quote_ident(gcs.nspname),quote_ident(gcs.relname),quote_ident(gcs.attname); + END; + END IF; + END IF; + + IF (gsrid IS NULL) THEN + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine the srid', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname); + ELSIF (gndims IS NULL) THEN + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine the number of dimensions', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname); + ELSIF (gtype IS NULL) THEN + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine the geometry type', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname); + ELSE + -- Only insert into geometry_columns if table constraints could be applied. + IF (gc_is_valid) THEN + INSERT INTO geometry_columns (f_table_catalog,f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, type) + VALUES ('', gcs.nspname, gcs.relname, gcs.attname, gndims, gsrid, gtype); + inserted := inserted + 1; + END IF; + END IF; + END LOOP; + + -- Add views to geometry columns table + FOR gcs IN + SELECT n.nspname, c.relname, a.attname + FROM pg_class c, + pg_attribute a, + pg_type t, + pg_namespace n + WHERE c.relkind = 'v' + AND t.typname = 'geometry' + AND a.attisdropped = false + AND a.atttypid = t.oid + AND a.attrelid = c.oid + AND c.relnamespace = n.oid + AND n.nspname NOT ILIKE 'pg_temp%' + AND c.oid = tbl_oid + LOOP + RAISE DEBUG 'Processing view %.%.%', gcs.nspname, gcs.relname, gcs.attname; + + EXECUTE 'SELECT ndims(' || quote_ident(gcs.attname) || ') + FROM ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1' + INTO gc; + gndims := gc.ndims; + + EXECUTE 'SELECT srid(' || quote_ident(gcs.attname) || ') + FROM ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1' + INTO gc; + gsrid := gc.srid; + + EXECUTE 'SELECT geometrytype(' || quote_ident(gcs.attname) || ') + FROM ' || quote_ident(gcs.nspname) || '.' || quote_ident(gcs.relname) || ' + WHERE ' || quote_ident(gcs.attname) || ' IS NOT NULL LIMIT 1' + INTO gc; + gtype := gc.geometrytype; + + IF (gndims IS NULL) THEN + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine ndims', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname); + ELSIF (gsrid IS NULL) THEN + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine srid', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname); + ELSIF (gtype IS NULL) THEN + RAISE WARNING 'Not inserting ''%'' in ''%.%'' into geometry_columns: could not determine gtype', quote_ident(gcs.attname), quote_ident(gcs.nspname), quote_ident(gcs.relname); + ELSE + query := 'INSERT INTO geometry_columns (f_table_catalog,f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, type) ' || + 'VALUES ('''', ' || quote_literal(gcs.nspname) || ',' || quote_literal(gcs.relname) || ',' || quote_literal(gcs.attname) || ',' || gndims || ',' || gsrid || ',' || quote_literal(gtype) || ')'; + EXECUTE query; + inserted := inserted + 1; + END IF; + END LOOP; + + RETURN inserted; +END + +$$; + + +ALTER FUNCTION public.populate_geometry_columns(tbl_oid oid) OWNER TO postgres; + +-- +-- TOC entry 353 (class 1255 OID 18707) +-- Dependencies: 1102 1102 6 +-- Name: postgis_addbbox(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_addbbox(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_addBBOX'; + + +ALTER FUNCTION public.postgis_addbbox(geometry) OWNER TO postgres; + +-- +-- TOC entry 354 (class 1255 OID 18708) +-- Dependencies: 6 +-- Name: postgis_cache_bbox(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_cache_bbox() RETURNS trigger + LANGUAGE c + AS '$libdir/postgis-1.5', 'cache_bbox'; + + +ALTER FUNCTION public.postgis_cache_bbox() OWNER TO postgres; + +-- +-- TOC entry 355 (class 1255 OID 18709) +-- Dependencies: 1102 6 1102 +-- Name: postgis_dropbbox(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_dropbbox(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_dropBBOX'; + + +ALTER FUNCTION public.postgis_dropbbox(geometry) OWNER TO postgres; + +-- +-- TOC entry 356 (class 1255 OID 18710) +-- Dependencies: 1170 6 +-- Name: postgis_full_version(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_full_version() RETURNS text + LANGUAGE plpgsql IMMUTABLE + AS $$ +DECLARE + libver text; + projver text; + geosver text; + libxmlver text; + usestats bool; + dbproc text; + relproc text; + fullver text; +BEGIN + SELECT postgis_lib_version() INTO libver; + SELECT postgis_proj_version() INTO projver; + SELECT postgis_geos_version() INTO geosver; + SELECT postgis_libxml_version() INTO libxmlver; + SELECT postgis_uses_stats() INTO usestats; + SELECT postgis_scripts_installed() INTO dbproc; + SELECT postgis_scripts_released() INTO relproc; + + fullver = 'POSTGIS="' || libver || '"'; + + IF geosver IS NOT NULL THEN + fullver = fullver || ' GEOS="' || geosver || '"'; + END IF; + + IF projver IS NOT NULL THEN + fullver = fullver || ' PROJ="' || projver || '"'; + END IF; + + IF libxmlver IS NOT NULL THEN + fullver = fullver || ' LIBXML="' || libxmlver || '"'; + END IF; + + IF usestats THEN + fullver = fullver || ' USE_STATS'; + END IF; + + -- fullver = fullver || ' DBPROC="' || dbproc || '"'; + -- fullver = fullver || ' RELPROC="' || relproc || '"'; + + IF dbproc != relproc THEN + fullver = fullver || ' (procs from ' || dbproc || ' need upgrade)'; + END IF; + + RETURN fullver; +END +$$; + + +ALTER FUNCTION public.postgis_full_version() OWNER TO postgres; + +-- +-- TOC entry 357 (class 1255 OID 18711) +-- Dependencies: 6 +-- Name: postgis_geos_version(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_geos_version() RETURNS text + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'postgis_geos_version'; + + +ALTER FUNCTION public.postgis_geos_version() OWNER TO postgres; + +-- +-- TOC entry 358 (class 1255 OID 18712) +-- Dependencies: 1087 6 1102 +-- Name: postgis_getbbox(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_getbbox(geometry) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_BOX2DFLOAT4'; + + +ALTER FUNCTION public.postgis_getbbox(geometry) OWNER TO postgres; + +-- +-- TOC entry 359 (class 1255 OID 18713) +-- Dependencies: 6 +-- Name: postgis_gist_joinsel(internal, oid, internal, smallint); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_gist_joinsel(internal, oid, internal, smallint) RETURNS double precision + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_joinsel'; + + +ALTER FUNCTION public.postgis_gist_joinsel(internal, oid, internal, smallint) OWNER TO postgres; + +-- +-- TOC entry 360 (class 1255 OID 18714) +-- Dependencies: 6 +-- Name: postgis_gist_sel(internal, oid, internal, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_gist_sel(internal, oid, internal, integer) RETURNS double precision + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_sel'; + + +ALTER FUNCTION public.postgis_gist_sel(internal, oid, internal, integer) OWNER TO postgres; + +-- +-- TOC entry 361 (class 1255 OID 18715) +-- Dependencies: 6 1102 +-- Name: postgis_hasbbox(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_hasbbox(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_hasBBOX'; + + +ALTER FUNCTION public.postgis_hasbbox(geometry) OWNER TO postgres; + +-- +-- TOC entry 362 (class 1255 OID 18716) +-- Dependencies: 6 +-- Name: postgis_lib_build_date(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_lib_build_date() RETURNS text + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'postgis_lib_build_date'; + + +ALTER FUNCTION public.postgis_lib_build_date() OWNER TO postgres; + +-- +-- TOC entry 363 (class 1255 OID 18717) +-- Dependencies: 6 +-- Name: postgis_lib_version(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_lib_version() RETURNS text + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'postgis_lib_version'; + + +ALTER FUNCTION public.postgis_lib_version() OWNER TO postgres; + +-- +-- TOC entry 364 (class 1255 OID 18718) +-- Dependencies: 6 +-- Name: postgis_libxml_version(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_libxml_version() RETURNS text + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'postgis_libxml_version'; + + +ALTER FUNCTION public.postgis_libxml_version() OWNER TO postgres; + +-- +-- TOC entry 365 (class 1255 OID 18719) +-- Dependencies: 1102 1102 6 +-- Name: postgis_noop(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_noop(geometry) RETURNS geometry + LANGUAGE c STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_noop'; + + +ALTER FUNCTION public.postgis_noop(geometry) OWNER TO postgres; + +-- +-- TOC entry 366 (class 1255 OID 18720) +-- Dependencies: 6 +-- Name: postgis_proj_version(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_proj_version() RETURNS text + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'postgis_proj_version'; + + +ALTER FUNCTION public.postgis_proj_version() OWNER TO postgres; + +-- +-- TOC entry 367 (class 1255 OID 18721) +-- Dependencies: 6 +-- Name: postgis_scripts_build_date(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_scripts_build_date() RETURNS text + LANGUAGE sql IMMUTABLE + AS $$SELECT '2010-03-11 19:15:17'::text AS version$$; + + +ALTER FUNCTION public.postgis_scripts_build_date() OWNER TO postgres; + +-- +-- TOC entry 368 (class 1255 OID 18722) +-- Dependencies: 6 +-- Name: postgis_scripts_installed(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_scripts_installed() RETURNS text + LANGUAGE sql IMMUTABLE + AS $$SELECT '1.5 r5385'::text AS version$$; + + +ALTER FUNCTION public.postgis_scripts_installed() OWNER TO postgres; + +-- +-- TOC entry 369 (class 1255 OID 18723) +-- Dependencies: 6 +-- Name: postgis_scripts_released(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_scripts_released() RETURNS text + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'postgis_scripts_released'; + + +ALTER FUNCTION public.postgis_scripts_released() OWNER TO postgres; + +-- +-- TOC entry 370 (class 1255 OID 18724) +-- Dependencies: 6 1102 1102 +-- Name: postgis_transform_geometry(geometry, text, text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_transform_geometry(geometry, text, text, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'transform_geom'; + + +ALTER FUNCTION public.postgis_transform_geometry(geometry, text, text, integer) OWNER TO postgres; + +-- +-- TOC entry 371 (class 1255 OID 18725) +-- Dependencies: 6 +-- Name: postgis_uses_stats(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_uses_stats() RETURNS boolean + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'postgis_uses_stats'; + + +ALTER FUNCTION public.postgis_uses_stats() OWNER TO postgres; + +-- +-- TOC entry 372 (class 1255 OID 18726) +-- Dependencies: 6 +-- Name: postgis_version(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION postgis_version() RETURNS text + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'postgis_version'; + + +ALTER FUNCTION public.postgis_version() OWNER TO postgres; + +-- +-- TOC entry 373 (class 1255 OID 18727) +-- Dependencies: 6 1170 +-- Name: probe_geometry_columns(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION probe_geometry_columns() RETURNS text + LANGUAGE plpgsql + AS $$ +DECLARE + inserted integer; + oldcount integer; + probed integer; + stale integer; +BEGIN + + SELECT count(*) INTO oldcount FROM geometry_columns; + + SELECT count(*) INTO probed + FROM pg_class c, pg_attribute a, pg_type t, + pg_namespace n, + pg_constraint sridcheck, pg_constraint typecheck + + WHERE t.typname = 'geometry' + AND a.atttypid = t.oid + AND a.attrelid = c.oid + AND c.relnamespace = n.oid + AND sridcheck.connamespace = n.oid + AND typecheck.connamespace = n.oid + AND sridcheck.conrelid = c.oid + AND sridcheck.consrc LIKE '(srid('||a.attname||') = %)' + AND typecheck.conrelid = c.oid + AND typecheck.consrc LIKE + '((geometrytype('||a.attname||') = ''%''::text) OR (% IS NULL))' + ; + + INSERT INTO geometry_columns SELECT + ''::varchar as f_table_catalogue, + n.nspname::varchar as f_table_schema, + c.relname::varchar as f_table_name, + a.attname::varchar as f_geometry_column, + 2 as coord_dimension, + trim(both ' =)' from + replace(replace(split_part( + sridcheck.consrc, ' = ', 2), ')', ''), '(', ''))::integer AS srid, + trim(both ' =)''' from substr(typecheck.consrc, + strpos(typecheck.consrc, '='), + strpos(typecheck.consrc, '::')- + strpos(typecheck.consrc, '=') + ))::varchar as type + FROM pg_class c, pg_attribute a, pg_type t, + pg_namespace n, + pg_constraint sridcheck, pg_constraint typecheck + WHERE t.typname = 'geometry' + AND a.atttypid = t.oid + AND a.attrelid = c.oid + AND c.relnamespace = n.oid + AND sridcheck.connamespace = n.oid + AND typecheck.connamespace = n.oid + AND sridcheck.conrelid = c.oid + AND sridcheck.consrc LIKE '(st_srid('||a.attname||') = %)' + AND typecheck.conrelid = c.oid + AND typecheck.consrc LIKE + '((geometrytype('||a.attname||') = ''%''::text) OR (% IS NULL))' + + AND NOT EXISTS ( + SELECT oid FROM geometry_columns gc + WHERE c.relname::varchar = gc.f_table_name + AND n.nspname::varchar = gc.f_table_schema + AND a.attname::varchar = gc.f_geometry_column + ); + + GET DIAGNOSTICS inserted = ROW_COUNT; + + IF oldcount > probed THEN + stale = oldcount-probed; + ELSE + stale = 0; + END IF; + + RETURN 'probed:'||probed::text|| + ' inserted:'||inserted::text|| + ' conflicts:'||(probed-inserted)::text|| + ' stale:'||stale::text; +END + +$$; + + +ALTER FUNCTION public.probe_geometry_columns() OWNER TO postgres; + +-- +-- TOC entry 374 (class 1255 OID 18728) +-- Dependencies: 1102 6 1102 +-- Name: relate(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION relate(geometry, geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'relate_full'; + + +ALTER FUNCTION public.relate(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 375 (class 1255 OID 18729) +-- Dependencies: 1102 6 1102 +-- Name: relate(geometry, geometry, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION relate(geometry, geometry, text) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'relate_pattern'; + + +ALTER FUNCTION public.relate(geometry, geometry, text) OWNER TO postgres; + +-- +-- TOC entry 376 (class 1255 OID 18730) +-- Dependencies: 6 1102 1102 +-- Name: removepoint(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION removepoint(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_removepoint'; + + +ALTER FUNCTION public.removepoint(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 377 (class 1255 OID 18731) +-- Dependencies: 6 +-- Name: rename_geometry_table_constraints(); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION rename_geometry_table_constraints() RETURNS text + LANGUAGE sql IMMUTABLE + AS $$ +SELECT 'rename_geometry_table_constraint() is obsoleted'::text +$$; + + +ALTER FUNCTION public.rename_geometry_table_constraints() OWNER TO postgres; + +-- +-- TOC entry 378 (class 1255 OID 18732) +-- Dependencies: 6 1102 1102 +-- Name: reverse(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION reverse(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_reverse'; + + +ALTER FUNCTION public.reverse(geometry) OWNER TO postgres; + +-- +-- TOC entry 379 (class 1255 OID 18733) +-- Dependencies: 1102 6 1102 +-- Name: rotate(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION rotate(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT rotateZ($1, $2)$_$; + + +ALTER FUNCTION public.rotate(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 380 (class 1255 OID 18734) +-- Dependencies: 1102 1102 6 +-- Name: rotatex(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION rotatex(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, 1, 0, 0, 0, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0)$_$; + + +ALTER FUNCTION public.rotatex(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 381 (class 1255 OID 18735) +-- Dependencies: 1102 1102 6 +-- Name: rotatey(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION rotatey(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, cos($2), 0, sin($2), 0, 1, 0, -sin($2), 0, cos($2), 0, 0, 0)$_$; + + +ALTER FUNCTION public.rotatey(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 382 (class 1255 OID 18736) +-- Dependencies: 1102 6 1102 +-- Name: rotatez(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION rotatez(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0, 1, 0, 0, 0)$_$; + + +ALTER FUNCTION public.rotatez(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 384 (class 1255 OID 18738) +-- Dependencies: 1102 6 1102 +-- Name: scale(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION scale(geometry, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT scale($1, $2, $3, 1)$_$; + + +ALTER FUNCTION public.scale(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 383 (class 1255 OID 18737) +-- Dependencies: 6 1102 1102 +-- Name: scale(geometry, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION scale(geometry, double precision, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, $2, 0, 0, 0, $3, 0, 0, 0, $4, 0, 0, 0)$_$; + + +ALTER FUNCTION public.scale(geometry, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 385 (class 1255 OID 18739) +-- Dependencies: 6 1102 1102 +-- Name: se_envelopesintersect(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION se_envelopesintersect(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT $1 && $2 + $_$; + + +ALTER FUNCTION public.se_envelopesintersect(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 386 (class 1255 OID 18740) +-- Dependencies: 6 1102 +-- Name: se_is3d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION se_is3d(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_hasz'; + + +ALTER FUNCTION public.se_is3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 387 (class 1255 OID 18741) +-- Dependencies: 1102 6 +-- Name: se_ismeasured(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION se_ismeasured(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_hasm'; + + +ALTER FUNCTION public.se_ismeasured(geometry) OWNER TO postgres; + +-- +-- TOC entry 388 (class 1255 OID 18742) +-- Dependencies: 1102 1102 6 +-- Name: se_locatealong(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION se_locatealong(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT locate_between_measures($1, $2, $2) $_$; + + +ALTER FUNCTION public.se_locatealong(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 389 (class 1255 OID 18743) +-- Dependencies: 1102 1102 6 +-- Name: se_locatebetween(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION se_locatebetween(geometry, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_locate_between_m'; + + +ALTER FUNCTION public.se_locatebetween(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 390 (class 1255 OID 18744) +-- Dependencies: 1102 6 +-- Name: se_m(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION se_m(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_m_point'; + + +ALTER FUNCTION public.se_m(geometry) OWNER TO postgres; + +-- +-- TOC entry 391 (class 1255 OID 18745) +-- Dependencies: 1102 6 +-- Name: se_z(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION se_z(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_z_point'; + + +ALTER FUNCTION public.se_z(geometry) OWNER TO postgres; + +-- +-- TOC entry 392 (class 1255 OID 18746) +-- Dependencies: 1102 6 1102 +-- Name: segmentize(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION segmentize(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_segmentize2d'; + + +ALTER FUNCTION public.segmentize(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 393 (class 1255 OID 18747) +-- Dependencies: 1096 1096 6 +-- Name: setfactor(chip, real); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION setfactor(chip, real) RETURNS chip + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_setFactor'; + + +ALTER FUNCTION public.setfactor(chip, real) OWNER TO postgres; + +-- +-- TOC entry 394 (class 1255 OID 18748) +-- Dependencies: 1102 6 1102 1102 +-- Name: setpoint(geometry, integer, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION setpoint(geometry, integer, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_setpoint_linestring'; + + +ALTER FUNCTION public.setpoint(geometry, integer, geometry) OWNER TO postgres; + +-- +-- TOC entry 395 (class 1255 OID 18749) +-- Dependencies: 1096 6 1096 +-- Name: setsrid(chip, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION setsrid(chip, integer) RETURNS chip + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_setSRID'; + + +ALTER FUNCTION public.setsrid(chip, integer) OWNER TO postgres; + +-- +-- TOC entry 396 (class 1255 OID 18750) +-- Dependencies: 6 1102 1102 +-- Name: setsrid(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION setsrid(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_setSRID'; + + +ALTER FUNCTION public.setsrid(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 397 (class 1255 OID 18751) +-- Dependencies: 1102 6 1102 +-- Name: shift_longitude(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION shift_longitude(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_longitude_shift'; + + +ALTER FUNCTION public.shift_longitude(geometry) OWNER TO postgres; + +-- +-- TOC entry 398 (class 1255 OID 18752) +-- Dependencies: 1102 1102 6 +-- Name: simplify(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION simplify(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_simplify2d'; + + +ALTER FUNCTION public.simplify(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 401 (class 1255 OID 18755) +-- Dependencies: 6 1102 1102 +-- Name: snaptogrid(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION snaptogrid(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT SnapToGrid($1, 0, 0, $2, $2)$_$; + + +ALTER FUNCTION public.snaptogrid(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 400 (class 1255 OID 18754) +-- Dependencies: 1102 6 1102 +-- Name: snaptogrid(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION snaptogrid(geometry, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT SnapToGrid($1, 0, 0, $2, $3)$_$; + + +ALTER FUNCTION public.snaptogrid(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 399 (class 1255 OID 18753) +-- Dependencies: 1102 6 1102 +-- Name: snaptogrid(geometry, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION snaptogrid(geometry, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_snaptogrid'; + + +ALTER FUNCTION public.snaptogrid(geometry, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 402 (class 1255 OID 18756) +-- Dependencies: 6 1102 1102 1102 +-- Name: snaptogrid(geometry, geometry, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION snaptogrid(geometry, geometry, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_snaptogrid_pointoff'; + + +ALTER FUNCTION public.snaptogrid(geometry, geometry, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 403 (class 1255 OID 18757) +-- Dependencies: 6 1096 +-- Name: srid(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION srid(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getSRID'; + + +ALTER FUNCTION public.srid(chip) OWNER TO postgres; + +-- +-- TOC entry 404 (class 1255 OID 18758) +-- Dependencies: 6 1102 +-- Name: srid(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION srid(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_getSRID'; + + +ALTER FUNCTION public.srid(geometry) OWNER TO postgres; + +-- +-- TOC entry 405 (class 1255 OID 18759) +-- Dependencies: 6 1102 1102 +-- Name: st_addmeasure(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_addmeasure(geometry, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'ST_AddMeasure'; + + +ALTER FUNCTION public.st_addmeasure(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 406 (class 1255 OID 18760) +-- Dependencies: 1102 6 1102 1102 +-- Name: st_addpoint(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_addpoint(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_addpoint'; + + +ALTER FUNCTION public.st_addpoint(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 407 (class 1255 OID 18761) +-- Dependencies: 1102 6 1102 1102 +-- Name: st_addpoint(geometry, geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_addpoint(geometry, geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_addpoint'; + + +ALTER FUNCTION public.st_addpoint(geometry, geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 409 (class 1255 OID 18763) +-- Dependencies: 1102 6 1102 +-- Name: st_affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, $2, $3, 0, $4, $5, 0, 0, 0, 1, $6, $7, 0)$_$; + + +ALTER FUNCTION public.st_affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 408 (class 1255 OID 18762) +-- Dependencies: 1102 6 1102 +-- Name: st_affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_affine'; + + +ALTER FUNCTION public.st_affine(geometry, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 410 (class 1255 OID 18764) +-- Dependencies: 1102 6 +-- Name: st_area(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_area(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_area_polygon'; + + +ALTER FUNCTION public.st_area(geometry) OWNER TO postgres; + +-- +-- TOC entry 412 (class 1255 OID 18766) +-- Dependencies: 6 1099 +-- Name: st_area(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_area(geography) RETURNS double precision + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_Area($1, true)$_$; + + +ALTER FUNCTION public.st_area(geography) OWNER TO postgres; + +-- +-- TOC entry 413 (class 1255 OID 18767) +-- Dependencies: 6 +-- Name: st_area(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_area(text) RETURNS double precision + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_Area($1::geometry); $_$; + + +ALTER FUNCTION public.st_area(text) OWNER TO postgres; + +-- +-- TOC entry 411 (class 1255 OID 18765) +-- Dependencies: 6 1099 +-- Name: st_area(geography, boolean); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_area(geography, boolean) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'geography_area'; + + +ALTER FUNCTION public.st_area(geography, boolean) OWNER TO postgres; + +-- +-- TOC entry 414 (class 1255 OID 18768) +-- Dependencies: 6 1102 +-- Name: st_area2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_area2d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_area_polygon'; + + +ALTER FUNCTION public.st_area2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 415 (class 1255 OID 18769) +-- Dependencies: 6 1102 +-- Name: st_asbinary(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asbinary(geometry) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asBinary'; + + +ALTER FUNCTION public.st_asbinary(geometry) OWNER TO postgres; + +-- +-- TOC entry 417 (class 1255 OID 18771) +-- Dependencies: 1099 6 +-- Name: st_asbinary(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asbinary(geography) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_as_binary'; + + +ALTER FUNCTION public.st_asbinary(geography) OWNER TO postgres; + +-- +-- TOC entry 418 (class 1255 OID 18772) +-- Dependencies: 6 +-- Name: st_asbinary(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asbinary(text) RETURNS bytea + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_AsBinary($1::geometry); $_$; + + +ALTER FUNCTION public.st_asbinary(text) OWNER TO postgres; + +-- +-- TOC entry 416 (class 1255 OID 18770) +-- Dependencies: 6 1102 +-- Name: st_asbinary(geometry, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asbinary(geometry, text) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asBinary'; + + +ALTER FUNCTION public.st_asbinary(geometry, text) OWNER TO postgres; + +-- +-- TOC entry 419 (class 1255 OID 18773) +-- Dependencies: 6 1102 +-- Name: st_asewkb(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asewkb(geometry) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'WKBFromLWGEOM'; + + +ALTER FUNCTION public.st_asewkb(geometry) OWNER TO postgres; + +-- +-- TOC entry 420 (class 1255 OID 18774) +-- Dependencies: 6 1102 +-- Name: st_asewkb(geometry, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asewkb(geometry, text) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'WKBFromLWGEOM'; + + +ALTER FUNCTION public.st_asewkb(geometry, text) OWNER TO postgres; + +-- +-- TOC entry 421 (class 1255 OID 18775) +-- Dependencies: 1102 6 +-- Name: st_asewkt(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asewkt(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asEWKT'; + + +ALTER FUNCTION public.st_asewkt(geometry) OWNER TO postgres; + +-- +-- TOC entry 423 (class 1255 OID 18777) +-- Dependencies: 1102 6 +-- Name: st_asgeojson(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(geometry) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson(1, $1, 15, 0)$_$; + + +ALTER FUNCTION public.st_asgeojson(geometry) OWNER TO postgres; + +-- +-- TOC entry 429 (class 1255 OID 18783) +-- Dependencies: 6 1099 +-- Name: st_asgeojson(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(geography) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson(1, $1, 15, 0)$_$; + + +ALTER FUNCTION public.st_asgeojson(geography) OWNER TO postgres; + +-- +-- TOC entry 430 (class 1255 OID 18784) +-- Dependencies: 6 +-- Name: st_asgeojson(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(text) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_AsGeoJson($1::geometry); $_$; + + +ALTER FUNCTION public.st_asgeojson(text) OWNER TO postgres; + +-- +-- TOC entry 422 (class 1255 OID 18776) +-- Dependencies: 6 1102 +-- Name: st_asgeojson(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(geometry, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson(1, $1, $2, 0)$_$; + + +ALTER FUNCTION public.st_asgeojson(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 424 (class 1255 OID 18778) +-- Dependencies: 6 1102 +-- Name: st_asgeojson(integer, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(integer, geometry) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson($1, $2, 15, 0)$_$; + + +ALTER FUNCTION public.st_asgeojson(integer, geometry) OWNER TO postgres; + +-- +-- TOC entry 428 (class 1255 OID 18782) +-- Dependencies: 1099 6 +-- Name: st_asgeojson(geography, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(geography, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson(1, $1, $2, 0)$_$; + + +ALTER FUNCTION public.st_asgeojson(geography, integer) OWNER TO postgres; + +-- +-- TOC entry 431 (class 1255 OID 18785) +-- Dependencies: 1099 6 +-- Name: st_asgeojson(integer, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(integer, geography) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson($1, $2, 15, 0)$_$; + + +ALTER FUNCTION public.st_asgeojson(integer, geography) OWNER TO postgres; + +-- +-- TOC entry 425 (class 1255 OID 18779) +-- Dependencies: 1102 6 +-- Name: st_asgeojson(integer, geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(integer, geometry, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson($1, $2, $3, 0)$_$; + + +ALTER FUNCTION public.st_asgeojson(integer, geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 426 (class 1255 OID 18780) +-- Dependencies: 1102 6 +-- Name: st_asgeojson(geometry, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(geometry, integer, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson(1, $1, $2, $3)$_$; + + +ALTER FUNCTION public.st_asgeojson(geometry, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 432 (class 1255 OID 18786) +-- Dependencies: 6 1099 +-- Name: st_asgeojson(integer, geography, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(integer, geography, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson($1, $2, $3, 0)$_$; + + +ALTER FUNCTION public.st_asgeojson(integer, geography, integer) OWNER TO postgres; + +-- +-- TOC entry 433 (class 1255 OID 18787) +-- Dependencies: 6 1099 +-- Name: st_asgeojson(geography, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(geography, integer, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson(1, $1, $2, $3)$_$; + + +ALTER FUNCTION public.st_asgeojson(geography, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 427 (class 1255 OID 18781) +-- Dependencies: 1102 6 +-- Name: st_asgeojson(integer, geometry, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(integer, geometry, integer, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson($1, $2, $3, $4)$_$; + + +ALTER FUNCTION public.st_asgeojson(integer, geometry, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 434 (class 1255 OID 18788) +-- Dependencies: 6 1099 +-- Name: st_asgeojson(integer, geography, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgeojson(integer, geography, integer, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGeoJson($1, $2, $3, $4)$_$; + + +ALTER FUNCTION public.st_asgeojson(integer, geography, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 436 (class 1255 OID 18790) +-- Dependencies: 6 1102 +-- Name: st_asgml(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(geometry) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML(2, $1, 15, 0)$_$; + + +ALTER FUNCTION public.st_asgml(geometry) OWNER TO postgres; + +-- +-- TOC entry 442 (class 1255 OID 18796) +-- Dependencies: 1099 6 +-- Name: st_asgml(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(geography) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML(2, $1, 15, 0)$_$; + + +ALTER FUNCTION public.st_asgml(geography) OWNER TO postgres; + +-- +-- TOC entry 443 (class 1255 OID 18797) +-- Dependencies: 6 +-- Name: st_asgml(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(text) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_AsGML($1::geometry); $_$; + + +ALTER FUNCTION public.st_asgml(text) OWNER TO postgres; + +-- +-- TOC entry 435 (class 1255 OID 18789) +-- Dependencies: 6 1102 +-- Name: st_asgml(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(geometry, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML(2, $1, $2, 0)$_$; + + +ALTER FUNCTION public.st_asgml(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 437 (class 1255 OID 18791) +-- Dependencies: 6 1102 +-- Name: st_asgml(integer, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(integer, geometry) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML($1, $2, 15, 0)$_$; + + +ALTER FUNCTION public.st_asgml(integer, geometry) OWNER TO postgres; + +-- +-- TOC entry 441 (class 1255 OID 18795) +-- Dependencies: 6 1099 +-- Name: st_asgml(geography, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(geography, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML(2, $1, $2, 0)$_$; + + +ALTER FUNCTION public.st_asgml(geography, integer) OWNER TO postgres; + +-- +-- TOC entry 444 (class 1255 OID 18798) +-- Dependencies: 6 1099 +-- Name: st_asgml(integer, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(integer, geography) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML($1, $2, 15, 0)$_$; + + +ALTER FUNCTION public.st_asgml(integer, geography) OWNER TO postgres; + +-- +-- TOC entry 438 (class 1255 OID 18792) +-- Dependencies: 6 1102 +-- Name: st_asgml(integer, geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(integer, geometry, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML($1, $2, $3, 0)$_$; + + +ALTER FUNCTION public.st_asgml(integer, geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 439 (class 1255 OID 18793) +-- Dependencies: 6 1102 +-- Name: st_asgml(geometry, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(geometry, integer, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML(2, $1, $2, $3)$_$; + + +ALTER FUNCTION public.st_asgml(geometry, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 445 (class 1255 OID 18799) +-- Dependencies: 6 1099 +-- Name: st_asgml(integer, geography, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(integer, geography, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML($1, $2, $3, 0)$_$; + + +ALTER FUNCTION public.st_asgml(integer, geography, integer) OWNER TO postgres; + +-- +-- TOC entry 446 (class 1255 OID 18800) +-- Dependencies: 6 1099 +-- Name: st_asgml(geography, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(geography, integer, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML(2, $1, $2, $3)$_$; + + +ALTER FUNCTION public.st_asgml(geography, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 440 (class 1255 OID 18794) +-- Dependencies: 6 1102 +-- Name: st_asgml(integer, geometry, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(integer, geometry, integer, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML($1, $2, $3, $4)$_$; + + +ALTER FUNCTION public.st_asgml(integer, geometry, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 447 (class 1255 OID 18801) +-- Dependencies: 6 1099 +-- Name: st_asgml(integer, geography, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_asgml(integer, geography, integer, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsGML($1, $2, $3, $4)$_$; + + +ALTER FUNCTION public.st_asgml(integer, geography, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 448 (class 1255 OID 18802) +-- Dependencies: 6 1102 +-- Name: st_ashexewkb(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_ashexewkb(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asHEXEWKB'; + + +ALTER FUNCTION public.st_ashexewkb(geometry) OWNER TO postgres; + +-- +-- TOC entry 449 (class 1255 OID 18803) +-- Dependencies: 6 1102 +-- Name: st_ashexewkb(geometry, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_ashexewkb(geometry, text) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asHEXEWKB'; + + +ALTER FUNCTION public.st_ashexewkb(geometry, text) OWNER TO postgres; + +-- +-- TOC entry 451 (class 1255 OID 18805) +-- Dependencies: 6 1102 +-- Name: st_askml(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_askml(geometry) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML(2, ST_Transform($1,4326), 15)$_$; + + +ALTER FUNCTION public.st_askml(geometry) OWNER TO postgres; + +-- +-- TOC entry 455 (class 1255 OID 18809) +-- Dependencies: 6 1099 +-- Name: st_askml(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_askml(geography) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML(2, $1, 15)$_$; + + +ALTER FUNCTION public.st_askml(geography) OWNER TO postgres; + +-- +-- TOC entry 456 (class 1255 OID 18810) +-- Dependencies: 6 +-- Name: st_askml(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_askml(text) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_AsKML($1::geometry); $_$; + + +ALTER FUNCTION public.st_askml(text) OWNER TO postgres; + +-- +-- TOC entry 450 (class 1255 OID 18804) +-- Dependencies: 6 1102 +-- Name: st_askml(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_askml(geometry, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML(2, ST_Transform($1,4326), $2)$_$; + + +ALTER FUNCTION public.st_askml(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 452 (class 1255 OID 18806) +-- Dependencies: 6 1102 +-- Name: st_askml(integer, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_askml(integer, geometry) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML($1, ST_Transform($2,4326), 15)$_$; + + +ALTER FUNCTION public.st_askml(integer, geometry) OWNER TO postgres; + +-- +-- TOC entry 454 (class 1255 OID 18808) +-- Dependencies: 6 1099 +-- Name: st_askml(geography, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_askml(geography, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML(2, $1, $2)$_$; + + +ALTER FUNCTION public.st_askml(geography, integer) OWNER TO postgres; + +-- +-- TOC entry 457 (class 1255 OID 18811) +-- Dependencies: 6 1099 +-- Name: st_askml(integer, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_askml(integer, geography) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML($1, $2, 15)$_$; + + +ALTER FUNCTION public.st_askml(integer, geography) OWNER TO postgres; + +-- +-- TOC entry 453 (class 1255 OID 18807) +-- Dependencies: 6 1102 +-- Name: st_askml(integer, geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_askml(integer, geometry, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML($1, ST_Transform($2,4326), $3)$_$; + + +ALTER FUNCTION public.st_askml(integer, geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 458 (class 1255 OID 18812) +-- Dependencies: 6 1099 +-- Name: st_askml(integer, geography, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_askml(integer, geography, integer) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_AsKML($1, $2, $3)$_$; + + +ALTER FUNCTION public.st_askml(integer, geography, integer) OWNER TO postgres; + +-- +-- TOC entry 461 (class 1255 OID 18815) +-- Dependencies: 6 1102 +-- Name: st_assvg(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_assvg(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'assvg_geometry'; + + +ALTER FUNCTION public.st_assvg(geometry) OWNER TO postgres; + +-- +-- TOC entry 464 (class 1255 OID 18818) +-- Dependencies: 6 1099 +-- Name: st_assvg(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_assvg(geography) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_as_svg'; + + +ALTER FUNCTION public.st_assvg(geography) OWNER TO postgres; + +-- +-- TOC entry 465 (class 1255 OID 18819) +-- Dependencies: 6 +-- Name: st_assvg(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_assvg(text) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_AsSVG($1::geometry); $_$; + + +ALTER FUNCTION public.st_assvg(text) OWNER TO postgres; + +-- +-- TOC entry 460 (class 1255 OID 18814) +-- Dependencies: 6 1102 +-- Name: st_assvg(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_assvg(geometry, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'assvg_geometry'; + + +ALTER FUNCTION public.st_assvg(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 463 (class 1255 OID 18817) +-- Dependencies: 6 1099 +-- Name: st_assvg(geography, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_assvg(geography, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_as_svg'; + + +ALTER FUNCTION public.st_assvg(geography, integer) OWNER TO postgres; + +-- +-- TOC entry 459 (class 1255 OID 18813) +-- Dependencies: 6 1102 +-- Name: st_assvg(geometry, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_assvg(geometry, integer, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'assvg_geometry'; + + +ALTER FUNCTION public.st_assvg(geometry, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 462 (class 1255 OID 18816) +-- Dependencies: 6 1099 +-- Name: st_assvg(geography, integer, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_assvg(geography, integer, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_as_svg'; + + +ALTER FUNCTION public.st_assvg(geography, integer, integer) OWNER TO postgres; + +-- +-- TOC entry 466 (class 1255 OID 18820) +-- Dependencies: 6 1102 +-- Name: st_astext(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_astext(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_asText'; + + +ALTER FUNCTION public.st_astext(geometry) OWNER TO postgres; + +-- +-- TOC entry 467 (class 1255 OID 18821) +-- Dependencies: 6 1099 +-- Name: st_astext(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_astext(geography) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_as_text'; + + +ALTER FUNCTION public.st_astext(geography) OWNER TO postgres; + +-- +-- TOC entry 468 (class 1255 OID 18822) +-- Dependencies: 6 +-- Name: st_astext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_astext(text) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_AsText($1::geometry); $_$; + + +ALTER FUNCTION public.st_astext(text) OWNER TO postgres; + +-- +-- TOC entry 469 (class 1255 OID 18823) +-- Dependencies: 6 1102 1102 +-- Name: st_azimuth(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_azimuth(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_azimuth'; + + +ALTER FUNCTION public.st_azimuth(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 470 (class 1255 OID 18824) +-- Dependencies: 6 1170 1102 +-- Name: st_bdmpolyfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_bdmpolyfromtext(text, integer) RETURNS geometry + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +DECLARE + geomtext alias for $1; + srid alias for $2; + mline geometry; + geom geometry; +BEGIN + mline := ST_MultiLineStringFromText(geomtext, srid); + + IF mline IS NULL + THEN + RAISE EXCEPTION 'Input is not a MultiLinestring'; + END IF; + + geom := multi(ST_BuildArea(mline)); + + RETURN geom; +END; +$_$; + + +ALTER FUNCTION public.st_bdmpolyfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 471 (class 1255 OID 18825) +-- Dependencies: 6 1170 1102 +-- Name: st_bdpolyfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_bdpolyfromtext(text, integer) RETURNS geometry + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +DECLARE + geomtext alias for $1; + srid alias for $2; + mline geometry; + geom geometry; +BEGIN + mline := ST_MultiLineStringFromText(geomtext, srid); + + IF mline IS NULL + THEN + RAISE EXCEPTION 'Input is not a MultiLinestring'; + END IF; + + geom := ST_BuildArea(mline); + + IF GeometryType(geom) != 'POLYGON' + THEN + RAISE EXCEPTION 'Input returns more then a single polygon, try using BdMPolyFromText instead'; + END IF; + + RETURN geom; +END; +$_$; + + +ALTER FUNCTION public.st_bdpolyfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 472 (class 1255 OID 18826) +-- Dependencies: 6 1102 1102 +-- Name: st_boundary(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_boundary(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'boundary'; + + +ALTER FUNCTION public.st_boundary(geometry) OWNER TO postgres; + +-- +-- TOC entry 473 (class 1255 OID 18827) +-- Dependencies: 6 1102 +-- Name: st_box(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box(geometry) RETURNS box + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_BOX'; + + +ALTER FUNCTION public.st_box(geometry) OWNER TO postgres; + +-- +-- TOC entry 474 (class 1255 OID 18828) +-- Dependencies: 6 1090 +-- Name: st_box(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box(box3d) RETURNS box + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_BOX'; + + +ALTER FUNCTION public.st_box(box3d) OWNER TO postgres; + +-- +-- TOC entry 475 (class 1255 OID 18829) +-- Dependencies: 6 1087 1102 +-- Name: st_box2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box2d(geometry) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_BOX2DFLOAT4'; + + +ALTER FUNCTION public.st_box2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 476 (class 1255 OID 18830) +-- Dependencies: 6 1087 1090 +-- Name: st_box2d(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box2d(box3d) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_BOX2DFLOAT4'; + + +ALTER FUNCTION public.st_box2d(box3d) OWNER TO postgres; + +-- +-- TOC entry 477 (class 1255 OID 18831) +-- Dependencies: 6 1087 1093 +-- Name: st_box2d(box3d_extent); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box2d(box3d_extent) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_BOX2DFLOAT4'; + + +ALTER FUNCTION public.st_box2d(box3d_extent) OWNER TO postgres; + +-- +-- TOC entry 478 (class 1255 OID 18832) +-- Dependencies: 6 1087 +-- Name: st_box2d_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box2d_in(cstring) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_in'; + + +ALTER FUNCTION public.st_box2d_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 479 (class 1255 OID 18833) +-- Dependencies: 6 1087 +-- Name: st_box2d_out(box2d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box2d_out(box2d) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_out'; + + +ALTER FUNCTION public.st_box2d_out(box2d) OWNER TO postgres; + +-- +-- TOC entry 480 (class 1255 OID 18834) +-- Dependencies: 6 1090 1102 +-- Name: st_box3d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box3d(geometry) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_BOX3D'; + + +ALTER FUNCTION public.st_box3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 481 (class 1255 OID 18835) +-- Dependencies: 6 1090 1087 +-- Name: st_box3d(box2d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box3d(box2d) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_to_BOX3D'; + + +ALTER FUNCTION public.st_box3d(box2d) OWNER TO postgres; + +-- +-- TOC entry 482 (class 1255 OID 18836) +-- Dependencies: 6 1090 1093 +-- Name: st_box3d_extent(box3d_extent); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box3d_extent(box3d_extent) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_extent_to_BOX3D'; + + +ALTER FUNCTION public.st_box3d_extent(box3d_extent) OWNER TO postgres; + +-- +-- TOC entry 483 (class 1255 OID 18837) +-- Dependencies: 6 1090 +-- Name: st_box3d_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box3d_in(cstring) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_in'; + + +ALTER FUNCTION public.st_box3d_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 484 (class 1255 OID 18838) +-- Dependencies: 6 1090 +-- Name: st_box3d_out(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_box3d_out(box3d) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_out'; + + +ALTER FUNCTION public.st_box3d_out(box3d) OWNER TO postgres; + +-- +-- TOC entry 485 (class 1255 OID 18839) +-- Dependencies: 6 1102 1102 +-- Name: st_buffer(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_buffer(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'buffer'; + + +ALTER FUNCTION public.st_buffer(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 488 (class 1255 OID 18842) +-- Dependencies: 6 1099 1099 +-- Name: st_buffer(geography, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_buffer(geography, double precision) RETURNS geography + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT geography(ST_Transform(ST_Buffer(ST_Transform(geometry($1), _ST_BestSRID($1)), $2), 4326))$_$; + + +ALTER FUNCTION public.st_buffer(geography, double precision) OWNER TO postgres; + +-- +-- TOC entry 489 (class 1255 OID 18843) +-- Dependencies: 6 1102 +-- Name: st_buffer(text, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_buffer(text, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_Buffer($1::geometry, $2); $_$; + + +ALTER FUNCTION public.st_buffer(text, double precision) OWNER TO postgres; + +-- +-- TOC entry 486 (class 1255 OID 18840) +-- Dependencies: 6 1102 1102 +-- Name: st_buffer(geometry, double precision, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_buffer(geometry, double precision, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT _ST_Buffer($1, $2, + CAST('quad_segs='||CAST($3 AS text) as cstring)) + $_$; + + +ALTER FUNCTION public.st_buffer(geometry, double precision, integer) OWNER TO postgres; + +-- +-- TOC entry 487 (class 1255 OID 18841) +-- Dependencies: 6 1102 1102 +-- Name: st_buffer(geometry, double precision, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_buffer(geometry, double precision, text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT _ST_Buffer($1, $2, + CAST( regexp_replace($3, '^[0123456789]+$', + 'quad_segs='||$3) AS cstring) + ) + $_$; + + +ALTER FUNCTION public.st_buffer(geometry, double precision, text) OWNER TO postgres; + +-- +-- TOC entry 490 (class 1255 OID 18844) +-- Dependencies: 6 1102 1102 +-- Name: st_buildarea(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_buildarea(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_buildarea'; + + +ALTER FUNCTION public.st_buildarea(geometry) OWNER TO postgres; + +-- +-- TOC entry 491 (class 1255 OID 18845) +-- Dependencies: 6 1102 +-- Name: st_bytea(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_bytea(geometry) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_bytea'; + + +ALTER FUNCTION public.st_bytea(geometry) OWNER TO postgres; + +-- +-- TOC entry 492 (class 1255 OID 18846) +-- Dependencies: 6 1102 1102 +-- Name: st_centroid(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_centroid(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'centroid'; + + +ALTER FUNCTION public.st_centroid(geometry) OWNER TO postgres; + +-- +-- TOC entry 493 (class 1255 OID 18847) +-- Dependencies: 6 1096 +-- Name: st_chip_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_chip_in(cstring) RETURNS chip + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_in'; + + +ALTER FUNCTION public.st_chip_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 494 (class 1255 OID 18848) +-- Dependencies: 6 1096 +-- Name: st_chip_out(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_chip_out(chip) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_out'; + + +ALTER FUNCTION public.st_chip_out(chip) OWNER TO postgres; + +-- +-- TOC entry 495 (class 1255 OID 18849) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_closestpoint(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_closestpoint(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_closestpoint'; + + +ALTER FUNCTION public.st_closestpoint(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 497 (class 1255 OID 18851) +-- Dependencies: 6 1102 1104 +-- Name: st_collect(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_collect(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_collect_garray'; + + +ALTER FUNCTION public.st_collect(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 496 (class 1255 OID 18850) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_collect(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_collect(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'LWGEOM_collect'; + + +ALTER FUNCTION public.st_collect(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 498 (class 1255 OID 18852) +-- Dependencies: 6 1102 1102 +-- Name: st_collectionextract(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_collectionextract(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'ST_CollectionExtract'; + + +ALTER FUNCTION public.st_collectionextract(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 499 (class 1255 OID 18853) +-- Dependencies: 6 1087 1087 1102 +-- Name: st_combine_bbox(box2d, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_combine_bbox(box2d, geometry) RETURNS box2d + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_combine'; + + +ALTER FUNCTION public.st_combine_bbox(box2d, geometry) OWNER TO postgres; + +-- +-- TOC entry 500 (class 1255 OID 18854) +-- Dependencies: 6 1093 1093 1102 +-- Name: st_combine_bbox(box3d_extent, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_combine_bbox(box3d_extent, geometry) RETURNS box3d_extent + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'BOX3D_combine'; + + +ALTER FUNCTION public.st_combine_bbox(box3d_extent, geometry) OWNER TO postgres; + +-- +-- TOC entry 501 (class 1255 OID 18855) +-- Dependencies: 6 1090 1090 1102 +-- Name: st_combine_bbox(box3d, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_combine_bbox(box3d, geometry) RETURNS box3d + LANGUAGE c IMMUTABLE + AS '$libdir/postgis-1.5', 'BOX3D_combine'; + + +ALTER FUNCTION public.st_combine_bbox(box3d, geometry) OWNER TO postgres; + +-- +-- TOC entry 502 (class 1255 OID 18856) +-- Dependencies: 6 1096 +-- Name: st_compression(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_compression(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getCompression'; + + +ALTER FUNCTION public.st_compression(chip) OWNER TO postgres; + +-- +-- TOC entry 503 (class 1255 OID 18857) +-- Dependencies: 6 1102 1102 +-- Name: st_contains(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_contains(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && $2 AND _ST_Contains($1,$2)$_$; + + +ALTER FUNCTION public.st_contains(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 504 (class 1255 OID 18858) +-- Dependencies: 6 1102 1102 +-- Name: st_containsproperly(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_containsproperly(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && $2 AND _ST_ContainsProperly($1,$2)$_$; + + +ALTER FUNCTION public.st_containsproperly(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 505 (class 1255 OID 18859) +-- Dependencies: 6 1102 1102 +-- Name: st_convexhull(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_convexhull(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'convexhull'; + + +ALTER FUNCTION public.st_convexhull(geometry) OWNER TO postgres; + +-- +-- TOC entry 506 (class 1255 OID 18860) +-- Dependencies: 6 1102 +-- Name: st_coorddim(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_coorddim(geometry) RETURNS smallint + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_ndims'; + + +ALTER FUNCTION public.st_coorddim(geometry) OWNER TO postgres; + +-- +-- TOC entry 507 (class 1255 OID 18861) +-- Dependencies: 6 1102 1102 +-- Name: st_coveredby(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_coveredby(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && $2 AND _ST_CoveredBy($1,$2)$_$; + + +ALTER FUNCTION public.st_coveredby(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 508 (class 1255 OID 18862) +-- Dependencies: 6 1099 1099 +-- Name: st_coveredby(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_coveredby(geography, geography) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT $1 && $2 AND _ST_Covers($2, $1)$_$; + + +ALTER FUNCTION public.st_coveredby(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 509 (class 1255 OID 18863) +-- Dependencies: 6 +-- Name: st_coveredby(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_coveredby(text, text) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_CoveredBy($1::geometry, $2::geometry); $_$; + + +ALTER FUNCTION public.st_coveredby(text, text) OWNER TO postgres; + +-- +-- TOC entry 510 (class 1255 OID 18864) +-- Dependencies: 6 1102 1102 +-- Name: st_covers(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_covers(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && $2 AND _ST_Covers($1,$2)$_$; + + +ALTER FUNCTION public.st_covers(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 511 (class 1255 OID 18865) +-- Dependencies: 6 1099 1099 +-- Name: st_covers(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_covers(geography, geography) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT $1 && $2 AND _ST_Covers($1, $2)$_$; + + +ALTER FUNCTION public.st_covers(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 512 (class 1255 OID 18866) +-- Dependencies: 6 +-- Name: st_covers(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_covers(text, text) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_Covers($1::geometry, $2::geometry); $_$; + + +ALTER FUNCTION public.st_covers(text, text) OWNER TO postgres; + +-- +-- TOC entry 513 (class 1255 OID 18867) +-- Dependencies: 6 1102 1102 +-- Name: st_crosses(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_crosses(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && $2 AND _ST_Crosses($1,$2)$_$; + + +ALTER FUNCTION public.st_crosses(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 515 (class 1255 OID 18869) +-- Dependencies: 6 1102 1102 +-- Name: st_curvetoline(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_curvetoline(geometry) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_CurveToLine($1, 32)$_$; + + +ALTER FUNCTION public.st_curvetoline(geometry) OWNER TO postgres; + +-- +-- TOC entry 514 (class 1255 OID 18868) +-- Dependencies: 6 1102 1102 +-- Name: st_curvetoline(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_curvetoline(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_curve_segmentize'; + + +ALTER FUNCTION public.st_curvetoline(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 516 (class 1255 OID 18870) +-- Dependencies: 6 1096 +-- Name: st_datatype(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_datatype(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getDatatype'; + + +ALTER FUNCTION public.st_datatype(chip) OWNER TO postgres; + +-- +-- TOC entry 517 (class 1255 OID 18871) +-- Dependencies: 6 1102 1102 +-- Name: st_dfullywithin(geometry, geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_dfullywithin(geometry, geometry, double precision) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && ST_Expand($2,$3) AND $2 && ST_Expand($1,$3) AND _ST_DFullyWithin(ST_ConvexHull($1), ST_ConvexHull($2), $3)$_$; + + +ALTER FUNCTION public.st_dfullywithin(geometry, geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 518 (class 1255 OID 18872) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_difference(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_difference(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'difference'; + + +ALTER FUNCTION public.st_difference(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 519 (class 1255 OID 18873) +-- Dependencies: 6 1102 +-- Name: st_dimension(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_dimension(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_dimension'; + + +ALTER FUNCTION public.st_dimension(geometry) OWNER TO postgres; + +-- +-- TOC entry 520 (class 1255 OID 18874) +-- Dependencies: 6 1102 1102 +-- Name: st_disjoint(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_disjoint(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'disjoint'; + + +ALTER FUNCTION public.st_disjoint(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 521 (class 1255 OID 18875) +-- Dependencies: 6 1102 1102 +-- Name: st_distance(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_distance(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_mindistance2d'; + + +ALTER FUNCTION public.st_distance(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 523 (class 1255 OID 18877) +-- Dependencies: 6 1099 1099 +-- Name: st_distance(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_distance(geography, geography) RETURNS double precision + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_Distance($1, $2, 0.0, true)$_$; + + +ALTER FUNCTION public.st_distance(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 524 (class 1255 OID 18878) +-- Dependencies: 6 +-- Name: st_distance(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_distance(text, text) RETURNS double precision + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_Distance($1::geometry, $2::geometry); $_$; + + +ALTER FUNCTION public.st_distance(text, text) OWNER TO postgres; + +-- +-- TOC entry 522 (class 1255 OID 18876) +-- Dependencies: 6 1099 1099 +-- Name: st_distance(geography, geography, boolean); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_distance(geography, geography, boolean) RETURNS double precision + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_Distance($1, $2, 0.0, $3)$_$; + + +ALTER FUNCTION public.st_distance(geography, geography, boolean) OWNER TO postgres; + +-- +-- TOC entry 525 (class 1255 OID 18879) +-- Dependencies: 6 1102 1102 +-- Name: st_distance_sphere(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_distance_sphere(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_distance_sphere'; + + +ALTER FUNCTION public.st_distance_sphere(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 526 (class 1255 OID 18880) +-- Dependencies: 6 1102 1102 1113 +-- Name: st_distance_spheroid(geometry, geometry, spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_distance_spheroid(geometry, geometry, spheroid) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_distance_ellipsoid'; + + +ALTER FUNCTION public.st_distance_spheroid(geometry, geometry, spheroid) OWNER TO postgres; + +-- +-- TOC entry 527 (class 1255 OID 18881) +-- Dependencies: 6 1105 1102 +-- Name: st_dump(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_dump(geometry) RETURNS SETOF geometry_dump + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_dump'; + + +ALTER FUNCTION public.st_dump(geometry) OWNER TO postgres; + +-- +-- TOC entry 528 (class 1255 OID 18882) +-- Dependencies: 6 1105 1102 +-- Name: st_dumppoints(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_dumppoints(geometry) RETURNS SETOF geometry_dump + LANGUAGE sql + AS $_$ + SELECT * FROM _ST_DumpPoints($1, NULL); +$_$; + + +ALTER FUNCTION public.st_dumppoints(geometry) OWNER TO postgres; + +-- +-- TOC entry 529 (class 1255 OID 18883) +-- Dependencies: 6 1105 1102 +-- Name: st_dumprings(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_dumprings(geometry) RETURNS SETOF geometry_dump + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_dump_rings'; + + +ALTER FUNCTION public.st_dumprings(geometry) OWNER TO postgres; + +-- +-- TOC entry 530 (class 1255 OID 18884) +-- Dependencies: 6 1102 1102 +-- Name: st_dwithin(geometry, geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_dwithin(geometry, geometry, double precision) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && ST_Expand($2,$3) AND $2 && ST_Expand($1,$3) AND _ST_DWithin($1, $2, $3)$_$; + + +ALTER FUNCTION public.st_dwithin(geometry, geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 532 (class 1255 OID 18886) +-- Dependencies: 6 1099 1099 +-- Name: st_dwithin(geography, geography, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_dwithin(geography, geography, double precision) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && _ST_Expand($2,$3) AND $2 && _ST_Expand($1,$3) AND _ST_DWithin($1, $2, $3, true)$_$; + + +ALTER FUNCTION public.st_dwithin(geography, geography, double precision) OWNER TO postgres; + +-- +-- TOC entry 533 (class 1255 OID 18887) +-- Dependencies: 6 +-- Name: st_dwithin(text, text, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_dwithin(text, text, double precision) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_DWithin($1::geometry, $2::geometry, $3); $_$; + + +ALTER FUNCTION public.st_dwithin(text, text, double precision) OWNER TO postgres; + +-- +-- TOC entry 531 (class 1255 OID 18885) +-- Dependencies: 6 1099 1099 +-- Name: st_dwithin(geography, geography, double precision, boolean); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_dwithin(geography, geography, double precision, boolean) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && _ST_Expand($2,$3) AND $2 && _ST_Expand($1,$3) AND _ST_DWithin($1, $2, $3, $4)$_$; + + +ALTER FUNCTION public.st_dwithin(geography, geography, double precision, boolean) OWNER TO postgres; + +-- +-- TOC entry 534 (class 1255 OID 18888) +-- Dependencies: 6 1102 1102 +-- Name: st_endpoint(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_endpoint(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_endpoint_linestring'; + + +ALTER FUNCTION public.st_endpoint(geometry) OWNER TO postgres; + +-- +-- TOC entry 535 (class 1255 OID 18889) +-- Dependencies: 6 1102 1102 +-- Name: st_envelope(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_envelope(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_envelope'; + + +ALTER FUNCTION public.st_envelope(geometry) OWNER TO postgres; + +-- +-- TOC entry 536 (class 1255 OID 18890) +-- Dependencies: 6 1102 1102 +-- Name: st_equals(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_equals(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT $1 && $2 AND _ST_Equals($1,$2)$_$; + + +ALTER FUNCTION public.st_equals(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 538 (class 1255 OID 18892) +-- Dependencies: 6 1087 +-- Name: st_estimated_extent(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_estimated_extent(text, text) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT SECURITY DEFINER + AS '$libdir/postgis-1.5', 'LWGEOM_estimated_extent'; + + +ALTER FUNCTION public.st_estimated_extent(text, text) OWNER TO postgres; + +-- +-- TOC entry 537 (class 1255 OID 18891) +-- Dependencies: 6 1087 +-- Name: st_estimated_extent(text, text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_estimated_extent(text, text, text) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT SECURITY DEFINER + AS '$libdir/postgis-1.5', 'LWGEOM_estimated_extent'; + + +ALTER FUNCTION public.st_estimated_extent(text, text, text) OWNER TO postgres; + +-- +-- TOC entry 539 (class 1255 OID 18893) +-- Dependencies: 6 1090 1090 +-- Name: st_expand(box3d, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_expand(box3d, double precision) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_expand'; + + +ALTER FUNCTION public.st_expand(box3d, double precision) OWNER TO postgres; + +-- +-- TOC entry 540 (class 1255 OID 18896) +-- Dependencies: 6 1087 1087 +-- Name: st_expand(box2d, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_expand(box2d, double precision) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_expand'; + + +ALTER FUNCTION public.st_expand(box2d, double precision) OWNER TO postgres; + +-- +-- TOC entry 541 (class 1255 OID 18897) +-- Dependencies: 6 1102 1102 +-- Name: st_expand(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_expand(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_expand'; + + +ALTER FUNCTION public.st_expand(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 542 (class 1255 OID 18898) +-- Dependencies: 6 1102 1102 +-- Name: st_exteriorring(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_exteriorring(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_exteriorring_polygon'; + + +ALTER FUNCTION public.st_exteriorring(geometry) OWNER TO postgres; + +-- +-- TOC entry 543 (class 1255 OID 18899) +-- Dependencies: 6 1096 +-- Name: st_factor(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_factor(chip) RETURNS real + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getFactor'; + + +ALTER FUNCTION public.st_factor(chip) OWNER TO postgres; + +-- +-- TOC entry 545 (class 1255 OID 18901) +-- Dependencies: 6 1170 1087 +-- Name: st_find_extent(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_find_extent(text, text) RETURNS box2d + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +DECLARE + tablename alias for $1; + columnname alias for $2; + myrec RECORD; + +BEGIN + FOR myrec IN EXECUTE 'SELECT extent("' || columnname || '") FROM "' || tablename || '"' LOOP + return myrec.extent; + END LOOP; +END; +$_$; + + +ALTER FUNCTION public.st_find_extent(text, text) OWNER TO postgres; + +-- +-- TOC entry 544 (class 1255 OID 18900) +-- Dependencies: 6 1170 1087 +-- Name: st_find_extent(text, text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_find_extent(text, text, text) RETURNS box2d + LANGUAGE plpgsql IMMUTABLE STRICT + AS $_$ +DECLARE + schemaname alias for $1; + tablename alias for $2; + columnname alias for $3; + myrec RECORD; + +BEGIN + FOR myrec IN EXECUTE 'SELECT extent("' || columnname || '") FROM "' || schemaname || '"."' || tablename || '"' LOOP + return myrec.extent; + END LOOP; +END; +$_$; + + +ALTER FUNCTION public.st_find_extent(text, text, text) OWNER TO postgres; + +-- +-- TOC entry 546 (class 1255 OID 18902) +-- Dependencies: 6 1102 1102 +-- Name: st_force_2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_force_2d(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_2d'; + + +ALTER FUNCTION public.st_force_2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 547 (class 1255 OID 18903) +-- Dependencies: 6 1102 1102 +-- Name: st_force_3d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_force_3d(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dz'; + + +ALTER FUNCTION public.st_force_3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 548 (class 1255 OID 18904) +-- Dependencies: 6 1102 1102 +-- Name: st_force_3dm(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_force_3dm(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dm'; + + +ALTER FUNCTION public.st_force_3dm(geometry) OWNER TO postgres; + +-- +-- TOC entry 549 (class 1255 OID 18905) +-- Dependencies: 6 1102 1102 +-- Name: st_force_3dz(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_force_3dz(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_3dz'; + + +ALTER FUNCTION public.st_force_3dz(geometry) OWNER TO postgres; + +-- +-- TOC entry 550 (class 1255 OID 18906) +-- Dependencies: 6 1102 1102 +-- Name: st_force_4d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_force_4d(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_4d'; + + +ALTER FUNCTION public.st_force_4d(geometry) OWNER TO postgres; + +-- +-- TOC entry 551 (class 1255 OID 18907) +-- Dependencies: 6 1102 1102 +-- Name: st_force_collection(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_force_collection(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_collection'; + + +ALTER FUNCTION public.st_force_collection(geometry) OWNER TO postgres; + +-- +-- TOC entry 552 (class 1255 OID 18908) +-- Dependencies: 6 1102 1102 +-- Name: st_forcerhr(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_forcerhr(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_forceRHR_poly'; + + +ALTER FUNCTION public.st_forcerhr(geometry) OWNER TO postgres; + +-- +-- TOC entry 553 (class 1255 OID 18909) +-- Dependencies: 6 1099 +-- Name: st_geogfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geogfromtext(text) RETURNS geography + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_from_text'; + + +ALTER FUNCTION public.st_geogfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 554 (class 1255 OID 18910) +-- Dependencies: 6 1099 +-- Name: st_geogfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geogfromwkb(bytea) RETURNS geography + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_from_binary'; + + +ALTER FUNCTION public.st_geogfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 555 (class 1255 OID 18911) +-- Dependencies: 6 1099 +-- Name: st_geographyfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geographyfromtext(text) RETURNS geography + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geography_from_text'; + + +ALTER FUNCTION public.st_geographyfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 557 (class 1255 OID 18913) +-- Dependencies: 6 1102 +-- Name: st_geohash(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geohash(geometry) RETURNS text + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_GeoHash($1, 0)$_$; + + +ALTER FUNCTION public.st_geohash(geometry) OWNER TO postgres; + +-- +-- TOC entry 556 (class 1255 OID 18912) +-- Dependencies: 6 1102 +-- Name: st_geohash(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geohash(geometry, integer) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'ST_GeoHash'; + + +ALTER FUNCTION public.st_geohash(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 559 (class 1255 OID 18915) +-- Dependencies: 6 1102 +-- Name: st_geomcollfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomcollfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(ST_GeomFromText($1)) = 'GEOMETRYCOLLECTION' + THEN ST_GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_geomcollfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 558 (class 1255 OID 18914) +-- Dependencies: 6 1102 +-- Name: st_geomcollfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomcollfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(ST_GeomFromText($1, $2)) = 'GEOMETRYCOLLECTION' + THEN ST_GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_geomcollfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 561 (class 1255 OID 18917) +-- Dependencies: 6 1102 +-- Name: st_geomcollfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomcollfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(ST_GeomFromWKB($1)) = 'GEOMETRYCOLLECTION' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_geomcollfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 560 (class 1255 OID 18916) +-- Dependencies: 6 1102 +-- Name: st_geomcollfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomcollfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(GeomFromWKB($1, $2)) = 'GEOMETRYCOLLECTION' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_geomcollfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 562 (class 1255 OID 18918) +-- Dependencies: 6 1102 1087 +-- Name: st_geometry(box2d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry(box2d) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_to_LWGEOM'; + + +ALTER FUNCTION public.st_geometry(box2d) OWNER TO postgres; + +-- +-- TOC entry 563 (class 1255 OID 18919) +-- Dependencies: 6 1102 1090 +-- Name: st_geometry(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry(box3d) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_LWGEOM'; + + +ALTER FUNCTION public.st_geometry(box3d) OWNER TO postgres; + +-- +-- TOC entry 564 (class 1255 OID 18920) +-- Dependencies: 6 1102 +-- Name: st_geometry(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'parse_WKT_lwgeom'; + + +ALTER FUNCTION public.st_geometry(text) OWNER TO postgres; + +-- +-- TOC entry 565 (class 1255 OID 18921) +-- Dependencies: 6 1102 1096 +-- Name: st_geometry(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry(chip) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_to_LWGEOM'; + + +ALTER FUNCTION public.st_geometry(chip) OWNER TO postgres; + +-- +-- TOC entry 566 (class 1255 OID 18922) +-- Dependencies: 6 1102 +-- Name: st_geometry(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry(bytea) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_bytea'; + + +ALTER FUNCTION public.st_geometry(bytea) OWNER TO postgres; + +-- +-- TOC entry 567 (class 1255 OID 18923) +-- Dependencies: 6 1102 1093 +-- Name: st_geometry(box3d_extent); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry(box3d_extent) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_to_LWGEOM'; + + +ALTER FUNCTION public.st_geometry(box3d_extent) OWNER TO postgres; + +-- +-- TOC entry 568 (class 1255 OID 18924) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_above(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_above(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_above'; + + +ALTER FUNCTION public.st_geometry_above(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 569 (class 1255 OID 18925) +-- Dependencies: 6 +-- Name: st_geometry_analyze(internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_analyze(internal) RETURNS boolean + LANGUAGE c STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_analyze'; + + +ALTER FUNCTION public.st_geometry_analyze(internal) OWNER TO postgres; + +-- +-- TOC entry 570 (class 1255 OID 18926) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_below(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_below(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_below'; + + +ALTER FUNCTION public.st_geometry_below(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 571 (class 1255 OID 18927) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_cmp(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_cmp(geometry, geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_cmp'; + + +ALTER FUNCTION public.st_geometry_cmp(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 572 (class 1255 OID 18928) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_contain(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_contain(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_contain'; + + +ALTER FUNCTION public.st_geometry_contain(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 573 (class 1255 OID 18929) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_contained(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_contained(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_contained'; + + +ALTER FUNCTION public.st_geometry_contained(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 574 (class 1255 OID 18930) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_eq(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_eq(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_eq'; + + +ALTER FUNCTION public.st_geometry_eq(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 575 (class 1255 OID 18931) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_ge(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_ge(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_ge'; + + +ALTER FUNCTION public.st_geometry_ge(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 576 (class 1255 OID 18932) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_gt(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_gt(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_gt'; + + +ALTER FUNCTION public.st_geometry_gt(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 577 (class 1255 OID 18933) +-- Dependencies: 6 1102 +-- Name: st_geometry_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_in(cstring) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_in'; + + +ALTER FUNCTION public.st_geometry_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 578 (class 1255 OID 18934) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_le(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_le(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_le'; + + +ALTER FUNCTION public.st_geometry_le(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 579 (class 1255 OID 18935) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_left(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_left(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_left'; + + +ALTER FUNCTION public.st_geometry_left(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 580 (class 1255 OID 18936) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_lt(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_lt(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'lwgeom_lt'; + + +ALTER FUNCTION public.st_geometry_lt(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 581 (class 1255 OID 18937) +-- Dependencies: 6 1102 +-- Name: st_geometry_out(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_out(geometry) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_out'; + + +ALTER FUNCTION public.st_geometry_out(geometry) OWNER TO postgres; + +-- +-- TOC entry 582 (class 1255 OID 18938) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_overabove(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_overabove(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overabove'; + + +ALTER FUNCTION public.st_geometry_overabove(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 583 (class 1255 OID 18939) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_overbelow(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_overbelow(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overbelow'; + + +ALTER FUNCTION public.st_geometry_overbelow(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 584 (class 1255 OID 18940) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_overlap(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_overlap(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overlap'; + + +ALTER FUNCTION public.st_geometry_overlap(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 585 (class 1255 OID 18941) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_overleft(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_overleft(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overleft'; + + +ALTER FUNCTION public.st_geometry_overleft(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 586 (class 1255 OID 18942) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_overright(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_overright(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_overright'; + + +ALTER FUNCTION public.st_geometry_overright(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 587 (class 1255 OID 18943) +-- Dependencies: 6 1102 +-- Name: st_geometry_recv(internal); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_recv(internal) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_recv'; + + +ALTER FUNCTION public.st_geometry_recv(internal) OWNER TO postgres; + +-- +-- TOC entry 588 (class 1255 OID 18944) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_right(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_right(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_right'; + + +ALTER FUNCTION public.st_geometry_right(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 589 (class 1255 OID 18945) +-- Dependencies: 6 1102 1102 +-- Name: st_geometry_same(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_same(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_samebox'; + + +ALTER FUNCTION public.st_geometry_same(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 590 (class 1255 OID 18946) +-- Dependencies: 6 1102 +-- Name: st_geometry_send(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometry_send(geometry) RETURNS bytea + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_send'; + + +ALTER FUNCTION public.st_geometry_send(geometry) OWNER TO postgres; + +-- +-- TOC entry 591 (class 1255 OID 18947) +-- Dependencies: 6 1102 +-- Name: st_geometryfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometryfromtext(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_text'; + + +ALTER FUNCTION public.st_geometryfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 592 (class 1255 OID 18948) +-- Dependencies: 6 1102 +-- Name: st_geometryfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometryfromtext(text, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_text'; + + +ALTER FUNCTION public.st_geometryfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 593 (class 1255 OID 18949) +-- Dependencies: 6 1102 1102 +-- Name: st_geometryn(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometryn(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_geometryn_collection'; + + +ALTER FUNCTION public.st_geometryn(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 594 (class 1255 OID 18950) +-- Dependencies: 6 1102 +-- Name: st_geometrytype(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geometrytype(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geometry_geometrytype'; + + +ALTER FUNCTION public.st_geometrytype(geometry) OWNER TO postgres; + +-- +-- TOC entry 595 (class 1255 OID 18951) +-- Dependencies: 6 1102 +-- Name: st_geomfromewkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomfromewkb(bytea) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOMFromWKB'; + + +ALTER FUNCTION public.st_geomfromewkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 596 (class 1255 OID 18952) +-- Dependencies: 6 1102 +-- Name: st_geomfromewkt(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomfromewkt(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'parse_WKT_lwgeom'; + + +ALTER FUNCTION public.st_geomfromewkt(text) OWNER TO postgres; + +-- +-- TOC entry 597 (class 1255 OID 18953) +-- Dependencies: 6 1102 +-- Name: st_geomfromgml(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomfromgml(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geom_from_gml'; + + +ALTER FUNCTION public.st_geomfromgml(text) OWNER TO postgres; + +-- +-- TOC entry 598 (class 1255 OID 18954) +-- Dependencies: 6 1102 +-- Name: st_geomfromkml(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomfromkml(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geom_from_kml'; + + +ALTER FUNCTION public.st_geomfromkml(text) OWNER TO postgres; + +-- +-- TOC entry 599 (class 1255 OID 18955) +-- Dependencies: 6 1102 +-- Name: st_geomfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomfromtext(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_text'; + + +ALTER FUNCTION public.st_geomfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 600 (class 1255 OID 18956) +-- Dependencies: 6 1102 +-- Name: st_geomfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomfromtext(text, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_text'; + + +ALTER FUNCTION public.st_geomfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 601 (class 1255 OID 18957) +-- Dependencies: 6 1102 +-- Name: st_geomfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomfromwkb(bytea) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_WKB'; + + +ALTER FUNCTION public.st_geomfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 602 (class 1255 OID 18958) +-- Dependencies: 6 1102 +-- Name: st_geomfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_geomfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_SetSRID(ST_GeomFromWKB($1), $2)$_$; + + +ALTER FUNCTION public.st_geomfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 603 (class 1255 OID 18959) +-- Dependencies: 6 1102 +-- Name: st_gmltosql(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_gmltosql(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geom_from_gml'; + + +ALTER FUNCTION public.st_gmltosql(text) OWNER TO postgres; + +-- +-- TOC entry 604 (class 1255 OID 18960) +-- Dependencies: 6 1102 +-- Name: st_hasarc(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_hasarc(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_has_arc'; + + +ALTER FUNCTION public.st_hasarc(geometry) OWNER TO postgres; + +-- +-- TOC entry 605 (class 1255 OID 18961) +-- Dependencies: 6 1102 1102 +-- Name: st_hausdorffdistance(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_hausdorffdistance(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'hausdorffdistance'; + + +ALTER FUNCTION public.st_hausdorffdistance(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 606 (class 1255 OID 18962) +-- Dependencies: 6 1102 1102 +-- Name: st_hausdorffdistance(geometry, geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_hausdorffdistance(geometry, geometry, double precision) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'hausdorffdistancedensify'; + + +ALTER FUNCTION public.st_hausdorffdistance(geometry, geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 607 (class 1255 OID 18963) +-- Dependencies: 6 1096 +-- Name: st_height(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_height(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getHeight'; + + +ALTER FUNCTION public.st_height(chip) OWNER TO postgres; + +-- +-- TOC entry 608 (class 1255 OID 18964) +-- Dependencies: 6 1102 1102 +-- Name: st_interiorringn(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_interiorringn(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_interiorringn_polygon'; + + +ALTER FUNCTION public.st_interiorringn(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 609 (class 1255 OID 18965) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_intersection(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_intersection(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'intersection'; + + +ALTER FUNCTION public.st_intersection(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 610 (class 1255 OID 18966) +-- Dependencies: 6 1099 1099 1099 +-- Name: st_intersection(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_intersection(geography, geography) RETURNS geography + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT geography(ST_Transform(ST_Intersection(ST_Transform(geometry($1), _ST_BestSRID($1, $2)), ST_Transform(geometry($2), _ST_BestSRID($1, $2))), 4326))$_$; + + +ALTER FUNCTION public.st_intersection(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 611 (class 1255 OID 18967) +-- Dependencies: 6 1102 +-- Name: st_intersection(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_intersection(text, text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_Intersection($1::geometry, $2::geometry); $_$; + + +ALTER FUNCTION public.st_intersection(text, text) OWNER TO postgres; + +-- +-- TOC entry 612 (class 1255 OID 18968) +-- Dependencies: 6 1102 1102 +-- Name: st_intersects(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_intersects(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && $2 AND _ST_Intersects($1,$2)$_$; + + +ALTER FUNCTION public.st_intersects(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 613 (class 1255 OID 18969) +-- Dependencies: 6 1099 1099 +-- Name: st_intersects(geography, geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_intersects(geography, geography) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT $1 && $2 AND _ST_Distance($1, $2, 0.0, false) < 0.00001$_$; + + +ALTER FUNCTION public.st_intersects(geography, geography) OWNER TO postgres; + +-- +-- TOC entry 614 (class 1255 OID 18970) +-- Dependencies: 6 +-- Name: st_intersects(text, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_intersects(text, text) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_Intersects($1::geometry, $2::geometry); $_$; + + +ALTER FUNCTION public.st_intersects(text, text) OWNER TO postgres; + +-- +-- TOC entry 615 (class 1255 OID 18971) +-- Dependencies: 6 1102 +-- Name: st_isclosed(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_isclosed(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_isclosed_linestring'; + + +ALTER FUNCTION public.st_isclosed(geometry) OWNER TO postgres; + +-- +-- TOC entry 616 (class 1255 OID 18972) +-- Dependencies: 6 1102 +-- Name: st_isempty(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_isempty(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_isempty'; + + +ALTER FUNCTION public.st_isempty(geometry) OWNER TO postgres; + +-- +-- TOC entry 617 (class 1255 OID 18973) +-- Dependencies: 6 1102 +-- Name: st_isring(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_isring(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'isring'; + + +ALTER FUNCTION public.st_isring(geometry) OWNER TO postgres; + +-- +-- TOC entry 618 (class 1255 OID 18974) +-- Dependencies: 6 1102 +-- Name: st_issimple(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_issimple(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'issimple'; + + +ALTER FUNCTION public.st_issimple(geometry) OWNER TO postgres; + +-- +-- TOC entry 619 (class 1255 OID 18975) +-- Dependencies: 6 1102 +-- Name: st_isvalid(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_isvalid(geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'isvalid'; + + +ALTER FUNCTION public.st_isvalid(geometry) OWNER TO postgres; + +-- +-- TOC entry 620 (class 1255 OID 18976) +-- Dependencies: 6 1102 +-- Name: st_isvalidreason(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_isvalidreason(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'isvalidreason'; + + +ALTER FUNCTION public.st_isvalidreason(geometry) OWNER TO postgres; + +-- +-- TOC entry 621 (class 1255 OID 18977) +-- Dependencies: 6 1102 +-- Name: st_length(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_length(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_length2d_linestring'; + + +ALTER FUNCTION public.st_length(geometry) OWNER TO postgres; + +-- +-- TOC entry 623 (class 1255 OID 18979) +-- Dependencies: 6 1099 +-- Name: st_length(geography); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_length(geography) RETURNS double precision + LANGUAGE sql IMMUTABLE + AS $_$SELECT ST_Length($1, true)$_$; + + +ALTER FUNCTION public.st_length(geography) OWNER TO postgres; + +-- +-- TOC entry 624 (class 1255 OID 18980) +-- Dependencies: 6 +-- Name: st_length(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_length(text) RETURNS double precision + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT ST_Length($1::geometry); $_$; + + +ALTER FUNCTION public.st_length(text) OWNER TO postgres; + +-- +-- TOC entry 622 (class 1255 OID 18978) +-- Dependencies: 6 1099 +-- Name: st_length(geography, boolean); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_length(geography, boolean) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'geography_length'; + + +ALTER FUNCTION public.st_length(geography, boolean) OWNER TO postgres; + +-- +-- TOC entry 625 (class 1255 OID 18981) +-- Dependencies: 6 1102 +-- Name: st_length2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_length2d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_length2d_linestring'; + + +ALTER FUNCTION public.st_length2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 626 (class 1255 OID 18982) +-- Dependencies: 6 1102 1113 +-- Name: st_length2d_spheroid(geometry, spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_length2d_spheroid(geometry, spheroid) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_length2d_ellipsoid'; + + +ALTER FUNCTION public.st_length2d_spheroid(geometry, spheroid) OWNER TO postgres; + +-- +-- TOC entry 627 (class 1255 OID 18983) +-- Dependencies: 6 1102 +-- Name: st_length3d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_length3d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_length_linestring'; + + +ALTER FUNCTION public.st_length3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 628 (class 1255 OID 18984) +-- Dependencies: 6 1102 1113 +-- Name: st_length3d_spheroid(geometry, spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_length3d_spheroid(geometry, spheroid) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_length_ellipsoid_linestring'; + + +ALTER FUNCTION public.st_length3d_spheroid(geometry, spheroid) OWNER TO postgres; + +-- +-- TOC entry 629 (class 1255 OID 18985) +-- Dependencies: 6 1102 1113 +-- Name: st_length_spheroid(geometry, spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_length_spheroid(geometry, spheroid) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'LWGEOM_length_ellipsoid_linestring'; + + +ALTER FUNCTION public.st_length_spheroid(geometry, spheroid) OWNER TO postgres; + +-- +-- TOC entry 630 (class 1255 OID 18986) +-- Dependencies: 6 1102 1102 +-- Name: st_line_interpolate_point(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_line_interpolate_point(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_line_interpolate_point'; + + +ALTER FUNCTION public.st_line_interpolate_point(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 631 (class 1255 OID 18987) +-- Dependencies: 6 1102 1102 +-- Name: st_line_locate_point(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_line_locate_point(geometry, geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_line_locate_point'; + + +ALTER FUNCTION public.st_line_locate_point(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 632 (class 1255 OID 18988) +-- Dependencies: 6 1102 1102 +-- Name: st_line_substring(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_line_substring(geometry, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_line_substring'; + + +ALTER FUNCTION public.st_line_substring(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 633 (class 1255 OID 18989) +-- Dependencies: 6 1102 1102 +-- Name: st_linecrossingdirection(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linecrossingdirection(geometry, geometry) RETURNS integer + LANGUAGE sql IMMUTABLE + AS $_$ SELECT CASE WHEN NOT $1 && $2 THEN 0 ELSE _ST_LineCrossingDirection($1,$2) END $_$; + + +ALTER FUNCTION public.st_linecrossingdirection(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 634 (class 1255 OID 18990) +-- Dependencies: 6 1102 1102 +-- Name: st_linefrommultipoint(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linefrommultipoint(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_line_from_mpoint'; + + +ALTER FUNCTION public.st_linefrommultipoint(geometry) OWNER TO postgres; + +-- +-- TOC entry 635 (class 1255 OID 18991) +-- Dependencies: 6 1102 +-- Name: st_linefromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linefromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = 'LINESTRING' + THEN ST_GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_linefromtext(text) OWNER TO postgres; + +-- +-- TOC entry 636 (class 1255 OID 18992) +-- Dependencies: 6 1102 +-- Name: st_linefromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linefromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = 'LINESTRING' + THEN GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_linefromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 638 (class 1255 OID 18994) +-- Dependencies: 6 1102 +-- Name: st_linefromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linefromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = 'LINESTRING' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_linefromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 637 (class 1255 OID 18993) +-- Dependencies: 6 1102 +-- Name: st_linefromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linefromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = 'LINESTRING' + THEN ST_GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_linefromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 639 (class 1255 OID 18995) +-- Dependencies: 6 1102 1102 +-- Name: st_linemerge(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linemerge(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'linemerge'; + + +ALTER FUNCTION public.st_linemerge(geometry) OWNER TO postgres; + +-- +-- TOC entry 641 (class 1255 OID 18997) +-- Dependencies: 6 1102 +-- Name: st_linestringfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linestringfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'LINESTRING' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_linestringfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 640 (class 1255 OID 18996) +-- Dependencies: 6 1102 +-- Name: st_linestringfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linestringfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = 'LINESTRING' + THEN ST_GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_linestringfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 642 (class 1255 OID 18998) +-- Dependencies: 6 1102 1102 +-- Name: st_linetocurve(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_linetocurve(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_line_desegmentize'; + + +ALTER FUNCTION public.st_linetocurve(geometry) OWNER TO postgres; + +-- +-- TOC entry 643 (class 1255 OID 18999) +-- Dependencies: 6 1102 1102 +-- Name: st_locate_along_measure(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_locate_along_measure(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ SELECT locate_between_measures($1, $2, $2) $_$; + + +ALTER FUNCTION public.st_locate_along_measure(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 644 (class 1255 OID 19000) +-- Dependencies: 6 1102 1102 +-- Name: st_locate_between_measures(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_locate_between_measures(geometry, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_locate_between_m'; + + +ALTER FUNCTION public.st_locate_between_measures(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 645 (class 1255 OID 19001) +-- Dependencies: 6 1102 1102 +-- Name: st_locatebetweenelevations(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_locatebetweenelevations(geometry, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'ST_LocateBetweenElevations'; + + +ALTER FUNCTION public.st_locatebetweenelevations(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 646 (class 1255 OID 19002) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_longestline(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_longestline(geometry, geometry) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_LongestLine(ST_ConvexHull($1), ST_ConvexHull($2))$_$; + + +ALTER FUNCTION public.st_longestline(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 647 (class 1255 OID 19003) +-- Dependencies: 6 1102 +-- Name: st_m(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_m(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_m_point'; + + +ALTER FUNCTION public.st_m(geometry) OWNER TO postgres; + +-- +-- TOC entry 648 (class 1255 OID 19004) +-- Dependencies: 6 1087 1102 1102 +-- Name: st_makebox2d(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makebox2d(geometry, geometry) RETURNS box2d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX2DFLOAT4_construct'; + + +ALTER FUNCTION public.st_makebox2d(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 649 (class 1255 OID 19005) +-- Dependencies: 6 1090 1102 1102 +-- Name: st_makebox3d(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makebox3d(geometry, geometry) RETURNS box3d + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_construct'; + + +ALTER FUNCTION public.st_makebox3d(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 650 (class 1255 OID 19006) +-- Dependencies: 6 1102 +-- Name: st_makeenvelope(double precision, double precision, double precision, double precision, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makeenvelope(double precision, double precision, double precision, double precision, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'ST_MakeEnvelope'; + + +ALTER FUNCTION public.st_makeenvelope(double precision, double precision, double precision, double precision, integer) OWNER TO postgres; + +-- +-- TOC entry 651 (class 1255 OID 19007) +-- Dependencies: 6 1102 1104 +-- Name: st_makeline(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makeline(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makeline_garray'; + + +ALTER FUNCTION public.st_makeline(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 652 (class 1255 OID 19008) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_makeline(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makeline(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makeline'; + + +ALTER FUNCTION public.st_makeline(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 653 (class 1255 OID 19009) +-- Dependencies: 6 1102 1104 +-- Name: st_makeline_garray(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makeline_garray(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makeline_garray'; + + +ALTER FUNCTION public.st_makeline_garray(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 654 (class 1255 OID 19010) +-- Dependencies: 6 1102 +-- Name: st_makepoint(double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makepoint(double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'; + + +ALTER FUNCTION public.st_makepoint(double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 655 (class 1255 OID 19011) +-- Dependencies: 6 1102 +-- Name: st_makepoint(double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makepoint(double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'; + + +ALTER FUNCTION public.st_makepoint(double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 656 (class 1255 OID 19012) +-- Dependencies: 6 1102 +-- Name: st_makepoint(double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makepoint(double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'; + + +ALTER FUNCTION public.st_makepoint(double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 657 (class 1255 OID 19013) +-- Dependencies: 6 1102 +-- Name: st_makepointm(double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makepointm(double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint3dm'; + + +ALTER FUNCTION public.st_makepointm(double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 659 (class 1255 OID 19015) +-- Dependencies: 6 1102 1102 +-- Name: st_makepolygon(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makepolygon(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoly'; + + +ALTER FUNCTION public.st_makepolygon(geometry) OWNER TO postgres; + +-- +-- TOC entry 658 (class 1255 OID 19014) +-- Dependencies: 6 1102 1102 1104 +-- Name: st_makepolygon(geometry, geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_makepolygon(geometry, geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoly'; + + +ALTER FUNCTION public.st_makepolygon(geometry, geometry[]) OWNER TO postgres; + +-- +-- TOC entry 660 (class 1255 OID 19016) +-- Dependencies: 6 1102 1102 +-- Name: st_maxdistance(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_maxdistance(geometry, geometry) RETURNS double precision + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT _ST_MaxDistance(ST_ConvexHull($1), ST_ConvexHull($2))$_$; + + +ALTER FUNCTION public.st_maxdistance(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 661 (class 1255 OID 19017) +-- Dependencies: 6 1102 +-- Name: st_mem_size(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mem_size(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_mem_size'; + + +ALTER FUNCTION public.st_mem_size(geometry) OWNER TO postgres; + +-- +-- TOC entry 663 (class 1255 OID 19020) +-- Dependencies: 6 1102 1102 +-- Name: st_minimumboundingcircle(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_minimumboundingcircle(geometry) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_MinimumBoundingCircle($1, 48)$_$; + + +ALTER FUNCTION public.st_minimumboundingcircle(geometry) OWNER TO postgres; + +-- +-- TOC entry 662 (class 1255 OID 19018) +-- Dependencies: 6 1170 1102 1102 +-- Name: st_minimumboundingcircle(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_minimumboundingcircle(inputgeom geometry, segs_per_quarter integer) RETURNS geometry + LANGUAGE plpgsql IMMUTABLE STRICT + AS $$ + DECLARE + hull GEOMETRY; + ring GEOMETRY; + center GEOMETRY; + radius DOUBLE PRECISION; + dist DOUBLE PRECISION; + d DOUBLE PRECISION; + idx1 integer; + idx2 integer; + l1 GEOMETRY; + l2 GEOMETRY; + p1 GEOMETRY; + p2 GEOMETRY; + a1 DOUBLE PRECISION; + a2 DOUBLE PRECISION; + + + BEGIN + + -- First compute the ConvexHull of the geometry + hull = ST_ConvexHull(inputgeom); + --A point really has no MBC + IF ST_GeometryType(hull) = 'ST_Point' THEN + RETURN hull; + END IF; + -- convert the hull perimeter to a linestring so we can manipulate individual points + --If its already a linestring force it to a closed linestring + ring = CASE WHEN ST_GeometryType(hull) = 'ST_LineString' THEN ST_AddPoint(hull, ST_StartPoint(hull)) ELSE ST_ExteriorRing(hull) END; + + dist = 0; + -- Brute Force - check every pair + FOR i in 1 .. (ST_NumPoints(ring)-2) + LOOP + FOR j in i .. (ST_NumPoints(ring)-1) + LOOP + d = ST_Distance(ST_PointN(ring,i),ST_PointN(ring,j)); + -- Check the distance and update if larger + IF (d > dist) THEN + dist = d; + idx1 = i; + idx2 = j; + END IF; + END LOOP; + END LOOP; + + -- We now have the diameter of the convex hull. The following line returns it if desired. + -- RETURN MakeLine(PointN(ring,idx1),PointN(ring,idx2)); + + -- Now for the Minimum Bounding Circle. Since we know the two points furthest from each + -- other, the MBC must go through those two points. Start with those points as a diameter of a circle. + + -- The radius is half the distance between them and the center is midway between them + radius = ST_Distance(ST_PointN(ring,idx1),ST_PointN(ring,idx2)) / 2.0; + center = ST_Line_interpolate_point(ST_MakeLine(ST_PointN(ring,idx1),ST_PointN(ring,idx2)),0.5); + + -- Loop through each vertex and check if the distance from the center to the point + -- is greater than the current radius. + FOR k in 1 .. (ST_NumPoints(ring)-1) + LOOP + IF(k <> idx1 and k <> idx2) THEN + dist = ST_Distance(center,ST_PointN(ring,k)); + IF (dist > radius) THEN + -- We have to expand the circle. The new circle must pass trhough + -- three points - the two original diameters and this point. + + -- Draw a line from the first diameter to this point + l1 = ST_Makeline(ST_PointN(ring,idx1),ST_PointN(ring,k)); + -- Compute the midpoint + p1 = ST_line_interpolate_point(l1,0.5); + -- Rotate the line 90 degrees around the midpoint (perpendicular bisector) + l1 = ST_Translate(ST_Rotate(ST_Translate(l1,-X(p1),-Y(p1)),pi()/2),X(p1),Y(p1)); + -- Compute the azimuth of the bisector + a1 = ST_Azimuth(ST_PointN(l1,1),ST_PointN(l1,2)); + -- Extend the line in each direction the new computed distance to insure they will intersect + l1 = ST_AddPoint(l1,ST_Makepoint(X(ST_PointN(l1,2))+sin(a1)*dist,Y(ST_PointN(l1,2))+cos(a1)*dist),-1); + l1 = ST_AddPoint(l1,ST_Makepoint(X(ST_PointN(l1,1))-sin(a1)*dist,Y(ST_PointN(l1,1))-cos(a1)*dist),0); + + -- Repeat for the line from the point to the other diameter point + l2 = ST_Makeline(ST_PointN(ring,idx2),ST_PointN(ring,k)); + p2 = ST_Line_interpolate_point(l2,0.5); + l2 = ST_Translate(ST_Rotate(ST_Translate(l2,-X(p2),-Y(p2)),pi()/2),X(p2),Y(p2)); + a2 = ST_Azimuth(ST_PointN(l2,1),ST_PointN(l2,2)); + l2 = ST_AddPoint(l2,ST_Makepoint(X(ST_PointN(l2,2))+sin(a2)*dist,Y(ST_PointN(l2,2))+cos(a2)*dist),-1); + l2 = ST_AddPoint(l2,ST_Makepoint(X(ST_PointN(l2,1))-sin(a2)*dist,Y(ST_PointN(l2,1))-cos(a2)*dist),0); + + -- The new center is the intersection of the two bisectors + center = ST_Intersection(l1,l2); + -- The new radius is the distance to any of the three points + radius = ST_Distance(center,ST_PointN(ring,idx1)); + END IF; + END IF; + END LOOP; + --DONE!! Return the MBC via the buffer command + RETURN ST_Buffer(center,radius,segs_per_quarter); + + END; +$$; + + +ALTER FUNCTION public.st_minimumboundingcircle(inputgeom geometry, segs_per_quarter integer) OWNER TO postgres; + +-- +-- TOC entry 665 (class 1255 OID 19022) +-- Dependencies: 6 1102 +-- Name: st_mlinefromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mlinefromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = 'MULTILINESTRING' + THEN ST_GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mlinefromtext(text) OWNER TO postgres; + +-- +-- TOC entry 664 (class 1255 OID 19021) +-- Dependencies: 6 1102 +-- Name: st_mlinefromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mlinefromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE + WHEN geometrytype(GeomFromText($1, $2)) = 'MULTILINESTRING' + THEN GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mlinefromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 667 (class 1255 OID 19024) +-- Dependencies: 6 1102 +-- Name: st_mlinefromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mlinefromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = 'MULTILINESTRING' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mlinefromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 666 (class 1255 OID 19023) +-- Dependencies: 6 1102 +-- Name: st_mlinefromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mlinefromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = 'MULTILINESTRING' + THEN ST_GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mlinefromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 669 (class 1255 OID 19026) +-- Dependencies: 6 1102 +-- Name: st_mpointfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mpointfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = 'MULTIPOINT' + THEN ST_GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mpointfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 668 (class 1255 OID 19025) +-- Dependencies: 6 1102 +-- Name: st_mpointfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mpointfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromText($1, $2)) = 'MULTIPOINT' + THEN GeomFromText($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mpointfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 672 (class 1255 OID 19028) +-- Dependencies: 6 1102 +-- Name: st_mpointfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mpointfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = 'MULTIPOINT' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mpointfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 671 (class 1255 OID 19027) +-- Dependencies: 6 1102 +-- Name: st_mpointfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mpointfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1, $2)) = 'MULTIPOINT' + THEN GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mpointfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 674 (class 1255 OID 19030) +-- Dependencies: 6 1102 +-- Name: st_mpolyfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mpolyfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = 'MULTIPOLYGON' + THEN ST_GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mpolyfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 673 (class 1255 OID 19029) +-- Dependencies: 6 1102 +-- Name: st_mpolyfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mpolyfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromText($1, $2)) = 'MULTIPOLYGON' + THEN ST_GeomFromText($1,$2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mpolyfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 676 (class 1255 OID 19032) +-- Dependencies: 6 1102 +-- Name: st_mpolyfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mpolyfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = 'MULTIPOLYGON' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mpolyfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 675 (class 1255 OID 19031) +-- Dependencies: 6 1102 +-- Name: st_mpolyfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_mpolyfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = 'MULTIPOLYGON' + THEN ST_GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_mpolyfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 677 (class 1255 OID 19033) +-- Dependencies: 6 1102 1102 +-- Name: st_multi(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multi(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_force_multi'; + + +ALTER FUNCTION public.st_multi(geometry) OWNER TO postgres; + +-- +-- TOC entry 678 (class 1255 OID 19034) +-- Dependencies: 6 1102 +-- Name: st_multilinefromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multilinefromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = 'MULTILINESTRING' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_multilinefromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 679 (class 1255 OID 19035) +-- Dependencies: 6 1102 +-- Name: st_multilinestringfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multilinestringfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_MLineFromText($1)$_$; + + +ALTER FUNCTION public.st_multilinestringfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 680 (class 1255 OID 19036) +-- Dependencies: 6 1102 +-- Name: st_multilinestringfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multilinestringfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT MLineFromText($1, $2)$_$; + + +ALTER FUNCTION public.st_multilinestringfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 681 (class 1255 OID 19037) +-- Dependencies: 6 1102 +-- Name: st_multipointfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multipointfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT MPointFromText($1)$_$; + + +ALTER FUNCTION public.st_multipointfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 683 (class 1255 OID 19039) +-- Dependencies: 6 1102 +-- Name: st_multipointfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multipointfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = 'MULTIPOINT' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_multipointfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 682 (class 1255 OID 19038) +-- Dependencies: 6 1102 +-- Name: st_multipointfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multipointfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1,$2)) = 'MULTIPOINT' + THEN ST_GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_multipointfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 685 (class 1255 OID 19041) +-- Dependencies: 6 1102 +-- Name: st_multipolyfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multipolyfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = 'MULTIPOLYGON' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_multipolyfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 684 (class 1255 OID 19040) +-- Dependencies: 6 1102 +-- Name: st_multipolyfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multipolyfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = 'MULTIPOLYGON' + THEN ST_GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_multipolyfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 687 (class 1255 OID 19043) +-- Dependencies: 6 1102 +-- Name: st_multipolygonfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multipolygonfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT MPolyFromText($1)$_$; + + +ALTER FUNCTION public.st_multipolygonfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 686 (class 1255 OID 19042) +-- Dependencies: 6 1102 +-- Name: st_multipolygonfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_multipolygonfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT MPolyFromText($1, $2)$_$; + + +ALTER FUNCTION public.st_multipolygonfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 688 (class 1255 OID 19044) +-- Dependencies: 6 1102 +-- Name: st_ndims(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_ndims(geometry) RETURNS smallint + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_ndims'; + + +ALTER FUNCTION public.st_ndims(geometry) OWNER TO postgres; + +-- +-- TOC entry 689 (class 1255 OID 19045) +-- Dependencies: 6 1102 +-- Name: st_npoints(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_npoints(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_npoints'; + + +ALTER FUNCTION public.st_npoints(geometry) OWNER TO postgres; + +-- +-- TOC entry 690 (class 1255 OID 19046) +-- Dependencies: 6 1102 +-- Name: st_nrings(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_nrings(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_nrings'; + + +ALTER FUNCTION public.st_nrings(geometry) OWNER TO postgres; + +-- +-- TOC entry 691 (class 1255 OID 19047) +-- Dependencies: 6 1102 +-- Name: st_numgeometries(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_numgeometries(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_numgeometries_collection'; + + +ALTER FUNCTION public.st_numgeometries(geometry) OWNER TO postgres; + +-- +-- TOC entry 692 (class 1255 OID 19048) +-- Dependencies: 6 1102 +-- Name: st_numinteriorring(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_numinteriorring(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_numinteriorrings_polygon'; + + +ALTER FUNCTION public.st_numinteriorring(geometry) OWNER TO postgres; + +-- +-- TOC entry 693 (class 1255 OID 19049) +-- Dependencies: 6 1102 +-- Name: st_numinteriorrings(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_numinteriorrings(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_numinteriorrings_polygon'; + + +ALTER FUNCTION public.st_numinteriorrings(geometry) OWNER TO postgres; + +-- +-- TOC entry 694 (class 1255 OID 19050) +-- Dependencies: 6 1102 +-- Name: st_numpoints(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_numpoints(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_numpoints_linestring'; + + +ALTER FUNCTION public.st_numpoints(geometry) OWNER TO postgres; + +-- +-- TOC entry 695 (class 1255 OID 19051) +-- Dependencies: 6 1102 1102 +-- Name: st_orderingequals(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_orderingequals(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT $1 ~= $2 AND _ST_OrderingEquals($1, $2) + $_$; + + +ALTER FUNCTION public.st_orderingequals(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 696 (class 1255 OID 19052) +-- Dependencies: 6 1102 1102 +-- Name: st_overlaps(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_overlaps(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && $2 AND _ST_Overlaps($1,$2)$_$; + + +ALTER FUNCTION public.st_overlaps(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 697 (class 1255 OID 19053) +-- Dependencies: 6 1102 +-- Name: st_perimeter(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_perimeter(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter2d_poly'; + + +ALTER FUNCTION public.st_perimeter(geometry) OWNER TO postgres; + +-- +-- TOC entry 698 (class 1255 OID 19054) +-- Dependencies: 6 1102 +-- Name: st_perimeter2d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_perimeter2d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter2d_poly'; + + +ALTER FUNCTION public.st_perimeter2d(geometry) OWNER TO postgres; + +-- +-- TOC entry 699 (class 1255 OID 19055) +-- Dependencies: 6 1102 +-- Name: st_perimeter3d(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_perimeter3d(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_perimeter_poly'; + + +ALTER FUNCTION public.st_perimeter3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 700 (class 1255 OID 19056) +-- Dependencies: 6 1102 +-- Name: st_point(double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_point(double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_makepoint'; + + +ALTER FUNCTION public.st_point(double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 701 (class 1255 OID 19057) +-- Dependencies: 6 1102 +-- Name: st_point_inside_circle(geometry, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_point_inside_circle(geometry, double precision, double precision, double precision) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_inside_circle_point'; + + +ALTER FUNCTION public.st_point_inside_circle(geometry, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 702 (class 1255 OID 19058) +-- Dependencies: 6 1102 +-- Name: st_pointfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_pointfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = 'POINT' + THEN ST_GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_pointfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 703 (class 1255 OID 19059) +-- Dependencies: 6 1102 +-- Name: st_pointfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_pointfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromText($1, $2)) = 'POINT' + THEN ST_GeomFromText($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_pointfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 706 (class 1255 OID 19061) +-- Dependencies: 6 1102 +-- Name: st_pointfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_pointfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = 'POINT' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_pointfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 705 (class 1255 OID 19060) +-- Dependencies: 6 1102 +-- Name: st_pointfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_pointfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = 'POINT' + THEN ST_GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_pointfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 707 (class 1255 OID 19062) +-- Dependencies: 6 1102 1102 +-- Name: st_pointn(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_pointn(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_pointn_linestring'; + + +ALTER FUNCTION public.st_pointn(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 708 (class 1255 OID 19063) +-- Dependencies: 6 1102 1102 +-- Name: st_pointonsurface(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_pointonsurface(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'pointonsurface'; + + +ALTER FUNCTION public.st_pointonsurface(geometry) OWNER TO postgres; + +-- +-- TOC entry 709 (class 1255 OID 19064) +-- Dependencies: 6 1102 +-- Name: st_polyfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polyfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromText($1)) = 'POLYGON' + THEN ST_GeomFromText($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_polyfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 710 (class 1255 OID 19065) +-- Dependencies: 6 1102 +-- Name: st_polyfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polyfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromText($1, $2)) = 'POLYGON' + THEN ST_GeomFromText($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_polyfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 712 (class 1255 OID 19067) +-- Dependencies: 6 1102 +-- Name: st_polyfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polyfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1)) = 'POLYGON' + THEN ST_GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_polyfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 711 (class 1255 OID 19066) +-- Dependencies: 6 1102 +-- Name: st_polyfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polyfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1, $2)) = 'POLYGON' + THEN ST_GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_polyfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 713 (class 1255 OID 19068) +-- Dependencies: 6 1102 1102 +-- Name: st_polygon(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polygon(geometry, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT setSRID(makepolygon($1), $2) + $_$; + + +ALTER FUNCTION public.st_polygon(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 715 (class 1255 OID 19070) +-- Dependencies: 6 1102 +-- Name: st_polygonfromtext(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polygonfromtext(text) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_PolyFromText($1)$_$; + + +ALTER FUNCTION public.st_polygonfromtext(text) OWNER TO postgres; + +-- +-- TOC entry 714 (class 1255 OID 19069) +-- Dependencies: 6 1102 +-- Name: st_polygonfromtext(text, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polygonfromtext(text, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT PolyFromText($1, $2)$_$; + + +ALTER FUNCTION public.st_polygonfromtext(text, integer) OWNER TO postgres; + +-- +-- TOC entry 717 (class 1255 OID 19072) +-- Dependencies: 6 1102 +-- Name: st_polygonfromwkb(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polygonfromwkb(bytea) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(GeomFromWKB($1)) = 'POLYGON' + THEN GeomFromWKB($1) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_polygonfromwkb(bytea) OWNER TO postgres; + +-- +-- TOC entry 716 (class 1255 OID 19071) +-- Dependencies: 6 1102 +-- Name: st_polygonfromwkb(bytea, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polygonfromwkb(bytea, integer) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$ + SELECT CASE WHEN geometrytype(ST_GeomFromWKB($1,$2)) = 'POLYGON' + THEN ST_GeomFromWKB($1, $2) + ELSE NULL END + $_$; + + +ALTER FUNCTION public.st_polygonfromwkb(bytea, integer) OWNER TO postgres; + +-- +-- TOC entry 718 (class 1255 OID 19073) +-- Dependencies: 6 1102 1104 +-- Name: st_polygonize(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polygonize(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'polygonize_garray'; + + +ALTER FUNCTION public.st_polygonize(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 719 (class 1255 OID 19074) +-- Dependencies: 6 1102 1104 +-- Name: st_polygonize_garray(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_polygonize_garray(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'polygonize_garray'; + + +ALTER FUNCTION public.st_polygonize_garray(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 720 (class 1255 OID 19075) +-- Dependencies: 6 +-- Name: st_postgis_gist_joinsel(internal, oid, internal, smallint); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_postgis_gist_joinsel(internal, oid, internal, smallint) RETURNS double precision + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_joinsel'; + + +ALTER FUNCTION public.st_postgis_gist_joinsel(internal, oid, internal, smallint) OWNER TO postgres; + +-- +-- TOC entry 721 (class 1255 OID 19076) +-- Dependencies: 6 +-- Name: st_postgis_gist_sel(internal, oid, internal, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_postgis_gist_sel(internal, oid, internal, integer) RETURNS double precision + LANGUAGE c + AS '$libdir/postgis-1.5', 'LWGEOM_gist_sel'; + + +ALTER FUNCTION public.st_postgis_gist_sel(internal, oid, internal, integer) OWNER TO postgres; + +-- +-- TOC entry 722 (class 1255 OID 19077) +-- Dependencies: 6 1102 1102 +-- Name: st_relate(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_relate(geometry, geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'relate_full'; + + +ALTER FUNCTION public.st_relate(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 723 (class 1255 OID 19078) +-- Dependencies: 6 1102 1102 +-- Name: st_relate(geometry, geometry, text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_relate(geometry, geometry, text) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'relate_pattern'; + + +ALTER FUNCTION public.st_relate(geometry, geometry, text) OWNER TO postgres; + +-- +-- TOC entry 724 (class 1255 OID 19079) +-- Dependencies: 6 1102 1102 +-- Name: st_removepoint(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_removepoint(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_removepoint'; + + +ALTER FUNCTION public.st_removepoint(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 725 (class 1255 OID 19080) +-- Dependencies: 6 1102 1102 +-- Name: st_reverse(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_reverse(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_reverse'; + + +ALTER FUNCTION public.st_reverse(geometry) OWNER TO postgres; + +-- +-- TOC entry 726 (class 1255 OID 19081) +-- Dependencies: 6 1102 1102 +-- Name: st_rotate(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_rotate(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT rotateZ($1, $2)$_$; + + +ALTER FUNCTION public.st_rotate(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 727 (class 1255 OID 19082) +-- Dependencies: 6 1102 1102 +-- Name: st_rotatex(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_rotatex(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, 1, 0, 0, 0, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0)$_$; + + +ALTER FUNCTION public.st_rotatex(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 728 (class 1255 OID 19083) +-- Dependencies: 6 1102 1102 +-- Name: st_rotatey(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_rotatey(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, cos($2), 0, sin($2), 0, 1, 0, -sin($2), 0, cos($2), 0, 0, 0)$_$; + + +ALTER FUNCTION public.st_rotatey(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 729 (class 1255 OID 19084) +-- Dependencies: 6 1102 1102 +-- Name: st_rotatez(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_rotatez(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, cos($2), -sin($2), 0, sin($2), cos($2), 0, 0, 0, 1, 0, 0, 0)$_$; + + +ALTER FUNCTION public.st_rotatez(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 731 (class 1255 OID 19086) +-- Dependencies: 6 1102 1102 +-- Name: st_scale(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_scale(geometry, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT scale($1, $2, $3, 1)$_$; + + +ALTER FUNCTION public.st_scale(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 730 (class 1255 OID 19085) +-- Dependencies: 6 1102 1102 +-- Name: st_scale(geometry, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_scale(geometry, double precision, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, $2, 0, 0, 0, $3, 0, 0, 0, $4, 0, 0, 0)$_$; + + +ALTER FUNCTION public.st_scale(geometry, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 732 (class 1255 OID 19087) +-- Dependencies: 6 1102 1102 +-- Name: st_segmentize(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_segmentize(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_segmentize2d'; + + +ALTER FUNCTION public.st_segmentize(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 733 (class 1255 OID 19088) +-- Dependencies: 6 1096 1096 +-- Name: st_setfactor(chip, real); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_setfactor(chip, real) RETURNS chip + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_setFactor'; + + +ALTER FUNCTION public.st_setfactor(chip, real) OWNER TO postgres; + +-- +-- TOC entry 734 (class 1255 OID 19089) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_setpoint(geometry, integer, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_setpoint(geometry, integer, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_setpoint_linestring'; + + +ALTER FUNCTION public.st_setpoint(geometry, integer, geometry) OWNER TO postgres; + +-- +-- TOC entry 735 (class 1255 OID 19090) +-- Dependencies: 6 1102 1102 +-- Name: st_setsrid(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_setsrid(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_setSRID'; + + +ALTER FUNCTION public.st_setsrid(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 736 (class 1255 OID 19091) +-- Dependencies: 6 1102 1102 +-- Name: st_shift_longitude(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_shift_longitude(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_longitude_shift'; + + +ALTER FUNCTION public.st_shift_longitude(geometry) OWNER TO postgres; + +-- +-- TOC entry 737 (class 1255 OID 19092) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_shortestline(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_shortestline(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_shortestline2d'; + + +ALTER FUNCTION public.st_shortestline(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 738 (class 1255 OID 19093) +-- Dependencies: 6 1102 1102 +-- Name: st_simplify(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_simplify(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_simplify2d'; + + +ALTER FUNCTION public.st_simplify(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 739 (class 1255 OID 19094) +-- Dependencies: 6 1102 1102 +-- Name: st_simplifypreservetopology(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_simplifypreservetopology(geometry, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT COST 100 + AS '$libdir/postgis-1.5', 'topologypreservesimplify'; + + +ALTER FUNCTION public.st_simplifypreservetopology(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 740 (class 1255 OID 19097) +-- Dependencies: 6 1102 1102 +-- Name: st_snaptogrid(geometry, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_snaptogrid(geometry, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_SnapToGrid($1, 0, 0, $2, $2)$_$; + + +ALTER FUNCTION public.st_snaptogrid(geometry, double precision) OWNER TO postgres; + +-- +-- TOC entry 704 (class 1255 OID 19096) +-- Dependencies: 6 1102 1102 +-- Name: st_snaptogrid(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_snaptogrid(geometry, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT ST_SnapToGrid($1, 0, 0, $2, $3)$_$; + + +ALTER FUNCTION public.st_snaptogrid(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 670 (class 1255 OID 19095) +-- Dependencies: 6 1102 1102 +-- Name: st_snaptogrid(geometry, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_snaptogrid(geometry, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_snaptogrid'; + + +ALTER FUNCTION public.st_snaptogrid(geometry, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 741 (class 1255 OID 19098) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_snaptogrid(geometry, geometry, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_snaptogrid(geometry, geometry, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_snaptogrid_pointoff'; + + +ALTER FUNCTION public.st_snaptogrid(geometry, geometry, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 742 (class 1255 OID 19099) +-- Dependencies: 6 1113 +-- Name: st_spheroid_in(cstring); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_spheroid_in(cstring) RETURNS spheroid + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'ellipsoid_in'; + + +ALTER FUNCTION public.st_spheroid_in(cstring) OWNER TO postgres; + +-- +-- TOC entry 743 (class 1255 OID 19100) +-- Dependencies: 6 1113 +-- Name: st_spheroid_out(spheroid); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_spheroid_out(spheroid) RETURNS cstring + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'ellipsoid_out'; + + +ALTER FUNCTION public.st_spheroid_out(spheroid) OWNER TO postgres; + +-- +-- TOC entry 744 (class 1255 OID 19101) +-- Dependencies: 6 1096 +-- Name: st_srid(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_srid(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getSRID'; + + +ALTER FUNCTION public.st_srid(chip) OWNER TO postgres; + +-- +-- TOC entry 745 (class 1255 OID 19102) +-- Dependencies: 6 1102 +-- Name: st_srid(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_srid(geometry) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_getSRID'; + + +ALTER FUNCTION public.st_srid(geometry) OWNER TO postgres; + +-- +-- TOC entry 746 (class 1255 OID 19103) +-- Dependencies: 6 1102 1102 +-- Name: st_startpoint(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_startpoint(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_startpoint_linestring'; + + +ALTER FUNCTION public.st_startpoint(geometry) OWNER TO postgres; + +-- +-- TOC entry 747 (class 1255 OID 19104) +-- Dependencies: 6 1102 +-- Name: st_summary(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_summary(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_summary'; + + +ALTER FUNCTION public.st_summary(geometry) OWNER TO postgres; + +-- +-- TOC entry 748 (class 1255 OID 19105) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_symdifference(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_symdifference(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'symdifference'; + + +ALTER FUNCTION public.st_symdifference(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 749 (class 1255 OID 19106) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_symmetricdifference(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_symmetricdifference(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'symdifference'; + + +ALTER FUNCTION public.st_symmetricdifference(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 750 (class 1255 OID 19107) +-- Dependencies: 6 1102 +-- Name: st_text(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_text(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_text'; + + +ALTER FUNCTION public.st_text(geometry) OWNER TO postgres; + +-- +-- TOC entry 751 (class 1255 OID 19108) +-- Dependencies: 6 1102 1102 +-- Name: st_touches(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_touches(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && $2 AND _ST_Touches($1,$2)$_$; + + +ALTER FUNCTION public.st_touches(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 752 (class 1255 OID 19109) +-- Dependencies: 6 1102 1102 +-- Name: st_transform(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_transform(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'transform'; + + +ALTER FUNCTION public.st_transform(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 754 (class 1255 OID 19111) +-- Dependencies: 6 1102 1102 +-- Name: st_translate(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_translate(geometry, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT translate($1, $2, $3, 0)$_$; + + +ALTER FUNCTION public.st_translate(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 753 (class 1255 OID 19110) +-- Dependencies: 6 1102 1102 +-- Name: st_translate(geometry, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_translate(geometry, double precision, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, 1, 0, 0, 0, 1, 0, 0, 0, 1, $2, $3, $4)$_$; + + +ALTER FUNCTION public.st_translate(geometry, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 755 (class 1255 OID 19112) +-- Dependencies: 6 1102 1102 +-- Name: st_transscale(geometry, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_transscale(geometry, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, $4, 0, 0, 0, $5, 0, + 0, 0, 1, $2 * $4, $3 * $5, 0)$_$; + + +ALTER FUNCTION public.st_transscale(geometry, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 757 (class 1255 OID 19114) +-- Dependencies: 6 1102 1104 +-- Name: st_union(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_union(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'pgis_union_geometry_array'; + + +ALTER FUNCTION public.st_union(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 756 (class 1255 OID 19113) +-- Dependencies: 6 1102 1102 1102 +-- Name: st_union(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_union(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'geomunion'; + + +ALTER FUNCTION public.st_union(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 758 (class 1255 OID 19115) +-- Dependencies: 6 1102 1104 +-- Name: st_unite_garray(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_unite_garray(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'pgis_union_geometry_array'; + + +ALTER FUNCTION public.st_unite_garray(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 759 (class 1255 OID 19116) +-- Dependencies: 6 1096 +-- Name: st_width(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_width(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getWidth'; + + +ALTER FUNCTION public.st_width(chip) OWNER TO postgres; + +-- +-- TOC entry 760 (class 1255 OID 19117) +-- Dependencies: 6 1102 1102 +-- Name: st_within(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_within(geometry, geometry) RETURNS boolean + LANGUAGE sql IMMUTABLE + AS $_$SELECT $1 && $2 AND _ST_Within($1,$2)$_$; + + +ALTER FUNCTION public.st_within(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 761 (class 1255 OID 19118) +-- Dependencies: 6 1102 +-- Name: st_wkbtosql(bytea); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_wkbtosql(bytea) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_WKB'; + + +ALTER FUNCTION public.st_wkbtosql(bytea) OWNER TO postgres; + +-- +-- TOC entry 762 (class 1255 OID 19119) +-- Dependencies: 6 1102 +-- Name: st_wkttosql(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_wkttosql(text) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_from_text'; + + +ALTER FUNCTION public.st_wkttosql(text) OWNER TO postgres; + +-- +-- TOC entry 763 (class 1255 OID 19120) +-- Dependencies: 6 1102 +-- Name: st_x(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_x(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_x_point'; + + +ALTER FUNCTION public.st_x(geometry) OWNER TO postgres; + +-- +-- TOC entry 764 (class 1255 OID 19121) +-- Dependencies: 6 1090 +-- Name: st_xmax(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_xmax(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_xmax'; + + +ALTER FUNCTION public.st_xmax(box3d) OWNER TO postgres; + +-- +-- TOC entry 765 (class 1255 OID 19122) +-- Dependencies: 6 1090 +-- Name: st_xmin(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_xmin(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_xmin'; + + +ALTER FUNCTION public.st_xmin(box3d) OWNER TO postgres; + +-- +-- TOC entry 766 (class 1255 OID 19123) +-- Dependencies: 6 1102 +-- Name: st_y(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_y(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_y_point'; + + +ALTER FUNCTION public.st_y(geometry) OWNER TO postgres; + +-- +-- TOC entry 767 (class 1255 OID 19124) +-- Dependencies: 6 1090 +-- Name: st_ymax(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_ymax(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_ymax'; + + +ALTER FUNCTION public.st_ymax(box3d) OWNER TO postgres; + +-- +-- TOC entry 768 (class 1255 OID 19125) +-- Dependencies: 6 1090 +-- Name: st_ymin(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_ymin(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_ymin'; + + +ALTER FUNCTION public.st_ymin(box3d) OWNER TO postgres; + +-- +-- TOC entry 769 (class 1255 OID 19126) +-- Dependencies: 6 1102 +-- Name: st_z(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_z(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_z_point'; + + +ALTER FUNCTION public.st_z(geometry) OWNER TO postgres; + +-- +-- TOC entry 770 (class 1255 OID 19127) +-- Dependencies: 6 1090 +-- Name: st_zmax(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_zmax(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_zmax'; + + +ALTER FUNCTION public.st_zmax(box3d) OWNER TO postgres; + +-- +-- TOC entry 771 (class 1255 OID 19128) +-- Dependencies: 6 1102 +-- Name: st_zmflag(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_zmflag(geometry) RETURNS smallint + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_zmflag'; + + +ALTER FUNCTION public.st_zmflag(geometry) OWNER TO postgres; + +-- +-- TOC entry 772 (class 1255 OID 19129) +-- Dependencies: 6 1090 +-- Name: st_zmin(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION st_zmin(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_zmin'; + + +ALTER FUNCTION public.st_zmin(box3d) OWNER TO postgres; + +-- +-- TOC entry 773 (class 1255 OID 19130) +-- Dependencies: 6 1102 1102 +-- Name: startpoint(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION startpoint(geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_startpoint_linestring'; + + +ALTER FUNCTION public.startpoint(geometry) OWNER TO postgres; + +-- +-- TOC entry 774 (class 1255 OID 19131) +-- Dependencies: 6 1102 +-- Name: summary(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION summary(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_summary'; + + +ALTER FUNCTION public.summary(geometry) OWNER TO postgres; + +-- +-- TOC entry 775 (class 1255 OID 19132) +-- Dependencies: 6 1102 1102 1102 +-- Name: symdifference(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION symdifference(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'symdifference'; + + +ALTER FUNCTION public.symdifference(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 776 (class 1255 OID 19133) +-- Dependencies: 6 1102 1102 1102 +-- Name: symmetricdifference(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION symmetricdifference(geometry, geometry) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'symdifference'; + + +ALTER FUNCTION public.symmetricdifference(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 777 (class 1255 OID 19134) +-- Dependencies: 6 1102 +-- Name: text(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION text(geometry) RETURNS text + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_to_text'; + + +ALTER FUNCTION public.text(geometry) OWNER TO postgres; + +-- +-- TOC entry 778 (class 1255 OID 19135) +-- Dependencies: 6 1102 1102 +-- Name: touches(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION touches(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'touches'; + + +ALTER FUNCTION public.touches(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 779 (class 1255 OID 19136) +-- Dependencies: 6 1102 1102 +-- Name: transform(geometry, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION transform(geometry, integer) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'transform'; + + +ALTER FUNCTION public.transform(geometry, integer) OWNER TO postgres; + +-- +-- TOC entry 781 (class 1255 OID 19138) +-- Dependencies: 6 1102 1102 +-- Name: translate(geometry, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION translate(geometry, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT translate($1, $2, $3, 0)$_$; + + +ALTER FUNCTION public.translate(geometry, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 780 (class 1255 OID 19137) +-- Dependencies: 6 1102 1102 +-- Name: translate(geometry, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION translate(geometry, double precision, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, 1, 0, 0, 0, 1, 0, 0, 0, 1, $2, $3, $4)$_$; + + +ALTER FUNCTION public.translate(geometry, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 782 (class 1255 OID 19139) +-- Dependencies: 6 1102 1102 +-- Name: transscale(geometry, double precision, double precision, double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION transscale(geometry, double precision, double precision, double precision, double precision) RETURNS geometry + LANGUAGE sql IMMUTABLE STRICT + AS $_$SELECT affine($1, $4, 0, 0, 0, $5, 0, + 0, 0, 1, $2 * $4, $3 * $5, 0)$_$; + + +ALTER FUNCTION public.transscale(geometry, double precision, double precision, double precision, double precision) OWNER TO postgres; + +-- +-- TOC entry 783 (class 1255 OID 19140) +-- Dependencies: 6 1102 1104 +-- Name: unite_garray(geometry[]); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION unite_garray(geometry[]) RETURNS geometry + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'pgis_union_geometry_array'; + + +ALTER FUNCTION public.unite_garray(geometry[]) OWNER TO postgres; + +-- +-- TOC entry 784 (class 1255 OID 19141) +-- Dependencies: 6 1170 +-- Name: unlockrows(text); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION unlockrows(text) RETURNS integer + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + ret int; +BEGIN + + IF NOT LongTransactionsEnabled() THEN + RAISE EXCEPTION 'Long transaction support disabled, use EnableLongTransaction() to enable.'; + END IF; + + EXECUTE 'DELETE FROM authorization_table where authid = ' || + quote_literal($1); + + GET DIAGNOSTICS ret = ROW_COUNT; + + RETURN ret; +END; +$_$; + + +ALTER FUNCTION public.unlockrows(text) OWNER TO postgres; + +-- +-- TOC entry 787 (class 1255 OID 19144) +-- Dependencies: 6 1170 +-- Name: updategeometrysrid(character varying, character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION updategeometrysrid(character varying, character varying, integer) RETURNS text + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + ret text; +BEGIN + SELECT UpdateGeometrySRID('','',$1,$2,$3) into ret; + RETURN ret; +END; +$_$; + + +ALTER FUNCTION public.updategeometrysrid(character varying, character varying, integer) OWNER TO postgres; + +-- +-- TOC entry 786 (class 1255 OID 19143) +-- Dependencies: 6 1170 +-- Name: updategeometrysrid(character varying, character varying, character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION updategeometrysrid(character varying, character varying, character varying, integer) RETURNS text + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + ret text; +BEGIN + SELECT UpdateGeometrySRID('',$1,$2,$3,$4) into ret; + RETURN ret; +END; +$_$; + + +ALTER FUNCTION public.updategeometrysrid(character varying, character varying, character varying, integer) OWNER TO postgres; + +-- +-- TOC entry 785 (class 1255 OID 19142) +-- Dependencies: 6 1170 +-- Name: updategeometrysrid(character varying, character varying, character varying, character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION updategeometrysrid(character varying, character varying, character varying, character varying, integer) RETURNS text + LANGUAGE plpgsql STRICT + AS $_$ +DECLARE + catalog_name alias for $1; + schema_name alias for $2; + table_name alias for $3; + column_name alias for $4; + new_srid alias for $5; + myrec RECORD; + okay boolean; + cname varchar; + real_schema name; + +BEGIN + + + -- Find, check or fix schema_name + IF ( schema_name != '' ) THEN + okay = 'f'; + + FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP + okay := 't'; + END LOOP; + + IF ( okay <> 't' ) THEN + RAISE EXCEPTION 'Invalid schema name'; + ELSE + real_schema = schema_name; + END IF; + ELSE + SELECT INTO real_schema current_schema()::text; + END IF; + + -- Find out if the column is in the geometry_columns table + okay = 'f'; + FOR myrec IN SELECT * from geometry_columns where f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP + okay := 't'; + END LOOP; + IF (okay <> 't') THEN + RAISE EXCEPTION 'column not found in geometry_columns table'; + RETURN 'f'; + END IF; + + -- Update ref from geometry_columns table + EXECUTE 'UPDATE geometry_columns SET SRID = ' || new_srid::text || + ' where f_table_schema = ' || + quote_literal(real_schema) || ' and f_table_name = ' || + quote_literal(table_name) || ' and f_geometry_column = ' || + quote_literal(column_name); + + -- Make up constraint name + cname = 'enforce_srid_' || column_name; + + -- Drop enforce_srid constraint + EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || + '.' || quote_ident(table_name) || + ' DROP constraint ' || quote_ident(cname); + + -- Update geometries SRID + EXECUTE 'UPDATE ' || quote_ident(real_schema) || + '.' || quote_ident(table_name) || + ' SET ' || quote_ident(column_name) || + ' = setSRID(' || quote_ident(column_name) || + ', ' || new_srid::text || ')'; + + -- Reset enforce_srid constraint + EXECUTE 'ALTER TABLE ' || quote_ident(real_schema) || + '.' || quote_ident(table_name) || + ' ADD constraint ' || quote_ident(cname) || + ' CHECK (srid(' || quote_ident(column_name) || + ') = ' || new_srid::text || ')'; + + RETURN real_schema || '.' || table_name || '.' || column_name ||' SRID changed to ' || new_srid::text; + +END; +$_$; + + +ALTER FUNCTION public.updategeometrysrid(character varying, character varying, character varying, character varying, integer) OWNER TO postgres; + +-- +-- TOC entry 788 (class 1255 OID 19145) +-- Dependencies: 6 1096 +-- Name: width(chip); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION width(chip) RETURNS integer + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'CHIP_getWidth'; + + +ALTER FUNCTION public.width(chip) OWNER TO postgres; + +-- +-- TOC entry 789 (class 1255 OID 19146) +-- Dependencies: 6 1102 1102 +-- Name: within(geometry, geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION within(geometry, geometry) RETURNS boolean + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'within'; + + +ALTER FUNCTION public.within(geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 790 (class 1255 OID 19147) +-- Dependencies: 6 1102 +-- Name: x(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION x(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_x_point'; + + +ALTER FUNCTION public.x(geometry) OWNER TO postgres; + +-- +-- TOC entry 791 (class 1255 OID 19148) +-- Dependencies: 6 1090 +-- Name: xmax(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION xmax(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_xmax'; + + +ALTER FUNCTION public.xmax(box3d) OWNER TO postgres; + +-- +-- TOC entry 792 (class 1255 OID 19149) +-- Dependencies: 6 1090 +-- Name: xmin(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION xmin(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_xmin'; + + +ALTER FUNCTION public.xmin(box3d) OWNER TO postgres; + +-- +-- TOC entry 793 (class 1255 OID 19150) +-- Dependencies: 6 1102 +-- Name: y(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION y(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_y_point'; + + +ALTER FUNCTION public.y(geometry) OWNER TO postgres; + +-- +-- TOC entry 794 (class 1255 OID 19151) +-- Dependencies: 6 1090 +-- Name: ymax(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION ymax(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_ymax'; + + +ALTER FUNCTION public.ymax(box3d) OWNER TO postgres; + +-- +-- TOC entry 795 (class 1255 OID 19152) +-- Dependencies: 6 1090 +-- Name: ymin(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION ymin(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_ymin'; + + +ALTER FUNCTION public.ymin(box3d) OWNER TO postgres; + +-- +-- TOC entry 796 (class 1255 OID 19153) +-- Dependencies: 6 1102 +-- Name: z(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION z(geometry) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_z_point'; + + +ALTER FUNCTION public.z(geometry) OWNER TO postgres; + +-- +-- TOC entry 797 (class 1255 OID 19154) +-- Dependencies: 6 1090 +-- Name: zmax(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION zmax(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_zmax'; + + +ALTER FUNCTION public.zmax(box3d) OWNER TO postgres; + +-- +-- TOC entry 798 (class 1255 OID 19155) +-- Dependencies: 6 1102 +-- Name: zmflag(geometry); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION zmflag(geometry) RETURNS smallint + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'LWGEOM_zmflag'; + + +ALTER FUNCTION public.zmflag(geometry) OWNER TO postgres; + +-- +-- TOC entry 799 (class 1255 OID 19156) +-- Dependencies: 6 1090 +-- Name: zmin(box3d); Type: FUNCTION; Schema: public; Owner: postgres +-- + +CREATE FUNCTION zmin(box3d) RETURNS double precision + LANGUAGE c IMMUTABLE STRICT + AS '$libdir/postgis-1.5', 'BOX3D_zmin'; + + +ALTER FUNCTION public.zmin(box3d) OWNER TO postgres; + +-- +-- TOC entry 1175 (class 1255 OID 19157) +-- Dependencies: 6 1104 1102 330 329 +-- Name: accum(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE accum(geometry) ( + SFUNC = pgis_geometry_accum_transfn, + STYPE = pgis_abs, + FINALFUNC = pgis_geometry_accum_finalfn +); + + +ALTER AGGREGATE public.accum(geometry) OWNER TO postgres; + +-- +-- TOC entry 1176 (class 1255 OID 19158) +-- Dependencies: 6 1102 1102 330 331 +-- Name: collect(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE collect(geometry) ( + SFUNC = pgis_geometry_accum_transfn, + STYPE = pgis_abs, + FINALFUNC = pgis_geometry_collect_finalfn +); + + +ALTER AGGREGATE public.collect(geometry) OWNER TO postgres; + +-- +-- TOC entry 1177 (class 1255 OID 19159) +-- Dependencies: 6 1093 1102 500 +-- Name: extent(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE extent(geometry) ( + SFUNC = public.st_combine_bbox, + STYPE = box3d_extent +); + + +ALTER AGGREGATE public.extent(geometry) OWNER TO postgres; + +-- +-- TOC entry 1178 (class 1255 OID 19160) +-- Dependencies: 6 1090 1102 124 +-- Name: extent3d(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE extent3d(geometry) ( + SFUNC = public.combine_bbox, + STYPE = box3d +); + + +ALTER AGGREGATE public.extent3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 1179 (class 1255 OID 19161) +-- Dependencies: 6 1102 1102 330 332 +-- Name: makeline(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE makeline(geometry) ( + SFUNC = pgis_geometry_accum_transfn, + STYPE = pgis_abs, + FINALFUNC = pgis_geometry_makeline_finalfn +); + + +ALTER AGGREGATE public.makeline(geometry) OWNER TO postgres; + +-- +-- TOC entry 1180 (class 1255 OID 19162) +-- Dependencies: 6 1102 1102 496 +-- Name: memcollect(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE memcollect(geometry) ( + SFUNC = public.st_collect, + STYPE = geometry +); + + +ALTER AGGREGATE public.memcollect(geometry) OWNER TO postgres; + +-- +-- TOC entry 1181 (class 1255 OID 19163) +-- Dependencies: 1102 6 1102 231 +-- Name: memgeomunion(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE memgeomunion(geometry) ( + SFUNC = geomunion, + STYPE = geometry +); + + +ALTER AGGREGATE public.memgeomunion(geometry) OWNER TO postgres; + +-- +-- TOC entry 1182 (class 1255 OID 19164) +-- Dependencies: 333 6 1102 1102 330 +-- Name: polygonize(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE polygonize(geometry) ( + SFUNC = pgis_geometry_accum_transfn, + STYPE = pgis_abs, + FINALFUNC = pgis_geometry_polygonize_finalfn +); + + +ALTER AGGREGATE public.polygonize(geometry) OWNER TO postgres; + +-- +-- TOC entry 1183 (class 1255 OID 19165) +-- Dependencies: 1104 1102 329 330 6 +-- Name: st_accum(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE st_accum(geometry) ( + SFUNC = pgis_geometry_accum_transfn, + STYPE = pgis_abs, + FINALFUNC = pgis_geometry_accum_finalfn +); + + +ALTER AGGREGATE public.st_accum(geometry) OWNER TO postgres; + +-- +-- TOC entry 1184 (class 1255 OID 19166) +-- Dependencies: 330 331 1102 1102 6 +-- Name: st_collect(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE st_collect(geometry) ( + SFUNC = pgis_geometry_accum_transfn, + STYPE = pgis_abs, + FINALFUNC = pgis_geometry_collect_finalfn +); + + +ALTER AGGREGATE public.st_collect(geometry) OWNER TO postgres; + +-- +-- TOC entry 1185 (class 1255 OID 19167) +-- Dependencies: 1102 6 1093 500 +-- Name: st_extent(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE st_extent(geometry) ( + SFUNC = public.st_combine_bbox, + STYPE = box3d_extent +); + + +ALTER AGGREGATE public.st_extent(geometry) OWNER TO postgres; + +-- +-- TOC entry 1171 (class 1255 OID 19168) +-- Dependencies: 1090 6 1102 501 +-- Name: st_extent3d(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE st_extent3d(geometry) ( + SFUNC = public.st_combine_bbox, + STYPE = box3d +); + + +ALTER AGGREGATE public.st_extent3d(geometry) OWNER TO postgres; + +-- +-- TOC entry 1172 (class 1255 OID 19169) +-- Dependencies: 1102 330 332 6 1102 +-- Name: st_makeline(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE st_makeline(geometry) ( + SFUNC = pgis_geometry_accum_transfn, + STYPE = pgis_abs, + FINALFUNC = pgis_geometry_makeline_finalfn +); + + +ALTER AGGREGATE public.st_makeline(geometry) OWNER TO postgres; + +-- +-- TOC entry 1173 (class 1255 OID 19170) +-- Dependencies: 1102 6 496 1102 +-- Name: st_memcollect(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE st_memcollect(geometry) ( + SFUNC = public.st_collect, + STYPE = geometry +); + + +ALTER AGGREGATE public.st_memcollect(geometry) OWNER TO postgres; + +-- +-- TOC entry 1174 (class 1255 OID 19171) +-- Dependencies: 756 6 1102 1102 +-- Name: st_memunion(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE st_memunion(geometry) ( + SFUNC = public.st_union, + STYPE = geometry +); + + +ALTER AGGREGATE public.st_memunion(geometry) OWNER TO postgres; + +-- +-- TOC entry 1186 (class 1255 OID 19172) +-- Dependencies: 1102 6 1102 330 333 +-- Name: st_polygonize(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE st_polygonize(geometry) ( + SFUNC = pgis_geometry_accum_transfn, + STYPE = pgis_abs, + FINALFUNC = pgis_geometry_polygonize_finalfn +); + + +ALTER AGGREGATE public.st_polygonize(geometry) OWNER TO postgres; + +-- +-- TOC entry 1187 (class 1255 OID 19173) +-- Dependencies: 334 330 1102 6 1102 +-- Name: st_union(geometry); Type: AGGREGATE; Schema: public; Owner: postgres +-- + +CREATE AGGREGATE st_union(geometry) ( + SFUNC = pgis_geometry_accum_transfn, + STYPE = pgis_abs, + FINALFUNC = pgis_geometry_union_finalfn +); + + +ALTER AGGREGATE public.st_union(geometry) OWNER TO postgres; + +-- +-- TOC entry 1893 (class 2617 OID 19174) +-- Dependencies: 1102 6 207 208 215 1102 +-- Name: &&; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR && ( + PROCEDURE = geometry_overlap, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = &&, + RESTRICT = geometry_gist_sel, + JOIN = geometry_gist_joinsel +); + + +ALTER OPERATOR public.&& (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1894 (class 2617 OID 19175) +-- Dependencies: 1099 6 176 180 185 1099 +-- Name: &&; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR && ( + PROCEDURE = geography_overlaps, + LEFTARG = geography, + RIGHTARG = geography, + COMMUTATOR = &&, + RESTRICT = geography_gist_selectivity, + JOIN = geography_gist_join_selectivity +); + + +ALTER OPERATOR public.&& (geography, geography) OWNER TO postgres; + +-- +-- TOC entry 1895 (class 2617 OID 19177) +-- Dependencies: 1102 216 6 1102 +-- Name: &<; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR &< ( + PROCEDURE = geometry_overleft, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = &>, + RESTRICT = positionsel, + JOIN = positionjoinsel +); + + +ALTER OPERATOR public.&< (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1896 (class 2617 OID 19179) +-- Dependencies: 1102 214 6 1102 +-- Name: &<|; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR &<| ( + PROCEDURE = geometry_overbelow, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = |&>, + RESTRICT = positionsel, + JOIN = positionjoinsel +); + + +ALTER OPERATOR public.&<| (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1897 (class 2617 OID 19176) +-- Dependencies: 6 217 1102 1102 +-- Name: &>; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR &> ( + PROCEDURE = geometry_overright, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = &<, + RESTRICT = positionsel, + JOIN = positionjoinsel +); + + +ALTER OPERATOR public.&> (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1898 (class 2617 OID 19182) +-- Dependencies: 212 6 1102 1102 +-- Name: <; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR < ( + PROCEDURE = geometry_lt, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = >, + NEGATOR = >=, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.< (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1901 (class 2617 OID 19185) +-- Dependencies: 6 184 1099 1099 +-- Name: <; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR < ( + PROCEDURE = geography_lt, + LEFTARG = geography, + RIGHTARG = geography, + COMMUTATOR = >, + NEGATOR = >=, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.< (geography, geography) OWNER TO postgres; + +-- +-- TOC entry 1902 (class 2617 OID 19187) +-- Dependencies: 6 211 1102 1102 +-- Name: <<; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR << ( + PROCEDURE = geometry_left, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = >>, + RESTRICT = positionsel, + JOIN = positionjoinsel +); + + +ALTER OPERATOR public.<< (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1903 (class 2617 OID 19189) +-- Dependencies: 1102 1102 201 6 +-- Name: <<|; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR <<| ( + PROCEDURE = geometry_below, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = |>>, + RESTRICT = positionsel, + JOIN = positionjoinsel +); + + +ALTER OPERATOR public.<<| (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1904 (class 2617 OID 19190) +-- Dependencies: 6 210 1102 1102 +-- Name: <=; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR <= ( + PROCEDURE = geometry_le, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = >=, + NEGATOR = >, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.<= (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1905 (class 2617 OID 19191) +-- Dependencies: 1099 1099 183 6 +-- Name: <=; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR <= ( + PROCEDURE = geography_le, + LEFTARG = geography, + RIGHTARG = geography, + COMMUTATOR = >=, + NEGATOR = >, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.<= (geography, geography) OWNER TO postgres; + +-- +-- TOC entry 1906 (class 2617 OID 19192) +-- Dependencies: 205 1102 6 1102 +-- Name: =; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR = ( + PROCEDURE = geometry_eq, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = =, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.= (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1907 (class 2617 OID 19193) +-- Dependencies: 171 1099 6 1099 +-- Name: =; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR = ( + PROCEDURE = geography_eq, + LEFTARG = geography, + RIGHTARG = geography, + COMMUTATOR = =, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.= (geography, geography) OWNER TO postgres; + +-- +-- TOC entry 1899 (class 2617 OID 19180) +-- Dependencies: 1102 209 1102 6 +-- Name: >; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR > ( + PROCEDURE = geometry_gt, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = <, + NEGATOR = <=, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.> (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1908 (class 2617 OID 19183) +-- Dependencies: 6 182 1099 1099 +-- Name: >; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR > ( + PROCEDURE = geography_gt, + LEFTARG = geography, + RIGHTARG = geography, + COMMUTATOR = <, + NEGATOR = <=, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.> (geography, geography) OWNER TO postgres; + +-- +-- TOC entry 1909 (class 2617 OID 19181) +-- Dependencies: 6 206 1102 1102 +-- Name: >=; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR >= ( + PROCEDURE = geometry_ge, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = <=, + NEGATOR = <, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.>= (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1910 (class 2617 OID 19184) +-- Dependencies: 6 172 1099 1099 +-- Name: >=; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR >= ( + PROCEDURE = geography_ge, + LEFTARG = geography, + RIGHTARG = geography, + COMMUTATOR = <=, + NEGATOR = <, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.>= (geography, geography) OWNER TO postgres; + +-- +-- TOC entry 1911 (class 2617 OID 19186) +-- Dependencies: 1102 1102 218 6 +-- Name: >>; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR >> ( + PROCEDURE = geometry_right, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = <<, + RESTRICT = positionsel, + JOIN = positionjoinsel +); + + +ALTER OPERATOR public.>> (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1912 (class 2617 OID 19195) +-- Dependencies: 6 204 1102 1102 +-- Name: @; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR @ ( + PROCEDURE = geometry_contained, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = ~, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.@ (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1900 (class 2617 OID 19178) +-- Dependencies: 6 1102 213 1102 +-- Name: |&>; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR |&> ( + PROCEDURE = geometry_overabove, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = &<|, + RESTRICT = positionsel, + JOIN = positionjoinsel +); + + +ALTER OPERATOR public.|&> (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1913 (class 2617 OID 19188) +-- Dependencies: 200 6 1102 1102 +-- Name: |>>; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR |>> ( + PROCEDURE = geometry_above, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = <<|, + RESTRICT = positionsel, + JOIN = positionjoinsel +); + + +ALTER OPERATOR public.|>> (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1914 (class 2617 OID 19194) +-- Dependencies: 203 1102 1102 6 +-- Name: ~; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR ~ ( + PROCEDURE = geometry_contain, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = @, + RESTRICT = contsel, + JOIN = contjoinsel +); + + +ALTER OPERATOR public.~ (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 1915 (class 2617 OID 19196) +-- Dependencies: 6 1102 1102 220 +-- Name: ~=; Type: OPERATOR; Schema: public; Owner: postgres +-- + +CREATE OPERATOR ~= ( + PROCEDURE = geometry_samebox, + LEFTARG = geometry, + RIGHTARG = geometry, + COMMUTATOR = ~=, + RESTRICT = eqsel, + JOIN = eqjoinsel +); + + +ALTER OPERATOR public.~= (geometry, geometry) OWNER TO postgres; + +-- +-- TOC entry 2028 (class 2616 OID 19198) +-- Dependencies: 6 1099 2139 +-- Name: btree_geography_ops; Type: OPERATOR CLASS; Schema: public; Owner: postgres +-- + +CREATE OPERATOR CLASS btree_geography_ops + DEFAULT FOR TYPE geography USING btree AS + OPERATOR 1 <(geography,geography) , + OPERATOR 2 <=(geography,geography) , + OPERATOR 3 =(geography,geography) , + OPERATOR 4 >=(geography,geography) , + OPERATOR 5 >(geography,geography) , + FUNCTION 1 geography_cmp(geography,geography); + + +ALTER OPERATOR CLASS public.btree_geography_ops USING btree OWNER TO postgres; + +-- +-- TOC entry 2029 (class 2616 OID 19206) +-- Dependencies: 6 1102 2140 +-- Name: btree_geometry_ops; Type: OPERATOR CLASS; Schema: public; Owner: postgres +-- + +CREATE OPERATOR CLASS btree_geometry_ops + DEFAULT FOR TYPE geometry USING btree AS + OPERATOR 1 <(geometry,geometry) , + OPERATOR 2 <=(geometry,geometry) , + OPERATOR 3 =(geometry,geometry) , + OPERATOR 4 >=(geometry,geometry) , + OPERATOR 5 >(geometry,geometry) , + FUNCTION 1 geometry_cmp(geometry,geometry); + + +ALTER OPERATOR CLASS public.btree_geometry_ops USING btree OWNER TO postgres; + +-- +-- TOC entry 2030 (class 2616 OID 19214) +-- Dependencies: 2141 6 1107 1099 +-- Name: gist_geography_ops; Type: OPERATOR CLASS; Schema: public; Owner: postgres +-- + +CREATE OPERATOR CLASS gist_geography_ops + DEFAULT FOR TYPE geography USING gist AS + STORAGE gidx , + OPERATOR 3 &&(geography,geography) , + FUNCTION 1 geography_gist_consistent(internal,geometry,integer) , + FUNCTION 2 geography_gist_union(bytea,internal) , + FUNCTION 3 geography_gist_compress(internal) , + FUNCTION 4 geography_gist_decompress(internal) , + FUNCTION 5 geography_gist_penalty(internal,internal,internal) , + FUNCTION 6 geography_gist_picksplit(internal,internal) , + FUNCTION 7 geography_gist_same(box2d,box2d,internal); + + +ALTER OPERATOR CLASS public.gist_geography_ops USING gist OWNER TO postgres; + +-- +-- TOC entry 2031 (class 2616 OID 19224) +-- Dependencies: 1102 6 2142 1087 +-- Name: gist_geometry_ops; Type: OPERATOR CLASS; Schema: public; Owner: postgres +-- + +CREATE OPERATOR CLASS gist_geometry_ops + DEFAULT FOR TYPE geometry USING gist AS + STORAGE box2d , + OPERATOR 1 <<(geometry,geometry) , + OPERATOR 2 &<(geometry,geometry) , + OPERATOR 3 &&(geometry,geometry) , + OPERATOR 4 &>(geometry,geometry) , + OPERATOR 5 >>(geometry,geometry) , + OPERATOR 6 ~=(geometry,geometry) , + OPERATOR 7 ~(geometry,geometry) , + OPERATOR 8 @(geometry,geometry) , + OPERATOR 9 &<|(geometry,geometry) , + OPERATOR 10 <<|(geometry,geometry) , + OPERATOR 11 |>>(geometry,geometry) , + OPERATOR 12 |&>(geometry,geometry) , + FUNCTION 1 lwgeom_gist_consistent(internal,geometry,integer) , + FUNCTION 2 lwgeom_gist_union(bytea,internal) , + FUNCTION 3 lwgeom_gist_compress(internal) , + FUNCTION 4 lwgeom_gist_decompress(internal) , + FUNCTION 5 lwgeom_gist_penalty(internal,internal,internal) , + FUNCTION 6 lwgeom_gist_picksplit(internal,internal) , + FUNCTION 7 lwgeom_gist_same(box2d,box2d,internal); + + +ALTER OPERATOR CLASS public.gist_geometry_ops USING gist OWNER TO postgres; + +SET search_path = pg_catalog; + +-- +-- TOC entry 2712 (class 2605 OID 19244) +-- Dependencies: 110 110 1087 1090 +-- Name: CAST (public.box2d AS public.box3d); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.box2d AS public.box3d) WITH FUNCTION public.box3d(public.box2d) AS IMPLICIT; + + +-- +-- TOC entry 2713 (class 2605 OID 19245) +-- Dependencies: 194 1102 1087 194 +-- Name: CAST (public.box2d AS public.geometry); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.box2d AS public.geometry) WITH FUNCTION public.geometry(public.box2d) AS IMPLICIT; + + +-- +-- TOC entry 2714 (class 2605 OID 19246) +-- Dependencies: 105 1090 105 +-- Name: CAST (public.box3d AS box); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.box3d AS box) WITH FUNCTION public.box(public.box3d) AS IMPLICIT; + + +-- +-- TOC entry 2715 (class 2605 OID 19247) +-- Dependencies: 108 108 1087 1090 +-- Name: CAST (public.box3d AS public.box2d); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.box3d AS public.box2d) WITH FUNCTION public.box2d(public.box3d) AS IMPLICIT; + + +-- +-- TOC entry 2716 (class 2605 OID 19248) +-- Dependencies: 195 1090 1102 195 +-- Name: CAST (public.box3d AS public.geometry); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.box3d AS public.geometry) WITH FUNCTION public.geometry(public.box3d) AS IMPLICIT; + + +-- +-- TOC entry 2717 (class 2605 OID 19249) +-- Dependencies: 106 106 1087 1093 +-- Name: CAST (public.box3d_extent AS public.box2d); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.box3d_extent AS public.box2d) WITH FUNCTION public.box2d(public.box3d_extent) AS IMPLICIT; + + +-- +-- TOC entry 2718 (class 2605 OID 19250) +-- Dependencies: 111 1093 1090 111 +-- Name: CAST (public.box3d_extent AS public.box3d); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.box3d_extent AS public.box3d) WITH FUNCTION public.box3d_extent(public.box3d_extent) AS IMPLICIT; + + +-- +-- TOC entry 2719 (class 2605 OID 19251) +-- Dependencies: 193 1093 193 1102 +-- Name: CAST (public.box3d_extent AS public.geometry); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.box3d_extent AS public.geometry) WITH FUNCTION public.geometry(public.box3d_extent) AS IMPLICIT; + + +-- +-- TOC entry 2523 (class 2605 OID 19252) +-- Dependencies: 198 1102 198 +-- Name: CAST (bytea AS public.geometry); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (bytea AS public.geometry) WITH FUNCTION public.geometry(bytea) AS IMPLICIT; + + +-- +-- TOC entry 2720 (class 2605 OID 19253) +-- Dependencies: 197 197 1096 1102 +-- Name: CAST (public.chip AS public.geometry); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.chip AS public.geometry) WITH FUNCTION public.geometry(public.chip) AS IMPLICIT; + + +-- +-- TOC entry 2721 (class 2605 OID 19254) +-- Dependencies: 168 1099 1099 168 +-- Name: CAST (public.geography AS public.geography); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.geography AS public.geography) WITH FUNCTION public.geography(public.geography, integer, boolean) AS IMPLICIT; + + +-- +-- TOC entry 2722 (class 2605 OID 19255) +-- Dependencies: 199 199 1099 1102 +-- Name: CAST (public.geography AS public.geometry); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.geography AS public.geometry) WITH FUNCTION public.geometry(public.geography); + + +-- +-- TOC entry 2725 (class 2605 OID 19256) +-- Dependencies: 104 104 1102 +-- Name: CAST (public.geometry AS box); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.geometry AS box) WITH FUNCTION public.box(public.geometry) AS IMPLICIT; + + +-- +-- TOC entry 2726 (class 2605 OID 19257) +-- Dependencies: 107 107 1102 1087 +-- Name: CAST (public.geometry AS public.box2d); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.geometry AS public.box2d) WITH FUNCTION public.box2d(public.geometry) AS IMPLICIT; + + +-- +-- TOC entry 2727 (class 2605 OID 19258) +-- Dependencies: 109 1090 109 1102 +-- Name: CAST (public.geometry AS public.box3d); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.geometry AS public.box3d) WITH FUNCTION public.box3d(public.geometry) AS IMPLICIT; + + +-- +-- TOC entry 2723 (class 2605 OID 19259) +-- Dependencies: 116 116 1102 +-- Name: CAST (public.geometry AS bytea); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.geometry AS bytea) WITH FUNCTION public.bytea(public.geometry) AS IMPLICIT; + + +-- +-- TOC entry 2728 (class 2605 OID 19260) +-- Dependencies: 169 1102 169 1099 +-- Name: CAST (public.geometry AS public.geography); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.geometry AS public.geography) WITH FUNCTION public.geography(public.geometry) AS IMPLICIT; + + +-- +-- TOC entry 2724 (class 2605 OID 19261) +-- Dependencies: 777 777 1102 +-- Name: CAST (public.geometry AS text); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (public.geometry AS text) WITH FUNCTION public.text(public.geometry) AS IMPLICIT; + + +-- +-- TOC entry 2589 (class 2605 OID 19262) +-- Dependencies: 196 196 1102 +-- Name: CAST (text AS public.geometry); Type: CAST; Schema: pg_catalog; Owner: +-- + +CREATE CAST (text AS public.geometry) WITH FUNCTION public.geometry(text) AS IMPLICIT; + + +SET search_path = public, pg_catalog; + +SET default_tablespace = ''; + +SET default_with_oids = false; + +-- +-- TOC entry 2411 (class 1259 OID 19263) +-- Dependencies: 6 +-- Name: agency; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE agency ( + agency_url text, + agency_name text, + agency_timezone text, + agency_id integer NOT NULL +); + + +ALTER TABLE public.agency OWNER TO postgres; + +-- +-- TOC entry 2412 (class 1259 OID 19269) +-- Dependencies: 6 +-- Name: calendar; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE calendar ( + service_id text NOT NULL, + start_date text, + end_date text, + monday integer, + tuesday integer, + wednesday integer, + thursday integer, + friday integer, + saturday integer, + sunday integer +); + + +ALTER TABLE public.calendar OWNER TO postgres; + +-- +-- TOC entry 2413 (class 1259 OID 19275) +-- Dependencies: 6 +-- Name: calendar_dates; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE calendar_dates ( + service_id text NOT NULL, + date text NOT NULL, + exception_type text +); + + +ALTER TABLE public.calendar_dates OWNER TO postgres; + +-- +-- TOC entry 2414 (class 1259 OID 19281) +-- Dependencies: 2518 6 +-- Name: geography_columns; Type: VIEW; Schema: public; Owner: postgres +-- + +CREATE VIEW geography_columns AS + SELECT current_database() AS f_table_catalog, n.nspname AS f_table_schema, c.relname AS f_table_name, a.attname AS f_geography_column, geography_typmod_dims(a.atttypmod) AS coord_dimension, geography_typmod_srid(a.atttypmod) AS srid, geography_typmod_type(a.atttypmod) AS type FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n WHERE ((((((c.relkind = ANY (ARRAY['r'::"char", 'v'::"char"])) AND (t.typname = 'geography'::name)) AND (a.attisdropped = false)) AND (a.atttypid = t.oid)) AND (a.attrelid = c.oid)) AND (c.relnamespace = n.oid)); + + +ALTER TABLE public.geography_columns OWNER TO postgres; + +SET default_with_oids = true; + +-- +-- TOC entry 2415 (class 1259 OID 19286) +-- Dependencies: 6 +-- Name: geometry_columns; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE geometry_columns ( + f_table_catalog character varying(256) NOT NULL, + f_table_schema character varying(256) NOT NULL, + f_table_name character varying(256) NOT NULL, + f_geometry_column character varying(256) NOT NULL, + coord_dimension integer NOT NULL, + srid integer NOT NULL, + type character varying(30) NOT NULL +); + + +ALTER TABLE public.geometry_columns OWNER TO postgres; + +SET default_with_oids = false; + +-- +-- TOC entry 2416 (class 1259 OID 19292) +-- Dependencies: 6 +-- Name: myway_observations; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE myway_observations ( + observation_id text NOT NULL, + myway_stop text, + "time" timestamp with time zone, + myway_route text +); + + +ALTER TABLE public.myway_observations OWNER TO postgres; + +-- +-- TOC entry 2417 (class 1259 OID 19298) +-- Dependencies: 6 +-- Name: myway_routes; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE myway_routes ( + myway_route text NOT NULL, + route_full_name text +); + + +ALTER TABLE public.myway_routes OWNER TO postgres; + +-- +-- TOC entry 2418 (class 1259 OID 19304) +-- Dependencies: 6 2417 +-- Name: myway_routes_myway_route_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE myway_routes_myway_route_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.myway_routes_myway_route_seq OWNER TO postgres; + +-- +-- TOC entry 2775 (class 0 OID 0) +-- Dependencies: 2418 +-- Name: myway_routes_myway_route_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE myway_routes_myway_route_seq OWNED BY myway_routes.myway_route; + + +-- +-- TOC entry 2419 (class 1259 OID 19306) +-- Dependencies: 2417 6 +-- Name: myway_routes_route_full_name_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE myway_routes_route_full_name_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.myway_routes_route_full_name_seq OWNER TO postgres; + +-- +-- TOC entry 2776 (class 0 OID 0) +-- Dependencies: 2419 +-- Name: myway_routes_route_full_name_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE myway_routes_route_full_name_seq OWNED BY myway_routes.route_full_name; + + +-- +-- TOC entry 2420 (class 1259 OID 19308) +-- Dependencies: 6 +-- Name: myway_stops; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE myway_stops ( + myway_stop text NOT NULL, + stop_code text, + stop_street text +); + + +ALTER TABLE public.myway_stops OWNER TO postgres; + +-- +-- TOC entry 2421 (class 1259 OID 19314) +-- Dependencies: 6 +-- Name: myway_timingdeltas; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE myway_timingdeltas ( + observation_id text NOT NULL, + route_full_name text, + stop_code text, + timing_delta integer, + "time" time with time zone, + date date, + timing_period text, + stop_sequence integer +); + + +ALTER TABLE public.myway_timingdeltas OWNER TO postgres; + +-- +-- TOC entry 2422 (class 1259 OID 19320) +-- Dependencies: 6 2421 +-- Name: myway_timingdeltas_timing_period_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE myway_timingdeltas_timing_period_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.myway_timingdeltas_timing_period_seq OWNER TO postgres; + +-- +-- TOC entry 2777 (class 0 OID 0) +-- Dependencies: 2422 +-- Name: myway_timingdeltas_timing_period_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE myway_timingdeltas_timing_period_seq OWNED BY myway_timingdeltas.timing_period; + + +-- +-- TOC entry 2423 (class 1259 OID 19322) +-- Dependencies: 6 +-- Name: routes; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE routes ( + route_type integer, + route_id integer NOT NULL, + route_short_name text, + route_long_name text, + agency_id integer, + route_url text, + route_color text, + route_text_color text +); + + +ALTER TABLE public.routes OWNER TO postgres; + +-- +-- TOC entry 2424 (class 1259 OID 19328) +-- Dependencies: 6 +-- Name: servicealerts_alerts; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE servicealerts_alerts ( + id integer NOT NULL, + url text, + description text, + start timestamp with time zone, + "end" timestamp with time zone +); + + +ALTER TABLE public.servicealerts_alerts OWNER TO postgres; + +-- +-- TOC entry 2425 (class 1259 OID 19334) +-- Dependencies: 6 2424 +-- Name: servicealerts_alerts_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres +-- + +CREATE SEQUENCE servicealerts_alerts_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE public.servicealerts_alerts_id_seq OWNER TO postgres; + +-- +-- TOC entry 2778 (class 0 OID 0) +-- Dependencies: 2425 +-- Name: servicealerts_alerts_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: postgres +-- + +ALTER SEQUENCE servicealerts_alerts_id_seq OWNED BY servicealerts_alerts.id; + + +-- +-- TOC entry 2426 (class 1259 OID 19336) +-- Dependencies: 6 +-- Name: servicealerts_informed; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE servicealerts_informed ( + servicealert_id integer NOT NULL, + informed_class text NOT NULL, + informed_id text NOT NULL, + informed_action text +); + + +ALTER TABLE public.servicealerts_informed OWNER TO postgres; + +-- +-- TOC entry 2427 (class 1259 OID 19342) +-- Dependencies: 6 +-- Name: shapes; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE shapes ( + shape_id text NOT NULL, + shape_pt_lat double precision, + shape_pt_lon double precision, + shape_pt_sequence integer NOT NULL, + shape_dist_traveled integer +); + + +ALTER TABLE public.shapes OWNER TO postgres; + +-- +-- TOC entry 2428 (class 1259 OID 19348) +-- Dependencies: 6 +-- Name: spatial_ref_sys; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE spatial_ref_sys ( + srid integer NOT NULL, + auth_name character varying(256), + auth_srid integer, + srtext character varying(2048), + proj4text character varying(2048) +); + + +ALTER TABLE public.spatial_ref_sys OWNER TO postgres; + +-- +-- TOC entry 2431 (class 1259 OID 20682) +-- Dependencies: 6 +-- Name: stop_times; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE stop_times ( + trip_id integer NOT NULL, + arrival_time time without time zone, + departure_time time without time zone, + stop_id integer, + stop_sequence integer NOT NULL, + stop_headsign text, + pickup_type text, + drop_off_type text, + shape_dist_travelled text +); + + +ALTER TABLE public.stop_times OWNER TO postgres; + +-- +-- TOC entry 2429 (class 1259 OID 19360) +-- Dependencies: 6 1099 +-- Name: stops; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE stops ( + stop_lat double precision, + stop_code text, + stop_lon double precision, + stop_id integer NOT NULL, + stop_name text, + zone_id text, + "position" geography +); + + +ALTER TABLE public.stops OWNER TO postgres; + +-- +-- TOC entry 2430 (class 1259 OID 19366) +-- Dependencies: 6 +-- Name: trips; Type: TABLE; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE TABLE trips ( + route_id integer, + trip_id integer NOT NULL, + trip_headsign text, + service_id text, + shape_id text +); + + +ALTER TABLE public.trips OWNER TO postgres; + +-- +-- TOC entry 2729 (class 2604 OID 19372) +-- Dependencies: 2425 2424 +-- Name: id; Type: DEFAULT; Schema: public; Owner: postgres +-- + +ALTER TABLE servicealerts_alerts ALTER COLUMN id SET DEFAULT nextval('servicealerts_alerts_id_seq'::regclass); + + +-- +-- TOC entry 2731 (class 2606 OID 19374) +-- Dependencies: 2411 2411 +-- Name: agency_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY agency + ADD CONSTRAINT agency_pkey PRIMARY KEY (agency_id); + + +-- +-- TOC entry 2735 (class 2606 OID 19376) +-- Dependencies: 2413 2413 2413 +-- Name: calendar_dates_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY calendar_dates + ADD CONSTRAINT calendar_dates_pkey PRIMARY KEY (service_id, date); + + +-- +-- TOC entry 2733 (class 2606 OID 19378) +-- Dependencies: 2412 2412 +-- Name: calendar_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY calendar + ADD CONSTRAINT calendar_pkey PRIMARY KEY (service_id); + + +-- +-- TOC entry 2737 (class 2606 OID 19380) +-- Dependencies: 2415 2415 2415 2415 2415 +-- Name: geometry_columns_pk; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY geometry_columns + ADD CONSTRAINT geometry_columns_pk PRIMARY KEY (f_table_catalog, f_table_schema, f_table_name, f_geometry_column); + + +-- +-- TOC entry 2739 (class 2606 OID 19382) +-- Dependencies: 2416 2416 +-- Name: myway_observations_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY myway_observations + ADD CONSTRAINT myway_observations_pkey PRIMARY KEY (observation_id); + + +-- +-- TOC entry 2741 (class 2606 OID 19384) +-- Dependencies: 2417 2417 +-- Name: myway_routes_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY myway_routes + ADD CONSTRAINT myway_routes_pkey PRIMARY KEY (myway_route); + + +-- +-- TOC entry 2745 (class 2606 OID 19386) +-- Dependencies: 2421 2421 +-- Name: myway_timingdeltas_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY myway_timingdeltas + ADD CONSTRAINT myway_timingdeltas_pkey PRIMARY KEY (observation_id); + + +-- +-- TOC entry 2743 (class 2606 OID 19388) +-- Dependencies: 2420 2420 +-- Name: mywaystops_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY myway_stops + ADD CONSTRAINT mywaystops_pkey PRIMARY KEY (myway_stop); + + +-- +-- TOC entry 2748 (class 2606 OID 19390) +-- Dependencies: 2423 2423 +-- Name: routes_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY routes + ADD CONSTRAINT routes_pkey PRIMARY KEY (route_id); + + +-- +-- TOC entry 2750 (class 2606 OID 19392) +-- Dependencies: 2424 2424 +-- Name: servicealerts_alerts_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY servicealerts_alerts + ADD CONSTRAINT servicealerts_alerts_pkey PRIMARY KEY (id); + + +-- +-- TOC entry 2752 (class 2606 OID 19394) +-- Dependencies: 2426 2426 2426 2426 +-- Name: servicealerts_informed_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY servicealerts_informed + ADD CONSTRAINT servicealerts_informed_pkey PRIMARY KEY (servicealert_id, informed_class, informed_id); + + +-- +-- TOC entry 2754 (class 2606 OID 19396) +-- Dependencies: 2427 2427 2427 +-- Name: shapes_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY shapes + ADD CONSTRAINT shapes_pkey PRIMARY KEY (shape_id, shape_pt_sequence); + + +-- +-- TOC entry 2756 (class 2606 OID 19398) +-- Dependencies: 2428 2428 +-- Name: spatial_ref_sys_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY spatial_ref_sys + ADD CONSTRAINT spatial_ref_sys_pkey PRIMARY KEY (srid); + + +-- +-- TOC entry 2766 (class 2606 OID 20689) +-- Dependencies: 2431 2431 2431 +-- Name: stop_times_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY stop_times + ADD CONSTRAINT stop_times_pkey PRIMARY KEY (trip_id, stop_sequence); + + +-- +-- TOC entry 2758 (class 2606 OID 19402) +-- Dependencies: 2429 2429 +-- Name: stops_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY stops + ADD CONSTRAINT stops_pkey PRIMARY KEY (stop_id); + + +-- +-- TOC entry 2760 (class 2606 OID 19404) +-- Dependencies: 2429 2429 +-- Name: stops_stop_code_key; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY stops + ADD CONSTRAINT stops_stop_code_key UNIQUE (stop_code); + + +-- +-- TOC entry 2763 (class 2606 OID 19406) +-- Dependencies: 2430 2430 +-- Name: trips_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: +-- + +ALTER TABLE ONLY trips + ADD CONSTRAINT trips_pkey PRIMARY KEY (trip_id); + + +-- +-- TOC entry 2746 (class 1259 OID 19407) +-- Dependencies: 2423 +-- Name: routenumber; Type: INDEX; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE INDEX routenumber ON routes USING btree (route_short_name); + + +-- +-- TOC entry 2761 (class 1259 OID 19408) +-- Dependencies: 2430 +-- Name: routetrips; Type: INDEX; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE INDEX routetrips ON trips USING btree (route_id); + + +-- +-- TOC entry 2764 (class 1259 OID 20690) +-- Dependencies: 2431 2431 2431 +-- Name: starttime; Type: INDEX; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE UNIQUE INDEX starttime ON stop_times USING btree (trip_id, stop_id, stop_sequence); + + +-- +-- TOC entry 2767 (class 1259 OID 20691) +-- Dependencies: 2431 2431 +-- Name: stoptimes; Type: INDEX; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE INDEX stoptimes ON stop_times USING btree (arrival_time, stop_id); + + +-- +-- TOC entry 2768 (class 1259 OID 20692) +-- Dependencies: 2431 2431 +-- Name: triptimes; Type: INDEX; Schema: public; Owner: postgres; Tablespace: +-- + +CREATE INDEX triptimes ON stop_times USING btree (trip_id, arrival_time); + + +-- +-- TOC entry 2769 (class 2606 OID 19412) +-- Dependencies: 2426 2749 2424 +-- Name: servicealerts_alertid; Type: FK CONSTRAINT; Schema: public; Owner: postgres +-- + +ALTER TABLE ONLY servicealerts_informed + ADD CONSTRAINT servicealerts_alertid FOREIGN KEY (servicealert_id) REFERENCES servicealerts_alerts(id); + + +-- +-- TOC entry 2774 (class 0 OID 0) +-- Dependencies: 6 +-- Name: public; Type: ACL; Schema: -; Owner: postgres +-- + +REVOKE ALL ON SCHEMA public FROM PUBLIC; +REVOKE ALL ON SCHEMA public FROM postgres; +GRANT ALL ON SCHEMA public TO postgres; +GRANT ALL ON SCHEMA public TO PUBLIC; + + +-- Completed on 2011-10-07 22:30:11 + +-- +-- PostgreSQL database dump complete +-- + + --- /dev/null +++ b/css/jquery-ui-1.8.12.custom.css @@ -1,1 +1,348 @@ - +/* + * jQuery UI CSS Framework 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* + * jQuery UI CSS Framework 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; } +.ui-widget-content a { color: #333333; } +.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; } +.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); } +.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/* + * jQuery UI Autocomplete 1.8.12 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.12 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} + --- a/css/jquery.mobile-1.0a4.css +++ /dev/null @@ -1,1661 +1,1 @@ -/*! - * jQuery Mobile v1.0a4 - * http://jquerymobile.com/ - * - * Copyright 2010, jQuery Project - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - */ -/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -* Note: Code is in draft form and is subject to change -*/ - -/* A ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-a { - border: 1px solid #2A2A2A; - background: #111111; - color: #ffffff; - font-weight: bold; - text-shadow: 0 -1px 1px #000000; - background-image: -moz-linear-gradient(top, - #3c3c3c, - #111111); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #3c3c3c), - color-stop(1, #111111)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#3c3c3c', EndColorStr='#111111')"; -} -.ui-bar-a, -.ui-bar-a input, -.ui-bar-a select, -.ui-bar-a textarea, -.ui-bar-a button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-bar-a .ui-link-inherit { - color: #fff; -} -.ui-bar-a .ui-link { - color: #7cc4e7; - font-weight: bold; -} -.ui-body-a { - border: 1px solid #2A2A2A; - background: #222222; - color: #fff; - text-shadow: 0 1px 0 #000; - font-weight: normal; - background-image: -moz-linear-gradient(top, - #666666, - #222222); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #666666), - color-stop(1, #222222)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#666666', EndColorStr='#222222)')"; -} -.ui-body-a, -.ui-body-a input, -.ui-body-a select, -.ui-body-a textarea, -.ui-body-a button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-body-a .ui-link-inherit { - color: #fff; -} -.ui-body-a .ui-link { - color: #2489CE; - font-weight: bold; -} -.ui-br { - border-bottom: rgb(130,130,130); - border-bottom: rgba(130,130,130,.3); - border-bottom-width: 1px; - border-bottom-style: solid; -} -.ui-btn-up-a { - border: 1px solid #222; - background: #333333; - font-weight: bold; - color: #fff; - text-shadow: 0 -1px 1px #000; - background-image: -moz-linear-gradient(top, - #555555, - #333333); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #555555), - color-stop(1, #333333)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#555555', EndColorStr='#333333')"; -} -.ui-btn-up-a a.ui-link-inherit { - color: #fff; -} -.ui-btn-hover-a { - border: 1px solid #000; - background: #444444; - font-weight: bold; - color: #fff; - text-shadow: 0 -1px 1px #000; - background-image: -moz-linear-gradient(top, - #666666, - #444444); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #666666), - color-stop(1, #444444)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#666666', EndColorStr='#444444')"; -} -.ui-btn-hover-a a.ui-link-inherit { - color: #fff; -} -.ui-btn-down-a { - border: 1px solid #000; - background: #3d3d3d; - font-weight: bold; - color: #fff; - text-shadow: 0 -1px 1px #000; - background-image: -moz-linear-gradient(top, - #333333, - #5a5a5a); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #333333), - color-stop(1, #5a5a5a)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#333333', EndColorStr='#5a5a5a')"; -} -.ui-btn-down-a a.ui-link-inherit { - color: #fff; -} -.ui-btn-up-a, -.ui-btn-hover-a, -.ui-btn-down-a { - font-family: Helvetica, Arial, sans-serif; - text-decoration: none; -} - - -/* B ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-b { - border: 1px solid #456f9a; - background: #5e87b0; - color: #fff; - font-weight: bold; - text-shadow: 0 -1px 1px #254f7a; - background-image: -moz-linear-gradient(top, - #81a8ce, - #5e87b0); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #81a8ce), - color-stop(1, #5e87b0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#81a8ce', EndColorStr='#5e87b0')"; -} -.ui-bar-b, -.ui-bar-b input, -.ui-bar-b select, -.ui-bar-b textarea, -.ui-bar-b button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-bar-b .ui-link-inherit { - color: #fff; -} -.ui-bar-b .ui-link { - color: #7cc4e7; - font-weight: bold; -} - -.ui-body-b { - border: 1px solid #C6C6C6; - background: #cccccc; - color: #333333; - text-shadow: 0 1px 0 #fff; - font-weight: normal; - background-image: -moz-linear-gradient(top, - #e6e6e6, - #cccccc); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #e6e6e6), - color-stop(1, #cccccc)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#e6e6e6', EndColorStr='#cccccc')"; -} -.ui-body-b, -.ui-body-b input, -.ui-body-b select, -.ui-body-b textarea, -.ui-body-b button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-body-b .ui-link-inherit { - color: #333333; -} -.ui-body-b .ui-link { - color: #2489CE; - font-weight: bold; -} -.ui-btn-up-b { - border: 1px solid #145072; - background: #2567ab; - font-weight: bold; - color: #fff; - text-shadow: 0 -1px 1px #145072; - background-image: -moz-linear-gradient(top, - #4e89c5, - #2567ab); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #5f9cc5), - color-stop(1, #396b9e)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#4e89c5', EndColorStr='#2567ab')"; -} -.ui-btn-up-b a.ui-link-inherit { - color: #fff; -} -.ui-btn-hover-b { - border: 1px solid #00516e; - background: #4b88b6; - font-weight: bold; - color: #fff; - text-shadow: 0 -1px 1px #014D68; - background-image: -moz-linear-gradient(top, - #72b0d4, - #4b88b6); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #72b0d4), - color-stop(1, #4b88b6)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#72b0d4', EndColorStr='#4b88b6')"; -} -.ui-btn-hover-b a.ui-link-inherit { - color: #fff; -} -.ui-btn-down-b { - border: 1px solid #225377; - background: #4e89c5; - font-weight: bold; - color: #fff; - text-shadow: 0 -1px 1px #225377; - background-image: -moz-linear-gradient(top, - #396b9e, - #4e89c5); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #396b9e), - color-stop(1, #4e89c5)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#396b9e', EndColorStr='#4e89c5')"; -} -.ui-btn-down-b a.ui-link-inherit { - color: #fff; -} -.ui-btn-up-b, -.ui-btn-hover-b, -.ui-btn-down-b { - font-family: Helvetica, Arial, sans-serif; - text-decoration: none; -} - - -/* C ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-c { - border: 1px solid #B3B3B3; - background: #e9eaeb; - color: #3E3E3E; - font-weight: bold; - text-shadow: 0 1px 1px #fff; - background-image: -moz-linear-gradient(top, - #f0f0f0, - #e9eaeb); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #f0f0f0), - color-stop(1, #e9eaeb)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#f0f0f0', EndColorStr='#e9eaeb')"; -} -.ui-bar-c, -.ui-bar-c input, -.ui-bar-c select, -.ui-bar-c textarea, -.ui-bar-c button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-body-c { - border: 1px solid #B3B3B3; - color: #333333; - text-shadow: 0 1px 0 #fff; - background: #f0f0f0; - background-image: -moz-linear-gradient(top, - #eeeeee, - #dddddd); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #eeeeee), - color-stop(1, #dddddd)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#dddddd')"; -} -.ui-body-c, -.ui-body-c input, -.ui-body-c select, -.ui-body-c textarea, -.ui-body-c button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-body-c .ui-link-inherit { - color: #333333; -} -.ui-body-c .ui-link { - color: #2489CE; - font-weight: bold; -} - -.ui-btn-up-c { - border: 1px solid #ccc; - background: #eee; - font-weight: bold; - color: #444; - text-shadow: 0 1px 1px #f6f6f6; - background-image: -moz-linear-gradient(top, - #fefefe, - #eeeeee); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #fdfdfd), - color-stop(1, #eeeeee)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fdfdfd', EndColorStr='#eeeeee')"; -} -.ui-btn-up-c a.ui-link-inherit { - color: #2F3E46; -} - -.ui-btn-hover-c { - border: 1px solid #bbb; - background: #dadada; - font-weight: bold; - color: #101010; - text-shadow: 0 1px 1px #fff; - background-image: -moz-linear-gradient(top, - #ededed, - #dadada); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #ededed), - color-stop(1, #dadada)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ededed', EndColorStr='#dadada')"; -} -.ui-btn-hover-c a.ui-link-inherit { - color: #2F3E46; -} -.ui-btn-down-c { - border: 1px solid #808080; - background: #fdfdfd; - font-weight: bold; - color: #111111; - text-shadow: 0 1px 1px #ffffff; - background-image: -moz-linear-gradient(top, - #eeeeee, - #fdfdfd); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #eeeeee), - color-stop(1, #fdfdfd)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#fdfdfd')"; -} -.ui-btn-down-c a.ui-link-inherit { - color: #2F3E46; -} -.ui-btn-up-c, -.ui-btn-hover-c, -.ui-btn-down-c { - font-family: Helvetica, Arial, sans-serif; - text-decoration: none; -} - - -/* D ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-d { - border: 1px solid #ccc; - background: #bbb; - color: #333; - text-shadow: 0 1px 0 #eee; - background-image: -moz-linear-gradient(top, - #ddd, - #bbb); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #ddd), - color-stop(1, #bbb)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#dddddd', EndColorStr='#bbbbbb')"; -} -.ui-bar-d, -.ui-bar-d input, -.ui-bar-d select, -.ui-bar-d textarea, -.ui-bar-d button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-bar-d .ui-link-inherit { - color: #333; -} -.ui-bar-d .ui-link { - color: #2489CE; - font-weight: bold; -} -.ui-body-d { - border: 1px solid #ccc; - color: #333333; - text-shadow: 0 1px 0 #fff; - background: #ffffff; -} -.ui-body-d, -.ui-body-d input, -.ui-body-d select, -.ui-body-d textarea, -.ui-body-d button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-body-d .ui-link-inherit { - color: #333333; -} -.ui-body-d .ui-link { - color: #2489CE; - font-weight: bold; -} -.ui-btn-up-d { - border: 1px solid #ccc; - background: #fff; - font-weight: bold; - color: #444; - text-shadow: 0 1px 1px #fff; -} -.ui-btn-up-d a.ui-link-inherit { - color: #333; -} -.ui-btn-hover-d { - border: 1px solid #aaa; - background: #eeeeee; - font-weight: bold; - color: #222; - cursor: pointer; - text-shadow: 0 1px 1px #fff; - background-image: -moz-linear-gradient(top, - #fdfdfd, - #eeeeee); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #fdfdfd), - color-stop(1, #eeeeee)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fdfdfd', EndColorStr='#eeeeee')"; -} -.ui-btn-hover-d a.ui-link-inherit { - color: #222; -} -.ui-btn-down-d { - border: 1px solid #aaaaaa; - background: #ffffff; - font-weight: bold; - color: #111; - text-shadow: 0 1px 1px #ffffff; - background-image: -moz-linear-gradient(top, - #eeeeee, - #ffffff); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #eeeeee), - color-stop(1, #ffffff)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#eeeeee', EndColorStr='#ffffff')"; -} -.ui-btn-down-d a.ui-link-inherit { - border: 1px solid #808080; - background: #ced0d2; - font-weight: bold; - color: #111; - text-shadow: none; - background-image: -moz-linear-gradient(top, - #cccccc, - #eeeeee); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #cccccc), - color-stop(1, #eeeeee)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#cccccc', EndColorStr='#eeeeee')"; -} -.ui-btn-up-d, -.ui-btn-hover-d, -.ui-btn-down-d { - font-family: Helvetica, Arial, sans-serif; - text-decoration: none; -} - - -/* E ------------------------------------------------------------------------------------------------------------*/ - -.ui-bar-e { - border: 1px solid #F7C942; - background: #fadb4e; - color: #333; - text-shadow: 0 1px 0 #fff; - background-image: -moz-linear-gradient(top, - #fceda7, - #fadb4e); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #fceda7), - color-stop(1, #fadb4e)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fceda7', EndColorStr='#fadb4e')"; -} -.ui-bar-e, -.ui-bar-e input, -.ui-bar-e select, -.ui-bar-e textarea, -.ui-bar-d button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-bar-e .ui-link-inherit { - color: #333; -} -.ui-bar-e .ui-link { - color: #2489CE; - font-weight: bold; -} -.ui-body-e { - border: 1px solid #F7C942; - color: #333333; - text-shadow: 0 1px 0 #fff; - background: #faeb9e; - background-image: -moz-linear-gradient(top, - #fff, - #faeb9e); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #fff), - color-stop(1, #faeb9e)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#faeb9e')"; -} -.ui-body-e, -.ui-body-e input, -.ui-body-e select, -.ui-body-e textarea, -.ui-body-e button { - font-family: Helvetica, Arial, sans-serif; -} -.ui-body-e .ui-link-inherit { - color: #333333; -} -.ui-body-e .ui-link { - color: #2489CE; - font-weight: bold; -} -.ui-btn-up-e { - border: 1px solid #F7C942; - background: #fadb4e; - font-weight: bold; - color: #333; - text-shadow: 0 1px 1px #fe3; - text-shadow: 0 1px 0 #fff; - background-image: -moz-linear-gradient(top, - #fceda7, - #fadb4e); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #fceda7), - color-stop(1, #fadb4e)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fceda7', EndColorStr='#fadb4e')"; -} -.ui-btn-up-e a.ui-link-inherit { - color: #333; -} -.ui-btn-hover-e { - border: 1px solid #e79952; - background: #fbe26f; - font-weight: bold; - color: #111; - text-shadow: 0 1px 1px #fff; - background-image: -moz-linear-gradient(top, - #fcf0b5, - #fbe26f); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #fcf0b5), - color-stop(1, #fbe26f)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fcf0b5', EndColorStr='#fbe26f')"; -} - -.ui-btn-hover-e a.ui-link-inherit { - color: #333; -} -.ui-btn-down-e { - border: 1px solid #F7C942; - background: #fceda7; - font-weight: bold; - color: #111; - text-shadow: 0 1px 1px #ffffff; - background-image: -moz-linear-gradient(top, - #fadb4e, - #fceda7); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #fadb4e), - color-stop(1, #fceda7)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fadb4e', EndColorStr='#fceda7')"; -} -.ui-btn-down-e a.ui-link-inherit { - color: #333; -} -.ui-btn-up-e, -.ui-btn-hover-e, -.ui-btn-down-e { - font-family: Helvetica, Arial, sans-serif; - text-decoration: none; -} - - -/* links within "buttons" ------------------------------------------------------------------------------------------------------------*/ - -a.ui-link-inherit { - text-decoration: none !important; -} - - -/* Active class used as the "on" state across all themes ------------------------------------------------------------------------------------------------------------*/ - -.ui-btn-active { - border: 1px solid #155678; - background: #4596ce; - font-weight: bold; - color: #fff; - cursor: pointer; - text-shadow: 0 -1px 1px #145072; - text-decoration: none; - background-image: -moz-linear-gradient(top, - #85bae4, - #5393c5); - background-image: -webkit-gradient(linear,left top,left bottom, - color-stop(0, #85bae4), - color-stop(1, #5393c5)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#85bae4', EndColorStr='#5393c5')"; - outline: none; -} -.ui-btn-active a.ui-link-inherit { - color: #fff; -} - - -/* button inner top highlight ------------------------------------------------------------------------------------------------------------*/ - -.ui-btn-inner { - border-top: 1px solid #fff; - border-color: rgba(255,255,255,.3); -} - - -/* corner rounding classes ------------------------------------------------------------------------------------------------------------*/ - -.ui-corner-tl { - -moz-border-radius-topleft: .6em; - -webkit-border-top-left-radius: .6em; - border-top-left-radius: .6em; -} -.ui-corner-tr { - -moz-border-radius-topright: .6em; - -webkit-border-top-right-radius: .6em; - border-top-right-radius: .6em; -} -.ui-corner-bl { - -moz-border-radius-bottomleft: .6em; - -webkit-border-bottom-left-radius: .6em; - border-bottom-left-radius: .6em; -} -.ui-corner-br { - -moz-border-radius-bottomright: .6em; - -webkit-border-bottom-right-radius: .6em; - border-bottom-right-radius: .6em; -} -.ui-corner-top { - -moz-border-radius-topleft: .6em; - -webkit-border-top-left-radius: .6em; - border-top-left-radius: .6em; - -moz-border-radius-topright: .6em; - -webkit-border-top-right-radius: .6em; - border-top-right-radius: .6em; -} -.ui-corner-bottom { - -moz-border-radius-bottomleft: .6em; - -webkit-border-bottom-left-radius: .6em; - border-bottom-left-radius: .6em; - -moz-border-radius-bottomright: .6em; - -webkit-border-bottom-right-radius: .6em; - border-bottom-right-radius: .6em; - } -.ui-corner-right { - -moz-border-radius-topright: .6em; - -webkit-border-top-right-radius: .6em; - border-top-right-radius: .6em; - -moz-border-radius-bottomright: .6em; - -webkit-border-bottom-right-radius: .6em; - border-bottom-right-radius: .6em; -} -.ui-corner-left { - -moz-border-radius-topleft: .6em; - -webkit-border-top-left-radius: .6em; - border-top-left-radius: .6em; - -moz-border-radius-bottomleft: .6em; - -webkit-border-bottom-left-radius: .6em; - border-bottom-left-radius: .6em; -} -.ui-corner-all { - -moz-border-radius: .6em; - -webkit-border-radius: .6em; - border-radius: .6em; -} - - - -/* Interaction cues ------------------------------------------------------------------------------------------------------------*/ -.ui-disabled { - opacity: .3; -} -.ui-disabled, -.ui-disabled a { - cursor: default !important; -} - -/* Icons ------------------------------------------------------------------------------------------------------------*/ - -.ui-icon { - background: #666; - background: rgba(0,0,0,.4); - background-image: url(images/icons-18-white.png); - background-repeat: no-repeat; - -moz-border-radius: 9px; - -webkit-border-radius: 9px; - border-radius: 9px; -} - - -/* Alt icon color ------------------------------------------------------------------------------------------------------------*/ - -.ui-icon-alt { - background: #fff; - background: rgba(255,255,255,.3); - background-image: url(images/icons-18-black.png); - background-repeat: no-repeat; -} - -/* HD/"retina" sprite ------------------------------------------------------------------------------------------------------------*/ - -@media only screen and (-webkit-min-device-pixel-ratio: 1.5), - only screen and (min--moz-device-pixel-ratio: 1.5), - only screen and (min-resolution: 240dpi) { - - .ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r, - .ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check, - .ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back, - .ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-search, - .ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on { - background-image: url(images/icons-36-white.png); - -moz-background-size: 776px 18px; - -o-background-size: 776px 18px; - -webkit-background-size: 776px 18px; - background-size: 776px 18px; - } - .ui-icon-alt { - background-image: url(images/icons-36-black.png); - } -} - -/* plus minus */ -.ui-icon-plus { - background-position: -0 50%; -} -.ui-icon-minus { - background-position: -36px 50%; -} - -/* delete/close */ -.ui-icon-delete { - background-position: -72px 50%; -} - -/* arrows */ -.ui-icon-arrow-r { - background-position: -108px 50%; -} -.ui-icon-arrow-l { - background-position: -144px 50%; -} -.ui-icon-arrow-u { - background-position: -180px 50%; -} -.ui-icon-arrow-d { - background-position: -216px 50%; -} - -/* misc */ -.ui-icon-check { - background-position: -252px 50%; -} -.ui-icon-gear { - background-position: -288px 50%; -} -.ui-icon-refresh { - background-position: -324px 50%; -} -.ui-icon-forward { - background-position: -360px 50%; -} -.ui-icon-back { - background-position: -396px 50%; -} -.ui-icon-grid { - background-position: -432px 50%; -} -.ui-icon-star { - background-position: -468px 50%; -} -.ui-icon-alert { - background-position: -504px 50%; -} -.ui-icon-info { - background-position: -540px 50%; -} -.ui-icon-home { - background-position: -576px 50%; -} -.ui-icon-search { - background-position: -612px 50%; -} -.ui-icon-checkbox-off { - background-position: -684px 50%; -} -.ui-icon-checkbox-on { - background-position: -648px 50%; -} -.ui-icon-radio-off { - background-position: -756px 50%; -} -.ui-icon-radio-on { - background-position: -720px 50%; -} - - -/* checks,radios */ -.ui-icon-checkbox-off, -.ui-icon-checkbox-on, -.ui-icon-radio-off, -.ui-icon-radio-on { - background-color: transparent; - -moz-border-radius: 0; - -webkit-border-radius: 0; - border-radius: 0; -} -.ui-icon-searchfield { - background-image: url(images/icon-search-black.png); - background-size: 16px 16px; -} - -/* loading icon */ -.ui-icon-loading { - background-image: url(images/ajax-loader.png); - width: 40px; - height: 40px; - -moz-border-radius: 20px; - -webkit-border-radius: 20px; - border-radius: 20px; - background-size: 35px 35px; -} - - -/* Button corner classes ------------------------------------------------------------------------------------------------------------*/ - -.ui-btn-corner-tl { - -moz-border-radius-topleft: 1em; - -webkit-border-top-left-radius: 1em; - border-top-left-radius: 1em; -} -.ui-btn-corner-tr { - -moz-border-radius-topright: 1em; - -webkit-border-top-right-radius: 1em; - border-top-right-radius: 1em; -} -.ui-btn-corner-bl { - -moz-border-radius-bottomleft: 1em; - -webkit-border-bottom-left-radius: 1em; - border-bottom-left-radius: 1em; -} -.ui-btn-corner-br { - -moz-border-radius-bottomright: 1em; - -webkit-border-bottom-right-radius: 1em; - border-bottom-right-radius: 1em; -} -.ui-btn-corner-top { - -moz-border-radius-topleft: 1em; - -webkit-border-top-left-radius: 1em; - border-top-left-radius: 1em; - -moz-border-radius-topright: 1em; - -webkit-border-top-right-radius: 1em; - border-top-right-radius: 1em; -} -.ui-btn-corner-bottom { - -moz-border-radius-bottomleft: 1em; - -webkit-border-bottom-left-radius: 1em; - border-bottom-left-radius: 1em; - -moz-border-radius-bottomright: 1em; - -webkit-border-bottom-right-radius: 1em; - border-bottom-right-radius: 1em; -} -.ui-btn-corner-right { - -moz-border-radius-topright: 1em; - -webkit-border-top-right-radius: 1em; - border-top-right-radius: 1em; - -moz-border-radius-bottomright: 1em; - -webkit-border-bottom-right-radius: 1em; - border-bottom-right-radius: 1em; -} -.ui-btn-corner-left { - -moz-border-radius-topleft: 1em; - -webkit-border-top-left-radius: 1em; - border-top-left-radius: 1em; - -moz-border-radius-bottomleft: 1em; - -webkit-border-bottom-left-radius: 1em; - border-bottom-left-radius: 1em; -} -.ui-btn-corner-all { - -moz-border-radius: 1em; - -webkit-border-radius: 1em; - border-radius: 1em; -} - -/* radius clip workaround for cleaning up corner trapping */ -.ui-corner-tl, -.ui-corner-tr, -.ui-corner-bl, -.ui-corner-br, -.ui-corner-top, -.ui-corner-bottom, -.ui-corner-right, -.ui-corner-left, -.ui-corner-all, -.ui-btn-corner-tl, -.ui-btn-corner-tr, -.ui-btn-corner-bl, -.ui-btn-corner-br, -.ui-btn-corner-top, -.ui-btn-corner-bottom, -.ui-btn-corner-right, -.ui-btn-corner-left, -.ui-btn-corner-all { - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -/* Overlay / modal ------------------------------------------------------------------------------------------------------------*/ - -.ui-overlay { - background: #666; - opacity: .5; - filter: Alpha(Opacity=50); - position: absolute; - width: 100%; - height: 100%; -} -.ui-overlay-shadow { - -moz-box-shadow: 0px 0px 12px rgba(0,0,0,.6); - -webkit-box-shadow: 0px 0px 12px rgba(0,0,0,.6); - box-shadow: 0px 0px 12px rgba(0,0,0,.6); -} -.ui-shadow { - -moz-box-shadow: 0px 1px 4px rgba(0,0,0,.3); - -webkit-box-shadow: 0px 1px 4px rgba(0,0,0,.3); - box-shadow: 0px 1px 4px rgba(0,0,0,.3); -} -.ui-bar-a .ui-shadow, -.ui-bar-b .ui-shadow , -.ui-bar-c .ui-shadow { - -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.3); - -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.3); - box-shadow: 0px 1px 0 rgba(255,255,255,.3); -} -.ui-shadow-inset { - -moz-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); - -webkit-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); - box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); -} -.ui-icon-shadow { - -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.4); - -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.4); - box-shadow: 0px 1px 0 rgba(255,255,255,.4); -} - - -/* Focus state - set here for specificity ------------------------------------------------------------------------------------------------------------*/ - -.ui-focus { - -moz-box-shadow: 0px 0px 12px #387bbe; - -webkit-box-shadow: 0px 0px 12px #387bbe; - box-shadow: 0px 0px 12px #387bbe; -} - -/* unset box shadow in browsers that don't do it right ------------------------------------------------------------------------------------------------------------*/ - -.ui-mobile-nosupport-boxshadow * { - -moz-box-shadow: none !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; -} - -/* ...and bring back focus */ -.ui-mobile-nosupport-boxshadow .ui-focus { - outline-width: 2px; -}/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -* Note: Code is in draft form and is subject to change -*/ - -/* some unsets - more probably needed */ -.ui-mobile, .ui-mobile body { height: 100%; } -.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; } -.ui-mobile a img, .ui-mobile fieldset { border: 0; } - -/* responsive page widths */ -.ui-mobile-viewport { margin: 0; overflow-x: hidden; -webkit-text-size-adjust: none; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } - -/* "page" containers - full-screen views, one should always be in view post-pageload */ -.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; } -.ui-mobile .ui-page-active { display: block; overflow: visible; } - -/*orientations from js are available */ -.portrait, -.portrait .ui-page { min-height: 100%; } -.landscape, -.landscape .ui-page { min-height: 100%; } - -/* loading screen */ -.ui-loading .ui-mobile-viewport { overflow: hidden !important; } -.ui-loading .ui-loader { display: block; } -.ui-loading .ui-page { overflow: hidden; } -.ui-loader { display: none; position: absolute; opacity: .85; z-index: 10; left: 50%; width: 200px; margin-left: -130px; margin-top: -35px; padding: 10px 30px; } -.ui-loader h1 { font-size: 15px; text-align: center; } -.ui-loader .ui-icon { position: static; display: block; opacity: .9; margin: 0 auto; width: 35px; height: 35px; background-color: transparent; } - -/*fouc*/ -.ui-mobile-rendering > * { visibility: hidden; } - -/*headers, content panels*/ -.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; } -.ui-bar { font-size: 16px; margin: 0; } -.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; } - -.ui-header, .ui-footer { display: block; } -.ui-page .ui-header, .ui-page .ui-footer { position: relative; } -.ui-header .ui-btn-left { position: absolute; left: 10px; top: .4em; } -.ui-header .ui-btn-right { position: absolute; right: 10px; top: .4em; } -.ui-header .ui-title, .ui-footer .ui-title { text-align: center; font-size: 16px; display: block; margin: .6em 90px .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; } - -/*content area*/ -.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; } -.ui-page-fullscreen .ui-content { padding:0; } - -/* icons sizing */ -.ui-icon { width: 18px; height: 18px; } - -/* fullscreen class on ui-content div */ -.ui-fullscreen { } -.ui-fullscreen img { max-width: 100%; } - -/* non-js content hiding */ -.ui-nojs { position: absolute; left: -9999px; } -/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.spin { - -webkit-transform: rotate(360deg); - -webkit-animation-name: spin; - -webkit-animation-duration: 1s; - -webkit-animation-iteration-count: infinite; -} -@-webkit-keyframes spin { - from {-webkit-transform: rotate(0deg);} - to {-webkit-transform: rotate(360deg);} -} - -/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/ -Built by David Kaneda and maintained by Jonathan Stark. -*/ -.in, .out { - -webkit-animation-timing-function: ease-in-out; - -webkit-animation-duration: 350ms; -} - -.slide.in { - -webkit-transform: translateX(0); - -webkit-animation-name: slideinfromright; -} - -.slide.out { - -webkit-transform: translateX(-100%); - -webkit-animation-name: slideouttoleft; -} - -.slide.in.reverse { - -webkit-transform: translateX(0); - -webkit-animation-name: slideinfromleft; -} - -.slide.out.reverse { - -webkit-transform: translateX(100%); - -webkit-animation-name: slideouttoright; -} - -.slideup.in { - -webkit-transform: translateY(0); - -webkit-animation-name: slideinfrombottom; - z-index: 10; -} - -.slideup.out { - -webkit-animation-name: dontmove; - z-index: 0; -} - -.slideup.out.reverse { - -webkit-transform: translateY(100%); - z-index: 10; - -webkit-animation-name: slideouttobottom; -} - -.slideup.in.reverse { - z-index: 0; - -webkit-animation-name: dontmove; -} -.slidedown.in { - -webkit-transform: translateY(0); - -webkit-animation-name: slideinfromtop; - z-index: 10; -} - -.slidedown.out { - -webkit-animation-name: dontmove; - z-index: 0; -} - -.slidedown.out.reverse { - -webkit-transform: translateY(-100%); - z-index: 10; - -webkit-animation-name: slideouttotop; -} - -.slidedown.in.reverse { - z-index: 0; - -webkit-animation-name: dontmove; -} - -@-webkit-keyframes slideinfromright { - from { -webkit-transform: translateX(100%); } - to { -webkit-transform: translateX(0); } -} - -@-webkit-keyframes slideinfromleft { - from { -webkit-transform: translateX(-100%); } - to { -webkit-transform: translateX(0); } -} - -@-webkit-keyframes slideouttoleft { - from { -webkit-transform: translateX(0); } - to { -webkit-transform: translateX(-100%); } -} - -@-webkit-keyframes slideouttoright { - from { -webkit-transform: translateX(0); } - to { -webkit-transform: translateX(100%); } -} - - -@-webkit-keyframes slideinfromtop { - from { -webkit-transform: translateY(-100%); } - to { -webkit-transform: translateY(0); } -} - -@-webkit-keyframes slideinfrombottom { - from { -webkit-transform: translateY(100%); } - to { -webkit-transform: translateY(0); } -} - -@-webkit-keyframes slideouttobottom { - from { -webkit-transform: translateY(0); } - to { -webkit-transform: translateY(100%); } -} - -@-webkit-keyframes slideouttotop { - from { -webkit-transform: translateY(0); } - to { -webkit-transform: translateY(-100%); } -} -@-webkit-keyframes fadein { - from { opacity: 0; } - to { opacity: 1; } -} - -@-webkit-keyframes fadeout { - from { opacity: 1; } - to { opacity: 0; } -} - -.fade.in { - opacity: 1; - z-index: 10; - -webkit-animation-name: fadein; -} -.fade.out { - z-index: 0; - -webkit-animation-name: fadeout; -} - -/* The properties in this body rule are only necessary for the 'flip' transition. - * We need specify the perspective to create a projection matrix. This will add - * some depth as the element flips. The depth number represents the distance of - * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate - * value. - */ -.ui-mobile-viewport-perspective { - -webkit-perspective: 1000; - position: absolute; -} - -.ui-mobile-viewport-transitioning, -.ui-mobile-viewport-transitioning .ui-page { - width: 100%; - height: 100%; - overflow: hidden; -} - -.flip { - -webkit-animation-duration: .65s; - -webkit-backface-visibility:hidden; - -webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */ -} - -.flip.in { - -webkit-transform: rotateY(0) scale(1); - -webkit-animation-name: flipinfromleft; -} - -.flip.out { - -webkit-transform: rotateY(-180deg) scale(.8); - -webkit-animation-name: flipouttoleft; -} - -/* Shake it all about */ - -.flip.in.reverse { - -webkit-transform: rotateY(0) scale(1); - -webkit-animation-name: flipinfromright; -} - -.flip.out.reverse { - -webkit-transform: rotateY(180deg) scale(.8); - -webkit-animation-name: flipouttoright; -} - -@-webkit-keyframes flipinfromright { - from { -webkit-transform: rotateY(-180deg) scale(.8); } - to { -webkit-transform: rotateY(0) scale(1); } -} - -@-webkit-keyframes flipinfromleft { - from { -webkit-transform: rotateY(180deg) scale(.8); } - to { -webkit-transform: rotateY(0) scale(1); } -} - -@-webkit-keyframes flipouttoleft { - from { -webkit-transform: rotateY(0) scale(1); } - to { -webkit-transform: rotateY(-180deg) scale(.8); } -} - -@-webkit-keyframes flipouttoright { - from { -webkit-transform: rotateY(0) scale(1); } - to { -webkit-transform: rotateY(180deg) scale(.8); } -} - - -/* Hackish, but reliable. */ - -@-webkit-keyframes dontmove { - from { opacity: 1; } - to { opacity: 1; } -} - -.pop { - -webkit-transform-origin: 50% 50%; -} - -.pop.in { - -webkit-transform: scale(1); - opacity: 1; - -webkit-animation-name: popin; - z-index: 10; -} - -.pop.out.reverse { - -webkit-transform: scale(.2); - opacity: 0; - -webkit-animation-name: popout; - z-index: 10; -} - -.pop.in.reverse { - z-index: 0; - -webkit-animation-name: dontmove; -} - -@-webkit-keyframes popin { - from { - -webkit-transform: scale(.2); - opacity: 0; - } - to { - -webkit-transform: scale(1); - opacity: 1; - } -} - -@-webkit-keyframes popout { - from { - -webkit-transform: scale(1); - opacity: 1; - } - to { - -webkit-transform: scale(.2); - opacity: 0; - } -}/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ - -/* content configurations. */ -.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; } -.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;} - -/* grid solo: 100 - single item fallback */ -.ui-grid-solo .ui-block-a { width: 100%; float: none; } - -/* grid a: 50/50 */ -.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; } -.ui-grid-a .ui-block-a { clear: left; } - -/* grid b: 33/33/33 */ -.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; } -.ui-grid-b .ui-block-a { clear: left; } - -/* grid c: 25/25/25/25 */ -.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; } -.ui-grid-c .ui-block-a { clear: left; } - -/* grid d: 20/20/20/20/20 */ -.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; } -.ui-grid-d .ui-block-a { clear: left; } -/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -/* fixed page header & footer configuration */ -.ui-header, .ui-footer, .ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { position: absolute; overflow: hidden; width: 100%; border-left-width: 0; border-right-width: 0; } -.ui-header-fixed, .ui-footer-fixed { - z-index: 1000; - -webkit-transform: translateZ(0); /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */ -} -.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline { display: none; } -.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { opacity: .9; } -/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.ui-navbar { overflow: hidden; } -.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;} -.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; } -.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; } -.ui-navbar li.ui-navbar-truncate { position: absolute; left: -9999px; top: -9999px; } -.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; border-right-width: 0; } -.ui-navbar li .ui-btn { margin-right: -1px; } -.ui-navbar li .ui-btn:last-child { margin-right: 0; } -.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn, -.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; } -.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; } -.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; } -/*expanded page styles*/ -.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; } -.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px; } -.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; } -.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; } -.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; } -.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; } -.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; } -.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; } -/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 5px; padding: 0; } -.ui-btn:focus, .ui-btn:active { outline: none; } -.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn { display: inline-block; font-size: 13px; margin: 0; } -.ui-btn-inline { display: inline-block; } -.ui-btn-inner { padding: .6em 25px; display: block; height: 100%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; position: relative; } -.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner { padding: .4em 8px .5em; } -.ui-btn-icon-notext { display: inline-block; width: 20px; height: 20px; padding: 2px 1px 2px 3px; text-indent: -9999px; } -.ui-btn-icon-notext .ui-btn-inner { padding: 0; } -.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -999px; } -.ui-btn-icon-left .ui-btn-inner { padding-left: 33px; } -.ui-header .ui-btn-icon-left .ui-btn-inner, -.ui-footer .ui-btn-icon-left .ui-btn-inner, -.ui-bar .ui-btn-icon-left .ui-btn-inner { padding-left: 27px; } -.ui-btn-icon-right .ui-btn-inner { padding-right: 33px; } -.ui-header .ui-btn-icon-right .ui-btn-inner, -.ui-footer .ui-btn-icon-right .ui-btn-inner, -.ui-bar .ui-btn-icon-right .ui-btn-inner { padding-right: 27px; } -.ui-btn-icon-top .ui-btn-inner { padding-top: 33px; } -.ui-header .ui-btn-icon-top .ui-btn-inner, -.ui-footer .ui-btn-icon-top .ui-btn-inner, -.ui-bar .ui-btn-icon-top .ui-btn-inner { padding-top: 27px; } -.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 33px; } -.ui-header .ui-btn-icon-bottom .ui-btn-inner, -.ui-footer .ui-btn-icon-bottom .ui-btn-inner, -.ui-bar .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 27px; } - -/*btn icon positioning*/ -.ui-btn-icon-notext .ui-icon { display: block; } -.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon { position: absolute; top: 50%; margin-top: -9px; } -.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon { position: absolute; left: 50%; margin-left: -9px; } -.ui-btn-icon-left .ui-icon { left: 10px; } -.ui-btn-icon-right .ui-icon {right: 10px; } -.ui-header .ui-btn-icon-left .ui-icon, -.ui-footer .ui-btn-icon-left .ui-icon, -.ui-bar .ui-btn-icon-left .ui-icon { left: 4px; } -.ui-header .ui-btn-icon-right .ui-icon, -.ui-footer .ui-btn-icon-right .ui-icon, -.ui-bar .ui-btn-icon-right .ui-icon { right: 4px; } -.ui-header .ui-btn-icon-top .ui-icon, -.ui-footer .ui-btn-icon-top .ui-icon, -.ui-bar .ui-btn-icon-top .ui-icon { top: 4px; } -.ui-header .ui-btn-icon-bottom .ui-icon, -.ui-footer .ui-btn-icon-bottom .ui-icon, -.ui-bar .ui-btn-icon-bottom .ui-icon { bottom: 4px; } -.ui-btn-icon-top .ui-icon { top: 5px; } -.ui-btn-icon-bottom .ui-icon { bottom: 5px; } -/*hiding native button,inputs */ -.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: button; opacity: 0; cursor: pointer; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); } -/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.ui-collapsible-contain { margin: .5em 0; } -.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; } -.ui-collapsible-heading a { text-align: left; margin: 0; } -.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; } -.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; } -.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 0; } -.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; } -.ui-collapsible-heading-status { position:absolute; left:-9999px; } -.ui-collapsible-content { display: block; padding: 10px 0 10px 8px; } -.ui-collapsible-content-collapsed { display: none; } - -.ui-collapsible-set { margin: .5em 0; } -.ui-collapsible-set .ui-collapsible-contain { margin: -1px 0 0; } -/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0 1em; } -.ui-bar .ui-controlgroup { margin: 0 .3em; } -.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; } -.ui-controlgroup-controls { display: block; width: 95%;} -.ui-controlgroup li { list-style: none; } -.ui-controlgroup-vertical .ui-btn, -.ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio { margin: 0; border-bottom-width: 0; } -.ui-controlgroup-vertical .ui-controlgroup-last { border-bottom-width: 1px; } -.ui-controlgroup-horizontal { padding: 0; } -.ui-controlgroup-horizontal .ui-btn, -.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { display: inline-block; margin: 0 -5px 0 0; } -.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { display: inline; } -.ui-controlgroup-horizontal .ui-checkbox .ui-btn, .ui-controlgroup-horizontal .ui-radio .ui-btn, -.ui-controlgroup-horizontal .ui-checkbox:last-child, .ui-controlgroup-horizontal .ui-radio:last-child { margin-right: 0; } -.ui-controlgroup-horizontal .ui-controlgroup-last { margin-right: 0; } -.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; } -/* conflicts with listview.. -.ui-controlgroup .ui-btn-icon-notext { width: 30px; height: 30px; text-indent: -9999px; } -.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { padding: 5px 6px 5px 5px; } -*/ - -.min-width-480px .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } -.min-width-480px .ui-controlgroup-controls { width: 60%; display: inline-block; } /* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.ui-dialog { min-height: 480px; } -.ui-dialog .ui-header, .ui-dialog .ui-content, .ui-dialog .ui-footer { margin: 15px; position: relative; } -.ui-dialog .ui-header, .ui-dialog .ui-footer { z-index: 10; width: auto; } -.ui-dialog .ui-content, .ui-dialog .ui-footer { margin-top: -15px; }/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.ui-checkbox, .ui-radio { position:relative; margin: .2em 0 .5em; z-index: 1; } -.ui-checkbox .ui-btn, .ui-radio .ui-btn { margin: 0; text-align: left; z-index: 2; } -.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; } -.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } -.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon {left: 15px; } -.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon {right: 15px; } -/* input, label positioning */ -.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.ui-field-contain { background: none; padding: 1.5em 0; margin: 0; border-bottom-width: 1px; overflow: visible; } -.ui-field-contain:first-child { border-top-width: 0; } -.min-width-480px .ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; }/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.ui-select { display: block; position: relative; } -.ui-select select { position: absolute; left: -9999px; top: -9999px; } -.ui-select .ui-btn { overflow: hidden; } -.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: button; left: 0; top:0; width: 100%; height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); } -.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; } - -.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } -.ui-select .ui-btn-icon-right .ui-icon { right: 15px; } - -/* labels */ -label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; } - -/*listbox*/ -.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: inline-block; min-height: 1em; } -.ui-select .ui-btn-text { text-overflow: ellipsis; overflow: hidden; display: block;} - -.ui-selectmenu { position: absolute; padding: 0; z-index: 100 !important; width: 80%; max-width: 350px; padding: 6px; } -.ui-selectmenu .ui-listview { margin: 0; } -.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; } -.ui-selectmenu-hidden { top: -9999px; left: -9999px; } -.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 99; } -.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; } -.ui-selectmenu-list .ui-li .ui-icon { display: block; } -.ui-li.ui-selectmenu-placeholder { display: none; } -.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; } - -.min-width-480px label.ui-select { display: inline-block; width: 20%; margin: 0 2% 0 0; } -.min-width-480px .ui-select { width: 60%; display: inline-block; } - -/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button. this shim's content in there */ -.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; } -input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; line-height: 1.4; font-size: 16px; display: block; width: 95%; } -input.ui-input-text { -webkit-appearance: none; } -textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; } -.ui-input-search { padding: 0 30px; width: 77%; background-position: 8px 50%; background-repeat: no-repeat; position: relative; } -.ui-input-search input.ui-input-text { border: none; width: 98%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; } -.ui-input-search .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -14px; } -.ui-input-search .ui-input-clear-hidden { display: none; } - -/* orientation adjustments - incomplete!*/ -.min-width-480px label.ui-input-text { vertical-align: top; } -.min-width-480px label.ui-input-text { display: inline-block; width: 20%; margin: 0 2% 0 0; } -.min-width-480px input.ui-input-text, -.min-width-480px textarea.ui-input-text, -.min-width-480px .ui-input-search { width: 60%; display: inline-block; } -.min-width-480px .ui-input-search { width: 50%; } -.min-width-480px .ui-input-search input.ui-input-text { width: 98%; /*echos rule from above*/ } -/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -.ui-listview { margin: 0; counter-reset: listnumbering; } -.ui-content .ui-listview { margin: -15px; } -.ui-content .ui-listview-inset { margin: 1em 0; } -.ui-listview, .ui-li { list-style:none; padding:0; } -.ui-li, .ui-li.ui-field-contain { display: block; margin:0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; } -.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.ui-li-divider, .ui-li-static { padding: .5em 15px; font-size: 14px; font-weight: bold; } -.ui-li-divider { counter-reset: listnumbering; } -ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal;counter-increment: listnumbering; content: counter(listnumbering) ". "; } -ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */ -.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; } -.ui-li:last-child, .ui-li.ui-field-contain:last-child { border-bottom-width: 1px; } -.ui-li>.ui-btn-inner { display: block; position: relative; padding: 0; } -.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 75px .7em 15px; display: block; } -.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb { min-height: 60px; padding-left: 100px; } -.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon { min-height: 20px; padding-left: 40px; } -.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } -.ui-li-thumb, .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; } -.ui-li-icon { max-height: 40px; max-width: 40px; left: 10px; top: .9em; } -.ui-li-thumb, .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; } - -.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; } -.min-width-480px .ui-li-aside { width: 45%; } -.ui-li-divider { cursor: default; } -.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 95px; } -.ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 38px; } -.ui-li-divider .ui-li-count, .ui-li-static .ui-li-count { right: 10px; } -.ui-li-has-alt .ui-li-count { right: 55px; } -.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; } -.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -11px 0 0 0; border-bottom-width: 1px; } -.ui-li-link-alt .ui-btn-inner { padding: 0; position: static; } -.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; } - -.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px } -.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; } - -.ui-listview-filter-inset { margin: -15px -5px -15px -5px; background: transparent; } - -/* Odd iPad positioning issue. */ -@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) { - .ui-li .ui-btn-text { overflow: visible; } -}/* -* jQuery Mobile Framework -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. -*/ -label.ui-slider { display: block; } -input.ui-slider-input, .min-width-480px input.ui-slider-input { display: inline-block; width: 50px; } -select.ui-slider-switch { display: none; } -div.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 66%; } -a.ui-slider-handle { position: absolute; z-index: 10; top: 50%; width: 28px; height: 28px; margin-top: -15px; margin-left: -15px; } -a.ui-slider-handle .ui-btn-inner { padding-left: 0; padding-right: 0; } -.min-width-480px label.ui-slider { display: inline-block; width: 20%; margin: 0 2% 0 0; } -.min-width-480px div.ui-slider { width: 45%; } - -div.ui-slider-switch { height: 32px; overflow: hidden; margin-left: 0; } -div.ui-slider-inneroffset { margin-left: 50%; position: absolute; top: 1px; height: 100%; width: 50%; } -div.ui-slider-handle-snapping { -webkit-transition: left 100ms linear; } -div.ui-slider-labelbg { position: absolute; top:0; margin: 0; border-width: 0; } -div.ui-slider-switch div.ui-slider-labelbg-a { width: 60%; height: 100%; left: 0; } -div.ui-slider-switch div.ui-slider-labelbg-b { width: 60%; height: 100%; right: 0; } -.ui-slider-switch-a div.ui-slider-labelbg-a, .ui-slider-switch-b div.ui-slider-labelbg-b { z-index: -1; } -.ui-slider-switch-a div.ui-slider-labelbg-b, .ui-slider-switch-b div.ui-slider-labelbg-a { z-index: 0; } - -div.ui-slider-switch a.ui-slider-handle { z-index: 20; width: 101%; height: 32px; margin-top: -18px; margin-left: -101%; } -span.ui-slider-label { width: 100%; position: absolute;height: 32px; font-size: 16px; text-align: center; line-height: 2; background: none; border-color: transparent; } -span.ui-slider-label-a { left: -100%; margin-right: -1px } -span.ui-slider-label-b { right: -100%; margin-left: -1px } - --- /dev/null +++ b/css/jquery.mobile-1.0rc1.css @@ -1,1 +1,1750 @@ - +/*! + * jQuery Mobile v1.0rc1 + * http://jquerymobile.com/ + * + * Copyright 2010, jQuery Project + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + */ +/*! +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Swatches */ + +/* A +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-a { + border: 1px solid #2A2A2A /*{a-bar-border}*/; + background: #111111 /*{a-bar-background-color}*/; + color: #ffffff /*{a-bar-color}*/; + font-weight: bold; + text-shadow: 0 /*{a-bar-shadow-x}*/ -1px /*{a-bar-shadow-y}*/ 1px /*{a-bar-shadow-radius}*/ #000000 /*{a-bar-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c /*{a-bar-background-start}*/), to(#111 /*{a-bar-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); +} +.ui-bar-a, +.ui-bar-a input, +.ui-bar-a select, +.ui-bar-a textarea, +.ui-bar-a button { + font-family: Helvetica, Arial, sans-serif /*{a-bar-font}*/; +} +.ui-bar-a .ui-link-inherit { + color: #fff /*{a-bar-color}*/; +} +.ui-bar-a .ui-link { + color: #7cc4e7 /*{global-link-color}*/; + font-weight: bold; +} +.ui-body-a { + border: 1px solid #2A2A2A /*{a-body-border}*/; + background: #222222 /*{a-body-background-color}*/; + color: #fff /*{a-body-color}*/; + text-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ #000 /*{a-body-shadow-color}*/; + font-weight: normal; + background-image: -webkit-gradient(linear, left top, left bottom, from(#666 /*{a-body-background-start}*/), to(#222 /*{a-body-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); +} +.ui-body-a, +.ui-body-a input, +.ui-body-a select, +.ui-body-a textarea, +.ui-body-a button { + font-family: Helvetica, Arial, sans-serif /*{a-body-font}*/; +} +.ui-body-a .ui-link-inherit { + color: #fff /*{a-body-color}*/; +} +.ui-body-a .ui-link { + color: #2489CE /*{global-link-color}*/; + font-weight: bold; +} +.ui-br { + border-bottom: rgb(130,130,130); + border-bottom: rgba(130,130,130,.3); + border-bottom-width: 1px; + border-bottom-style: solid; +} +.ui-btn-up-a { + border: 1px solid #222 /*{a-bup-border}*/; + background: #333333 /*{a-bup-background-color}*/; + font-weight: bold; + color: #fff /*{a-bup-color}*/; + text-shadow: 0 /*{a-bup-shadow-x}*/ -1px /*{a-bup-shadow-y}*/ 1px /*{a-bup-shadow-radius}*/ #000 /*{a-bup-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#555 /*{a-bup-background-start}*/), to(#333 /*{a-bup-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); +} +.ui-btn-up-a a.ui-link-inherit { + color: #fff /*{a-bup-color}*/; +} +.ui-btn-hover-a { + border: 1px solid #000 /*{a-bhover-border}*/; + background: #444444 /*{a-bhover-background-color}*/; + font-weight: bold; + color: #fff /*{a-bhover-color}*/; + text-shadow: 0 /*{a-bhover-shadow-x}*/ -1px /*{a-bhover-shadow-y}*/ 1px /*{a-bhover-shadow-radius}*/ #000 /*{a-bhover-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#666 /*{a-bhover-background-start}*/), to(#444 /*{a-bhover-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); +} +.ui-btn-hover-a a.ui-link-inherit { + color: #fff /*{a-bhover-color}*/; +} +.ui-btn-down-a { + border: 1px solid #000 /*{a-bdown-border}*/; + background: #3d3d3d /*{a-bdown-background-color}*/; + font-weight: bold; + color: #fff /*{a-bdown-color}*/; + text-shadow: 0 /*{a-bdown-shadow-x}*/ -1px /*{a-bdown-shadow-y}*/ 1px /*{a-bdown-shadow-radius}*/ #000 /*{a-bdown-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#333 /*{a-bdown-background-start}*/), to(#5a5a5a /*{a-bdown-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); +} +.ui-btn-down-a a.ui-link-inherit { + color: #fff /*{a-bdown-color}*/; +} +.ui-btn-up-a, +.ui-btn-hover-a, +.ui-btn-down-a { + font-family: Helvetica, Arial, sans-serif /*{a-button-font}*/; + text-decoration: none; +} + + +/* B +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-b { + border: 1px solid #456f9a /*{b-bar-border}*/; + background: #5e87b0 /*{b-bar-background-color}*/; + color: #fff /*{b-bar-color}*/; + font-weight: bold; + text-shadow: 0 /*{b-bar-shadow-x}*/ -1px /*{b-bar-shadow-y}*/ 1px /*{b-bar-shadow-radius}*/ #254f7a /*{b-bar-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#81a8ce /*{b-bar-background-start}*/), to(#5e87b0 /*{b-bar-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); +} +.ui-bar-b, +.ui-bar-b input, +.ui-bar-b select, +.ui-bar-b textarea, +.ui-bar-b button { + font-family: Helvetica, Arial, sans-serif /*{b-bar-font}*/; +} +.ui-bar-b .ui-link-inherit { + color: #fff /*{b-bar-color}*/; +} +.ui-bar-b .ui-link { + color: #7cc4e7 /*{global-link-color}*/; + font-weight: bold; +} + +.ui-body-b { + border: 1px solid #C6C6C6 /*{b-body-border}*/; + background: #cccccc /*{b-body-background-color}*/; + color: #333333 /*{b-body-color}*/; + text-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ #fff /*{b-body-shadow-color}*/; + font-weight: normal; + background-image: -webkit-gradient(linear, left top, left bottom, from(#e6e6e6 /*{b-body-background-start}*/), to(#ccc /*{b-body-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); +} +.ui-body-b, +.ui-body-b input, +.ui-body-b select, +.ui-body-b textarea, +.ui-body-b button { + font-family: Helvetica, Arial, sans-serif /*{b-body-font}*/; +} +.ui-body-b .ui-link-inherit { + color: #333333 /*{b-body-color}*/; +} +.ui-body-b .ui-link { + color: #2489CE /*{global-link-color}*/; + font-weight: bold; +} +.ui-btn-up-b { + border: 1px solid #145072 /*{b-bup-border}*/; + background: #2567ab /*{b-bup-background-color}*/; + font-weight: bold; + color: #fff /*{b-bup-color}*/; + text-shadow: 0 /*{b-bup-shadow-x}*/ -1px /*{b-bup-shadow-y}*/ 1px /*{b-bup-shadow-radius}*/ #145072 /*{b-bup-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#5f9cc5 /*{b-bup-background-start}*/), to(#396b9e /*{b-bup-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); +} +.ui-btn-up-b a.ui-link-inherit { + color: #fff /*{b-bup-color}*/; +} +.ui-btn-hover-b { + border: 1px solid #00516e /*{b-bhover-border}*/; + background: #4b88b6 /*{b-bhover-background-color}*/; + font-weight: bold; + color: #fff /*{b-bhover-color}*/; + text-shadow: 0 /*{b-bhover-shadow-x}*/ -1px /*{b-bhover-shadow-y}*/ 1px /*{b-bhover-shadow-radius}*/ #014D68 /*{b-bhover-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#72b0d4 /*{b-bhover-background-start}*/), to(#4b88b6 /*{b-bhover-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); +} +.ui-btn-hover-b a.ui-link-inherit { + color: #fff /*{b-bhover-color}*/; +} +.ui-btn-down-b { + border: 1px solid #225377 /*{b-bdown-border}*/; + background: #4e89c5 /*{b-bdown-background-color}*/; + font-weight: bold; + color: #fff /*{b-bdown-color}*/; + text-shadow: 0 /*{b-bdown-shadow-x}*/ -1px /*{b-bdown-shadow-y}*/ 1px /*{b-bdown-shadow-radius}*/ #225377 /*{b-bdown-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#396b9e /*{b-bdown-background-start}*/), to(#4e89c5 /*{b-bdown-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); +} +.ui-btn-down-b a.ui-link-inherit { + color: #fff /*{b-bdown-color}*/; +} +.ui-btn-up-b, +.ui-btn-hover-b, +.ui-btn-down-b { + font-family: Helvetica, Arial, sans-serif /*{b-button-font}*/; + text-decoration: none; +} + + +/* C +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-c { + border: 1px solid #B3B3B3 /*{c-bar-border}*/; + background: #e9eaeb /*{c-bar-background-color}*/; + color: #3E3E3E /*{c-bar-color}*/; + font-weight: bold; + text-shadow: 0 /*{c-bar-shadow-x}*/ 1px /*{c-bar-shadow-y}*/ 1px /*{c-bar-shadow-radius}*/ #fff /*{c-bar-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0f0 /*{c-bar-background-start}*/), to(#e9eaeb /*{c-bar-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); +} + +.ui-bar-c .ui-link { + color: #2489CE /*{global-link-color}*/; + font-weight: bold; +} + +.ui-bar-c, +.ui-bar-c input, +.ui-bar-c select, +.ui-bar-c textarea, +.ui-bar-c button { + font-family: Helvetica, Arial, sans-serif /*{c-bar-font}*/; +} +.ui-body-c { + border: 1px solid #B3B3B3 /*{c-body-border}*/; + color: #333333 /*{c-body-color}*/; + text-shadow: 0 /*{c-body-shadow-x}*/ 1px /*{c-body-shadow-y}*/ 0 /*{c-body-shadow-radius}*/ #fff /*{c-body-shadow-color}*/; + background: #f0f0f0 /*{c-body-background-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee /*{c-body-background-start}*/), to(#ddd /*{c-body-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); +} +.ui-body-c, +.ui-body-c input, +.ui-body-c select, +.ui-body-c textarea, +.ui-body-c button { + font-family: Helvetica, Arial, sans-serif /*{c-body-font}*/; +} +.ui-body-c .ui-link-inherit { + color: #333333 /*{c-body-color}*/; +} +.ui-body-c .ui-link { + color: #2489CE /*{global-link-color}*/; + font-weight: bold; +} + +.ui-btn-up-c { + border: 1px solid #ccc /*{c-bup-border}*/; + background: #eee /*{c-bup-background-color}*/; + font-weight: bold; + color: #444 /*{c-bup-color}*/; + text-shadow: 0 /*{c-bup-shadow-x}*/ 1px /*{c-bup-shadow-y}*/ 1px /*{c-bup-shadow-radius}*/ #f6f6f6 /*{c-bup-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd /*{c-bup-background-start}*/), to(#eee /*{c-bup-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); +} +.ui-btn-up-c a.ui-link-inherit { + color: #2F3E46 /*{c-bup-color}*/; +} + +.ui-btn-hover-c { + border: 1px solid #bbb /*{c-bhover-border}*/; + background: #dadada /*{c-bhover-background-color}*/; + font-weight: bold; + color: #101010 /*{c-bhover-color}*/; + text-shadow: 0 /*{c-bhover-shadow-x}*/ 1px /*{c-bhover-shadow-y}*/ 1px /*{c-bhover-shadow-radius}*/ #fff /*{c-bhover-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ededed /*{c-bhover-background-start}*/), to(#dadada /*{c-bhover-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); +} +.ui-btn-hover-c a.ui-link-inherit { + color: #2F3E46 /*{c-bhover-color}*/; +} +.ui-btn-down-c { + border: 1px solid #808080 /*{c-bdown-border}*/; + background: #fdfdfd /*{c-bdown-background-color}*/; + font-weight: bold; + color: #111111 /*{c-bdown-color}*/; + text-shadow: 0 /*{c-bdown-shadow-x}*/ 1px /*{c-bdown-shadow-y}*/ 1px /*{c-bdown-shadow-radius}*/ #ffffff /*{c-bdown-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee /*{c-bdown-background-start}*/), to(#fdfdfd /*{c-bdown-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); +} +.ui-btn-down-c a.ui-link-inherit { + color: #2F3E46 /*{c-bdown-color}*/; +} +.ui-btn-up-c, +.ui-btn-hover-c, +.ui-btn-down-c { + font-family: Helvetica, Arial, sans-serif /*{c-button-font}*/; + text-decoration: none; +} + + +/* D +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-d { + border: 1px solid #ccc /*{d-bar-border}*/; + background: #bbb /*{d-bar-background-color}*/; + color: #333 /*{d-bar-color}*/; + text-shadow: 0 /*{d-bar-shadow-x}*/ 1px /*{d-bar-shadow-y}*/ 0 /*{d-bar-shadow-radius}*/ #eee /*{d-bar-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#ddd /*{d-bar-background-start}*/), to(#bbb /*{d-bar-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); +} +.ui-bar-d, +.ui-bar-d input, +.ui-bar-d select, +.ui-bar-d textarea, +.ui-bar-d button { + font-family: Helvetica, Arial, sans-serif /*{d-bar-font}*/; +} +.ui-bar-d .ui-link-inherit { + color: #333 /*{d-bar-color}*/; +} +.ui-bar-d .ui-link { + color: #2489CE /*{global-link-color}*/; + font-weight: bold; +} +.ui-body-d { + border: 1px solid #ccc /*{d-body-border}*/; + color: #333333 /*{d-body-color}*/; + text-shadow: 0 /*{d-body-shadow-x}*/ 1px /*{d-body-shadow-y}*/ 0 /*{d-body-shadow-radius}*/ #fff /*{d-body-shadow-color}*/; + background: #ffffff /*{d-body-background-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#fff /*{d-body-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); +} +.ui-body-d, +.ui-body-d input, +.ui-body-d select, +.ui-body-d textarea, +.ui-body-d button { + font-family: Helvetica, Arial, sans-serif /*{d-body-font}*/; +} +.ui-body-d .ui-link-inherit { + color: #333333 /*{d-body-color}*/; +} +.ui-body-d .ui-link { + color: #2489CE /*{global-link-color}*/; + font-weight: bold; +} +.ui-btn-up-d { + border: 1px solid #ccc /*{d-bup-border}*/; + background: #fff /*{d-bup-background-color}*/; + font-weight: bold; + color: #444 /*{d-bup-color}*/; + text-shadow: 0 /*{d-bup-shadow-x}*/ 1px /*{d-bup-shadow-y}*/ 1px /*{d-bup-shadow-radius}*/ #fff /*{d-bup-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#fff /*{d-bup-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); +} +.ui-btn-up-d a.ui-link-inherit { + color: #333 /*{d-bup-color}*/; +} +.ui-btn-hover-d { + border: 1px solid #aaa /*{d-bhover-border}*/; + background: #eeeeee /*{d-bhover-background-color}*/; + font-weight: bold; + color: #222 /*{d-bhover-color}*/; + cursor: pointer; + text-shadow: 0 /*{d-bhover-shadow-x}*/ 1px /*{d-bhover-shadow-y}*/ 1px /*{d-bhover-shadow-radius}*/ #fff /*{d-bhover-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fdfdfd), to(#eee /*{d-bhover-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); +} +.ui-btn-hover-d a.ui-link-inherit { + color: #222 /*{d-bhover-color}*/; +} +.ui-btn-down-d { + border: 1px solid #aaaaaa /*{d-bdown-border}*/; + background: #ffffff /*{d-bdown-background-color}*/; + font-weight: bold; + color: #111 /*{d-bdown-color}*/; + text-shadow: 0 /*{d-bdown-shadow-x}*/ 1px /*{d-bdown-shadow-y}*/ 1px /*{d-bdown-shadow-radius}*/ #ffffff /*{d-bdown-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee /*{d-bdown-background-start}*/), to(#fff /*{d-bdown-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); +} +.ui-btn-down-d a.ui-link-inherit { + color: #111 /*{d-bdown-color}*/; +} +.ui-btn-up-d, +.ui-btn-hover-d, +.ui-btn-down-d { + font-family: Helvetica, Arial, sans-serif /*{d-button-font}*/; + text-decoration: none; +} + + +/* E +-----------------------------------------------------------------------------------------------------------*/ + +.ui-bar-e { + border: 1px solid #F7C942 /*{e-bar-border}*/; + background: #fadb4e /*{e-bar-background-color}*/; + color: #333 /*{e-bar-color}*/; + text-shadow: 0 /*{e-bar-shadow-x}*/ 1px /*{e-bar-shadow-y}*/ 0 /*{e-bar-shadow-radius}*/ #fff /*{e-bar-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fceda7 /*{e-bar-background-start}*/), to(#fadb4e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); +} +.ui-bar-e, +.ui-bar-e input, +.ui-bar-e select, +.ui-bar-e textarea, +.ui-bar-e button { + font-family: Helvetica, Arial, sans-serif /*{e-bar-font}*/; +} +.ui-bar-e .ui-link-inherit { + color: #333 /*{e-bar-color}*/; +} +.ui-bar-e .ui-link { + color: #2489CE /*{global-link-color}*/; + font-weight: bold; +} +.ui-body-e { + border: 1px solid #F7C942 /*{e-body-border}*/; + color: #333333 /*{e-body-color}*/; + text-shadow: 0 /*{e-body-shadow-x}*/ 1px /*{e-body-shadow-y}*/ 0 /*{e-body-shadow-radius}*/ #fff /*{e-body-shadow-color}*/; + background: #faeb9e /*{e-body-background-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff /*{e-body-background-start}*/), to(#faeb9e /*{e-body-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); +} +.ui-body-e, +.ui-body-e input, +.ui-body-e select, +.ui-body-e textarea, +.ui-body-e button { + font-family: Helvetica, Arial, sans-serif /*{e-body-font}*/; +} +.ui-body-e .ui-link-inherit { + color: #333333 /*{e-body-color}*/; +} +.ui-body-e .ui-link { + color: #2489CE /*{global-link-color}*/; + font-weight: bold; +} +.ui-btn-up-e { + border: 1px solid #F7C942 /*{e-bup-border}*/; + background: #fadb4e /*{e-bup-background-color}*/; + font-weight: bold; + color: #333 /*{e-bup-color}*/; + text-shadow: 0 /*{e-bup-shadow-x}*/ 1px /*{e-bup-shadow-y}*/ 0 /*{e-bup-shadow-radius}*/ #fff /*{e-bup-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fceda7 /*{e-bup-background-start}*/), to(#fadb4e /*{e-bup-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); +} +.ui-btn-up-e a.ui-link-inherit { + color: #333 /*{e-bup-color}*/; +} +.ui-btn-hover-e { + border: 1px solid #e79952 /*{e-bhover-border}*/; + background: #fbe26f /*{e-bhover-background-color}*/; + font-weight: bold; + color: #111 /*{e-bhover-color}*/; + text-shadow: 0 /*{e-bhover-shadow-x}*/ 1px /*{e-bhover-shadow-y}*/ 1px /*{e-bhover-shadow-radius}*/ #fff /*{e-bhover-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf0b5 /*{e-bhover-background-start}*/), to(#fbe26f /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); +} + +.ui-btn-hover-e a.ui-link-inherit { + color: #333 /*{e-bhover-color}*/; +} +.ui-btn-down-e { + border: 1px solid #F7C942 /*{e-bdown-border}*/; + background: #fceda7 /*{e-bdown-background-color}*/; + font-weight: bold; + color: #111 /*{e-bdown-color}*/; + text-shadow: 0 /*{e-bdown-shadow-x}*/ 1px /*{e-bdown-shadow-y}*/ 1px /*{e-bdown-shadow-radius}*/ #ffffff /*{e-bdown-shadow-color}*/; + background-image: -webkit-gradient(linear, left top, left bottom, from(#fadb4e /*{e-bdown-background-start}*/), to(#fceda7 /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); +} +.ui-btn-down-e a.ui-link-inherit { + color: #333 /*{e-bdown-color}*/; +} +.ui-btn-up-e, +.ui-btn-hover-e, +.ui-btn-down-e { + font-family: Helvetica, Arial, sans-serif /*{e-button-font}*/; + text-decoration: none; +} + +/* Structure */ + +/* links within "buttons" +-----------------------------------------------------------------------------------------------------------*/ + +a.ui-link-inherit { + text-decoration: none !important; +} + +/* links and their different states +-----------------------------------------------------------------------------------------------------------*/ + +.ui-link{ + color: #2489CE /*{global-link-color}*/ +} + +.ui-link:hover{ + color: #2489CE /*{global-link-hover}*/ +} + +.ui-link:active{ + color: #2489CE /*{global-link-active}*/ +} + +.ui-link:visited{ + color: #2489CE /*{global-link-visited}*/ +} + +/* Active class used as the "on" state across all themes +-----------------------------------------------------------------------------------------------------------*/ + +.ui-btn-active { + border: 1px solid #155678 /*{global-active-border}*/; + background: #4596ce /*{global-active-background-color}*/; + font-weight: bold; + color: #fff /*{global-active-color}*/; + cursor: pointer; + text-shadow: 0 /*{global-active-shadow-x}*/ -1px /*{global-active-shadow-y}*/ 1px /*{global-active-shadow-radius}*/ #145072 /*{global-active-shadow-color}*/; + text-decoration: none; + background-image: -webkit-gradient(linear, left top, left bottom, from(#85bae4 /*{global-active-background-start}*/), to(#5393c5 /*{global-active-background-end}*/)); /* Saf4+, Chrome */ + background-image: -webkit-linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Chrome 10+, Saf5.1+ */ + background-image: -moz-linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* FF3.6 */ + background-image: -ms-linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* IE10 */ + background-image: -o-linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Opera 11.10+ */ + background-image: linear-gradient(top, #85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); + outline: none; + font-family: Helvetica, Arial, sans-serif /*{global-active-font}*/; +} +.ui-btn-active a.ui-link-inherit { + color: #fff /*{global-active-color}*/; +} + + +/* button inner top highlight +-----------------------------------------------------------------------------------------------------------*/ + +.ui-btn-inner { + border-top: 1px solid #fff; + border-color: rgba(255,255,255,.3); +} + + +/* corner rounding classes +-----------------------------------------------------------------------------------------------------------*/ + +.ui-corner-tl { + -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/; + -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/; + border-top-left-radius: .6em /*{global-radii-blocks}*/; +} +.ui-corner-tr { + -moz-border-radius-topright: .6em /*{global-radii-blocks}*/; + -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/; + border-top-right-radius: .6em /*{global-radii-blocks}*/; +} +.ui-corner-bl { + -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/; + -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/; + border-bottom-left-radius: .6em /*{global-radii-blocks}*/; +} +.ui-corner-br { + -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/; + -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/; + border-bottom-right-radius: .6em /*{global-radii-blocks}*/; +} +.ui-corner-top { + -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/; + -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/; + border-top-left-radius: .6em /*{global-radii-blocks}*/; + -moz-border-radius-topright: .6em /*{global-radii-blocks}*/; + -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/; + border-top-right-radius: .6em /*{global-radii-blocks}*/; +} +.ui-corner-bottom { + -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/; + -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/; + border-bottom-left-radius: .6em /*{global-radii-blocks}*/; + -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/; + -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/; + border-bottom-right-radius: .6em /*{global-radii-blocks}*/; + } +.ui-corner-right { + -moz-border-radius-topright: .6em /*{global-radii-blocks}*/; + -webkit-border-top-right-radius: .6em /*{global-radii-blocks}*/; + border-top-right-radius: .6em /*{global-radii-blocks}*/; + -moz-border-radius-bottomright: .6em /*{global-radii-blocks}*/; + -webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/; + border-bottom-right-radius: .6em /*{global-radii-blocks}*/; +} +.ui-corner-left { + -moz-border-radius-topleft: .6em /*{global-radii-blocks}*/; + -webkit-border-top-left-radius: .6em /*{global-radii-blocks}*/; + border-top-left-radius: .6em /*{global-radii-blocks}*/; + -moz-border-radius-bottomleft: .6em /*{global-radii-blocks}*/; + -webkit-border-bottom-left-radius: .6em /*{global-radii-blocks}*/; + border-bottom-left-radius: .6em /*{global-radii-blocks}*/; +} +.ui-corner-all { + -moz-border-radius: .6em /*{global-radii-blocks}*/; + -webkit-border-radius: .6em /*{global-radii-blocks}*/; + border-radius: .6em /*{global-radii-blocks}*/; +} +.ui-corner-none { + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} + +/* Interaction cues +-----------------------------------------------------------------------------------------------------------*/ +.ui-disabled { + opacity: .3; +} +.ui-disabled, +.ui-disabled a { + cursor: default; +} + +/* Icons +-----------------------------------------------------------------------------------------------------------*/ + +.ui-icon, +.ui-icon-searchfield:after { + background: #666 /*{global-icon-color}*/; + background: rgba(0,0,0,.4) /*{global-icon-disc}*/; + background-image: url(images/icons-18-white.png) /*{global-icon-set}*/; + background-repeat: no-repeat; + -moz-border-radius: 9px; + -webkit-border-radius: 9px; + border-radius: 9px; +} + + +/* Alt icon color +-----------------------------------------------------------------------------------------------------------*/ + +.ui-icon-alt { + background: #fff; + background: rgba(255,255,255,.3); + background-image: url(images/icons-18-black.png); + background-repeat: no-repeat; +} + +/* HD/"retina" sprite +-----------------------------------------------------------------------------------------------------------*/ + +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (min--moz-device-pixel-ratio: 1.5), + only screen and (min-resolution: 240dpi) { + + .ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r, + .ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check, + .ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back, + .ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-search, .ui-icon-searchfield:after, + .ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on { + background-image: url(images/icons-36-white.png); + -moz-background-size: 776px 18px; + -o-background-size: 776px 18px; + -webkit-background-size: 776px 18px; + background-size: 776px 18px; + } + .ui-icon-alt { + background-image: url(images/icons-36-black.png); + } +} + +/* plus minus */ +.ui-icon-plus { + background-position: -0 50%; +} +.ui-icon-minus { + background-position: -36px 50%; +} + +/* delete/close */ +.ui-icon-delete { + background-position: -72px 50%; +} + +/* arrows */ +.ui-icon-arrow-r { + background-position: -108px 50%; +} +.ui-icon-arrow-l { + background-position: -144px 50%; +} +.ui-icon-arrow-u { + background-position: -180px 50%; +} +.ui-icon-arrow-d { + background-position: -216px 50%; +} + +/* misc */ +.ui-icon-check { + background-position: -252px 50%; +} +.ui-icon-gear { + background-position: -288px 50%; +} +.ui-icon-refresh { + background-position: -324px 50%; +} +.ui-icon-forward { + background-position: -360px 50%; +} +.ui-icon-back { + background-position: -396px 50%; +} +.ui-icon-grid { + background-position: -432px 50%; +} +.ui-icon-star { + background-position: -468px 50%; +} +.ui-icon-alert { + background-position: -504px 50%; +} +.ui-icon-info { + background-position: -540px 50%; +} +.ui-icon-home { + background-position: -576px 50%; +} +.ui-icon-search, +.ui-icon-searchfield:after { + background-position: -612px 50%; +} +.ui-icon-checkbox-off { + background-position: -684px 50%; +} +.ui-icon-checkbox-on { + background-position: -648px 50%; +} +.ui-icon-radio-off { + background-position: -756px 50%; +} +.ui-icon-radio-on { + background-position: -720px 50%; +} + + +/* checks,radios */ +.ui-checkbox .ui-icon { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +.ui-icon-checkbox-off, +.ui-icon-radio-off { + background-color: transparent; +} +.ui-checkbox-on .ui-icon, +.ui-radio-on .ui-icon { + background-color: #4596ce /*{global-active-background-color}*/; /* NOTE: this hex should match the active state color. It's repeated here for cascade */ +} + +/* loading icon */ +.ui-icon-loading { + background-image: url(images/ajax-loader.png); + width: 40px; + height: 40px; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; + border-radius: 20px; + background-size: 35px 35px; +} + + +/* Button corner classes +-----------------------------------------------------------------------------------------------------------*/ + +.ui-btn-corner-tl { + -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/; + -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/; + border-top-left-radius: 1em /*{global-radii-buttons}*/; +} +.ui-btn-corner-tr { + -moz-border-radius-topright: 1em /*{global-radii-buttons}*/; + -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/; + border-top-right-radius: 1em /*{global-radii-buttons}*/; +} +.ui-btn-corner-bl { + -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/; + -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/; + border-bottom-left-radius: 1em /*{global-radii-buttons}*/; +} +.ui-btn-corner-br { + -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/; + -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/; + border-bottom-right-radius: 1em /*{global-radii-buttons}*/; +} +.ui-btn-corner-top { + -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/; + -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/; + border-top-left-radius: 1em /*{global-radii-buttons}*/; + -moz-border-radius-topright: 1em /*{global-radii-buttons}*/; + -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/; + border-top-right-radius: 1em /*{global-radii-buttons}*/; +} +.ui-btn-corner-bottom { + -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/; + -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/; + border-bottom-left-radius: 1em /*{global-radii-buttons}*/; + -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/; + -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/; + border-bottom-right-radius: 1em /*{global-radii-buttons}*/; +} +.ui-btn-corner-right { + -moz-border-radius-topright: 1em /*{global-radii-buttons}*/; + -webkit-border-top-right-radius: 1em /*{global-radii-buttons}*/; + border-top-right-radius: 1em /*{global-radii-buttons}*/; + -moz-border-radius-bottomright: 1em /*{global-radii-buttons}*/; + -webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/; + border-bottom-right-radius: 1em /*{global-radii-buttons}*/; +} +.ui-btn-corner-left { + -moz-border-radius-topleft: 1em /*{global-radii-buttons}*/; + -webkit-border-top-left-radius: 1em /*{global-radii-buttons}*/; + border-top-left-radius: 1em /*{global-radii-buttons}*/; + -moz-border-radius-bottomleft: 1em /*{global-radii-buttons}*/; + -webkit-border-bottom-left-radius: 1em /*{global-radii-buttons}*/; + border-bottom-left-radius: 1em /*{global-radii-buttons}*/; +} +.ui-btn-corner-all { + -moz-border-radius: 1em /*{global-radii-buttons}*/; + -webkit-border-radius: 1em /*{global-radii-buttons}*/; + border-radius: 1em /*{global-radii-buttons}*/; +} + +/* radius clip workaround for cleaning up corner trapping */ +.ui-corner-tl, +.ui-corner-tr, +.ui-corner-bl, +.ui-corner-br, +.ui-corner-top, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-left, +.ui-corner-all, +.ui-btn-corner-tl, +.ui-btn-corner-tr, +.ui-btn-corner-bl, +.ui-btn-corner-br, +.ui-btn-corner-top, +.ui-btn-corner-bottom, +.ui-btn-corner-right, +.ui-btn-corner-left, +.ui-btn-corner-all { + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +/* Overlay / modal +-----------------------------------------------------------------------------------------------------------*/ + +.ui-overlay { + background: #666; + opacity: .5; + filter: Alpha(Opacity=50); + position: absolute; + width: 100%; + height: 100%; +} +.ui-overlay-shadow { + -moz-box-shadow: 0px 0px 12px rgba(0,0,0,.6); + -webkit-box-shadow: 0px 0px 12px rgba(0,0,0,.6); + box-shadow: 0px 0px 12px rgba(0,0,0,.6); +} +.ui-shadow { + -moz-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/; + -webkit-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/; + box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ rgba(0,0,0,.3) /*{global-box-shadow-color}*/; +} +.ui-bar-a .ui-shadow, +.ui-bar-b .ui-shadow , +.ui-bar-c .ui-shadow { + -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.3); + -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.3); + box-shadow: 0px 1px 0 rgba(255,255,255,.3); +} +.ui-shadow-inset { + -moz-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); + -webkit-box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); + box-shadow: inset 0px 1px 4px rgba(0,0,0,.2); +} +.ui-icon-shadow { + -moz-box-shadow: 0px 1px 0 rgba(255,255,255,.4); + -webkit-box-shadow: 0px 1px 0 rgba(255,255,255,.4); + box-shadow: 0px 1px 0 rgba(255,255,255,.4); +} + +/* Focus state - set here for specificity +-----------------------------------------------------------------------------------------------------------*/ + +.ui-focus { + -moz-box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/; + -webkit-box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/; + box-shadow: 0px 0px 12px #387bbe /*{global-active-background-color}*/; +} + +/* unset box shadow in browsers that don't do it right +-----------------------------------------------------------------------------------------------------------*/ + +.ui-mobile-nosupport-boxshadow * { + -moz-box-shadow: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +/* ...and bring back focus */ +.ui-mobile-nosupport-boxshadow .ui-focus { + outline-width: 2px; +}/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* some unsets - more probably needed */ +.ui-mobile, .ui-mobile body { height: 100%; } +.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; } +.ui-mobile a img, .ui-mobile fieldset { border: 0; } + +/* responsive page widths */ +.ui-mobile-viewport { margin: 0; overflow-x: hidden; -webkit-text-size-adjust: none; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } + +/* "page" containers - full-screen views, one should always be in view post-pageload */ +.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; } +.ui-mobile .ui-page-active { display: block; overflow: visible; } + +/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */ +.ui-page { outline: none; } + +/* native overflow scrolling */ +.ui-page.ui-mobile-touch-overflow, +.ui-mobile-touch-overflow.ui-native-fixed .ui-content { + overflow: auto; + height: 100%; + -webkit-overflow-scrolling: touch; + -moz-overflow-scrolling: touch; + -o-overflow-scrolling: touch; + -ms-overflow-scrolling: touch; + overflow-scrolling: touch; +} +.ui-page.ui-mobile-touch-overflow, +.ui-page.ui-mobile-touch-overflow * { + /* some level of transform keeps elements from blinking out of visibility on iOS */ + -webkit-transform: rotateY(0); +} +.ui-page.ui-mobile-pre-transition { + display: block; +} + +/* loading screen */ +.ui-loading .ui-mobile-viewport { overflow: hidden !important; } +.ui-loading .ui-loader { display: block; } +.ui-loading .ui-page { overflow: hidden; } +.ui-loader { display: none; position: absolute; opacity: .85; z-index: 100; left: 50%; width: 200px; margin-left: -130px; margin-top: -35px; padding: 10px 30px; } +.ui-loader h1 { font-size: 15px; text-align: center; } +.ui-loader .ui-icon { position: static; display: block; opacity: .9; margin: 0 auto; width: 35px; height: 35px; background-color: transparent; } + +/*fouc*/ +.ui-mobile-rendering > * { visibility: hidden; } + +/*headers, content panels*/ +.ui-bar, .ui-body { position: relative; padding: .4em 15px; overflow: hidden; display: block; clear:both; } +.ui-bar { font-size: 16px; margin: 0; } +.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; } + +.ui-header, .ui-footer { display: block; } +.ui-page .ui-header, .ui-page .ui-footer { position: relative; } +.ui-header .ui-btn-left { position: absolute; left: 10px; top: .4em; } +.ui-header .ui-btn-right { position: absolute; right: 10px; top: .4em; } +.ui-header .ui-title, .ui-footer .ui-title { min-height: 1.1em; text-align: center; font-size: 16px; display: block; margin: .6em 90px .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; } + +/*content area*/ +.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; } +.ui-page-fullscreen .ui-content { padding:0; } + +/* native fixed headers and footers */ +.ui-mobile-touch-overflow.ui-page.ui-native-fixed, +.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen { + overflow: visible; +} +.ui-mobile-touch-overflow.ui-native-fixed .ui-header, +.ui-mobile-touch-overflow.ui-native-fixed .ui-footer { + position: fixed; + left: 0; + right: 0; + top: 0; + z-index: 200; +} +.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer { + top: auto; + bottom: 0; +} +.ui-mobile-touch-overflow.ui-native-fixed .ui-content { + padding-top: 2.5em; + padding-bottom: 3em; + top: 0; + bottom: 0; + height: auto; + position: absolute; +} +.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content { + padding-top: 0; + padding-bottom: 0; +} +.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header, +.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer { + opacity: .9; +} +.ui-native-bars-hidden { + display: none; +} + +/* icons sizing */ +.ui-icon { width: 18px; height: 18px; } + +/* fullscreen class on ui-content div */ +.ui-fullscreen { } +.ui-fullscreen img { max-width: 100%; } + +/* non-js content hiding */ +.ui-nojs { position: absolute; left: -9999px; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.spin { + -webkit-transform: rotate(360deg); + -webkit-animation-name: spin; + -webkit-animation-duration: 1s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-timing-function: linear; +} +@-webkit-keyframes spin { + from {-webkit-transform: rotate(0deg);} + to {-webkit-transform: rotate(360deg);} +} + +/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/ +Built by David Kaneda and maintained by Jonathan Stark. +*/ +.in, .out { + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-duration: 350ms; +} + + +.slide.out { + -webkit-transform: translateX(-100%); + -webkit-animation-name: slideouttoleft; +} + +.slide.in { + -webkit-transform: translateX(0); + -webkit-animation-name: slideinfromright; +} + +.slide.out.reverse { + -webkit-transform: translateX(100%); + -webkit-animation-name: slideouttoright; +} + +.slide.in.reverse { + -webkit-transform: translateX(0); + -webkit-animation-name: slideinfromleft; +} + +.slideup.out { + -webkit-animation-name: dontmove; + z-index: 0; +} + +.slideup.in { + -webkit-transform: translateY(0); + -webkit-animation-name: slideinfrombottom; + z-index: 10; +} + +.slideup.in.reverse { + z-index: 0; + -webkit-animation-name: dontmove; +} + +.slideup.out.reverse { + -webkit-transform: translateY(100%); + z-index: 10; + -webkit-animation-name: slideouttobottom; +} + +.slidedown.out { + -webkit-animation-name: dontmove; + z-index: 0; +} + +.slidedown.in { + -webkit-transform: translateY(0); + -webkit-animation-name: slideinfromtop; + z-index: 10; +} + +.slidedown.in.reverse { + z-index: 0; + -webkit-animation-name: dontmove; +} + +.slidedown.out.reverse { + -webkit-transform: translateY(-100%); + z-index: 10; + -webkit-animation-name: slideouttotop; +} + +@-webkit-keyframes slideinfromright { + from { -webkit-transform: translateX(100%); } + to { -webkit-transform: translateX(0); } +} + +@-webkit-keyframes slideinfromleft { + from { -webkit-transform: translateX(-100%); } + to { -webkit-transform: translateX(0); } +} + +@-webkit-keyframes slideouttoleft { + from { -webkit-transform: translateX(0); } + to { -webkit-transform: translateX(-100%); } +} + +@-webkit-keyframes slideouttoright { + from { -webkit-transform: translateX(0); } + to { -webkit-transform: translateX(100%); } +} + +@-webkit-keyframes slideinfromtop { + from { -webkit-transform: translateY(-100%); } + to { -webkit-transform: translateY(0); } +} + +@-webkit-keyframes slideinfrombottom { + from { -webkit-transform: translateY(100%); } + to { -webkit-transform: translateY(0); } +} + +@-webkit-keyframes slideouttobottom { + from { -webkit-transform: translateY(0); } + to { -webkit-transform: translateY(100%); } +} + +@-webkit-keyframes slideouttotop { + from { -webkit-transform: translateY(0); } + to { -webkit-transform: translateY(-100%); } +} +@-webkit-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +@-webkit-keyframes fadeout { + from { opacity: 1; } + to { opacity: 0; } +} + +.fade.out { + z-index: 0; + -webkit-animation-name: fadeout; +} + +.fade.in { + opacity: 1; + z-index: 10; + -webkit-animation-name: fadein; +} + +/* The properties in this rule are only necessary for the 'flip' transition. + * We need specify the perspective to create a projection matrix. This will add + * some depth as the element flips. The depth number represents the distance of + * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate + * value. + */ +.viewport-flip { + -webkit-perspective: 1000; + position: absolute; +} + +.ui-mobile-viewport-transitioning, +.ui-mobile-viewport-transitioning .ui-page { + width: 100%; + height: 100%; + overflow: hidden; +} + +.flip { + -webkit-animation-duration: .65s; + -webkit-backface-visibility:hidden; + -webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */ +} + +.flip.out { + -webkit-transform: rotateY(-180deg) scale(.8); + -webkit-animation-name: flipouttoleft; +} + +.flip.in { + -webkit-transform: rotateY(0) scale(1); + -webkit-animation-name: flipinfromleft; +} + +/* Shake it all about */ + +.flip.out.reverse { + -webkit-transform: rotateY(180deg) scale(.8); + -webkit-animation-name: flipouttoright; +} + +.flip.in.reverse { + -webkit-transform: rotateY(0) scale(1); + -webkit-animation-name: flipinfromright; +} + +@-webkit-keyframes flipinfromright { + from { -webkit-transform: rotateY(-180deg) scale(.8); } + to { -webkit-transform: rotateY(0) scale(1); } +} + +@-webkit-keyframes flipinfromleft { + from { -webkit-transform: rotateY(180deg) scale(.8); } + to { -webkit-transform: rotateY(0) scale(1); } +} + +@-webkit-keyframes flipouttoleft { + from { -webkit-transform: rotateY(0) scale(1); } + to { -webkit-transform: rotateY(-180deg) scale(.8); } +} + +@-webkit-keyframes flipouttoright { + from { -webkit-transform: rotateY(0) scale(1); } + to { -webkit-transform: rotateY(180deg) scale(.8); } +} + + +/* Hackish, but reliable. */ + +@-webkit-keyframes dontmove { + from { opacity: 1; } + to { opacity: 1; } +} + +.pop { + -webkit-transform-origin: 50% 50%; +} + +.pop.in { + -webkit-transform: scale(1); + opacity: 1; + -webkit-animation-name: popin; + z-index: 10; +} + +.pop.in.reverse { + z-index: 0; + -webkit-animation-name: dontmove; +} + +.pop.out.reverse { + -webkit-transform: scale(.2); + opacity: 0; + -webkit-animation-name: popout; + z-index: 10; +} + +@-webkit-keyframes popin { + from { + -webkit-transform: scale(.2); + opacity: 0; + } + to { + -webkit-transform: scale(1); + opacity: 1; + } +} + +@-webkit-keyframes popout { + from { + -webkit-transform: scale(1); + opacity: 1; + } + to { + -webkit-transform: scale(.2); + opacity: 0; + } +}/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ + +/* content configurations. */ +.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; } +.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;} + +/* grid solo: 100 - single item fallback */ +.ui-grid-solo .ui-block-a { width: 100%; float: none; } + +/* grid a: 50/50 */ +.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; } +.ui-grid-a .ui-block-a { clear: left; } + +/* grid b: 33/33/33 */ +.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; } +.ui-grid-b .ui-block-a { clear: left; } + +/* grid c: 25/25/25/25 */ +.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; } +.ui-grid-c .ui-block-a { clear: left; } + +/* grid d: 20/20/20/20/20 */ +.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; } +.ui-grid-d .ui-block-a { clear: left; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +/* fixed page header & footer configuration */ +.ui-header, .ui-footer, .ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { position: absolute; overflow: hidden; width: 100%; border-left-width: 0; border-right-width: 0; } +.ui-header-fixed, .ui-footer-fixed { + z-index: 1000; + -webkit-transform: translateZ(0); /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */ +} +.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline { display: none; } +.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { opacity: .9; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-navbar { overflow: hidden; } +.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;} +.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; } +.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; } +.ui-navbar li.ui-navbar-truncate { position: absolute; left: -9999px; top: -9999px; } +.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; border-right-width: 0; } +.ui-navbar li .ui-btn { margin-right: -1px; } +.ui-navbar li .ui-btn:last-child { margin-right: 0; } +.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn, +.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; } +.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; } +.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; } +/*expanded page styles*/ +.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; } +.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px; } +.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; } +.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; } +.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; } +.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; } +.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; } +.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-btn { display: block; text-align: center; cursor:pointer; position: relative; margin: .5em 5px; padding: 0; } +.ui-btn:focus, .ui-btn:active { outline: none; } +.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn { display: inline-block; font-size: 13px; margin: 0; } +.ui-btn-inline { display: inline-block; } +.ui-btn-inner { padding: .6em 25px; display: block; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; position: relative; zoom: 1; } +.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner { padding: .4em 8px .5em; } +.ui-btn-icon-notext { width: 24px; height: 24px; } +.ui-btn-icon-notext .ui-btn-inner { padding: 2px 1px 2px 3px; } +.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -999px; } +.ui-btn-icon-left .ui-btn-inner { padding-left: 33px; } +.ui-header .ui-btn-icon-left .ui-btn-inner, +.ui-footer .ui-btn-icon-left .ui-btn-inner, +.ui-bar .ui-btn-icon-left .ui-btn-inner { padding-left: 27px; } +.ui-btn-icon-right .ui-btn-inner { padding-right: 33px; } +.ui-header .ui-btn-icon-right .ui-btn-inner, +.ui-footer .ui-btn-icon-right .ui-btn-inner, +.ui-bar .ui-btn-icon-right .ui-btn-inner { padding-right: 27px; } +.ui-btn-icon-top .ui-btn-inner { padding-top: 33px; } +.ui-header .ui-btn-icon-top .ui-btn-inner, +.ui-footer .ui-btn-icon-top .ui-btn-inner, +.ui-bar .ui-btn-icon-top .ui-btn-inner { padding-top: 27px; } +.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 33px; } +.ui-header .ui-btn-icon-bottom .ui-btn-inner, +.ui-footer .ui-btn-icon-bottom .ui-btn-inner, +.ui-bar .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 27px; } + +/*btn icon positioning*/ +.ui-btn-icon-notext .ui-icon { display: block; } +.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon { position: absolute; top: 50%; margin-top: -9px; } +.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon { position: absolute; left: 50%; margin-left: -9px; } +.ui-btn-icon-left .ui-icon { left: 10px; } +.ui-btn-icon-right .ui-icon { right: 10px; } +.ui-btn-icon-top .ui-icon { top: 10px; } +.ui-btn-icon-bottom .ui-icon { bottom: 10px; } +.ui-header .ui-btn-icon-left .ui-icon, +.ui-footer .ui-btn-icon-left .ui-icon, +.ui-bar .ui-btn-icon-left .ui-icon { left: 4px; } +.ui-header .ui-btn-icon-right .ui-icon, +.ui-footer .ui-btn-icon-right .ui-icon, +.ui-bar .ui-btn-icon-right .ui-icon { right: 4px; } +.ui-header .ui-btn-icon-top .ui-icon, +.ui-footer .ui-btn-icon-top .ui-icon, +.ui-bar .ui-btn-icon-top .ui-icon { top: 4px; } +.ui-header .ui-btn-icon-bottom .ui-icon, +.ui-footer .ui-btn-icon-bottom .ui-icon, +.ui-bar .ui-btn-icon-bottom .ui-icon { bottom: 4px; } + +/*hiding native button,inputs */ +.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: button; opacity: .1; cursor: pointer; background: transparent; font-size: 1px; border: none; line-height: 999px; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-collapsible { margin: .5em 0; } +.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; } +.ui-collapsible-heading a { text-align: left; margin: 0; } +.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; } +.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; } +.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 10px 0; } +.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; } +.ui-collapsible-heading-status { position:absolute; left:-9999px; } +.ui-collapsible-content { + display: block; + margin: 0 -8px; + padding: 10px 16px; + border-top: none; /* Overrides ui-btn-up-* */ + background-image: none; /* Overrides ui-btn-up-* */ + font-weight: normal; /* Overrides ui-btn-up-* */ +} +.ui-collapsible-content-collapsed { display: none; } + +.ui-collapsible-set { margin: .5em 0; } +.ui-collapsible-set .ui-collapsible { margin: -1px 0 0; } +/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0 1em; } +.ui-bar .ui-controlgroup { margin: 0 .3em; } +.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; } +.ui-controlgroup-controls { display: block; width: 95%;} +.ui-controlgroup li { list-style: none; } +.ui-controlgroup-vertical .ui-btn, +.ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio { margin: 0; border-bottom-width: 0; } +.ui-controlgroup-vertical .ui-controlgroup-last { border-bottom-width: 1px; } +.ui-controlgroup-horizontal { padding: 0; } +.ui-controlgroup-horizontal .ui-btn { display: inline-block; margin: 0 -5px 0 0; } +.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { float: left; margin: 0 -1px 0 0; } +.ui-controlgroup-horizontal .ui-checkbox .ui-btn, .ui-controlgroup-horizontal .ui-radio .ui-btn, +.ui-controlgroup-horizontal .ui-checkbox:last-child, .ui-controlgroup-horizontal .ui-radio:last-child { margin-right: 0; } +.ui-controlgroup-horizontal .ui-controlgroup-last { margin-right: 0; } +.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px; } +/* conflicts with listview.. +.ui-controlgroup .ui-btn-icon-notext { width: 30px; height: 30px; text-indent: -9999px; } +.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner { padding: 5px 6px 5px 5px; } +*/ + +@media all and (min-width: 450px){ + .ui-controlgroup-label { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } + .ui-controlgroup-controls { width: 60%; display: inline-block; } +} /* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-dialog { min-height: 480px; } +.ui-dialog .ui-header, .ui-dialog .ui-content, .ui-dialog .ui-footer { margin: 15px; position: relative; } +.ui-dialog .ui-header, .ui-dialog .ui-footer { z-index: 10; width: auto; } +.ui-dialog .ui-content, .ui-dialog .ui-footer { margin-top: -15px; }/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-checkbox, .ui-radio { position:relative; margin: .2em 0 .5em; z-index: 1; } +.ui-checkbox .ui-btn, .ui-radio .ui-btn { margin: 0; text-align: left; z-index: 2; } +.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner { white-space: normal; } +.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; } +.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } +.ui-checkbox .ui-icon, .ui-radio .ui-icon { top: 1.1em; } +.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon {left: 15px; } +.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon {right: 15px; } +/* input, label positioning */ +.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px; margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-field-contain { padding: 1.5em 0; margin: 0; border-bottom-width: 1px; overflow: visible; } +.ui-field-contain:first-child { border-top-width: 0; } +@media all and (min-width: 450px){ + .ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; } +} /* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-select { display: block; position: relative; } +.ui-select select { position: absolute; left: -9999px; top: -9999px; } +.ui-select .ui-btn { overflow: hidden; } +.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: button; left: 0; top:0; width: 100%; min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); z-index: 2; } +@-moz-document url-prefix() {.ui-select .ui-btn select { opacity: 0.0001; }} +.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; text-indent: 0; } + +.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } +.ui-select .ui-btn-icon-right .ui-icon { right: 15px; } + +/* labels */ +label.ui-select { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; display: block; } + +/*listbox*/ +.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; } +.ui-select .ui-btn-text { text-overflow: ellipsis; overflow: hidden;} + +.ui-selectmenu { position: absolute; padding: 0; z-index: 100 !important; width: 80%; max-width: 350px; padding: 6px; } +.ui-selectmenu .ui-listview { margin: 0; } +.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; } +.ui-selectmenu-hidden { top: -9999px; left: -9999px; } +.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 99; } +.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; } +.ui-selectmenu-list .ui-li .ui-icon { display: block; } +.ui-li.ui-selectmenu-placeholder { display: none; } +.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; } + +@media all and (min-width: 450px){ + label.ui-select { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } + .ui-select { width: 60%; display: inline-block; } +} + +/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button. this shim's content in there */ +.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; } +input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; line-height: 1.4; font-size: 16px; display: block; width: 95%; } +input.ui-input-text { -webkit-appearance: none; } +textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; } +.ui-input-search { padding: 0 30px; width: 77%; background-image: none; position: relative; } +.ui-icon-searchfield:after { position: absolute; left: 7px; top: 50%; margin-top: -9px; content: ""; width: 18px; height: 18px; opacity: .5; } +.ui-input-search input.ui-input-text { border: none; width: 98%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; } +.ui-input-search .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -14px; } +.ui-input-search .ui-input-clear-hidden { display: none; } + +/* orientation adjustments - incomplete!*/ +@media all and (min-width: 450px){ + label.ui-input-text { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0 } + input.ui-input-text, + textarea.ui-input-text, + .ui-input-search { width: 60%; display: inline-block; } + .ui-input-search { width: 50%; } + .ui-input-search input.ui-input-text { width: 98%; /*echos rule from above*/ } +}/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +.ui-listview { margin: 0; counter-reset: listnumbering; } +.ui-content .ui-listview { margin: -15px; } +.ui-content .ui-listview-inset { margin: 1em 0; } +.ui-listview, .ui-li { list-style:none; padding:0; } +.ui-li, .ui-li.ui-field-contain { display: block; margin:0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; } +.ui-li .ui-btn-text { position: relative; z-index: 1; } +.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } +.ui-li-divider, .ui-li-static { padding: .5em 15px; font-size: 14px; font-weight: bold; } +.ui-li-divider { counter-reset: listnumbering; } +ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal;counter-increment: listnumbering; content: counter(listnumbering) ". "; } +ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */ +.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; } +.ui-li:last-child, .ui-li.ui-field-contain:last-child { border-bottom-width: 1px; } +.ui-li>.ui-btn-inner { display: block; position: relative; padding: 0; } +.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 15px .7em 15px; display: block; } +.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb { min-height: 60px; padding-left: 100px; } +.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon { min-height: 20px; padding-left: 40px; } +.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-count { padding-right: 45px; } +.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow { padding-right: 30px; } +.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow.ui-li-has-count { padding-right: 75px; } +.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } +.ui-li-desc { font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } +.ui-li-thumb, .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; } +.ui-li-icon { max-height: 40px; max-width: 40px; left: 10px; top: .9em; } +.ui-li-thumb, .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; } + +.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; } +@media all and (min-width: 480px){ + .ui-li-aside { width: 45%; } +} +.ui-li-divider { cursor: default; } +.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 95px; } +.ui-li-has-count .ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 38px; } +.ui-li-divider .ui-li-count, .ui-li-static .ui-li-count { right: 10px; } +.ui-li-has-alt .ui-li-count { right: 55px; } +.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; z-index: 2; } +.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -11px 0 0 0; border-bottom-width: 1px; z-index: -1;} +.ui-li-link-alt .ui-btn-inner { padding: 0; height: 100%; position: absolute; width: 100%; top: 0; left: 0;} +.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px; } + +.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner { border-top: 0px; } + +.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px } +.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; } + +.ui-listview-filter-inset { margin: -15px -5px -15px -5px; background: transparent; } +.ui-li.ui-screen-hidden{display:none;} +/* Odd iPad positioning issue. */ +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) { + .ui-li .ui-btn-text { overflow: visible; } +}/* +* jQuery Mobile Framework +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses. +*/ +label.ui-slider { display: block; } +input.ui-slider-input { display: inline-block; width: 50px; } +select.ui-slider-switch { display: none; } +div.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 66%; } +a.ui-slider-handle { position: absolute; z-index: 10; top: 50%; width: 28px; height: 28px; margin-top: -15px; margin-left: -15px; } +a.ui-slider-handle .ui-btn-inner { padding-left: 0; padding-right: 0; } +@media all and (min-width: 480px){ + label.ui-slider { vertical-align: top; display: inline-block; width: 20%; margin: 0 2% 0 0; } + div.ui-slider { width: 45%; } +} + +div.ui-slider-switch { height: 32px; overflow: hidden; margin-left: 0; } +div.ui-slider-inneroffset { margin-left: 50%; position: absolute; top: 1px; height: 100%; width: 50%; } +a.ui-slider-handle-snapping { -webkit-transition: left 100ms linear; } +div.ui-slider-labelbg { position: absolute; top:0; margin: 0; border-width: 0; } +div.ui-slider-switch div.ui-slider-labelbg-a { width: 60%; height: 100%; left: 0; } +div.ui-slider-switch div.ui-slider-labelbg-b { width: 60%; height: 100%; right: 0; } +.ui-slider-switch-a div.ui-slider-labelbg-a, .ui-slider-switch-b div.ui-slider-labelbg-b { z-index: -1; } +.ui-slider-switch-a div.ui-slider-labelbg-b, .ui-slider-switch-b div.ui-slider-labelbg-a { z-index: 0; } + +div.ui-slider-switch a.ui-slider-handle { z-index: 20; width: 101%; height: 32px; margin-top: -18px; margin-left: -101%; } +span.ui-slider-label { width: 100%; position: absolute;height: 32px; font-size: 16px; text-align: center; line-height: 2; background: none; border-color: transparent; } +span.ui-slider-label-a { left: -100%; margin-right: -1px } +span.ui-slider-label-b { right: -100%; margin-left: -1px } + --- a/css/jquery.ui.datepicker.mobile.css +++ /dev/null @@ -1,18 +1,1 @@ -div.hasDatepicker{display:block;padding:0;overflow:visible;margin:8px 0;} -.ui-datepicker{overflow:visible;margin:0;max-width:500px;} -.ui-datepicker .ui-datepicker-header{position:relative;padding:.4em 0;border-bottom:0;font-weight:bold;} -.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next{padding:1px 0 1px 2px;position:absolute;top:.5em;margin-top:0;text-indent:-9999px;} -.ui-datepicker .ui-datepicker-prev{left:6px;} -.ui-datepicker .ui-datepicker-next{right:6px;} -.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center;} -.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0;} -.ui-datepicker select.ui-datepicker-month-year{width:100%;} -.ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year{width:49%;} -.ui-datepicker table{width:100%;border-collapse:collapse;margin:0;} -.ui-datepicker td{border-width:1px;padding:0;text-align:center;} -.ui-datepicker td span, .ui-datepicker td a{display:block;padding:.2em 0;font-weight:bold;margin:0;border-width:0;text-align:center;text-decoration:none;} -.ui-datepicker-calendar th{padding-top:.3em;padding-bottom:.3em;} -.ui-datepicker-calendar th span, .ui-datepicker-calendar span.ui-state-default{opacity:.3;} -.ui-datepicker-calendar td a{padding-top:.5em;padding-bottom:.5em;} -.min-width-480px div.hasDatepicker{width:63%;display:inline-block;margin:0;} --- /dev/null +++ b/css/local.css.php @@ -1,1 +1,221 @@ - + + --- a/dotcloud/postinstall +++ b/dotcloud/postinstall @@ -3,8 +3,8 @@ curl http://s3-ap-southeast-1.amazonaws.com/busresources/cbrfeed.zip \ -o /home/dotcloud/current/cbrfeed.zip -wget http://s3-ap-southeast-1.amazonaws.com/busresources/Graph.obj \ --O /tmp/Graph.obj +curl http://s3-ap-southeast-1.amazonaws.com/busresources/Graph.obj \ +-o /tmp/Graph.obj #db setup #curl https://github.com/maxious/ACTBus-ui/raw/master/transitdata.cbrfeed.sql.gz -o transitdata.cbrfeed.sql.gz --- /dev/null +++ b/geo/route.kml.php @@ -1,1 +1,30 @@ + +'; +echo ' + '; +$route = getRoute($routeid); + echo "\n\n"; + $link = curPageURL()."/../trip.php?routeid=".htmlspecialchars ($route["route_id"]); + echo "".$route['route_short_name'].""; + echo ''; + echo ''.$route['route_short_name']." ".$route['route_long_name']."]]> "; +echo "#yellowLineGreenPoly"; + $trips = getRouteTrips($routeid); + echo getTripShape($trips[0]['trip_id']); + +echo "\n\n"; +?> + + --- /dev/null +++ b/geo/stops.kml.php @@ -1,1 +1,38 @@ +createElementNS('http://earth.google.com/kml/2.1', 'kml'); +$parNode = $dom->appendChild($node); +// Creates a KML Document element and append it to the KML element. +$dnode = $dom->createElement('Document'); +$docNode = $parNode->appendChild($dnode); +if ($suburb != "") $result_stops = getStopsBySuburb($suburb); +else $result_stops = getStops(); +foreach ($result_stops as $stop) { + $description = 'http://bus.lambdacomplex.org/' . 'stop.php?stopid=' . $stop['stop_id'] . "
"; + // Creates a Placemark and append it to the Document. + $node = $dom->createElement('Placemark'); + $placeNode = $docNode->appendChild($node); + // Creates an id attribute and assign it the value of id column. + $placeNode->setAttribute('id', 'placemark' . $stop['stop_id']); + // Create name, and description elements and assigns them the values of the name and address columns from the results. + $nameNode = $dom->createElement('name', htmlentities($stop['stop_name'])); + $descriptionNode = $dom->createElement('description', $description); + $placeNode->appendChild($nameNode); + $placeNode->appendChild($descriptionNode); + // Creates a Point element. + $pointNode = $dom->createElement('Point'); + $placeNode->appendChild($pointNode); + // Creates a coordinates element and gives it the value of the lng and lat columns from the results. + $coorStr = $stop['stop_lon'] . ',' . $stop['stop_lat']; + $coorNode = $dom->createElement('coordinates', $coorStr); + $pointNode->appendChild($coorNode); +} +$kmlOutput = $dom->saveXML(); +echo $kmlOutput; +?> --- /dev/null +++ b/include/common-auth.inc.php @@ -1,1 +1,33 @@ +mode) { + $openid->required = array('contact/email'); + $openid->identity = 'https://www.google.com/accounts/o8/id'; + header('Location: ' . $openid->authUrl()); + } + } + +function auth() + +{ + if ($_SESSION['authed'] == true) return true; + global $openid; + + if($openid->mode) { + $attr = $openid->getAttributes(); + if ($attr["contact/email"] != "maxious@gmail.com") { + die("Access Denied"); + } else { + $_SESSION['authed'] = true; + } + } else { + login(); + } + } +?> --- a/include/common-db.inc.php +++ b/include/common-db.inc.php @@ -1,21 +1,38 @@ +} +include ('db/route-dao.inc.php'); +include ('db/trip-dao.inc.php'); +include ('db/stop-dao.inc.php'); +include ('db/servicealert-dao.inc.php'); +?> + --- a/include/common-geo.inc.php +++ b/include/common-geo.inc.php @@ -1,152 +1,172 @@ $mapPoint) { - $markers.= $mapPoint[0] . "," . $mapPoint[1] . "," . $markerImage . ($index + 1); - if ($index + 1 != sizeof($mapPoints)) $markers.= "|"; - if ($mapPoint[0] < $minlat) $minlat = $mapPoint[0]; - if ($mapPoint[0] > $maxlat) $maxlat = $mapPoint[0]; - if ($mapPoint[1] < $minlon) $minlon = $mapPoint[1]; - if ($mapPoint[1] > $maxlon) $maxlon = $mapPoint[1]; - $totalLat+= $mapPoint[0]; - $totalLon+= $mapPoint[1]; - } - if ($zoom == 0) { - $mapwidthinmeters = distance($minlat, $minlon, $minlat, $maxlon); - foreach (array_reverse($metersperpixel, true) as $zoomLevel => $maxdistance) { - if ($zoom == 0 && $mapwidthinmeters < ($maxdistance + 50)) $zoom = $zoomLevel; - } - } - $center = $totalLat / sizeof($mapPoints) . "," . $totalLon / sizeof($mapPoints); - } - $output = ""; - if ($collapsible) $output.= '

Open Map...

'; - $output.= ''; - if ($collapsible) $output.= '
'; - return $output; -} -function distance($lat1, $lng1, $lat2, $lng2, $roundLargeValues = false) -{ - $pi80 = M_PI / 180; - $lat1*= $pi80; - $lng1*= $pi80; - $lat2*= $pi80; - $lng2*= $pi80; - $r = 6372.797; // mean radius of Earth in km - $dlat = $lat2 - $lat1; - $dlng = $lng2 - $lng1; - $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2); - $c = 2 * atan2(sqrt($a) , sqrt(1 - $a)); - $km = $r * $c; - if ($roundLargeValues) { - if ($km < 1) return floor($km * 1000); - else return round($km,2)."k"; - } else return floor($km * 1000); + +function staticmap($mapPoints, $collapsible = true, $twotone = false, $path = false, $numbered = false) { + + $markers = ""; + $height = 300; + $width = $height; + $index = 0; + if (sizeof($mapPoints) < 1) + return "map error"; + if (sizeof($mapPoints) === 1) { + $markers = "markers={$mapPoints[0][0]},{$mapPoints[0][1]}"; + } else { + if (!$numbered) { + $markers = "markers="; + } + if ($path) { + $markers.= "markers={$mapPoints[0][0]},{$mapPoints[0][1]}&path="; + } + foreach ($mapPoints as $index => $mapPoint) { + if ($twotone && $index == 0) { + $markers = "markerd=color:red|".$mapPoint[0] . "," . $mapPoint[1]."&markers="; + } else { + if ($numbered) { + $label = ($index > 9 ? 9 : $index); + $markers.= "markers=label:$label|" . $mapPoint[0] . "," . $mapPoint[1]; + if ($index + 1 != sizeof($mapPoints)) { + $markers.= "&"; + } + } else { + $markers.= $mapPoint[0] . "," . $mapPoint[1]; + if ($index + 1 != sizeof($mapPoints)) { + $markers.= "|"; + } + } + $index++; + } + } + } + $output = ""; + if ($collapsible) + $output.= '

Open Map...

'; + if (isIOSDevice()) $output.= ''; + else $output.= ''; + + if ($collapsible) + $output.= '
'; + return $output; } -function decodePolylineToArray($encoded) -{ - // source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5 - $length = strlen($encoded); - $index = 0; - $points = array(); - $lat = 0; - $lng = 0; - while ($index < $length) { - // Temporary variable to hold each ASCII byte. - $b = 0; - // The encoded polyline consists of a latitude value followed by a - // longitude value. They should always come in pairs. Read the - // latitude value first. - $shift = 0; - $result = 0; - do { - // The `ord(substr($encoded, $index++))` statement returns the ASCII - // code for the character at $index. Subtract 63 to get the original - // value. (63 was added to ensure proper ASCII characters are displayed - // in the encoded polyline string, which is `human` readable) - $b = ord(substr($encoded, $index++)) - 63; - // AND the bits of the byte with 0x1f to get the original 5-bit `chunk. - // Then left shift the bits by the required amount, which increases - // by 5 bits each time. - // OR the value into $results, which sums up the individual 5-bit chunks - // into the original value. Since the 5-bit chunks were reversed in - // order during encoding, reading them in this way ensures proper - // summation. - $result|= ($b & 0x1f) << $shift; - $shift+= 5; - } - // Continue while the read byte is >= 0x20 since the last `chunk` - // was not OR'd with 0x20 during the conversion process. (Signals the end) - while ($b >= 0x20); - // Check if negative, and convert. (All negative values have the last bit - // set) - $dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1)); - // Compute actual latitude since value is offset from previous value. - $lat+= $dlat; - // The next values will correspond to the longitude for this point. - $shift = 0; - $result = 0; - do { - $b = ord(substr($encoded, $index++)) - 63; - $result|= ($b & 0x1f) << $shift; - $shift+= 5; - } while ($b >= 0x20); - $dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1)); - $lng+= $dlng; - // The actual latitude and longitude values were multiplied by - // 1e5 before encoding so that they could be converted to a 32-bit - // integer representation. (With a decimal accuracy of 5 places) - // Convert back to original values. - $points[] = array( - $lat * 1e-5, - $lng * 1e-5 - ); - } - return $points; +function distance($lat1, $lng1, $lat2, $lng2, $roundLargeValues = false) { + $pi80 = M_PI / 180; + $lat1*= $pi80; + $lng1*= $pi80; + $lat2*= $pi80; + $lng2*= $pi80; + $r = 6372.797; // mean radius of Earth in km + $dlat = $lat2 - $lat1; + $dlng = $lng2 - $lng1; + $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2); + $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); + $km = $r * $c; + if ($roundLargeValues) { + if ($km < 1) + return floor($km * 1000); + else + return round($km, 2) . "k"; + } + else + return floor($km * 1000); } -function geocode($query, $giveOptions) -{ - global $cloudmadeAPIkey; - $url = "http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?query=" . urlencode($query) . "&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true"; - $contents = json_decode(getPage($url)); - if ($giveOptions) return $contents->features; - elseif (isset($contents->features[0]->centroid)) return $contents->features[0]->centroid->coordinates[0] . "," . $contents->features[0]->centroid->coordinates[1]; - else return ""; + +function decodePolylineToArray($encoded) { + // source: http://latlongeeks.com/forum/viewtopic.php?f=4&t=5 + $length = strlen($encoded); + $index = 0; + $points = array(); + $lat = 0; + $lng = 0; + while ($index < $length) { + // Temporary variable to hold each ASCII byte. + $b = 0; + // The encoded polyline consists of a latitude value followed by a + // longitude value. They should always come in pairs. Read the + // latitude value first. + $shift = 0; + $result = 0; + do { + // The `ord(substr($encoded, $index++))` statement returns the ASCII + // code for the character at $index. Subtract 63 to get the original + // value. (63 was added to ensure proper ASCII characters are displayed + // in the encoded polyline string, which is `human` readable) + $b = ord(substr($encoded, $index++)) - 63; + // AND the bits of the byte with 0x1f to get the original 5-bit `chunk. + // Then left shift the bits by the required amount, which increases + // by 5 bits each time. + // OR the value into $results, which sums up the individual 5-bit chunks + // into the original value. Since the 5-bit chunks were reversed in + // order during encoding, reading them in this way ensures proper + // summation. + $result|= ($b & 0x1f) << $shift; + $shift+= 5; + } + // Continue while the read byte is >= 0x20 since the last `chunk` + // was not OR'd with 0x20 during the conversion process. (Signals the end) + while ($b >= 0x20); + // Check if negative, and convert. (All negative values have the last bit + // set) + $dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1)); + // Compute actual latitude since value is offset from previous value. + $lat+= $dlat; + // The next values will correspond to the longitude for this point. + $shift = 0; + $result = 0; + do { + $b = ord(substr($encoded, $index++)) - 63; + $result|= ($b & 0x1f) << $shift; + $shift+= 5; + } while ($b >= 0x20); + $dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1)); + $lng+= $dlng; + // The actual latitude and longitude values were multiplied by + // 1e5 before encoding so that they could be converted to a 32-bit + // integer representation. (With a decimal accuracy of 5 places) + // Convert back to original values. + $points[] = array( + $lat * 1e-5, + $lng * 1e-5 + ); + } + return $points; } -function reverseGeocode($lat, $lng) -{ - global $cloudmadeAPIkey; - $url = "http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?around=" . $lat . "," . $lng . "&distance=closest&object_type=road"; - $contents = json_decode(getPage($url)); - return $contents->features[0]->properties->name; + +function geocode($query, $giveOptions) { + global $cloudmadeAPIkey; + $url = "http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?query=" . urlencode($query) . "&bbox=-35.5,149.00,-35.15,149.1930&return_location=true&bbox_only=true"; + $contents = json_decode(getPage($url)); + if ($giveOptions) + return $contents->features; + elseif (isset($contents->features[0]->centroid)) + return $contents->features[0]->centroid->coordinates[0] . "," . $contents->features[0]->centroid->coordinates[1]; + else + return ""; } + +function reverseGeocode($lat, $lng) { + global $cloudmadeAPIkey; + $url = "http://geocoding.cloudmade.com/$cloudmadeAPIkey/geocoding/v2/find.js?around=" . $lat . "," . $lng . "&distance=closest&object_type=road"; + $contents = json_decode(getPage($url)); + return $contents->features[0]->properties->name; +} + ?> --- a/include/common-net.inc.php +++ b/include/common-net.inc.php @@ -1,31 +1,48 @@ Database temporarily unavailable: "; - echo curl_errno($ch) . " " . curl_error($ch); - if (isDebug()) { - echo $url; - } - echo "
"; - } - curl_close($ch); - debug(print_r($page,true),"json"); - return $page; + +/* + * Copyright 2010,2011 Alexander Sadleir + + 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. + */ + +function getPage($url) { + debug($url, "json"); + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_TIMEOUT, 45); + $page = curl_exec($ch); + if (curl_errno($ch)) { + echo " Database temporarily unavailable: "; + echo curl_errno($ch) . " " . curl_error($ch); + if (isDebug()) { + echo $url; + } + echo "
"; + } + curl_close($ch); + debug(print_r($page, true), "json"); + return $page; } -function curPageURL() -{ - $isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on"); - $port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443"))); - $port = ($port) ? ':' . $_SERVER["SERVER_PORT"] : ''; - $url = ($isHTTPS ? 'https://' : 'http://') . $_SERVER["SERVER_NAME"] . $port . htmlentities(dirname($_SERVER['PHP_SELF']) , ENT_QUOTES); - return $url; + +function curPageURL() { + $isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on"); + $port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443"))); + $port = ($port) ? ':' . $_SERVER["SERVER_PORT"] : ''; + $url = ($isHTTPS ? 'https://' : 'http://') . $_SERVER["SERVER_NAME"] . $port . htmlentities(dirname($_SERVER['PHP_SELF']), ENT_QUOTES); + return $url; } + ?> --- /dev/null +++ b/include/common-request.inc.php @@ -1,1 +1,72 @@ + --- a/include/common-session.inc.php +++ b/include/common-session.inc.php @@ -1,59 +1,77 @@ centroid)) { - $geocoded = true; - $_SESSION['lat'] = $contents[0]->centroid->coordinates[0]; - $_SESSION['lon'] = $contents[0]->centroid->coordinates[1]; - } - else { - $_SESSION['lat'] = ""; - $_SESSION['lon'] = ""; - } - } - } - if ($_SESSION['lat'] != "" && isAnalyticsOn()) { - trackEvent("Geolocation","Updated Location", "Geocoded - ".($geocoded ? "Yes" : "No")); - } - sessionUpdated(); + $geocoded = false; + if (isset($_REQUEST['lat']) && isset($_REQUEST['lon'])) { + $_SESSION['lat'] = trim(filter_var($_REQUEST['lat'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)); + $_SESSION['lon'] = trim(filter_var($_REQUEST['lon'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)); + } else { + if (startsWith($geolocate, "-")) { + $locateparts = explode(",", $geolocate); + $_SESSION['lat'] = $locateparts[0]; + $_SESSION['lon'] = $locateparts[1]; + } else if (strpos($geolocate, "(") !== false) { + $geoParts = explode("(", $geolocate); + $locateparts = explode(",", str_replace(")", "", $geoParts[1])); + $_SESSION['lat'] = $locateparts[0]; + $_SESSION['lon'] = $locateparts[1]; + } else { + $contents = geocode($geolocate, true); + print_r($contents); + if (isset($contents[0]->centroid)) { + $geocoded = true; + $_SESSION['lat'] = $contents[0]->centroid->coordinates[0]; + $_SESSION['lon'] = $contents[0]->centroid->coordinates[1]; + } else { + $_SESSION['lat'] = ""; + $_SESSION['lon'] = ""; + } + } + } + sessionUpdated(); } + function sessionUpdated() { - $_SESSION['lastUpdated'] = time(); + $_SESSION['lastUpdated'] = time(); } + // timeoutSession -$TIMEOUT_LIMIT = 60*5; // 5 minutes -if (isset($_SESSION['lastUpdated']) && $_SESSION['lastUpdated']+$TIMEOUT_LIMIT < time()) { - debug ("Session timeout ".($_SESSION['lastUpdated']+$TIMEOUT_LIMIT).">".time(),"session"); - session_destroy(); - session_start(); +$TIMEOUT_LIMIT = 60 * 5; // 5 minutes +if (isset($_SESSION['lastUpdated']) && $_SESSION['lastUpdated'] + $TIMEOUT_LIMIT < time()) { + debug("Session timeout " . ($_SESSION['lastUpdated'] + $TIMEOUT_LIMIT) . ">" . time(), "session"); + session_destroy(); + session_start(); } + //debug(print_r($_SESSION, true) , "session"); +function current_time() { + return ($_SESSION['time'] ? $_SESSION['time'] : date("H:i:s")); +} -function current_time() { - return ($_SESSION['time']? $_SESSION['time'] : date("H:i:s")); -} ?> + --- a/include/common-template.inc.php +++ b/include/common-template.inc.php @@ -1,148 +1,126 @@ - ' . $pageTitle . ' - '; - if ($datepicker) echo ''; - if (isDebugServer()) { - echo ' - - - + - '; - } - else { - echo ' - - - '; - } - if ($datepicker) { - echo ' - '; - } - echo ''; - if (strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod')) { - echo ' + + + + + + + + '; + echo ''; + echo ''; + if (isIOSDevice()){ + echo ' '; - } - if ($geolocate) { - echo " "; - } - if (isAnalyticsOn()) echo ' + if (!isset($_SESSION['lat']) || $_SESSION['lat'] == "") + echo "geolocate();"; + echo " "; + } + if (isAnalyticsOn()) + echo ' "; - echo ' + echo ' '; - if ($opendiv) { - echo '
+ if ($opendiv) { + echo '
- Back + Back

' . $pageTitle . '

- Home + Home
'; - $overrides = getServiceOverride(); - if ($overrides['service_id']) { - if ($overrides['service_id'] == "noservice") { - echo '
Buses are not running today due to industrial action/public holiday. See Buses are not running today due to industrial action/public holiday. See http://www.action.act.gov.au for details.
'; - } - else { - echo '
Buses are running on an altered timetable today due to industrial action/public holiday. See http://www.action.act.gov.au for details.
'; - } - } - } - -} -function include_footer() -{ - echo ''; - if (isAnalyticsOn()) { - echo ""; - $googleAnalyticsImageUrl = googleAnalyticsGetImageUrl(); - echo ''; - - } - echo "\n
"; -} -function timePlaceSettings($geolocate = false) -{ - global $service_periods; - $geoerror = false; - if ($geolocate == true) { - $geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == ""; - } - if ($geoerror) { - echo '
Sorry, but your location could not currently be detected. + $googleAnalyticsImageUrl = googleAnalyticsGetImageUrl(); + echo ''; + } + echo "\n
"; +} + +function placeSettings() { + global $service_periods; + $geoerror = false; + $geoerror = !isset($_SESSION['lat']) || !isset($_SESSION['lat']) || $_SESSION['lat'] == "" || $_SESSION['lon'] == ""; + + echo '
'; + if ($geoerror) { + echo 'Sorry, but your location could not currently be detected. Please allow location permission, wait for your location to be detected, - or enter an address/co-ordinates in the box below.
'; - } - echo '
-

Change Time/Place (' . (isset($_SESSION['time']) ? $_SESSION['time'] : "Current Time,") . ' ' . ucwords(service_period()) . ')...

+ or enter an address/co-ordinates in the box below.'; + } + echo '
'; + echo '
+

Change Location...

-
- - - Current Time? -
-
- - - -
'; } -function trackEvent($category, $action, $label = "", $value = - 1) -{ - if (isAnalyticsOn()) { - echo "\n"; - } -} + +function trackEvent($category, $action, $label = "", $value = - 1) { + if (isAnalyticsOn()) { + echo "\n"; + } +} + ?> --- a/include/common-transit.inc.php +++ b/include/common-transit.inc.php @@ -1,56 +1,278 @@ 0) { - $midnight = mktime(0, 0, 0, date("n") , date("j") , date("Y")); - return date("h:ia", $midnight + $seconds); - } - else { - return ""; - } + +function service_period($date = "") { + + if (isset($_SESSION['service_period'])) + return $_SESSION['service_period']; + $override = getServiceOverride($date); + if ($override['service_id']) { + return $override['service_id']; + } + + switch (date('w', ($date != "" ? $date : time()))) { + case 0: + return 'sunday'; + case 6: + return 'saturday'; + default: + return 'weekday'; + } +} + +function midnight_seconds($time = "") { + // from http://www.perturb.org/display/Perlfunc__Seconds_Since_Midnight.html + if ($time != "") { + return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); + } + if (isset($_SESSION['time'])) { + $time = strtotime($_SESSION['time']); + return (date("G", $time) * 3600) + (date("i", $time) * 60) + date("s", $time); + } + return (date("G") * 3600) + (date("i") * 60) + date("s"); +} + +function midnight_seconds_to_time($seconds) { + if ($seconds > 0) { + $midnight = mktime(0, 0, 0, date("n"), date("j"), date("Y")); + return date("h:ia", $midnight + $seconds); + } else { + return ""; + } +} + +if ($GTFSREnabled) { + $serviceAlertCause = Array( + "UNKNOWN_CAUSE" => "Unknown cause", + "OTHER_CAUSE" => "Other cause", + "TECHNICAL_PROBLEM" => "Technical problem", + "STRIKE" => "Strike", + "DEMONSTRATION" => "Demonstration", + "ACCIDENT" => "Accident", + "HOLIDAY" => "Holiday", + "WEATHER" => "Weather", + "MAINTENANCE" => "Maintenance", + "CONSTRUCTION" => "Construction", + "POLICE_ACTIVITY" => "Police activity", + "MEDICAL_EMERGENCY" => "Medical emergency" + ); + $serviceAlertEffect = Array( + "NO_SERVICE" => "No service", + "REDUCED_SERVICE" => "Reduced service", + "SIGNIFICANT_DELAYS" => "Significant delays", + "DETOUR" => "Detour", + "ADDITIONAL_SERVICE" => "Additional service", + "MODIFIED_SERVICE" => "Modified service", + "OTHER_EFFECT" => "Other effect", + "UNKNOWN_EFFECT" => "Unknown effect", + "STOP_MOVED" => "Stop moved"); + + set_include_path(get_include_path() . PATH_SEPARATOR . ($basePath . "lib/Protobuf-PHP/library/DrSlump/")); + + include_once("Protobuf.php"); + include_once("Protobuf/Message.php"); + include_once("Protobuf/Registry.php"); + include_once("Protobuf/Descriptor.php"); + include_once("Protobuf/Field.php"); + + include_once($basePath . "lib/Protobuf-PHP/gtfs-realtime.php"); + include_once("Protobuf/CodecInterface.php"); + include_once("Protobuf/Codec/PhpArray.php"); + include_once("Protobuf/Codec/Binary.php"); + include_once("Protobuf/Codec/Binary/Writer.php"); + include_once("Protobuf/Codec/Json.php"); + + function getServiceAlerts($filter_class = "", $filter_id = "") { + /* + + also need last modified epoch of client gtfs + + - add,remove,patch,inform (null) + - stop + - trip + - network + - classes (WHERE=) + - route (short_name or route_id) + - street + - stop + - trip + Currently support: + network inform + trip patch: stop remove + street inform: route inform, trip inform, stop inform + route patch: trip remove + */ + $fm = new transit_realtime\FeedMessage(); + $fh = new transit_realtime\FeedHeader(); + $fh->setGtfsRealtimeVersion(1); + $fh->setTimestamp(time()); + $fm->setHeader($fh); + foreach (getCurrentAlerts() as $alert) { + $fe = new transit_realtime\FeedEntity(); + $fe->setId($alert['id']); + $fe->setIsDeleted(false); + $alert = new transit_realtime\Alert(); + $tr = new transit_realtime\TimeRange(); + $tr->setStart($alert['start']); + $tr->setEnd($alert['end']); + $alert->addActivePeriod($tr); + $informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); + if (sizeof($informedEntities) > 0) { + $informed = Array(); + $es = new transit_realtime\EntitySelector(); + if ($informedEntity['informed_class'] == "agency") { + $es->setAgencyId($informedEntity['informed_id']); + } + if ($informedEntity['informed_class'] == "stop") { + $es->setStopId($informedEntity['informed_id']); + } + if ($informedEntity['informed_class'] == "route") { + $es->setRouteId($informedEntity['informed_id']); + } + if ($informedEntity['informed_class'] == "trip") { + $td = new transit_realtime\TripDescriptor(); + $td->setTripId($informedEntity['informed_id']); + $es->setTrip($td); + } + $alert->addInformedEntity($es); + } + $alert->setCause(constant("transit_realtime\Alert\Cause::" . $alert['cause'])); + $alert->setEffect(constant("transit_realtime\Alert\Effect::" . $alert['effect'])); + $tsUrl = new transit_realtime\TranslatedString(); + $tUrl = new transit_realtime\TranslatedString\Translation(); + $tUrl->setText($alert['url']); + $tUrl->setLanguage("en"); + $tsUrl->addTranslation($tUrl); + $alert->setUrl($tsUrl); + $tsHeaderText = new transit_realtime\TranslatedString(); + $tHeaderText = new transit_realtime\TranslatedString\Translation(); + $tHeaderText->setText($alert['header']); + $tHeaderText->setLanguage("en"); + $tsHeaderText->addTranslation($tHeaderText); + $alert->setHeaderText($tsHeaderText); + $tsDescriptionText = new transit_realtime\TranslatedString(); + $tDescriptionText = new transit_realtime\TranslatedString\Translation(); + $tDescriptionText->setText($alert['description']); + $tDescriptionText->setLanguage("en"); + $tsDescriptionText->addTranslation($tDescriptionText); + $alert->setDescriptionText($tsDescriptionText); + $fe->setAlert($alert); + $fm->addEntity($fe); + } + return $fm; + } + + function getServiceAlertsAsArray($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\PhpArray(); + return $codec->encode(getServiceAlerts($filter_class, $filter_id)); + } + + function getServiceAlertsAsBinary($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\Binary(); + return $codec->encode(getServiceAlerts($filter_class, $filter_id)); + } + + function getServiceAlertsAsJSON($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\Json(); + return $codec->encode(getServiceAlerts($filter_class, $filter_id)); + } + + function getServiceAlertsByClass() { + $return = Array(); + $alerts = getServiceAlertsAsArray("", ""); + foreach ($alerts['entities'] as $entity) { + foreach ($entity['informed'] as $informed) { + foreach ($informed as $key => $value) { + if (strpos("_id", $key) > 0) { + $parts = explode($key); + $class = $parts[0]; + $id = $value; + } + } + $return[$class][$id][] = $entity; + } + } + } + + function getTripUpdates($filter_class = "", $filter_id = "") { + $fm = new transit_realtime\FeedMessage(); + $fh = new transit_realtime\FeedHeader(); + $fh->setGtfsRealtimeVersion(1); + $fh->setTimestamp(time()); + $fm->setHeader($fh); + foreach (getCurrentAlerts() as $alert) { + $informedEntities = getInformedAlerts($alert['id'], $_REQUEST['filter_class'], $_REQUEST['filter_id']); + $stops = Array(); + $routestrips = Array(); + if (sizeof($informedEntities) > 0) { + if ($informedEntity['informed_class'] == "stop" && $informed["x-action"] == "remove") { + $stops[] = $informedEntity['informed_id']; + } + if (($informedEntity['informed_class'] == "route" || $informedEntity['informed_class'] == "trip") && $informed["x-action"] == "patch") { + $routestrips[] = Array("id" => $informedEntity['informed_id'], + "type" => $informedEntity['informed_class']); + } + } + foreach ($routestrips as $routetrip) { + $fe = new transit_realtime\FeedEntity(); + $fe->setId($alert['id'] . $routetrip['id']); + $fe->setIsDeleted(false); + $tu = new transit_realtime\TripUpdate(); + $td = new transit_realtime\TripDescriptor(); + if ($routetrip['type'] == "route") { + $td->setRouteId($routetrip['id']); + } else if ($routetrip['type'] == "trip") { + $td->setTripId($routetrip['id']); + } + $tu->setTrip($td); + foreach ($stops as $stop) { + $stu = new transit_realtime\TripUpdate\StopTimeUpdate(); + $stu->setStopId($stop); + $stu->setScheduleRelationship(transit_realtime\TripUpdate\StopTimeUpdate\ScheduleRelationship::SKIPPED); + $tu->addStopTimeUpdate($stu); + } + $fe->setTripUpdate($tu); + $fm->addEntity($fe); + } + } + return $fm; + } + + function getTripUpdatesAsArray($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\PhpArray(); + return $codec->encode(getTripUpdates($filter_class, $filter_id)); + } + + function getTripUpdatesAsBinary($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\Binary(); + return $codec->encode(getTripUpdates($filter_class, $filter_id)); + } + + function getTripUpdatesAsJSON($filter_class = "", $filter_id = "") { + $codec = new DrSlump\Protobuf\Codec\Json(); + return $codec->encode(getTripUpdates($filter_class, $filter_id)); + } + } ?> --- a/include/common.inc.php +++ b/include/common.inc.php @@ -1,183 +1,206 @@ \n"; -} -function isJQueryMobileDevice() -{ - // http://forum.jquery.com/topic/what-is-the-best-way-to-detect-all-useragents-which-can-handle-jquery-mobile#14737000002087897 - $user_agent = $_SERVER['HTTP_USER_AGENT']; - return preg_match('/iphone/i', $user_agent) || preg_match('/android/i', $user_agent) || preg_match('/webos/i', $user_agent) || preg_match('/ios/i', $user_agent) || preg_match('/bada/i', $user_agent) || preg_match('/maemo/i', $user_agent) || preg_match('/meego/i', $user_agent) || preg_match('/fennec/i', $user_agent) || (preg_match('/symbian/i', $user_agent) && preg_match('/s60/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/symbian/i', $user_agent) && preg_match('/platform/i', $user_agent) && $browser['majorver'] >= 3) || (preg_match('/blackberry/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/opera mobile/i', $user_agent) && $browser['majorver'] >= 10) || (preg_match('/opera mini/i', $user_agent) && $browser['majorver'] >= 5); -} -function isFastDevice() -{ - $ua = $_SERVER['HTTP_USER_AGENT']; - $fastDevices = Array( - "Mozilla/5.0 (X11;", - "Mozilla/5.0 (Windows;", - "Mozilla/5.0 (iP", - "Mozilla/5.0 (Linux; U; Android", - "Mozilla/4.0 (compatible; MSIE" - ); - $slowDevices = Array( - "J2ME", - "MIDP", - "Opera/", - "Mozilla/2.0 (compatible;", - "Mozilla/3.0 (compatible;" - ); - return true; -} -function array_flatten($a, $f = array()) -{ - if (!$a || !is_array($a)) return ''; - foreach ($a as $k => $v) { - if (is_array($v)) $f = array_flatten($v, $f); - else $f[$k] = $v; - } - return $f; -} -function remove_spaces($string) -{ - return str_replace(' ', '', $string); -} -function object2array($object) -{ - if (is_object($object)) { - foreach ($object as $key => $value) { - $array[$key] = $value; - } - } - else { - $array = $object; - } - return $array; -} -function startsWith($haystack, $needle, $case = true) -{ - if ($case) { - return (strcmp(substr($haystack, 0, strlen($needle)) , $needle) === 0); - } - return (strcasecmp(substr($haystack, 0, strlen($needle)) , $needle) === 0); -} - -function endsWith($haystack, $needle, $case = true) -{ - if ($case) { - return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)) , $needle) === 0); - } - return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)) , $needle) === 0); -} -function bracketsMeanNewLine($input) -{ - return str_replace(")", "", str_replace("(", "
", $input)); -} -function sksort(&$array, $subkey = "id", $sort_ascending = false) -{ - if (count($array)) $temp_array[key($array) ] = array_shift($array); - foreach ($array as $key => $val) { - $offset = 0; - $found = false; - foreach ($temp_array as $tmp_key => $tmp_val) { - if (!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey])) { - $temp_array = array_merge((array)array_slice($temp_array, 0, $offset) , array( - $key => $val - ) , array_slice($temp_array, $offset)); - $found = true; - } - $offset++; - } - if (!$found) $temp_array = array_merge($temp_array, array( - $key => $val - )); - } - if ($sort_ascending) $array = array_reverse($temp_array); - else $array = $temp_array; -} -function sktimesort(&$array, $subkey = "id", $sort_ascending = false) -{ - if (count($array)) $temp_array[key($array) ] = array_shift($array); - foreach ($array as $key => $val) { - $offset = 0; - $found = false; - foreach ($temp_array as $tmp_key => $tmp_val) { - if (!$found and strtotime($val[$subkey]) > strtotime($tmp_val[$subkey])) { - $temp_array = array_merge((array)array_slice($temp_array, 0, $offset) , array( - $key => $val - ) , array_slice($temp_array, $offset)); - $found = true; - } - $offset++; - } - if (!$found) $temp_array = array_merge($temp_array, array( - $key => $val - )); - } - if ($sort_ascending) $array = array_reverse($temp_array); - else $array = $temp_array; -} -function r_implode( $glue, $pieces ) -{ - foreach( $pieces as $r_pieces ) - { - if( is_array( $r_pieces ) ) - { - $retVal[] = r_implode( $glue, $r_pieces ); - } - else - { - $retVal[] = $r_pieces; - } - } - return implode( $glue, $retVal ); -} +function isAnalyticsOn() { + $user_agent = $_SERVER['HTTP_USER_AGENT']; + return!isDebugServer() && !preg_match('/cloudkick/i', $user_agent) && !preg_match('/googlebot/i', $user_agent) && + !preg_match('/baidu/i', $user_agent); +} + +function isDebug($debugReason = "other") { + global $debugOkay; + return in_array($debugReason, $debugOkay, false) && isDebugServer(); +} + +function debug($msg, $debugReason = "other") { + if (isDebug($debugReason)) + echo "\n\n"; +} +function isIOSDevice() { + return strstr($_SERVER['HTTP_USER_AGENT'], 'iPhone') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPod') || strstr($_SERVER['HTTP_USER_AGENT'], 'iPad'); +} +function isJQueryMobileDevice() { + // http://forum.jquery.com/topic/what-is-the-best-way-to-detect-all-useragents-which-can-handle-jquery-mobile#14737000002087897 + $user_agent = $_SERVER['HTTP_USER_AGENT']; + return preg_match('/iphone/i', $user_agent) || preg_match('/android/i', $user_agent) || preg_match('/webos/i', $user_agent) || preg_match('/ios/i', $user_agent) || preg_match('/bada/i', $user_agent) || preg_match('/maemo/i', $user_agent) || preg_match('/meego/i', $user_agent) || preg_match('/fennec/i', $user_agent) || (preg_match('/symbian/i', $user_agent) && preg_match('/s60/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/symbian/i', $user_agent) && preg_match('/platform/i', $user_agent) && $browser['majorver'] >= 3) || (preg_match('/blackberry/i', $user_agent) && $browser['majorver'] >= 5) || (preg_match('/opera mobile/i', $user_agent) && $browser['majorver'] >= 10) || (preg_match('/opera mini/i', $user_agent) && $browser['majorver'] >= 5); +} + + +function array_flatten($a, $f = array()) { + if (!$a || !is_array($a)) + return ''; + foreach ($a as $k => $v) { + if (is_array($v)) + $f = array_flatten($v, $f); + else + $f[$k] = $v; + } + return $f; +} + +function remove_spaces($string) { + return str_replace(' ', '', $string); +} + +function object2array($object) { + if (is_object($object)) { + foreach ($object as $key => $value) { + $array[$key] = $value; + } + } else { + $array = $object; + } + return $array; +} + +function startsWith($haystack, $needle, $case = true) { + if ($case) { + return (strcmp(substr($haystack, 0, strlen($needle)), $needle) === 0); + } + return (strcasecmp(substr($haystack, 0, strlen($needle)), $needle) === 0); +} + +function endsWith($haystack, $needle, $case = true) { + if ($case) { + return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0); + } + return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)), $needle) === 0); +} + +function bracketsMeanNewLine($input) { + return str_replace(")", "", str_replace("(", "
", $input)); +} + +function sksort(&$array, $subkey = "id", $sort_ascending = false) { + if (count($array)) + $temp_array[key($array)] = array_shift($array); + foreach ($array as $key => $val) { + $offset = 0; + $found = false; + foreach ($temp_array as $tmp_key => $tmp_val) { + if (!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey])) { + $temp_array = array_merge((array) array_slice($temp_array, 0, $offset), array( + $key => $val + ), array_slice($temp_array, $offset)); + $found = true; + } + $offset++; + } + if (!$found) + $temp_array = array_merge($temp_array, array( + $key => $val + )); + } + if ($sort_ascending) + $array = array_reverse($temp_array); + else + $array = $temp_array; +} + +function sktimesort(&$array, $subkey = "id", $sort_ascending = false) { + if (count($array)) + $temp_array[key($array)] = array_shift($array); + foreach ($array as $key => $val) { + $offset = 0; + $found = false; + foreach ($temp_array as $tmp_key => $tmp_val) { + if (!$found and strtotime($val[$subkey]) > strtotime($tmp_val[$subkey])) { + $temp_array = array_merge((array) array_slice($temp_array, 0, $offset), array( + $key => $val + ), array_slice($temp_array, $offset)); + $found = true; + } + $offset++; + } + if (!$found) + $temp_array = array_merge($temp_array, array( + $key => $val + )); + } + if ($sort_ascending && isset($temp_array)) + $array = array_reverse($temp_array); + else + $array = $temp_array; +} + +function r_implode($glue, $pieces) { + foreach ($pieces as $r_pieces) { + if (is_array($r_pieces)) { + $retVal[] = r_implode($glue, $r_pieces); + } else { + $retVal[] = $r_pieces; + } + } + return implode($glue, $retVal); +} + ?> --- a/include/db/route-dao.inc.php +++ b/include/db/route-dao.inc.php @@ -1,160 +1,250 @@ prepare($query); + $query->bindParam(":routeID", $routeID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + +function getRouteByFullName($routeFullName) { + global $conn; + $query = "Select * from routes where route_short_name||route_long_name = :routeFullName LIMIT 1"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":routeFullName", $routeFullName); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + function getRoutes() { - global $conn; - $query = "Select * from routes order by route_short_name;"; - debug($query,"database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); + global $conn; + $query = "Select * from routes order by route_short_name;"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); } function getRoutesByNumber($routeNumber = "") { - global $conn; - if ($routeNumber != "") { - $query = "Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id = -routes.route_id join stop_times on stop_times.trip_id = trips.trip_id where route_short_name = '$routeNumber' order by route_short_name;"; - } else { - $query = "SELECT DISTINCT route_short_name from routes order by route_short_name"; - } - debug($query,"database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); + global $conn; + if ($routeNumber != "") { + $query = "Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id = +routes.route_id join stop_times on stop_times.trip_id = trips.trip_id +where route_short_name = :routeNumber OR route_short_name LIKE :routeNumber2 order by route_short_name;"; + } else { + $query = "SELECT DISTINCT route_short_name from routes order by route_short_name"; + } + debug($query, "database"); + $query = $conn->prepare($query); + if ($routeNumber != "") { + $query->bindParam(":routeNumber", $routeNumber); + $routeNumber2 = "% " . $routeNumber; + $query->bindParam(":routeNumber2", $routeNumber2); + } + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getRoutesByNumberSeries($routeNumberSeries = "") { + global $conn; + if (strlen($routeNumberSeries) == 1) { + return getRoutesByNumber($routeNumberSeries); + } + $seriesMin = substr($routeNumberSeries, 0, -1) . "0"; + $seriesMax = substr($routeNumberSeries, 0, -1) . "9"; + $query = "Select distinct routes.route_id,routes.route_short_name,routes.route_long_name,service_id from routes join trips on trips.route_id = +routes.route_id join stop_times on stop_times.trip_id = trips.trip_id where to_number(route_short_name, 'FM999') between :seriesMin and :seriesMax OR route_short_name LIKE :routeNumberSeries order by route_short_name;"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":seriesMin", $seriesMin); + $query->bindParam(":seriesMax", $seriesMax); + $routeNumberSeries = "% " . substr($routeNumberSeries, 0, -1) . "%"; + $query->bindParam(":routeNumberSeries", $routeNumberSeries); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); } function getRouteNextTrip($routeID) { - global $conn; + global $conn; $query = "select * from routes join trips on trips.route_id = routes.route_id join stop_times on stop_times.trip_id = trips.trip_id where -arrival_time > '".current_time()."' and routes.route_id = '$routeID' order by +arrival_time > :currentTime and routes.route_id = :routeID order by arrival_time limit 1"; - debug($query,"database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - $r = pg_fetch_assoc($result); - // past last trip of the day special case - if (sizeof($r) == 0) { - $query = "select * from routes join trips on trips.route_id = routes.route_id -join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = '$routeID' order by + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":currentTime", current_time()); + $query->bindParam(":routeID", $routeID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + $r = $query->fetch(PDO :: FETCH_ASSOC); + + // past last trip of the day special case + if (sizeof($r) < 16) { + $query = "select * from routes join trips on trips.route_id = routes.route_id +join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID order by arrival_time DESC limit 1"; - debug($query,"database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - $r = pg_fetch_assoc($result); - } - return $r; - } - - function getTimeInterpolatedRouteAtStop($routeID, $stop_id) -{ + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":routeID", $routeID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + + $r = $query->fetch(PDO :: FETCH_ASSOC); + } + return $r; +} + +function getTimeInterpolatedRouteAtStop($routeID, $stop_id) { $nextTrip = getRouteNextTrip($routeID); - if ($nextTrip['trip_id']){ - foreach (getTimeInterpolatedTrip($nextTrip['trip_id']) as $tripStop) { - if ($tripStop['stop_id'] == $stop_id) return $tripStop; - } - } - return Array(); -} - + if ($nextTrip['trip_id']) { + foreach (getTimeInterpolatedTrip($nextTrip['trip_id']) as $tripStop) { + if ($tripStop['stop_id'] == $stop_id) + return $tripStop; + } + } + return Array(); +} + function getRouteTrips($routeID) { - global $conn; + global $conn; $query = "select routes.route_id,trips.trip_id,service_id,arrival_time, stop_id, stop_sequence from routes join trips on trips.route_id = routes.route_id -join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = '$routeID' and stop_sequence = '1' order by +join stop_times on stop_times.trip_id = trips.trip_id where routes.route_id = :routeID and stop_sequence = '1' order by arrival_time "; - debug($query,"database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); - } + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":routeID", $routeID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + function getRoutesByDestination($destination = "", $service_period = "") { global $conn; - if ($service_period == "") $service_period = service_period(); - if ($destination != "") { - $query = "SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id + if ($service_period == "") + $service_period = service_period(); + if ($destination != "") { + $query = "SELECT DISTINCT trips.route_id,route_short_name,route_long_name, service_id FROM stop_times join trips on trips.trip_id = stop_times.trip_id join routes on trips.route_id = routes.route_id -WHERE route_long_name = '$destination' AND service_id='$service_period' order by route_short_name"; - } else { +WHERE route_long_name = :destination AND service_id=:service_period order by route_short_name"; + } else { $query = "SELECT DISTINCT route_long_name FROM stop_times join trips on trips.trip_id = stop_times.trip_id join routes on trips.route_id = routes.route_id -WHERE service_id='$service_period' order by route_long_name"; - } - debug($query,"database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); +WHERE service_id= :service_period order by route_long_name"; + } + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":service_period", $service_period); + if ($destination != "") + $query->bindParam(":destination", $destination); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); } function getRoutesBySuburb($suburb, $service_period = "") { - if ($service_period == "") $service_period = service_period(); - global $conn; - $query = "SELECT DISTINCT service_id,trips.route_id,route_short_name,route_long_name + if ($service_period == "") + $service_period = service_period(); + global $conn; + $query = "SELECT DISTINCT service_id,trips.route_id,route_short_name,route_long_name FROM stop_times join trips on trips.trip_id = stop_times.trip_id join routes on trips.route_id = routes.route_id join stops on stops.stop_id = stop_times.stop_id -WHERE zone_id LIKE '%$suburb;%' AND service_id='$service_period' ORDER BY route_short_name"; - debug($query,"database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); +WHERE zone_id LIKE ':suburb AND service_id=:service_period ORDER BY route_short_name"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":service_period", $service_period); + $suburb = "%" . $suburb . ";%"; + $query->bindParam(":suburb", $suburb); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); } function getRoutesNearby($lat, $lng, $limit = "", $distance = 500) { - - - if ($service_period == "") $service_period = service_period(); - if ($limit != "") $limit = " LIMIT $limit "; - global $conn; - $query = "SELECT service_id,trips.route_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id, + if ($service_period == "") + $service_period = service_period(); + if ($limit != "") + $limitSQL = " LIMIT :limit "; + global $conn; + $query = "SELECT service_id,trips.route_id,route_short_name,route_long_name,min(stops.stop_id) as stop_id, min(ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE)) as distance FROM stop_times join trips on trips.trip_id = stop_times.trip_id join routes on trips.route_id = routes.route_id join stops on stops.stop_id = stop_times.stop_id -WHERE service_id='$service_period' -AND ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), $distance, FALSE) +WHERE service_id=:service_period +AND ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), :distance, FALSE) group by service_id,trips.route_id,route_short_name,route_long_name - order by distance $limit"; - debug($query,"database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); -} + order by distance $limitSQL"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":service_period", $service_period); + $query->bindParam(":distance", $distance); + if ($limit != "") + $query->bindParam(":limit", $limit); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + ?> --- /dev/null +++ b/include/db/servicealert-dao.inc.php @@ -1,1 +1,177 @@ +prepare($query); // Create a prepared statement + $query->bindParam(":date", date("Ymd", ($date != "" ? $date : time()))); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + +function getServiceAlert($alertID) { + global $conn; + $query = "SELECT id,extract('epoch' from start) as start, extract('epoch' from \"end\") as \"end\",cause,effect,header,description,url from servicealerts_alerts where id = :servicealert_id"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":servicealert_id", $alertID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + +function updateServiceAlert($alertID, $start, $end, $header, $description, $url) { + global $conn; + $query = 'update servicealerts_alerts set start=:start, "end"=:end, header=:header, description=:description, url=:url where id = :servicealert_id'; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":servicealert_id", $alertID); + $query->bindParam(":start", $start); + $query->bindParam(":end", $end); + $query->bindParam(":header", $header); + $query->bindParam(":description", $description); + $query->bindParam(":url", $url); + $query->execute(); + + print_r($conn->errorInfo()); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + +function addServiceAlert($start, $end, $header, $description, $url) { + global $conn; + $query = 'INSERT INTO servicealerts_alerts (start, "end", header, description, url) VALUES (:start, :end, :header, :description, :url) '; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":start", $start); + $query->bindParam(":end", $end); + $query->bindParam(":header", $header); + $query->bindParam(":description", $description); + $query->bindParam(":url", $url); + $query->execute(); + + print_r($conn->errorInfo()); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + +function getCurrentAlerts() { + global $conn; + $query = "SELECT id,extract('epoch' from start) as start, extract('epoch' from \"end\") as \"end\",cause,effect,header,description,url from servicealerts_alerts where NOW() > start and NOW() < \"end\""; + // debug($query, "database"); + $query = $conn->prepare($query); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getFutureAlerts() { + global $conn; + $query = "SELECT id,extract('epoch' from start) as start, extract('epoch' from \"end\") as \"end\",cause,effect,header,description,url from servicealerts_alerts where NOW() > start or NOW() < \"end\""; + // debug($query, "database"); + $query = $conn->prepare($query); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getInformedAlerts($id, $filter_class, $filter_id) { + + global $conn; + $query = "SELECT * from servicealerts_informed where servicealert_id = :servicealert_id"; + + if ($filter_class != "") { + $query .= " AND informed_class = :informed_class "; + } + if ($filter_id != "") { + $query .= " AND informed_id = :informed_id "; + } + // debug($query, "database"); + $query = $conn->prepare($query); + if ($filter_class != "") { + $query->bindParam(":informed_class", $filter_class); + } + if ($filter_id != "") { + $query->bindParam(":informed_id", $filter_id); + } + $query->bindParam(":servicealert_id", $id); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function deleteInformedAlert($serviceAlertID, $class, $id) { + global $conn; + $query = 'DELETE from servicealerts_informed where servicealert_id = :servicealert_id and informed_class = :informed_class AND informed_id = :informed_id'; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":servicealert_id", $serviceAlertID); + $query->bindParam(":informed_class", $class); + $query->bindParam(":informed_id", $id); + $query->execute(); + print_r($conn->errorInfo()); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return null; +} + +function addInformedAlert($serviceAlertID, $class, $id, $action) { + global $conn; + $query = 'INSERT INTO servicealerts_informed (servicealert_id , informed_class , informed_id) VALUES(:servicealert_id ,:informed_class, :informed_id)'; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":servicealert_id", $serviceAlertID); + $query->bindParam(":informed_class", $class); + $query->bindParam(":informed_id", $id); + $query->execute(); + + print_r($conn->errorInfo()); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return null; +} + +?> --- a/include/db/stop-dao.inc.php +++ b/include/db/stop-dao.inc.php @@ -1,144 +1,236 @@ 0) { - if (sizeof($conditions) > 1) { - $query.= " Where " . implode(" AND ", $conditions) . " "; - } - else { - $query.= " Where " . $conditions[0] . " "; - } - } - $query.= " order by stop_name;"; - debug($query, "database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); -} -function getNearbyStops($lat, $lng, $limit = "", $distance = 1000) -{ - if ($lat == null || $lng == null) return Array(); - if ($limit != "") $limit = " LIMIT $limit "; - global $conn; - $query = "Select *, ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE) as distance - from stops WHERE ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), $distance, FALSE) - order by distance $limit;"; - debug($query, "database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); -} -function getStopsBySuburb($suburb) -{ - global $conn; - $query = "Select * from stops where zone_id LIKE '%$suburb;%' order by stop_name;"; - debug($query, "database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); -} -function getStopRoutes($stopID, $service_period) -{ - if ($service_period == "") $service_period = service_period(); - global $conn; - $query = "SELECT service_id,trips.route_id,route_short_name,route_long_name + +/* + * Copyright 2010,2011 Alexander Sadleir + + 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. + */ + +function getStop($stopID) { + global $conn; + $query = "Select * from stops where stop_id = :stopID LIMIT 1"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":stopID", $stopID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + +function getStops($timingPointsOnly = false, $firstLetter = "", $startsWith = "") { + global $conn; + $conditions = Array(); + if ($timingPointsOnly) + $conditions[] = "substr(stop_code,1,2) != 'Wj'"; + if ($firstLetter != "") + $conditions[] = "substr(stop_name,1,1) = :firstLetter"; + if ($startsWith != "") + $conditions[] = "stop_name like :startsWith"; + $query = "Select * from stops"; + if (sizeof($conditions) > 0) { + if (sizeof($conditions) > 1) { + $query .= " Where " . implode(" AND ", $conditions) . " "; + } else { + $query .= " Where " . $conditions[0] . " "; + } + } + $query .= " order by stop_name;"; + $query = $conn->prepare($query); + if ($firstLetter != "") + $query->bindParam(":firstLetter", $firstLetter); + + if ($startsWith != "") { + $startsWith = $startsWith . "%"; + $query->bindParam(":startsWith", $startsWith); + } + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getNearbyStops($lat, $lng, $limit = "", $distance = 1000) { + if ($lat == null || $lng == null) + return Array(); + if ($limit != "") + $limitSQL = " LIMIT :limit "; + global $conn; + $query = "Select *, ST_Distance(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), FALSE) as distance + from stops WHERE ST_DWithin(position, ST_GeographyFromText('SRID=4326;POINT($lng $lat)'), :distance, FALSE) + order by distance $limitSQL;"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":distance", $distance); + $query->bindParam(":limit", $limit); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getStopsByName($name) { + global $conn; + $query = "Select * from stops where stop_name LIKE :name;"; + debug($query, "database"); + $query = $conn->prepare($query); + $name = "%" . $name . ";%"; + $query->bindParam(":name", $name); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getStopsBySuburb($suburb) { + global $conn; + $query = "Select * from stops where zone_id LIKE :suburb order by stop_name;"; + debug($query, "database"); + $query = $conn->prepare($query); + $suburb = "%" . $suburb . ";%"; + $query->bindParam(":suburb", $suburb); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getStopsByStopCode($stop_code, $startsWith = "") { + global $conn; + $query = "Select * from stops where (stop_code = :stop_code OR stop_code LIKE :stop_code2)"; + if ($startsWith != "") + $query .= " AND stop_name like :startsWith"; + + debug($query, "database"); + $query = $conn->prepare($query); + + $query->bindParam(":stop_code", $stop_code); + $stop_code2 = $stop_code . "%"; + $query->bindParam(":stop_code2", $stop_code2); + if ($startsWith != "") { + $startsWith = $startsWith . "%"; + $query->bindParam(":startsWith", $startsWith); + } + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getStopRoutes($stopID, $service_period) { + if ($service_period == "") + $service_period = service_period(); + global $conn; + $query = "SELECT distinct service_id,trips.route_id,route_short_name,route_long_name FROM stop_times join trips on trips.trip_id = -stop_times.trip_id join routes on trips.route_id = routes.route_id WHERE stop_id = '$stopID' AND service_id='$service_period'"; - debug($query, "database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); -} -function getStopTrips($stopID, $service_period = "", $afterTime = "") -{ - if ($service_period == "") $service_period = service_period(); - $afterCondition = "AND arrival_time > '$afterTime'"; - global $conn; - if ($afterTime != "") { - $query = " SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name, end_times.arrival_time as end_time +stop_times.trip_id join routes on trips.route_id = routes.route_id WHERE stop_id = :stopID AND service_id=:service_period"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":service_period", $service_period); + $query->bindParam(":stopID", $stopID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getStopTrips($stopID, $service_period = "", $afterTime = "", $limit = "") { + if ($service_period == "") + $service_period = service_period(); + if ($limit != "") + $limitSQL = " LIMIT :limit "; + global $conn; + if ($afterTime != "") { + $query = " SELECT stop_times.trip_id,stop_times.arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name, end_times.arrival_time as end_time FROM stop_times join trips on trips.trip_id = stop_times.trip_id join routes on trips.route_id = routes.route_id , (SELECT trip_id,max(arrival_time) as arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times -WHERE stop_times.stop_id = '$stopID' +WHERE stop_times.stop_id = :stopID AND stop_times.trip_id = end_times.trip_id -AND service_id='$service_period' -AND end_times.arrival_time > '$afterTime' -ORDER BY end_time"; - } - else { - $query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name +AND service_id=:service_period +AND end_times.arrival_time > :afterTime +ORDER BY end_time $limitSQL"; + } else { + $query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_sequence,service_id,trips.route_id,route_short_name,route_long_name FROM stop_times join trips on trips.trip_id = stop_times.trip_id join routes on trips.route_id = routes.route_id -WHERE stop_times.stop_id = '$stopID' -AND service_id='$service_period' -ORDER BY arrival_time"; - } - debug($query, "database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); -} -function getStopTripsWithTimes($stopID, $time = "", $service_period = "", $time_range = "", $limit = "") -{ - if ($service_period == "") $service_period = service_period(); - if ($time_range == "") $time_range = (24 * 60 * 60); - if ($time == "") $time = current_time(); - if ($limit == "") $limit = 10; - $trips = getStopTrips($stopID, $service_period, $time); - $timedTrips = Array(); - if ($trips && sizeof($trips) > 0) { - foreach ($trips as $trip) { - if ($trip['arrival_time'] != "") { - if (strtotime($trip['arrival_time']) > strtotime($time) and strtotime($trip['arrival_time']) < (strtotime($time) + $time_range)) { - $timedTrips[] = $trip; - } - } - else { - $timedTrip = getTimeInterpolatedTripAtStop($trip['trip_id'], $trip['stop_sequence']); - if ($timedTrip['arrival_time'] > $time and strtotime($timedTrip['arrival_time']) < (strtotime($time) + $time_range)) { - $timedTrips[] = $timedTrip; - } - } - if (sizeof($timedTrips) > $limit) break; - } - sktimesort($timedTrips, "arrival_time", true); +WHERE stop_times.stop_id = :stopID +AND service_id=:service_period +ORDER BY arrival_time $limitSQL"; + } + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":service_period", $service_period); + $query->bindParam(":stopID", $stopID); + if ($limit != "") + $query->bindParam(":limit", $limit); + if ($afterTime != "") + $query->bindParam(":afterTime", $afterTime); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function getStopTripsWithTimes($stopID, $time = "", $service_period = "", $time_range = "", $limit = "") { + if ($service_period == "") + $service_period = service_period(); + if ($time_range == "") + $time_range = (24 * 60 * 60); + if ($time == "") + $time = current_time(); + if ($limit == "") + $limit = 10; + $trips = getStopTrips($stopID, $service_period, $time); + $timedTrips = Array(); + if ($trips && sizeof($trips) > 0) { + foreach ($trips as $trip) { + if ($trip['arrival_time'] != "") { + if (strtotime($trip['arrival_time']) > strtotime($time) and strtotime($trip['arrival_time']) < (strtotime($time) + $time_range)) { + $timedTrips[] = $trip; + } + } else { + $timedTrip = getTimeInterpolatedTripAtStop($trip['trip_id'], $trip['stop_sequence']); + if ($timedTrip['arrival_time'] > $time and strtotime($timedTrip['arrival_time']) < (strtotime($time) + $time_range)) { + $timedTrips[] = $timedTrip; + } + } + if (sizeof($timedTrips) > $limit) + break; } - return $timedTrips; -} + sktimesort($timedTrips, "arrival_time", true); + } + return $timedTrips; +} + ?> --- a/include/db/trip-dao.inc.php +++ b/include/db/trip-dao.inc.php @@ -1,186 +1,256 @@ prepare($query); + $query->bindParam(":tripID", $tripID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + +function getTripShape($tripID) { + global $conn; + $query = "SELECT ST_AsKML(ST_MakeLine(geometry(a.position))) as the_route +FROM (SELECT position, + stop_sequence, trips.trip_id +FROM stop_times +join trips on trips.trip_id = stop_times.trip_id +join stops on stops.stop_id = stop_times.stop_id +WHERE trips.trip_id = :tripID ORDER BY stop_sequence) as a group by a.trip_id"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":tripID", $tripID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchColumn(0); +} + +function getTimeInterpolatedTrip($tripID, $range = "") { + global $conn; + $query = "SELECT stop_times.trip_id,arrival_time,stop_times.stop_id,stop_lat,stop_lon,stop_name,stop_code, stop_sequence,service_id,trips.route_id,route_short_name,route_long_name FROM stop_times join trips on trips.trip_id = stop_times.trip_id join routes on trips.route_id = routes.route_id join stops on stops.stop_id = stop_times.stop_id -WHERE trips.trip_id = '$tripID' $range ORDER BY stop_sequence"; - debug($query, "database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - $stopTimes = pg_fetch_all($result); - $cur_timepoint = Array(); - $next_timepoint = Array(); - $distance_between_timepoints = 0.0; - $distance_traveled_between_timepoints = 0.0; - $rv = Array(); - foreach ($stopTimes as $i => $stopTime) { - if ($stopTime['arrival_time'] != "") { - // is timepoint - $cur_timepoint = $stopTime; - $distance_between_timepoints = 0.0; - $distance_traveled_between_timepoints = 0.0; - if ($i + 1 < sizeof($stopTimes)) { - $k = $i + 1; - $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]); - while ($stopTimes[$k]["arrival_time"] == "" && $k + 1 < sizeof($stopTimes)) { - $k += 1; - //echo "k".$k; - $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]); - } - $next_timepoint = $stopTimes[$k]; - $rv[] = $stopTime; - } - } - else { - // is untimed point - //echo "i".$i; - $distance_traveled_between_timepoints += distance($stopTimes[$i - 1]["stop_lat"], $stopTimes[$i - 1]["stop_lon"], $stopTimes[$i]["stop_lat"], $stopTimes[$i]["stop_lon"]); - //echo "$distance_traveled_between_timepoints / $distance_between_timepoints
"; - $distance_percent = $distance_traveled_between_timepoints / $distance_between_timepoints; - if ($next_timepoint["arrival_time"] != "") { - $total_time = strtotime($next_timepoint["arrival_time"]) - strtotime($cur_timepoint["arrival_time"]); - //echo strtotime($next_timepoint["arrival_time"])." - ".strtotime($cur_timepoint["arrival_time"])."
"; - $time_estimate = ($distance_percent * $total_time) + strtotime($cur_timepoint["arrival_time"]); - $stopTime["arrival_time"] = date("H:i:s", $time_estimate); - } else { - $stopTime["arrival_time"] = $cur_timepoint["arrival_time"]; - } - $rv[] = $stopTime; - //var_dump($rv); - } - } - return $rv; -} -function getTimeInterpolatedTripAtStop($tripID, $stop_sequence) -{ +WHERE trips.trip_id = :tripID $range ORDER BY stop_sequence"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":tripID", $tripID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + $stopTimes = $query->fetchAll(); + $cur_timepoint = Array(); + $next_timepoint = Array(); + $distance_between_timepoints = 0.0; + $distance_traveled_between_timepoints = 0.0; + $rv = Array(); + foreach ($stopTimes as $i => $stopTime) { + if ($stopTime['arrival_time'] != "") { + // is timepoint + $cur_timepoint = $stopTime; + $distance_between_timepoints = 0.0; + $distance_traveled_between_timepoints = 0.0; + if ($i + 1 < sizeof($stopTimes)) { + $k = $i + 1; + $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]); + while ($stopTimes[$k]["arrival_time"] == "" && $k + 1 < sizeof($stopTimes)) { + $k += 1; + // echo "k".$k; + $distance_between_timepoints += distance($stopTimes[$k - 1]["stop_lat"], $stopTimes[$k - 1]["stop_lon"], $stopTimes[$k]["stop_lat"], $stopTimes[$k]["stop_lon"]); + } + $next_timepoint = $stopTimes[$k]; + } + $rv[] = $stopTime; + } else { + // is untimed point + // echo "i".$i; + $distance_traveled_between_timepoints += distance($stopTimes[$i - 1]["stop_lat"], $stopTimes[$i - 1]["stop_lon"], $stopTimes[$i]["stop_lat"], $stopTimes[$i]["stop_lon"]); + // echo "$distance_traveled_between_timepoints / $distance_between_timepoints
"; + $distance_percent = $distance_traveled_between_timepoints / $distance_between_timepoints; + if ($next_timepoint["arrival_time"] != "") { + $total_time = strtotime($next_timepoint["arrival_time"]) - strtotime($cur_timepoint["arrival_time"]); + // echo strtotime($next_timepoint["arrival_time"])." - ".strtotime($cur_timepoint["arrival_time"])."
"; + $time_estimate = ($distance_percent * $total_time) + strtotime($cur_timepoint["arrival_time"]); + $stopTime["arrival_time"] = date("H:i:s", $time_estimate); + } else { + $stopTime["arrival_time"] = $cur_timepoint["arrival_time"]; + } + $rv[] = $stopTime; + } + } + // var_dump($rv); + return $rv; +} + +function getTripPreviousTimePoint($tripID, $stop_sequence) { + global $conn; + $query = " SELECT trip_id,stop_id, + stop_sequence +FROM stop_times +WHERE trip_id = :tripID and stop_sequence < :stop_sequence +and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence DESC LIMIT 1"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":tripID", $tripID); + $query->bindParam(":stop_sequence", $stop_sequence); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + +function getTripNextTimePoint($tripID, $stop_sequence) { + global $conn; + $query = " SELECT trip_id,stop_id, + stop_sequence +FROM stop_times +WHERE trip_id = :tripID and stop_sequence > :stop_sequence +and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence LIMIT 1"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":tripID", $tripID); + $query->bindParam(":stop_sequence", $stop_sequence); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetch(PDO :: FETCH_ASSOC); +} + +function getTimeInterpolatedTripAtStop($tripID, $stop_sequence) { global $conn; // limit interpolation to between nearest actual points. - $prevTimePoint = pg_fetch_assoc(pg_query($conn," SELECT trip_id,stop_id, - stop_sequence -FROM stop_times -WHERE trip_id = '$tripID' and stop_sequence < $stop_sequence and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence DESC LIMIT 1")); - $nextTimePoint = pg_fetch_assoc(pg_query($conn," SELECT trip_id,stop_id, - stop_sequence -FROM stop_times -WHERE trip_id = '$tripID' and stop_sequence > $stop_sequence and stop_times.arrival_time IS NOT NULL ORDER BY stop_sequence LIMIT 1")); - $range = "AND stop_sequence >= '{$prevTimePoint['stop_sequence']}' AND stop_sequence <= '{$nextTimePoint['stop_sequence']}'"; - foreach (getTimeInterpolatedTrip($tripID,$range) as $tripStop) { - if ($tripStop['stop_sequence'] == $stop_sequence) return $tripStop; - } - return Array(); -} -function getTripStartTime($tripID) -{ - global $conn; - $query = "Select * from stop_times - where trip_id = '$tripID' + $prevTimePoint = getTripPreviousTimePoint($tripID, $stop_sequence); + $nextTimePoint = getTripNextTimePoint($tripID, $stop_sequence); + // echo " prev {$lowestDelta['stop_sequence']} next {$nextTimePoint['stop_sequence']} "; + $range = ""; + if ($prevTimePoint != "") + $range .= " AND stop_sequence >= '{$prevTimePoint['stop_sequence']}'"; + if ($nextTimePoint != "") + $range .= " AND stop_sequence <= '{$nextTimePoint['stop_sequence']}'"; + foreach (getTimeInterpolatedTrip($tripID, $range) as $tripStop) { + if ($tripStop['stop_sequence'] == $stop_sequence) + return $tripStop; + } + return Array(); +} + +function getTripStartTime($tripID) { + global $conn; + $query = "Select * from stop_times + where trip_id = :tripID AND arrival_time IS NOT NULL AND stop_sequence = '1'"; - debug($query, "database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - $r = pg_fetch_assoc($result); - return $r['arrival_time']; -} -function getActiveTrips($time) -{ - global $conn; - if ($time == "") $time = current_time(); - $query = "Select distinct stop_times.trip_id, start_times.arrival_time as start_time, end_times.arrival_time as end_time from stop_times, (SELECT trip_id,arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":tripID", $tripID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + $r = $query->fetch(PDO :: FETCH_ASSOC); + return $r['arrival_time']; +} + +function getTripEndTime($tripID) { + global $conn; + $query = "SELECT trip_id,max(arrival_time) as arrival_time from stop_times + WHERE stop_times.arrival_time IS NOT NULL and trip_id = :tripID group by trip_id"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":tripID", $tripID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + $r = $query->fetch(PDO :: FETCH_ASSOC); + return $r['arrival_time']; +} + +function getActiveTrips($time) { + global $conn; + if ($time == "") + $time = current_time(); + $query = "Select distinct stop_times.trip_id, start_times.arrival_time as start_time, end_times.arrival_time as end_time from stop_times, (SELECT trip_id,arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL AND stop_sequence = '1') as start_times, (SELECT trip_id,max(arrival_time) as arrival_time from stop_times WHERE stop_times.arrival_time IS NOT NULL group by trip_id) as end_times -WHERE start_times.trip_id = end_times.trip_id AND stop_times.trip_id = end_times.trip_id AND $time > start_times.arrival_time AND $time < end_times.arrival_time"; - debug($query, "database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); -} - -function viaPoints($tripid, $stop_sequence = "") -{ - global $conn; - $query = "SELECT stops.stop_id, stop_name, arrival_time +WHERE start_times.trip_id = end_times.trip_id AND stop_times.trip_id = end_times.trip_id AND :time > start_times.arrival_time AND :time < end_times.arrival_time"; + debug($query, "database"); + $query = $conn->prepare($query); + $query->bindParam(":time", $time); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function viaPoints($tripID, $stop_sequence = "", $timing_points_only = true) { + global $conn; + $query = "SELECT stops.stop_id, stop_name, arrival_time FROM stop_times join stops on stops.stop_id = stop_times.stop_id -WHERE stop_times.trip_id = '$tripid' -".($stop_sequence != "" ? "AND stop_sequence > '$stop_sequence'" : ""). -"AND substr(stop_code,1,2) != 'Wj' ORDER BY stop_sequence"; - debug($query, "database"); - $result = pg_query($conn, $query); - if (!$result) { - databaseError(pg_result_error($result)); - return Array(); - } - return pg_fetch_all($result); -} -function viaPointNames($tripid, $stop_sequence = "") -{ - $viaPointNames = Array(); - foreach(viaPoints($tripid, $stop_sequence) as $point) { - $viaPointNames[] = $point['stop_name']; - } - return r_implode(", ", $viaPointNames); -} +WHERE stop_times.trip_id = :tripID +" . ($stop_sequence != "" ? " AND stop_sequence > :stop_sequence " : "") . ($timing_points_only ? "AND substr(stop_code,1,2) != 'Wj' " : "") . " ORDER BY stop_sequence"; + debug($query, "database"); + $query = $conn->prepare($query); + if ($stop_sequence != "") + $query->bindParam(":stop_sequence", $stop_sequence); + $query->bindParam(":tripID", $tripID); + $query->execute(); + if (!$query) { + databaseError($conn->errorInfo()); + return Array(); + } + return $query->fetchAll(); +} + +function viaPointNames($tripid, $stop_sequence = "") { + $viaPointNames = Array(); + foreach (viaPoints($tripid, $stop_sequence) as $point) { + $viaPointNames[] = $point['stop_name']; + } + if (sizeof($viaPointNames) > 0) { + return r_implode(", ", $viaPointNames); + } else { + return ""; + } +} + ?> --- a/index.php +++ b/index.php @@ -1,32 +1,46 @@
-
-
-

busness time


Canberra Bus Timetables and Trip Planner -
- - Launch Trip Planner... - - -Busness R&D'; -include_footer(true) -?> - +
+
+

busness time


Canberra Bus Timetables and Trip Planner +
+ + Launch Trip Planner... + + + Busness R&D'; + echo ' MyWay Balance and Timeliness Survey Results'; + include_footer(true) + ?> --- /dev/null +++ b/js/LAB.min.js @@ -1,1 +1,5 @@ - +/*! LAB.js (LABjs :: Loading And Blocking JavaScript) + v2.0.1 (c) Kyle Simpson + MIT License +*/ +(function(o){var K=o.$LAB,y="UseLocalXHR",z="AlwaysPreserveOrder",u="AllowDuplicates",A="CacheBust",B="BasePath",C=/^[^?#]*\//.exec(location.href)[0],D=/^\w+\:\/\/\/?[^\/]+/.exec(C)[0],i=document.head||document.getElementsByTagName("head"),L=(o.opera&&Object.prototype.toString.call(o.opera)=="[object Opera]")||("MozAppearance"in document.documentElement.style),q=document.createElement("script"),E=typeof q.preload=="boolean",r=E||(q.readyState&&q.readyState=="uninitialized"),F=!r&&q.async===true,M=!r&&!F&&!L;function G(a){return Object.prototype.toString.call(a)=="[object Function]"}function H(a){return Object.prototype.toString.call(a)=="[object Array]"}function N(a,c){var b=/^\w+\:\/\//;if(/^\/\/\/?/.test(a)){a=location.protocol+a}else if(!b.test(a)&&a.charAt(0)!="/"){a=(c||"")+a}return b.test(a)?a:((a.charAt(0)=="/"?D:C)+a)}function s(a,c){for(var b in a){if(a.hasOwnProperty(b)){c[b]=a[b]}}return c}function O(a){var c=false;for(var b=0;b0){for(var a=0;a=0;){d=n.shift();a=a[d.type].apply(null,d.args)}return a},noConflict:function(){o.$LAB=K;return m},sandbox:function(){return J()}};return m}o.$LAB=J();(function(a,c,b){if(document.readyState==null&&document[a]){document.readyState="loading";document[a](c,b=function(){document.removeEventListener(c,b,false);document.readyState="complete"},false)}})("addEventListener","DOMContentLoaded")})(this); --- /dev/null +++ b/js/flot/excanvas.js @@ -1,1 +1,1428 @@ - +// Copyright 2006 Google Inc. +// +// 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. + + +// Known Issues: +// +// * Patterns only support repeat. +// * Radial gradient are not implemented. The VML version of these look very +// different from the canvas one. +// * Clipping paths are not implemented. +// * Coordsize. The width and height attribute have higher priority than the +// width and height style values which isn't correct. +// * Painting mode isn't implemented. +// * Canvas width/height should is using content-box by default. IE in +// Quirks mode will draw the canvas using border-box. Either change your +// doctype to HTML5 +// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) +// or use Box Sizing Behavior from WebFX +// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) +// * Non uniform scaling does not correctly scale strokes. +// * Filling very large shapes (above 5000 points) is buggy. +// * Optimize. There is always room for speed improvements. + +// Only add this code if we do not already have a canvas implementation +if (!document.createElement('canvas').getContext) { + +(function() { + + // alias some functions to make (compiled) code shorter + var m = Math; + var mr = m.round; + var ms = m.sin; + var mc = m.cos; + var abs = m.abs; + var sqrt = m.sqrt; + + // this is used for sub pixel precision + var Z = 10; + var Z2 = Z / 2; + + /** + * This funtion is assigned to the elements as element.getContext(). + * @this {HTMLElement} + * @return {CanvasRenderingContext2D_} + */ + function getContext() { + return this.context_ || + (this.context_ = new CanvasRenderingContext2D_(this)); + } + + var slice = Array.prototype.slice; + + /** + * Binds a function to an object. The returned function will always use the + * passed in {@code obj} as {@code this}. + * + * Example: + * + * g = bind(f, obj, a, b) + * g(c, d) // will do f.call(obj, a, b, c, d) + * + * @param {Function} f The function to bind the object to + * @param {Object} obj The object that should act as this when the function + * is called + * @param {*} var_args Rest arguments that will be used as the initial + * arguments when the function is called + * @return {Function} A new function that has bound this + */ + function bind(f, obj, var_args) { + var a = slice.call(arguments, 2); + return function() { + return f.apply(obj, a.concat(slice.call(arguments))); + }; + } + + function encodeHtmlAttribute(s) { + return String(s).replace(/&/g, '&').replace(/"/g, '"'); + } + + function addNamespacesAndStylesheet(doc) { + // create xmlns + if (!doc.namespaces['g_vml_']) { + doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', + '#default#VML'); + + } + if (!doc.namespaces['g_o_']) { + doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', + '#default#VML'); + } + + // Setup default CSS. Only add one style sheet per document + if (!doc.styleSheets['ex_canvas_']) { + var ss = doc.createStyleSheet(); + ss.owningElement.id = 'ex_canvas_'; + ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + + // default size is 300x150 in Gecko and Opera + 'text-align:left;width:300px;height:150px}'; + } + } + + // Add namespaces and stylesheet at startup. + addNamespacesAndStylesheet(document); + + var G_vmlCanvasManager_ = { + init: function(opt_doc) { + if (/MSIE/.test(navigator.userAgent) && !window.opera) { + var doc = opt_doc || document; + // Create a dummy element so that IE will allow canvas elements to be + // recognized. + doc.createElement('canvas'); + doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); + } + }, + + init_: function(doc) { + // find all canvas elements + var els = doc.getElementsByTagName('canvas'); + for (var i = 0; i < els.length; i++) { + this.initElement(els[i]); + } + }, + + /** + * Public initializes a canvas element so that it can be used as canvas + * element from now on. This is called automatically before the page is + * loaded but if you are creating elements using createElement you need to + * make sure this is called on the element. + * @param {HTMLElement} el The canvas element to initialize. + * @return {HTMLElement} the element that was created. + */ + initElement: function(el) { + if (!el.getContext) { + el.getContext = getContext; + + // Add namespaces and stylesheet to document of the element. + addNamespacesAndStylesheet(el.ownerDocument); + + // Remove fallback content. There is no way to hide text nodes so we + // just remove all childNodes. We could hide all elements and remove + // text nodes but who really cares about the fallback content. + el.innerHTML = ''; + + // do not use inline function because that will leak memory + el.attachEvent('onpropertychange', onPropertyChange); + el.attachEvent('onresize', onResize); + + var attrs = el.attributes; + if (attrs.width && attrs.width.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setWidth_(attrs.width.nodeValue); + el.style.width = attrs.width.nodeValue + 'px'; + } else { + el.width = el.clientWidth; + } + if (attrs.height && attrs.height.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setHeight_(attrs.height.nodeValue); + el.style.height = attrs.height.nodeValue + 'px'; + } else { + el.height = el.clientHeight; + } + //el.getContext().setCoordsize_() + } + return el; + } + }; + + function onPropertyChange(e) { + var el = e.srcElement; + + switch (e.propertyName) { + case 'width': + el.getContext().clearRect(); + el.style.width = el.attributes.width.nodeValue + 'px'; + // In IE8 this does not trigger onresize. + el.firstChild.style.width = el.clientWidth + 'px'; + break; + case 'height': + el.getContext().clearRect(); + el.style.height = el.attributes.height.nodeValue + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + break; + } + } + + function onResize(e) { + var el = e.srcElement; + if (el.firstChild) { + el.firstChild.style.width = el.clientWidth + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + } + } + + G_vmlCanvasManager_.init(); + + // precompute "00" to "FF" + var decToHex = []; + for (var i = 0; i < 16; i++) { + for (var j = 0; j < 16; j++) { + decToHex[i * 16 + j] = i.toString(16) + j.toString(16); + } + } + + function createMatrixIdentity() { + return [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1] + ]; + } + + function matrixMultiply(m1, m2) { + var result = createMatrixIdentity(); + + for (var x = 0; x < 3; x++) { + for (var y = 0; y < 3; y++) { + var sum = 0; + + for (var z = 0; z < 3; z++) { + sum += m1[x][z] * m2[z][y]; + } + + result[x][y] = sum; + } + } + return result; + } + + function copyState(o1, o2) { + o2.fillStyle = o1.fillStyle; + o2.lineCap = o1.lineCap; + o2.lineJoin = o1.lineJoin; + o2.lineWidth = o1.lineWidth; + o2.miterLimit = o1.miterLimit; + o2.shadowBlur = o1.shadowBlur; + o2.shadowColor = o1.shadowColor; + o2.shadowOffsetX = o1.shadowOffsetX; + o2.shadowOffsetY = o1.shadowOffsetY; + o2.strokeStyle = o1.strokeStyle; + o2.globalAlpha = o1.globalAlpha; + o2.font = o1.font; + o2.textAlign = o1.textAlign; + o2.textBaseline = o1.textBaseline; + o2.arcScaleX_ = o1.arcScaleX_; + o2.arcScaleY_ = o1.arcScaleY_; + o2.lineScale_ = o1.lineScale_; + } + + var colorData = { + aliceblue: '#F0F8FF', + antiquewhite: '#FAEBD7', + aquamarine: '#7FFFD4', + azure: '#F0FFFF', + beige: '#F5F5DC', + bisque: '#FFE4C4', + black: '#000000', + blanchedalmond: '#FFEBCD', + blueviolet: '#8A2BE2', + brown: '#A52A2A', + burlywood: '#DEB887', + cadetblue: '#5F9EA0', + chartreuse: '#7FFF00', + chocolate: '#D2691E', + coral: '#FF7F50', + cornflowerblue: '#6495ED', + cornsilk: '#FFF8DC', + crimson: '#DC143C', + cyan: '#00FFFF', + darkblue: '#00008B', + darkcyan: '#008B8B', + darkgoldenrod: '#B8860B', + darkgray: '#A9A9A9', + darkgreen: '#006400', + darkgrey: '#A9A9A9', + darkkhaki: '#BDB76B', + darkmagenta: '#8B008B', + darkolivegreen: '#556B2F', + darkorange: '#FF8C00', + darkorchid: '#9932CC', + darkred: '#8B0000', + darksalmon: '#E9967A', + darkseagreen: '#8FBC8F', + darkslateblue: '#483D8B', + darkslategray: '#2F4F4F', + darkslategrey: '#2F4F4F', + darkturquoise: '#00CED1', + darkviolet: '#9400D3', + deeppink: '#FF1493', + deepskyblue: '#00BFFF', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1E90FF', + firebrick: '#B22222', + floralwhite: '#FFFAF0', + forestgreen: '#228B22', + gainsboro: '#DCDCDC', + ghostwhite: '#F8F8FF', + gold: '#FFD700', + goldenrod: '#DAA520', + grey: '#808080', + greenyellow: '#ADFF2F', + honeydew: '#F0FFF0', + hotpink: '#FF69B4', + indianred: '#CD5C5C', + indigo: '#4B0082', + ivory: '#FFFFF0', + khaki: '#F0E68C', + lavender: '#E6E6FA', + lavenderblush: '#FFF0F5', + lawngreen: '#7CFC00', + lemonchiffon: '#FFFACD', + lightblue: '#ADD8E6', + lightcoral: '#F08080', + lightcyan: '#E0FFFF', + lightgoldenrodyellow: '#FAFAD2', + lightgreen: '#90EE90', + lightgrey: '#D3D3D3', + lightpink: '#FFB6C1', + lightsalmon: '#FFA07A', + lightseagreen: '#20B2AA', + lightskyblue: '#87CEFA', + lightslategray: '#778899', + lightslategrey: '#778899', + lightsteelblue: '#B0C4DE', + lightyellow: '#FFFFE0', + limegreen: '#32CD32', + linen: '#FAF0E6', + magenta: '#FF00FF', + mediumaquamarine: '#66CDAA', + mediumblue: '#0000CD', + mediumorchid: '#BA55D3', + mediumpurple: '#9370DB', + mediumseagreen: '#3CB371', + mediumslateblue: '#7B68EE', + mediumspringgreen: '#00FA9A', + mediumturquoise: '#48D1CC', + mediumvioletred: '#C71585', + midnightblue: '#191970', + mintcream: '#F5FFFA', + mistyrose: '#FFE4E1', + moccasin: '#FFE4B5', + navajowhite: '#FFDEAD', + oldlace: '#FDF5E6', + olivedrab: '#6B8E23', + orange: '#FFA500', + orangered: '#FF4500', + orchid: '#DA70D6', + palegoldenrod: '#EEE8AA', + palegreen: '#98FB98', + paleturquoise: '#AFEEEE', + palevioletred: '#DB7093', + papayawhip: '#FFEFD5', + peachpuff: '#FFDAB9', + peru: '#CD853F', + pink: '#FFC0CB', + plum: '#DDA0DD', + powderblue: '#B0E0E6', + rosybrown: '#BC8F8F', + royalblue: '#4169E1', + saddlebrown: '#8B4513', + salmon: '#FA8072', + sandybrown: '#F4A460', + seagreen: '#2E8B57', + seashell: '#FFF5EE', + sienna: '#A0522D', + skyblue: '#87CEEB', + slateblue: '#6A5ACD', + slategray: '#708090', + slategrey: '#708090', + snow: '#FFFAFA', + springgreen: '#00FF7F', + steelblue: '#4682B4', + tan: '#D2B48C', + thistle: '#D8BFD8', + tomato: '#FF6347', + turquoise: '#40E0D0', + violet: '#EE82EE', + wheat: '#F5DEB3', + whitesmoke: '#F5F5F5', + yellowgreen: '#9ACD32' + }; + + + function getRgbHslContent(styleString) { + var start = styleString.indexOf('(', 3); + var end = styleString.indexOf(')', start + 1); + var parts = styleString.substring(start + 1, end).split(','); + // add alpha if needed + if (parts.length == 4 && styleString.substr(3, 1) == 'a') { + alpha = Number(parts[3]); + } else { + parts[3] = 1; + } + return parts; + } + + function percent(s) { + return parseFloat(s) / 100; + } + + function clamp(v, min, max) { + return Math.min(max, Math.max(min, v)); + } + + function hslToRgb(parts){ + var r, g, b; + h = parseFloat(parts[0]) / 360 % 360; + if (h < 0) + h++; + s = clamp(percent(parts[1]), 0, 1); + l = clamp(percent(parts[2]), 0, 1); + if (s == 0) { + r = g = b = l; // achromatic + } else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hueToRgb(p, q, h + 1 / 3); + g = hueToRgb(p, q, h); + b = hueToRgb(p, q, h - 1 / 3); + } + + return '#' + decToHex[Math.floor(r * 255)] + + decToHex[Math.floor(g * 255)] + + decToHex[Math.floor(b * 255)]; + } + + function hueToRgb(m1, m2, h) { + if (h < 0) + h++; + if (h > 1) + h--; + + if (6 * h < 1) + return m1 + (m2 - m1) * 6 * h; + else if (2 * h < 1) + return m2; + else if (3 * h < 2) + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + else + return m1; + } + + function processStyle(styleString) { + var str, alpha = 1; + + styleString = String(styleString); + if (styleString.charAt(0) == '#') { + str = styleString; + } else if (/^rgb/.test(styleString)) { + var parts = getRgbHslContent(styleString); + var str = '#', n; + for (var i = 0; i < 3; i++) { + if (parts[i].indexOf('%') != -1) { + n = Math.floor(percent(parts[i]) * 255); + } else { + n = Number(parts[i]); + } + str += decToHex[clamp(n, 0, 255)]; + } + alpha = parts[3]; + } else if (/^hsl/.test(styleString)) { + var parts = getRgbHslContent(styleString); + str = hslToRgb(parts); + alpha = parts[3]; + } else { + str = colorData[styleString] || styleString; + } + return {color: str, alpha: alpha}; + } + + var DEFAULT_STYLE = { + style: 'normal', + variant: 'normal', + weight: 'normal', + size: 10, + family: 'sans-serif' + }; + + // Internal text style cache + var fontStyleCache = {}; + + function processFontStyle(styleString) { + if (fontStyleCache[styleString]) { + return fontStyleCache[styleString]; + } + + var el = document.createElement('div'); + var style = el.style; + try { + style.font = styleString; + } catch (ex) { + // Ignore failures to set to invalid font. + } + + return fontStyleCache[styleString] = { + style: style.fontStyle || DEFAULT_STYLE.style, + variant: style.fontVariant || DEFAULT_STYLE.variant, + weight: style.fontWeight || DEFAULT_STYLE.weight, + size: style.fontSize || DEFAULT_STYLE.size, + family: style.fontFamily || DEFAULT_STYLE.family + }; + } + + function getComputedStyle(style, element) { + var computedStyle = {}; + + for (var p in style) { + computedStyle[p] = style[p]; + } + + // Compute the size + var canvasFontSize = parseFloat(element.currentStyle.fontSize), + fontSize = parseFloat(style.size); + + if (typeof style.size == 'number') { + computedStyle.size = style.size; + } else if (style.size.indexOf('px') != -1) { + computedStyle.size = fontSize; + } else if (style.size.indexOf('em') != -1) { + computedStyle.size = canvasFontSize * fontSize; + } else if(style.size.indexOf('%') != -1) { + computedStyle.size = (canvasFontSize / 100) * fontSize; + } else if (style.size.indexOf('pt') != -1) { + computedStyle.size = fontSize / .75; + } else { + computedStyle.size = canvasFontSize; + } + + // Different scaling between normal text and VML text. This was found using + // trial and error to get the same size as non VML text. + computedStyle.size *= 0.981; + + return computedStyle; + } + + function buildStyle(style) { + return style.style + ' ' + style.variant + ' ' + style.weight + ' ' + + style.size + 'px ' + style.family; + } + + function processLineCap(lineCap) { + switch (lineCap) { + case 'butt': + return 'flat'; + case 'round': + return 'round'; + case 'square': + default: + return 'square'; + } + } + + /** + * This class implements CanvasRenderingContext2D interface as described by + * the WHATWG. + * @param {HTMLElement} surfaceElement The element that the 2D context should + * be associated with + */ + function CanvasRenderingContext2D_(surfaceElement) { + this.m_ = createMatrixIdentity(); + + this.mStack_ = []; + this.aStack_ = []; + this.currentPath_ = []; + + // Canvas context properties + this.strokeStyle = '#000'; + this.fillStyle = '#000'; + + this.lineWidth = 1; + this.lineJoin = 'miter'; + this.lineCap = 'butt'; + this.miterLimit = Z * 1; + this.globalAlpha = 1; + this.font = '10px sans-serif'; + this.textAlign = 'left'; + this.textBaseline = 'alphabetic'; + this.canvas = surfaceElement; + + var el = surfaceElement.ownerDocument.createElement('div'); + el.style.width = surfaceElement.clientWidth + 'px'; + el.style.height = surfaceElement.clientHeight + 'px'; + el.style.overflow = 'hidden'; + el.style.position = 'absolute'; + surfaceElement.appendChild(el); + + this.element_ = el; + this.arcScaleX_ = 1; + this.arcScaleY_ = 1; + this.lineScale_ = 1; + } + + var contextPrototype = CanvasRenderingContext2D_.prototype; + contextPrototype.clearRect = function() { + if (this.textMeasureEl_) { + this.textMeasureEl_.removeNode(true); + this.textMeasureEl_ = null; + } + this.element_.innerHTML = ''; + }; + + contextPrototype.beginPath = function() { + // TODO: Branch current matrix so that save/restore has no effect + // as per safari docs. + this.currentPath_ = []; + }; + + contextPrototype.moveTo = function(aX, aY) { + var p = this.getCoords_(aX, aY); + this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.lineTo = function(aX, aY) { + var p = this.getCoords_(aX, aY); + this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); + + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, + aCP2x, aCP2y, + aX, aY) { + var p = this.getCoords_(aX, aY); + var cp1 = this.getCoords_(aCP1x, aCP1y); + var cp2 = this.getCoords_(aCP2x, aCP2y); + bezierCurveTo(this, cp1, cp2, p); + }; + + // Helper function that takes the already fixed cordinates. + function bezierCurveTo(self, cp1, cp2, p) { + self.currentPath_.push({ + type: 'bezierCurveTo', + cp1x: cp1.x, + cp1y: cp1.y, + cp2x: cp2.x, + cp2y: cp2.y, + x: p.x, + y: p.y + }); + self.currentX_ = p.x; + self.currentY_ = p.y; + } + + contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { + // the following is lifted almost directly from + // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes + + var cp = this.getCoords_(aCPx, aCPy); + var p = this.getCoords_(aX, aY); + + var cp1 = { + x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), + y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) + }; + var cp2 = { + x: cp1.x + (p.x - this.currentX_) / 3.0, + y: cp1.y + (p.y - this.currentY_) / 3.0 + }; + + bezierCurveTo(this, cp1, cp2, p); + }; + + contextPrototype.arc = function(aX, aY, aRadius, + aStartAngle, aEndAngle, aClockwise) { + aRadius *= Z; + var arcType = aClockwise ? 'at' : 'wa'; + + var xStart = aX + mc(aStartAngle) * aRadius - Z2; + var yStart = aY + ms(aStartAngle) * aRadius - Z2; + + var xEnd = aX + mc(aEndAngle) * aRadius - Z2; + var yEnd = aY + ms(aEndAngle) * aRadius - Z2; + + // IE won't render arches drawn counter clockwise if xStart == xEnd. + if (xStart == xEnd && !aClockwise) { + xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something + // that can be represented in binary + } + + var p = this.getCoords_(aX, aY); + var pStart = this.getCoords_(xStart, yStart); + var pEnd = this.getCoords_(xEnd, yEnd); + + this.currentPath_.push({type: arcType, + x: p.x, + y: p.y, + radius: aRadius, + xStart: pStart.x, + yStart: pStart.y, + xEnd: pEnd.x, + yEnd: pEnd.y}); + + }; + + contextPrototype.rect = function(aX, aY, aWidth, aHeight) { + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + }; + + contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { + var oldPath = this.currentPath_; + this.beginPath(); + + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.stroke(); + + this.currentPath_ = oldPath; + }; + + contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { + var oldPath = this.currentPath_; + this.beginPath(); + + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.fill(); + + this.currentPath_ = oldPath; + }; + + contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { + var gradient = new CanvasGradient_('gradient'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + return gradient; + }; + + contextPrototype.createRadialGradient = function(aX0, aY0, aR0, + aX1, aY1, aR1) { + var gradient = new CanvasGradient_('gradientradial'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.r0_ = aR0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + gradient.r1_ = aR1; + return gradient; + }; + + contextPrototype.drawImage = function(image, var_args) { + var dx, dy, dw, dh, sx, sy, sw, sh; + + // to find the original width we overide the width and height + var oldRuntimeWidth = image.runtimeStyle.width; + var oldRuntimeHeight = image.runtimeStyle.height; + image.runtimeStyle.width = 'auto'; + image.runtimeStyle.height = 'auto'; + + // get the original size + var w = image.width; + var h = image.height; + + // and remove overides + image.runtimeStyle.width = oldRuntimeWidth; + image.runtimeStyle.height = oldRuntimeHeight; + + if (arguments.length == 3) { + dx = arguments[1]; + dy = arguments[2]; + sx = sy = 0; + sw = dw = w; + sh = dh = h; + } else if (arguments.length == 5) { + dx = arguments[1]; + dy = arguments[2]; + dw = arguments[3]; + dh = arguments[4]; + sx = sy = 0; + sw = w; + sh = h; + } else if (arguments.length == 9) { + sx = arguments[1]; + sy = arguments[2]; + sw = arguments[3]; + sh = arguments[4]; + dx = arguments[5]; + dy = arguments[6]; + dw = arguments[7]; + dh = arguments[8]; + } else { + throw Error('Invalid number of arguments'); + } + + var d = this.getCoords_(dx, dy); + + var w2 = sw / 2; + var h2 = sh / 2; + + var vmlStr = []; + + var W = 10; + var H = 10; + + // For some reason that I've now forgotten, using divs didn't work + vmlStr.push(' ' , + '', + ''); + + this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); + }; + + contextPrototype.stroke = function(aFill) { + var W = 10; + var H = 10; + // Divide the shape into chunks if it's too long because IE has a limit + // somewhere for how long a VML shape can be. This simple division does + // not work with fills, only strokes, unfortunately. + var chunkSize = 5000; + + var min = {x: null, y: null}; + var max = {x: null, y: null}; + + for (var j = 0; j < this.currentPath_.length; j += chunkSize) { + var lineStr = []; + var lineOpen = false; + + lineStr.push(''); + + if (!aFill) { + appendStroke(this, lineStr); + } else { + appendFill(this, lineStr, min, max); + } + + lineStr.push(''); + + this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); + } + }; + + function appendStroke(ctx, lineStr) { + var a = processStyle(ctx.strokeStyle); + var color = a.color; + var opacity = a.alpha * ctx.globalAlpha; + var lineWidth = ctx.lineScale_ * ctx.lineWidth; + + // VML cannot correctly render a line if the width is less than 1px. + // In that case, we dilute the color to make the line look thinner. + if (lineWidth < 1) { + opacity *= lineWidth; + } + + lineStr.push( + '' + ); + } + + function appendFill(ctx, lineStr, min, max) { + var fillStyle = ctx.fillStyle; + var arcScaleX = ctx.arcScaleX_; + var arcScaleY = ctx.arcScaleY_; + var width = max.x - min.x; + var height = max.y - min.y; + if (fillStyle instanceof CanvasGradient_) { + // TODO: Gradients transformed with the transformation matrix. + var angle = 0; + var focus = {x: 0, y: 0}; + + // additional offset + var shift = 0; + // scale factor for offset + var expansion = 1; + + if (fillStyle.type_ == 'gradient') { + var x0 = fillStyle.x0_ / arcScaleX; + var y0 = fillStyle.y0_ / arcScaleY; + var x1 = fillStyle.x1_ / arcScaleX; + var y1 = fillStyle.y1_ / arcScaleY; + var p0 = ctx.getCoords_(x0, y0); + var p1 = ctx.getCoords_(x1, y1); + var dx = p1.x - p0.x; + var dy = p1.y - p0.y; + angle = Math.atan2(dx, dy) * 180 / Math.PI; + + // The angle should be a non-negative number. + if (angle < 0) { + angle += 360; + } + + // Very small angles produce an unexpected result because they are + // converted to a scientific notation string. + if (angle < 1e-6) { + angle = 0; + } + } else { + var p0 = ctx.getCoords_(fillStyle.x0_, fillStyle.y0_); + focus = { + x: (p0.x - min.x) / width, + y: (p0.y - min.y) / height + }; + + width /= arcScaleX * Z; + height /= arcScaleY * Z; + var dimension = m.max(width, height); + shift = 2 * fillStyle.r0_ / dimension; + expansion = 2 * fillStyle.r1_ / dimension - shift; + } + + // We need to sort the color stops in ascending order by offset, + // otherwise IE won't interpret it correctly. + var stops = fillStyle.colors_; + stops.sort(function(cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + var length = stops.length; + var color1 = stops[0].color; + var color2 = stops[length - 1].color; + var opacity1 = stops[0].alpha * ctx.globalAlpha; + var opacity2 = stops[length - 1].alpha * ctx.globalAlpha; + + var colors = []; + for (var i = 0; i < length; i++) { + var stop = stops[i]; + colors.push(stop.offset * expansion + shift + ' ' + stop.color); + } + + // When colors attribute is used, the meanings of opacity and o:opacity2 + // are reversed. + lineStr.push(''); + } else if (fillStyle instanceof CanvasPattern_) { + if (width && height) { + var deltaLeft = -min.x; + var deltaTop = -min.y; + lineStr.push(''); + } + } else { + var a = processStyle(ctx.fillStyle); + var color = a.color; + var opacity = a.alpha * ctx.globalAlpha; + lineStr.push(''); + } + } + + contextPrototype.fill = function() { + this.stroke(true); + }; + + contextPrototype.closePath = function() { + this.currentPath_.push({type: 'close'}); + }; + + /** + * @private + */ + contextPrototype.getCoords_ = function(aX, aY) { + var m = this.m_; + return { + x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, + y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 + }; + }; + + contextPrototype.save = function() { + var o = {}; + copyState(this, o); + this.aStack_.push(o); + this.mStack_.push(this.m_); + this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); + }; + + contextPrototype.restore = function() { + if (this.aStack_.length) { + copyState(this.aStack_.pop(), this); + this.m_ = this.mStack_.pop(); + } + }; + + function matrixIsFinite(m) { + return isFinite(m[0][0]) && isFinite(m[0][1]) && + isFinite(m[1][0]) && isFinite(m[1][1]) && + isFinite(m[2][0]) && isFinite(m[2][1]); + } + + function setM(ctx, m, updateLineScale) { + if (!matrixIsFinite(m)) { + return; + } + ctx.m_ = m; + + if (updateLineScale) { + // Get the line scale. + // Determinant of this.m_ means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; + ctx.lineScale_ = sqrt(abs(det)); + } + } + + contextPrototype.translate = function(aX, aY) { + var m1 = [ + [1, 0, 0], + [0, 1, 0], + [aX, aY, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), false); + }; + + contextPrototype.rotate = function(aRot) { + var c = mc(aRot); + var s = ms(aRot); + + var m1 = [ + [c, s, 0], + [-s, c, 0], + [0, 0, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), false); + }; + + contextPrototype.scale = function(aX, aY) { + this.arcScaleX_ *= aX; + this.arcScaleY_ *= aY; + var m1 = [ + [aX, 0, 0], + [0, aY, 0], + [0, 0, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), true); + }; + + contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { + var m1 = [ + [m11, m12, 0], + [m21, m22, 0], + [dx, dy, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), true); + }; + + contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { + var m = [ + [m11, m12, 0], + [m21, m22, 0], + [dx, dy, 1] + ]; + + setM(this, m, true); + }; + + /** + * The text drawing function. + * The maxWidth argument isn't taken in account, since no browser supports + * it yet. + */ + contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) { + var m = this.m_, + delta = 1000, + left = 0, + right = delta, + offset = {x: 0, y: 0}, + lineStr = []; + + var fontStyle = getComputedStyle(processFontStyle(this.font), + this.element_); + + var fontStyleString = buildStyle(fontStyle); + + var elementStyle = this.element_.currentStyle; + var textAlign = this.textAlign.toLowerCase(); + switch (textAlign) { + case 'left': + case 'center': + case 'right': + break; + case 'end': + textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left'; + break; + case 'start': + textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left'; + break; + default: + textAlign = 'left'; + } + + // 1.75 is an arbitrary number, as there is no info about the text baseline + switch (this.textBaseline) { + case 'hanging': + case 'top': + offset.y = fontStyle.size / 1.75; + break; + case 'middle': + break; + default: + case null: + case 'alphabetic': + case 'ideographic': + case 'bottom': + offset.y = -fontStyle.size / 2.25; + break; + } + + switch(textAlign) { + case 'right': + left = delta; + right = 0.05; + break; + case 'center': + left = right = delta / 2; + break; + } + + var d = this.getCoords_(x + offset.x, y + offset.y); + + lineStr.push(''); + + if (stroke) { + appendStroke(this, lineStr); + } else { + // TODO: Fix the min and max params. + appendFill(this, lineStr, {x: -left, y: 0}, + {x: right, y: fontStyle.size}); + } + + var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' + + m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0'; + + var skewOffset = mr(d.x / Z) + ',' + mr(d.y / Z); + + lineStr.push('', + '', + ''); + + this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); + }; + + contextPrototype.fillText = function(text, x, y, maxWidth) { + this.drawText_(text, x, y, maxWidth, false); + }; + + contextPrototype.strokeText = function(text, x, y, maxWidth) { + this.drawText_(text, x, y, maxWidth, true); + }; + + contextPrototype.measureText = function(text) { + if (!this.textMeasureEl_) { + var s = ''; + this.element_.insertAdjacentHTML('beforeEnd', s); + this.textMeasureEl_ = this.element_.lastChild; + } + var doc = this.element_.ownerDocument; + this.textMeasureEl_.innerHTML = ''; + this.textMeasureEl_.style.font = this.font; + // Don't use innerHTML or innerText because they allow markup/whitespace. + this.textMeasureEl_.appendChild(doc.createTextNode(text)); + return {width: this.textMeasureEl_.offsetWidth}; + }; + + /******** STUBS ********/ + contextPrototype.clip = function() { + // TODO: Implement + }; + + contextPrototype.arcTo = function() { + // TODO: Implement + }; + + contextPrototype.createPattern = function(image, repetition) { + return new CanvasPattern_(image, repetition); + }; + + // Gradient / Pattern Stubs + function CanvasGradient_(aType) { + this.type_ = aType; + this.x0_ = 0; + this.y0_ = 0; + this.r0_ = 0; + this.x1_ = 0; + this.y1_ = 0; + this.r1_ = 0; + this.colors_ = []; + } + + CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { + aColor = processStyle(aColor); + this.colors_.push({offset: aOffset, + color: aColor.color, + alpha: aColor.alpha}); + }; + + function CanvasPattern_(image, repetition) { + assertImageIsValid(image); + switch (repetition) { + case 'repeat': + case null: + case '': + this.repetition_ = 'repeat'; + break + case 'repeat-x': + case 'repeat-y': + case 'no-repeat': + this.repetition_ = repetition; + break; + default: + throwException('SYNTAX_ERR'); + } + + this.src_ = image.src; + this.width_ = image.width; + this.height_ = image.height; + } + + function throwException(s) { + throw new DOMException_(s); + } + + function assertImageIsValid(img) { + if (!img || img.nodeType != 1 || img.tagName != 'IMG') { + throwException('TYPE_MISMATCH_ERR'); + } + if (img.readyState != 'complete') { + throwException('INVALID_STATE_ERR'); + } + } + + function DOMException_(s) { + this.code = this[s]; + this.message = s +': DOM Exception ' + this.code; + } + var p = DOMException_.prototype = new Error; + p.INDEX_SIZE_ERR = 1; + p.DOMSTRING_SIZE_ERR = 2; + p.HIERARCHY_REQUEST_ERR = 3; + p.WRONG_DOCUMENT_ERR = 4; + p.INVALID_CHARACTER_ERR = 5; + p.NO_DATA_ALLOWED_ERR = 6; + p.NO_MODIFICATION_ALLOWED_ERR = 7; + p.NOT_FOUND_ERR = 8; + p.NOT_SUPPORTED_ERR = 9; + p.INUSE_ATTRIBUTE_ERR = 10; + p.INVALID_STATE_ERR = 11; + p.SYNTAX_ERR = 12; + p.INVALID_MODIFICATION_ERR = 13; + p.NAMESPACE_ERR = 14; + p.INVALID_ACCESS_ERR = 15; + p.VALIDATION_ERR = 16; + p.TYPE_MISMATCH_ERR = 17; + + // set up externs + G_vmlCanvasManager = G_vmlCanvasManager_; + CanvasRenderingContext2D = CanvasRenderingContext2D_; + CanvasGradient = CanvasGradient_; + CanvasPattern = CanvasPattern_; + DOMException = DOMException_; +})(); + +} // if + --- /dev/null +++ b/js/flot/excanvas.min.js @@ -1,1 +1,1 @@ - +if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&").replace(/"/g,""")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AHAL.x){AL.x=Z.x}if(AG.y==null||Z.yAL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('','','');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; --- /dev/null +++ b/js/flot/jquery.colorhelpers.js @@ -1,1 +1,180 @@ +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */ +(function($) { + $.color = {}; + + // construct color object with some convenient chainable helpers + $.color.make = function (r, g, b, a) { + var o = {}; + o.r = r || 0; + o.g = g || 0; + o.b = b || 0; + o.a = a != null ? a : 1; + + o.add = function (c, d) { + for (var i = 0; i < c.length; ++i) + o[c.charAt(i)] += d; + return o.normalize(); + }; + + o.scale = function (c, f) { + for (var i = 0; i < c.length; ++i) + o[c.charAt(i)] *= f; + return o.normalize(); + }; + + o.toString = function () { + if (o.a >= 1.0) { + return "rgb("+[o.r, o.g, o.b].join(",")+")"; + } else { + return "rgba("+[o.r, o.g, o.b, o.a].join(",")+")"; + } + }; + + o.normalize = function () { + function clamp(min, value, max) { + return value < min ? min: (value > max ? max: value); + } + + o.r = clamp(0, parseInt(o.r), 255); + o.g = clamp(0, parseInt(o.g), 255); + o.b = clamp(0, parseInt(o.b), 255); + o.a = clamp(0, o.a, 1); + return o; + }; + + o.clone = function () { + return $.color.make(o.r, o.b, o.g, o.a); + }; + + return o.normalize(); + } + + // extract CSS color property from element, going up in the DOM + // if it's "transparent" + $.color.extract = function (elem, css) { + var c; + do { + c = elem.css(css).toLowerCase(); + // keep going until we find an element that has color, or + // we hit the body + if (c != '' && c != 'transparent') + break; + elem = elem.parent(); + } while (!$.nodeName(elem.get(0), "body")); + + // catch Safari's way of signalling transparent + if (c == "rgba(0, 0, 0, 0)") + c = "transparent"; + + return $.color.parse(c); + } + + // parse CSS color string (like "rgb(10, 32, 43)" or "#fff"), + // returns color object, if parsing failed, you get black (0, 0, + // 0) out + $.color.parse = function (str) { + var res, m = $.color.make; + + // Look for rgb(num,num,num) + if (res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)) + return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10)); + + // Look for rgba(num,num,num,num) + if (res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) + return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4])); + + // Look for rgb(num%,num%,num%) + if (res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)) + return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55); + + // Look for rgba(num%,num%,num%,num) + if (res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) + return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55, parseFloat(res[4])); + + // Look for #a0b1c2 + if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)) + return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16)); + + // Look for #fff + if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)) + return m(parseInt(res[1]+res[1], 16), parseInt(res[2]+res[2], 16), parseInt(res[3]+res[3], 16)); + + // Otherwise, we're most likely dealing with a named color + var name = $.trim(str).toLowerCase(); + if (name == "transparent") + return m(255, 255, 255, 0); + else { + // default to black + res = lookupColors[name] || [0, 0, 0]; + return m(res[0], res[1], res[2]); + } + } + + var lookupColors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0] + }; +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.colorhelpers.min.js @@ -1,1 +1,1 @@ - +(function(b){b.color={};b.color.make=function(f,e,c,d){var h={};h.r=f||0;h.g=e||0;h.b=c||0;h.a=d!=null?d:1;h.add=function(k,j){for(var g=0;g=1){return"rgb("+[h.r,h.g,h.b].join(",")+")"}else{return"rgba("+[h.r,h.g,h.b,h.a].join(",")+")"}};h.normalize=function(){function g(j,k,i){return ki?i:k)}h.r=g(0,parseInt(h.r),255);h.g=g(0,parseInt(h.g),255);h.b=g(0,parseInt(h.b),255);h.a=g(0,h.a,1);return h};h.clone=function(){return b.color.make(h.r,h.b,h.g,h.a)};return h.normalize()};b.color.extract=function(e,d){var f;do{f=e.css(d).toLowerCase();if(f!=""&&f!="transparent"){break}e=e.parent()}while(!b.nodeName(e.get(0),"body"));if(f=="rgba(0, 0, 0, 0)"){f="transparent"}return b.color.parse(f)};b.color.parse=function(f){var e,c=b.color.make;if(e=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10))}if(e=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10),parseFloat(e[4]))}if(e=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55)}if(e=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55,parseFloat(e[4]))}if(e=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)){return c(parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16))}if(e=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)){return c(parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16))}var d=b.trim(f).toLowerCase();if(d=="transparent"){return c(255,255,255,0)}else{e=a[d]||[0,0,0];return c(e[0],e[1],e[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); --- /dev/null +++ b/js/flot/jquery.flot.crosshair.js @@ -1,1 +1,168 @@ +/* +Flot plugin for showing crosshairs, thin lines, when the mouse hovers +over the plot. + crosshair: { + mode: null or "x" or "y" or "xy" + color: color + lineWidth: number + } + +Set the mode to one of "x", "y" or "xy". The "x" mode enables a +vertical crosshair that lets you trace the values on the x axis, "y" +enables a horizontal crosshair and "xy" enables them both. "color" is +the color of the crosshair (default is "rgba(170, 0, 0, 0.80)"), +"lineWidth" is the width of the drawn lines (default is 1). + +The plugin also adds four public methods: + + - setCrosshair(pos) + + Set the position of the crosshair. Note that this is cleared if + the user moves the mouse. "pos" is in coordinates of the plot and + should be on the form { x: xpos, y: ypos } (you can use x2/x3/... + if you're using multiple axes), which is coincidentally the same + format as what you get from a "plothover" event. If "pos" is null, + the crosshair is cleared. + + - clearCrosshair() + + Clear the crosshair. + + - lockCrosshair(pos) + + Cause the crosshair to lock to the current location, no longer + updating if the user moves the mouse. Optionally supply a position + (passed on to setCrosshair()) to move it to. + + Example usage: + var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } }; + $("#graph").bind("plothover", function (evt, position, item) { + if (item) { + // Lock the crosshair to the data point being hovered + myFlot.lockCrosshair({ x: item.datapoint[0], y: item.datapoint[1] }); + } + else { + // Return normal crosshair operation + myFlot.unlockCrosshair(); + } + }); + + - unlockCrosshair() + + Free the crosshair to move again after locking it. +*/ + +(function ($) { + var options = { + crosshair: { + mode: null, // one of null, "x", "y" or "xy", + color: "rgba(170, 0, 0, 0.80)", + lineWidth: 1 + } + }; + + function init(plot) { + // position of crosshair in pixels + var crosshair = { x: -1, y: -1, locked: false }; + + plot.setCrosshair = function setCrosshair(pos) { + if (!pos) + crosshair.x = -1; + else { + var o = plot.p2c(pos); + crosshair.x = Math.max(0, Math.min(o.left, plot.width())); + crosshair.y = Math.max(0, Math.min(o.top, plot.height())); + } + + plot.triggerRedrawOverlay(); + }; + + plot.clearCrosshair = plot.setCrosshair; // passes null for pos + + plot.lockCrosshair = function lockCrosshair(pos) { + if (pos) + plot.setCrosshair(pos); + crosshair.locked = true; + } + + plot.unlockCrosshair = function unlockCrosshair() { + crosshair.locked = false; + } + + function onMouseOut(e) { + if (crosshair.locked) + return; + + if (crosshair.x != -1) { + crosshair.x = -1; + plot.triggerRedrawOverlay(); + } + } + + function onMouseMove(e) { + if (crosshair.locked) + return; + + if (plot.getSelection && plot.getSelection()) { + crosshair.x = -1; // hide the crosshair while selecting + return; + } + + var offset = plot.offset(); + crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width())); + crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height())); + plot.triggerRedrawOverlay(); + } + + plot.hooks.bindEvents.push(function (plot, eventHolder) { + if (!plot.getOptions().crosshair.mode) + return; + + eventHolder.mouseout(onMouseOut); + eventHolder.mousemove(onMouseMove); + }); + + plot.hooks.drawOverlay.push(function (plot, ctx) { + var c = plot.getOptions().crosshair; + if (!c.mode) + return; + + var plotOffset = plot.getPlotOffset(); + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + if (crosshair.x != -1) { + ctx.strokeStyle = c.color; + ctx.lineWidth = c.lineWidth; + ctx.lineJoin = "round"; + + ctx.beginPath(); + if (c.mode.indexOf("x") != -1) { + ctx.moveTo(crosshair.x, 0); + ctx.lineTo(crosshair.x, plot.height()); + } + if (c.mode.indexOf("y") != -1) { + ctx.moveTo(0, crosshair.y); + ctx.lineTo(plot.width(), crosshair.y); + } + ctx.stroke(); + } + ctx.restore(); + }); + + plot.hooks.shutdown.push(function (plot, eventHolder) { + eventHolder.unbind("mouseout", onMouseOut); + eventHolder.unbind("mousemove", onMouseMove); + }); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'crosshair', + version: '1.0' + }); +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.crosshair.min.js @@ -1,1 +1,1 @@ - +(function(b){var a={crosshair:{mode:null,color:"rgba(170, 0, 0, 0.80)",lineWidth:1}};function c(h){var j={x:-1,y:-1,locked:false};h.setCrosshair=function e(l){if(!l){j.x=-1}else{var k=h.p2c(l);j.x=Math.max(0,Math.min(k.left,h.width()));j.y=Math.max(0,Math.min(k.top,h.height()))}h.triggerRedrawOverlay()};h.clearCrosshair=h.setCrosshair;h.lockCrosshair=function f(k){if(k){h.setCrosshair(k)}j.locked=true};h.unlockCrosshair=function g(){j.locked=false};function d(k){if(j.locked){return}if(j.x!=-1){j.x=-1;h.triggerRedrawOverlay()}}function i(k){if(j.locked){return}if(h.getSelection&&h.getSelection()){j.x=-1;return}var l=h.offset();j.x=Math.max(0,Math.min(k.pageX-l.left,h.width()));j.y=Math.max(0,Math.min(k.pageY-l.top,h.height()));h.triggerRedrawOverlay()}h.hooks.bindEvents.push(function(l,k){if(!l.getOptions().crosshair.mode){return}k.mouseout(d);k.mousemove(i)});h.hooks.drawOverlay.push(function(m,k){var n=m.getOptions().crosshair;if(!n.mode){return}var l=m.getPlotOffset();k.save();k.translate(l.left,l.top);if(j.x!=-1){k.strokeStyle=n.color;k.lineWidth=n.lineWidth;k.lineJoin="round";k.beginPath();if(n.mode.indexOf("x")!=-1){k.moveTo(j.x,0);k.lineTo(j.x,m.height())}if(n.mode.indexOf("y")!=-1){k.moveTo(0,j.y);k.lineTo(m.width(),j.y)}k.stroke()}k.restore()});h.hooks.shutdown.push(function(l,k){k.unbind("mouseout",d);k.unbind("mousemove",i)})}b.plot.plugins.push({init:c,options:a,name:"crosshair",version:"1.0"})})(jQuery); --- /dev/null +++ b/js/flot/jquery.flot.fillbetween.js @@ -1,1 +1,184 @@ +/* +Flot plugin for computing bottoms for filled line and bar charts. +The case: you've got two series that you want to fill the area +between. In Flot terms, you need to use one as the fill bottom of the +other. You can specify the bottom of each data point as the third +coordinate manually, or you can use this plugin to compute it for you. + +In order to name the other series, you need to give it an id, like this + + var dataset = [ + { data: [ ... ], id: "foo" } , // use default bottom + { data: [ ... ], fillBetween: "foo" }, // use first dataset as bottom + ]; + + $.plot($("#placeholder"), dataset, { line: { show: true, fill: true }}); + +As a convenience, if the id given is a number that doesn't appear as +an id in the series, it is interpreted as the index in the array +instead (so fillBetween: 0 can also mean the first series). + +Internally, the plugin modifies the datapoints in each series. For +line series, extra data points might be inserted through +interpolation. Note that at points where the bottom line is not +defined (due to a null point or start/end of line), the current line +will show a gap too. The algorithm comes from the jquery.flot.stack.js +plugin, possibly some code could be shared. +*/ + +(function ($) { + var options = { + series: { fillBetween: null } // or number + }; + + function init(plot) { + function findBottomSeries(s, allseries) { + var i; + for (i = 0; i < allseries.length; ++i) { + if (allseries[i].id == s.fillBetween) + return allseries[i]; + } + + if (typeof s.fillBetween == "number") { + i = s.fillBetween; + + if (i < 0 || i >= allseries.length) + return null; + + return allseries[i]; + } + + return null; + } + + function computeFillBottoms(plot, s, datapoints) { + if (s.fillBetween == null) + return; + + var other = findBottomSeries(s, plot.getData()); + if (!other) + return; + + var ps = datapoints.pointsize, + points = datapoints.points, + otherps = other.datapoints.pointsize, + otherpoints = other.datapoints.points, + newpoints = [], + px, py, intery, qx, qy, bottom, + withlines = s.lines.show, + withbottom = ps > 2 && datapoints.format[2].y, + withsteps = withlines && s.lines.steps, + fromgap = true, + i = 0, j = 0, l; + + while (true) { + if (i >= points.length) + break; + + l = newpoints.length; + + if (points[i] == null) { + // copy gaps + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + i += ps; + } + else if (j >= otherpoints.length) { + // for lines, we can't use the rest of the points + if (!withlines) { + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + } + i += ps; + } + else if (otherpoints[j] == null) { + // oops, got a gap + for (m = 0; m < ps; ++m) + newpoints.push(null); + fromgap = true; + j += otherps; + } + else { + // cases where we actually got two points + px = points[i]; + py = points[i + 1]; + qx = otherpoints[j]; + qy = otherpoints[j + 1]; + bottom = 0; + + if (px == qx) { + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + + //newpoints[l + 1] += qy; + bottom = qy; + + i += ps; + j += otherps; + } + else if (px > qx) { + // we got past point below, might need to + // insert interpolated extra point + if (withlines && i > 0 && points[i - ps] != null) { + intery = py + (points[i - ps + 1] - py) * (qx - px) / (points[i - ps] - px); + newpoints.push(qx); + newpoints.push(intery) + for (m = 2; m < ps; ++m) + newpoints.push(points[i + m]); + bottom = qy; + } + + j += otherps; + } + else { // px < qx + if (fromgap && withlines) { + // if we come from a gap, we just skip this point + i += ps; + continue; + } + + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + + // we might be able to interpolate a point below, + // this can give us a better y + if (withlines && j > 0 && otherpoints[j - otherps] != null) + bottom = qy + (otherpoints[j - otherps + 1] - qy) * (px - qx) / (otherpoints[j - otherps] - qx); + + //newpoints[l + 1] += bottom; + + i += ps; + } + + fromgap = false; + + if (l != newpoints.length && withbottom) + newpoints[l + 2] = bottom; + } + + // maintain the line steps invariant + if (withsteps && l != newpoints.length && l > 0 + && newpoints[l] != null + && newpoints[l] != newpoints[l - ps] + && newpoints[l + 1] != newpoints[l - ps + 1]) { + for (m = 0; m < ps; ++m) + newpoints[l + ps + m] = newpoints[l + m]; + newpoints[l + 1] = newpoints[l - ps + 1]; + } + } + + datapoints.points = newpoints; + } + + plot.hooks.processDatapoints.push(computeFillBottoms); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'fillbetween', + version: '1.0' + }); +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.fillbetween.min.js @@ -1,1 +1,1 @@ - +(function(b){var a={series:{fillBetween:null}};function c(f){function d(j,h){var g;for(g=0;g=h.length){return null}return h[g]}return null}function e(B,u,g){if(u.fillBetween==null){return}var p=d(u,B.getData());if(!p){return}var y=g.pointsize,E=g.points,h=p.datapoints.pointsize,x=p.datapoints.points,r=[],w,v,k,G,F,q,t=u.lines.show,o=y>2&&g.format[2].y,n=t&&u.lines.steps,D=true,C=0,A=0,z;while(true){if(C>=E.length){break}z=r.length;if(E[C]==null){for(m=0;m=x.length){if(!t){for(m=0;mG){if(t&&C>0&&E[C-y]!=null){k=v+(E[C-y+1]-v)*(G-w)/(E[C-y]-w);r.push(G);r.push(k);for(m=2;m0&&x[A-h]!=null){q=F+(x[A-h+1]-F)*(w-G)/(x[A-h]-G)}C+=y}}D=false;if(z!=r.length&&o){r[z+2]=q}}}}if(n&&z!=r.length&&z>0&&r[z]!=null&&r[z]!=r[z-y]&&r[z+1]!=r[z-y+1]){for(m=0;m').load(handler).error(handler).attr('src', url); + }); + } + + function drawSeries(plot, ctx, series) { + var plotOffset = plot.getPlotOffset(); + + if (!series.images || !series.images.show) + return; + + var points = series.datapoints.points, + ps = series.datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var img = points[i], + x1 = points[i + 1], y1 = points[i + 2], + x2 = points[i + 3], y2 = points[i + 4], + xaxis = series.xaxis, yaxis = series.yaxis, + tmp; + + // actually we should check img.complete, but it + // appears to be a somewhat unreliable indicator in + // IE6 (false even after load event) + if (!img || img.width <= 0 || img.height <= 0) + continue; + + if (x1 > x2) { + tmp = x2; + x2 = x1; + x1 = tmp; + } + if (y1 > y2) { + tmp = y2; + y2 = y1; + y1 = tmp; + } + + // if the anchor is at the center of the pixel, expand the + // image by 1/2 pixel in each direction + if (series.images.anchor == "center") { + tmp = 0.5 * (x2-x1) / (img.width - 1); + x1 -= tmp; + x2 += tmp; + tmp = 0.5 * (y2-y1) / (img.height - 1); + y1 -= tmp; + y2 += tmp; + } + + // clip + if (x1 == x2 || y1 == y2 || + x1 >= xaxis.max || x2 <= xaxis.min || + y1 >= yaxis.max || y2 <= yaxis.min) + continue; + + var sx1 = 0, sy1 = 0, sx2 = img.width, sy2 = img.height; + if (x1 < xaxis.min) { + sx1 += (sx2 - sx1) * (xaxis.min - x1) / (x2 - x1); + x1 = xaxis.min; + } + + if (x2 > xaxis.max) { + sx2 += (sx2 - sx1) * (xaxis.max - x2) / (x2 - x1); + x2 = xaxis.max; + } + + if (y1 < yaxis.min) { + sy2 += (sy1 - sy2) * (yaxis.min - y1) / (y2 - y1); + y1 = yaxis.min; + } + + if (y2 > yaxis.max) { + sy1 += (sy1 - sy2) * (yaxis.max - y2) / (y2 - y1); + y2 = yaxis.max; + } + + x1 = xaxis.p2c(x1); + x2 = xaxis.p2c(x2); + y1 = yaxis.p2c(y1); + y2 = yaxis.p2c(y2); + + // the transformation may have swapped us + if (x1 > x2) { + tmp = x2; + x2 = x1; + x1 = tmp; + } + if (y1 > y2) { + tmp = y2; + y2 = y1; + y1 = tmp; + } + + tmp = ctx.globalAlpha; + ctx.globalAlpha *= series.images.alpha; + ctx.drawImage(img, + sx1, sy1, sx2 - sx1, sy2 - sy1, + x1 + plotOffset.left, y1 + plotOffset.top, + x2 - x1, y2 - y1); + ctx.globalAlpha = tmp; + } + } + + function processRawData(plot, series, data, datapoints) { + if (!series.images.show) + return; + + // format is Image, x1, y1, x2, y2 (opposite corners) + datapoints.format = [ + { required: true }, + { x: true, number: true, required: true }, + { y: true, number: true, required: true }, + { x: true, number: true, required: true }, + { y: true, number: true, required: true } + ]; + } + + function init(plot) { + plot.hooks.processRawData.push(processRawData); + plot.hooks.drawSeries.push(drawSeries); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'image', + version: '1.1' + }); +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.image.min.js @@ -1,1 +1,1 @@ - +(function(c){var a={series:{images:{show:false,alpha:1,anchor:"corner"}}};c.plot.image={};c.plot.image.loadDataImages=function(g,f,k){var j=[],h=[];var i=f.series.images.show;c.each(g,function(l,m){if(!(i||m.images.show)){return}if(m.data){m=m.data}c.each(m,function(n,o){if(typeof o[0]=="string"){j.push(o[0]);h.push(o)}})});c.plot.image.load(j,function(l){c.each(h,function(n,o){var m=o[0];if(l[m]){o[0]=l[m]}});k()})};c.plot.image.load=function(h,i){var g=h.length,f={};if(g==0){i({})}c.each(h,function(k,j){var l=function(){--g;f[j]=this;if(g==0){i(f)}};c("").load(l).error(l).attr("src",j)})};function d(q,o,l){var m=q.getPlotOffset();if(!l.images||!l.images.show){return}var r=l.datapoints.points,n=l.datapoints.pointsize;for(var t=0;tv){x=v;v=w;w=x}if(g>f){x=f;f=g;g=x}if(l.images.anchor=="center"){x=0.5*(v-w)/(y.width-1);w-=x;v+=x;x=0.5*(f-g)/(y.height-1);g-=x;f+=x}if(w==v||g==f||w>=h.max||v<=h.min||g>=u.max||f<=u.min){continue}var k=0,s=0,j=y.width,p=y.height;if(wh.max){j+=(j-k)*(h.max-v)/(v-w);v=h.max}if(gu.max){s+=(s-p)*(u.max-f)/(f-g);f=u.max}w=h.p2c(w);v=h.p2c(v);g=u.p2c(g);f=u.p2c(f);if(w>v){x=v;v=w;w=x}if(g>f){x=f;f=g;g=x}x=o.globalAlpha;o.globalAlpha*=l.images.alpha;o.drawImage(y,k,s,j-k,p-s,w+m.left,g+m.top,v-w,f-g);o.globalAlpha=x}}function b(i,f,g,h){if(!f.images.show){return}h.format=[{required:true},{x:true,number:true,required:true},{y:true,number:true,required:true},{x:true,number:true,required:true},{y:true,number:true,required:true}]}function e(f){f.hooks.processRawData.push(b);f.hooks.drawSeries.push(d)}c.plot.plugins.push({init:e,options:a,name:"image",version:"1.1"})})(jQuery); --- /dev/null +++ b/js/flot/jquery.flot.js @@ -1,1 +1,2600 @@ - +/*! Javascript plotting library for jQuery, v. 0.7. + * + * Released under the MIT license by IOLA, December 2007. + * + */ + +// first an inline dependency, jquery.colorhelpers.js, we inline it here +// for convenience + +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */ +(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return KI?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); + +// the actual Flot code +(function($) { + function Plot(placeholder, data_, options_, plugins) { + // data is on the form: + // [ series1, series2 ... ] + // where series is either just the data as [ [x1, y1], [x2, y2], ... ] + // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } + + var series = [], + options = { + // the color theme used for graphs + colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], + legend: { + show: true, + noColumns: 1, // number of colums in legend table + labelFormatter: null, // fn: string -> string + labelBoxBorderColor: "#ccc", // border color for the little label boxes + container: null, // container (as jQuery object) to put legend in, null means default on top of graph + position: "ne", // position of default legend container within plot + margin: 5, // distance from grid edge to default legend container within plot + backgroundColor: null, // null means auto-detect + backgroundOpacity: 0.85 // set to 0 to avoid background + }, + xaxis: { + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + color: null, // base color, labels, ticks + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + transform: null, // null or f: number -> number to transform axis + inverseTransform: null, // if transform is set, this should be the inverse function + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + reserveSpace: null, // whether to reserve space even if axis isn't shown + tickLength: null, // size in pixels of ticks, or "full" for whole line + alignTicksWithAxis: null, // axis number or null for no sync + + // mode specific options + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null, // number or [number, "unit"] + monthNames: null, // list of names of months + timeformat: null, // format string to use + twelveHourClock: false // 12 or 24 time in time mode + }, + yaxis: { + autoscaleMargin: 0.02, + position: "left" // or "right" + }, + xaxes: [], + yaxes: [], + series: { + points: { + show: false, + radius: 3, + lineWidth: 2, // in pixels + fill: true, + fillColor: "#ffffff", + symbol: "circle" // or callback + }, + lines: { + // we don't put in show: false so we can see + // whether lines were actively disabled + lineWidth: 2, // in pixels + fill: false, + fillColor: null, + steps: false + }, + bars: { + show: false, + lineWidth: 2, // in pixels + barWidth: 1, // in units of the x axis + fill: true, + fillColor: null, + align: "left", // or "center" + horizontal: false + }, + shadowSize: 3 + }, + grid: { + show: true, + aboveData: false, + color: "#545454", // primary color used for outline and labels + backgroundColor: null, // null for transparent, else color + borderColor: null, // set if different from the grid color + tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" + labelMargin: 5, // in pixels + axisMargin: 8, // in pixels + borderWidth: 2, // in pixels + minBorderMargin: null, // in pixels, null means taken from points radius + markings: null, // array of ranges or fn: axes -> array of ranges + markingsColor: "#f4f4f4", + markingsLineWidth: 2, + // interactive stuff + clickable: false, + hoverable: false, + autoHighlight: true, // highlight in case mouse is near + mouseActiveRadius: 10 // how far the mouse can be away to activate an item + }, + hooks: {} + }, + canvas = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + canvasWidth = 0, canvasHeight = 0, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; + + // public functions + plot.setData = setData; + plot.setupGrid = setupGrid; + plot.draw = draw; + plot.getPlaceholder = function() { return placeholder; }; + plot.getCanvas = function() { return canvas; }; + plot.getPlotOffset = function() { return plotOffset; }; + plot.width = function () { return plotWidth; }; + plot.height = function () { return plotHeight; }; + plot.offset = function () { + var o = eventHolder.offset(); + o.left += plotOffset.left; + o.top += plotOffset.top; + return o; + }; + plot.getData = function () { return series; }; + plot.getAxes = function () { + var res = {}, i; + $.each(xaxes.concat(yaxes), function (_, axis) { + if (axis) + res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; + }); + return res; + }; + plot.getXAxes = function () { return xaxes; }; + plot.getYAxes = function () { return yaxes; }; + plot.c2p = canvasToAxisCoords; + plot.p2c = axisToCanvasCoords; + plot.getOptions = function () { return options; }; + plot.highlight = highlight; + plot.unhighlight = unhighlight; + plot.triggerRedrawOverlay = triggerRedrawOverlay; + plot.pointOffset = function(point) { + return { + left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left), + top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top) + }; + }; + plot.shutdown = shutdown; + plot.resize = function () { + getCanvasDimensions(); + resizeCanvas(canvas); + resizeCanvas(overlay); + }; + + // public attributes + plot.hooks = hooks; + + // initialize + initPlugins(plot); + parseOptions(options_); + setupCanvases(); + setData(data_); + setupGrid(); + draw(); + bindEvents(); + + + function executeHooks(hook, args) { + args = [plot].concat(args); + for (var i = 0; i < hook.length; ++i) + hook[i].apply(this, args); + } + + function initPlugins() { + for (var i = 0; i < plugins.length; ++i) { + var p = plugins[i]; + p.init(plot); + if (p.options) + $.extend(true, options, p.options); + } + } + + function parseOptions(opts) { + var i; + + $.extend(true, options, opts); + + if (options.xaxis.color == null) + options.xaxis.color = options.grid.color; + if (options.yaxis.color == null) + options.yaxis.color = options.grid.color; + + if (options.xaxis.tickColor == null) // backwards-compatibility + options.xaxis.tickColor = options.grid.tickColor; + if (options.yaxis.tickColor == null) // backwards-compatibility + options.yaxis.tickColor = options.grid.tickColor; + + if (options.grid.borderColor == null) + options.grid.borderColor = options.grid.color; + if (options.grid.tickColor == null) + options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + // fill in defaults in axes, copy at least always the + // first as the rest of the code assumes it'll be there + for (i = 0; i < Math.max(1, options.xaxes.length); ++i) + options.xaxes[i] = $.extend(true, {}, options.xaxis, options.xaxes[i]); + for (i = 0; i < Math.max(1, options.yaxes.length); ++i) + options.yaxes[i] = $.extend(true, {}, options.yaxis, options.yaxes[i]); + + // backwards compatibility, to be removed in future + if (options.xaxis.noTicks && options.xaxis.ticks == null) + options.xaxis.ticks = options.xaxis.noTicks; + if (options.yaxis.noTicks && options.yaxis.ticks == null) + options.yaxis.ticks = options.yaxis.noTicks; + if (options.x2axis) { + options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); + options.xaxes[1].position = "top"; + } + if (options.y2axis) { + options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); + options.yaxes[1].position = "right"; + } + if (options.grid.coloredAreas) + options.grid.markings = options.grid.coloredAreas; + if (options.grid.coloredAreasColor) + options.grid.markingsColor = options.grid.coloredAreasColor; + if (options.lines) + $.extend(true, options.series.lines, options.lines); + if (options.points) + $.extend(true, options.series.points, options.points); + if (options.bars) + $.extend(true, options.series.bars, options.bars); + if (options.shadowSize != null) + options.series.shadowSize = options.shadowSize; + + // save options on axes for future reference + for (i = 0; i < options.xaxes.length; ++i) + getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; + for (i = 0; i < options.yaxes.length; ++i) + getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; + + // add hooks from options + for (var n in hooks) + if (options.hooks[n] && options.hooks[n].length) + hooks[n] = hooks[n].concat(options.hooks[n]); + + executeHooks(hooks.processOptions, [options]); + } + + function setData(d) { + series = parseData(d); + fillInSeriesOptions(); + processData(); + } + + function parseData(d) { + var res = []; + for (var i = 0; i < d.length; ++i) { + var s = $.extend(true, {}, options.series); + + if (d[i].data != null) { + s.data = d[i].data; // move the data instead of deep-copy + delete d[i].data; + + $.extend(true, s, d[i]); + + d[i].data = s.data; + } + else + s.data = d[i]; + res.push(s); + } + + return res; + } + + function axisNumber(obj, coord) { + var a = obj[coord + "axis"]; + if (typeof a == "object") // if we got a real axis, extract number + a = a.n; + if (typeof a != "number") + a = 1; // default to first axis + return a; + } + + function allAxes() { + // return flat array without annoying null entries + return $.grep(xaxes.concat(yaxes), function (a) { return a; }); + } + + function canvasToAxisCoords(pos) { + // return an object with x/y corresponding to all used axes + var res = {}, i, axis; + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) + res["x" + axis.n] = axis.c2p(pos.left); + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) + res["y" + axis.n] = axis.c2p(pos.top); + } + + if (res.x1 !== undefined) + res.x = res.x1; + if (res.y1 !== undefined) + res.y = res.y1; + + return res; + } + + function axisToCanvasCoords(pos) { + // get canvas coords from the first pair of x/y found in pos + var res = {}, i, axis, key; + + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) { + key = "x" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "x"; + + if (pos[key] != null) { + res.left = axis.p2c(pos[key]); + break; + } + } + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) { + key = "y" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "y"; + + if (pos[key] != null) { + res.top = axis.p2c(pos[key]); + break; + } + } + } + + return res; + } + + function getOrCreateAxis(axes, number) { + if (!axes[number - 1]) + axes[number - 1] = { + n: number, // save the number for future reference + direction: axes == xaxes ? "x" : "y", + options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) + }; + + return axes[number - 1]; + } + + function fillInSeriesOptions() { + var i; + + // collect what we already got of colors + var neededColors = series.length, + usedColors = [], + assignedColors = []; + for (i = 0; i < series.length; ++i) { + var sc = series[i].color; + if (sc != null) { + --neededColors; + if (typeof sc == "number") + assignedColors.push(sc); + else + usedColors.push($.color.parse(series[i].color)); + } + } + + // we might need to generate more colors if higher indices + // are assigned + for (i = 0; i < assignedColors.length; ++i) { + neededColors = Math.max(neededColors, assignedColors[i] + 1); + } + + // produce colors as needed + var colors = [], variation = 0; + i = 0; + while (colors.length < neededColors) { + var c; + if (options.colors.length == i) // check degenerate case + c = $.color.make(100, 100, 100); + else + c = $.color.parse(options.colors[i]); + + // vary color if needed + var sign = variation % 2 == 1 ? -1 : 1; + c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2) + + // FIXME: if we're getting to close to something else, + // we should probably skip this one + colors.push(c); + + ++i; + if (i >= options.colors.length) { + i = 0; + ++variation; + } + } + + // fill in the options + var colori = 0, s; + for (i = 0; i < series.length; ++i) { + s = series[i]; + + // assign colors + if (s.color == null) { + s.color = colors[colori].toString(); + ++colori; + } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); + + // turn on lines automatically in case nothing is set + if (s.lines.show == null) { + var v, show = true; + for (v in s) + if (s[v] && s[v].show) { + show = false; + break; + } + if (show) + s.lines.show = true; + } + + // setup axes + s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); + s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); + } + } + + function processData() { + var topSentry = Number.POSITIVE_INFINITY, + bottomSentry = Number.NEGATIVE_INFINITY, + fakeInfinity = Number.MAX_VALUE, + i, j, k, m, length, + s, points, ps, x, y, axis, val, f, p; + + function updateAxis(axis, min, max) { + if (min < axis.datamin && min != -fakeInfinity) + axis.datamin = min; + if (max > axis.datamax && max != fakeInfinity) + axis.datamax = max; + } + + $.each(allAxes(), function (_, axis) { + // init axis + axis.datamin = topSentry; + axis.datamax = bottomSentry; + axis.used = false; + }); + + for (i = 0; i < series.length; ++i) { + s = series[i]; + s.datapoints = { points: [] }; + + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); + } + + // first pass: clean and copy data + for (i = 0; i < series.length; ++i) { + s = series[i]; + + var data = s.data, format = s.datapoints.format; + + if (!format) { + format = []; + // find out how to copy + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + format.push({ y: true, number: true, required: false, defaultValue: 0 }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + s.datapoints.format = format; + } + + if (s.datapoints.pointsize != null) + continue; // already filled in + + s.datapoints.pointsize = format.length; + + ps = s.datapoints.pointsize; + points = s.datapoints.points; + + insertSteps = s.lines.show && s.lines.steps; + s.xaxis.used = s.yaxis.used = true; + + for (j = k = 0; j < data.length; ++j, k += ps) { + p = data[j]; + + var nullify = p == null; + if (!nullify) { + for (m = 0; m < ps; ++m) { + val = p[m]; + f = format[m]; + + if (f) { + if (f.number && val != null) { + val = +val; // convert to number + if (isNaN(val)) + val = null; + else if (val == Infinity) + val = fakeInfinity; + else if (val == -Infinity) + val = -fakeInfinity; + } + + if (val == null) { + if (f.required) + nullify = true; + + if (f.defaultValue != null) + val = f.defaultValue; + } + } + + points[k + m] = val; + } + } + + if (nullify) { + for (m = 0; m < ps; ++m) { + val = points[k + m]; + if (val != null) { + f = format[m]; + // extract min/max info + if (f.x) + updateAxis(s.xaxis, val, val); + if (f.y) + updateAxis(s.yaxis, val, val); + } + points[k + m] = null; + } + } + else { + // a little bit of line specific stuff that + // perhaps shouldn't be here, but lacking + // better means... + if (insertSteps && k > 0 + && points[k - ps] != null + && points[k - ps] != points[k] + && points[k - ps + 1] != points[k + 1]) { + // copy the point to make room for a middle point + for (m = 0; m < ps; ++m) + points[k + ps + m] = points[k + m]; + + // middle point has same y + points[k + 1] = points[k - ps + 1]; + + // we've added a point, better reflect that + k += ps; + } + } + } + } + + // give the hooks a chance to run + for (i = 0; i < series.length; ++i) { + s = series[i]; + + executeHooks(hooks.processDatapoints, [ s, s.datapoints]); + } + + // second pass: find datamax/datamin for auto-scaling + for (i = 0; i < series.length; ++i) { + s = series[i]; + points = s.datapoints.points, + ps = s.datapoints.pointsize; + + var xmin = topSentry, ymin = topSentry, + xmax = bottomSentry, ymax = bottomSentry; + + for (j = 0; j < points.length; j += ps) { + if (points[j] == null) + continue; + + for (m = 0; m < ps; ++m) { + val = points[j + m]; + f = format[m]; + if (!f || val == fakeInfinity || val == -fakeInfinity) + continue; + + if (f.x) { + if (val < xmin) + xmin = val; + if (val > xmax) + xmax = val; + } + if (f.y) { + if (val < ymin) + ymin = val; + if (val > ymax) + ymax = val; + } + } + } + + if (s.bars.show) { + // make sure we got room for the bar on the dancing floor + var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; + if (s.bars.horizontal) { + ymin += delta; + ymax += delta + s.bars.barWidth; + } + else { + xmin += delta; + xmax += delta + s.bars.barWidth; + } + } + + updateAxis(s.xaxis, xmin, xmax); + updateAxis(s.yaxis, ymin, ymax); + } + + $.each(allAxes(), function (_, axis) { + if (axis.datamin == topSentry) + axis.datamin = null; + if (axis.datamax == bottomSentry) + axis.datamax = null; + }); + } + + function makeCanvas(skipPositioning, cls) { + var c = document.createElement('canvas'); + c.className = cls; + c.width = canvasWidth; + c.height = canvasHeight; + + if (!skipPositioning) + $(c).css({ position: 'absolute', left: 0, top: 0 }); + + $(c).appendTo(placeholder); + + if (!c.getContext) // excanvas hack + c = window.G_vmlCanvasManager.initElement(c); + + // used for resetting in case we get replotted + c.getContext("2d").save(); + + return c; + } + + function getCanvasDimensions() { + canvasWidth = placeholder.width(); + canvasHeight = placeholder.height(); + + if (canvasWidth <= 0 || canvasHeight <= 0) + throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; + } + + function resizeCanvas(c) { + // resizing should reset the state (excanvas seems to be + // buggy though) + if (c.width != canvasWidth) + c.width = canvasWidth; + + if (c.height != canvasHeight) + c.height = canvasHeight; + + // so try to get back to the initial state (even if it's + // gone now, this should be safe according to the spec) + var cctx = c.getContext("2d"); + cctx.restore(); + + // and save again + cctx.save(); + } + + function setupCanvases() { + var reused, + existingCanvas = placeholder.children("canvas.base"), + existingOverlay = placeholder.children("canvas.overlay"); + + if (existingCanvas.length == 0 || existingOverlay == 0) { + // init everything + + placeholder.html(""); // make sure placeholder is clear + + placeholder.css({ padding: 0 }); // padding messes up the positioning + + if (placeholder.css("position") == 'static') + placeholder.css("position", "relative"); // for positioning labels and overlay + + getCanvasDimensions(); + + canvas = makeCanvas(true, "base"); + overlay = makeCanvas(false, "overlay"); // overlay canvas for interactive features + + reused = false; + } + else { + // reuse existing elements + + canvas = existingCanvas.get(0); + overlay = existingOverlay.get(0); + + reused = true; + } + + ctx = canvas.getContext("2d"); + octx = overlay.getContext("2d"); + + // we include the canvas in the event holder too, because IE 7 + // sometimes has trouble with the stacking order + eventHolder = $([overlay, canvas]); + + if (reused) { + // run shutdown in the old plot object + placeholder.data("plot").shutdown(); + + // reset reused canvases + plot.resize(); + + // make sure overlay pixels are cleared (canvas is cleared when we redraw) + octx.clearRect(0, 0, canvasWidth, canvasHeight); + + // then whack any remaining obvious garbage left + eventHolder.unbind(); + placeholder.children().not([canvas, overlay]).remove(); + } + + // save in case we get replotted + placeholder.data("plot", plot); + } + + function bindEvents() { + // bind events + if (options.grid.hoverable) { + eventHolder.mousemove(onMouseMove); + eventHolder.mouseleave(onMouseLeave); + } + + if (options.grid.clickable) + eventHolder.click(onClick); + + executeHooks(hooks.bindEvents, [eventHolder]); + } + + function shutdown() { + if (redrawTimeout) + clearTimeout(redrawTimeout); + + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mouseleave", onMouseLeave); + eventHolder.unbind("click", onClick); + + executeHooks(hooks.shutdown, [eventHolder]); + } + + function setTransformationHelpers(axis) { + // set helper functions on the axis, assumes plot area + // has been computed already + + function identity(x) { return x; } + + var s, m, t = axis.options.transform || identity, + it = axis.options.inverseTransform; + + // precompute how much the axis is scaling a point + // in canvas space + if (axis.direction == "x") { + s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); + m = Math.min(t(axis.max), t(axis.min)); + } + else { + s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); + s = -s; + m = Math.max(t(axis.max), t(axis.min)); + } + + // data point to canvas coordinate + if (t == identity) // slight optimization + axis.p2c = function (p) { return (p - m) * s; }; + else + axis.p2c = function (p) { return (t(p) - m) * s; }; + // canvas coordinate to data point + if (!it) + axis.c2p = function (c) { return m + c / s; }; + else + axis.c2p = function (c) { return it(m + c / s); }; + } + + function measureTickLabels(axis) { + var opts = axis.options, i, ticks = axis.ticks || [], labels = [], + l, w = opts.labelWidth, h = opts.labelHeight, dummyDiv; + + function makeDummyDiv(labels, width) { + return $('
' + + '
' + + labels.join("") + '
') + .appendTo(placeholder); + } + + if (axis.direction == "x") { + // to avoid measuring the widths of the labels (it's slow), we + // construct fixed-size boxes and put the labels inside + // them, we don't need the exact figures and the + // fixed-size box content is easy to center + if (w == null) + w = Math.floor(canvasWidth / (ticks.length > 0 ? ticks.length : 1)); + + // measure x label heights + if (h == null) { + labels = []; + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('
' + l + '
'); + } + + if (labels.length > 0) { + // stick them all in the same div and measure + // collective height + labels.push('
'); + dummyDiv = makeDummyDiv(labels, "width:10000px;"); + h = dummyDiv.height(); + dummyDiv.remove(); + } + } + } + else if (w == null || h == null) { + // calculate y label dimensions + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('
' + l + '
'); + } + + if (labels.length > 0) { + dummyDiv = makeDummyDiv(labels, ""); + if (w == null) + w = dummyDiv.children().width(); + if (h == null) + h = dummyDiv.find("div.tickLabel").height(); + dummyDiv.remove(); + } + } + + if (w == null) + w = 0; + if (h == null) + h = 0; + + axis.labelWidth = w; + axis.labelHeight = h; + } + + function allocateAxisBoxFirstPhase(axis) { + // find the bounding box of the axis by looking at label + // widths/heights and ticks, make room by diminishing the + // plotOffset + + var lw = axis.labelWidth, + lh = axis.labelHeight, + pos = axis.options.position, + tickLength = axis.options.tickLength, + axismargin = options.grid.axisMargin, + padding = options.grid.labelMargin, + all = axis.direction == "x" ? xaxes : yaxes, + index; + + // determine axis margin + var samePosition = $.grep(all, function (a) { + return a && a.options.position == pos && a.reserveSpace; + }); + if ($.inArray(axis, samePosition) == samePosition.length - 1) + axismargin = 0; // outermost + + // determine tick length - if we're innermost, we can use "full" + if (tickLength == null) + tickLength = "full"; + + var sameDirection = $.grep(all, function (a) { + return a && a.reserveSpace; + }); + + var innermost = $.inArray(axis, sameDirection) == 0; + if (!innermost && tickLength == "full") + tickLength = 5; + + if (!isNaN(+tickLength)) + padding += +tickLength; + + // compute box + if (axis.direction == "x") { + lh += padding; + + if (pos == "bottom") { + plotOffset.bottom += lh + axismargin; + axis.box = { top: canvasHeight - plotOffset.bottom, height: lh }; + } + else { + axis.box = { top: plotOffset.top + axismargin, height: lh }; + plotOffset.top += lh + axismargin; + } + } + else { + lw += padding; + + if (pos == "left") { + axis.box = { left: plotOffset.left + axismargin, width: lw }; + plotOffset.left += lw + axismargin; + } + else { + plotOffset.right += lw + axismargin; + axis.box = { left: canvasWidth - plotOffset.right, width: lw }; + } + } + + // save for future reference + axis.position = pos; + axis.tickLength = tickLength; + axis.box.padding = padding; + axis.innermost = innermost; + } + + function allocateAxisBoxSecondPhase(axis) { + // set remaining bounding box coordinates + if (axis.direction == "x") { + axis.box.left = plotOffset.left; + axis.box.width = plotWidth; + } + else { + axis.box.top = plotOffset.top; + axis.box.height = plotHeight; + } + } + + function setupGrid() { + var i, axes = allAxes(); + + // first calculate the plot and axis box dimensions + + $.each(axes, function (_, axis) { + axis.show = axis.options.show; + if (axis.show == null) + axis.show = axis.used; // by default an axis is visible if it's got data + + axis.reserveSpace = axis.show || axis.options.reserveSpace; + + setRange(axis); + }); + + allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); + + plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0; + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + // make the ticks + setupTickGeneration(axis); + setTicks(axis); + snapRangeToTicks(axis, axis.ticks); + + // find labelWidth/Height for axis + measureTickLabels(axis); + }); + + // with all dimensions in house, we can compute the + // axis boxes, start from the outside (reverse order) + for (i = allocatedAxes.length - 1; i >= 0; --i) + allocateAxisBoxFirstPhase(allocatedAxes[i]); + + // make sure we've got enough space for things that + // might stick out + var minMargin = options.grid.minBorderMargin; + if (minMargin == null) { + minMargin = 0; + for (i = 0; i < series.length; ++i) + minMargin = Math.max(minMargin, series[i].points.radius + series[i].points.lineWidth/2); + } + + for (var a in plotOffset) { + plotOffset[a] += options.grid.borderWidth; + plotOffset[a] = Math.max(minMargin, plotOffset[a]); + } + } + + plotWidth = canvasWidth - plotOffset.left - plotOffset.right; + plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; + + // now we got the proper plotWidth/Height, we can compute the scaling + $.each(axes, function (_, axis) { + setTransformationHelpers(axis); + }); + + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + allocateAxisBoxSecondPhase(axis); + }); + + insertAxisLabels(); + } + + insertLegend(); + } + + function setRange(axis) { + var opts = axis.options, + min = +(opts.min != null ? opts.min : axis.datamin), + max = +(opts.max != null ? opts.max : axis.datamax), + delta = max - min; + + if (delta == 0.0) { + // degenerate case + var widen = max == 0 ? 1 : 0.01; + + if (opts.min == null) + min -= widen; + // always widen max if we couldn't widen min to ensure we + // don't fall into min == max which doesn't work + if (opts.max == null || opts.min != null) + max += widen; + } + else { + // consider autoscaling + var margin = opts.autoscaleMargin; + if (margin != null) { + if (opts.min == null) { + min -= delta * margin; + // make sure we don't go below zero if all values + // are positive + if (min < 0 && axis.datamin != null && axis.datamin >= 0) + min = 0; + } + if (opts.max == null) { + max += delta * margin; + if (max > 0 && axis.datamax != null && axis.datamax <= 0) + max = 0; + } + } + } + axis.min = min; + axis.max = max; + } + + function setupTickGeneration(axis) { + var opts = axis.options; + + // estimate number of ticks + var noTicks; + if (typeof opts.ticks == "number" && opts.ticks > 0) + noTicks = opts.ticks; + else + // heuristic based on the model a*sqrt(x) fitted to + // some data points that seemed reasonable + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? canvasWidth : canvasHeight); + + var delta = (axis.max - axis.min) / noTicks, + size, generator, unit, formatter, i, magn, norm; + + if (opts.mode == "time") { + // pretty handling of time + + // map of app. size of time units in milliseconds + var timeUnitSize = { + "second": 1000, + "minute": 60 * 1000, + "hour": 60 * 60 * 1000, + "day": 24 * 60 * 60 * 1000, + "month": 30 * 24 * 60 * 60 * 1000, + "year": 365.2425 * 24 * 60 * 60 * 1000 + }; + + + // the allowed tick sizes, after 1 year we use + // an integer algorithm + var spec = [ + [1, "second"], [2, "second"], [5, "second"], [10, "second"], + [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], + [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"], + [8, "hour"], [12, "hour"], + [1, "day"], [2, "day"], [3, "day"], + [0.25, "month"], [0.5, "month"], [1, "month"], + [2, "month"], [3, "month"], [6, "month"], + [1, "year"] + ]; + + var minSize = 0; + if (opts.minTickSize != null) { + if (typeof opts.tickSize == "number") + minSize = opts.tickSize; + else + minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; + } + + for (var i = 0; i < spec.length - 1; ++i) + if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] + + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 + && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) + break; + size = spec[i][0]; + unit = spec[i][1]; + + // special-case the possibility of several years + if (unit == "year") { + magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10)); + norm = (delta / timeUnitSize.year) / magn; + if (norm < 1.5) + size = 1; + else if (norm < 3) + size = 2; + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + } + + axis.tickSize = opts.tickSize || [size, unit]; + + generator = function(axis) { + var ticks = [], + tickSize = axis.tickSize[0], unit = axis.tickSize[1], + d = new Date(axis.min); + + var step = tickSize * timeUnitSize[unit]; + + if (unit == "second") + d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); + if (unit == "minute") + d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); + if (unit == "hour") + d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); + if (unit == "month") + d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); + if (unit == "year") + d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); + + // reset smaller components + d.setUTCMilliseconds(0); + if (step >= timeUnitSize.minute) + d.setUTCSeconds(0); + if (step >= timeUnitSize.hour) + d.setUTCMinutes(0); + if (step >= timeUnitSize.day) + d.setUTCHours(0); + if (step >= timeUnitSize.day * 4) + d.setUTCDate(1); + if (step >= timeUnitSize.year) + d.setUTCMonth(0); + + + var carry = 0, v = Number.NaN, prev; + do { + prev = v; + v = d.getTime(); + ticks.push(v); + if (unit == "month") { + if (tickSize < 1) { + // a bit complicated - we'll divide the month + // up but we need to take care of fractions + // so we don't end up in the middle of a day + d.setUTCDate(1); + var start = d.getTime(); + d.setUTCMonth(d.getUTCMonth() + 1); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getUTCHours(); + d.setUTCHours(0); + } + else + d.setUTCMonth(d.getUTCMonth() + tickSize); + } + else if (unit == "year") { + d.setUTCFullYear(d.getUTCFullYear() + tickSize); + } + else + d.setTime(v + step); + } while (v < axis.max && v != prev); + + return ticks; + }; + + formatter = function (v, axis) { + var d = new Date(v); + + // first check global format + if (opts.timeformat != null) + return $.plot.formatDate(d, opts.timeformat, opts.monthNames); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + var suffix = (opts.twelveHourClock) ? " %p" : ""; + + if (t < timeUnitSize.minute) + fmt = "%h:%M:%S" + suffix; + else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) + fmt = "%h:%M" + suffix; + else + fmt = "%b %d %h:%M" + suffix; + } + else if (t < timeUnitSize.month) + fmt = "%b %d"; + else if (t < timeUnitSize.year) { + if (span < timeUnitSize.year) + fmt = "%b"; + else + fmt = "%b %y"; + } + else + fmt = "%y"; + + return $.plot.formatDate(d, fmt, opts.monthNames); + }; + } + else { + // pretty rounding of base-10 numbers + var maxDec = opts.tickDecimals; + var dec = -Math.floor(Math.log(delta) / Math.LN10); + if (maxDec != null && dec > maxDec) + dec = maxDec; + + magn = Math.pow(10, -dec); + norm = delta / magn; // norm is between 1.0 and 10.0 + + if (norm < 1.5) + size = 1; + else if (norm < 3) { + size = 2; + // special case for 2.5, requires an extra decimal + if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { + size = 2.5; + ++dec; + } + } + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + + if (opts.minTickSize != null && size < opts.minTickSize) + size = opts.minTickSize; + + axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); + axis.tickSize = opts.tickSize || size; + + generator = function (axis) { + var ticks = []; + + // spew out all possible ticks + var start = floorInBase(axis.min, axis.tickSize), + i = 0, v = Number.NaN, prev; + do { + prev = v; + v = start + i * axis.tickSize; + ticks.push(v); + ++i; + } while (v < axis.max && v != prev); + return ticks; + }; + + formatter = function (v, axis) { + return v.toFixed(axis.tickDecimals); + }; + } + + if (opts.alignTicksWithAxis != null) { + var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis != axis) { + // consider snapping min/max to outermost nice ticks + var niceTicks = generator(axis); + if (niceTicks.length > 0) { + if (opts.min == null) + axis.min = Math.min(axis.min, niceTicks[0]); + if (opts.max == null && niceTicks.length > 1) + axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); + } + + generator = function (axis) { + // copy ticks, scaled to this axis + var ticks = [], v, i; + for (i = 0; i < otherAxis.ticks.length; ++i) { + v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); + v = axis.min + v * (axis.max - axis.min); + ticks.push(v); + } + return ticks; + }; + + // we might need an extra decimal since forced + // ticks don't necessarily fit naturally + if (axis.mode != "time" && opts.tickDecimals == null) { + var extraDec = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1), + ts = generator(axis); + + // only proceed if the tick interval rounded + // with an extra decimal doesn't give us a + // zero at end + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) + axis.tickDecimals = extraDec; + } + } + } + + axis.tickGenerator = generator; + if ($.isFunction(opts.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + else + axis.tickFormatter = formatter; + } + + function setTicks(axis) { + var oticks = axis.options.ticks, ticks = []; + if (oticks == null || (typeof oticks == "number" && oticks > 0)) + ticks = axis.tickGenerator(axis); + else if (oticks) { + if ($.isFunction(oticks)) + // generate the ticks + ticks = oticks({ min: axis.min, max: axis.max }); + else + ticks = oticks; + } + + // clean up/labelify the supplied ticks, copy them over + var i, v; + axis.ticks = []; + for (i = 0; i < ticks.length; ++i) { + var label = null; + var t = ticks[i]; + if (typeof t == "object") { + v = +t[0]; + if (t.length > 1) + label = t[1]; + } + else + v = +t; + if (label == null) + label = axis.tickFormatter(v, axis); + if (!isNaN(v)) + axis.ticks.push({ v: v, label: label }); + } + } + + function snapRangeToTicks(axis, ticks) { + if (axis.options.autoscaleMargin && ticks.length > 0) { + // snap to ticks + if (axis.options.min == null) + axis.min = Math.min(axis.min, ticks[0].v); + if (axis.options.max == null && ticks.length > 1) + axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); + } + } + + function draw() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + + var grid = options.grid; + + // draw background, if any + if (grid.show && grid.backgroundColor) + drawBackground(); + + if (grid.show && !grid.aboveData) + drawGrid(); + + for (var i = 0; i < series.length; ++i) { + executeHooks(hooks.drawSeries, [ctx, series[i]]); + drawSeries(series[i]); + } + + executeHooks(hooks.draw, [ctx]); + + if (grid.show && grid.aboveData) + drawGrid(); + } + + function extractRange(ranges, coord) { + var axis, from, to, key, axes = allAxes(); + + for (i = 0; i < axes.length; ++i) { + axis = axes[i]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? xaxes[0] : yaxes[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function drawBackground() { + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); + ctx.fillRect(0, 0, plotWidth, plotHeight); + ctx.restore(); + } + + function drawGrid() { + var i; + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // draw markings + var markings = options.grid.markings; + if (markings) { + if ($.isFunction(markings)) { + var axes = plot.getAxes(); + // xmin etc. is backwards compatibility, to be + // removed in the future + axes.xmin = axes.xaxis.min; + axes.xmax = axes.xaxis.max; + axes.ymin = axes.yaxis.min; + axes.ymax = axes.yaxis.max; + + markings = markings(axes); + } + + for (i = 0; i < markings.length; ++i) { + var m = markings[i], + xrange = extractRange(m, "x"), + yrange = extractRange(m, "y"); + + // fill in missing + if (xrange.from == null) + xrange.from = xrange.axis.min; + if (xrange.to == null) + xrange.to = xrange.axis.max; + if (yrange.from == null) + yrange.from = yrange.axis.min; + if (yrange.to == null) + yrange.to = yrange.axis.max; + + // clip + if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + continue; + + xrange.from = Math.max(xrange.from, xrange.axis.min); + xrange.to = Math.min(xrange.to, xrange.axis.max); + yrange.from = Math.max(yrange.from, yrange.axis.min); + yrange.to = Math.min(yrange.to, yrange.axis.max); + + if (xrange.from == xrange.to && yrange.from == yrange.to) + continue; + + // then draw + xrange.from = xrange.axis.p2c(xrange.from); + xrange.to = xrange.axis.p2c(xrange.to); + yrange.from = yrange.axis.p2c(yrange.from); + yrange.to = yrange.axis.p2c(yrange.to); + + if (xrange.from == xrange.to || yrange.from == yrange.to) { + // draw line + ctx.beginPath(); + ctx.strokeStyle = m.color || options.grid.markingsColor; + ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; + ctx.moveTo(xrange.from, yrange.from); + ctx.lineTo(xrange.to, yrange.to); + ctx.stroke(); + } + else { + // fill area + ctx.fillStyle = m.color || options.grid.markingsColor; + ctx.fillRect(xrange.from, yrange.to, + xrange.to - xrange.from, + yrange.from - yrange.to); + } + } + } + + // draw the ticks + var axes = allAxes(), bw = options.grid.borderWidth; + + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box, + t = axis.tickLength, x, y, xoff, yoff; + if (!axis.show || axis.ticks.length == 0) + continue + + ctx.strokeStyle = axis.options.tickColor || $.color.parse(axis.options.color).scale('a', 0.22).toString(); + ctx.lineWidth = 1; + + // find the edges + if (axis.direction == "x") { + x = 0; + if (t == "full") + y = (axis.position == "top" ? 0 : plotHeight); + else + y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); + } + else { + y = 0; + if (t == "full") + x = (axis.position == "left" ? 0 : plotWidth); + else + x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); + } + + // draw tick bar + if (!axis.innermost) { + ctx.beginPath(); + xoff = yoff = 0; + if (axis.direction == "x") + xoff = plotWidth; + else + yoff = plotHeight; + + if (ctx.lineWidth == 1) { + x = Math.floor(x) + 0.5; + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + ctx.stroke(); + } + + // draw ticks + ctx.beginPath(); + for (i = 0; i < axis.ticks.length; ++i) { + var v = axis.ticks[i].v; + + xoff = yoff = 0; + + if (v < axis.min || v > axis.max + // skip those lying on the axes if we got a border + || (t == "full" && bw > 0 + && (v == axis.min || v == axis.max))) + continue; + + if (axis.direction == "x") { + x = axis.p2c(v); + yoff = t == "full" ? -plotHeight : t; + + if (axis.position == "top") + yoff = -yoff; + } + else { + y = axis.p2c(v); + xoff = t == "full" ? -plotWidth : t; + + if (axis.position == "left") + xoff = -xoff; + } + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") + x = Math.floor(x) + 0.5; + else + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + } + + ctx.stroke(); + } + + + // draw border + if (bw) { + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } + + ctx.restore(); + } + + function insertAxisLabels() { + placeholder.find(".tickLabels").remove(); + + var html = ['
']; + + var axes = allAxes(); + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box; + if (!axis.show) + continue; + //debug: html.push('
') + html.push('
'); + for (var i = 0; i < axis.ticks.length; ++i) { + var tick = axis.ticks[i]; + if (!tick.label || tick.v < axis.min || tick.v > axis.max) + continue; + + var pos = {}, align; + + if (axis.direction == "x") { + align = "center"; + pos.left = Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2); + if (axis.position == "bottom") + pos.top = box.top + box.padding; + else + pos.bottom = canvasHeight - (box.top + box.height - box.padding); + } + else { + pos.top = Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2); + if (axis.position == "left") { + pos.right = canvasWidth - (box.left + box.width - box.padding) + align = "right"; + } + else { + pos.left = box.left + box.padding; + align = "left"; + } + } + + pos.width = axis.labelWidth; + + var style = ["position:absolute", "text-align:" + align ]; + for (var a in pos) + style.push(a + ":" + pos[a] + "px") + + html.push('
' + tick.label + '
'); + } + html.push('
'); + } + + html.push('
'); + + placeholder.append(html.join("")); + } + + function drawSeries(series) { + if (series.lines.show) + drawSeriesLines(series); + if (series.bars.show) + drawSeriesBars(series); + if (series.points.show) + drawSeriesPoints(series); + } + + function drawSeriesLines(series) { + function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + prevx = null, prevy = null; + + ctx.beginPath(); + for (var i = ps; i < points.length; i += ps) { + var x1 = points[i - ps], y1 = points[i - ps + 1], + x2 = points[i], y2 = points[i + 1]; + + if (x1 == null || x2 == null) + continue; + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min) { + if (y2 < axisy.min) + continue; // line segment is outside + // compute new intersection point + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) + continue; + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max) { + if (y2 > axisy.max) + continue; + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) + continue; + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (x1 != prevx || y1 != prevy) + ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + + prevx = x2; + prevy = y2; + ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); + } + ctx.stroke(); + } + + function plotLineArea(datapoints, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + bottom = Math.min(Math.max(0, axisy.min), axisy.max), + i = 0, top, areaOpen = false, + ypos = 1, segmentStart = 0, segmentEnd = 0; + + // we process each segment in two turns, first forward + // direction to sketch out top, then once we hit the + // end we go backwards to sketch the bottom + while (true) { + if (ps > 0 && i > points.length + ps) + break; + + i += ps; // ps is negative if going backwards + + var x1 = points[i - ps], + y1 = points[i - ps + ypos], + x2 = points[i], y2 = points[i + ypos]; + + if (areaOpen) { + if (ps > 0 && x1 != null && x2 == null) { + // at turning point + segmentEnd = i; + ps = -ps; + ypos = 2; + continue; + } + + if (ps < 0 && i == segmentStart + ps) { + // done with the reverse sweep + ctx.fill(); + areaOpen = false; + ps = -ps; + ypos = 1; + i = segmentStart = segmentEnd + ps; + continue; + } + } + + if (x1 == null || x2 == null) + continue; + + // clip x values + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (!areaOpen) { + // open area + ctx.beginPath(); + ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); + areaOpen = true; + } + + // now first check the case where both is outside + if (y1 >= axisy.max && y2 >= axisy.max) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); + continue; + } + else if (y1 <= axisy.min && y2 <= axisy.min) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); + continue; + } + + // else it's a bit more complicated, there might + // be a flat maxed out rectangle first, then a + // triangular cutout or reverse; to find these + // keep track of the current x values + var x1old = x1, x2old = x2; + + // clip the y values, without shortcutting, we + // go through all cases in turn + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // if the x value was changed we got a rectangle + // to fill + if (x1 != x1old) { + ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); + // it goes to (x1, y1), but we fill that below + } + + // fill triangular section, this sometimes result + // in redundant points if (x1, y1) hasn't changed + // from previous line to, but we just ignore that + ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + + // fill the other rectangle if it's there + if (x2 != x2old) { + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); + } + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + ctx.lineJoin = "round"; + + var lw = series.lines.lineWidth, + sw = series.shadowSize; + // FIXME: consider another form of shadow when filling is turned on + if (lw > 0 && sw > 0) { + // draw shadow as a thick and thin line with transparency + ctx.lineWidth = sw; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + // position shadow at angle from the mid of line + var angle = Math.PI/18; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); + ctx.lineWidth = sw/2; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); + if (fillStyle) { + ctx.fillStyle = fillStyle; + plotLineArea(series.datapoints, series.xaxis, series.yaxis); + } + + if (lw > 0) + plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawSeriesPoints(series) { + function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var x = points[i], y = points[i + 1]; + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + continue; + + ctx.beginPath(); + x = axisx.p2c(x); + y = axisy.p2c(y) + offset; + if (symbol == "circle") + ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); + else + symbol(ctx, x, y, radius, shadow); + ctx.closePath(); + + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + ctx.stroke(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var lw = series.points.lineWidth, + sw = series.shadowSize, + radius = series.points.radius, + symbol = series.points.symbol; + if (lw > 0 && sw > 0) { + // draw shadow in two steps + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + plotPoints(series.datapoints, radius, null, w + w/2, true, + series.xaxis, series.yaxis, symbol); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + plotPoints(series.datapoints, radius, null, w/2, true, + series.xaxis, series.yaxis, symbol); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + plotPoints(series.datapoints, radius, + getFillStyle(series.points, series.color), 0, false, + series.xaxis, series.yaxis, symbol); + ctx.restore(); + } + + function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + var left, right, bottom, top, + drawLeft, drawRight, drawTop, drawBottom, + tmp; + + // in horizontal mode, we start the bar from the left + // instead of from the bottom so it appears to be + // horizontal rather than vertical + if (horizontal) { + drawBottom = drawRight = drawTop = true; + drawLeft = false; + left = b; + right = x; + top = y + barLeft; + bottom = y + barRight; + + // account for negative bars + if (right < left) { + tmp = right; + right = left; + left = tmp; + drawLeft = true; + drawRight = false; + } + } + else { + drawLeft = drawRight = drawTop = true; + drawBottom = false; + left = x + barLeft; + right = x + barRight; + bottom = b; + top = y; + + // account for negative bars + if (top < bottom) { + tmp = top; + top = bottom; + bottom = tmp; + drawBottom = true; + drawTop = false; + } + } + + // clip + if (right < axisx.min || left > axisx.max || + top < axisy.min || bottom > axisy.max) + return; + + if (left < axisx.min) { + left = axisx.min; + drawLeft = false; + } + + if (right > axisx.max) { + right = axisx.max; + drawRight = false; + } + + if (bottom < axisy.min) { + bottom = axisy.min; + drawBottom = false; + } + + if (top > axisy.max) { + top = axisy.max; + drawTop = false; + } + + left = axisx.p2c(left); + bottom = axisy.p2c(bottom); + right = axisx.p2c(right); + top = axisy.p2c(top); + + // fill the bar + if (fillStyleCallback) { + c.beginPath(); + c.moveTo(left, bottom); + c.lineTo(left, top); + c.lineTo(right, top); + c.lineTo(right, bottom); + c.fillStyle = fillStyleCallback(bottom, top); + c.fill(); + } + + // draw outline + if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { + c.beginPath(); + + // FIXME: inline moveTo is buggy with excanvas + c.moveTo(left, bottom + offset); + if (drawLeft) + c.lineTo(left, top + offset); + else + c.moveTo(left, top + offset); + if (drawTop) + c.lineTo(right, top + offset); + else + c.moveTo(right, top + offset); + if (drawRight) + c.lineTo(right, bottom + offset); + else + c.moveTo(right, bottom + offset); + if (drawBottom) + c.lineTo(left, bottom + offset); + else + c.moveTo(left, bottom + offset); + c.stroke(); + } + } + + function drawSeriesBars(series) { + function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // FIXME: figure out a way to add shadows (for instance along the right edge) + ctx.lineWidth = series.bars.lineWidth; + ctx.strokeStyle = series.color; + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); + ctx.restore(); + } + + function getFillStyle(filloptions, seriesColor, bottom, top) { + var fill = filloptions.fill; + if (!fill) + return null; + + if (filloptions.fillColor) + return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + + var c = $.color.parse(seriesColor); + c.a = typeof fill == "number" ? fill : 0.4; + c.normalize(); + return c.toString(); + } + + function insertLegend() { + placeholder.find(".legend").remove(); + + if (!options.legend.show) + return; + + var fragments = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; + for (var i = 0; i < series.length; ++i) { + s = series[i]; + label = s.label; + if (!label) + continue; + + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push(''); + fragments.push(''); + rowStarted = true; + } + + if (lf) + label = lf(label, s); + + fragments.push( + '
' + + '' + label + ''); + } + if (rowStarted) + fragments.push(''); + + if (fragments.length == 0) + return; + + var table = '' + fragments.join("") + '
'; + if (options.legend.container != null) + $(options.legend.container).html(table); + else { + var pos = "", + p = options.legend.position, + m = options.legend.margin; + if (m[0] == null) + m = [m, m]; + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = $('
' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
').appendTo(placeholder); + if (options.legend.backgroundOpacity != 0.0) { + // put in the transparent background + // separately to avoid blended labels and + // label boxes + var c = options.legend.backgroundColor; + if (c == null) { + c = options.grid.backgroundColor; + if (c && typeof c == "string") + c = $.color.parse(c); + else + c = $.color.extract(legend, 'background-color'); + c.a = 1; + c = c.toString(); + } + var div = legend.children(); + $('
').prependTo(legend).css('opacity', options.legend.backgroundOpacity); + } + } + } + + + // interactive features + + var highlights = [], + redrawTimeout = null; + + // returns the data item the mouse is over, or null if none is found + function findNearbyItem(mouseX, mouseY, seriesFilter) { + var maxDistance = options.grid.mouseActiveRadius, + smallestDistance = maxDistance * maxDistance + 1, + item = null, foundPoint = false, i, j; + + for (i = series.length - 1; i >= 0; --i) { + if (!seriesFilter(series[i])) + continue; + + var s = series[i], + axisx = s.xaxis, + axisy = s.yaxis, + points = s.datapoints.points, + ps = s.datapoints.pointsize, + mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster + my = axisy.c2p(mouseY), + maxx = maxDistance / axisx.scale, + maxy = maxDistance / axisy.scale; + + // with inverse transforms, we can't use the maxx/maxy + // optimization, sadly + if (axisx.options.inverseTransform) + maxx = Number.MAX_VALUE; + if (axisy.options.inverseTransform) + maxy = Number.MAX_VALUE; + + if (s.lines.show || s.points.show) { + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1]; + if (x == null) + continue; + + // For points and lines, the cursor must be within a + // certain distance to the data point + if (x - mx > maxx || x - mx < -maxx || + y - my > maxy || y - my < -maxy) + continue; + + // We have to calculate distances in pixels, not in + // data units, because the scales of the axes may be different + var dx = Math.abs(axisx.p2c(x) - mouseX), + dy = Math.abs(axisy.p2c(y) - mouseY), + dist = dx * dx + dy * dy; // we save the sqrt + + // use <= to ensure last point takes precedence + // (last generally means on top of) + if (dist < smallestDistance) { + smallestDistance = dist; + item = [i, j / ps]; + } + } + } + + if (s.bars.show && !item) { // no other point can be nearby + var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, + barRight = barLeft + s.bars.barWidth; + + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1], b = points[j + 2]; + if (x == null) + continue; + + // for a bar graph, the cursor must be inside the bar + if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + my >= y + barLeft && my <= y + barRight) : + (mx >= x + barLeft && mx <= x + barRight && + my >= Math.min(b, y) && my <= Math.max(b, y))) + item = [i, j / ps]; + } + } + } + + if (item) { + i = item[0]; + j = item[1]; + ps = series[i].datapoints.pointsize; + + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), + dataIndex: j, + series: series[i], + seriesIndex: i }; + } + + return null; + } + + function onMouseMove(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return s["hoverable"] != false; }); + } + + function onMouseLeave(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return false; }); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e, + function (s) { return s["clickable"] != false; }); + } + + // trigger click or hover event (they send the same parameters + // so we share their code) + function triggerClickHoverEvent(eventname, event, seriesFilter) { + var offset = eventHolder.offset(), + canvasX = event.pageX - offset.left - plotOffset.left, + canvasY = event.pageY - offset.top - plotOffset.top, + pos = canvasToAxisCoords({ left: canvasX, top: canvasY }); + + pos.pageX = event.pageX; + pos.pageY = event.pageY; + + var item = findNearbyItem(canvasX, canvasY, seriesFilter); + + if (item) { + // fill in mouse pos for any listeners out there + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); + } + + if (options.grid.autoHighlight) { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && + !(item && h.series == item.series && + h.point[0] == item.datapoint[0] && + h.point[1] == item.datapoint[1])) + unhighlight(h.series, h.point); + } + + if (item) + highlight(item.series, item.datapoint, eventname); + } + + placeholder.trigger(eventname, [ pos, item ]); + } + + function triggerRedrawOverlay() { + if (!redrawTimeout) + redrawTimeout = setTimeout(drawOverlay, 30); + } + + function drawOverlay() { + redrawTimeout = null; + + // draw highlights + octx.save(); + octx.clearRect(0, 0, canvasWidth, canvasHeight); + octx.translate(plotOffset.left, plotOffset.top); + + var i, hi; + for (i = 0; i < highlights.length; ++i) { + hi = highlights[i]; + + if (hi.series.bars.show) + drawBarHighlight(hi.series, hi.point); + else + drawPointHighlight(hi.series, hi.point); + } + octx.restore(); + + executeHooks(hooks.drawOverlay, [octx]); + } + + function highlight(s, point, auto) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i == -1) { + highlights.push({ series: s, point: point, auto: auto }); + + triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s, point) { + if (s == null && point == null) { + highlights = []; + triggerRedrawOverlay(); + } + + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") + point = s.data[point]; + + var i = indexOfHighlight(s, point); + if (i != -1) { + highlights.splice(i, 1); + + triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s, p) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) + return i; + } + return -1; + } + + function drawPointHighlight(series, point) { + var x = point[0], y = point[1], + axisx = series.xaxis, axisy = series.yaxis; + + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + return; + + var pointRadius = series.points.radius + series.points.lineWidth / 2; + octx.lineWidth = pointRadius; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var radius = 1.5 * pointRadius, + x = axisx.p2c(x), + y = axisy.p2c(y); + + octx.beginPath(); + if (series.points.symbol == "circle") + octx.arc(x, y, radius, 0, 2 * Math.PI, false); + else + series.points.symbol(octx, x, y, radius, false); + octx.closePath(); + octx.stroke(); + } + + function drawBarHighlight(series, point) { + octx.lineWidth = series.bars.lineWidth; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, + 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + } + + function getColorOrGradient(spec, bottom, top, defaultColor) { + if (typeof spec == "string") + return spec; + else { + // assume this is a gradient spec; IE currently only + // supports a simple vertical gradient properly, so that's + // what we support too + var gradient = ctx.createLinearGradient(0, top, 0, bottom); + + for (var i = 0, l = spec.colors.length; i < l; ++i) { + var c = spec.colors[i]; + if (typeof c != "string") { + var co = $.color.parse(defaultColor); + if (c.brightness != null) + co = co.scale('rgb', c.brightness) + if (c.opacity != null) + co.a *= c.opacity; + c = co.toString(); + } + gradient.addColorStop(i / (l - 1), c); + } + + return gradient; + } + } + } + + $.plot = function(placeholder, data, options) { + //var t0 = new Date(); + var plot = new Plot($(placeholder), data, options, $.plot.plugins); + //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime())); + return plot; + }; + + $.plot.version = "0.7"; + + $.plot.plugins = []; + + // returns a string with the date d formatted according to fmt + $.plot.formatDate = function(d, fmt, monthNames) { + var leftPad = function(n) { + n = "" + n; + return n.length == 1 ? "0" + n : n; + }; + + var r = []; + var escape = false, padNext = false; + var hours = d.getUTCHours(); + var isAM = hours < 12; + if (monthNames == null) + monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + if (fmt.search(/%p|%P/) != -1) { + if (hours > 12) { + hours = hours - 12; + } else if (hours == 0) { + hours = 12; + } + } + for (var i = 0; i < fmt.length; ++i) { + var c = fmt.charAt(i); + + if (escape) { + switch (c) { + case 'h': c = "" + hours; break; + case 'H': c = leftPad(hours); break; + case 'M': c = leftPad(d.getUTCMinutes()); break; + case 'S': c = leftPad(d.getUTCSeconds()); break; + case 'd': c = "" + d.getUTCDate(); break; + case 'm': c = "" + (d.getUTCMonth() + 1); break; + case 'y': c = "" + d.getUTCFullYear(); break; + case 'b': c = "" + monthNames[d.getUTCMonth()]; break; + case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; + case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; + case '0': c = ""; padNext = true; break; + } + if (c && padNext) { + c = leftPad(c); + padNext = false; + } + r.push(c); + if (!padNext) + escape = false; + } + else { + if (c == "%") + escape = true; + else + r.push(c); + } + } + return r.join(""); + }; + + // round to nearby lower multiple of base + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.min.js @@ -1,1 +1,6 @@ - +/* Javascript plotting library for jQuery, v. 0.7. + * + * Released under the MIT license by IOLA, December 2007. + * + */ +(function(b){b.color={};b.color.make=function(d,e,g,f){var c={};c.r=d||0;c.g=e||0;c.b=g||0;c.a=f!=null?f:1;c.add=function(h,j){for(var k=0;k=1){return"rgb("+[c.r,c.g,c.b].join(",")+")"}else{return"rgba("+[c.r,c.g,c.b,c.a].join(",")+")"}};c.normalize=function(){function h(k,j,l){return jl?l:j)}c.r=h(0,parseInt(c.r),255);c.g=h(0,parseInt(c.g),255);c.b=h(0,parseInt(c.b),255);c.a=h(0,c.a,1);return c};c.clone=function(){return b.color.make(c.r,c.b,c.g,c.a)};return c.normalize()};b.color.extract=function(d,e){var c;do{c=d.css(e).toLowerCase();if(c!=""&&c!="transparent"){break}d=d.parent()}while(!b.nodeName(d.get(0),"body"));if(c=="rgba(0, 0, 0, 0)"){c="transparent"}return b.color.parse(c)};b.color.parse=function(c){var d,f=b.color.make;if(d=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10))}if(d=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10),parseFloat(d[4]))}if(d=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55)}if(d=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55,parseFloat(d[4]))}if(d=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c)){return f(parseInt(d[1],16),parseInt(d[2],16),parseInt(d[3],16))}if(d=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c)){return f(parseInt(d[1]+d[1],16),parseInt(d[2]+d[2],16),parseInt(d[3]+d[3],16))}var e=b.trim(c).toLowerCase();if(e=="transparent"){return f(255,255,255,0)}else{d=a[e]||[0,0,0];return f(d[0],d[1],d[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function(c){function b(av,ai,J,af){var Q=[],O={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{show:null,position:"bottom",mode:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},az=null,ad=null,y=null,H=null,A=null,p=[],aw=[],q={left:0,right:0,top:0,bottom:0},G=0,I=0,h=0,w=0,ak={processOptions:[],processRawData:[],processDatapoints:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},aq=this;aq.setData=aj;aq.setupGrid=t;aq.draw=W;aq.getPlaceholder=function(){return av};aq.getCanvas=function(){return az};aq.getPlotOffset=function(){return q};aq.width=function(){return h};aq.height=function(){return w};aq.offset=function(){var aB=y.offset();aB.left+=q.left;aB.top+=q.top;return aB};aq.getData=function(){return Q};aq.getAxes=function(){var aC={},aB;c.each(p.concat(aw),function(aD,aE){if(aE){aC[aE.direction+(aE.n!=1?aE.n:"")+"axis"]=aE}});return aC};aq.getXAxes=function(){return p};aq.getYAxes=function(){return aw};aq.c2p=C;aq.p2c=ar;aq.getOptions=function(){return O};aq.highlight=x;aq.unhighlight=T;aq.triggerRedrawOverlay=f;aq.pointOffset=function(aB){return{left:parseInt(p[aA(aB,"x")-1].p2c(+aB.x)+q.left),top:parseInt(aw[aA(aB,"y")-1].p2c(+aB.y)+q.top)}};aq.shutdown=ag;aq.resize=function(){B();g(az);g(ad)};aq.hooks=ak;F(aq);Z(J);X();aj(ai);t();W();ah();function an(aD,aB){aB=[aq].concat(aB);for(var aC=0;aC=O.colors.length){aG=0;++aF}}var aH=0,aN;for(aG=0;aGa3.datamax&&a1!=aB){a3.datamax=a1}}c.each(m(),function(a1,a2){a2.datamin=aO;a2.datamax=aI;a2.used=false});for(aU=0;aU0&&aT[aR-aP]!=null&&aT[aR-aP]!=aT[aR]&&aT[aR-aP+1]!=aT[aR+1]){for(aN=0;aNaM){aM=a0}}if(aX.y){if(a0aV){aV=a0}}}}if(aJ.bars.show){var aY=aJ.bars.align=="left"?0:-aJ.bars.barWidth/2;if(aJ.bars.horizontal){aQ+=aY;aV+=aY+aJ.bars.barWidth}else{aK+=aY;aM+=aY+aJ.bars.barWidth}}aF(aJ.xaxis,aK,aM);aF(aJ.yaxis,aQ,aV)}c.each(m(),function(a1,a2){if(a2.datamin==aO){a2.datamin=null}if(a2.datamax==aI){a2.datamax=null}})}function j(aB,aC){var aD=document.createElement("canvas");aD.className=aC;aD.width=G;aD.height=I;if(!aB){c(aD).css({position:"absolute",left:0,top:0})}c(aD).appendTo(av);if(!aD.getContext){aD=window.G_vmlCanvasManager.initElement(aD)}aD.getContext("2d").save();return aD}function B(){G=av.width();I=av.height();if(G<=0||I<=0){throw"Invalid dimensions for plot, width = "+G+", height = "+I}}function g(aC){if(aC.width!=G){aC.width=G}if(aC.height!=I){aC.height=I}var aB=aC.getContext("2d");aB.restore();aB.save()}function X(){var aC,aB=av.children("canvas.base"),aD=av.children("canvas.overlay");if(aB.length==0||aD==0){av.html("");av.css({padding:0});if(av.css("position")=="static"){av.css("position","relative")}B();az=j(true,"base");ad=j(false,"overlay");aC=false}else{az=aB.get(0);ad=aD.get(0);aC=true}H=az.getContext("2d");A=ad.getContext("2d");y=c([ad,az]);if(aC){av.data("plot").shutdown();aq.resize();A.clearRect(0,0,G,I);y.unbind();av.children().not([az,ad]).remove()}av.data("plot",aq)}function ah(){if(O.grid.hoverable){y.mousemove(aa);y.mouseleave(l)}if(O.grid.clickable){y.click(R)}an(ak.bindEvents,[y])}function ag(){if(M){clearTimeout(M)}y.unbind("mousemove",aa);y.unbind("mouseleave",l);y.unbind("click",R);an(ak.shutdown,[y])}function r(aG){function aC(aH){return aH}var aF,aB,aD=aG.options.transform||aC,aE=aG.options.inverseTransform;if(aG.direction=="x"){aF=aG.scale=h/Math.abs(aD(aG.max)-aD(aG.min));aB=Math.min(aD(aG.max),aD(aG.min))}else{aF=aG.scale=w/Math.abs(aD(aG.max)-aD(aG.min));aF=-aF;aB=Math.max(aD(aG.max),aD(aG.min))}if(aD==aC){aG.p2c=function(aH){return(aH-aB)*aF}}else{aG.p2c=function(aH){return(aD(aH)-aB)*aF}}if(!aE){aG.c2p=function(aH){return aB+aH/aF}}else{aG.c2p=function(aH){return aE(aB+aH/aF)}}}function L(aD){var aB=aD.options,aF,aJ=aD.ticks||[],aI=[],aE,aK=aB.labelWidth,aG=aB.labelHeight,aC;function aH(aM,aL){return c('
'+aM.join("")+"
").appendTo(av)}if(aD.direction=="x"){if(aK==null){aK=Math.floor(G/(aJ.length>0?aJ.length:1))}if(aG==null){aI=[];for(aF=0;aF'+aE+"
")}}if(aI.length>0){aI.push('
');aC=aH(aI,"width:10000px;");aG=aC.height();aC.remove()}}}else{if(aK==null||aG==null){for(aF=0;aF'+aE+"
")}}if(aI.length>0){aC=aH(aI,"");if(aK==null){aK=aC.children().width()}if(aG==null){aG=aC.find("div.tickLabel").height()}aC.remove()}}}if(aK==null){aK=0}if(aG==null){aG=0}aD.labelWidth=aK;aD.labelHeight=aG}function au(aD){var aC=aD.labelWidth,aL=aD.labelHeight,aH=aD.options.position,aF=aD.options.tickLength,aG=O.grid.axisMargin,aJ=O.grid.labelMargin,aK=aD.direction=="x"?p:aw,aE;var aB=c.grep(aK,function(aN){return aN&&aN.options.position==aH&&aN.reserveSpace});if(c.inArray(aD,aB)==aB.length-1){aG=0}if(aF==null){aF="full"}var aI=c.grep(aK,function(aN){return aN&&aN.reserveSpace});var aM=c.inArray(aD,aI)==0;if(!aM&&aF=="full"){aF=5}if(!isNaN(+aF)){aJ+=+aF}if(aD.direction=="x"){aL+=aJ;if(aH=="bottom"){q.bottom+=aL+aG;aD.box={top:I-q.bottom,height:aL}}else{aD.box={top:q.top+aG,height:aL};q.top+=aL+aG}}else{aC+=aJ;if(aH=="left"){aD.box={left:q.left+aG,width:aC};q.left+=aC+aG}else{q.right+=aC+aG;aD.box={left:G-q.right,width:aC}}}aD.position=aH;aD.tickLength=aF;aD.box.padding=aJ;aD.innermost=aM}function U(aB){if(aB.direction=="x"){aB.box.left=q.left;aB.box.width=h}else{aB.box.top=q.top;aB.box.height=w}}function t(){var aC,aE=m();c.each(aE,function(aF,aG){aG.show=aG.options.show;if(aG.show==null){aG.show=aG.used}aG.reserveSpace=aG.show||aG.options.reserveSpace;n(aG)});allocatedAxes=c.grep(aE,function(aF){return aF.reserveSpace});q.left=q.right=q.top=q.bottom=0;if(O.grid.show){c.each(allocatedAxes,function(aF,aG){S(aG);P(aG);ap(aG,aG.ticks);L(aG)});for(aC=allocatedAxes.length-1;aC>=0;--aC){au(allocatedAxes[aC])}var aD=O.grid.minBorderMargin;if(aD==null){aD=0;for(aC=0;aC=0){aD=0}}if(aF.max==null){aB+=aH*aG;if(aB>0&&aE.datamax!=null&&aE.datamax<=0){aB=0}}}}aE.min=aD;aE.max=aB}function S(aG){var aM=aG.options;var aH;if(typeof aM.ticks=="number"&&aM.ticks>0){aH=aM.ticks}else{aH=0.3*Math.sqrt(aG.direction=="x"?G:I)}var aT=(aG.max-aG.min)/aH,aO,aB,aN,aR,aS,aQ,aI;if(aM.mode=="time"){var aJ={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var aK=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var aC=0;if(aM.minTickSize!=null){if(typeof aM.tickSize=="number"){aC=aM.tickSize}else{aC=aM.minTickSize[0]*aJ[aM.minTickSize[1]]}}for(var aS=0;aS=aC){break}}aO=aK[aS][0];aN=aK[aS][1];if(aN=="year"){aQ=Math.pow(10,Math.floor(Math.log(aT/aJ.year)/Math.LN10));aI=(aT/aJ.year)/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ}aG.tickSize=aM.tickSize||[aO,aN];aB=function(aX){var a2=[],a0=aX.tickSize[0],a3=aX.tickSize[1],a1=new Date(aX.min);var aW=a0*aJ[a3];if(a3=="second"){a1.setUTCSeconds(a(a1.getUTCSeconds(),a0))}if(a3=="minute"){a1.setUTCMinutes(a(a1.getUTCMinutes(),a0))}if(a3=="hour"){a1.setUTCHours(a(a1.getUTCHours(),a0))}if(a3=="month"){a1.setUTCMonth(a(a1.getUTCMonth(),a0))}if(a3=="year"){a1.setUTCFullYear(a(a1.getUTCFullYear(),a0))}a1.setUTCMilliseconds(0);if(aW>=aJ.minute){a1.setUTCSeconds(0)}if(aW>=aJ.hour){a1.setUTCMinutes(0)}if(aW>=aJ.day){a1.setUTCHours(0)}if(aW>=aJ.day*4){a1.setUTCDate(1)}if(aW>=aJ.year){a1.setUTCMonth(0)}var a5=0,a4=Number.NaN,aY;do{aY=a4;a4=a1.getTime();a2.push(a4);if(a3=="month"){if(a0<1){a1.setUTCDate(1);var aV=a1.getTime();a1.setUTCMonth(a1.getUTCMonth()+1);var aZ=a1.getTime();a1.setTime(a4+a5*aJ.hour+(aZ-aV)*a0);a5=a1.getUTCHours();a1.setUTCHours(0)}else{a1.setUTCMonth(a1.getUTCMonth()+a0)}}else{if(a3=="year"){a1.setUTCFullYear(a1.getUTCFullYear()+a0)}else{a1.setTime(a4+aW)}}}while(a4aU){aP=aU}aQ=Math.pow(10,-aP);aI=aT/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2;if(aI>2.25&&(aU==null||aP+1<=aU)){aO=2.5;++aP}}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ;if(aM.minTickSize!=null&&aO0){if(aM.min==null){aG.min=Math.min(aG.min,aL[0])}if(aM.max==null&&aL.length>1){aG.max=Math.max(aG.max,aL[aL.length-1])}}aB=function(aX){var aY=[],aV,aW;for(aW=0;aW1&&/\..*0$/.test((aD[1]-aD[0]).toFixed(aE)))){aG.tickDecimals=aE}}}}aG.tickGenerator=aB;if(c.isFunction(aM.tickFormatter)){aG.tickFormatter=function(aV,aW){return""+aM.tickFormatter(aV,aW)}}else{aG.tickFormatter=aR}}function P(aF){var aH=aF.options.ticks,aG=[];if(aH==null||(typeof aH=="number"&&aH>0)){aG=aF.tickGenerator(aF)}else{if(aH){if(c.isFunction(aH)){aG=aH({min:aF.min,max:aF.max})}else{aG=aH}}}var aE,aB;aF.ticks=[];for(aE=0;aE1){aC=aD[1]}}else{aB=+aD}if(aC==null){aC=aF.tickFormatter(aB,aF)}if(!isNaN(aB)){aF.ticks.push({v:aB,label:aC})}}}function ap(aB,aC){if(aB.options.autoscaleMargin&&aC.length>0){if(aB.options.min==null){aB.min=Math.min(aB.min,aC[0].v)}if(aB.options.max==null&&aC.length>1){aB.max=Math.max(aB.max,aC[aC.length-1].v)}}}function W(){H.clearRect(0,0,G,I);var aC=O.grid;if(aC.show&&aC.backgroundColor){N()}if(aC.show&&!aC.aboveData){ac()}for(var aB=0;aBaG){var aC=aH;aH=aG;aG=aC}return{from:aH,to:aG,axis:aE}}function N(){H.save();H.translate(q.left,q.top);H.fillStyle=am(O.grid.backgroundColor,w,0,"rgba(255, 255, 255, 0)");H.fillRect(0,0,h,w);H.restore()}function ac(){var aF;H.save();H.translate(q.left,q.top);var aH=O.grid.markings;if(aH){if(c.isFunction(aH)){var aK=aq.getAxes();aK.xmin=aK.xaxis.min;aK.xmax=aK.xaxis.max;aK.ymin=aK.yaxis.min;aK.ymax=aK.yaxis.max;aH=aH(aK)}for(aF=0;aFaC.axis.max||aI.toaI.axis.max){continue}aC.from=Math.max(aC.from,aC.axis.min);aC.to=Math.min(aC.to,aC.axis.max);aI.from=Math.max(aI.from,aI.axis.min);aI.to=Math.min(aI.to,aI.axis.max);if(aC.from==aC.to&&aI.from==aI.to){continue}aC.from=aC.axis.p2c(aC.from);aC.to=aC.axis.p2c(aC.to);aI.from=aI.axis.p2c(aI.from);aI.to=aI.axis.p2c(aI.to);if(aC.from==aC.to||aI.from==aI.to){H.beginPath();H.strokeStyle=aD.color||O.grid.markingsColor;H.lineWidth=aD.lineWidth||O.grid.markingsLineWidth;H.moveTo(aC.from,aI.from);H.lineTo(aC.to,aI.to);H.stroke()}else{H.fillStyle=aD.color||O.grid.markingsColor;H.fillRect(aC.from,aI.to,aC.to-aC.from,aI.from-aI.to)}}}var aK=m(),aM=O.grid.borderWidth;for(var aE=0;aEaB.max||(aQ=="full"&&aM>0&&(aO==aB.min||aO==aB.max))){continue}if(aB.direction=="x"){aN=aB.p2c(aO);aJ=aQ=="full"?-w:aQ;if(aB.position=="top"){aJ=-aJ}}else{aL=aB.p2c(aO);aP=aQ=="full"?-h:aQ;if(aB.position=="left"){aP=-aP}}if(H.lineWidth==1){if(aB.direction=="x"){aN=Math.floor(aN)+0.5}else{aL=Math.floor(aL)+0.5}}H.moveTo(aN,aL);H.lineTo(aN+aP,aL+aJ)}H.stroke()}if(aM){H.lineWidth=aM;H.strokeStyle=O.grid.borderColor;H.strokeRect(-aM/2,-aM/2,h+aM,w+aM)}H.restore()}function k(){av.find(".tickLabels").remove();var aG=['
'];var aJ=m();for(var aD=0;aD');for(var aE=0;aEaC.max){continue}var aK={},aI;if(aC.direction=="x"){aI="center";aK.left=Math.round(q.left+aC.p2c(aH.v)-aC.labelWidth/2);if(aC.position=="bottom"){aK.top=aF.top+aF.padding}else{aK.bottom=I-(aF.top+aF.height-aF.padding)}}else{aK.top=Math.round(q.top+aC.p2c(aH.v)-aC.labelHeight/2);if(aC.position=="left"){aK.right=G-(aF.left+aF.width-aF.padding);aI="right"}else{aK.left=aF.left+aF.padding;aI="left"}}aK.width=aC.labelWidth;var aB=["position:absolute","text-align:"+aI];for(var aL in aK){aB.push(aL+":"+aK[aL]+"px")}aG.push('
'+aH.label+"
")}aG.push("
")}aG.push("
");av.append(aG.join(""))}function d(aB){if(aB.lines.show){at(aB)}if(aB.bars.show){e(aB)}if(aB.points.show){ao(aB)}}function at(aE){function aD(aP,aQ,aI,aU,aT){var aV=aP.points,aJ=aP.pointsize,aN=null,aM=null;H.beginPath();for(var aO=aJ;aO=aR&&aS>aT.max){if(aR>aT.max){continue}aL=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aS=aT.max}else{if(aR>=aS&&aR>aT.max){if(aS>aT.max){continue}aK=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aR=aT.max}}if(aL<=aK&&aL=aK&&aL>aU.max){if(aK>aU.max){continue}aS=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aL=aU.max}else{if(aK>=aL&&aK>aU.max){if(aL>aU.max){continue}aR=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aK=aU.max}}if(aL!=aN||aS!=aM){H.moveTo(aU.p2c(aL)+aQ,aT.p2c(aS)+aI)}aN=aK;aM=aR;H.lineTo(aU.p2c(aK)+aQ,aT.p2c(aR)+aI)}H.stroke()}function aF(aI,aQ,aP){var aW=aI.points,aV=aI.pointsize,aN=Math.min(Math.max(0,aP.min),aP.max),aX=0,aU,aT=false,aM=1,aL=0,aR=0;while(true){if(aV>0&&aX>aW.length+aV){break}aX+=aV;var aZ=aW[aX-aV],aK=aW[aX-aV+aM],aY=aW[aX],aJ=aW[aX+aM];if(aT){if(aV>0&&aZ!=null&&aY==null){aR=aX;aV=-aV;aM=2;continue}if(aV<0&&aX==aL+aV){H.fill();aT=false;aV=-aV;aM=1;aX=aL=aR+aV;continue}}if(aZ==null||aY==null){continue}if(aZ<=aY&&aZ=aY&&aZ>aQ.max){if(aY>aQ.max){continue}aK=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aZ=aQ.max}else{if(aY>=aZ&&aY>aQ.max){if(aZ>aQ.max){continue}aJ=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aY=aQ.max}}if(!aT){H.beginPath();H.moveTo(aQ.p2c(aZ),aP.p2c(aN));aT=true}if(aK>=aP.max&&aJ>=aP.max){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.max));H.lineTo(aQ.p2c(aY),aP.p2c(aP.max));continue}else{if(aK<=aP.min&&aJ<=aP.min){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.min));H.lineTo(aQ.p2c(aY),aP.p2c(aP.min));continue}}var aO=aZ,aS=aY;if(aK<=aJ&&aK=aP.min){aZ=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.min}else{if(aJ<=aK&&aJ=aP.min){aY=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.min}}if(aK>=aJ&&aK>aP.max&&aJ<=aP.max){aZ=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.max}else{if(aJ>=aK&&aJ>aP.max&&aK<=aP.max){aY=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.max}}if(aZ!=aO){H.lineTo(aQ.p2c(aO),aP.p2c(aK))}H.lineTo(aQ.p2c(aZ),aP.p2c(aK));H.lineTo(aQ.p2c(aY),aP.p2c(aJ));if(aY!=aS){H.lineTo(aQ.p2c(aY),aP.p2c(aJ));H.lineTo(aQ.p2c(aS),aP.p2c(aJ))}}}H.save();H.translate(q.left,q.top);H.lineJoin="round";var aG=aE.lines.lineWidth,aB=aE.shadowSize;if(aG>0&&aB>0){H.lineWidth=aB;H.strokeStyle="rgba(0,0,0,0.1)";var aH=Math.PI/18;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/2),Math.cos(aH)*(aG/2+aB/2),aE.xaxis,aE.yaxis);H.lineWidth=aB/2;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/4),Math.cos(aH)*(aG/2+aB/4),aE.xaxis,aE.yaxis)}H.lineWidth=aG;H.strokeStyle=aE.color;var aC=ae(aE.lines,aE.color,0,w);if(aC){H.fillStyle=aC;aF(aE.datapoints,aE.xaxis,aE.yaxis)}if(aG>0){aD(aE.datapoints,0,0,aE.xaxis,aE.yaxis)}H.restore()}function ao(aE){function aH(aN,aM,aU,aK,aS,aT,aQ,aJ){var aR=aN.points,aI=aN.pointsize;for(var aL=0;aLaT.max||aOaQ.max){continue}H.beginPath();aP=aT.p2c(aP);aO=aQ.p2c(aO)+aK;if(aJ=="circle"){H.arc(aP,aO,aM,0,aS?Math.PI:Math.PI*2,false)}else{aJ(H,aP,aO,aM,aS)}H.closePath();if(aU){H.fillStyle=aU;H.fill()}H.stroke()}}H.save();H.translate(q.left,q.top);var aG=aE.points.lineWidth,aC=aE.shadowSize,aB=aE.points.radius,aF=aE.points.symbol;if(aG>0&&aC>0){var aD=aC/2;H.lineWidth=aD;H.strokeStyle="rgba(0,0,0,0.1)";aH(aE.datapoints,aB,null,aD+aD/2,true,aE.xaxis,aE.yaxis,aF);H.strokeStyle="rgba(0,0,0,0.2)";aH(aE.datapoints,aB,null,aD/2,true,aE.xaxis,aE.yaxis,aF)}H.lineWidth=aG;H.strokeStyle=aE.color;aH(aE.datapoints,aB,ae(aE.points,aE.color),0,false,aE.xaxis,aE.yaxis,aF);H.restore()}function E(aN,aM,aV,aI,aQ,aF,aD,aL,aK,aU,aR,aC){var aE,aT,aJ,aP,aG,aB,aO,aH,aS;if(aR){aH=aB=aO=true;aG=false;aE=aV;aT=aN;aP=aM+aI;aJ=aM+aQ;if(aTaL.max||aPaK.max){return}if(aEaL.max){aT=aL.max;aB=false}if(aJaK.max){aP=aK.max;aO=false}aE=aL.p2c(aE);aJ=aK.p2c(aJ);aT=aL.p2c(aT);aP=aK.p2c(aP);if(aD){aU.beginPath();aU.moveTo(aE,aJ);aU.lineTo(aE,aP);aU.lineTo(aT,aP);aU.lineTo(aT,aJ);aU.fillStyle=aD(aJ,aP);aU.fill()}if(aC>0&&(aG||aB||aO||aH)){aU.beginPath();aU.moveTo(aE,aJ+aF);if(aG){aU.lineTo(aE,aP+aF)}else{aU.moveTo(aE,aP+aF)}if(aO){aU.lineTo(aT,aP+aF)}else{aU.moveTo(aT,aP+aF)}if(aB){aU.lineTo(aT,aJ+aF)}else{aU.moveTo(aT,aJ+aF)}if(aH){aU.lineTo(aE,aJ+aF)}else{aU.moveTo(aE,aJ+aF)}aU.stroke()}}function e(aD){function aC(aJ,aI,aL,aG,aK,aN,aM){var aO=aJ.points,aF=aJ.pointsize;for(var aH=0;aH")}aH.push("");aF=true}if(aN){aJ=aN(aJ,aM)}aH.push('
'+aJ+"")}if(aF){aH.push("")}if(aH.length==0){return}var aL=''+aH.join("")+"
";if(O.legend.container!=null){c(O.legend.container).html(aL)}else{var aI="",aC=O.legend.position,aD=O.legend.margin;if(aD[0]==null){aD=[aD,aD]}if(aC.charAt(0)=="n"){aI+="top:"+(aD[1]+q.top)+"px;"}else{if(aC.charAt(0)=="s"){aI+="bottom:"+(aD[1]+q.bottom)+"px;"}}if(aC.charAt(1)=="e"){aI+="right:"+(aD[0]+q.right)+"px;"}else{if(aC.charAt(1)=="w"){aI+="left:"+(aD[0]+q.left)+"px;"}}var aK=c('
'+aL.replace('style="','style="position:absolute;'+aI+";")+"
").appendTo(av);if(O.legend.backgroundOpacity!=0){var aG=O.legend.backgroundColor;if(aG==null){aG=O.grid.backgroundColor;if(aG&&typeof aG=="string"){aG=c.color.parse(aG)}else{aG=c.color.extract(aK,"background-color")}aG.a=1;aG=aG.toString()}var aB=aK.children();c('
').prependTo(aK).css("opacity",O.legend.backgroundOpacity)}}}var ab=[],M=null;function K(aI,aG,aD){var aO=O.grid.mouseActiveRadius,a0=aO*aO+1,aY=null,aR=false,aW,aU;for(aW=Q.length-1;aW>=0;--aW){if(!aD(Q[aW])){continue}var aP=Q[aW],aH=aP.xaxis,aF=aP.yaxis,aV=aP.datapoints.points,aT=aP.datapoints.pointsize,aQ=aH.c2p(aI),aN=aF.c2p(aG),aC=aO/aH.scale,aB=aO/aF.scale;if(aH.options.inverseTransform){aC=Number.MAX_VALUE}if(aF.options.inverseTransform){aB=Number.MAX_VALUE}if(aP.lines.show||aP.points.show){for(aU=0;aUaC||aK-aQ<-aC||aJ-aN>aB||aJ-aN<-aB){continue}var aM=Math.abs(aH.p2c(aK)-aI),aL=Math.abs(aF.p2c(aJ)-aG),aS=aM*aM+aL*aL;if(aS=Math.min(aZ,aK)&&aN>=aJ+aE&&aN<=aJ+aX):(aQ>=aK+aE&&aQ<=aK+aX&&aN>=Math.min(aZ,aJ)&&aN<=Math.max(aZ,aJ))){aY=[aW,aU/aT]}}}}if(aY){aW=aY[0];aU=aY[1];aT=Q[aW].datapoints.pointsize;return{datapoint:Q[aW].datapoints.points.slice(aU*aT,(aU+1)*aT),dataIndex:aU,series:Q[aW],seriesIndex:aW}}return null}function aa(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return aC.hoverable!=false})}}function l(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return false})}}function R(aB){u("plotclick",aB,function(aC){return aC.clickable!=false})}function u(aC,aB,aD){var aE=y.offset(),aH=aB.pageX-aE.left-q.left,aF=aB.pageY-aE.top-q.top,aJ=C({left:aH,top:aF});aJ.pageX=aB.pageX;aJ.pageY=aB.pageY;var aK=K(aH,aF,aD);if(aK){aK.pageX=parseInt(aK.series.xaxis.p2c(aK.datapoint[0])+aE.left+q.left);aK.pageY=parseInt(aK.series.yaxis.p2c(aK.datapoint[1])+aE.top+q.top)}if(O.grid.autoHighlight){for(var aG=0;aGaH.max||aIaG.max){return}var aF=aE.points.radius+aE.points.lineWidth/2;A.lineWidth=aF;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aB=1.5*aF,aC=aH.p2c(aC),aI=aG.p2c(aI);A.beginPath();if(aE.points.symbol=="circle"){A.arc(aC,aI,aB,0,2*Math.PI,false)}else{aE.points.symbol(A,aC,aI,aB,false)}A.closePath();A.stroke()}function v(aE,aB){A.lineWidth=aE.bars.lineWidth;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aD=c.color.parse(aE.color).scale("a",0.5).toString();var aC=aE.bars.align=="left"?0:-aE.bars.barWidth/2;E(aB[0],aB[1],aB[2]||0,aC,aC+aE.bars.barWidth,0,function(){return aD},aE.xaxis,aE.yaxis,A,aE.bars.horizontal,aE.bars.lineWidth)}function am(aJ,aB,aH,aC){if(typeof aJ=="string"){return aJ}else{var aI=H.createLinearGradient(0,aH,0,aB);for(var aE=0,aD=aJ.colors.length;aE12){n=n-12}else{if(n==0){n=12}}}for(var g=0;g0&&L.which!=M.which)||E(L.target).is(M.not)){return }}switch(L.type){case"mousedown":E.extend(M,E(K).offset(),{elem:K,target:L.target,pageX:L.pageX,pageY:L.pageY});A.add(document,"mousemove mouseup",H,M);G(K,false);F.dragging=null;return false;case !F.dragging&&"mousemove":if(I(L.pageX-M.pageX)+I(L.pageY-M.pageY) max) { + // make sure min < max + var tmp = min; + min = max; + max = tmp; + } + + var range = max - min; + if (zr && + ((zr[0] != null && range < zr[0]) || + (zr[1] != null && range > zr[1]))) + return; + + opts.min = min; + opts.max = max; + }); + + plot.setupGrid(); + plot.draw(); + + if (!args.preventEvent) + plot.getPlaceholder().trigger("plotzoom", [ plot ]); + } + + plot.pan = function (args) { + var delta = { + x: +args.left, + y: +args.top + }; + + if (isNaN(delta.x)) + delta.x = 0; + if (isNaN(delta.y)) + delta.y = 0; + + $.each(plot.getAxes(), function (_, axis) { + var opts = axis.options, + min, max, d = delta[axis.direction]; + + min = axis.c2p(axis.p2c(axis.min) + d), + max = axis.c2p(axis.p2c(axis.max) + d); + + var pr = opts.panRange; + if (pr === false) // no panning on this axis + return; + + if (pr) { + // check whether we hit the wall + if (pr[0] != null && pr[0] > min) { + d = pr[0] - min; + min += d; + max += d; + } + + if (pr[1] != null && pr[1] < max) { + d = pr[1] - max; + min += d; + max += d; + } + } + + opts.min = min; + opts.max = max; + }); + + plot.setupGrid(); + plot.draw(); + + if (!args.preventEvent) + plot.getPlaceholder().trigger("plotpan", [ plot ]); + } + + function shutdown(plot, eventHolder) { + eventHolder.unbind(plot.getOptions().zoom.trigger, onZoomClick); + eventHolder.unbind("mousewheel", onMouseWheel); + eventHolder.unbind("dragstart", onDragStart); + eventHolder.unbind("drag", onDrag); + eventHolder.unbind("dragend", onDragEnd); + if (panTimeout) + clearTimeout(panTimeout); + } + + plot.hooks.bindEvents.push(bindEvents); + plot.hooks.shutdown.push(shutdown); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'navigate', + version: '1.3' + }); +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.navigate.min.js @@ -1,1 +1,1 @@ - +(function(i){i.fn.drag=function(j,k,l){if(k){this.bind("dragstart",j)}if(l){this.bind("dragend",l)}return !j?this.trigger("drag"):this.bind("drag",k?k:j)};var d=i.event,c=d.special,h=c.drag={not:":input",distance:0,which:1,dragging:false,setup:function(j){j=i.extend({distance:h.distance,which:h.which,not:h.not},j||{});j.distance=e(j.distance);d.add(this,"mousedown",f,j);if(this.attachEvent){this.attachEvent("ondragstart",a)}},teardown:function(){d.remove(this,"mousedown",f);if(this===h.dragging){h.dragging=h.proxy=false}g(this,true);if(this.detachEvent){this.detachEvent("ondragstart",a)}}};c.dragstart=c.dragend={setup:function(){},teardown:function(){}};function f(j){var k=this,l,m=j.data||{};if(m.elem){k=j.dragTarget=m.elem;j.dragProxy=h.proxy||k;j.cursorOffsetX=m.pageX-m.left;j.cursorOffsetY=m.pageY-m.top;j.offsetX=j.pageX-j.cursorOffsetX;j.offsetY=j.pageY-j.cursorOffsetY}else{if(h.dragging||(m.which>0&&j.which!=m.which)||i(j.target).is(m.not)){return}}switch(j.type){case"mousedown":i.extend(m,i(k).offset(),{elem:k,target:j.target,pageX:j.pageX,pageY:j.pageY});d.add(document,"mousemove mouseup",f,m);g(k,false);h.dragging=null;return false;case !h.dragging&&"mousemove":if(e(j.pageX-m.pageX)+e(j.pageY-m.pageY)w){var A=B;B=w;w=A}var y=w-B;if(E&&((E[0]!=null&&yE[1]))){return}D.min=B;D.max=w});o.setupGrid();o.draw();if(!q.preventEvent){o.getPlaceholder().trigger("plotzoom",[o])}};o.pan=function(p){var q={x:+p.left,y:+p.top};if(isNaN(q.x)){q.x=0}if(isNaN(q.y)){q.y=0}b.each(o.getAxes(),function(s,u){var v=u.options,t,r,w=q[u.direction];t=u.c2p(u.p2c(u.min)+w),r=u.c2p(u.p2c(u.max)+w);var x=v.panRange;if(x===false){return}if(x){if(x[0]!=null&&x[0]>t){w=x[0]-t;t+=w;r+=w}if(x[1]!=null&&x[1]1) + options.series.pie.tilt=1; + if (options.series.pie.tilt<0) + options.series.pie.tilt=0; + + // add processData hook to do transformations on the data + plot.hooks.processDatapoints.push(processDatapoints); + plot.hooks.drawOverlay.push(drawOverlay); + + // add draw hook + plot.hooks.draw.push(draw); + } + } + + // bind hoverable events + function bindEvents(plot, eventHolder) + { + var options = plot.getOptions(); + + if (options.series.pie.show && options.grid.hoverable) + eventHolder.unbind('mousemove').mousemove(onMouseMove); + + if (options.series.pie.show && options.grid.clickable) + eventHolder.unbind('click').click(onClick); + } + + + // debugging function that prints out an object + function alertObject(obj) + { + var msg = ''; + function traverse(obj, depth) + { + if (!depth) + depth = 0; + for (var i = 0; i < obj.length; ++i) + { + for (var j=0; jcanvas.width-maxRadius) + centerLeft = canvas.width-maxRadius; + } + + function fixData(data) + { + for (var i = 0; i < data.length; ++i) + { + if (typeof(data[i].data)=='number') + data[i].data = [[1,data[i].data]]; + else if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined') + { + if (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined') + data[i].label = data[i].data.label; // fix weirdness coming from flot + data[i].data = [[1,0]]; + + } + } + return data; + } + + function combine(data) + { + data = fixData(data); + calcTotal(data); + var combined = 0; + var numCombined = 0; + var color = options.series.pie.combine.color; + + var newdata = []; + for (var i = 0; i < data.length; ++i) + { + // make sure its a number + data[i].data[0][1] = parseFloat(data[i].data[0][1]); + if (!data[i].data[0][1]) + data[i].data[0][1] = 0; + + if (data[i].data[0][1]/total<=options.series.pie.combine.threshold) + { + combined += data[i].data[0][1]; + numCombined++; + if (!color) + color = data[i].color; + } + else + { + newdata.push({ + data: [[1,data[i].data[0][1]]], + color: data[i].color, + label: data[i].label, + angle: (data[i].data[0][1]*(Math.PI*2))/total, + percent: (data[i].data[0][1]/total*100) + }); + } + } + if (numCombined>0) + newdata.push({ + data: [[1,combined]], + color: color, + label: options.series.pie.combine.label, + angle: (combined*(Math.PI*2))/total, + percent: (combined/total*100) + }); + return newdata; + } + + function draw(plot, newCtx) + { + if (!target) return; // if no series were passed + ctx = newCtx; + + setupPie(); + var slices = plot.getData(); + + var attempts = 0; + while (redraw && attempts0) + maxRadius *= shrink; + attempts += 1; + clear(); + if (options.series.pie.tilt<=0.8) + drawShadow(); + drawPie(); + } + if (attempts >= redrawAttempts) { + clear(); + target.prepend('
Could not draw pie with labels contained inside canvas
'); + } + + if ( plot.setSeries && plot.insertLegend ) + { + plot.setSeries(slices); + plot.insertLegend(); + } + + // we're actually done at this point, just defining internal functions at this point + + function clear() + { + ctx.clearRect(0,0,canvas.width,canvas.height); + target.children().filter('.pieLabel, .pieLabelBackground').remove(); + } + + function drawShadow() + { + var shadowLeft = 5; + var shadowTop = 15; + var edge = 10; + var alpha = 0.02; + + // set radius + if (options.series.pie.radius>1) + var radius = options.series.pie.radius; + else + var radius = maxRadius * options.series.pie.radius; + + if (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge) + return; // shadow would be outside canvas, so don't draw it + + ctx.save(); + ctx.translate(shadowLeft,shadowTop); + ctx.globalAlpha = alpha; + ctx.fillStyle = '#000'; + + // center and rotate to starting position + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + + //radius -= edge; + for (var i=1; i<=edge; i++) + { + ctx.beginPath(); + ctx.arc(0,0,radius,0,Math.PI*2,false); + ctx.fill(); + radius -= i; + } + + ctx.restore(); + } + + function drawPie() + { + startAngle = Math.PI*options.series.pie.startAngle; + + // set radius + if (options.series.pie.radius>1) + var radius = options.series.pie.radius; + else + var radius = maxRadius * options.series.pie.radius; + + // center and rotate to starting position + ctx.save(); + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera + + // draw slices + ctx.save(); + var currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) + { + slices[i].startAngle = currentAngle; + drawSlice(slices[i].angle, slices[i].color, true); + } + ctx.restore(); + + // draw slice outlines + ctx.save(); + ctx.lineWidth = options.series.pie.stroke.width; + currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) + drawSlice(slices[i].angle, options.series.pie.stroke.color, false); + ctx.restore(); + + // draw donut hole + drawDonutHole(ctx); + + // draw labels + if (options.series.pie.label.show) + drawLabels(); + + // restore to original state + ctx.restore(); + + function drawSlice(angle, color, fill) + { + if (angle<=0) + return; + + if (fill) + ctx.fillStyle = color; + else + { + ctx.strokeStyle = color; + ctx.lineJoin = 'round'; + } + + ctx.beginPath(); + if (Math.abs(angle - Math.PI*2) > 0.000000001) + ctx.moveTo(0,0); // Center of the pie + else if ($.browser.msie) + angle -= 0.0001; + //ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera + ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false); + ctx.closePath(); + //ctx.rotate(angle); // This doesn't work properly in Opera + currentAngle += angle; + + if (fill) + ctx.fill(); + else + ctx.stroke(); + } + + function drawLabels() + { + var currentAngle = startAngle; + + // set radius + if (options.series.pie.label.radius>1) + var radius = options.series.pie.label.radius; + else + var radius = maxRadius * options.series.pie.label.radius; + + for (var i = 0; i < slices.length; ++i) + { + if (slices[i].percent >= options.series.pie.label.threshold*100) + drawLabel(slices[i], currentAngle, i); + currentAngle += slices[i].angle; + } + + function drawLabel(slice, startAngle, index) + { + if (slice.data[0][1]==0) + return; + + // format label text + var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; + if (lf) + text = lf(slice.label, slice); + else + text = slice.label; + if (plf) + text = plf(text, slice); + + var halfAngle = ((startAngle+slice.angle) + startAngle)/2; + var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); + var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; + + var html = '' + text + ""; + target.append(html); + var label = target.children('#pieLabel'+index); + var labelTop = (y - label.height()/2); + var labelLeft = (x - label.width()/2); + label.css('top', labelTop); + label.css('left', labelLeft); + + // check to make sure that the label is not outside the canvas + if (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0) + redraw = true; + + if (options.series.pie.label.background.opacity != 0) { + // put in the transparent background separately to avoid blended labels and label boxes + var c = options.series.pie.label.background.color; + if (c == null) { + c = slice.color; + } + var pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;'; + $('
').insertBefore(label).css('opacity', options.series.pie.label.background.opacity); + } + } // end individual label function + } // end drawLabels function + } // end drawPie function + } // end draw function + + // Placed here because it needs to be accessed from multiple locations + function drawDonutHole(layer) + { + // draw donut hole + if(options.series.pie.innerRadius > 0) + { + // subtract the center + layer.save(); + innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; + layer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color + layer.beginPath(); + layer.fillStyle = options.series.pie.stroke.color; + layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.fill(); + layer.closePath(); + layer.restore(); + + // add inner stroke + layer.save(); + layer.beginPath(); + layer.strokeStyle = options.series.pie.stroke.color; + layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.stroke(); + layer.closePath(); + layer.restore(); + // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. + } + } + + //-- Additional Interactive related functions -- + + function isPointInPoly(poly, pt) + { + for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) + ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) + && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) + && (c = !c); + return c; + } + + function findNearbySlice(mouseX, mouseY) + { + var slices = plot.getData(), + options = plot.getOptions(), + radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + for (var i = 0; i < slices.length; ++i) + { + var s = slices[i]; + + if(s.pie.show) + { + ctx.save(); + ctx.beginPath(); + ctx.moveTo(0,0); // Center of the pie + //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. + ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false); + ctx.closePath(); + x = mouseX-centerLeft; + y = mouseY-centerTop; + if(ctx.isPointInPath) + { + if (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop)) + { + //alert('found slice!'); + ctx.restore(); + return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; + } + } + else + { + // excanvas for IE doesn;t support isPointInPath, this is a workaround. + p1X = (radius * Math.cos(s.startAngle)); + p1Y = (radius * Math.sin(s.startAngle)); + p2X = (radius * Math.cos(s.startAngle+(s.angle/4))); + p2Y = (radius * Math.sin(s.startAngle+(s.angle/4))); + p3X = (radius * Math.cos(s.startAngle+(s.angle/2))); + p3Y = (radius * Math.sin(s.startAngle+(s.angle/2))); + p4X = (radius * Math.cos(s.startAngle+(s.angle/1.5))); + p4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5))); + p5X = (radius * Math.cos(s.startAngle+s.angle)); + p5Y = (radius * Math.sin(s.startAngle+s.angle)); + arrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]]; + arrPoint = [x,y]; + // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? + if(isPointInPoly(arrPoly, arrPoint)) + { + ctx.restore(); + return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; + } + } + ctx.restore(); + } + } + + return null; + } + + function onMouseMove(e) + { + triggerClickHoverEvent('plothover', e); + } + + function onClick(e) + { + triggerClickHoverEvent('plotclick', e); + } + + // trigger click or hover event (they send the same parameters so we share their code) + function triggerClickHoverEvent(eventname, e) + { + var offset = plot.offset(), + canvasX = parseInt(e.pageX - offset.left), + canvasY = parseInt(e.pageY - offset.top), + item = findNearbySlice(canvasX, canvasY); + + if (options.grid.autoHighlight) + { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) + { + var h = highlights[i]; + if (h.auto == eventname && !(item && h.series == item.series)) + unhighlight(h.series); + } + } + + // highlight the slice + if (item) + highlight(item.series, eventname); + + // trigger any hover bind events + var pos = { pageX: e.pageX, pageY: e.pageY }; + target.trigger(eventname, [ pos, item ]); + } + + function highlight(s, auto) + { + if (typeof s == "number") + s = series[s]; + + var i = indexOfHighlight(s); + if (i == -1) + { + highlights.push({ series: s, auto: auto }); + plot.triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s) + { + if (s == null) + { + highlights = []; + plot.triggerRedrawOverlay(); + } + + if (typeof s == "number") + s = series[s]; + + var i = indexOfHighlight(s); + if (i != -1) + { + highlights.splice(i, 1); + plot.triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s) + { + for (var i = 0; i < highlights.length; ++i) + { + var h = highlights[i]; + if (h.series == s) + return i; + } + return -1; + } + + function drawOverlay(plot, octx) + { + //alert(options.series.pie.radius); + var options = plot.getOptions(); + //alert(options.series.pie.radius); + + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + octx.save(); + octx.translate(centerLeft, centerTop); + octx.scale(1, options.series.pie.tilt); + + for (i = 0; i < highlights.length; ++i) + drawHighlight(highlights[i].series); + + drawDonutHole(octx); + + octx.restore(); + + function drawHighlight(series) + { + if (series.angle < 0) return; + + //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); + octx.fillStyle = "rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")"; // this is temporary until we have access to parseColor + + octx.beginPath(); + if (Math.abs(series.angle - Math.PI*2) > 0.000000001) + octx.moveTo(0,0); // Center of the pie + octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false); + octx.closePath(); + octx.fill(); + } + + } + + } // end init (plugin body) + + // define pie specific options and their default values + var options = { + series: { + pie: { + show: false, + radius: 'auto', // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) + innerRadius:0, /* for donut */ + startAngle: 3/2, + tilt: 1, + offset: { + top: 0, + left: 'auto' + }, + stroke: { + color: '#FFF', + width: 1 + }, + label: { + show: 'auto', + formatter: function(label, slice){ + return '
'+label+'
'+Math.round(slice.percent)+'%
'; + }, // formatter function + radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) + background: { + color: null, + opacity: 0 + }, + threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) + }, + combine: { + threshold: -1, // percentage at which to combine little slices into one larger slice + color: null, // color to give the new slice (auto-generated if null) + label: 'Other' // label to give the new slice + }, + highlight: { + //color: '#FFF', // will add this functionality once parseColor is available + opacity: 0.5 + } + } + } + }; + + $.plot.plugins.push({ + init: init, + options: options, + name: "pie", + version: "1.0" + }); +})(jQuery); --- /dev/null +++ b/js/flot/jquery.flot.pie.min.js @@ -1,1 +1,1 @@ - +(function(b){function c(D){var h=null;var L=null;var n=null;var B=null;var p=null;var M=0;var F=true;var o=10;var w=0.95;var A=0;var d=false;var z=false;var j=[];D.hooks.processOptions.push(g);D.hooks.bindEvents.push(e);function g(O,N){if(N.series.pie.show){N.grid.show=false;if(N.series.pie.label.show=="auto"){if(N.legend.show){N.series.pie.label.show=false}else{N.series.pie.label.show=true}}if(N.series.pie.radius=="auto"){if(N.series.pie.label.show){N.series.pie.radius=3/4}else{N.series.pie.radius=1}}if(N.series.pie.tilt>1){N.series.pie.tilt=1}if(N.series.pie.tilt<0){N.series.pie.tilt=0}O.hooks.processDatapoints.push(E);O.hooks.drawOverlay.push(H);O.hooks.draw.push(r)}}function e(P,N){var O=P.getOptions();if(O.series.pie.show&&O.grid.hoverable){N.unbind("mousemove").mousemove(t)}if(O.series.pie.show&&O.grid.clickable){N.unbind("click").click(l)}}function G(O){var P="";function N(S,T){if(!T){T=0}for(var R=0;Rh.width-n){B=h.width-n}}}function v(O){for(var N=0;N0){R.push({data:[[1,P]],color:N,label:a.series.pie.combine.label,angle:(P*(Math.PI*2))/M,percent:(P/M*100)})}return R}function r(S,Q){if(!L){return}ctx=Q;I();var T=S.getData();var P=0;while(F&&P0){n*=w}P+=1;N();if(a.series.pie.tilt<=0.8){O()}R()}if(P>=o){N();L.prepend('
Could not draw pie with labels contained inside canvas
')}if(S.setSeries&&S.insertLegend){S.setSeries(T);S.insertLegend()}function N(){ctx.clearRect(0,0,h.width,h.height);L.children().filter(".pieLabel, .pieLabelBackground").remove()}function O(){var Z=5;var Y=15;var W=10;var X=0.02;if(a.series.pie.radius>1){var U=a.series.pie.radius}else{var U=n*a.series.pie.radius}if(U>=(h.width/2)-Z||U*a.series.pie.tilt>=(h.height/2)-Y||U<=W){return}ctx.save();ctx.translate(Z,Y);ctx.globalAlpha=X;ctx.fillStyle="#000";ctx.translate(B,p);ctx.scale(1,a.series.pie.tilt);for(var V=1;V<=W;V++){ctx.beginPath();ctx.arc(0,0,U,0,Math.PI*2,false);ctx.fill();U-=V}ctx.restore()}function R(){startAngle=Math.PI*a.series.pie.startAngle;if(a.series.pie.radius>1){var U=a.series.pie.radius}else{var U=n*a.series.pie.radius}ctx.save();ctx.translate(B,p);ctx.scale(1,a.series.pie.tilt);ctx.save();var Y=startAngle;for(var W=0;W1e-9){ctx.moveTo(0,0)}else{if(b.browser.msie){ab-=0.0001}}ctx.arc(0,0,U,Y,Y+ab,false);ctx.closePath();Y+=ab;if(aa){ctx.fill()}else{ctx.stroke()}}function V(){var ac=startAngle;if(a.series.pie.label.radius>1){var Z=a.series.pie.label.radius}else{var Z=n*a.series.pie.label.radius}for(var ab=0;ab=a.series.pie.label.threshold*100){aa(T[ab],ac,ab)}ac+=T[ab].angle}function aa(ap,ai,ag){if(ap.data[0][1]==0){return}var ar=a.legend.labelFormatter,aq,ae=a.series.pie.label.formatter;if(ar){aq=ar(ap.label,ap)}else{aq=ap.label}if(ae){aq=ae(aq,ap)}var aj=((ai+ap.angle)+ai)/2;var ao=B+Math.round(Math.cos(aj)*Z);var am=p+Math.round(Math.sin(aj)*Z)*a.series.pie.tilt;var af=''+aq+"";L.append(af);var an=L.children("#pieLabel"+ag);var ad=(am-an.height()/2);var ah=(ao-an.width()/2);an.css("top",ad);an.css("left",ah);if(0-ad>0||0-ah>0||h.height-(ad+an.height())<0||h.width-(ah+an.width())<0){F=true}if(a.series.pie.label.background.opacity!=0){var ak=a.series.pie.label.background.color;if(ak==null){ak=ap.color}var al="top:"+ad+"px;left:"+ah+"px;";b('
').insertBefore(an).css("opacity",a.series.pie.label.background.opacity)}}}}}function J(N){if(a.series.pie.innerRadius>0){N.save();innerRadius=a.series.pie.innerRadius>1?a.series.pie.innerRadius:n*a.series.pie.innerRadius;N.globalCompositeOperation="destination-out";N.beginPath();N.fillStyle=a.series.pie.stroke.color;N.arc(0,0,innerRadius,0,Math.PI*2,false);N.fill();N.closePath();N.restore();N.save();N.beginPath();N.strokeStyle=a.series.pie.stroke.color;N.arc(0,0,innerRadius,0,Math.PI*2,false);N.stroke();N.closePath();N.restore()}}function s(Q,R){for(var S=false,P=-1,N=Q.length,O=N-1;++P1?O.series.pie.radius:n*O.series.pie.radius;for(var Q=0;Q1?P.series.pie.radius:n*P.series.pie.radius;R.save();R.translate(B,p);R.scale(1,P.series.pie.tilt);for(i=0;i1e-9){R.moveTo(0,0)}R.arc(0,0,N,S.startAngle,S.startAngle+S.angle,false);R.closePath();R.fill()}}}var a={series:{pie:{show:false,radius:"auto",innerRadius:0,startAngle:3/2,tilt:1,offset:{top:0,left:"auto"},stroke:{color:"#FFF",width:1},label:{show:"auto",formatter:function(d,e){return'
'+d+"
"+Math.round(e.percent)+"%
"},radius:1,background:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,label:"Other"},highlight:{opacity:0.5}}}};b.plot.plugins.push({init:c,options:a,name:"pie",version:"1.0"})})(jQuery); --- /dev/null +++ b/js/flot/jquery.flot.resize.js @@ -1,1 +1,61 @@ +/* +Flot plugin for automatically redrawing plots when the placeholder +size changes, e.g. on window resizes. +It works by listening for changes on the placeholder div (through the +jQuery resize event plugin) - if the size changes, it will redraw the +plot. + +There are no options. If you need to disable the plugin for some +plots, you can just fix the size of their placeholders. +*/ + + +/* Inline dependency: + * jQuery resize event - v1.1 - 3/14/2010 + * http://benalman.com/projects/jquery-resize-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); + + +(function ($) { + var options = { }; // no options + + function init(plot) { + function onResize() { + var placeholder = plot.getPlaceholder(); + + // somebody might have hidden us and we can't plot + // when we don't have the dimensions + if (placeholder.width() == 0 || placeholder.height() == 0) + return; + + plot.resize(); + plot.setupGrid(); + plot.draw(); + } + + function bindEvents(plot, eventHolder) { + plot.getPlaceholder().resize(onResize); + } + + function shutdown(plot, eventHolder) { + plot.getPlaceholder().unbind("resize", onResize); + } + + plot.hooks.bindEvents.push(bindEvents); + plot.hooks.shutdown.push(shutdown); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'resize', + version: '1.0' + }); +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.resize.min.js @@ -1,1 +1,1 @@ - +(function(n,p,u){var w=n([]),s=n.resize=n.extend(n.resize,{}),o,l="setTimeout",m="resize",t=m+"-special-event",v="delay",r="throttleWindow";s[v]=250;s[r]=true;n.event.special[m]={setup:function(){if(!s[r]&&this[l]){return false}var a=n(this);w=w.add(a);n.data(this,t,{w:a.width(),h:a.height()});if(w.length===1){q()}},teardown:function(){if(!s[r]&&this[l]){return false}var a=n(this);w=w.not(a);a.removeData(t);if(!w.length){clearTimeout(o)}},add:function(b){if(!s[r]&&this[l]){return false}var c;function a(d,h,g){var f=n(this),e=n.data(this,t);e.w=h!==u?h:f.width();e.h=g!==u?g:f.height();c.apply(this,arguments)}if(n.isFunction(b)){c=b;return a}else{c=b.handler;b.handler=a}}};function q(){o=p[l](function(){w.each(function(){var d=n(this),a=d.width(),b=d.height(),c=n.data(this,t);if(a!==c.w||b!==c.h){d.trigger(m,[c.w=a,c.h=b])}});q()},s[v])}})(jQuery,this);(function(b){var a={};function c(f){function e(){var h=f.getPlaceholder();if(h.width()==0||h.height()==0){return}f.resize();f.setupGrid();f.draw()}function g(i,h){i.getPlaceholder().resize(e)}function d(i,h){i.getPlaceholder().unbind("resize",e)}f.hooks.bindEvents.push(g);f.hooks.shutdown.push(d)}b.plot.plugins.push({init:c,options:a,name:"resize",version:"1.0"})})(jQuery); --- /dev/null +++ b/js/flot/jquery.flot.selection.js @@ -1,1 +1,345 @@ - +/* +Flot plugin for selecting regions. + +The plugin defines the following options: + + selection: { + mode: null or "x" or "y" or "xy", + color: color + } + +Selection support is enabled by setting the mode to one of "x", "y" or +"xy". In "x" mode, the user will only be able to specify the x range, +similarly for "y" mode. For "xy", the selection becomes a rectangle +where both ranges can be specified. "color" is color of the selection +(if you need to change the color later on, you can get to it with +plot.getOptions().selection.color). + +When selection support is enabled, a "plotselected" event will be +emitted on the DOM element you passed into the plot function. The +event handler gets a parameter with the ranges selected on the axes, +like this: + + placeholder.bind("plotselected", function(event, ranges) { + alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to) + // similar for yaxis - with multiple axes, the extra ones are in + // x2axis, x3axis, ... + }); + +The "plotselected" event is only fired when the user has finished +making the selection. A "plotselecting" event is fired during the +process with the same parameters as the "plotselected" event, in case +you want to know what's happening while it's happening, + +A "plotunselected" event with no arguments is emitted when the user +clicks the mouse to remove the selection. + +The plugin allso adds the following methods to the plot object: + +- setSelection(ranges, preventEvent) + + Set the selection rectangle. The passed in ranges is on the same + form as returned in the "plotselected" event. If the selection mode + is "x", you should put in either an xaxis range, if the mode is "y" + you need to put in an yaxis range and both xaxis and yaxis if the + selection mode is "xy", like this: + + setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } }); + + setSelection will trigger the "plotselected" event when called. If + you don't want that to happen, e.g. if you're inside a + "plotselected" handler, pass true as the second parameter. If you + are using multiple axes, you can specify the ranges on any of those, + e.g. as x2axis/x3axis/... instead of xaxis, the plugin picks the + first one it sees. + +- clearSelection(preventEvent) + + Clear the selection rectangle. Pass in true to avoid getting a + "plotunselected" event. + +- getSelection() + + Returns the current selection in the same format as the + "plotselected" event. If there's currently no selection, the + function returns null. + +*/ + +(function ($) { + function init(plot) { + var selection = { + first: { x: -1, y: -1}, second: { x: -1, y: -1}, + show: false, + active: false + }; + + // FIXME: The drag handling implemented here should be + // abstracted out, there's some similar code from a library in + // the navigation plugin, this should be massaged a bit to fit + // the Flot cases here better and reused. Doing this would + // make this plugin much slimmer. + var savedhandlers = {}; + + var mouseUpHandler = null; + + function onMouseMove(e) { + if (selection.active) { + updateSelection(e); + + plot.getPlaceholder().trigger("plotselecting", [ getSelection() ]); + } + } + + function onMouseDown(e) { + if (e.which != 1) // only accept left-click + return; + + // cancel out any text selections + document.body.focus(); + + // prevent text selection and drag in old-school browsers + if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) { + savedhandlers.onselectstart = document.onselectstart; + document.onselectstart = function () { return false; }; + } + if (document.ondrag !== undefined && savedhandlers.ondrag == null) { + savedhandlers.ondrag = document.ondrag; + document.ondrag = function () { return false; }; + } + + setSelectionPos(selection.first, e); + + selection.active = true; + + // this is a bit silly, but we have to use a closure to be + // able to whack the same handler again + mouseUpHandler = function (e) { onMouseUp(e); }; + + $(document).one("mouseup", mouseUpHandler); + } + + function onMouseUp(e) { + mouseUpHandler = null; + + // revert drag stuff for old-school browsers + if (document.onselectstart !== undefined) + document.onselectstart = savedhandlers.onselectstart; + if (document.ondrag !== undefined) + document.ondrag = savedhandlers.ondrag; + + // no more dragging + selection.active = false; + updateSelection(e); + + if (selectionIsSane()) + triggerSelectedEvent(); + else { + // this counts as a clear + plot.getPlaceholder().trigger("plotunselected", [ ]); + plot.getPlaceholder().trigger("plotselecting", [ null ]); + } + + return false; + } + + function getSelection() { + if (!selectionIsSane()) + return null; + + var r = {}, c1 = selection.first, c2 = selection.second; + $.each(plot.getAxes(), function (name, axis) { + if (axis.used) { + var p1 = axis.c2p(c1[axis.direction]), p2 = axis.c2p(c2[axis.direction]); + r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) }; + } + }); + return r; + } + + function triggerSelectedEvent() { + var r = getSelection(); + + plot.getPlaceholder().trigger("plotselected", [ r ]); + + // backwards-compat stuff, to be removed in future + if (r.xaxis && r.yaxis) + plot.getPlaceholder().trigger("selected", [ { x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to } ]); + } + + function clamp(min, value, max) { + return value < min ? min: (value > max ? max: value); + } + + function setSelectionPos(pos, e) { + var o = plot.getOptions(); + var offset = plot.getPlaceholder().offset(); + var plotOffset = plot.getPlotOffset(); + pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width()); + pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height()); + + if (o.selection.mode == "y") + pos.x = pos == selection.first ? 0 : plot.width(); + + if (o.selection.mode == "x") + pos.y = pos == selection.first ? 0 : plot.height(); + } + + function updateSelection(pos) { + if (pos.pageX == null) + return; + + setSelectionPos(selection.second, pos); + if (selectionIsSane()) { + selection.show = true; + plot.triggerRedrawOverlay(); + } + else + clearSelection(true); + } + + function clearSelection(preventEvent) { + if (selection.show) { + selection.show = false; + plot.triggerRedrawOverlay(); + if (!preventEvent) + plot.getPlaceholder().trigger("plotunselected", [ ]); + } + } + + // function taken from markings support in Flot + function extractRange(ranges, coord) { + var axis, from, to, key, axes = plot.getAxes(); + + for (var k in axes) { + axis = axes[k]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? plot.getXAxes()[0] : plot.getYAxes()[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function setSelection(ranges, preventEvent) { + var axis, range, o = plot.getOptions(); + + if (o.selection.mode == "y") { + selection.first.x = 0; + selection.second.x = plot.width(); + } + else { + range = extractRange(ranges, "x"); + + selection.first.x = range.axis.p2c(range.from); + selection.second.x = range.axis.p2c(range.to); + } + + if (o.selection.mode == "x") { + selection.first.y = 0; + selection.second.y = plot.height(); + } + else { + range = extractRange(ranges, "y"); + + selection.first.y = range.axis.p2c(range.from); + selection.second.y = range.axis.p2c(range.to); + } + + selection.show = true; + plot.triggerRedrawOverlay(); + if (!preventEvent && selectionIsSane()) + triggerSelectedEvent(); + } + + function selectionIsSane() { + var minSize = 5; + return Math.abs(selection.second.x - selection.first.x) >= minSize && + Math.abs(selection.second.y - selection.first.y) >= minSize; + } + + plot.clearSelection = clearSelection; + plot.setSelection = setSelection; + plot.getSelection = getSelection; + + plot.hooks.bindEvents.push(function(plot, eventHolder) { + var o = plot.getOptions(); + if (o.selection.mode != null) { + eventHolder.mousemove(onMouseMove); + eventHolder.mousedown(onMouseDown); + } + }); + + + plot.hooks.drawOverlay.push(function (plot, ctx) { + // draw selection + if (selection.show && selectionIsSane()) { + var plotOffset = plot.getPlotOffset(); + var o = plot.getOptions(); + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var c = $.color.parse(o.selection.color); + + ctx.strokeStyle = c.scale('a', 0.8).toString(); + ctx.lineWidth = 1; + ctx.lineJoin = "round"; + ctx.fillStyle = c.scale('a', 0.4).toString(); + + var x = Math.min(selection.first.x, selection.second.x), + y = Math.min(selection.first.y, selection.second.y), + w = Math.abs(selection.second.x - selection.first.x), + h = Math.abs(selection.second.y - selection.first.y); + + ctx.fillRect(x, y, w, h); + ctx.strokeRect(x, y, w, h); + + ctx.restore(); + } + }); + + plot.hooks.shutdown.push(function (plot, eventHolder) { + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mousedown", onMouseDown); + + if (mouseUpHandler) + $(document).unbind("mouseup", mouseUpHandler); + }); + + } + + $.plot.plugins.push({ + init: init, + options: { + selection: { + mode: null, // one of null, "x", "y" or "xy" + color: "#e8cfac" + } + }, + name: 'selection', + version: '1.1' + }); +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.selection.min.js @@ -1,1 +1,1 @@ - +(function(a){function b(k){var p={first:{x:-1,y:-1},second:{x:-1,y:-1},show:false,active:false};var m={};var r=null;function e(s){if(p.active){l(s);k.getPlaceholder().trigger("plotselecting",[g()])}}function n(s){if(s.which!=1){return}document.body.focus();if(document.onselectstart!==undefined&&m.onselectstart==null){m.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!==undefined&&m.ondrag==null){m.ondrag=document.ondrag;document.ondrag=function(){return false}}d(p.first,s);p.active=true;r=function(t){j(t)};a(document).one("mouseup",r)}function j(s){r=null;if(document.onselectstart!==undefined){document.onselectstart=m.onselectstart}if(document.ondrag!==undefined){document.ondrag=m.ondrag}p.active=false;l(s);if(f()){i()}else{k.getPlaceholder().trigger("plotunselected",[]);k.getPlaceholder().trigger("plotselecting",[null])}return false}function g(){if(!f()){return null}var u={},t=p.first,s=p.second;a.each(k.getAxes(),function(v,w){if(w.used){var y=w.c2p(t[w.direction]),x=w.c2p(s[w.direction]);u[v]={from:Math.min(y,x),to:Math.max(y,x)}}});return u}function i(){var s=g();k.getPlaceholder().trigger("plotselected",[s]);if(s.xaxis&&s.yaxis){k.getPlaceholder().trigger("selected",[{x1:s.xaxis.from,y1:s.yaxis.from,x2:s.xaxis.to,y2:s.yaxis.to}])}}function h(t,u,s){return us?s:u)}function d(w,t){var v=k.getOptions();var u=k.getPlaceholder().offset();var s=k.getPlotOffset();w.x=h(0,t.pageX-u.left-s.left,k.width());w.y=h(0,t.pageY-u.top-s.top,k.height());if(v.selection.mode=="y"){w.x=w==p.first?0:k.width()}if(v.selection.mode=="x"){w.y=w==p.first?0:k.height()}}function l(s){if(s.pageX==null){return}d(p.second,s);if(f()){p.show=true;k.triggerRedrawOverlay()}else{q(true)}}function q(s){if(p.show){p.show=false;k.triggerRedrawOverlay();if(!s){k.getPlaceholder().trigger("plotunselected",[])}}}function c(s,w){var t,y,z,A,x=k.getAxes();for(var u in x){t=x[u];if(t.direction==w){A=w+t.n+"axis";if(!s[A]&&t.n==1){A=w+"axis"}if(s[A]){y=s[A].from;z=s[A].to;break}}}if(!s[A]){t=w=="x"?k.getXAxes()[0]:k.getYAxes()[0];y=s[w+"1"];z=s[w+"2"]}if(y!=null&&z!=null&&y>z){var v=y;y=z;z=v}return{from:y,to:z,axis:t}}function o(t,s){var v,u,w=k.getOptions();if(w.selection.mode=="y"){p.first.x=0;p.second.x=k.width()}else{u=c(t,"x");p.first.x=u.axis.p2c(u.from);p.second.x=u.axis.p2c(u.to)}if(w.selection.mode=="x"){p.first.y=0;p.second.y=k.height()}else{u=c(t,"y");p.first.y=u.axis.p2c(u.from);p.second.y=u.axis.p2c(u.to)}p.show=true;k.triggerRedrawOverlay();if(!s&&f()){i()}}function f(){var s=5;return Math.abs(p.second.x-p.first.x)>=s&&Math.abs(p.second.y-p.first.y)>=s}k.clearSelection=q;k.setSelection=o;k.getSelection=g;k.hooks.bindEvents.push(function(t,s){var u=t.getOptions();if(u.selection.mode!=null){s.mousemove(e);s.mousedown(n)}});k.hooks.drawOverlay.push(function(v,D){if(p.show&&f()){var t=v.getPlotOffset();var s=v.getOptions();D.save();D.translate(t.left,t.top);var z=a.color.parse(s.selection.color);D.strokeStyle=z.scale("a",0.8).toString();D.lineWidth=1;D.lineJoin="round";D.fillStyle=z.scale("a",0.4).toString();var B=Math.min(p.first.x,p.second.x),A=Math.min(p.first.y,p.second.y),C=Math.abs(p.second.x-p.first.x),u=Math.abs(p.second.y-p.first.y);D.fillRect(B,A,C,u);D.strokeRect(B,A,C,u);D.restore()}});k.hooks.shutdown.push(function(t,s){s.unbind("mousemove",e);s.unbind("mousedown",n);if(r){a(document).unbind("mouseup",r)}})}a.plot.plugins.push({init:b,options:{selection:{mode:null,color:"#e8cfac"}},name:"selection",version:"1.1"})})(jQuery); --- /dev/null +++ b/js/flot/jquery.flot.stack.js @@ -1,1 +1,185 @@ +/* +Flot plugin for stacking data sets, i.e. putting them on top of each +other, for accumulative graphs. +The plugin assumes the data is sorted on x (or y if stacking +horizontally). For line charts, it is assumed that if a line has an +undefined gap (from a null point), then the line above it should have +the same gap - insert zeros instead of "null" if you want another +behaviour. This also holds for the start and end of the chart. Note +that stacking a mix of positive and negative values in most instances +doesn't make sense (so it looks weird). + +Two or more series are stacked when their "stack" attribute is set to +the same key (which can be any number or string or just "true"). To +specify the default stack, you can set + + series: { + stack: null or true or key (number/string) + } + +or specify it for a specific series + + $.plot($("#placeholder"), [{ data: [ ... ], stack: true }]) + +The stacking order is determined by the order of the data series in +the array (later series end up on top of the previous). + +Internally, the plugin modifies the datapoints in each series, adding +an offset to the y value. For line series, extra data points are +inserted through interpolation. If there's a second y value, it's also +adjusted (e.g for bar charts or filled areas). +*/ + +(function ($) { + var options = { + series: { stack: null } // or number/string + }; + + function init(plot) { + function findMatchingSeries(s, allseries) { + var res = null + for (var i = 0; i < allseries.length; ++i) { + if (s == allseries[i]) + break; + + if (allseries[i].stack == s.stack) + res = allseries[i]; + } + + return res; + } + + function stackData(plot, s, datapoints) { + if (s.stack == null) + return; + + var other = findMatchingSeries(s, plot.getData()); + if (!other) + return; + + var ps = datapoints.pointsize, + points = datapoints.points, + otherps = other.datapoints.pointsize, + otherpoints = other.datapoints.points, + newpoints = [], + px, py, intery, qx, qy, bottom, + withlines = s.lines.show, + horizontal = s.bars.horizontal, + withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y), + withsteps = withlines && s.lines.steps, + fromgap = true, + keyOffset = horizontal ? 1 : 0, + accumulateOffset = horizontal ? 0 : 1, + i = 0, j = 0, l; + + while (true) { + if (i >= points.length) + break; + + l = newpoints.length; + + if (points[i] == null) { + // copy gaps + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + i += ps; + } + else if (j >= otherpoints.length) { + // for lines, we can't use the rest of the points + if (!withlines) { + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + } + i += ps; + } + else if (otherpoints[j] == null) { + // oops, got a gap + for (m = 0; m < ps; ++m) + newpoints.push(null); + fromgap = true; + j += otherps; + } + else { + // cases where we actually got two points + px = points[i + keyOffset]; + py = points[i + accumulateOffset]; + qx = otherpoints[j + keyOffset]; + qy = otherpoints[j + accumulateOffset]; + bottom = 0; + + if (px == qx) { + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + + newpoints[l + accumulateOffset] += qy; + bottom = qy; + + i += ps; + j += otherps; + } + else if (px > qx) { + // we got past point below, might need to + // insert interpolated extra point + if (withlines && i > 0 && points[i - ps] != null) { + intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px); + newpoints.push(qx); + newpoints.push(intery + qy); + for (m = 2; m < ps; ++m) + newpoints.push(points[i + m]); + bottom = qy; + } + + j += otherps; + } + else { // px < qx + if (fromgap && withlines) { + // if we come from a gap, we just skip this point + i += ps; + continue; + } + + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + + // we might be able to interpolate a point below, + // this can give us a better y + if (withlines && j > 0 && otherpoints[j - otherps] != null) + bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx); + + newpoints[l + accumulateOffset] += bottom; + + i += ps; + } + + fromgap = false; + + if (l != newpoints.length && withbottom) + newpoints[l + 2] += bottom; + } + + // maintain the line steps invariant + if (withsteps && l != newpoints.length && l > 0 + && newpoints[l] != null + && newpoints[l] != newpoints[l - ps] + && newpoints[l + 1] != newpoints[l - ps + 1]) { + for (m = 0; m < ps; ++m) + newpoints[l + ps + m] = newpoints[l + m]; + newpoints[l + 1] = newpoints[l - ps + 1]; + } + } + + datapoints.points = newpoints; + } + + plot.hooks.processDatapoints.push(stackData); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'stack', + version: '1.2' + }); +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.stack.min.js @@ -1,1 +1,1 @@ - +(function(b){var a={series:{stack:null}};function c(f){function d(k,j){var h=null;for(var g=0;g2&&(G?g.format[2].x:g.format[2].y),n=u&&v.lines.steps,E=true,q=G?1:0,H=G?0:1,D=0,B=0,A;while(true){if(D>=F.length){break}A=t.length;if(F[D]==null){for(m=0;m=y.length){if(!u){for(m=0;mJ){if(u&&D>0&&F[D-z]!=null){k=w+(F[D-z+H]-w)*(J-x)/(F[D-z+q]-x);t.push(J);t.push(k+I);for(m=2;m0&&y[B-h]!=null){r=I+(y[B-h+H]-I)*(x-J)/(y[B-h+q]-J)}t[A+H]+=r;D+=z}}E=false;if(A!=t.length&&o){t[A+2]+=r}}}}if(n&&A!=t.length&&A>0&&t[A]!=null&&t[A]!=t[A-z]&&t[A+1]!=t[A-z+1]){for(m=0;m s = r * sqrt(pi)/2 + var size = radius * Math.sqrt(Math.PI) / 2; + ctx.rect(x - size, y - size, size + size, size + size); + }, + diamond: function (ctx, x, y, radius, shadow) { + // pi * r^2 = 2s^2 => s = r * sqrt(pi/2) + var size = radius * Math.sqrt(Math.PI / 2); + ctx.moveTo(x - size, y); + ctx.lineTo(x, y - size); + ctx.lineTo(x + size, y); + ctx.lineTo(x, y + size); + ctx.lineTo(x - size, y); + }, + triangle: function (ctx, x, y, radius, shadow) { + // pi * r^2 = 1/2 * s^2 * sin (pi / 3) => s = r * sqrt(2 * pi / sin(pi / 3)) + var size = radius * Math.sqrt(2 * Math.PI / Math.sin(Math.PI / 3)); + var height = size * Math.sin(Math.PI / 3); + ctx.moveTo(x - size/2, y + height/2); + ctx.lineTo(x + size/2, y + height/2); + if (!shadow) { + ctx.lineTo(x, y - height/2); + ctx.lineTo(x - size/2, y + height/2); + } + }, + cross: function (ctx, x, y, radius, shadow) { + // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 + var size = radius * Math.sqrt(Math.PI) / 2; + ctx.moveTo(x - size, y - size); + ctx.lineTo(x + size, y + size); + ctx.moveTo(x - size, y + size); + ctx.lineTo(x + size, y - size); + } + } + + var s = series.points.symbol; + if (handlers[s]) + series.points.symbol = handlers[s]; + } + + function init(plot) { + plot.hooks.processDatapoints.push(processRawData); + } + + $.plot.plugins.push({ + init: init, + name: 'symbols', + version: '1.0' + }); +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.symbol.min.js @@ -1,1 +1,1 @@ - +(function(b){function a(h,e,g){var d={square:function(k,j,n,i,m){var l=i*Math.sqrt(Math.PI)/2;k.rect(j-l,n-l,l+l,l+l)},diamond:function(k,j,n,i,m){var l=i*Math.sqrt(Math.PI/2);k.moveTo(j-l,n);k.lineTo(j,n-l);k.lineTo(j+l,n);k.lineTo(j,n+l);k.lineTo(j-l,n)},triangle:function(l,k,o,j,n){var m=j*Math.sqrt(2*Math.PI/Math.sin(Math.PI/3));var i=m*Math.sin(Math.PI/3);l.moveTo(k-m/2,o+i/2);l.lineTo(k+m/2,o+i/2);if(!n){l.lineTo(k,o-i/2);l.lineTo(k-m/2,o+i/2)}},cross:function(k,j,n,i,m){var l=i*Math.sqrt(Math.PI)/2;k.moveTo(j-l,n-l);k.lineTo(j+l,n+l);k.moveTo(j-l,n+l);k.lineTo(j+l,n-l)}};var f=e.points.symbol;if(d[f]){e.points.symbol=d[f]}}function c(d){d.hooks.processDatapoints.push(a)}b.plot.plugins.push({init:c,name:"symbols",version:"1.0"})})(jQuery); --- /dev/null +++ b/js/flot/jquery.flot.threshold.js @@ -1,1 +1,104 @@ +/* +Flot plugin for thresholding data. Controlled through the option +"threshold" in either the global series options + series: { + threshold: { + below: number + color: colorspec + } + } + +or in a specific series + + $.plot($("#placeholder"), [{ data: [ ... ], threshold: { ... }}]) + +The data points below "below" are drawn with the specified color. This +makes it easy to mark points below 0, e.g. for budget data. + +Internally, the plugin works by splitting the data into two series, +above and below the threshold. The extra series below the threshold +will have its label cleared and the special "originSeries" attribute +set to the original series. You may need to check for this in hover +events. +*/ + +(function ($) { + var options = { + series: { threshold: null } // or { below: number, color: color spec} + }; + + function init(plot) { + function thresholdData(plot, s, datapoints) { + if (!s.threshold) + return; + + var ps = datapoints.pointsize, i, x, y, p, prevp, + thresholded = $.extend({}, s); // note: shallow copy + + thresholded.datapoints = { points: [], pointsize: ps }; + thresholded.label = null; + thresholded.color = s.threshold.color; + thresholded.threshold = null; + thresholded.originSeries = s; + thresholded.data = []; + + var below = s.threshold.below, + origpoints = datapoints.points, + addCrossingPoints = s.lines.show; + + threspoints = []; + newpoints = []; + + for (i = 0; i < origpoints.length; i += ps) { + x = origpoints[i] + y = origpoints[i + 1]; + + prevp = p; + if (y < below) + p = threspoints; + else + p = newpoints; + + if (addCrossingPoints && prevp != p && x != null + && i > 0 && origpoints[i - ps] != null) { + var interx = (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]) * (below - y) + x; + prevp.push(interx); + prevp.push(below); + for (m = 2; m < ps; ++m) + prevp.push(origpoints[i + m]); + + p.push(null); // start new segment + p.push(null); + for (m = 2; m < ps; ++m) + p.push(origpoints[i + m]); + p.push(interx); + p.push(below); + for (m = 2; m < ps; ++m) + p.push(origpoints[i + m]); + } + + p.push(x); + p.push(y); + } + + datapoints.points = newpoints; + thresholded.datapoints.points = threspoints; + + if (thresholded.datapoints.points.length > 0) + plot.getData().push(thresholded); + + // FIXME: there are probably some edge cases left in bars + } + + plot.hooks.processDatapoints.push(thresholdData); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'threshold', + version: '1.0' + }); +})(jQuery); + --- /dev/null +++ b/js/flot/jquery.flot.threshold.min.js @@ -1,1 +1,1 @@ - +(function(B){var A={series:{threshold:null}};function C(D){function E(L,S,M){if(!S.threshold){return }var F=M.pointsize,I,O,N,G,K,H=B.extend({},S);H.datapoints={points:[],pointsize:F};H.label=null;H.color=S.threshold.color;H.threshold=null;H.originSeries=S;H.data=[];var P=S.threshold.below,Q=M.points,R=S.lines.show;threspoints=[];newpoints=[];for(I=0;I0&&Q[I-F]!=null){var J=(O-Q[I-F])/(N-Q[I-F+1])*(P-N)+O;K.push(J);K.push(P);for(m=2;m0){L.getData().push(H)}}D.hooks.processDatapoints.push(E)}B.plot.plugins.push({init:C,options:A,name:"threshold",version:"1.0"})})(jQuery); --- a/js/flotr/flotr-0.2.0-alpha.js +++ /dev/null @@ -1,2 +1,1 @@ -//Flotr 0.2.0-alpha Copyright (c) 2009 Bas Wenneker, , MIT License. -var Flotr={version:"0.2.0-alpha",author:"Bas Wenneker",website:"http://www.solutoire.com",_registeredTypes:{lines:"drawSeriesLines",points:"drawSeriesPoints",bars:"drawSeriesBars",candles:"drawSeriesCandles",pie:"drawSeriesPie"},register:function(A,B){Flotr._registeredTypes[A]=B+""},draw:function(B,D,A,C){C=C||Flotr.Graph;return new C(B,D,A)},getSeries:function(A){return A.collect(function(C){var B,C=(C.data)?Object.clone(C):{data:C};for(B=C.data.length-1;B>-1;--B){C.data[B][1]=(C.data[B][1]===null?null:parseFloat(C.data[B][1]))}return C})},merge:function(D,B){var A=B||{};for(var C in D){A[C]=(D[C]!=null&&typeof (D[C])=="object"&&!(D[C].constructor==Array||D[C].constructor==RegExp)&&!Object.isElement(D[C]))?Flotr.merge(D[C],B[C]):A[C]=D[C]}return A},getTickSize:function(E,D,A,B){var H=(A-D)/E;var G=Flotr.getMagnitude(H);var C=H/G;var F=10;if(C<1.5){F=1}else{if(C<2.25){F=2}else{if(C<3){F=((B==0)?2:2.5)}else{if(C<7.5){F=5}}}}return F*G},defaultTickFormatter:function(A){return A+""},defaultTrackFormatter:function(A){return"("+A.x+", "+A.y+")"},defaultPieLabelFormatter:function(A){return(A.fraction*100).toFixed(2)+"%"},getMagnitude:function(A){return Math.pow(10,Math.floor(Math.log(A)/Math.LN10))},toPixel:function(A){return Math.floor(A)+0.5},toRad:function(A){return -A*(Math.PI/180)},parseColor:function(D){if(D instanceof Flotr.Color){return D}var A,C=Flotr.Color;if((A=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(D))){return new C(parseInt(A[1]),parseInt(A[2]),parseInt(A[3]))}if((A=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(D))){return new C(parseInt(A[1]),parseInt(A[2]),parseInt(A[3]),parseFloat(A[4]))}if((A=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(D))){return new C(parseFloat(A[1])*2.55,parseFloat(A[2])*2.55,parseFloat(A[3])*2.55)}if((A=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(D))){return new C(parseFloat(A[1])*2.55,parseFloat(A[2])*2.55,parseFloat(A[3])*2.55,parseFloat(A[4]))}if((A=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(D))){return new C(parseInt(A[1],16),parseInt(A[2],16),parseInt(A[3],16))}if((A=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(D))){return new C(parseInt(A[1]+A[1],16),parseInt(A[2]+A[2],16),parseInt(A[3]+A[3],16))}var B=D.strip().toLowerCase();if(B=="transparent"){return new C(255,255,255,0)}return((A=C.lookupColors[B]))?new C(A[0],A[1],A[2]):false},extractColor:function(B){var A;do{A=B.getStyle("background-color").toLowerCase();if(!(A==""||A=="transparent")){break}B=B.up(0)}while(!B.nodeName.match(/^body$/i));return(A=="rgba(0, 0, 0, 0)")?"transparent":A}};Flotr.Graph=Class.create({initialize:function(B,C,A){this.el=$(B);if(!this.el){throw"The target container doesn't exist"}this.data=C;this.series=Flotr.getSeries(C);this.setOptions(A);this.lastMousePos={pageX:null,pageY:null};this.selection={first:{x:-1,y:-1},second:{x:-1,y:-1}};this.prevSelection=null;this.selectionInterval=null;this.ignoreClick=false;this.prevHit=null;this.constructCanvas();this.initEvents();this.findDataRanges();this.calculateTicks(this.axes.x);this.calculateTicks(this.axes.x2);this.calculateTicks(this.axes.y);this.calculateTicks(this.axes.y2);this.calculateSpacing();this.draw();this.insertLegend();if(this.options.spreadsheet.show){this.constructTabs()}},setOptions:function(B){var P={colors:["#00A8F0","#C0D800","#CB4B4B","#4DA74D","#9440ED"],title:null,subtitle:null,legend:{show:true,noColumns:1,labelFormatter:Prototype.K,labelBoxBorderColor:"#CCCCCC",labelBoxWidth:14,labelBoxHeight:10,labelBoxMargin:5,container:null,position:"nw",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{ticks:null,showLabels:true,labelsAngle:0,title:null,titleAngle:0,noTicks:5,tickFormatter:Flotr.defaultTickFormatter,tickDecimals:null,min:null,max:null,autoscaleMargin:0,color:null},x2axis:{},yaxis:{ticks:null,showLabels:true,labelsAngle:0,title:null,titleAngle:90,noTicks:5,tickFormatter:Flotr.defaultTickFormatter,tickDecimals:null,min:null,max:null,autoscaleMargin:0,color:null},y2axis:{titleAngle:270},points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#FFFFFF",fillOpacity:0.4},lines:{show:false,lineWidth:2,fill:false,fillColor:null,fillOpacity:0.4},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,fillOpacity:0.4,horizontal:false,stacked:false},candles:{show:false,lineWidth:1,wickLineWidth:1,candleWidth:0.6,fill:true,upFillColor:"#00A8F0",downFillColor:"#CB4B4B",fillOpacity:0.5,barcharts:false},pie:{show:false,lineWidth:1,fill:true,fillColor:null,fillOpacity:0.6,explode:6,sizeRatio:0.6,startAngle:Math.PI/4,labelFormatter:Flotr.defaultPieLabelFormatter,pie3D:false,pie3DviewAngle:(Math.PI/2*0.8),pie3DspliceThickness:20},grid:{color:"#545454",backgroundColor:null,tickColor:"#DDDDDD",labelMargin:3,verticalLines:true,horizontalLines:true,outlineWidth:2},selection:{mode:null,color:"#B6D9FF",fps:20},mouse:{track:false,position:"se",relative:false,trackFormatter:Flotr.defaultTrackFormatter,margin:5,lineColor:"#FF3F19",trackDecimals:1,sensibility:2,radius:3},shadowSize:4,defaultType:"lines",HtmlText:true,fontSize:7.5,spreadsheet:{show:false,tabGraphLabel:"Graph",tabDataLabel:"Data",toolbarDownload:"Download CSV",toolbarSelectAll:"Select all"}};P.x2axis=Object.extend(Object.clone(P.xaxis),P.x2axis);P.y2axis=Object.extend(Object.clone(P.yaxis),P.y2axis);this.options=Flotr.merge((B||{}),P);this.axes={x:{options:this.options.xaxis,n:1},x2:{options:this.options.x2axis,n:2},y:{options:this.options.yaxis,n:1},y2:{options:this.options.y2axis,n:2}};var H=[],C=[],K=this.series.length,N=this.series.length,D=this.options.colors,A=[],G=0,M,J,I,O,E;for(J=N-1;J>-1;--J){M=this.series[J].color;if(M!=null){--N;if(Object.isNumber(M)){H.push(M)}else{A.push(Flotr.parseColor(M))}}}for(J=H.length-1;J>-1;--J){N=Math.max(N,H[J]+1)}for(J=0;C.length=D.length){J=0;++G}}for(J=0,I=0;J'+F+"").select(".flotr-dummy-div")[0];dim=A.getDimensions();A.remove();return dim}},loadDataGrid:function(){if(this.seriesData){return this.seriesData}var A=this.series;var B=[];for(i=0;i"];var F=[''];F.push(" ");for(D=0;D'+(L[D].label||String.fromCharCode(65+D))+"");C.push("")}F.push("");for(B=0;B");for(D=0;D"+G+"")}F.push("")}C.push("");K.update(C.join("")+F.join(""));if(!Prototype.Browser.IE){K.select("td").each(function(N){N.observe("mouseover",function(O){N=O.element();var P=N.previousSiblings();K.select("th[scope=col]")[P.length-1].addClassName("hover");K.select("colgroup col")[P.length].addClassName("hover")});N.observe("mouseout",function(){K.select("colgroup col.hover, th.hover").each(function(O){O.removeClassName("hover")})})})}var H=new Element("div",{className:"flotr-datagrid-toolbar"}).insert(new Element("button",{type:"button",className:"flotr-datagrid-toolbar-button"}).update(this.options.spreadsheet.toolbarDownload).observe("click",this.downloadCSV.bind(this))).insert(new Element("button",{type:"button",className:"flotr-datagrid-toolbar-button"}).update(this.options.spreadsheet.toolbarSelectAll).observe("click",this.selectAllData.bind(this)));var A=new Element("div",{className:"flotr-datagrid-container",style:"left:0px;top:0px;width:"+this.canvasWidth+"px;height:"+this.canvasHeight+"px;overflow:auto;"});A.insert(H);K.wrap(A.hide());this.el.insert(A);return K},selectAllData:function(){if(this.tabs){var B,A,E,D,C=this.constructDataGrid();this.showTab("data");(function(){if((E=C.ownerDocument)&&(D=E.defaultView)&&D.getSelection&&E.createRange&&(B=window.getSelection())&&B.removeAllRanges){A=E.createRange();A.selectNode(C);B.removeAllRanges();B.addRange(A)}else{if(document.body&&document.body.createTextRange&&(A=document.body.createTextRange())){A.moveToElementText(C);A.select()}}}).defer();return true}else{return false}},downloadCSV:function(){var D,A='"x"',C=this.series,E=this.loadDataGrid();for(D=0;D0){var C,A,D,H,F,B,I,E;for(C=0;C0&&!J[C].hide){if(!I.used){I.datamin=I.datamax=B[0][0]}if(!E.used){E.datamin=E.datamax=B[0][1]}I.used=true;E.used=true;for(D=B.length-1;D>-1;--D){H=B[D][0];if(HI.datamax){I.datamax=H}}for(A=1;AE.datamax){E.datamax=F}}}}}}}this.findXAxesValues();this.calculateRange(G.x);this.extendXRangeIfNeededByBar(G.x);if(G.x2.used){this.calculateRange(G.x2);this.extendXRangeIfNeededByBar(G.x2)}this.calculateRange(G.y);this.extendYRangeIfNeededByBar(G.y);if(G.y2.used){this.calculateRange(G.y2);this.extendYRangeIfNeededByBar(G.y2)}},calculateRange:function(D){var F=D.options,C=F.min!=null?F.min:D.datamin,A=F.max!=null?F.max:D.datamax,E;if(A-C==0){var B=(A==0)?1:0.01;C-=B;A+=B}D.tickSize=Flotr.getTickSize(F.noTicks,C,A,F.tickDecimals);if(F.min==null){E=F.autoscaleMargin;if(E!=0){C-=D.tickSize*E;if(C<0&&D.datamin>=0){C=0}C=D.tickSize*Math.floor(C/D.tickSize)}}if(F.max==null){E=F.autoscaleMargin;if(E!=0){A+=D.tickSize*E;if(A>0&&D.datamax<=0){A=0}A=D.tickSize*Math.ceil(A/D.tickSize)}}D.min=C;D.max=A},extendXRangeIfNeededByBar:function(A){if(A.options.max==null){var D=A.max,B,I,F,E,H=[],C=null;for(B=0;BD)||(E.candleWidth+A.datamax>D)){D=A.max+I.bars.barWidth}if(F.stacked&&F.horizontal){for(j=0;jD)||(E.candleWidth+A.datamax>D)){D=A.max+F.barWidth}if(F.stacked&&!F.horizontal){for(j=0;j-1;--i){s=this.series[i];s.xaxis.values=s.xaxis.values||[];for(j=s.data.length-1;j>-1;--j){s.xaxis.values[s.data[j][0]]={}}}},calculateTicks:function(D){var B=D.options,E,H;D.ticks=[];if(B.ticks){var G=B.ticks,I,F;if(Object.isFunction(G)){G=G({min:D.min,max:D.max})}for(E=0;E1)?I[1]:B.tickFormatter(H)}else{H=I;F=B.tickFormatter(H)}D.ticks[E]={v:H,label:F}}}else{var A=D.tickSize*Math.ceil(D.min/D.tickSize),C;for(E=0;A+E*D.tickSize<=D.max;++E){H=A+E*D.tickSize;C=B.tickDecimals;if(C==null){C=1-Math.floor(Math.log(D.tickSize)/Math.LN10)}if(C<0){C=0}H=H.toFixed(C);D.ticks.push({v:H,label:B.tickFormatter(H)})}}},calculateSpacing:function(){var L=this.axes,N=this.options,H=this.series,D=N.grid.labelMargin,M=L.x,A=L.x2,J=L.y,K=L.y2,F=2,G,E,C,I;[M,A,J,K].each(function(P){var O="";if(P.options.showLabels){for(G=0;GO.length){O=P.ticks[G].label}}}P.maxLabel=this.getTextDimensions(O,{size:N.fontSize,angle:Flotr.toRad(P.options.labelsAngle)},"font-size:smaller;","flotr-grid-label");P.titleSize=this.getTextDimensions(P.options.title,{size:N.fontSize*1.2,angle:Flotr.toRad(P.options.titleAngle)},"font-weight:bold;","flotr-axis-title")},this);I=this.getTextDimensions(N.title,{size:N.fontSize*1.5},"font-size:1em;font-weight:bold;","flotr-title");this.titleHeight=I.height;I=this.getTextDimensions(N.subtitle,{size:N.fontSize},"font-size:smaller;","flotr-subtitle");this.subtitleHeight=I.height;if(N.show){F=Math.max(F,N.points.radius+N.points.lineWidth/2)}for(E=0;E'];D=H.x;if(D.options.showLabels){for(E=0;E'+G.label+"")}}D=H.x2;if(D.options.showLabels&&D.used){for(E=0;E'+G.label+"")}}D=H.y;if(D.options.showLabels){for(E=0;E'+G.label+"")}}D=H.y2;if(D.options.showLabels&&D.used){I.save();I.strokeStyle=D.options.color||J.grid.color;I.beginPath();for(E=0;E'+G.label+"");I.moveTo(this.plotOffset.left+this.plotWidth-8,this.plotOffset.top+this.tVert(G.v,D));I.lineTo(this.plotOffset.left+this.plotWidth,this.plotOffset.top+this.tVert(G.v,D))}I.stroke();I.restore()}F.push("");this.el.insert(F.join(""))}}},drawTitles:function(){var D,C=this.options,F=C.grid.labelMargin,B=this.ctx,A=this.axes;if(!C.HtmlText&&this.textEnabled){var E={size:C.fontSize,color:C.grid.color,halign:"c"};if(C.subtitle){B.drawText(C.subtitle,this.plotOffset.left+this.plotWidth/2,this.titleHeight+this.subtitleHeight-2,E)}E.weight=1.5;E.size*=1.5;if(C.title){B.drawText(C.title,this.plotOffset.left+this.plotWidth/2,this.titleHeight-2,E)}E.weight=1.8;E.size*=0.8;E.adjustAlign=true;if(A.x.options.title&&A.x.used){E.halign="c";E.valign="t";E.angle=Flotr.toRad(A.x.options.titleAngle);B.drawText(A.x.options.title,this.plotOffset.left+this.plotWidth/2,this.plotOffset.top+A.x.maxLabel.height+this.plotHeight+2*F,E)}if(A.x2.options.title&&A.x2.used){E.halign="c";E.valign="b";E.angle=Flotr.toRad(A.x2.options.titleAngle);B.drawText(A.x2.options.title,this.plotOffset.left+this.plotWidth/2,this.plotOffset.top-A.x2.maxLabel.height-2*F,E)}if(A.y.options.title&&A.y.used){E.halign="r";E.valign="m";E.angle=Flotr.toRad(A.y.options.titleAngle);B.drawText(A.y.options.title,this.plotOffset.left-A.y.maxLabel.width-2*F,this.plotOffset.top+this.plotHeight/2,E)}if(A.y2.options.title&&A.y2.used){E.halign="l";E.valign="m";E.angle=Flotr.toRad(A.y2.options.titleAngle);B.drawText(A.y2.options.title,this.plotOffset.left+this.plotWidth+A.y2.maxLabel.width+2*F,this.plotOffset.top+this.plotHeight/2,E)}}else{D=['
'];if(C.title){D.push('
'+C.title+"
")}if(C.subtitle){D.push('
'+C.subtitle+"
")}D.push("
");D.push('
');if(A.x.options.title&&A.x.used){D.push('
'+A.x.options.title+"
")}if(A.x2.options.title&&A.x2.used){D.push('
'+A.x2.options.title+"
")}if(A.y.options.title&&A.y.used){D.push('
'+A.y.options.title+"
")}if(A.y2.options.title&&A.y2.used){D.push('
'+A.y2.options.title+"
")}D.push("
");this.el.insert(D.join(""))}},drawSeries:function(A){A=A||this.series;var C=false;for(var B in Flotr._registeredTypes){if(A[B]&&A[B].show){this[Flotr._registeredTypes[B]](A);C=true}}if(!C){this[Flotr._registeredTypes[this.options.defaultType]](A)}},plotLine:function(I,F){var O=this.ctx,A=I.xaxis,K=I.yaxis,J=this.tHoz.bind(this),M=this.tVert.bind(this),H=I.data;if(H.length<2){return }var E=J(H[0][0],A),D=M(H[0][1],K)+F;O.beginPath();O.moveTo(E,D);for(var G=0;G=L&&N>K.max){if(L>K.max){continue}C=(K.max-N)/(L-N)*(B-C)+C;N=K.max}else{if(L>=N&&L>K.max){if(N>K.max){continue}B=(K.max-N)/(L-N)*(B-C)+C;L=K.max}}if(C<=B&&C=B&&C>A.max){if(B>A.max){continue}N=(A.max-C)/(B-C)*(L-N)+N;C=A.max}else{if(B>=C&&B>A.max){if(C>A.max){continue}L=(A.max-C)/(B-C)*(L-N)+N;B=A.max}}if(E!=J(C,A)||D!=M(N,K)+F){O.moveTo(J(C,A),M(N,K)+F)}E=J(B,A);D=M(L,K)+F;O.lineTo(E,D)}O.stroke()},plotLineArea:function(J,D){var S=J.data;if(S.length<2){return }var L,G=0,N=this.ctx,Q=J.xaxis,B=J.yaxis,E=this.tHoz.bind(this),M=this.tVert.bind(this),H=Math.min(Math.max(0,B.min),B.max),F=true;N.beginPath();for(var O=0;O=P&&R>Q.max){if(P>Q.max){continue}C=(Q.max-R)/(P-R)*(A-C)+C;R=Q.max}else{if(P>=R&&P>Q.max){if(R>Q.max){continue}A=(Q.max-R)/(P-R)*(A-C)+C;P=Q.max}}if(F){N.moveTo(E(R,Q),M(H,B)+D);F=false}if(C>=B.max&&A>=B.max){N.lineTo(E(R,Q),M(B.max,B)+D);N.lineTo(E(P,Q),M(B.max,B)+D);continue}else{if(C<=B.min&&A<=B.min){N.lineTo(E(R,Q),M(B.min,B)+D);N.lineTo(E(P,Q),M(B.min,B)+D);continue}}var I=R,K=P;if(C<=A&&C=B.min){R=(B.min-C)/(A-C)*(P-R)+R;C=B.min}else{if(A<=C&&A=B.min){P=(B.min-C)/(A-C)*(P-R)+R;A=B.min}}if(C>=A&&C>B.max&&A<=B.max){R=(B.max-C)/(A-C)*(P-R)+R;C=B.max}else{if(A>=C&&A>B.max&&C<=B.max){P=(B.max-C)/(A-C)*(P-R)+R;A=B.max}}if(R!=I){L=(C<=B.min)?L=B.min:B.max;N.lineTo(E(I,Q),M(L,B)+D);N.lineTo(E(R,Q),M(L,B)+D)}N.lineTo(E(R,Q),M(C,B)+D);N.lineTo(E(P,Q),M(A,B)+D);if(P!=K){L=(A<=B.min)?B.min:B.max;N.lineTo(E(K,Q),M(L,B)+D);N.lineTo(E(P,Q),M(L,B)+D)}G=Math.max(P,K)}N.lineTo(E(G,Q),M(H,B)+D);N.closePath();N.fill()},drawSeriesLines:function(C){C=C||this.series;var B=this.ctx;B.save();B.translate(this.plotOffset.left,this.plotOffset.top);B.lineJoin="round";var D=C.lines.lineWidth;var A=C.shadowSize;if(A>0){B.lineWidth=A/2;var E=D/2+B.lineWidth/2;B.strokeStyle="rgba(0,0,0,0.1)";this.plotLine(C,E+A/2);B.strokeStyle="rgba(0,0,0,0.2)";this.plotLine(C,E);if(C.lines.fill){B.fillStyle="rgba(0,0,0,0.05)";this.plotLineArea(C,E+A/2)}}B.lineWidth=D;B.strokeStyle=C.color;if(C.lines.fill){B.fillStyle=C.lines.fillColor!=null?C.lines.fillColor:Flotr.parseColor(C.color).scale(null,null,null,C.lines.fillOpacity).toString();this.plotLineArea(C,0)}this.plotLine(C,0);B.restore()},drawSeriesPoints:function(C){var B=this.ctx;B.save();B.translate(this.plotOffset.left,this.plotOffset.top);var D=C.lines.lineWidth;var A=C.shadowSize;if(A>0){B.lineWidth=A/2;B.strokeStyle="rgba(0,0,0,0.1)";this.plotPointShadows(C,A/2+B.lineWidth/2,C.points.radius);B.strokeStyle="rgba(0,0,0,0.2)";this.plotPointShadows(C,B.lineWidth/2,C.points.radius)}B.lineWidth=C.points.lineWidth;B.strokeStyle=C.color;B.fillStyle=C.points.fillColor!=null?C.points.fillColor:C.color;this.plotPoints(C,C.points.radius,C.points.fill);B.restore()},plotPoints:function(C,E,I){var A=C.xaxis,F=C.yaxis,J=this.ctx,D,B=C.data;for(D=B.length-1;D>-1;--D){var H=B[D][0],G=B[D][1];if(HA.max||GF.max){continue}J.beginPath();J.arc(this.tHoz(H,A),this.tVert(G,F),E,0,2*Math.PI,true);if(I){J.fill()}J.stroke()}},plotPointShadows:function(D,B,F){var A=D.xaxis,G=D.yaxis,J=this.ctx,E,C=D.data;for(E=C.length-1;E>-1;--E){var I=C[E][0],H=C[E][1];if(IA.max||HG.max){continue}J.beginPath();J.arc(this.tHoz(I,A),this.tVert(H,G)+B,F,0,Math.PI,false);J.stroke()}},drawSeriesBars:function(B){var A=this.ctx,D=B.bars.barWidth,C=Math.min(B.bars.lineWidth,D);A.save();A.translate(this.plotOffset.left,this.plotOffset.top);A.lineJoin="miter";A.lineWidth=C;A.strokeStyle=B.color;this.plotBarsShadows(B,D,0,B.bars.fill);if(B.bars.fill){A.fillStyle=B.bars.fillColor!=null?B.bars.fillColor:Flotr.parseColor(B.color).scale(null,null,null,B.bars.fillOpacity).toString()}this.plotBars(B,D,0,B.bars.fill);A.restore()},plotBars:function(K,N,D,Q){var U=K.data;if(U.length<1){return }var S=K.xaxis,B=K.yaxis,P=this.ctx,F=this.tHoz.bind(this),O=this.tVert.bind(this);for(var R=0;RS.max||MB.max){continue}if(CS.max){T=S.max;if(S.lastSerie!=K&&K.bars.horizontal){L=false}}if(GB.max){M=B.max;if(B.lastSerie!=K&&!K.bars.horizontal){L=false}}if(Q){P.beginPath();P.moveTo(F(C,S),O(G,B)+D);P.lineTo(F(C,S),O(M,B)+D);P.lineTo(F(T,S),O(M,B)+D);P.lineTo(F(T,S),O(G,B)+D);P.fill()}if(K.bars.lineWidth!=0&&(E||A||L)){P.beginPath();P.moveTo(F(C,S),O(G,B)+D);P[E?"lineTo":"moveTo"](F(C,S),O(M,B)+D);P[L?"lineTo":"moveTo"](F(T,S),O(M,B)+D);P[A?"lineTo":"moveTo"](F(T,S),O(G,B)+D);P.stroke()}}},plotBarsShadows:function(I,K,C){var T=I.data;if(T.length<1){return }var R=I.xaxis,A=I.yaxis,P=this.ctx,D=this.tHoz.bind(this),M=this.tVert.bind(this),N=this.options.shadowSize;for(var Q=0;QR.max||JA.max){continue}if(BR.max){S=R.max}if(FA.max){J=A.max}var O=D(S,R)-D(B,R)-((D(S,R)+N<=this.plotWidth)?0:N);var L=Math.max(0,M(F,A)-M(J,A)-((M(F,A)+N<=this.plotHeight)?0:N));P.fillStyle="rgba(0,0,0,0.05)";P.fillRect(Math.min(D(B,R)+N,this.plotWidth),Math.min(M(J,A)+N,this.plotWidth),O,L)}},drawSeriesCandles:function(B){var A=this.ctx,C=B.candles.candleWidth;A.save();A.translate(this.plotOffset.left,this.plotOffset.top);A.lineJoin="miter";A.lineWidth=B.candles.lineWidth;this.plotCandlesShadows(B,C/2);this.plotCandles(B,C/2);A.restore()},plotCandles:function(K,D){var W=K.data;if(W.length<1){return }var T=K.xaxis,B=K.yaxis,P=this.ctx,E=this.tHoz.bind(this),O=this.tVert.bind(this);for(var S=0;ST.max||MB.max){continue}var Q=K.candles[L>N?"downFillColor":"upFillColor"];if(K.candles.fill&&!K.candles.barcharts){P.fillStyle=Flotr.parseColor(Q).scale(null,null,null,K.candles.fillOpacity).toString();P.fillRect(E(C,T),O(R,B)+D,E(V,T)-E(C,T),O(A,B)-O(R,B))}if(K.candles.lineWidth||K.candles.wickLineWidth){var J,H,F=(K.candles.wickLineWidth%2)/2;J=Math.floor(E((C+V)/2),T)+F;P.save();P.strokeStyle=Q;P.lineWidth=K.candles.wickLineWidth;P.lineCap="butt";if(K.candles.barcharts){P.beginPath();P.moveTo(J,Math.floor(O(M,B)+D));P.lineTo(J,Math.floor(O(G,B)+D));H=Math.floor(O(L,B)+D)+0.5;P.moveTo(Math.floor(E(C,T))+F,H);P.lineTo(J,H);H=Math.floor(O(N,B)+D)+0.5;P.moveTo(Math.floor(E(V,T))+F,H);P.lineTo(J,H)}else{P.strokeRect(E(C,T),O(R,B)+D,E(V,T)-E(C,T),O(A,B)-O(R,B));P.beginPath();P.moveTo(J,Math.floor(O(R,B)+D));P.lineTo(J,Math.floor(O(M,B)+D));P.moveTo(J,Math.floor(O(A,B)+D));P.lineTo(J,Math.floor(O(G,B)+D))}P.stroke();P.restore()}}},plotCandlesShadows:function(H,C){var T=H.data;if(T.length<1||H.candles.barcharts){return }var Q=H.xaxis,A=H.yaxis,D=this.tHoz.bind(this),M=this.tVert.bind(this),N=this.options.shadowSize;for(var P=0;PQ.max||JA.max){continue}var O=D(S,Q)-D(B,Q)-((D(S,Q)+N<=this.plotWidth)?0:N);var L=Math.max(0,M(E,A)-M(J,A)-((M(E,A)+N<=this.plotHeight)?0:N));this.ctx.fillStyle="rgba(0,0,0,0.05)";this.ctx.fillRect(Math.min(D(B,Q)+N,this.plotWidth),Math.min(M(J,A)+N,this.plotWidth),O,L)}},drawSeriesPie:function(G){if(!this.options.pie.drawn){var K=this.ctx,C=this.options,E=G.pie.lineWidth,I=G.shadowSize,R=G.data,D=(Math.min(this.canvasWidth,this.canvasHeight)*G.pie.sizeRatio)/2,H=[];var L=1;var P=Math.sin(G.pie.viewAngle)*G.pie.spliceThickness/L;var M={size:C.fontSize*1.2,color:C.grid.color,weight:1.5};var Q={x:(this.canvasWidth+this.plotOffset.left)/2,y:(this.canvasHeight-this.plotOffset.bottom)/2};var O=this.series.collect(function(T,S){if(T.pie.show){return{name:(T.label||T.data[0][1]),value:[S,T.data[0][1]],explode:T.pie.explode}}});var B=O.pluck("value").pluck(1).inject(0,function(S,T){return S+T});var F=0,N=G.pie.startAngle,J=0;var A=O.collect(function(S){N+=F;J=parseFloat(S.value[1]);F=J/B;return{name:S.name,fraction:F,x:S.value[0],y:J,explode:S.explode,startAngle:2*N*Math.PI,endAngle:2*(N+F)*Math.PI}});K.save();if(I>0){A.each(function(V){var S=(V.startAngle+V.endAngle)/2;var T=Q.x+Math.cos(S)*V.explode+I;var U=Q.y+Math.sin(S)*V.explode+I;this.plotSlice(T,U,D,V.startAngle,V.endAngle,false,L);K.fillStyle="rgba(0,0,0,0.1)";K.fill()},this)}if(C.HtmlText){H=['
']}A.each(function(c,X){var W=(c.startAngle+c.endAngle)/2;var V=C.colors[X];var Y=Q.x+Math.cos(W)*c.explode;var U=Q.y+Math.sin(W)*c.explode;this.plotSlice(Y,U,D,c.startAngle,c.endAngle,false,L);if(G.pie.fill){K.fillStyle=Flotr.parseColor(V).scale(null,null,null,G.pie.fillOpacity).toString();K.fill()}K.lineWidth=E;K.strokeStyle=V;K.stroke();var b=C.pie.labelFormatter(c);var S=(Math.cos(W)<0);var a=Y+Math.cos(W)*(G.pie.explode+D);var Z=U+Math.sin(W)*(G.pie.explode+D);if(c.fraction&&b){if(C.HtmlText){var T="position:absolute;top:"+(Z-5)+"px;";if(S){T+="right:"+(this.canvasWidth-a)+"px;text-align:right;"}else{T+="left:"+a+"px;text-align:left;"}H.push('
'+b+"
")}else{M.halign=S?"r":"l";K.drawText(b,a,Z+M.size/2,M)}}},this);if(C.HtmlText){H.push("
");this.el.insert(H.join(""))}K.restore();C.pie.drawn=true}},plotSlice:function(B,H,A,E,D,F,G){var C=this.ctx;G=G||1;C.save();C.scale(1,G);C.beginPath();C.moveTo(B,H);C.arc(B,H,A,E,D,F);C.lineTo(B,H);C.closePath();C.restore()},plotPie:function(){},insertLegend:function(){if(!this.options.legend.show){return }var H=this.series,I=this.plotOffset,B=this.options,b=[],A=false,O=this.ctx,R;var Q=H.findAll(function(c){return(c.label&&!c.hide)}).size();if(Q){if(!B.HtmlText&&this.textEnabled){var T={size:B.fontSize*1.1,color:B.grid.color};var M=B.legend.position,N=B.legend.margin,L=B.legend.labelBoxWidth,Z=B.legend.labelBoxHeight,S=B.legend.labelBoxMargin,W=I.left+N,U=I.top+N;var a=0;for(R=H.length-1;R>-1;--R){if(!H[R].label||H[R].hide){continue}var E=B.legend.labelFormatter(H[R].label);a=Math.max(a,O.measureText(E,T))}var K=Math.round(L+S*3+a),C=Math.round(Q*(S+Z)+S);if(M.charAt(0)=="s"){U=I.top+this.plotHeight-(N+C)}if(M.charAt(1)=="e"){W=I.left+this.plotWidth-(N+K)}var P=Flotr.parseColor(B.legend.backgroundColor||"rgb(240,240,240)").scale(null,null,null,B.legend.backgroundOpacity||0.1).toString();O.fillStyle=P;O.fillRect(W,U,K,C);O.strokeStyle=B.legend.labelBoxBorderColor;O.strokeRect(Flotr.toPixel(W),Flotr.toPixel(U),K,C);var G=W+S;var F=U+S;for(R=0;R":"");A=true}var E=B.legend.labelFormatter(H[R].label);b.push('
'+E+"")}if(A){b.push("")}if(b.length>0){var V=''+b.join("")+"
";if(B.legend.container!=null){$(B.legend.container).update(V)}else{var D="";var M=B.legend.position,N=B.legend.margin;if(M.charAt(0)=="n"){D+="top:"+(N+I.top)+"px;"}else{if(M.charAt(0)=="s"){D+="bottom:"+(N+I.bottom)+"px;"}}if(M.charAt(1)=="e"){D+="right:"+(N+I.right)+"px;"}else{if(M.charAt(1)=="w"){D+="left:"+(N+I.left)+"px;"}}var J=this.el.insert('
'+V+"
").select("div.flotr-legend").first();if(B.legend.backgroundOpacity!=0){var Y=B.legend.backgroundColor;if(Y==null){var X=(B.grid.backgroundColor!=null)?B.grid.backgroundColor:Flotr.extractColor(J);Y=Flotr.parseColor(X).adjust(null,null,null,1).toString()}this.el.insert('
').select("div.flotr-legend-bg").first().setStyle({opacity:B.legend.backgroundOpacity})}}}}}},getEventPosition:function(C){var G=this.overlay.cumulativeOffset(),F=(C.pageX-G.left-this.plotOffset.left),E=(C.pageY-G.top-this.plotOffset.top),D=0,B=0;if(C.pageX==null&&C.clientX!=null){var H=document.documentElement,A=document.body;D=C.clientX+(H&&H.scrollLeft||A.scrollLeft||0);B=C.clientY+(H&&H.scrollTop||A.scrollTop||0)}else{D=C.pageX;B=C.pageY}return{x:this.axes.x.min+F/this.axes.x.scale,x2:this.axes.x2.min+F/this.axes.x2.scale,y:this.axes.y.max-E/this.axes.y.scale,y2:this.axes.y2.max-E/this.axes.y2.scale,relX:F,relY:E,absX:D,absY:B}},clickHandler:function(A){if(this.ignoreClick){this.ignoreClick=false;return }this.el.fire("flotr:click",[this.getEventPosition(A),this])},mouseMoveHandler:function(A){var B=this.getEventPosition(A);this.lastMousePos.pageX=B.absX;this.lastMousePos.pageY=B.absY;if(this.selectionInterval==null&&(this.options.mouse.track||this.series.any(function(C){return C.mouse&&C.mouse.track}))){this.hit(B)}this.el.fire("flotr:mousemove",[A,B,this])},mouseDownHandler:function(C){if(C.isRightClick()){C.stop();var B=this.overlay;B.hide();function A(){B.show();$(document).stopObserving("mousemove",A)}$(document).observe("mousemove",A);return }if(!this.options.selection.mode||!C.isLeftClick()){return }this.setSelectionPos(this.selection.first,C);if(this.selectionInterval!=null){clearInterval(this.selectionInterval)}this.lastMousePos.pageX=null;this.selectionInterval=setInterval(this.updateSelection.bind(this),1000/this.options.selection.fps);this.mouseUpHandler=this.mouseUpHandler.bind(this);$(document).observe("mouseup",this.mouseUpHandler)},fireSelectEvent:function(){var A=this.axes,F=this.selection,C=(F.first.x<=F.second.x)?F.first.x:F.second.x,B=(F.first.x<=F.second.x)?F.second.x:F.first.x,E=(F.first.y>=F.second.y)?F.first.y:F.second.y,D=(F.first.y>=F.second.y)?F.second.y:F.first.y;C=A.x.min+C/A.x.scale;B=A.x.min+B/A.x.scale;E=A.y.max-E/A.y.scale;D=A.y.max-D/A.y.scale;this.el.fire("flotr:select",[{x1:C,y1:E,x2:B,y2:D},this])},mouseUpHandler:function(A){$(document).stopObserving("mouseup",this.mouseUpHandler);A.stop();if(this.selectionInterval!=null){clearInterval(this.selectionInterval);this.selectionInterval=null}this.setSelectionPos(this.selection.second,A);this.clearSelection();if(this.selectionIsSane()){this.drawSelection();this.fireSelectEvent();this.ignoreClick=true}},setSelectionPos:function(D,B){var A=this.options,C=$(this.overlay).cumulativeOffset();if(A.selection.mode.indexOf("x")==-1){D.x=(D==this.selection.first)?0:this.plotWidth}else{D.x=B.pageX-C.left-this.plotOffset.left;D.x=Math.min(Math.max(0,D.x),this.plotWidth)}if(A.selection.mode.indexOf("y")==-1){D.y=(D==this.selection.first)?0:this.plotHeight}else{D.y=B.pageY-C.top-this.plotOffset.top;D.y=Math.min(Math.max(0,D.y),this.plotHeight)}},updateSelection:function(){if(this.lastMousePos.pageX==null){return }this.setSelectionPos(this.selection.second,this.lastMousePos);this.clearSelection();if(this.selectionIsSane()){this.drawSelection()}},clearSelection:function(){if(this.prevSelection==null){return }var G=this.prevSelection,E=this.octx,C=this.plotOffset,A=Math.min(G.first.x,G.second.x),F=Math.min(G.first.y,G.second.y),B=Math.abs(G.second.x-G.first.x),D=Math.abs(G.second.y-G.first.y);E.clearRect(A+C.left-E.lineWidth,F+C.top-E.lineWidth,B+E.lineWidth*2,D+E.lineWidth*2);this.prevSelection=null},setSelection:function(G){var B=this.options,H=this.axes.x,A=this.axes.y,F=yaxis.scale,D=xaxis.scale,E=B.selection.mode.indexOf("x")!=-1,C=B.selection.mode.indexOf("y")!=-1;this.clearSelection();this.selection.first.y=E?0:(A.max-G.y1)*F;this.selection.second.y=E?this.plotHeight:(A.max-G.y2)*F;this.selection.first.x=C?0:(G.x1-H.min)*D;this.selection.second.x=C?this.plotWidth:(G.x2-H.min)*D;this.drawSelection();this.fireSelectEvent()},drawSelection:function(){var C=this.prevSelection,F=this.selection,H=this.octx,I=this.options,A=this.plotOffset;if(C!=null&&F.first.x==C.first.x&&F.first.y==C.first.y&&F.second.x==C.second.x&&F.second.y==C.second.y){return }H.strokeStyle=Flotr.parseColor(I.selection.color).scale(null,null,null,0.8).toString();H.lineWidth=1;H.lineJoin="round";H.fillStyle=Flotr.parseColor(I.selection.color).scale(null,null,null,0.4).toString();this.prevSelection={first:{x:F.first.x,y:F.first.y},second:{x:F.second.x,y:F.second.y}};var E=Math.min(F.first.x,F.second.x),D=Math.min(F.first.y,F.second.y),G=Math.abs(F.second.x-F.first.x),B=Math.abs(F.second.y-F.first.y);H.fillRect(E+A.left,D+A.top,G,B);H.strokeRect(E+A.left,D+A.top,G,B)},selectionIsSane:function(){var A=this.selection;return Math.abs(A.second.x-A.first.x)>=5&&Math.abs(A.second.y-A.first.y)>=5},clearHit:function(){if(this.prevHit){var B=this.options,A=this.plotOffset,C=this.prevHit;this.octx.clearRect(this.tHoz(C.x)+A.left-B.points.radius*2,this.tVert(C.y)+A.top-B.points.radius*2,B.points.radius*3+B.points.lineWidth*3,B.points.radius*3+B.points.lineWidth*3);this.prevHit=null}},hit:function(I){var G=this.series,C=this.options,R=this.prevHit,H=this.plotOffset,D=this.octx,S,A,M,Q,L={dist:Number.MAX_VALUE,x:null,y:null,relX:I.relX,relY:I.relY,absX:I.absX,absY:I.absY,mouse:null};for(Q=0;Q');K=this.mouseTrack=this.el.select(".flotr-mouse-value").first()}else{this.mouseTrack=K.setStyle(O)}if(L.x!==null&&L.y!==null){K.show();this.clearHit();if(L.mouse.lineColor!=null){D.save();D.translate(H.left,H.top);D.lineWidth=C.points.lineWidth;D.strokeStyle=L.mouse.lineColor;D.fillStyle="#ffffff";D.beginPath();D.arc(this.tHoz(L.x),this.tVert(L.y),C.mouse.radius,0,2*Math.PI,true);D.fill();D.stroke();D.restore()}this.prevHit=L;var T=L.mouse.trackDecimals;if(T==null||T<0){T=0}K.innerHTML=L.mouse.trackFormatter({x:L.x.toFixed(T),y:L.y.toFixed(T)});K.fire("flotr:hit",[L,this])}else{if(R){K.hide();this.clearHit()}}}},saveImage:function(D,C,A,B){var E=null;switch(D){case"jpeg":case"jpg":E=Canvas2Image.saveAsJPEG(this.canvas,B,C,A);break;default:case"png":E=Canvas2Image.saveAsPNG(this.canvas,B,C,A);break;case"bmp":E=Canvas2Image.saveAsBMP(this.canvas,B,C,A);break}if(Object.isElement(E)&&B){this.restoreCanvas();this.canvas.hide();this.overlay.hide();this.el.insert(E.setStyle({position:"absolute"}))}},restoreCanvas:function(){this.canvas.show();this.overlay.show();this.el.select("img").invoke("remove")}});Flotr.Color=Class.create({initialize:function(E,D,B,C){this.rgba=["r","g","b","a"];var A=4;while(-1<--A){this[this.rgba[A]]=arguments[A]||((A==3)?1:0)}this.normalize()},adjust:function(D,C,E,B){var A=4;while(-1<--A){if(arguments[A]!=null){this[this.rgba[A]]+=arguments[A]}}return this.normalize()},clone:function(){return new Flotr.Color(this.r,this.b,this.g,this.a)},limit:function(B,A,C){return Math.max(Math.min(B,C),A)},normalize:function(){var A=this.limit;this.r=A(parseInt(this.r),0,255);this.g=A(parseInt(this.g),0,255);this.b=A(parseInt(this.b),0,255);this.a=A(this.a,0,1);return this},scale:function(D,C,E,B){var A=4;while(-1<--A){if(arguments[A]!=null){this[this.rgba[A]]*=arguments[A]}}return this.normalize()},distance:function(B){if(!B){return }B=new Flotr.parseColor(B);var C=0;var A=3;while(-1<--A){C+=Math.abs(this[this.rgba[A]]-B[this.rgba[A]])}return C},toString:function(){return(this.a>=1)?"rgb("+[this.r,this.g,this.b].join(",")+")":"rgba("+[this.r,this.g,this.b,this.a].join(",")+")"}});Flotr.Color.lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]};Flotr.Date={format:function(F,E){if(!F){return }var A=function(H){H=H.toString();return H.length==1?"0"+H:H};var D=[];var C=false;for(var B=0;B, MIT License. -// -//Radar chart added by Ryan Simmons -// -/* $Id: flotr.js 82 2009-01-12 19:19:31Z fabien.menager $ */ - -var Flotr = { - version: '0.2.0-alpha', - author: 'Bas Wenneker', - website: 'http://www.solutoire.com', - /** - * An object of the default registered graph types. Use Flotr.register(type, functionName) - * to add your own type. - */ - _registeredTypes:{ - 'lines': 'drawSeriesLines', - 'points': 'drawSeriesPoints', - 'bars': 'drawSeriesBars', - 'candles': 'drawSeriesCandles', - 'pie': 'drawSeriesPie', - 'radar':'drawSeriesRadar' - }, - /** - * Can be used to register your own chart type. Default types are 'lines', 'points' and 'bars'. - * This is still experimental. - * @todo Test and confirm. - * @param {String} type - type of chart, like 'pies', 'bars' etc. - * @param {String} functionName - Name of the draw function, like 'drawSeriesPies', 'drawSeriesBars' etc. - */ - register: function(type, functionName){ - Flotr._registeredTypes[type] = functionName+''; - }, - /** - * Draws the graph. This function is here for backwards compatibility with Flotr version 0.1.0alpha. - * You could also draw graphs by directly calling Flotr.Graph(element, data, options). - * @param {Element} el - element to insert the graph into - * @param {Object} data - an array or object of dataseries - * @param {Object} options - an object containing options - * @param {Class} _GraphKlass_ - (optional) Class to pass the arguments to, defaults to Flotr.Graph - * @return {Class} returns a new graph object and of course draws the graph. - */ - draw: function(el, data, options, _GraphKlass_){ - _GraphKlass_ = _GraphKlass_ || Flotr.Graph; - return new _GraphKlass_(el, data, options); - }, - /** - * Collects dataseries from input and parses the series into the right format. It returns an Array - * of Objects each having at least the 'data' key set. - * @param {Array/Object} data - Object or array of dataseries - * @return {Array} Array of Objects parsed into the right format ({(...,) data: [[x1,y1], [x2,y2], ...] (, ...)}) - */ - getSeries: function(data){ - return data.collect(function(serie){ - var i, serie = (serie.data) ? Object.clone(serie) : {'data': serie}; - for (i = serie.data.length-1; i > -1; --i) { - serie.data[i][1] = (serie.data[i][1] === null ? null : parseFloat(serie.data[i][1])); - } - return serie; - }); - }, - /** - * Recursively merges two objects. - * @param {Object} src - source object (likely the object with the least properties) - * @param {Object} dest - destination object (optional, object with the most properties) - * @return {Object} recursively merged Object - */ - merge: function(src, dest){ - var result = dest || {}; - for(var i in src){ - result[i] = (src[i] != null && typeof(src[i]) == 'object' && !(src[i].constructor == Array || src[i].constructor == RegExp) && !Object.isElement(src[i])) ? Flotr.merge(src[i], dest[i]) : result[i] = src[i]; - } - return result; - }, - /** - * Function calculates the ticksize and returns it. - * @param {Integer} noTicks - number of ticks - * @param {Integer} min - lower bound integer value for the current axis - * @param {Integer} max - upper bound integer value for the current axis - * @param {Integer} decimals - number of decimals for the ticks - * @return {Integer} returns the ticksize in pixels - */ - getTickSize: function(noTicks, min, max, decimals){ - var delta = (max - min) / noTicks; - var magn = Flotr.getMagnitude(delta); - - // Norm is between 1.0 and 10.0. - var norm = delta / magn; - - var tickSize = 10; - if(norm < 1.5) tickSize = 1; - else if(norm < 2.25) tickSize = 2; - else if(norm < 3) tickSize = ((decimals == 0) ? 2 : 2.5); - else if(norm < 7.5) tickSize = 5; - - return tickSize * magn; - }, - /** - * Default tick formatter. - * @param {String/Integer} val - tick value integer - * @return {String} formatted tick string - */ - defaultTickFormatter: function(val){ - return val+''; - }, - /** - * Formats the mouse tracker values. - * @param {Object} obj - Track value Object {x:..,y:..} - * @return {String} Formatted track string - */ - defaultTrackFormatter: function(obj){ - return '('+obj.x+', '+obj.y+')'; - }, - defaultPieLabelFormatter: function(slice) { - return (slice.fraction*100).toFixed(2)+'%'; - }, - /** - * Returns the magnitude of the input value. - * @param {Integer/Float} x - integer or float value - * @return {Integer/Float} returns the magnitude of the input value - */ - getMagnitude: function(x){ - return Math.pow(10, Math.floor(Math.log(x) / Math.LN10)); - }, - toPixel: function(val){ - return Math.floor(val)+0.5;//((val-Math.round(val) < 0.4) ? (Math.floor(val)-0.5) : val); - }, - toRad: function(angle){ - return -angle * (Math.PI/180); - }, - /** - * Parses a color string and returns a corresponding Color. - * @param {String} str - string thats representing a color - * @return {Color} returns a Color object or false - */ - parseColor: function(str){ - if (str instanceof Flotr.Color) return str; - - var result, Color = Flotr.Color; - - // rgb(num,num,num) - if((result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))) - return new Color(parseInt(result[1]), parseInt(result[2]), parseInt(result[3])); - - // rgba(num,num,num,num) - if((result = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))) - return new Color(parseInt(result[1]), parseInt(result[2]), parseInt(result[3]), parseFloat(result[4])); - - // rgb(num%,num%,num%) - if((result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))) - return new Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55); - - // rgba(num%,num%,num%,num) - if((result = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))) - return new Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55, parseFloat(result[4])); - - // #a0b1c2 - if((result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))) - return new Color(parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)); - - // #fff - if((result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))) - return new Color(parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)); - - // Otherwise, we're most likely dealing with a named color. - var name = str.strip().toLowerCase(); - if(name == 'transparent'){ - return new Color(255, 255, 255, 0); - } - return ((result = Color.lookupColors[name])) ? new Color(result[0], result[1], result[2]) : false; - }, - /** - * Extracts the background-color of the passed element. - * @param {Element} element - * @return {String} color string - */ - extractColor: function(element){ - var color; - // Loop until we find an element with a background color and stop when we hit the body element. - do { - color = element.getStyle('background-color').toLowerCase(); - if(!(color == '' || color == 'transparent')) break; - element = element.up(0); - } while(!element.nodeName.match(/^body$/i)); - - // Catch Safari's way of signaling transparent. - return (color == 'rgba(0, 0, 0, 0)') ? 'transparent' : color; - } -}; -/** - * Flotr Graph class that plots a graph on creation. - - */ -Flotr.Graph = Class.create({ - /** - * Flotr Graph constructor. - * @param {Element} el - element to insert the graph into - * @param {Object} data - an array or object of dataseries - * @param {Object} options - an object containing options - */ - initialize: function(el, data, options){ - this.el = $(el); - - if (!this.el) throw 'The target container doesn\'t exist'; - - this.data = data; - this.series = Flotr.getSeries(data); - this.setOptions(options); - - // Initialize some variables - this.lastMousePos = { pageX: null, pageY: null }; - this.selection = { first: { x: -1, y: -1}, second: { x: -1, y: -1} }; - this.prevSelection = null; - this.selectionInterval = null; - this.ignoreClick = false; - this.prevHit = null; - - // Create and prepare canvas. - this.constructCanvas(); - - // Add event handlers for mouse tracking, clicking and selection - this.initEvents(); - - this.findDataRanges(); - this.calculateTicks(this.axes.x); - this.calculateTicks(this.axes.x2); - this.calculateTicks(this.axes.y); - this.calculateTicks(this.axes.y2); - - this.calculateSpacing(); - this.draw(); - this.insertLegend(); - - // Graph and Data tabs - if (this.options.spreadsheet.show) - this.constructTabs(); - }, - /** - * Sets options and initializes some variables and color specific values, used by the constructor. - * @param {Object} opts - options object - */ - setOptions: function(opts){ - var options = { - colors: ['#00A8F0', '#C0D800', '#CB4B4B', '#4DA74D', '#9440ED'], //=> The default colorscheme. When there are > 5 series, additional colors are generated. - title: null, - subtitle: null, - legend: { - show: true, // => setting to true will show the legend, hide otherwise - noColumns: 1, // => number of colums in legend table // @todo: doesn't work for HtmlText = false - labelFormatter: Prototype.K, // => fn: string -> string - labelBoxBorderColor: '#CCCCCC', // => border color for the little label boxes - labelBoxWidth: 14, - labelBoxHeight: 10, - labelBoxMargin: 5, - container: null, // => container (as jQuery object) to put legend in, null means default on top of graph - position: 'nw', // => position of default legend container within plot - margin: 5, // => distance from grid edge to default legend container within plot - backgroundColor: null, // => null means auto-detect - backgroundOpacity: 0.85// => set to 0 to avoid background, set to 1 for a solid background - }, - xaxis: { - ticks: null, // => format: either [1, 3] or [[1, 'a'], 3] - showLabels: true, // => setting to true will show the axis ticks labels, hide otherwise - labelsAngle: 0, // => Labels' angle, in degrees - title: null, // => axis title - titleAngle: 0, // => axis title's angle, in degrees - noTicks: 5, // => number of ticks for automagically generated ticks - tickFormatter: Flotr.defaultTickFormatter, // => fn: number -> string - tickDecimals: null, // => no. of decimals, null means auto - min: null, // => min. value to show, null means set automatically - max: null, // => max. value to show, null means set automatically - autoscaleMargin: 0, // => margin in % to add if auto-setting min/max - color: null - }, - x2axis: {}, - yaxis: { - ticks: null, // => format: either [1, 3] or [[1, 'a'], 3] - showLabels: true, // => setting to true will show the axis ticks labels, hide otherwise - labelsAngle: 0, // => Labels' angle, in degrees - title: null, // => axis title - titleAngle: 90, // => axis title's angle, in degrees - noTicks: 5, // => number of ticks for automagically generated ticks - tickFormatter: Flotr.defaultTickFormatter, // => fn: number -> string - tickDecimals: null, // => no. of decimals, null means auto - min: null, // => min. value to show, null means set automatically - max: null, // => max. value to show, null means set automatically - autoscaleMargin: 0, // => margin in % to add if auto-setting min/max - color: null - }, - y2axis: { - titleAngle: 270 - }, - points: { - show: false, // => setting to true will show points, false will hide - radius: 3, // => point radius (pixels) - lineWidth: 2, // => line width in pixels - fill: true, // => true to fill the points with a color, false for (transparent) no fill - fillColor: '#FFFFFF', // => fill color - fillOpacity: 0.4 - }, - lines: { - show: false, // => setting to true will show lines, false will hide - lineWidth: 2, // => line width in pixels - fill: false, // => true to fill the area from the line to the x axis, false for (transparent) no fill - fillColor: null, // => fill color - fillOpacity: 0.4 // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill - }, - radar: { - show: false, // => setting to true will show radar chart, false will hide - lineWidth: 2, // => line width in pixels - fill: false, // => true to fill the area from the line to the x axis, false for (transparent) no fill - fillColor: null, // => fill color - fillOpacity: 0.4 // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill - }, - bars: { - show: false, // => setting to true will show bars, false will hide - lineWidth: 2, // => in pixels - barWidth: 1, // => in units of the x axis - fill: true, // => true to fill the area from the line to the x axis, false for (transparent) no fill - fillColor: null, // => fill color - fillOpacity: 0.4, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill - horizontal: false, - stacked: false - }, - candles: { - show: false, // => setting to true will show candle sticks, false will hide - lineWidth: 1, // => in pixels - wickLineWidth: 1, // => in pixels - candleWidth: 0.6, // => in units of the x axis - fill: true, // => true to fill the area from the line to the x axis, false for (transparent) no fill - upFillColor: '#00A8F0',// => up sticks fill color - downFillColor: '#CB4B4B',// => down sticks fill color - fillOpacity: 0.5, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill - barcharts: false // => draw as barcharts (not standard bars but financial barcharts) - }, - pie: { - show: false, // => setting to true will show bars, false will hide - lineWidth: 1, // => in pixels - fill: true, // => true to fill the area from the line to the x axis, false for (transparent) no fill - fillColor: null, // => fill color - fillOpacity: 0.6, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill - explode: 6, - sizeRatio: 0.6, - startAngle: Math.PI/4, - labelFormatter: Flotr.defaultPieLabelFormatter, - pie3D: false, - pie3DviewAngle: (Math.PI/2 * 0.8), - pie3DspliceThickness: 20 - }, - grid: { - color: '#545454', // => primary color used for outline and labels - backgroundColor: null, // => null for transparent, else color - tickColor: '#DDDDDD', // => color used for the ticks - labelMargin: 3, // => margin in pixels - verticalLines: true, // => whether to show gridlines in vertical direction - horizontalLines: true, // => whether to show gridlines in horizontal direction - outlineWidth: 2 // => width of the grid outline/border in pixels - }, - selection: { - mode: null, // => one of null, 'x', 'y' or 'xy' - color: '#B6D9FF', // => selection box color - fps: 20 // => frames-per-second - }, - mouse: { - track: false, // => true to track the mouse, no tracking otherwise - position: 'se', // => position of the value box (default south-east) - relative: false, // => next to the mouse cursor - trackFormatter: Flotr.defaultTrackFormatter, // => formats the values in the value box - margin: 5, // => margin in pixels of the valuebox - lineColor: '#FF3F19', // => line color of points that are drawn when mouse comes near a value of a series - trackDecimals: 1, // => decimals for the track values - sensibility: 2, // => the lower this number, the more precise you have to aim to show a value - radius: 3 // => radius of the track point - }, - radarChartMode: false, // => true to render radar grid / and setup scaling for radar chart - shadowSize: 4, // => size of the 'fake' shadow - defaultType: 'lines', // => default series type - HtmlText: true, // => wether to draw the text using HTML or on the canvas - fontSize: 7.5, // => canvas' text font size - spreadsheet: { - show: false, // => show the data grid using two tabs - tabGraphLabel: 'Graph', - tabDataLabel: 'Data', - toolbarDownload: 'Download CSV', // @todo: add language support - toolbarSelectAll: 'Select all' - } - } - - options.x2axis = Object.extend(Object.clone(options.xaxis), options.x2axis); - options.y2axis = Object.extend(Object.clone(options.yaxis), options.y2axis); - this.options = Flotr.merge((opts || {}), options); - - this.axes = { - x: {options: this.options.xaxis, n: 1}, - x2: {options: this.options.x2axis, n: 2}, - y: {options: this.options.yaxis, n: 1}, - y2: {options: this.options.y2axis, n: 2} - }; - - // Initialize some variables used throughout this function. - var assignedColors = [], - colors = [], - ln = this.series.length, - neededColors = this.series.length, - oc = this.options.colors, - usedColors = [], - variation = 0, - c, i, j, s, tooClose; - - // Collect user-defined colors from series. - for(i = neededColors - 1; i > -1; --i){ - c = this.series[i].color; - if(c != null){ - --neededColors; - if(Object.isNumber(c)) assignedColors.push(c); - else usedColors.push(Flotr.parseColor(c)); - } - } - - // Calculate the number of colors that need to be generated. - for(i = assignedColors.length - 1; i > -1; --i) - neededColors = Math.max(neededColors, assignedColors[i] + 1); - - // Generate needed number of colors. - for(i = 0; colors.length < neededColors;){ - c = (oc.length == i) ? new Flotr.Color(100, 100, 100) : Flotr.parseColor(oc[i]); - - // Make sure each serie gets a different color. - var sign = variation % 2 == 1 ? -1 : 1; - var factor = 1 + sign * Math.ceil(variation / 2) * 0.2; - c.scale(factor, factor, factor); - - /** - * @todo if we're getting too close to something else, we should probably skip this one - */ - colors.push(c); - - if(++i >= oc.length){ - i = 0; - ++variation; - } - } - - // Fill the options with the generated colors. - for(i = 0, j = 0; i < ln; ++i){ - s = this.series[i]; - - // Assign the color. - if(s.color == null){ - s.color = colors[j++].toString(); - }else if(Object.isNumber(s.color)){ - s.color = colors[s.color].toString(); - } - - if (!s.xaxis) s.xaxis = this.axes.x; - if (s.xaxis == 1) s.xaxis = this.axes.x; - else if (s.xaxis == 2) s.xaxis = this.axes.x2; - - if (!s.yaxis) s.yaxis = this.axes.y; - if (s.yaxis == 1) s.yaxis = this.axes.y; - else if (s.yaxis == 2) s.yaxis = this.axes.y2; - - // Apply missing options to the series. - s.lines = Object.extend(Object.clone(this.options.lines), s.lines); - s.points = Object.extend(Object.clone(this.options.points), s.points); - s.bars = Object.extend(Object.clone(this.options.bars), s.bars); - s.candles = Object.extend(Object.clone(this.options.candles), s.candles); - s.pie = Object.extend(Object.clone(this.options.pie), s.pie); - s.radar = Object.extend(Object.clone(this.options.radar), s.radar); - s.mouse = Object.extend(Object.clone(this.options.mouse), s.mouse); - - if(s.shadowSize == null) s.shadowSize = this.options.shadowSize; - } - }, - /** - * Initializes the canvas and it's overlay canvas element. When the browser is IE, this makes use - * of excanvas. The overlay canvas is inserted for displaying interactions. After the canvas elements - * are created, the elements are inserted into the container element. - */ - constructCanvas: function(){ - var el = this.el, - size, c, oc; - - this.canvas = el.select('.flotr-canvas')[0]; - this.overlay = el.select('.flotr-overlay')[0]; - - el.childElements().invoke('remove'); - - // For positioning labels and overlay. - el.setStyle({position:'relative', cursor:'default'}); - - this.canvasWidth = el.getWidth(); - this.canvasHeight = el.getHeight(); - size = {'width': this.canvasWidth, 'height': this.canvasHeight}; - - if(this.canvasWidth <= 0 || this.canvasHeight <= 0){ - throw 'Invalid dimensions for plot, width = ' + this.canvasWidth + ', height = ' + this.canvasHeight; - } - - // Insert main canvas. - if (!this.canvas) { - c = this.canvas = new Element('canvas', size); - c.className = 'flotr-canvas'; - c = c.writeAttribute('style', 'position:absolute;left:0px;top:0px;'); - } else { - c = this.canvas.writeAttribute(size); - } - el.insert(c); - - if(Prototype.Browser.IE){ - c = window.G_vmlCanvasManager.initElement(c); - } - this.ctx = c.getContext('2d'); - - // Insert overlay canvas for interactive features. - if (!this.overlay) { - oc = this.overlay = new Element('canvas', size); - oc.className = 'flotr-overlay'; - oc = oc.writeAttribute('style', 'position:absolute;left:0px;top:0px;'); - } else { - oc = this.overlay.writeAttribute(size); - } - el.insert(oc); - - if(Prototype.Browser.IE){ - oc = window.G_vmlCanvasManager.initElement(oc); - } - this.octx = oc.getContext('2d'); - - // Enable text functions - if (window.CanvasText) { - CanvasText.enable(this.ctx); - CanvasText.enable(this.octx); - this.textEnabled = true; - } - }, - getTextDimensions: function(text, canvasStyle, HtmlStyle, className) { - if (!text) return {width:0, height:0}; - - if (!this.options.HtmlText && this.textEnabled) { - var bounds = this.ctx.getTextBounds(text, canvasStyle); - return { - width: bounds.width+2, - height: bounds.height+6 - }; - } - else { - var dummyDiv = this.el.insert('
' + text + '
').select(".flotr-dummy-div")[0]; - dim = dummyDiv.getDimensions(); - dummyDiv.remove(); - return dim; - } - }, - loadDataGrid: function(){ - if (this.seriesData) return this.seriesData; - - var s = this.series; - var dg = []; - - /* The data grid is a 2 dimensions array. There is a row for each X value. - * Each row contains the x value and the corresponding y value for each serie ('undefined' if there isn't one) - **/ - for(i = 0; i < s.length; ++i){ - s[i].data.each(function(v) { - var x = v[0], - y = v[1]; - if (r = dg.find(function(row) {return row[0] == x})) { - r[i+1] = y; - } - else { - var newRow = []; - newRow[0] = x; - newRow[i+1] = y - dg.push(newRow); - } - }); - } - - // The data grid is sorted by x value - dg = dg.sortBy(function(v) { - return v[0]; - }); - return this.seriesData = dg; - }, - - // @todo: make a tab manager (Flotr.Tabs) - showTab: function(tabName, onComplete){ - var elementsClassNames = 'canvas, .flotr-labels, .flotr-legend, .flotr-legend-bg, .flotr-title, .flotr-subtitle'; - switch(tabName) { - case 'graph': - this.datagrid.up().hide(); - this.el.select(elementsClassNames).invoke('show'); - this.tabs.data.removeClassName('selected'); - this.tabs.graph.addClassName('selected'); - break; - case 'data': - this.constructDataGrid(); - this.datagrid.up().show(); - this.el.select(elementsClassNames).invoke('hide'); - this.tabs.data.addClassName('selected'); - this.tabs.graph.removeClassName('selected'); - break; - } - }, - constructTabs: function(){ - var tabsContainer = new Element('div', {className:'flotr-tabs-group', style:'position:absolute;left:0px;top:'+this.canvasHeight+'px;width:'+this.canvasWidth+'px;'}); - this.el.insert({bottom: tabsContainer}); - this.tabs = { - graph: new Element('div', {className:'flotr-tab selected', style:'float:left;'}).update(this.options.spreadsheet.tabGraphLabel), - data: new Element('div', {className:'flotr-tab', style:'float:left;'}).update(this.options.spreadsheet.tabDataLabel) - } - - tabsContainer.insert(this.tabs.graph).insert(this.tabs.data); - - this.el.setStyle({height: this.canvasHeight+this.tabs.data.getHeight()+2+'px'}); - - this.tabs.graph.observe('click', (function() {this.showTab('graph')}).bind(this)); - this.tabs.data.observe('click', (function() {this.showTab('data')}).bind(this)); - }, - - // @todo: make a spreadsheet manager (Flotr.Spreadsheet) - constructDataGrid: function(){ - // If the data grid has already been built, nothing to do here - if (this.datagrid) return this.datagrid; - - var i, j, - s = this.series, - datagrid = this.loadDataGrid(); - - var t = this.datagrid = new Element('table', {className:'flotr-datagrid', style:'height:100px;'}); - var colgroup = ['']; - - // First row : series' labels - var html = ['']; - html.push(' '); - for (i = 0; i < s.length; ++i) { - html.push(''+(s[i].label || String.fromCharCode(65+i))+''); - colgroup.push(''); - } - html.push(''); - - // Data rows - for (j = 0; j < datagrid.length; ++j) { - html.push(''); - for (i = 0; i < s.length+1; ++i) { - var tag = 'td'; - var content = (datagrid[j][i] != null ? Math.round(datagrid[j][i]*100000)/100000 : ''); - - if (i == 0) { - tag = 'th'; - var label; - if(this.options.xaxis.ticks) { - var tick = this.options.xaxis.ticks.find(function (x) { return x[0] == datagrid[j][i] }); - if (tick) label = tick[1]; - } - else { - label = this.options.xaxis.tickFormatter(content); - } - - if (label) content = label; - } - - html.push('<'+tag+(tag=='th'?' scope="row"':'')+'>'+content+''); - } - html.push(''); - } - colgroup.push(''); - t.update(colgroup.join('')+html.join('')); - - if (!Prototype.Browser.IE) { - t.select('td').each(function(td) { - td.observe('mouseover', function(e){ - td = e.element(); - var siblings = td.previousSiblings(); - - t.select('th[scope=col]')[siblings.length-1].addClassName('hover'); - t.select('colgroup col')[siblings.length].addClassName('hover'); - }); - - td.observe('mouseout', function(){ - t.select('colgroup col.hover, th.hover').each(function(e){e.removeClassName('hover')}); - }); - }); - } - - var toolbar = new Element('div', {className: 'flotr-datagrid-toolbar'}). - insert(new Element('button', {type:'button', className:'flotr-datagrid-toolbar-button'}).update(this.options.spreadsheet.toolbarDownload).observe('click', this.downloadCSV.bind(this))). - insert(new Element('button', {type:'button', className:'flotr-datagrid-toolbar-button'}).update(this.options.spreadsheet.toolbarSelectAll).observe('click', this.selectAllData.bind(this))); - - var container = new Element('div', {className:'flotr-datagrid-container', style:'left:0px;top:0px;width:'+this.canvasWidth+'px;height:'+this.canvasHeight+'px;overflow:auto;'}); - container.insert(toolbar); - t.wrap(container.hide()); - - this.el.insert(container); - return t; - }, - selectAllData: function(){ - if (this.tabs) { - var selection, range, doc, win, node = this.constructDataGrid(); - - this.showTab('data'); - - // deferred to be able to select the table - (function () { - if ((doc = node.ownerDocument) && (win = doc.defaultView) && - win.getSelection && doc.createRange && - (selection = window.getSelection()) && - selection.removeAllRanges) { - range = doc.createRange(); - range.selectNode(node); - selection.removeAllRanges(); - selection.addRange(range); - } - else if (document.body && document.body.createTextRange && - (range = document.body.createTextRange())) { - range.moveToElementText(node); - range.select(); - } - }).defer(); - return true; - } - else return false; - }, - downloadCSV: function(){ - var i, csv = '"x"', - series = this.series, - dg = this.loadDataGrid(); - - for (i = 0; i < series.length; ++i) { - csv += '%09"'+(series[i].label || String.fromCharCode(65+i))+'"'; // \t - } - csv += "%0D%0A"; // \r\n - - for (i = 0; i < dg.length; ++i) { - if (this.options.xaxis.ticks) { - var tick = this.options.xaxis.ticks.find(function (x) { return x[0] == dg[i][0] }); - if (tick) dg[i][0] = tick[1]; - } else { - dg[i][0] = this.options.xaxis.tickFormatter(dg[i][0]); - } - csv += dg[i].join('%09')+"%0D%0A"; // \t and \r\n - } - if (Prototype.Browser.IE) { - csv = csv.gsub('%09', '\t').gsub('%0A', '\n').gsub('%0D', '\r'); - window.open().document.write(csv); - } - else { - window.open('data:text/csv,'+csv); - } - }, - /** - * Initializes event some handlers. - */ - initEvents: function () { - //@todo: maybe stopObserving with only flotr functions - this.overlay.stopObserving(); - this.overlay.observe('mousedown', this.mouseDownHandler.bind(this)); - this.overlay.observe('mousemove', this.mouseMoveHandler.bind(this)); - this.overlay.observe('click', this.clickHandler.bind(this)); - }, - /** - * Function determines the min and max values for the xaxis and yaxis. - */ - findDataRanges: function(){ - var s = this.series, - a = this.axes; - - a.x.datamin = 0; a.x.datamax = 0; - a.x2.datamin = 0; a.x2.datamax = 0; - a.y.datamin = 0; a.y.datamax = 0; - a.y2.datamin = 0; a.y2.datamax = 0; - - if(s.length > 0){ - var i, j, h, x, y, data, xaxis, yaxis; - - // Get datamin, datamax start values - for(i = 0; i < s.length; ++i) { - data = s[i].data, - xaxis = s[i].xaxis, - yaxis = s[i].yaxis; - - if (data.length > 0 && !s[i].hide) { - if (!xaxis.used) xaxis.datamin = xaxis.datamax = data[0][0]; - if (!yaxis.used) yaxis.datamin = yaxis.datamax = data[0][1]; - xaxis.used = true; - yaxis.used = true; - - for(h = data.length - 1; h > -1; --h){ - x = data[h][0]; - if(x < xaxis.datamin) xaxis.datamin = x; - else if(x > xaxis.datamax) xaxis.datamax = x; - - for(j = 1; j < data[h].length; j++){ - y = data[h][j]; - if(y < yaxis.datamin) yaxis.datamin = y; - else if(y > yaxis.datamax) yaxis.datamax = y; - } - } - } - if (this.options.radarChartMode) { - xaxis.datamin = yaxis.datamin = - yaxis.datamax; - xaxis.datamax = yaxis.datamax; - if (!this.options.radarChartSides) this.options.radarChartSides = data.length; - } - } - } - - this.findXAxesValues(); - - this.calculateRange(a.x); - this.extendXRangeIfNeededByBar(a.x); - - if (a.x2.used) { - this.calculateRange(a.x2); - this.extendXRangeIfNeededByBar(a.x2); - } - - this.calculateRange(a.y); - this.extendYRangeIfNeededByBar(a.y); - - if (a.y2.used) { - this.calculateRange(a.y2); - this.extendYRangeIfNeededByBar(a.y2); - } - }, - /** - * Calculates the range of an axis to apply autoscaling. - */ - calculateRange: function(axis){ - var o = axis.options, - min = o.min != null ? o.min : axis.datamin, - max = o.max != null ? o.max : axis.datamax, - margin; - - if(max - min == 0.0){ - var widen = (max == 0.0) ? 1.0 : 0.01; - min -= widen; - max += widen; - } - axis.tickSize = Flotr.getTickSize(o.noTicks, ((this.options.radarChartMode) ? 0 : min), max, o.tickDecimals); - - // Autoscaling. - if(o.min == null){ - // Add a margin. - margin = o.autoscaleMargin; - if(margin != 0){ - min -= axis.tickSize * margin; - - // Make sure we don't go below zero if all values are positive. - if(min < 0 && axis.datamin >= 0) min = 0; - min = axis.tickSize * Math.floor(min / axis.tickSize); - } - } - if(o.max == null){ - margin = o.autoscaleMargin; - if(margin != 0){ - max += axis.tickSize * margin; - if(max > 0 && axis.datamax <= 0) max = 0; - max = axis.tickSize * Math.ceil(max / axis.tickSize); - } - } - axis.min = min; - axis.max = max; - }, - /** - * Bar series autoscaling in x direction. - */ - extendXRangeIfNeededByBar: function(axis){ - if(axis.options.max == null){ - var newmax = axis.max, - i, s, b, c, - stackedSums = [], - lastSerie = null; - - for(i = 0; i < this.series.length; ++i){ - s = this.series[i]; - b = s.bars; - c = s.candles; - if(s.axis == axis && (b.show || c.show)) { - if (!b.horizontal && (b.barWidth + axis.datamax > newmax) || (c.candleWidth + axis.datamax > newmax)){ - newmax = axis.max + s.bars.barWidth; - } - if(b.stacked && b.horizontal){ - for (j = 0; j < s.data.length; j++) { - if (s.bars.show && s.bars.stacked) { - var x = s.data[j][0]; - stackedSums[x] = (stackedSums[x] || 0) + s.data[j][1]; - lastSerie = s; - } - } - - for (j = 0; j < stackedSums.length; j++) { - newmax = Math.max(stackedSums[j], newmax); - } - } - } - } - axis.lastSerie = lastSerie; - axis.max = newmax; - } - }, - /** - * Bar series autoscaling in y direction. - */ - extendYRangeIfNeededByBar: function(axis){ - if(axis.options.max == null){ - var newmax = axis.max, - i, s, b, c, - stackedSums = [], - lastSerie = null; - - for(i = 0; i < this.series.length; ++i){ - s = this.series[i]; - b = s.bars; - c = s.candles; - if (s.yaxis == axis && b.show && !s.hide) { - if (b.horizontal && (b.barWidth + axis.datamax > newmax) || (c.candleWidth + axis.datamax > newmax)){ - newmax = axis.max + b.barWidth; - } - if(b.stacked && !b.horizontal){ - for (j = 0; j < s.data.length; j++) { - if (s.bars.show && s.bars.stacked) { - var x = s.data[j][0]; - stackedSums[x] = (stackedSums[x] || 0) + s.data[j][1]; - lastSerie = s; - } - } - - for (j = 0; j < stackedSums.length; j++) { - newmax = Math.max(stackedSums[j], newmax); - } - } - } - } - axis.lastSerie = lastSerie; - axis.max = newmax; - } - }, - /** - * Find every values of the x axes - */ - findXAxesValues: function(){ - for(i = this.series.length-1; i > -1 ; --i){ - s = this.series[i]; - s.xaxis.values = s.xaxis.values || []; - for (j = s.data.length-1; j > -1 ; --j){ - s.xaxis.values[s.data[j][0]] = {}; - } - } - }, - /** - * Calculate axis ticks. - * @param {Object} axis - axis object - * @param {Object} o - axis options - */ - calculateTicks: function(axis){ - var o = axis.options, i, v; - - axis.ticks = []; - if(o.ticks){ - var ticks = o.ticks, t, label; - - if(Object.isFunction(ticks)){ - ticks = ticks({min: axis.min, max: axis.max}); - } - - // Clean up the user-supplied ticks, copy them over. - for(i = 0; i < ticks.length; ++i){ - t = ticks[i]; - if(typeof(t) == 'object'){ - v = t[0]; - label = (t.length > 1) ? t[1] : o.tickFormatter(v); - }else{ - v = t; - label = o.tickFormatter(v); - } - axis.ticks[i] = { v: v, label: label }; - } - } - else { - // Round to nearest multiple of tick size. - var start = axis.tickSize * Math.ceil(axis.min / axis.tickSize), - decimals; - - // Then store all possible ticks. - for(i = 0; start + i * axis.tickSize <= axis.max; ++i){ - v = start + i * axis.tickSize; - - // Round (this is always needed to fix numerical instability). - decimals = o.tickDecimals; - if(decimals == null) decimals = 1 - Math.floor(Math.log(axis.tickSize) / Math.LN10); - if(decimals < 0) decimals = 0; - - v = v.toFixed(decimals); - axis.ticks.push({ v: v, label: o.tickFormatter(v) }); - } - } - }, - /** - * Calculates axis label sizes. - */ - calculateSpacing: function(){ - var a = this.axes, - options = this.options, - series = this.series, - margin = options.grid.labelMargin, - x = a.x, - x2 = a.x2, - y = a.y, - y2 = a.y2, - maxOutset = 2, - i, j, l, dim; - - // Labels width and height - [x, x2, y, y2].each(function(axis) { - var maxLabel = ''; - - if (axis.options.showLabels) { - for(i = 0; i < axis.ticks.length; ++i){ - l = axis.ticks[i].label.length; - if(l > maxLabel.length){ - maxLabel = axis.ticks[i].label; - } - } - } - axis.maxLabel = this.getTextDimensions(maxLabel, {size:options.fontSize, angle: Flotr.toRad(axis.options.labelsAngle)}, 'font-size:smaller;', 'flotr-grid-label'); - axis.titleSize = this.getTextDimensions(axis.options.title, {size: options.fontSize*1.2, angle: Flotr.toRad(axis.options.titleAngle)}, 'font-weight:bold;', 'flotr-axis-title'); - }, this); - - // Title height - dim = this.getTextDimensions(options.title, {size: options.fontSize*1.5}, 'font-size:1em;font-weight:bold;', 'flotr-title'); - this.titleHeight = dim.height; - - // Subtitle height - dim = this.getTextDimensions(options.subtitle, {size: options.fontSize}, 'font-size:smaller;', 'flotr-subtitle'); - this.subtitleHeight = dim.height; - - // Grid outline line width. - if(options.show){ - maxOutset = Math.max(maxOutset, options.points.radius + options.points.lineWidth/2); - } - for(j = 0; j < options.length; ++j){ - if (series[j].points.show){ - maxOutset = Math.max(maxOutset, series[j].points.radius + series[j].points.lineWidth/2); - } - } - - var p = this.plotOffset = {left: 0, right: 0, top: 0, bottom: 0}; - p.left = p.right = p.top = p.bottom = maxOutset; - - p.bottom += (x.options.showLabels ? (x.maxLabel.height + margin) : 0) + - (x.options.title ? (x.titleSize.height + margin) : 0); - - p.top += (x2.options.showLabels ? (x2.maxLabel.height + margin) : 0) + - (x2.options.title ? (x2.titleSize.height + margin) : 0) + this.subtitleHeight + this.titleHeight + - this.options.radarChartMode ? (y.options.showLabels ? (y.maxLabel.height + margin) : 0) : 0; - - p.left += (y.options.showLabels ? (y.maxLabel.width + margin) : 0) + - (y.options.title ? (y.titleSize.width + margin) : 0); - - p.right += (y2.options.showLabels ? (y2.maxLabel.width + margin) : 0) + - (y2.options.title ? (y2.titleSize.width + margin) : 0) + - this.options.radarChartMode ? (x.options.showLabels ? (x.maxLabel.width + margin) : 0) : 0; - - p.top = Math.floor(p.top); // In order the outline not to be blured - - this.plotWidth = this.canvasWidth - p.left - p.right; - this.plotHeight = this.canvasHeight - p.bottom - p.top; - - x.scale = this.plotWidth / (x.max - x.min); - x2.scale = this.plotWidth / (x2.max - x2.min); - y.scale = this.plotHeight / (y.max - y.min); - y2.scale = this.plotHeight / (y2.max - y2.min); - }, - /** - * Draws grid, labels and series. - */ - draw: function() { - this.drawGrid(); - this.drawLabels(); - this.drawTitles(); - - if(this.series.length){ - this.el.fire('flotr:beforedraw', [this.series, this]); - for(var i = 0; i < this.series.length; i++){ - if (!this.series[i].hide) - this.drawSeries(this.series[i]); - } - } - this.el.fire('flotr:afterdraw', [this.series, this]); - }, - /** - * Translates absolute horizontal x coordinates to relative coordinates. - * @param {Integer} x - absolute integer x coordinate - * @return {Integer} translated relative x coordinate - */ - tHoz: function(x, axis){ - axis = axis || this.axes.x; - return (x - axis.min) * axis.scale; - }, - /** - * Translates absolute vertical x coordinates to relative coordinates. - * @param {Integer} y - absolute integer y coordinate - * @return {Integer} translated relative y coordinate - */ - tVert: function(y, axis){ - axis = axis || this.axes.y; - return this.plotHeight - (y - axis.min) * axis.scale; - }, - /** - * Draws a grid for the graph. - */ - drawGrid: function(){ - if (this.options.radarChartMode) { // If we are in radar chart mode call drawRadarGrid instead and exit - this.drawRadarGrid(); - return; - } - var v, o = this.options, - ctx = this.ctx; - if(o.grid.verticalLines || o.grid.horizontalLines){ - this.el.fire('flotr:beforegrid', [this.axes.x, this.axes.y, o, this]); - } - ctx.save(); - ctx.translate(this.plotOffset.left, this.plotOffset.top); - - // Draw grid background, if present in options. - if(o.grid.backgroundColor != null){ - ctx.fillStyle = o.grid.backgroundColor; - ctx.fillRect(0, 0, this.plotWidth, this.plotHeight); - } - - // Draw grid lines in vertical direction. - ctx.lineWidth = 1; - ctx.strokeStyle = o.grid.tickColor; - ctx.beginPath(); - if(o.grid.verticalLines){ - for(var i = 0; i < this.axes.x.ticks.length; ++i){ - v = this.axes.x.ticks[i].v; - // Don't show lines on upper and lower bounds. - if ((v == this.axes.x.min || v == this.axes.x.max) && o.grid.outlineWidth != 0) - continue; - - ctx.moveTo(Math.floor(this.tHoz(v)) + ctx.lineWidth/2, 0); - ctx.lineTo(Math.floor(this.tHoz(v)) + ctx.lineWidth/2, this.plotHeight); - } - } - - // Draw grid lines in horizontal direction. - if(o.grid.horizontalLines){ - for(var j = 0; j < this.axes.y.ticks.length; ++j){ - v = this.axes.y.ticks[j].v; - // Don't show lines on upper and lower bounds. - if ((v == this.axes.y.min || v == this.axes.y.max) && o.grid.outlineWidth != 0) - continue; - - ctx.moveTo(0, Math.floor(this.tVert(v)) + ctx.lineWidth/2); - ctx.lineTo(this.plotWidth, Math.floor(this.tVert(v)) + ctx.lineWidth/2); - } - } - ctx.stroke(); - - // Draw axis/grid border. - if(o.grid.outlineWidth != 0) { - ctx.lineWidth = o.grid.outlineWidth; - ctx.strokeStyle = o.grid.color; - ctx.lineJoin = 'round'; - ctx.strokeRect(0, 0, this.plotWidth, this.plotHeight); - } - ctx.restore(); - if(o.grid.verticalLines || o.grid.horizontalLines){ - this.el.fire('flotr:aftergrid', [this.axes.x, this.axes.y, o, this]); - } - }, - /** - * Draws a grid for the graph. - */ - drawRadarGrid: function(){ - - var v, o = this.options, - ctx = this.ctx; - - var sides = this.options.radarChartSides, - degreesInRadiansForAngle = Math.PI * 2 / sides, - nintyDegrees = Math.PI / 2; - - if(o.grid.verticalLines || o.grid.horizontalLines){ - this.el.fire('flotr:beforegrid', [this.axes.x, this.axes.y, o, this]); - } - ctx.save(); - ctx.translate(this.plotOffset.left, this.plotOffset.top); - ctx.lineJoin = 'round'; - - // Draw grid background, if present in options. - if(o.grid.backgroundColor != null){ - ctx.fillStyle = o.grid.backgroundColor; - ctx.fillRect(0, 0, this.plotWidth, this.plotHeight); - } - - // Draw grid lines - var regPoly = {}; - regPoly.xaxis = {}; - regPoly.yaxis = {}; - regPoly.xaxis.min = regPoly.yaxis.min = this.axes.x.min; - regPoly.xaxis.max = regPoly.yaxis.max = this.axes.x.max; - regPoly.xaxis.scale = this.plotWidth / (this.axes.x.max - this.axes.x.min); - regPoly.yaxis.scale = this.plotHeight / (this.axes.x.max - this.axes.x.min); - - ctx.lineWidth = 1; - ctx.strokeStyle = o.grid.tickColor; - - if(o.grid.horizontalLines){ - for(var j = 0; j < this.axes.y.ticks.length; ++j){ - v = this.axes.y.ticks[j].v; - if (v < 0) continue; - // Don't show lines on upper and lower bounds. - if ((v == this.axes.y.min || v == this.axes.y.max) && o.grid.outlineWidth != 0) - continue; - regPoly.data = new Array(); - for (i = 0; i < sides; i++) { - angle = nintyDegrees + (degreesInRadiansForAngle * i); - regPoly.data[i] = [v * Math.cos(angle), v * Math.sin(angle)] - } - regPoly.data[sides] = regPoly.data[0]; - this.plotLine(regPoly,0); - } - } - - // Draw axis/grid border. - if(o.grid.outlineWidth != 0) { - ctx.lineWidth = o.grid.outlineWidth; - ctx.strokeStyle = o.grid.color; - regPoly.data = new Array(); - var radius = this.axes.x.max; - for (i = 0; i < sides; i++) { - angle = nintyDegrees + (degreesInRadiansForAngle * i); - regPoly.data[i] = [radius * Math.cos(angle), radius * Math.sin(angle)] - } - regPoly.data[sides] = regPoly.data[0]; - this.plotLine(regPoly,0); - } - - ctx.lineWidth = 1; - ctx.strokeStyle = o.grid.tickColor; - ctx.beginPath(); - - if(o.grid.verticalLines){ - for(var i = 0; i < sides; ++i){ - ctx.moveTo(Math.floor(this.tHoz(0)) + ctx.lineWidth/2, - Math.floor(this.tVert(0)) + ctx.lineWidth/2); - ctx.lineTo(Math.floor(this.tHoz(regPoly.data[i][0])) + ctx.lineWidth/2, - Math.floor(this.tVert(regPoly.data[i][1])) + ctx.lineWidth/2); - } - } - - ctx.stroke(); - - ctx.restore(); - if(o.grid.verticalLines || o.grid.horizontalLines){ - this.el.fire('flotr:aftergrid', [this.axes.x, this.axes.y, o, this]); - } - }, - /** - * Draws labels aroung radar chart - */ - drawRadarLabels:function(){ - var ctx = this.ctx, - options = this.options, - axis = this.axes.x, - tick, minY = 0, maxY = 0, - xOffset, yOffset; - var style = { - size: options.fontSize, - adjustAlign: true - }; - style.color = axis.options.color || options.grid.color; - style.angle = Flotr.toRad(axis.options.labelsAngle); - var radius = axis.max * 1, - closeTo = axis.max * 0.1, - sides = this.options.radarChartSides, - degreesInRadiansForAngle = Math.PI * 2 / sides, - nintyDegrees = Math.PI / 2, - posdata = new Array(); - for (i = 0; i < sides; i++) { - angle = nintyDegrees + (degreesInRadiansForAngle * i); - posdata[i] = [radius * Math.cos(angle), radius * Math.sin(angle)]; - if (minY > posdata[i][1]) minY = posdata[i][1]; - if (maxY < posdata[i][1]) maxY = posdata[i][1]; - } - for (i = 0; i < sides; i++) { - tick = axis.ticks[i]; - if(!tick.label || tick.label.length == 0) continue; - yOffset = 0; - if (posdata[i][0] > 0) { - style.halign = 'l'; - xOffset = options.grid.labelMargin; - } else { - style.halign = 'r'; - xOffset = - options.grid.labelMargin; - } - style.valign = 'm'; - - if ((posdata[i][1] + closeTo) >= minY && (posdata[i][1] - closeTo) <= minY) { - style.valign = 't' ; - style.halign = 'c'; - yOffset = options.grid.labelMargin; - }; - if (posdata[i][1] == maxY) { - style.valign = 'b' ; - style.halign = 'c'; - yOffset = - options.grid.labelMargin; - } - ctx.drawText( - tick.label, - this.plotOffset.left + this.tHoz(posdata[i][0]) + xOffset, - this.plotOffset.top + this.tVert(posdata[i][1]) + yOffset, - style - ); - } - - }, - /** - * Draws labels for x and y axis. - */ - drawLabels: function(){ - // Construct fixed width label boxes, which can be styled easily. - var noLabels = 0, axis, - xBoxWidth, i, html, tick, - options = this.options, - ctx = this.ctx, - a = this.axes; - - for(i = 0; i < a.x.ticks.length; ++i){ - if (a.x.ticks[i].label) { - ++noLabels; - } - } - xBoxWidth = this.plotWidth / noLabels; - - if (!options.HtmlText && this.textEnabled) { - var style = { - size: options.fontSize, - adjustAlign: true - }; - - // Add x labels. - if (options.radarChartMode) { - this.drawRadarLabels();} else { - axis = a.x; - style.color = axis.options.color || options.grid.color; - for(i = 0; i < axis.ticks.length && axis.options.showLabels && axis.used; ++i){ - tick = axis.ticks[i]; - if(!tick.label || tick.label.length == 0) continue; - - style.angle = Flotr.toRad(axis.options.labelsAngle); - style.halign = 'c'; - style.valign = 't'; - - ctx.drawText( - tick.label, - this.plotOffset.left + this.tHoz(tick.v, axis), - this.plotOffset.top + this.plotHeight + options.grid.labelMargin, - style - ); - }} - - // Add x2 labels. - axis = a.x2; - style.color = axis.options.color || options.grid.color; - for(i = 0; i < axis.ticks.length && axis.options.showLabels && axis.used; ++i){ - tick = axis.ticks[i]; - if(!tick.label || tick.label.length == 0) continue; - - style.angle = Flotr.toRad(axis.options.labelsAngle); - style.halign = 'c'; - style.valign = 'b'; - - ctx.drawText( - tick.label, - this.plotOffset.left + this.tHoz(tick.v, axis), - this.plotOffset.top + options.grid.labelMargin, - style - ); - } - - // Add y labels. - axis = a.y; - style.color = axis.options.color || options.grid.color; - for(i = 0; i < axis.ticks.length && axis.options.showLabels && axis.used; ++i){ - tick = axis.ticks[i]; - if (!tick.label || tick.label.length == 0 || (tick.v < 0 && this.options.radarChartMode)) continue; - - style.angle = Flotr.toRad(axis.options.labelsAngle); - style.halign = 'r'; - style.valign = 'm'; - - ctx.drawText( - tick.label, - this.plotOffset.left + (this.options.radarChartMode ? this.tHoz(0) : 0) - options.grid.labelMargin, - this.plotOffset.top + this.tVert(tick.v, axis), - style - ); - } - - // Add y2 labels. - axis = a.y2; - style.color = axis.options.color || options.grid.color; - for(i = 0; i < axis.ticks.length && axis.options.showLabels && axis.used; ++i){ - tick = axis.ticks[i]; - if (!tick.label || tick.label.length == 0) continue; - - style.angle = Flotr.toRad(axis.options.labelsAngle); - style.halign = 'l'; - style.valign = 'm'; - - ctx.drawText( - tick.label, - this.plotOffset.left + this.plotWidth + options.grid.labelMargin, - this.plotOffset.top + this.tVert(tick.v, axis), - style - ); - - ctx.save(); - ctx.strokeStyle = style.color; - ctx.beginPath(); - ctx.moveTo(this.plotOffset.left + this.plotWidth - 8, this.plotOffset.top + this.tVert(tick.v, axis)); - ctx.lineTo(this.plotOffset.left + this.plotWidth, this.plotOffset.top + this.tVert(tick.v, axis)); - ctx.stroke(); - ctx.restore(); - } - } - else if (a.x.options.showLabels || - a.x2.options.showLabels || - a.y.options.showLabels || - a.y2.options.showLabels) { - html = ['
']; - - // Add x labels. - axis = a.x; - if (axis.options.showLabels){ - for(i = 0; i < axis.ticks.length; ++i){ - tick = axis.ticks[i]; - if(!tick.label || tick.label.length == 0) continue; - html.push('
' + tick.label + '
'); - } - } - - // Add x2 labels. - axis = a.x2; - if (axis.options.showLabels && axis.used){ - for(i = 0; i < axis.ticks.length; ++i){ - tick = axis.ticks[i]; - if(!tick.label || tick.label.length == 0) continue; - html.push('
' + tick.label + '
'); - } - } - - // Add y labels. - axis = a.y; - if (axis.options.showLabels){ - for(i = 0; i < axis.ticks.length; ++i){ - tick = axis.ticks[i]; - if (!tick.label || tick.label.length == 0) continue; - html.push('
' + tick.label + '
'); - } - } - - // Add y2 labels. - axis = a.y2; - if (axis.options.showLabels && axis.used){ - ctx.save(); - ctx.strokeStyle = axis.options.color || options.grid.color; - ctx.beginPath(); - - for(i = 0; i < axis.ticks.length; ++i){ - tick = axis.ticks[i]; - if (!tick.label || tick.label.length == 0) continue; - html.push('
' + tick.label + '
'); - - ctx.moveTo(this.plotOffset.left + this.plotWidth - 8, this.plotOffset.top + this.tVert(tick.v, axis)); - ctx.lineTo(this.plotOffset.left + this.plotWidth, this.plotOffset.top + this.tVert(tick.v, axis)); - } - ctx.stroke(); - ctx.restore(); - } - - html.push('
'); - this.el.insert(html.join('')); - } - }, - /** - * Draws the title and the subtitle - */ - drawTitles: function(){ - var html, - options = this.options, - margin = options.grid.labelMargin, - ctx = this.ctx, - a = this.axes; - - if (!options.HtmlText && this.textEnabled) { - var style = { - size: options.fontSize, - color: options.grid.color, - halign: 'c' - }; - - // Add subtitle - if (options.subtitle){ - ctx.drawText( - options.subtitle, - this.plotOffset.left + this.plotWidth/2, - this.titleHeight + this.subtitleHeight - 2, - style - ); - } - - style.weight = 1.5; - style.size *= 1.5; - - // Add title - if (options.title){ - ctx.drawText( - options.title, - this.plotOffset.left + this.plotWidth/2, - this.titleHeight - 2, - style - ); - } - - style.weight = 1.8; - style.size *= 0.8; - style.adjustAlign = true; - - // Add x axis title - if (a.x.options.title && a.x.used){ - style.halign = 'c'; - style.valign = 't'; - style.angle = Flotr.toRad(a.x.options.titleAngle); - ctx.drawText( - a.x.options.title, - this.plotOffset.left + this.plotWidth/2, - this.plotOffset.top + a.x.maxLabel.height + this.plotHeight + 2 * margin, - style - ); - } - - // Add x2 axis title - if (a.x2.options.title && a.x2.used){ - style.halign = 'c'; - style.valign = 'b'; - style.angle = Flotr.toRad(a.x2.options.titleAngle); - ctx.drawText( - a.x2.options.title, - this.plotOffset.left + this.plotWidth/2, - this.plotOffset.top - a.x2.maxLabel.height - 2 * margin, - style - ); - } - - // Add y axis title - if (a.y.options.title && a.y.used){ - style.halign = 'r'; - style.valign = 'm'; - style.angle = Flotr.toRad(a.y.options.titleAngle); - ctx.drawText( - a.y.options.title, - this.plotOffset.left - a.y.maxLabel.width - 2 * margin, - this.plotOffset.top + this.plotHeight / 2, - style - ); - } - - // Add y2 axis title - if (a.y2.options.title && a.y2.used){ - style.halign = 'l'; - style.valign = 'm'; - style.angle = Flotr.toRad(a.y2.options.titleAngle); - ctx.drawText( - a.y2.options.title, - this.plotOffset.left + this.plotWidth + a.y2.maxLabel.width + 2 * margin, - this.plotOffset.top + this.plotHeight / 2, - style - ); - } - } - else { - html = ['
']; - - // Add title - if (options.title){ - html.push('
'+options.title+'
'); - } - - // Add subtitle - if (options.subtitle){ - html.push('
'+options.subtitle+'
'); - } - html.push('
'); - - - html.push('
'); - // Add x axis title - if (a.x.options.title && a.x.used){ - html.push('
' + a.x.options.title + '
'); - } - - // Add x2 axis title - if (a.x2.options.title && a.x2.used){ - html.push('
' + a.x2.options.title + '
'); - } - - // Add y axis title - if (a.y.options.title && a.y.used){ - html.push('
' + a.y.options.title + '
'); - } - - // Add y2 axis title - if (a.y2.options.title && a.y2.used){ - html.push('
' + a.y2.options.title + '
'); - } - html.push('
'); - - this.el.insert(html.join('')); - } - }, - /** - * Actually draws the graph. - * @param {Object} series - series to draw - */ - drawSeries: function(series){ - series = series || this.series; - - var drawn = false; - for(var type in Flotr._registeredTypes){ - if(series[type] && series[type].show){ - this[Flotr._registeredTypes[type]](series); - drawn = true; - } - } - - if(!drawn){ - this[Flotr._registeredTypes[this.options.defaultType]](series); - } - }, - - plotLine: function(series, offset){ - var ctx = this.ctx, - xa = series.xaxis, - ya = series.yaxis, - tHoz = this.tHoz.bind(this), - tVert = this.tVert.bind(this), - data = series.data; - - if(data.length < 2) return; - - var prevx = tHoz(data[0][0], xa), - prevy = tVert(data[0][1], ya) + offset; - ctx.beginPath(); - ctx.moveTo(prevx, prevy); - for(var i = 0; i < data.length - 1; ++i){ - var x1 = data[i][0], y1 = data[i][1], - x2 = data[i+1][0], y2 = data[i+1][1]; - - // To allow empty values - if (y1 === null || y2 === null) continue; - - /** - * Clip with ymin. - */ - if(y1 <= y2 && y1 < ya.min){ - /** - * Line segment is outside the drawing area. - */ - if(y2 < ya.min) continue; - - /** - * Compute new intersection point. - */ - x1 = (ya.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = ya.min; - }else if(y2 <= y1 && y2 < ya.min){ - if(y1 < ya.min) continue; - x2 = (ya.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = ya.min; - } - - /** - * Clip with ymax. - */ - if(y1 >= y2 && y1 > ya.max) { - if(y2 > ya.max) continue; - x1 = (ya.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = ya.max; - } - else if(y2 >= y1 && y2 > ya.max){ - if(y1 > ya.max) continue; - x2 = (ya.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = ya.max; - } - - /** - * Clip with xmin. - */ - if(x1 <= x2 && x1 < xa.min){ - if(x2 < xa.min) continue; - y1 = (xa.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = xa.min; - }else if(x2 <= x1 && x2 < xa.min){ - if(x1 < xa.min) continue; - y2 = (xa.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = xa.min; - } - - /** - * Clip with xmax. - */ - if(x1 >= x2 && x1 > xa.max){ - if (x2 > xa.max) continue; - y1 = (xa.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = xa.max; - }else if(x2 >= x1 && x2 > xa.max){ - if(x1 > xa.max) continue; - y2 = (xa.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = xa.max; - } - - if(prevx != tHoz(x1, xa) || prevy != tVert(y1, ya) + offset) - ctx.moveTo(tHoz(x1, xa), tVert(y1, ya) + offset); - - prevx = tHoz(x2, xa); - prevy = tVert(y2, ya) + offset; - ctx.lineTo(prevx, prevy); - } - ctx.stroke(); - }, - /** - * Function used to fill - * @param {Object} data - */ - plotLineArea: function(series, offset){ - var data = series.data; - if(data.length < 2) return; - - var top, lastX = 0, - ctx = this.ctx, - xa = series.xaxis, - ya = series.yaxis, - tHoz = this.tHoz.bind(this), - tVert = this.tVert.bind(this), - bottom = Math.min(Math.max(0, ya.min), ya.max), - first = true; - - ctx.beginPath(); - for(var i = 0; i < data.length - 1; ++i){ - - var x1 = data[i][0], y1 = data[i][1], - x2 = data[i+1][0], y2 = data[i+1][1]; - - if(x1 <= x2 && x1 < xa.min){ - if(x2 < xa.min) continue; - y1 = (xa.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = xa.min; - }else if(x2 <= x1 && x2 < xa.min){ - if(x1 < xa.min) continue; - y2 = (xa.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = xa.min; - } - - if(x1 >= x2 && x1 > xa.max){ - if(x2 > xa.max) continue; - y1 = (xa.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = xa.max; - }else if(x2 >= x1 && x2 > xa.max){ - if (x1 > xa.max) continue; - y2 = (xa.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = xa.max; - } - - if(first){ - ctx.moveTo(tHoz(x1, xa), tVert(bottom, ya) + offset); - first = false; - } - - /** - * Now check the case where both is outside. - */ - if(y1 >= ya.max && y2 >= ya.max){ - ctx.lineTo(tHoz(x1, xa), tVert(ya.max, ya) + offset); - ctx.lineTo(tHoz(x2, xa), tVert(ya.max, ya) + offset); - continue; - }else if(y1 <= ya.min && y2 <= ya.min){ - ctx.lineTo(tHoz(x1, xa), tVert(ya.min, ya) + offset); - ctx.lineTo(tHoz(x2, xa), tVert(ya.min, ya) + offset); - continue; - } - - /** - * Else it's a bit more complicated, there might - * be two rectangles and two triangles we need to fill - * in; to find these keep track of the current x values. - */ - var x1old = x1, x2old = x2; - - /** - * And clip the y values, without shortcutting. - * Clip with ymin. - */ - if(y1 <= y2 && y1 < ya.min && y2 >= ya.min){ - x1 = (ya.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = ya.min; - }else if(y2 <= y1 && y2 < ya.min && y1 >= ya.min){ - x2 = (ya.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = ya.min; - } - - /** - * Clip with ymax. - */ - if(y1 >= y2 && y1 > ya.max && y2 <= ya.max){ - x1 = (ya.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = ya.max; - }else if(y2 >= y1 && y2 > ya.max && y1 <= ya.max){ - x2 = (ya.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = ya.max; - } - - /** - * If the x value was changed we got a rectangle to fill. - */ - if(x1 != x1old){ - top = (y1 <= ya.min) ? top = ya.min : ya.max; - ctx.lineTo(tHoz(x1old, xa), tVert(top, ya) + offset); - ctx.lineTo(tHoz(x1, xa), tVert(top, ya) + offset); - } - - /** - * Fill the triangles. - */ - ctx.lineTo(tHoz(x1, xa), tVert(y1, ya) + offset); - ctx.lineTo(tHoz(x2, xa), tVert(y2, ya) + offset); - - /** - * Fill the other rectangle if it's there. - */ - if(x2 != x2old){ - top = (y2 <= ya.min) ? ya.min : ya.max; - ctx.lineTo(tHoz(x2old, xa), tVert(top, ya) + offset); - ctx.lineTo(tHoz(x2, xa), tVert(top, ya) + offset); - } - - lastX = Math.max(x2, x2old); - } - - ctx.lineTo(tHoz(lastX, xa), tVert(bottom, ya) + offset); - ctx.closePath(); - ctx.fill(); - }, - /** - * Function: (private) drawSeriesLines - * - * Function draws lines series in the canvas element. - * - * Parameters: - * series - Series with options.lines.show = true. - * - * Returns: - * void - */ - drawSeriesLines: function(series){ - series = series || this.series; - var ctx = this.ctx; - ctx.save(); - ctx.translate(this.plotOffset.left, this.plotOffset.top); - ctx.lineJoin = 'round'; - - var lw = series.lines.lineWidth; - var sw = series.shadowSize; - - if(sw > 0){ - ctx.lineWidth = sw / 2; - - var offset = lw/2 + ctx.lineWidth/2; - - ctx.strokeStyle = "rgba(0,0,0,0.1)"; - this.plotLine(series, offset + sw/2); - - ctx.strokeStyle = "rgba(0,0,0,0.2)"; - this.plotLine(series, offset); - - if(series.lines.fill) { - ctx.fillStyle = "rgba(0,0,0,0.05)"; - this.plotLineArea(series, offset + sw/2); - } - } - - ctx.lineWidth = lw; - ctx.strokeStyle = series.color; - if(series.lines.fill){ - ctx.fillStyle = series.lines.fillColor != null ? series.lines.fillColor : Flotr.parseColor(series.color).scale(null, null, null, series.lines.fillOpacity).toString(); - this.plotLineArea(series, 0); - } - - this.plotLine(series, 0); - ctx.restore(); - }, - /** - * Function: drawSeriesPoints - * - * Function draws point series in the canvas element. - * - * Parameters: - * series - Series with options.points.show = true. - * - * Returns: - * void - */ - drawSeriesPoints: function(series) { - var ctx = this.ctx; - - ctx.save(); - ctx.translate(this.plotOffset.left, this.plotOffset.top); - - var lw = series.lines.lineWidth; - var sw = series.shadowSize; - - if(sw > 0){ - ctx.lineWidth = sw / 2; - - ctx.strokeStyle = 'rgba(0,0,0,0.1)'; - this.plotPointShadows(series, sw/2 + ctx.lineWidth/2, series.points.radius); - - ctx.strokeStyle = 'rgba(0,0,0,0.2)'; - this.plotPointShadows(series, ctx.lineWidth/2, series.points.radius); - } - - ctx.lineWidth = series.points.lineWidth; - ctx.strokeStyle = series.color; - ctx.fillStyle = series.points.fillColor != null ? series.points.fillColor : series.color; - this.plotPoints(series, series.points.radius, series.points.fill); - ctx.restore(); - }, - plotPoints: function (series, radius, fill) { - var xa = series.xaxis, - ya = series.yaxis, - ctx = this.ctx, i, - data = series.data; - - for(i = data.length - 1; i > -1; --i){ - var x = data[i][0], y = data[i][1]; - if(x < xa.min || x > xa.max || y < ya.min || y > ya.max) - continue; - - ctx.beginPath(); - ctx.arc(this.tHoz(x, xa), this.tVert(y, ya), radius, 0, 2 * Math.PI, true); - if(fill) ctx.fill(); - ctx.stroke(); - } - }, - plotPointShadows: function(series, offset, radius){ - var xa = series.xaxis, - ya = series.yaxis, - ctx = this.ctx, i, - data = series.data; - - for(i = data.length - 1; i > -1; --i){ - var x = data[i][0], y = data[i][1]; - if (x < xa.min || x > xa.max || y < ya.min || y > ya.max) - continue; - ctx.beginPath(); - ctx.arc(this.tHoz(x, xa), this.tVert(y, ya) + offset, radius, 0, Math.PI, false); - ctx.stroke(); - } - }, - /** - * Function: drawSeriesBars - * - * Function draws bar series in the canvas element. - * - * Parameters: - * series - Series with options.bars.show = true. - * - * Returns: - * void - */ - drawSeriesBars: function(series) { - var ctx = this.ctx, - bw = series.bars.barWidth, - lw = Math.min(series.bars.lineWidth, bw); - - ctx.save(); - ctx.translate(this.plotOffset.left, this.plotOffset.top); - ctx.lineJoin = 'miter'; - - /** - * @todo linewidth not interpreted the right way. - */ - ctx.lineWidth = lw; - ctx.strokeStyle = series.color; - - this.plotBarsShadows(series, bw, 0, series.bars.fill); - - if(series.bars.fill){ - ctx.fillStyle = series.bars.fillColor != null ? series.bars.fillColor : Flotr.parseColor(series.color).scale(null, null, null, series.bars.fillOpacity).toString(); - } - - this.plotBars(series, bw, 0, series.bars.fill); - ctx.restore(); - }, - plotBars: function(series, barWidth, offset, fill){ - var data = series.data; - if(data.length < 1) return; - - var xa = series.xaxis, - ya = series.yaxis, - ctx = this.ctx, - tHoz = this.tHoz.bind(this), - tVert = this.tVert.bind(this); - - for(var i = 0; i < data.length; i++){ - var x = data[i][0], - y = data[i][1]; - var drawLeft = true, drawTop = true, drawRight = true; - - // Stacked bars - var stackOffset = 0; - if(series.bars.stacked) { - xa.values.each(function(o, v) { - if (v == x) { - stackOffset = o.stack || 0; - o.stack = stackOffset + y; - } - }); - } - - // @todo: fix horizontal bars support - // Horizontal bars - if(series.bars.horizontal) - var left = stackOffset, right = x + stackOffset, bottom = y, top = y + barWidth; - else - var left = x, right = x + barWidth, bottom = stackOffset, top = y + stackOffset; - - if(right < xa.min || left > xa.max || top < ya.min || bottom > ya.max) - continue; - - if(left < xa.min){ - left = xa.min; - drawLeft = false; - } - - if(right > xa.max){ - right = xa.max; - if (xa.lastSerie != series && series.bars.horizontal) - drawTop = false; - } - - if(bottom < ya.min) - bottom = ya.min; - - if(top > ya.max){ - top = ya.max; - if (ya.lastSerie != series && !series.bars.horizontal) - drawTop = false; - } - - /** - * Fill the bar. - */ - if(fill){ - ctx.beginPath(); - ctx.moveTo(tHoz(left, xa), tVert(bottom, ya) + offset); - ctx.lineTo(tHoz(left, xa), tVert(top, ya) + offset); - ctx.lineTo(tHoz(right, xa), tVert(top, ya) + offset); - ctx.lineTo(tHoz(right, xa), tVert(bottom, ya) + offset); - ctx.fill(); - } - - /** - * Draw bar outline/border. - */ - if(series.bars.lineWidth != 0 && (drawLeft || drawRight || drawTop)){ - ctx.beginPath(); - ctx.moveTo(tHoz(left, xa), tVert(bottom, ya) + offset); - - ctx[drawLeft ?'lineTo':'moveTo'](tHoz(left, xa), tVert(top, ya) + offset); - ctx[drawTop ?'lineTo':'moveTo'](tHoz(right, xa), tVert(top, ya) + offset); - ctx[drawRight?'lineTo':'moveTo'](tHoz(right, xa), tVert(bottom, ya) + offset); - - ctx.stroke(); - } - } - }, - plotBarsShadows: function(series, barWidth, offset){ - var data = series.data; - if(data.length < 1) return; - - var xa = series.xaxis, - ya = series.yaxis, - ctx = this.ctx, - tHoz = this.tHoz.bind(this), - tVert = this.tVert.bind(this), - sw = this.options.shadowSize; - - for(var i = 0; i < data.length; i++){ - var x = data[i][0], - y = data[i][1]; - - // Stacked bars - var stackOffset = 0; - if(series.bars.stacked) { - xa.values.each(function(o, v) { - if (v == x) { - stackOffset = o.stackShadow || 0; - o.stackShadow = stackOffset + y; - } - }); - } - - // Horizontal bars - if(series.bars.horizontal) - var left = stackOffset, right = x + stackOffset, bottom = y, top = y + barWidth; - else - var left = x, right = x + barWidth, bottom = stackOffset, top = y + stackOffset; - - if(right < xa.min || left > xa.max || top < ya.min || bottom > ya.max) - continue; - - if(left < xa.min) left = xa.min; - if(right > xa.max) right = xa.max; - if(bottom < ya.min) bottom = ya.min; - if(top > ya.max) top = ya.max; - - var width = tHoz(right, xa)-tHoz(left, xa)-((tHoz(right, xa)+sw <= this.plotWidth) ? 0 : sw); - var height = Math.max(0, tVert(bottom, ya)-tVert(top, ya)-((tVert(bottom, ya)+sw <= this.plotHeight) ? 0 : sw)); - - ctx.fillStyle = 'rgba(0,0,0,0.05)'; - ctx.fillRect(Math.min(tHoz(left, xa)+sw, this.plotWidth), Math.min(tVert(top, ya)+sw, this.plotWidth), width, height); - } - }, - /** - * Function: drawSeriesCandles - * - * Function draws candles series in the canvas element. - * - * Parameters: - * series - Series with options.candles.show = true. - * - * Returns: - * void - */ - drawSeriesCandles: function(series) { - var ctx = this.ctx, - bw = series.candles.candleWidth; - - ctx.save(); - ctx.translate(this.plotOffset.left, this.plotOffset.top); - ctx.lineJoin = 'miter'; - - /** - * @todo linewidth not interpreted the right way. - */ - ctx.lineWidth = series.candles.lineWidth; - this.plotCandlesShadows(series, bw/2); - this.plotCandles(series, bw/2); - - ctx.restore(); - }, - plotCandles: function(series, offset){ - var data = series.data; - if(data.length < 1) return; - - var xa = series.xaxis, - ya = series.yaxis, - ctx = this.ctx, - tHoz = this.tHoz.bind(this), - tVert = this.tVert.bind(this); - - for(var i = 0; i < data.length; i++){ - var d = data[i], - x = d[0], - open = d[1], - high = d[2], - low = d[3], - close = d[4]; - - var left = x, - right = x + series.candles.candleWidth, - bottom = Math.max(ya.min, low), - top = Math.min(ya.max, high), - bottom2 = Math.max(ya.min, Math.min(open, close)), - top2 = Math.min(ya.max, Math.max(open, close)); - - if(right < xa.min || left > xa.max || top < ya.min || bottom > ya.max) - continue; - - var color = series.candles[open>close?'downFillColor':'upFillColor']; - /** - * Fill the candle. - */ - if(series.candles.fill && !series.candles.barcharts){ - ctx.fillStyle = Flotr.parseColor(color).scale(null, null, null, series.candles.fillOpacity).toString(); - ctx.fillRect(tHoz(left, xa), tVert(top2, ya) + offset, tHoz(right, xa) - tHoz(left, xa), tVert(bottom2, ya) - tVert(top2, ya)); - } - - /** - * Draw candle outline/border, high, low. - */ - if(series.candles.lineWidth || series.candles.wickLineWidth){ - var x, y, pixelOffset = (series.candles.wickLineWidth % 2) / 2; - - x = Math.floor(tHoz((left + right) / 2), xa) + pixelOffset; - - ctx.save(); - ctx.strokeStyle = color; - ctx.lineWidth = series.candles.wickLineWidth; - ctx.lineCap = 'butt'; - - if (series.candles.barcharts) { - ctx.beginPath(); - - ctx.moveTo(x, Math.floor(tVert(top, ya) + offset)); - ctx.lineTo(x, Math.floor(tVert(bottom, ya) + offset)); - - y = Math.floor(tVert(open, ya) + offset)+0.5; - ctx.moveTo(Math.floor(tHoz(left, xa))+pixelOffset, y); - ctx.lineTo(x, y); - - y = Math.floor(tVert(close, ya) + offset)+0.5; - ctx.moveTo(Math.floor(tHoz(right, xa))+pixelOffset, y); - ctx.lineTo(x, y); - } - else { - ctx.strokeRect(tHoz(left, xa), tVert(top2, ya) + offset, tHoz(right, xa) - tHoz(left, xa), tVert(bottom2, ya) - tVert(top2, ya)); - - ctx.beginPath(); - ctx.moveTo(x, Math.floor(tVert(top2, ya) + offset)); - ctx.lineTo(x, Math.floor(tVert(top, ya) + offset)); - ctx.moveTo(x, Math.floor(tVert(bottom2, ya) + offset)); - ctx.lineTo(x, Math.floor(tVert(bottom, ya) + offset)); - } - - ctx.stroke(); - ctx.restore(); - } - } - }, - plotCandlesShadows: function(series, offset){ - var data = series.data; - if(data.length < 1 || series.candles.barcharts) return; - - var xa = series.xaxis, - ya = series.yaxis, - tHoz = this.tHoz.bind(this), - tVert = this.tVert.bind(this), - sw = this.options.shadowSize; - - for(var i = 0; i < data.length; i++){ - var d = data[i], - x = d[0], - open = d[1], - high = d[2], - low = d[3], - close = d[4]; - - var left = x, - right = x + series.candles.candleWidth, - bottom = Math.max(ya.min, Math.min(open, close)), - top = Math.min(ya.max, Math.max(open, close)); - - if(right < xa.min || left > xa.max || top < ya.min || bottom > ya.max) - continue; - - var width = tHoz(right, xa)-tHoz(left, xa)-((tHoz(right, xa)+sw <= this.plotWidth) ? 0 : sw); - var height = Math.max(0, tVert(bottom, ya)-tVert(top, ya)-((tVert(bottom, ya)+sw <= this.plotHeight) ? 0 : sw)); - - this.ctx.fillStyle = 'rgba(0,0,0,0.05)'; - this.ctx.fillRect(Math.min(tHoz(left, xa)+sw, this.plotWidth), Math.min(tVert(top, ya)+sw, this.plotWidth), width, height); - } - }, - /** - * Function: drawSeriesRadar - * - * Function draws a radar chart on the canvas element. - * - * Parameters: - * series - Series with options.radar.show = true. - * - * Returns: - * void - */ - drawSeriesRadar: function(series) { - var ctx = this.ctx, - options = this.options, sides= series.data.length; - - var degreesInRadiansForAngle = Math.PI * 2 / sides, - nintyDegrees = Math.PI / 2; - - var poly = {}; - - /* - Draw radar grid - - poly.xaxis = series.xaxis; - poly.yaxis = series.yaxis; - ctx.save(); - ctx.translate(this.plotOffset.left, this.plotOffset.top); - ctx.lineJoin = 'round'; - for (radius = 20; radius <= 100; radius += 20) { - poly.data = new Array(); - for (i = 0; i < sides; i++) { - angle = nintyDegrees + (degreesInRadiansForAngle * i); - poly.data[i] = [radius * Math.cos(angle), radius * Math.sin(angle)] - } - poly.data[sides] = poly.data[0]; - this.plotLine(poly,0);} - - var outside = poly.data; - for (i = 0; i < sides; i++) { - poly.data = new Array(); - poly.data[0] = [0,0]; - poly.data[1] = outside[i]; - this.plotLine(poly,0); - } - */ - - /* - Convert Series data into X, Y co-ordinates - */ - if (!series.dataInRadarFormat) { - poly.data = new Array(); - for (i = 0; i < sides; i++) { - angle = nintyDegrees + (degreesInRadiansForAngle * i); - poly.data[i] = [series.data[i][1] * Math.cos(angle), series.data[i][1] * Math.sin(angle), series.data[i][0], series.data[i][1]] - } - poly.data[sides] = poly.data[0]; - series.data = poly.data; - series.lines = series.radar; - series.lines.show = false; - series.dataInRadarFormat = true; - } - - this.drawSeriesLines(series); - -}, - - - /** - * Function: drawSeriesPie - * - * Function draws a pie in the canvas element. - * - * Parameters: - * series - Series with options.pie.show = true. - * - * Returns: - * void - */ - drawSeriesPie: function(series) { - if (!this.options.pie.drawn) { - var ctx = this.ctx, - options = this.options, - lw = series.pie.lineWidth, - sw = series.shadowSize, - data = series.data, - radius = (Math.min(this.canvasWidth, this.canvasHeight) * series.pie.sizeRatio) / 2, - html = []; - - var vScale = 1;//Math.cos(series.pie.viewAngle); - var plotTickness = Math.sin(series.pie.viewAngle)*series.pie.spliceThickness / vScale; - - var style = { - size: options.fontSize*1.2, - color: options.grid.color, - weight: 1.5 - }; - - var center = { - x: (this.canvasWidth+this.plotOffset.left)/2, - y: (this.canvasHeight-this.plotOffset.bottom)/2 - }; - - // Pie portions - var portions = this.series.collect(function(hash, index){ - if (hash.pie.show) - return { - name: (hash.label || hash.data[0][1]), - value: [index, hash.data[0][1]], - explode: hash.pie.explode - }; - }); - - // Sum of the portions' angles - var sum = portions.pluck('value').pluck(1).inject(0, function(acc, n) { return acc + n; }); - - var fraction = 0.0, - angle = series.pie.startAngle, - value = 0.0; - - var slices = portions.collect(function(slice){ - angle += fraction; - value = parseFloat(slice.value[1]); // @warning : won't support null values !! - fraction = value/sum; - return { - name: slice.name, - fraction: fraction, - x: slice.value[0], - y: value, - explode: slice.explode, - startAngle: 2 * angle * Math.PI, - endAngle: 2 * (angle + fraction) * Math.PI - }; - }); - - ctx.save(); - - if(sw > 0){ - slices.each(function (slice) { - var bisection = (slice.startAngle + slice.endAngle) / 2; - - var xOffset = center.x + Math.cos(bisection) * slice.explode + sw; - var yOffset = center.y + Math.sin(bisection) * slice.explode + sw; - - this.plotSlice(xOffset, yOffset, radius, slice.startAngle, slice.endAngle, false, vScale); - - ctx.fillStyle = 'rgba(0,0,0,0.1)'; - ctx.fill(); - }, this); - } - - if (options.HtmlText) { - html = ['
']; - } - - slices.each(function (slice, index) { - var bisection = (slice.startAngle + slice.endAngle) / 2; - var color = options.colors[index]; - - var xOffset = center.x + Math.cos(bisection) * slice.explode; - var yOffset = center.y + Math.sin(bisection) * slice.explode; - - this.plotSlice(xOffset, yOffset, radius, slice.startAngle, slice.endAngle, false, vScale); - - if(series.pie.fill){ - ctx.fillStyle = Flotr.parseColor(color).scale(null, null, null, series.pie.fillOpacity).toString(); - ctx.fill(); - } - ctx.lineWidth = lw; - ctx.strokeStyle = color; - ctx.stroke(); - - /*ctx.save(); - ctx.scale(1, vScale); - - ctx.moveTo(xOffset, yOffset); - ctx.beginPath(); - ctx.lineTo(xOffset, yOffset+plotTickness); - ctx.lineTo(xOffset+Math.cos(slice.startAngle)*radius, yOffset+Math.sin(slice.startAngle)*radius+plotTickness); - ctx.lineTo(xOffset+Math.cos(slice.startAngle)*radius, yOffset+Math.sin(slice.startAngle)*radius); - ctx.lineTo(xOffset, yOffset); - ctx.closePath(); - ctx.fill();ctx.stroke(); - - ctx.moveTo(xOffset, yOffset); - ctx.beginPath(); - ctx.lineTo(xOffset, yOffset+plotTickness); - ctx.lineTo(xOffset+Math.cos(slice.endAngle)*radius, yOffset+Math.sin(slice.endAngle)*radius+plotTickness); - ctx.lineTo(xOffset+Math.cos(slice.endAngle)*radius, yOffset+Math.sin(slice.endAngle)*radius); - ctx.lineTo(xOffset, yOffset); - ctx.closePath(); - ctx.fill();ctx.stroke(); - - ctx.moveTo(xOffset+Math.cos(slice.startAngle)*radius, yOffset+Math.sin(slice.startAngle)*radius); - ctx.beginPath(); - ctx.lineTo(xOffset+Math.cos(slice.startAngle)*radius, yOffset+Math.sin(slice.startAngle)*radius+plotTickness); - ctx.arc(xOffset, yOffset+plotTickness, radius, slice.startAngle, slice.endAngle, false); - ctx.lineTo(xOffset+Math.cos(slice.endAngle)*radius, yOffset+Math.sin(slice.endAngle)*radius); - ctx.arc(xOffset, yOffset, radius, slice.endAngle, slice.startAngle, true); - ctx.closePath(); - ctx.fill();ctx.stroke(); - - ctx.scale(1, 1/vScale); - this.plotSlice(xOffset, yOffset+plotTickness, radius, slice.startAngle, slice.endAngle, false, vScale); - ctx.stroke(); - if(series.pie.fill){ - ctx.fillStyle = Flotr.parseColor(color).scale(null, null, null, series.pie.fillOpacity).toString(); - ctx.fill(); - } - - ctx.restore();*/ - - var label = options.pie.labelFormatter(slice); - - var textAlignRight = (Math.cos(bisection) < 0); - var distX = xOffset + Math.cos(bisection) * (series.pie.explode + radius); - var distY = yOffset + Math.sin(bisection) * (series.pie.explode + radius); - - if (slice.fraction && label) { - if (options.HtmlText) { - var divStyle = 'position:absolute;top:' + (distY - 5) + 'px;'; //@todo: change - if (textAlignRight) { - divStyle += 'right:'+(this.canvasWidth - distX)+'px;text-align:right;'; - } - else { - divStyle += 'left:'+distX+'px;text-align:left;'; - } - html.push('
' + label + '
'); - } - else { - style.halign = textAlignRight ? 'r' : 'l'; - ctx.drawText( - label, - distX, - distY + style.size / 2, - style - ); - } - } - }, this); - - if (options.HtmlText) { - html.push('
'); - this.el.insert(html.join('')); - } - - ctx.restore(); - options.pie.drawn = true; - } - }, - plotSlice: function(x, y, radius, startAngle, endAngle, fill, vScale) { - var ctx = this.ctx; - vScale = vScale || 1; - - ctx.save(); - ctx.scale(1, vScale); - ctx.beginPath(); - ctx.moveTo(x, y); - ctx.arc (x, y, radius, startAngle, endAngle, fill); - ctx.lineTo(x, y); - ctx.closePath(); - ctx.restore(); - }, - plotPie: function() {}, - /** - * Function: insertLegend - * - * Function adds a legend div to the canvas container or draws it on the canvas. - * - * Parameters: - * none - * - * Returns: - * void - */ - insertLegend: function(){ - if(!this.options.legend.show) - return; - - var series = this.series, - plotOffset = this.plotOffset, - options = this.options, - fragments = [], - rowStarted = false, - ctx = this.ctx, - i; - - var noLegendItems = series.findAll(function(s) {return (s.label && !s.hide)}).size(); - - if (noLegendItems) { - if (!options.HtmlText && this.textEnabled) { - var style = { - size: options.fontSize*1.1, - color: options.grid.color - }; - - // @todo: take css into account - //var dummyDiv = this.el.insert('
'); - - var p = options.legend.position, - m = options.legend.margin, - lbw = options.legend.labelBoxWidth, - lbh = options.legend.labelBoxHeight, - lbm = options.legend.labelBoxMargin, - offsetX = plotOffset.left + m, - offsetY = plotOffset.top + m; - - // We calculate the labels' max width - var labelMaxWidth = 0; - for(i = series.length - 1; i > -1; --i){ - if(!series[i].label || series[i].hide) continue; - var label = options.legend.labelFormatter(series[i].label); - labelMaxWidth = Math.max(labelMaxWidth, ctx.measureText(label, style)); - } - - var legendWidth = Math.round(lbw + lbm*3 + labelMaxWidth), - legendHeight = Math.round(noLegendItems*(lbm+lbh) + lbm); - - if(p.charAt(0) == 's') offsetY = plotOffset.top + this.plotHeight - (m + legendHeight); - if(p.charAt(1) == 'e') offsetX = plotOffset.left + this.plotWidth - (m + legendWidth); - - // Legend box - var color = Flotr.parseColor(options.legend.backgroundColor || 'rgb(240,240,240)').scale(null, null, null, options.legend.backgroundOpacity || 0.1).toString(); - - ctx.fillStyle = color; - ctx.fillRect(offsetX, offsetY, legendWidth, legendHeight); - ctx.strokeStyle = options.legend.labelBoxBorderColor; - ctx.strokeRect(Flotr.toPixel(offsetX), Flotr.toPixel(offsetY), legendWidth, legendHeight); - - // Legend labels - var x = offsetX + lbm; - var y = offsetY + lbm; - for(i = 0; i < series.length; i++){ - if(!series[i].label || series[i].hide) continue; - var label = options.legend.labelFormatter(series[i].label); - - ctx.fillStyle = series[i].color; - ctx.fillRect(x, y, lbw-1, lbh-1); - - ctx.strokeStyle = options.legend.labelBoxBorderColor; - ctx.lineWidth = 1; - ctx.strokeRect(Math.ceil(x)-1.5, Math.ceil(y)-1.5, lbw+2, lbh+2); - - // Legend text - ctx.drawText( - label, - x + lbw + lbm, - y + (lbh + style.size - ctx.fontDescent(style))/2, - style - ); - - y += lbh + lbm; - } - } - else { - for(i = 0; i < series.length; ++i){ - if(!series[i].label || series[i].hide) continue; - - if(i % options.legend.noColumns == 0){ - fragments.push(rowStarted ? '' : ''); - rowStarted = true; - } - - var label = options.legend.labelFormatter(series[i].label); - - fragments.push('
' + - '' + label + ''); - } - if(rowStarted) fragments.push(''); - - if(fragments.length > 0){ - var table = '' + fragments.join("") + '
'; - if(options.legend.container != null){ - $(options.legend.container).update(table); - }else{ - var pos = ''; - var p = options.legend.position, m = options.legend.margin; - - if(p.charAt(0) == 'n') pos += 'top:' + (m + plotOffset.top) + 'px;'; - else if(p.charAt(0) == 's') pos += 'bottom:' + (m + plotOffset.bottom) + 'px;'; - if(p.charAt(1) == 'e') pos += 'right:' + (m + plotOffset.right) + 'px;'; - else if(p.charAt(1) == 'w') pos += 'left:' + (m + plotOffset.left) + 'px;'; - - var div = this.el.insert('
' + table + '
').select('div.flotr-legend').first(); - - if(options.legend.backgroundOpacity != 0.0){ - /** - * Put in the transparent background separately to avoid blended labels and - * label boxes. - */ - var c = options.legend.backgroundColor; - if(c == null){ - var tmp = (options.grid.backgroundColor != null) ? options.grid.backgroundColor : Flotr.extractColor(div); - c = Flotr.parseColor(tmp).adjust(null, null, null, 1).toString(); - } - this.el.insert('
').select('div.flotr-legend-bg').first().setStyle({ - 'opacity': options.legend.backgroundOpacity - }); - } - } - } - } - } - }, - /** - * Function: getEventPosition - * - * Calculates the coordinates from a mouse event object. - * - * Parameters: - * event - Mouse Event object. - * - * Returns: - * Object with x and y coordinates of the mouse. - */ - getEventPosition: function (event){ - var offset = this.overlay.cumulativeOffset(), - rx = (event.pageX - offset.left - this.plotOffset.left), - ry = (event.pageY - offset.top - this.plotOffset.top), - ax = 0, ay = 0 - - if(event.pageX == null && event.clientX != null){ - var de = document.documentElement, b = document.body; - ax = event.clientX + (de && de.scrollLeft || b.scrollLeft || 0); - ay = event.clientY + (de && de.scrollTop || b.scrollTop || 0); - }else{ - ax = event.pageX; - ay = event.pageY; - } - - return { - x: this.axes.x.min + rx / this.axes.x.scale, - x2: this.axes.x2.min + rx / this.axes.x2.scale, - y: this.axes.y.max - ry / this.axes.y.scale, - y2: this.axes.y2.max - ry / this.axes.y2.scale, - relX: rx, - relY: ry, - absX: ax, - absY: ay - }; - }, - /** - * Function: clickHandler - * - * Handler observes the 'click' event and fires the 'flotr:click' event. - * - * Parameters: - * event - 'click' Event object. - * - * Returns: - * void - */ - clickHandler: function(event){ - if(this.ignoreClick){ - this.ignoreClick = false; - return; - } - this.el.fire('flotr:click', [this.getEventPosition(event), this]); - }, - /** - * Function: mouseMoveHandler - * - * Handler observes mouse movement over the graph area. Fires the - * 'flotr:mousemove' event. - * - * Parameters: - * event - 'mousemove' Event object. - * - * Returns: - * void - */ - mouseMoveHandler: function(event){ - var pos = this.getEventPosition(event); - - this.lastMousePos.pageX = pos.absX; - this.lastMousePos.pageY = pos.absY; - if(this.selectionInterval == null && (this.options.mouse.track || this.series.any(function(s){return s.mouse && s.mouse.track;}))){ - this.hit(pos); - } - - this.el.fire('flotr:mousemove', [event, pos, this]); - }, - /** - * Function: mouseDownHandler - * - * Handler observes the 'mousedown' event. - * - * Parameters: - * event - 'mousedown' Event object. - * - * Returns: - * void - */ - mouseDownHandler: function (event){ - if(event.isRightClick()) { - event.stop(); - var overlay = this.overlay; - overlay.hide(); - - function cancelContextMenu () { - overlay.show(); - $(document).stopObserving('mousemove', cancelContextMenu); - } - $(document).observe('mousemove', cancelContextMenu); - return; - } - - if(!this.options.selection.mode || !event.isLeftClick()) return; - - this.setSelectionPos(this.selection.first, event); - if(this.selectionInterval != null){ - clearInterval(this.selectionInterval); - } - this.lastMousePos.pageX = null; - this.selectionInterval = setInterval(this.updateSelection.bind(this), 1000/this.options.selection.fps); - - this.mouseUpHandler = this.mouseUpHandler.bind(this); - $(document).observe('mouseup', this.mouseUpHandler); - }, - /** - * Function: (private) fireSelectEvent - * - * Fires the 'flotr:select' event when the user made a selection. - * - * Parameters: - * none - * - * Returns: - * void - */ - fireSelectEvent: function(){ - var a = this.axes, selection = this.selection, - x1 = (selection.first.x <= selection.second.x) ? selection.first.x : selection.second.x, - x2 = (selection.first.x <= selection.second.x) ? selection.second.x : selection.first.x, - y1 = (selection.first.y >= selection.second.y) ? selection.first.y : selection.second.y, - y2 = (selection.first.y >= selection.second.y) ? selection.second.y : selection.first.y; - - x1 = a.x.min + x1 / a.x.scale; - x2 = a.x.min + x2 / a.x.scale; - y1 = a.y.max - y1 / a.y.scale; - y2 = a.y.max - y2 / a.y.scale; - - this.el.fire('flotr:select', [{x1:x1, y1:y1, x2:x2, y2:y2}, this]); - }, - /** - * Function: (private) mouseUpHandler - * - * Handler observes the mouseup event for the document. - * - * Parameters: - * event - 'mouseup' Event object. - * - * Returns: - * void - */ - mouseUpHandler: function(event){ - $(document).stopObserving('mouseup', this.mouseUpHandler); - event.stop(); - - if(this.selectionInterval != null){ - clearInterval(this.selectionInterval); - this.selectionInterval = null; - } - - this.setSelectionPos(this.selection.second, event); - this.clearSelection(); - - if(this.selectionIsSane()){ - this.drawSelection(); - this.fireSelectEvent(); - this.ignoreClick = true; - } - }, - /** - * Function: setSelectionPos - * - * Calculates the position of the selection. - * - * Parameters: - * pos - Position object. - * event - Event object. - * - * Returns: - * void - */ - setSelectionPos: function(pos, event) { - var options = this.options, - offset = $(this.overlay).cumulativeOffset(); - - if(options.selection.mode.indexOf('x') == -1){ - pos.x = (pos == this.selection.first) ? 0 : this.plotWidth; - }else{ - pos.x = event.pageX - offset.left - this.plotOffset.left; - pos.x = Math.min(Math.max(0, pos.x), this.plotWidth); - } - - if (options.selection.mode.indexOf('y') == -1){ - pos.y = (pos == this.selection.first) ? 0 : this.plotHeight; - }else{ - pos.y = event.pageY - offset.top - this.plotOffset.top; - pos.y = Math.min(Math.max(0, pos.y), this.plotHeight); - } - }, - /** - * Function: updateSelection - * - * Updates (draws) the selection box. - * - * Parameters: - * none - * - * Returns: - * void - */ - updateSelection: function(){ - if(this.lastMousePos.pageX == null) return; - - this.setSelectionPos(this.selection.second, this.lastMousePos); - this.clearSelection(); - - if(this.selectionIsSane()) this.drawSelection(); - }, - /** - * Function: clearSelection - * - * Removes the selection box from the overlay canvas. - * - * Parameters: - * none - * - * Returns: - * void - */ - clearSelection: function() { - if(this.prevSelection == null) return; - - var prevSelection = this.prevSelection, - octx = this.octx, - plotOffset = this.plotOffset, - x = Math.min(prevSelection.first.x, prevSelection.second.x), - y = Math.min(prevSelection.first.y, prevSelection.second.y), - w = Math.abs(prevSelection.second.x - prevSelection.first.x), - h = Math.abs(prevSelection.second.y - prevSelection.first.y); - - octx.clearRect(x + plotOffset.left - octx.lineWidth, - y + plotOffset.top - octx.lineWidth, - w + octx.lineWidth*2, - h + octx.lineWidth*2); - - this.prevSelection = null; - }, - /** - * Function: setSelection - * - * Allows the user the manually select an area. - * - * Parameters: - * area - Object with coordinates to select. - * - * Returns: - * void - */ - setSelection: function(area){ - var options = this.options, - xa = this.axes.x, - ya = this.axes.y, - vertScale = yaxis.scale, - hozScale = xaxis.scale, - selX = options.selection.mode.indexOf('x') != -1, - selY = options.selection.mode.indexOf('y') != -1; - - this.clearSelection(); - - this.selection.first.y = selX ? 0 : (ya.max - area.y1) * vertScale; - this.selection.second.y = selX ? this.plotHeight : (ya.max - area.y2) * vertScale; - this.selection.first.x = selY ? 0 : (area.x1 - xa.min) * hozScale; - this.selection.second.x = selY ? this.plotWidth : (area.x2 - xa.min) * hozScale; - - this.drawSelection(); - this.fireSelectEvent(); - }, - /** - * Function: (private) drawSelection - * - * Draws the selection box. - * - * Parameters: - * none - * - * Returns: - * void - */ - drawSelection: function() { - var prevSelection = this.prevSelection, - selection = this.selection, - octx = this.octx, - options = this.options, - plotOffset = this.plotOffset; - - if(prevSelection != null && - selection.first.x == prevSelection.first.x && - selection.first.y == prevSelection.first.y && - selection.second.x == prevSelection.second.x && - selection.second.y == prevSelection.second.y) - return; - - octx.strokeStyle = Flotr.parseColor(options.selection.color).scale(null, null, null, 0.8).toString(); - octx.lineWidth = 1; - octx.lineJoin = 'round'; - octx.fillStyle = Flotr.parseColor(options.selection.color).scale(null, null, null, 0.4).toString(); - - this.prevSelection = { - first: { x: selection.first.x, y: selection.first.y }, - second: { x: selection.second.x, y: selection.second.y } - }; - - var x = Math.min(selection.first.x, selection.second.x), - y = Math.min(selection.first.y, selection.second.y), - w = Math.abs(selection.second.x - selection.first.x), - h = Math.abs(selection.second.y - selection.first.y); - - octx.fillRect(x + plotOffset.left, y + plotOffset.top, w, h); - octx.strokeRect(x + plotOffset.left, y + plotOffset.top, w, h); - }, - /** - * Function: (private) selectionIsSane - * - * Determines whether or not the selection is sane and should be drawn. - * - * Parameters: - * none - * - * Returns: - * boolean - True when sane, false otherwise. - */ - selectionIsSane: function(){ - var selection = this.selection; - return Math.abs(selection.second.x - selection.first.x) >= 5 && - Math.abs(selection.second.y - selection.first.y) >= 5; - }, - /** - * Function: clearHit - * - * Removes the mouse tracking point from the overlay. - * - * Parameters: - * none - * - * Returns: - * void - */ - clearHit: function(){ - if(this.prevHit){ - var options = this.options, - plotOffset = this.plotOffset, - prevHit = this.prevHit; - - this.octx.clearRect( - this.tHoz(prevHit.x) + plotOffset.left - options.points.radius*2, - this.tVert(prevHit.y) + plotOffset.top - options.points.radius*2, - options.points.radius*3 + options.points.lineWidth*3, - options.points.radius*3 + options.points.lineWidth*3 - ); - this.prevHit = null; - } - }, - /** - * Function: hit - * - * Retrieves the nearest data point from the mouse cursor. If it's within - * a certain range, draw a point on the overlay canvas and display the x and y - * value of the data. - * - * Parameters: - * mouse - Object that holds the relative x and y coordinates of the cursor. - * - * Returns: - * void - */ - hit: function(mouse){ - var series = this.series, - options = this.options, - prevHit = this.prevHit, - plotOffset = this.plotOffset, - octx = this.octx, - data, xsens, ysens, - /** - * Nearest data element. - */ - i, n = { - dist:Number.MAX_VALUE, - x:null, - y:null, - relX:mouse.relX, - relY:mouse.relY, - absX:mouse.absX, - absY:mouse.absY, - mouse:null, - radarData:null - }; - - for(i = 0; i < series.length; i++){ - s = series[i]; - if(!s.mouse.track) continue; - data = s.data; - xsens = (s.xaxis.scale*s.mouse.sensibility); - ysens = (s.yaxis.scale*s.mouse.sensibility); - - for(var j = 0, xpow, ypow; j < data.length; j++){ - if (data[j][1] === null) continue; - xpow = Math.pow(s.xaxis.scale*(data[j][0] - mouse.x), 2); - ypow = Math.pow(s.yaxis.scale*(data[j][1] - mouse.y), 2); - if(xpow < xsens && ypow < ysens && Math.sqrt(xpow+ypow) < n.dist){ - n.dist = Math.sqrt(xpow+ypow); - n.x = data[j][0]; - n.y = data[j][1]; - n.radarLabel = data[j][2]; - n.radarData = data[j][3]; - n.mouse = s.mouse; - } - } - } - - if(n.mouse && n.mouse.track && !prevHit || (prevHit && (n.x != prevHit.x || n.y != prevHit.y))){ - var mt = this.mouseTrack || this.el.select(".flotr-mouse-value")[0], - pos = '', - p = options.mouse.position, - m = options.mouse.margin, - elStyle = 'opacity:0.7;background-color:#000;color:#fff;display:none;position:absolute;padding:2px 8px;-moz-border-radius:4px;border-radius:4px;white-space:nowrap;'; - - if (!options.mouse.relative) { // absolute to the canvas - if(p.charAt(0) == 'n') pos += 'top:' + (m + plotOffset.top) + 'px;'; - else if(p.charAt(0) == 's') pos += 'bottom:' + (m + plotOffset.bottom) + 'px;'; - if(p.charAt(1) == 'e') pos += 'right:' + (m + plotOffset.right) + 'px;'; - else if(p.charAt(1) == 'w') pos += 'left:' + (m + plotOffset.left) + 'px;'; - } - else { // relative to the mouse - if(p.charAt(0) == 'n') pos += 'bottom:' + (m - plotOffset.top - this.tVert(n.y) + this.canvasHeight) + 'px;'; - else if(p.charAt(0) == 's') pos += 'top:' + (m + plotOffset.top + this.tVert(n.y)) + 'px;'; - if(p.charAt(1) == 'e') pos += 'left:' + (m + plotOffset.left + this.tHoz(n.x)) + 'px;'; - else if(p.charAt(1) == 'w') pos += 'right:' + (m - plotOffset.left - this.tHoz(n.x) + this.canvasWidth) + 'px;'; - } - - elStyle += pos; - - if(!mt){ - this.el.insert('
'); - mt = this.mouseTrack = this.el.select('.flotr-mouse-value').first(); - } - else { - this.mouseTrack = mt.setStyle(elStyle); - } - - if(n.x !== null && n.y !== null){ - mt.show(); - - this.clearHit(); - if(n.mouse.lineColor != null){ - octx.save(); - octx.translate(plotOffset.left, plotOffset.top); - octx.lineWidth = options.points.lineWidth; - octx.strokeStyle = n.mouse.lineColor; - octx.fillStyle = '#ffffff'; - octx.beginPath(); - octx.arc(this.tHoz(n.x), this.tVert(n.y), options.mouse.radius, 0, 2 * Math.PI, true); - octx.fill(); - octx.stroke(); - octx.restore(); - } - this.prevHit = n; - - var decimals = n.mouse.trackDecimals; - if(decimals == null || decimals < 0) decimals = 0; - - mt.innerHTML = n.mouse.trackFormatter({x: n.x.toFixed(decimals), y: n.y.toFixed(decimals), - radarLabel: n.radarLabel, radarData: n.radarData.toFixed(decimals)}); - mt.fire('flotr:hit', [n, this]); - } - else if(prevHit){ - mt.hide(); - this.clearHit(); - } - } - }, - saveImage: function (type, width, height, replaceCanvas) { - var image = null; - switch (type) { - case 'jpeg': - case 'jpg': image = Canvas2Image.saveAsJPEG(this.canvas, replaceCanvas, width, height); break; - default: - case 'png': image = Canvas2Image.saveAsPNG(this.canvas, replaceCanvas, width, height); break; - case 'bmp': image = Canvas2Image.saveAsBMP(this.canvas, replaceCanvas, width, height); break; - } - if (Object.isElement(image) && replaceCanvas) { - this.restoreCanvas(); - this.canvas.hide(); - this.overlay.hide(); - this.el.insert(image.setStyle({position: 'absolute'})); - } - }, - restoreCanvas: function() { - this.canvas.show(); - this.overlay.show(); - this.el.select('img').invoke('remove'); - } -}); - -Flotr.Color = Class.create({ - initialize: function(r, g, b, a){ - this.rgba = ['r','g','b','a']; - var x = 4; - while(-1<--x){ - this[this.rgba[x]] = arguments[x] || ((x==3) ? 1.0 : 0); - } - this.normalize(); - }, - - adjust: function(rd, gd, bd, ad) { - var x = 4; - while(-1<--x){ - if(arguments[x] != null) - this[this.rgba[x]] += arguments[x]; - } - return this.normalize(); - }, - - clone: function(){ - return new Flotr.Color(this.r, this.b, this.g, this.a); - }, - - limit: function(val,minVal,maxVal){ - return Math.max(Math.min(val, maxVal), minVal); - }, - - normalize: function(){ - var limit = this.limit; - this.r = limit(parseInt(this.r), 0, 255); - this.g = limit(parseInt(this.g), 0, 255); - this.b = limit(parseInt(this.b), 0, 255); - this.a = limit(this.a, 0, 1); - return this; - }, - - scale: function(rf, gf, bf, af){ - var x = 4; - while(-1<--x){ - if(arguments[x] != null) - this[this.rgba[x]] *= arguments[x]; - } - return this.normalize(); - }, - - distance: function(color){ - if (!color) return; - color = new Flotr.parseColor(color); - var dist = 0; - var x = 3; - while(-1<--x){ - dist += Math.abs(this[this.rgba[x]] - color[this.rgba[x]]); - } - return dist; - }, - - toString: function(){ - return (this.a >= 1.0) ? 'rgb('+[this.r,this.g,this.b].join(',')+')' : 'rgba('+[this.r,this.g,this.b,this.a].join(',')+')'; - } -}); - -Flotr.Color.lookupColors = { - aqua:[0,255,255], - azure:[240,255,255], - beige:[245,245,220], - black:[0,0,0], - blue:[0,0,255], - brown:[165,42,42], - cyan:[0,255,255], - darkblue:[0,0,139], - darkcyan:[0,139,139], - darkgrey:[169,169,169], - darkgreen:[0,100,0], - darkkhaki:[189,183,107], - darkmagenta:[139,0,139], - darkolivegreen:[85,107,47], - darkorange:[255,140,0], - darkorchid:[153,50,204], - darkred:[139,0,0], - darksalmon:[233,150,122], - darkviolet:[148,0,211], - fuchsia:[255,0,255], - gold:[255,215,0], - green:[0,128,0], - indigo:[75,0,130], - khaki:[240,230,140], - lightblue:[173,216,230], - lightcyan:[224,255,255], - lightgreen:[144,238,144], - lightgrey:[211,211,211], - lightpink:[255,182,193], - lightyellow:[255,255,224], - lime:[0,255,0], - magenta:[255,0,255], - maroon:[128,0,0], - navy:[0,0,128], - olive:[128,128,0], - orange:[255,165,0], - pink:[255,192,203], - purple:[128,0,128], - violet:[128,0,128], - red:[255,0,0], - silver:[192,192,192], - white:[255,255,255], - yellow:[255,255,0] -}; - -// not used yet -Flotr.Date = { - format: function(d, format) { - if (!d) return; - - var leftPad = function(n) { - n = n.toString(); - return n.length == 1 ? "0" + n : n; - }; - - var r = []; - var escape = false; - - for (var i = 0; i < format.length; ++i) { - var c = format.charAt(i); - - if (escape) { - switch (c) { - case 'h': c = d.getUTCHours().toString(); break; - case 'H': c = leftPad(d.getUTCHours()); break; - case 'M': c = leftPad(d.getUTCMinutes()); break; - case 'S': c = leftPad(d.getUTCSeconds()); break; - case 'd': c = d.getUTCDate().toString(); break; - case 'm': c = (d.getUTCMonth() + 1).toString(); break; - case 'y': c = d.getUTCFullYear().toString(); break; - case 'b': c = Flotr.Date.monthNames[d.getUTCMonth()]; break; - } - r.push(c); - escape = false; - } - else { - if (c == "%") - escape = true; - else - r.push(c); - } - } - return r.join(""); - }, - timeUnits: { - "second": 1000, - "minute": 60 * 1000, - "hour": 60 * 60 * 1000, - "day": 24 * 60 * 60 * 1000, - "month": 30 * 24 * 60 * 60 * 1000, - "year": 365.2425 * 24 * 60 * 60 * 1000 - }, - // the allowed tick sizes, after 1 year we use an integer algorithm - spec: [ - [1, "second"], [2, "second"], [5, "second"], [10, "second"], [30, "second"], - [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], [30, "minute"], - [1, "hour"], [2, "hour"], [4, "hour"], [8, "hour"], [12, "hour"], - [1, "day"], [2, "day"], [3, "day"], - [0.25, "month"], [0.5, "month"], [1, "month"], [2, "month"], [3, "month"], [6, "month"], - [1, "year"] - ], - monthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] -}; --- a/js/flotr/lib/base64.js +++ /dev/null @@ -1,113 +1,1 @@ -/* Copyright (C) 1999 Masanao Izumo - * Version: 1.0 - * LastModified: Dec 25 1999 - * This library is free. You can redistribute it and/or modify it. - */ - -/* - * Interfaces: - * b64 = base64encode(data); - * data = base64decode(b64); - */ - -(function() { - -var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -var base64DecodeChars = [ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1]; - -function base64encode(str) { - var out, i, len; - var c1, c2, c3; - - len = str.length; - i = 0; - out = ""; - while(i < len) { - c1 = str.charCodeAt(i++) & 0xff; - if(i == len) - { - out += base64EncodeChars.charAt(c1 >> 2); - out += base64EncodeChars.charAt((c1 & 0x3) << 4); - out += "=="; - break; - } - c2 = str.charCodeAt(i++); - if(i == len) - { - out += base64EncodeChars.charAt(c1 >> 2); - out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); - out += base64EncodeChars.charAt((c2 & 0xF) << 2); - out += "="; - break; - } - c3 = str.charCodeAt(i++); - out += base64EncodeChars.charAt(c1 >> 2); - out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); - out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); - out += base64EncodeChars.charAt(c3 & 0x3F); - } - return out; -} - -function base64decode(str) { - var c1, c2, c3, c4; - var i, len, out; - - len = str.length; - i = 0; - out = ""; - while(i < len) { - /* c1 */ - do { - c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; - } while(i < len && c1 == -1); - if(c1 == -1) - break; - - /* c2 */ - do { - c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; - } while(i < len && c2 == -1); - if(c2 == -1) - break; - - out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4)); - - /* c3 */ - do { - c3 = str.charCodeAt(i++) & 0xff; - if(c3 == 61) - return out; - c3 = base64DecodeChars[c3]; - } while(i < len && c3 == -1); - if(c3 == -1) - break; - - out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2)); - - /* c4 */ - do { - c4 = str.charCodeAt(i++) & 0xff; - if(c4 == 61) - return out; - c4 = base64DecodeChars[c4]; - } while(i < len && c4 == -1); - if(c4 == -1) - break; - out += String.fromCharCode(((c3 & 0x03) << 6) | c4); - } - return out; -} - -if (!window.btoa) window.btoa = base64encode; -if (!window.atob) window.atob = base64decode; - -})(); + --- a/js/flotr/lib/canvas2image.js +++ /dev/null @@ -1,230 +1,1 @@ -/* - * Canvas2Image v0.1 - * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com - * MIT License [http://www.opensource.org/licenses/mit-license.php] - */ - -var Canvas2Image = (function() { - // check if we have canvas support - var oCanvas = document.createElement("canvas"); - - // no canvas, bail out. - if (!oCanvas.getContext) { - return { - saveAsBMP : function(){}, - saveAsPNG : function(){}, - saveAsJPEG : function(){} - } - } - - var bHasImageData = !!(oCanvas.getContext("2d").getImageData); - var bHasDataURL = !!(oCanvas.toDataURL); - var bHasBase64 = !!(window.btoa); - - var strDownloadMime = "image/octet-stream"; - - // ok, we're good - var readCanvasData = function(oCanvas) { - var iWidth = parseInt(oCanvas.width); - var iHeight = parseInt(oCanvas.height); - return oCanvas.getContext("2d").getImageData(0,0,iWidth,iHeight); - } - - // base64 encodes either a string or an array of charcodes - var encodeData = function(data) { - var strData = ""; - if (typeof data == "string") { - strData = data; - } else { - var aData = data; - for (var i = 0; i < aData.length; i++) { - strData += String.fromCharCode(aData[i]); - } - } - return btoa(strData); - } - - // creates a base64 encoded string containing BMP data - // takes an imagedata object as argument - var createBMP = function(oData) { - var aHeader = []; - - var iWidth = oData.width; - var iHeight = oData.height; - - aHeader.push(0x42); // magic 1 - aHeader.push(0x4D); - - var iFileSize = iWidth*iHeight*3 + 54; // total header size = 54 bytes - aHeader.push(iFileSize % 256); iFileSize = Math.floor(iFileSize / 256); - aHeader.push(iFileSize % 256); iFileSize = Math.floor(iFileSize / 256); - aHeader.push(iFileSize % 256); iFileSize = Math.floor(iFileSize / 256); - aHeader.push(iFileSize % 256); - - aHeader.push(0); // reserved - aHeader.push(0); - aHeader.push(0); // reserved - aHeader.push(0); - - aHeader.push(54); // data offset - aHeader.push(0); - aHeader.push(0); - aHeader.push(0); - - var aInfoHeader = []; - aInfoHeader.push(40); // info header size - aInfoHeader.push(0); - aInfoHeader.push(0); - aInfoHeader.push(0); - - var iImageWidth = iWidth; - aInfoHeader.push(iImageWidth % 256); iImageWidth = Math.floor(iImageWidth / 256); - aInfoHeader.push(iImageWidth % 256); iImageWidth = Math.floor(iImageWidth / 256); - aInfoHeader.push(iImageWidth % 256); iImageWidth = Math.floor(iImageWidth / 256); - aInfoHeader.push(iImageWidth % 256); - - var iImageHeight = iHeight; - aInfoHeader.push(iImageHeight % 256); iImageHeight = Math.floor(iImageHeight / 256); - aInfoHeader.push(iImageHeight % 256); iImageHeight = Math.floor(iImageHeight / 256); - aInfoHeader.push(iImageHeight % 256); iImageHeight = Math.floor(iImageHeight / 256); - aInfoHeader.push(iImageHeight % 256); - - aInfoHeader.push(1); // num of planes - aInfoHeader.push(0); - - aInfoHeader.push(24); // num of bits per pixel - aInfoHeader.push(0); - - aInfoHeader.push(0); // compression = none - aInfoHeader.push(0); - aInfoHeader.push(0); - aInfoHeader.push(0); - - var iDataSize = iWidth*iHeight*3; - aInfoHeader.push(iDataSize % 256); iDataSize = Math.floor(iDataSize / 256); - aInfoHeader.push(iDataSize % 256); iDataSize = Math.floor(iDataSize / 256); - aInfoHeader.push(iDataSize % 256); iDataSize = Math.floor(iDataSize / 256); - aInfoHeader.push(iDataSize % 256); - - for (var i = 0; i < 16; i++) { - aInfoHeader.push(0); // these bytes not used - } - - var iPadding = (4 - ((iWidth * 3) % 4)) % 4; - - var aImgData = oData.data; - - var strPixelData = ""; - var y = iHeight; - do { - var iOffsetY = iWidth*(y-1)*4; - var strPixelRow = ""; - for (var x=0;x object containing the imagedata - var makeImageObject = function(strSource) { - var oImgElement = document.createElement("img"); - oImgElement.src = strSource; - return oImgElement; - } - - var scaleCanvas = function(oCanvas, iWidth, iHeight) { - if (iWidth && iHeight) { - var oSaveCanvas = document.createElement("canvas"); - - oSaveCanvas.width = iWidth; - oSaveCanvas.height = iHeight; - oSaveCanvas.style.width = iWidth+"px"; - oSaveCanvas.style.height = iHeight+"px"; - - var oSaveCtx = oSaveCanvas.getContext("2d"); - - oSaveCtx.drawImage(oCanvas, 0, 0, oCanvas.width, oCanvas.height, 0, 0, iWidth, iWidth); - - return oSaveCanvas; - } - return oCanvas; - } - - return { - saveAsPNG : function(oCanvas, bReturnImg, iWidth, iHeight) { - if (!bHasDataURL) { - return false; - } - var oScaledCanvas = scaleCanvas(oCanvas, iWidth, iHeight); - var strData = oScaledCanvas.toDataURL("image/png"); - if (bReturnImg) { - return makeImageObject(strData); - } else { - saveFile(strData.replace("image/png", strDownloadMime)); - } - return true; - }, - - saveAsJPEG : function(oCanvas, bReturnImg, iWidth, iHeight) { - if (!bHasDataURL) { - return false; - } - - var oScaledCanvas = scaleCanvas(oCanvas, iWidth, iHeight); - var strMime = "image/jpeg"; - var strData = oScaledCanvas.toDataURL(strMime); - - // check if browser actually supports jpeg by looking for the mime type in the data uri. - // if not, return false - if (strData.indexOf(strMime) != 5) { - return false; - } - - if (bReturnImg) { - return makeImageObject(strData); - } else { - saveFile(strData.replace(strMime, strDownloadMime)); - } - return true; - }, - - saveAsBMP : function(oCanvas, bReturnImg, iWidth, iHeight) { - if (!(bHasImageData && bHasBase64)) { - return false; - } - - var oScaledCanvas = scaleCanvas(oCanvas, iWidth, iHeight); - - var oData = readCanvasData(oScaledCanvas); - var strImgData = createBMP(oData); - if (bReturnImg) { - return makeImageObject(makeDataURI(strImgData, "image/bmp")); - } else { - saveFile(makeDataURI(strImgData, strDownloadMime)); - } - return true; - } - }; - -})(); + --- a/js/flotr/lib/canvastext.js +++ /dev/null @@ -1,397 +1,1 @@ -/** - * This code is released to the public domain by Jim Studt, 2007. - * He may keep some sort of up to date copy at http://www.federated.com/~jim/canvastext/ - * It as been modified by Fabien Ménager to handle font style like size, weight, color and rotation. - * A partial support for accentuated letters as been added too. - */ -var CanvasText = { - /** The letters definition. It is a list of letters, - * with their width, and the coordinates of points compositing them. - * The syntax for the points is : [x, y], null value means "pen up" - */ - letters: { - '\n':{ width: -1, points: [] }, - ' ': { width: 10, points: [] }, - '!': { width: 10, points: [[5,21],[5,7],null,[5,2],[4,1],[5,0],[6,1],[5,2]] }, - '"': { width: 16, points: [[4,21],[4,14],null,[12,21],[12,14]] }, - '#': { width: 21, points: [[11,25],[4,-7],null,[17,25],[10,-7],null,[4,12],[18,12],null,[3,6],[17,6]] }, - '$': { width: 20, points: [[8,25],[8,-4],null,[12,25],[12,-4],null,[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] }, - '%': { width: 24, points: [[21,21],[3,0],null,[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],null,[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]] }, - '&': { width: 26, points: [[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]] }, - '\'':{ width: 10, points: [[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]] }, - '(': { width: 14, points: [[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]] }, - ')': { width: 14, points: [[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]] }, - '*': { width: 16, points: [[8,21],[8,9],null,[3,18],[13,12],null,[13,18],[3,12]] }, - '+': { width: 26, points: [[13,18],[13,0],null,[4,9],[22,9]] }, - ',': { width: 10, points: [[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] }, - '-': { width: 26, points: [[4,9],[22,9]] }, - '.': { width: 10, points: [[5,2],[4,1],[5,0],[6,1],[5,2]] }, - '/': { width: 22, points: [[20,25],[2,-7]] }, - '0': { width: 20, points: [[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]] }, - '1': { width: 20, points: [[6,17],[8,18],[11,21],[11,0]] }, - '2': { width: 20, points: [[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]] }, - '3': { width: 20, points: [[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] }, - '4': { width: 20, points: [[13,21],[3,7],[18,7],null,[13,21],[13,0]] }, - '5': { width: 20, points: [[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] }, - '6': { width: 20, points: [[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]] }, - '7': { width: 20, points: [[17,21],[7,0],null,[3,21],[17,21]] }, - '8': { width: 20, points: [[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]] }, - '9': { width: 20, points: [[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]] }, - ':': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],null,[5,2],[4,1],[5,0],[6,1],[5,2]] }, - ';': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],null,[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] }, - '<': { width: 24, points: [[20,18],[4,9],[20,0]] }, - '=': { width: 26, points: [[4,12],[22,12],null,[4,6],[22,6]] }, - '>': { width: 24, points: [[4,18],[20,9],[4,0]] }, - '?': { width: 18, points: [[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],null,[9,2],[8,1],[9,0],[10,1],[9,2]] }, - '@': { width: 27, points: [[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],null,[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],null,[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],null,[19,16],[18,8],[18,6],[19,5]] }, - 'A': { width: 18, points: [[9,21],[1,0],null,[9,21],[17,0],null,[4,7],[14,7]] }, - 'B': { width: 21, points: [[4,21],[4,0],null,[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],null,[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]] }, - 'C': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]] }, - 'D': { width: 21, points: [[4,21],[4,0],null,[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]] }, - 'E': { width: 19, points: [[4,21],[4,0],null,[4,21],[17,21],null,[4,11],[12,11],null,[4,0],[17,0]] }, - 'F': { width: 18, points: [[4,21],[4,0],null,[4,21],[17,21],null,[4,11],[12,11]] }, - 'G': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],null,[13,8],[18,8]] }, - 'H': { width: 22, points: [[4,21],[4,0],null,[18,21],[18,0],null,[4,11],[18,11]] }, - 'I': { width: 8, points: [[4,21],[4,0]] }, - 'J': { width: 16, points: [[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]] }, - 'K': { width: 21, points: [[4,21],[4,0],null,[18,21],[4,7],null,[9,12],[18,0]] }, - 'L': { width: 17, points: [[4,21],[4,0],null,[4,0],[16,0]] }, - 'M': { width: 24, points: [[4,21],[4,0],null,[4,21],[12,0],null,[20,21],[12,0],null,[20,21],[20,0]] }, - 'N': { width: 22, points: [[4,21],[4,0],null,[4,21],[18,0],null,[18,21],[18,0]] }, - 'O': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]] }, - 'P': { width: 21, points: [[4,21],[4,0],null,[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]] }, - 'Q': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],null,[12,4],[18,-2]] }, - 'R': { width: 21, points: [[4,21],[4,0],null,[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],null,[11,11],[18,0]] }, - 'S': { width: 20, points: [[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] }, - 'T': { width: 16, points: [[8,21],[8,0],null,[1,21],[15,21]] }, - 'U': { width: 22, points: [[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]] }, - 'V': { width: 18, points: [[1,21],[9,0],null,[17,21],[9,0]] }, - 'W': { width: 24, points: [[2,21],[7,0],null,[12,21],[7,0],null,[12,21],[17,0],null,[22,21],[17,0]] }, - 'X': { width: 20, points: [[3,21],[17,0],null,[17,21],[3,0]] }, - 'Y': { width: 18, points: [[1,21],[9,11],[9,0],null,[17,21],[9,11]] }, - 'Z': { width: 20, points: [[17,21],[3,0],null,[3,21],[17,21],null,[3,0],[17,0]] }, - '[': { width: 14, points: [[4,25],[4,-7],null,[5,25],[5,-7],null,[4,25],[11,25],null,[4,-7],[11,-7]] }, - '\\':{ width: 14, points: [[0,21],[14,-3]] }, - ']': { width: 14, points: [[9,25],[9,-7],null,[10,25],[10,-7],null,[3,25],[10,25],null,[3,-7],[10,-7]] }, - '^': { width: 14, points: [[3,10],[8,18],[13,10]] }, - '_': { width: 16, points: [[0,-2],[16,-2]] }, - '`': { width: 10, points: [[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]] }, - 'a': { width: 19, points: [[15,14],[15,0],null,[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, - 'b': { width: 19, points: [[4,21],[4,0],null,[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] }, - 'c': { width: 18, points: [[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, - 'd': { width: 19, points: [[15,21],[15,0],null,[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, - 'e': { width: 18, points: [[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, - 'f': { width: 12, points: [[10,21],[8,21],[6,20],[5,17],[5,0],null,[2,14],[9,14]] }, - 'g': { width: 19, points: [[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],null,[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, - 'h': { width: 19, points: [[4,21],[4,0],null,[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] }, - 'i': { width: 8, points: [[3,21],[4,20],[5,21],[4,22],[3,21],null,[4,14],[4,0]] }, - 'j': { width: 10, points: [[5,21],[6,20],[7,21],[6,22],[5,21],null,[6,14],[6,-3],[5,-6],[3,-7],[1,-7]] }, - 'k': { width: 17, points: [[4,21],[4,0],null,[14,14],[4,4],null,[8,8],[15,0]] }, - 'l': { width: 8, points: [[4,21],[4,0]] }, - 'm': { width: 30, points: [[4,14],[4,0],null,[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],null,[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]] }, - 'n': { width: 19, points: [[4,14],[4,0],null,[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] }, - 'o': { width: 19, points: [[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]] }, - 'p': { width: 19, points: [[4,14],[4,-7],null,[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] }, - 'q': { width: 19, points: [[15,14],[15,-7],null,[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] }, - 'r': { width: 13, points: [[4,14],[4,0],null,[4,8],[5,11],[7,13],[9,14],[12,14]] }, - 's': { width: 17, points: [[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]] }, - 't': { width: 12, points: [[5,21],[5,4],[6,1],[8,0],[10,0],null,[2,14],[9,14]] }, - 'u': { width: 19, points: [[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],null,[15,14],[15,0]] }, - 'v': { width: 16, points: [[2,14],[8,0],null,[14,14],[8,0]] }, - 'w': { width: 22, points: [[3,14],[7,0],null,[11,14],[7,0],null,[11,14],[15,0],null,[19,14],[15,0]] }, - 'x': { width: 17, points: [[3,14],[14,0],null,[14,14],[3,0]] }, - 'y': { width: 16, points: [[2,14],[8,0],null,[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]] }, - 'z': { width: 17, points: [[14,14],[3,0],null,[3,14],[14,14],null,[3,0],[14,0]] }, - '{': { width: 14, points: [[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],null,[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],null,[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]] }, - '|': { width: 8, points: [[4,25],[4,-7]] }, - '}': { width: 14, points: [[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],null,[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],null,[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]] }, - '~': { width: 24, points: [[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],null,[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]] }, - 'é': { diacritic: '´', letter: 'e' }, - 'è': { diacritic: '`', letter: 'e' }, - 'ê': { diacritic: '^', letter: 'e' }, - 'ë': { diacritic: '¨', letter: 'e' }, - 'à': { diacritic: '`', letter: 'a' }, - 'ç': { diacritic: '¸', letter: 'c' }, - 'ñ': { diacritic: '~', letter: 'n' }, - 'ô': { diacritic: '^', letter: 'o' }, - 'É': { diacritic: '´', letter: 'E' }, - 'È': { diacritic: '`', letter: 'E' }, - 'Ê': { diacritic: '^', letter: 'E' }, - 'Ë': { diacritic: '¨', letter: 'E' }, - 'À': { diacritic: '`', letter: 'A' }, - 'Ç': { diacritic: '¸', letter: 'C' }, - 'Ñ': { diacritic: '~', letter: 'N' }, - 'Ô': { diacritic: '^', letter: 'O' } - }, - - specialchars: { - 'pi': { width: 19, points: [[6,14],[6,0],null,[14,14],[14,0],null,[2,13],[6,16],[13,13],[17,16]] } - }, - - /** Diacritics, used to draw accentuated letters */ - diacritics: { - '¸': { entity: 'cedil', points: [[6,-4],[4,-6],[2,-7],[1,-7]] }, - '´': { entity: 'acute', points: [[8,19],[13,22]] }, - '`': { entity: 'grave', points: [[7,22],[12,19]] }, - '^': { entity: 'circ', points: [[5.5,19],[9.5,23],[12.5,19]] }, - '¨': { entity: 'trema', points: [[5,21],[6,20],[7,21],[6,22],[5,21],null,[12,21],[13,20],[14,21],[13,22],[12,21]] }, - '~': { entity: 'tilde', points: [[4,18],[7,22],[10,18],[13,22]] } - }, - - /** The default font styling */ - style: { - size: 8, // font height in pixels - font: null, // not yet implemented - color: '#000000', // - weight: 1, // float, 1 for 'normal' - halign: 'l', // l: left, r: right, c: center - valign: 'b', // t: top, m: middle, b: bottom - adjustAlign: false, // modifies the alignments if the angle is different from 0 to make the spin point always at the good position - angle: 0, // in radians, anticlockwise - tracking: 1, // space between the letters, float, 1 for 'normal' - boundingBoxColor: '#ff0000', //null // color of the bounding box (null to hide), can be used for debug and font drawing - originPointColor: '#000000' //null // color of the bounding box (null to hide), can be used for debug and font drawing - }, - - debug: false, - _bufferLexemes: {}, - - /** Get the letter data corresponding to a char - * @param {String} ch - The char - */ - letter: function(ch) { - return CanvasText.letters[ch]; - }, - - parseLexemes: function(str) { - if (CanvasText._bufferLexemes[str]) - return CanvasText._bufferLexemes[str]; - - var i, c, matches = str.match(/&[A-Za-z]{2,5};|\s|./g); - var result = [], chars = []; - for (i = 0; i < matches.length; i++) { - c = matches[i]; - if (c.length == 1) - chars.push(c); - else { - var entity = c.substring(1, c.length-1); - if (CanvasText.specialchars[entity]) - chars.push(entity); - else - chars = chars.concat(c.toArray()); - } - } - for (i = 0; i < chars.length; i++) { - c = chars[i]; - if (c = CanvasText.letters[c] || CanvasText.specialchars[c]) - result.push(c); - } - return CanvasText._bufferLexemes[str] = result.compact(); - }, - - /** Get the font ascent for a given style - * @param {Object} style - The reference style - */ - ascent: function(style) { - style = style || {}; - return (style.size || CanvasText.style.size); - }, - - /** Get the font descent for a given style - * @param {Object} style - The reference style - * */ - descent: function(style) { - style = style || {}; - return 7.0*(style.size || CanvasText.style.size)/25.0; - }, - - /** Measure the text horizontal size - * @param {String} str - The text - * @param {Object} style - Text style - * */ - measure: function(str, style) { - if (!str) return; - style = style || {}; - - var i, width, lexemes = CanvasText.parseLexemes(str), - total = 0; - - for (i = lexemes.length-1; i > -1; --i) { - c = lexemes[i]; - width = (c.diacritic) ? CanvasText.letter(c.letter).width : c.width; - total += width * (style.tracking || CanvasText.style.tracking) * (style.size || CanvasText.style.size) / 25.0; - } - return total; - }, - - getDimensions: function(str, style) { - var width = CanvasText.measure(str, style), - height = style.size || CanvasText.style.size, - angle = style.angle || CanvasText.style.angle; - - if (style.angle == 0) return {width: width, height: height}; - return { - width: Math.abs(Math.cos(angle) * width) + Math.abs(Math.sin(angle) * height), - height: Math.abs(Math.sin(angle) * width) + Math.abs(Math.cos(angle) * height) - } - }, - - getBestAlign: function(angle, style) { - angle += CanvasText.getAngleFromAlign(style.halign, style.valign); - var a = {h:'c', v:'m'}; - if (Math.round(Math.cos(angle)*1000)/1000 != 0) - a.h = (Math.cos(angle) > 0 ? 'r' : 'l'); - - if (Math.round(Math.sin(angle)*1000)/1000 != 0) - a.v = (Math.sin(angle) > 0 ? 't' : 'b'); - return a; - }, - - getAngleFromAlign: function(halign, valign) { - var pi = Math.PI, table = { - 'rm': 0, - 'rt': pi/4, - 'ct': pi/2, - 'lt': 3*(pi/4), - 'lm': pi, - 'lb': -3*(pi/4), - 'cb': -pi/2, - 'rb': -pi/4, - 'cm': 0 - } - return table[halign+valign]; - }, - - /** Draws serie of points at given coordinates - * @param {Canvas context} ctx - The canvas context - * @param {Array} points - The points to draw - * @param {Number} x - The X coordinate - * @param {Number} y - The Y coordinate - * @param {Number} mag - The scale - */ - drawPoints: function (ctx, points, x, y, mag, offset) { - var i, a, penUp = true, needStroke = 0; - offset = offset || {x:0, y:0}; - - ctx.beginPath(); - for (i = 0; i < points.length; i++) { - a = points[i]; - if (!a) { - penUp = true; - continue; - } - if (penUp) { - ctx.moveTo(x + a[0]*mag + offset.x, y - a[1]*mag + offset.y); - penUp = false; - } - else { - ctx.lineTo(x + a[0]*mag + offset.x, y - a[1]*mag + offset.y); - } - } - ctx.stroke(); - }, - - /** Draws a text at given coordinates and with a given style - * @param {Canvas context} ctx - The canvas context - * @param {String} str - The text to draw - * @param {Number} xOrig - The X coordinate - * @param {Number} yOrig - The Y coordinate - * @param {Object} style - The font style - */ - draw: function(ctx, str, xOrig, yOrig, style) { - if (!str) return; - style = style || CanvasText.style; - style.halign = style.halign || CanvasText.style.halign; - style.valign = style.valign || CanvasText.style.valign; - style.angle = style.angle || CanvasText.style.angle; - style.size = style.size || CanvasText.style.size; - style.adjustAlign = style.adjustAlign || CanvasText.style.adjustAlign; - - var i, c, total = 0, - mag = style.size / 25.0, - x = 0, y = 0, - lexemes = CanvasText.parseLexemes(str); - - var offset = {x:0, y:0}, - measure = CanvasText.measure(str, style), - align; - - if (style.adjustAlign) { - align = CanvasText.getBestAlign(style.angle, style); - style.halign = align.h; - style.valign = align.v; - } - - switch (style.halign) { - case 'l': break; - case 'c': offset.x = -measure / 2; break; - case 'r': offset.x = -measure; break; - } - - switch (style.valign) { - case 'b': break; - case 'm': offset.y = style.size / 2; break; - case 't': offset.y = style.size; break; - } - - ctx.save(); - ctx.translate(xOrig, yOrig); - ctx.rotate(style.angle); - ctx.lineCap = "round"; - ctx.lineWidth = 2.0 * mag * (style.weight || CanvasText.style.weight); - ctx.strokeStyle = style.color || CanvasText.style.color; - - for (i = 0; i < lexemes.length; i++) { - c = lexemes[i]; - if (c.width == -1) { - x = 0; - y = style.size * 1.4; - continue; - } - - var points = c.points, - width = c.width; - - if (c.diacritic) { - var dia = CanvasText.diacritics[c.diacritic]; - var char = CanvasText.letter(c.letter); - - CanvasText.drawPoints(ctx, dia.points, x, y - (c.letter.toUpperCase() == c.letter ? 3 : 0), mag, offset); - points = char.points; - width = char.width; - } - - CanvasText.drawPoints(ctx, points, x, y, mag, offset); - - if (CanvasText.debug) { - ctx.save(); - ctx.lineJoin = "miter"; - ctx.lineWidth = 0.5; - ctx.strokeStyle = (style.boundingBoxColor || CanvasText.style.boundingBoxColor); - ctx.strokeRect(x+offset.x, y+offset.y, width*mag, -style.size); - - ctx.fillStyle = (style.originPointColor || CanvasText.style.originPointColor); - ctx.beginPath(); - ctx.arc(0, 0, 1.5, 0, Math.PI*2, true); - ctx.fill(); - - ctx.restore(); - } - - x += width*mag*(style.tracking || CanvasText.style.tracking); - } - ctx.restore(); - return total; - }, - - /** Enables the text function for a Canvas context - * @param {Canvas context} ctx - The canvas context - */ - enable: function(ctx) { - ctx.drawText = function(text, x, y, style) { return CanvasText.draw(ctx, text, x, y, style); }; - ctx.measureText = function(text, style) { return CanvasText.measure(text, style); }; - ctx.getTextBounds = function(text, style) { return CanvasText.getDimensions(text, style); }; - ctx.fontAscent = function(style) { return CanvasText.ascent(style); }; - ctx.fontDescent = function(style) { return CanvasText.descent(style); }; - } -}; + --- a/js/flotr/lib/excanvas.js +++ /dev/null @@ -1,885 +1,1 @@ -// Copyright 2006 Google Inc. -// -// 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. - -// Known Issues: -// -// * Patterns are not implemented. -// * Radial gradient are not implemented. The VML version of these look very -// different from the canvas one. -// * Clipping paths are not implemented. -// * Coordsize. The width and height attribute have higher priority than the -// width and height style values which isn't correct. -// * Painting mode isn't implemented. -// * Canvas width/height should is using content-box by default. IE in -// Quirks mode will draw the canvas using border-box. Either change your -// doctype to HTML5 -// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) -// or use Box Sizing Behavior from WebFX -// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) -// * Non uniform scaling does not correctly scale strokes. -// * Optimize. There is always room for speed improvements. - -// Only add this code if we do not already have a canvas implementation -if (!document.createElement('canvas').getContext) { - -(function() { - - // alias some functions to make (compiled) code shorter - var m = Math; - var mr = m.round; - var ms = m.sin; - var mc = m.cos; - var abs = m.abs; - var sqrt = m.sqrt; - - // this is used for sub pixel precision - var Z = 10; - var Z2 = Z / 2; - - /** - * This funtion is assigned to the elements as element.getContext(). - * @this {HTMLElement} - * @return {CanvasRenderingContext2D_} - */ - function getContext() { - return this.context_ || - (this.context_ = new CanvasRenderingContext2D_(this)); - } - - var slice = Array.prototype.slice; - - /** - * Binds a function to an object. The returned function will always use the - * passed in {@code obj} as {@code this}. - * - * Example: - * - * g = bind(f, obj, a, b) - * g(c, d) // will do f.call(obj, a, b, c, d) - * - * @param {Function} f The function to bind the object to - * @param {Object} obj The object that should act as this when the function - * is called - * @param {*} var_args Rest arguments that will be used as the initial - * arguments when the function is called - * @return {Function} A new function that has bound this - */ - function bind(f, obj, var_args) { - var a = slice.call(arguments, 2); - return function() { - return f.apply(obj, a.concat(slice.call(arguments))); - }; - } - - var G_vmlCanvasManager_ = { - init: function(opt_doc) { - if (/MSIE/.test(navigator.userAgent) && !window.opera) { - var doc = opt_doc || document; - // Create a dummy element so that IE will allow canvas elements to be - // recognized. - doc.createElement('canvas'); - doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); - } - }, - - init_: function(doc) { - // create xmlns - if (!doc.namespaces['g_vml_']) { - doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', - '#default#VML'); - - } - if (!doc.namespaces['g_o_']) { - doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', - '#default#VML'); - } - - // Setup default CSS. Only add one style sheet per document - if (!doc.styleSheets['ex_canvas_']) { - var ss = doc.createStyleSheet(); - ss.owningElement.id = 'ex_canvas_'; - ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + - // default size is 300x150 in Gecko and Opera - 'text-align:left;width:300px;height:150px}' + - 'g_vml_\\:*{behavior:url(#default#VML)}' + - 'g_o_\\:*{behavior:url(#default#VML)}'; - - } - - // find all canvas elements - var els = doc.getElementsByTagName('canvas'); - for (var i = 0; i < els.length; i++) { - this.initElement(els[i]); - } - }, - - /** - * Public initializes a canvas element so that it can be used as canvas - * element from now on. This is called automatically before the page is - * loaded but if you are creating elements using createElement you need to - * make sure this is called on the element. - * @param {HTMLElement} el The canvas element to initialize. - * @return {HTMLElement} the element that was created. - */ - initElement: function(el) { - if (!el.getContext) { - - el.getContext = getContext; - - // Remove fallback content. There is no way to hide text nodes so we - // just remove all childNodes. We could hide all elements and remove - // text nodes but who really cares about the fallback content. - el.innerHTML = ''; - - // do not use inline function because that will leak memory - el.attachEvent('onpropertychange', onPropertyChange); - el.attachEvent('onresize', onResize); - - var attrs = el.attributes; - if (attrs.width && attrs.width.specified) { - // TODO: use runtimeStyle and coordsize - // el.getContext().setWidth_(attrs.width.nodeValue); - el.style.width = attrs.width.nodeValue + 'px'; - } else { - el.width = el.clientWidth; - } - if (attrs.height && attrs.height.specified) { - // TODO: use runtimeStyle and coordsize - // el.getContext().setHeight_(attrs.height.nodeValue); - el.style.height = attrs.height.nodeValue + 'px'; - } else { - el.height = el.clientHeight; - } - //el.getContext().setCoordsize_() - } - return el; - } - }; - - function onPropertyChange(e) { - var el = e.srcElement; - - switch (e.propertyName) { - case 'width': - el.style.width = el.attributes.width.nodeValue + 'px'; - el.getContext().clearRect(); - break; - case 'height': - el.style.height = el.attributes.height.nodeValue + 'px'; - el.getContext().clearRect(); - break; - } - } - - function onResize(e) { - var el = e.srcElement; - if (el.firstChild) { - el.firstChild.style.width = el.clientWidth + 'px'; - el.firstChild.style.height = el.clientHeight + 'px'; - } - } - - G_vmlCanvasManager_.init(); - - // precompute "00" to "FF" - var dec2hex = []; - for (var i = 0; i < 16; i++) { - for (var j = 0; j < 16; j++) { - dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); - } - } - - function createMatrixIdentity() { - return [ - [1, 0, 0], - [0, 1, 0], - [0, 0, 1] - ]; - } - - function matrixMultiply(m1, m2) { - var result = createMatrixIdentity(); - - for (var x = 0; x < 3; x++) { - for (var y = 0; y < 3; y++) { - var sum = 0; - - for (var z = 0; z < 3; z++) { - sum += m1[x][z] * m2[z][y]; - } - - result[x][y] = sum; - } - } - return result; - } - - function copyState(o1, o2) { - o2.fillStyle = o1.fillStyle; - o2.lineCap = o1.lineCap; - o2.lineJoin = o1.lineJoin; - o2.lineWidth = o1.lineWidth; - o2.miterLimit = o1.miterLimit; - o2.shadowBlur = o1.shadowBlur; - o2.shadowColor = o1.shadowColor; - o2.shadowOffsetX = o1.shadowOffsetX; - o2.shadowOffsetY = o1.shadowOffsetY; - o2.strokeStyle = o1.strokeStyle; - o2.globalAlpha = o1.globalAlpha; - o2.arcScaleX_ = o1.arcScaleX_; - o2.arcScaleY_ = o1.arcScaleY_; - o2.lineScale_ = o1.lineScale_; - } - - function processStyle(styleString) { - var str, alpha = 1; - - styleString = String(styleString); - if (styleString.substring(0, 3) == 'rgb') { - var start = styleString.indexOf('(', 3); - var end = styleString.indexOf(')', start + 1); - var guts = styleString.substring(start + 1, end).split(','); - - str = '#'; - for (var i = 0; i < 3; i++) { - str += dec2hex[Number(guts[i])]; - } - - if (guts.length == 4 && styleString.substr(3, 1) == 'a') { - alpha = guts[3]; - } - } else { - str = styleString; - } - - return {color: str, alpha: alpha}; - } - - function processLineCap(lineCap) { - switch (lineCap) { - case 'butt': - return 'flat'; - case 'round': - return 'round'; - case 'square': - default: - return 'square'; - } - } - - /** - * This class implements CanvasRenderingContext2D interface as described by - * the WHATWG. - * @param {HTMLElement} surfaceElement The element that the 2D context should - * be associated with - */ - function CanvasRenderingContext2D_(surfaceElement) { - this.m_ = createMatrixIdentity(); - - this.mStack_ = []; - this.aStack_ = []; - this.currentPath_ = []; - - // Canvas context properties - this.strokeStyle = '#000'; - this.fillStyle = '#000'; - - this.lineWidth = 1; - this.lineJoin = 'miter'; - this.lineCap = 'butt'; - this.miterLimit = Z * 1; - this.globalAlpha = 1; - this.canvas = surfaceElement; - - var el = surfaceElement.ownerDocument.createElement('div'); - el.style.width = surfaceElement.clientWidth + 'px'; - el.style.height = surfaceElement.clientHeight + 'px'; - el.style.overflow = 'hidden'; - el.style.position = 'absolute'; - surfaceElement.appendChild(el); - - this.element_ = el; - this.arcScaleX_ = 1; - this.arcScaleY_ = 1; - this.lineScale_ = 1; - } - - var contextPrototype = CanvasRenderingContext2D_.prototype; - contextPrototype.clearRect = function() { - this.element_.innerHTML = ''; - }; - - contextPrototype.beginPath = function() { - // TODO: Branch current matrix so that save/restore has no effect - // as per safari docs. - this.currentPath_ = []; - }; - - contextPrototype.moveTo = function(aX, aY) { - var p = this.getCoords_(aX, aY); - this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); - this.currentX_ = p.x; - this.currentY_ = p.y; - }; - - contextPrototype.lineTo = function(aX, aY) { - var p = this.getCoords_(aX, aY); - this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); - - this.currentX_ = p.x; - this.currentY_ = p.y; - }; - - contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, - aCP2x, aCP2y, - aX, aY) { - var p = this.getCoords_(aX, aY); - var cp1 = this.getCoords_(aCP1x, aCP1y); - var cp2 = this.getCoords_(aCP2x, aCP2y); - bezierCurveTo(this, cp1, cp2, p); - }; - - // Helper function that takes the already fixed cordinates. - function bezierCurveTo(self, cp1, cp2, p) { - self.currentPath_.push({ - type: 'bezierCurveTo', - cp1x: cp1.x, - cp1y: cp1.y, - cp2x: cp2.x, - cp2y: cp2.y, - x: p.x, - y: p.y - }); - self.currentX_ = p.x; - self.currentY_ = p.y; - } - - contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { - // the following is lifted almost directly from - // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes - - var cp = this.getCoords_(aCPx, aCPy); - var p = this.getCoords_(aX, aY); - - var cp1 = { - x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), - y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) - }; - var cp2 = { - x: cp1.x + (p.x - this.currentX_) / 3.0, - y: cp1.y + (p.y - this.currentY_) / 3.0 - }; - - bezierCurveTo(this, cp1, cp2, p); - }; - - contextPrototype.arc = function(aX, aY, aRadius, - aStartAngle, aEndAngle, aClockwise) { - aRadius *= Z; - var arcType = aClockwise ? 'at' : 'wa'; - - var xStart = aX + mc(aStartAngle) * aRadius - Z2; - var yStart = aY + ms(aStartAngle) * aRadius - Z2; - - var xEnd = aX + mc(aEndAngle) * aRadius - Z2; - var yEnd = aY + ms(aEndAngle) * aRadius - Z2; - - // IE won't render arches drawn counter clockwise if xStart == xEnd. - if (xStart == xEnd && !aClockwise) { - xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something - // that can be represented in binary - } - - var p = this.getCoords_(aX, aY); - var pStart = this.getCoords_(xStart, yStart); - var pEnd = this.getCoords_(xEnd, yEnd); - - this.currentPath_.push({type: arcType, - x: p.x, - y: p.y, - radius: aRadius, - xStart: pStart.x, - yStart: pStart.y, - xEnd: pEnd.x, - yEnd: pEnd.y}); - - }; - - contextPrototype.rect = function(aX, aY, aWidth, aHeight) { - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - }; - - contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { - var oldPath = this.currentPath_; - this.beginPath(); - - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - this.stroke(); - - this.currentPath_ = oldPath; - }; - - contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { - var oldPath = this.currentPath_; - this.beginPath(); - - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - this.fill(); - - this.currentPath_ = oldPath; - }; - - contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { - var gradient = new CanvasGradient_('gradient'); - gradient.x0_ = aX0; - gradient.y0_ = aY0; - gradient.x1_ = aX1; - gradient.y1_ = aY1; - return gradient; - }; - - contextPrototype.createRadialGradient = function(aX0, aY0, aR0, - aX1, aY1, aR1) { - var gradient = new CanvasGradient_('gradientradial'); - gradient.x0_ = aX0; - gradient.y0_ = aY0; - gradient.r0_ = aR0; - gradient.x1_ = aX1; - gradient.y1_ = aY1; - gradient.r1_ = aR1; - return gradient; - }; - - contextPrototype.drawImage = function(image, var_args) { - var dx, dy, dw, dh, sx, sy, sw, sh; - - // to find the original width we overide the width and height - var oldRuntimeWidth = image.runtimeStyle.width; - var oldRuntimeHeight = image.runtimeStyle.height; - image.runtimeStyle.width = 'auto'; - image.runtimeStyle.height = 'auto'; - - // get the original size - var w = image.width; - var h = image.height; - - // and remove overides - image.runtimeStyle.width = oldRuntimeWidth; - image.runtimeStyle.height = oldRuntimeHeight; - - if (arguments.length == 3) { - dx = arguments[1]; - dy = arguments[2]; - sx = sy = 0; - sw = dw = w; - sh = dh = h; - } else if (arguments.length == 5) { - dx = arguments[1]; - dy = arguments[2]; - dw = arguments[3]; - dh = arguments[4]; - sx = sy = 0; - sw = w; - sh = h; - } else if (arguments.length == 9) { - sx = arguments[1]; - sy = arguments[2]; - sw = arguments[3]; - sh = arguments[4]; - dx = arguments[5]; - dy = arguments[6]; - dw = arguments[7]; - dh = arguments[8]; - } else { - throw Error('Invalid number of arguments'); - } - - var d = this.getCoords_(dx, dy); - - var w2 = sw / 2; - var h2 = sh / 2; - - var vmlStr = []; - - var W = 10; - var H = 10; - - // For some reason that I've now forgotten, using divs didn't work - vmlStr.push(' ' , - '', - ''); - - this.element_.insertAdjacentHTML('BeforeEnd', - vmlStr.join('')); - }; - - contextPrototype.stroke = function(aFill) { - var lineStr = []; - var lineOpen = false; - var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); - var color = a.color; - var opacity = a.alpha * this.globalAlpha; - - var W = 10; - var H = 10; - - lineStr.push(''); - - if (!aFill) { - var lineWidth = this.lineScale_ * this.lineWidth; - - // VML cannot correctly render a line if the width is less than 1px. - // In that case, we dilute the color to make the line look thinner. - if (lineWidth < 1) { - opacity *= lineWidth; - } - - lineStr.push( - '' - ); - } else if (typeof this.fillStyle == 'object') { - var fillStyle = this.fillStyle; - var angle = 0; - var focus = {x: 0, y: 0}; - - // additional offset - var shift = 0; - // scale factor for offset - var expansion = 1; - - if (fillStyle.type_ == 'gradient') { - var x0 = fillStyle.x0_ / this.arcScaleX_; - var y0 = fillStyle.y0_ / this.arcScaleY_; - var x1 = fillStyle.x1_ / this.arcScaleX_; - var y1 = fillStyle.y1_ / this.arcScaleY_; - var p0 = this.getCoords_(x0, y0); - var p1 = this.getCoords_(x1, y1); - var dx = p1.x - p0.x; - var dy = p1.y - p0.y; - angle = Math.atan2(dx, dy) * 180 / Math.PI; - - // The angle should be a non-negative number. - if (angle < 0) { - angle += 360; - } - - // Very small angles produce an unexpected result because they are - // converted to a scientific notation string. - if (angle < 1e-6) { - angle = 0; - } - } else { - var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_); - var width = max.x - min.x; - var height = max.y - min.y; - focus = { - x: (p0.x - min.x) / width, - y: (p0.y - min.y) / height - }; - - width /= this.arcScaleX_ * Z; - height /= this.arcScaleY_ * Z; - var dimension = m.max(width, height); - shift = 2 * fillStyle.r0_ / dimension; - expansion = 2 * fillStyle.r1_ / dimension - shift; - } - - // We need to sort the color stops in ascending order by offset, - // otherwise IE won't interpret it correctly. - var stops = fillStyle.colors_; - stops.sort(function(cs1, cs2) { - return cs1.offset - cs2.offset; - }); - - var length = stops.length; - var color1 = stops[0].color; - var color2 = stops[length - 1].color; - var opacity1 = stops[0].alpha * this.globalAlpha; - var opacity2 = stops[length - 1].alpha * this.globalAlpha; - - var colors = []; - for (var i = 0; i < length; i++) { - var stop = stops[i]; - colors.push(stop.offset * expansion + shift + ' ' + stop.color); - } - - // When colors attribute is used, the meanings of opacity and o:opacity2 - // are reversed. - lineStr.push(''); - } else { - lineStr.push(''); - } - - lineStr.push(''); - - this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); - }; - - contextPrototype.fill = function() { - this.stroke(true); - } - - contextPrototype.closePath = function() { - this.currentPath_.push({type: 'close'}); - }; - - /** - * @private - */ - contextPrototype.getCoords_ = function(aX, aY) { - var m = this.m_; - return { - x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, - y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 - } - }; - - contextPrototype.save = function() { - var o = {}; - copyState(this, o); - this.aStack_.push(o); - this.mStack_.push(this.m_); - this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); - }; - - contextPrototype.restore = function() { - copyState(this.aStack_.pop(), this); - this.m_ = this.mStack_.pop(); - }; - - contextPrototype.translate = function(aX, aY) { - var m1 = [ - [1, 0, 0], - [0, 1, 0], - [aX, aY, 1] - ]; - - this.m_ = matrixMultiply(m1, this.m_); - }; - - contextPrototype.rotate = function(aRot) { - var c = mc(aRot); - var s = ms(aRot); - - var m1 = [ - [c, s, 0], - [-s, c, 0], - [0, 0, 1] - ]; - - this.m_ = matrixMultiply(m1, this.m_); - }; - - contextPrototype.scale = function(aX, aY) { - this.arcScaleX_ *= aX; - this.arcScaleY_ *= aY; - var m1 = [ - [aX, 0, 0], - [0, aY, 0], - [0, 0, 1] - ]; - - var m = this.m_ = matrixMultiply(m1, this.m_); - - // Get the line scale. - // Determinant of this.m_ means how much the area is enlarged by the - // transformation. So its square root can be used as a scale factor - // for width. - var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; - this.lineScale_ = sqrt(abs(det)); - }; - - /******** STUBS ********/ - contextPrototype.clip = function() { - // TODO: Implement - }; - - contextPrototype.arcTo = function() { - // TODO: Implement - }; - - contextPrototype.createPattern = function() { - return new CanvasPattern_; - }; - - // Gradient / Pattern Stubs - function CanvasGradient_(aType) { - this.type_ = aType; - this.x0_ = 0; - this.y0_ = 0; - this.r0_ = 0; - this.x1_ = 0; - this.y1_ = 0; - this.r1_ = 0; - this.colors_ = []; - } - - CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { - aColor = processStyle(aColor); - this.colors_.push({offset: aOffset, - color: aColor.color, - alpha: aColor.alpha}); - }; - - function CanvasPattern_() {} - - // set up externs - G_vmlCanvasManager = G_vmlCanvasManager_; - CanvasRenderingContext2D = CanvasRenderingContext2D_; - CanvasGradient = CanvasGradient_; - CanvasPattern = CanvasPattern_; - -})(); - -} // if - --- a/js/flotr/lib/prototype-1.6.0.2.js +++ /dev/null @@ -1,4221 +1,1 @@ -/* Prototype JavaScript framework, version 1.6.0.2 - * (c) 2005-2008 Sam Stephenson - * - * Prototype is freely distributable under the terms of an MIT-style license. - * For details, see the Prototype web site: http://www.prototypejs.org/ - * - *--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.6.0.2', - - Browser: { - IE: !!(window.attachEvent && !window.opera), - Opera: !!window.opera, - WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, - Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1, - MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) - }, - - BrowserFeatures: { - XPath: !!document.evaluate, - ElementExtensions: !!window.HTMLElement, - SpecificElementExtensions: - document.createElement('div').__proto__ && - document.createElement('div').__proto__ !== - document.createElement('form').__proto__ - }, - - ScriptFragment: ']*>([\\S\\s]*?)<\/script>', - JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, - - emptyFunction: function() { }, - K: function(x) { return x } -}; - -if (Prototype.Browser.MobileSafari) - Prototype.BrowserFeatures.SpecificElementExtensions = false; - - -/* Based on Alex Arnell's inheritance implementation. */ -var Class = { - create: function() { - var parent = null, properties = $A(arguments); - if (Object.isFunction(properties[0])) - parent = properties.shift(); - - function klass() { - this.initialize.apply(this, arguments); - } - - Object.extend(klass, Class.Methods); - klass.superclass = parent; - klass.subclasses = []; - - if (parent) { - var subclass = function() { }; - subclass.prototype = parent.prototype; - klass.prototype = new subclass; - parent.subclasses.push(klass); - } - - for (var i = 0; i < properties.length; i++) - klass.addMethods(properties[i]); - - if (!klass.prototype.initialize) - klass.prototype.initialize = Prototype.emptyFunction; - - klass.prototype.constructor = klass; - - return klass; - } -}; - -Class.Methods = { - addMethods: function(source) { - var ancestor = this.superclass && this.superclass.prototype; - var properties = Object.keys(source); - - if (!Object.keys({ toString: true }).length) - properties.push("toString", "valueOf"); - - for (var i = 0, length = properties.length; i < length; i++) { - var property = properties[i], value = source[property]; - if (ancestor && Object.isFunction(value) && - value.argumentNames().first() == "$super") { - var method = value, value = Object.extend((function(m) { - return function() { return ancestor[m].apply(this, arguments) }; - })(property).wrap(method), { - valueOf: function() { return method }, - toString: function() { return method.toString() } - }); - } - this.prototype[property] = value; - } - - return this; - } -}; - -var Abstract = { }; - -Object.extend = function(destination, source) { - for (var property in source) - destination[property] = source[property]; - return destination; -}; - -Object.extend(Object, { - inspect: function(object) { - try { - if (Object.isUndefined(object)) return 'undefined'; - if (object === null) return 'null'; - return object.inspect ? object.inspect() : String(object); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } - }, - - toJSON: function(object) { - var type = typeof object; - switch (type) { - case 'undefined': - case 'function': - case 'unknown': return; - case 'boolean': return object.toString(); - } - - if (object === null) return 'null'; - if (object.toJSON) return object.toJSON(); - if (Object.isElement(object)) return; - - var results = []; - for (var property in object) { - var value = Object.toJSON(object[property]); - if (!Object.isUndefined(value)) - results.push(property.toJSON() + ': ' + value); - } - - return '{' + results.join(', ') + '}'; - }, - - toQueryString: function(object) { - return $H(object).toQueryString(); - }, - - toHTML: function(object) { - return object && object.toHTML ? object.toHTML() : String.interpret(object); - }, - - keys: function(object) { - var keys = []; - for (var property in object) - keys.push(property); - return keys; - }, - - values: function(object) { - var values = []; - for (var property in object) - values.push(object[property]); - return values; - }, - - clone: function(object) { - return Object.extend({ }, object); - }, - - isElement: function(object) { - return object && object.nodeType == 1; - }, - - isArray: function(object) { - return object != null && typeof object == "object" && - 'splice' in object && 'join' in object; - }, - - isHash: function(object) { - return object instanceof Hash; - }, - - isFunction: function(object) { - return typeof object == "function"; - }, - - isString: function(object) { - return typeof object == "string"; - }, - - isNumber: function(object) { - return typeof object == "number"; - }, - - isUndefined: function(object) { - return typeof object == "undefined"; - } -}); - -Object.extend(Function.prototype, { - argumentNames: function() { - var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip"); - return names.length == 1 && !names[0] ? [] : names; - }, - - bind: function() { - if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } - }, - - bindAsEventListener: function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function(event) { - return __method.apply(object, [event || window.event].concat(args)); - } - }, - - curry: function() { - if (!arguments.length) return this; - var __method = this, args = $A(arguments); - return function() { - return __method.apply(this, args.concat($A(arguments))); - } - }, - - delay: function() { - var __method = this, args = $A(arguments), timeout = args.shift() * 1000; - return window.setTimeout(function() { - return __method.apply(__method, args); - }, timeout); - }, - - wrap: function(wrapper) { - var __method = this; - return function() { - return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); - } - }, - - methodize: function() { - if (this._methodized) return this._methodized; - var __method = this; - return this._methodized = function() { - return __method.apply(null, [this].concat($A(arguments))); - }; - } -}); - -Function.prototype.defer = Function.prototype.delay.curry(0.01); - -Date.prototype.toJSON = function() { - return '"' + this.getUTCFullYear() + '-' + - (this.getUTCMonth() + 1).toPaddedString(2) + '-' + - this.getUTCDate().toPaddedString(2) + 'T' + - this.getUTCHours().toPaddedString(2) + ':' + - this.getUTCMinutes().toPaddedString(2) + ':' + - this.getUTCSeconds().toPaddedString(2) + 'Z"'; -}; - -var Try = { - these: function() { - var returnValue; - - for (var i = 0, length = arguments.length; i < length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) { } - } - - return returnValue; - } -}; - -RegExp.prototype.match = RegExp.prototype.test; - -RegExp.escape = function(str) { - return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); -}; - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create({ - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - execute: function() { - this.callback(this); - }, - - stop: function() { - if (!this.timer) return; - clearInterval(this.timer); - this.timer = null; - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.execute(); - } finally { - this.currentlyExecuting = false; - } - } - } -}); -Object.extend(String, { - interpret: function(value) { - return value == null ? '' : String(value); - }, - specialChar: { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '\\': '\\\\' - } -}); - -Object.extend(String.prototype, { - gsub: function(pattern, replacement) { - var result = '', source = this, match; - replacement = arguments.callee.prepareReplacement(replacement); - - while (source.length > 0) { - if (match = source.match(pattern)) { - result += source.slice(0, match.index); - result += String.interpret(replacement(match)); - source = source.slice(match.index + match[0].length); - } else { - result += source, source = ''; - } - } - return result; - }, - - sub: function(pattern, replacement, count) { - replacement = this.gsub.prepareReplacement(replacement); - count = Object.isUndefined(count) ? 1 : count; - - return this.gsub(pattern, function(match) { - if (--count < 0) return match[0]; - return replacement(match); - }); - }, - - scan: function(pattern, iterator) { - this.gsub(pattern, iterator); - return String(this); - }, - - truncate: function(length, truncation) { - length = length || 30; - truncation = Object.isUndefined(truncation) ? '...' : truncation; - return this.length > length ? - this.slice(0, length - truncation.length) + truncation : String(this); - }, - - strip: function() { - return this.replace(/^\s+/, '').replace(/\s+$/, ''); - }, - - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(function(script) { return eval(script) }); - }, - - escapeHTML: function() { - var self = arguments.callee; - self.text.data = this; - return self.div.innerHTML; - }, - - unescapeHTML: function() { - var div = new Element('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? (div.childNodes.length > 1 ? - $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : - div.childNodes[0].nodeValue) : ''; - }, - - toQueryParams: function(separator) { - var match = this.strip().match(/([^?#]*)(#.*)?$/); - if (!match) return { }; - - return match[1].split(separator || '&').inject({ }, function(hash, pair) { - if ((pair = pair.split('='))[0]) { - var key = decodeURIComponent(pair.shift()); - var value = pair.length > 1 ? pair.join('=') : pair[0]; - if (value != undefined) value = decodeURIComponent(value); - - if (key in hash) { - if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; - hash[key].push(value); - } - else hash[key] = value; - } - return hash; - }); - }, - - toArray: function() { - return this.split(''); - }, - - succ: function() { - return this.slice(0, this.length - 1) + - String.fromCharCode(this.charCodeAt(this.length - 1) + 1); - }, - - times: function(count) { - return count < 1 ? '' : new Array(count + 1).join(this); - }, - - camelize: function() { - var parts = this.split('-'), len = parts.length; - if (len == 1) return parts[0]; - - var camelized = this.charAt(0) == '-' - ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) - : parts[0]; - - for (var i = 1; i < len; i++) - camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); - - return camelized; - }, - - capitalize: function() { - return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); - }, - - underscore: function() { - return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); - }, - - dasherize: function() { - return this.gsub(/_/,'-'); - }, - - inspect: function(useDoubleQuotes) { - var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { - var character = String.specialChar[match[0]]; - return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); - }); - if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; - return "'" + escapedString.replace(/'/g, '\\\'') + "'"; - }, - - toJSON: function() { - return this.inspect(true); - }, - - unfilterJSON: function(filter) { - return this.sub(filter || Prototype.JSONFilter, '#{1}'); - }, - - isJSON: function() { - var str = this; - if (str.blank()) return false; - str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); - return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); - }, - - evalJSON: function(sanitize) { - var json = this.unfilterJSON(); - try { - if (!sanitize || json.isJSON()) return eval('(' + json + ')'); - } catch (e) { } - throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); - }, - - include: function(pattern) { - return this.indexOf(pattern) > -1; - }, - - startsWith: function(pattern) { - return this.indexOf(pattern) === 0; - }, - - endsWith: function(pattern) { - var d = this.length - pattern.length; - return d >= 0 && this.lastIndexOf(pattern) === d; - }, - - empty: function() { - return this == ''; - }, - - blank: function() { - return /^\s*$/.test(this); - }, - - interpolate: function(object, pattern) { - return new Template(this, pattern).evaluate(object); - } -}); - -if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { - escapeHTML: function() { - return this.replace(/&/g,'&').replace(//g,'>'); - }, - unescapeHTML: function() { - return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); - } -}); - -String.prototype.gsub.prepareReplacement = function(replacement) { - if (Object.isFunction(replacement)) return replacement; - var template = new Template(replacement); - return function(match) { return template.evaluate(match) }; -}; - -String.prototype.parseQuery = String.prototype.toQueryParams; - -Object.extend(String.prototype.escapeHTML, { - div: document.createElement('div'), - text: document.createTextNode('') -}); - -with (String.prototype.escapeHTML) div.appendChild(text); - -var Template = Class.create({ - initialize: function(template, pattern) { - this.template = template.toString(); - this.pattern = pattern || Template.Pattern; - }, - - evaluate: function(object) { - if (Object.isFunction(object.toTemplateReplacements)) - object = object.toTemplateReplacements(); - - return this.template.gsub(this.pattern, function(match) { - if (object == null) return ''; - - var before = match[1] || ''; - if (before == '\\') return match[2]; - - var ctx = object, expr = match[3]; - var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; - match = pattern.exec(expr); - if (match == null) return before; - - while (match != null) { - var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; - ctx = ctx[comp]; - if (null == ctx || '' == match[3]) break; - expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); - match = pattern.exec(expr); - } - - return before + String.interpret(ctx); - }); - } -}); -Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; - -var $break = { }; - -var Enumerable = { - each: function(iterator, context) { - var index = 0; - iterator = iterator.bind(context); - try { - this._each(function(value) { - iterator(value, index++); - }); - } catch (e) { - if (e != $break) throw e; - } - return this; - }, - - eachSlice: function(number, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var index = -number, slices = [], array = this.toArray(); - while ((index += number) < array.length) - slices.push(array.slice(index, index+number)); - return slices.collect(iterator, context); - }, - - all: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = true; - this.each(function(value, index) { - result = result && !!iterator(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = false; - this.each(function(value, index) { - if (result = !!iterator(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function(iterator, context) { - iterator = iterator.bind(context); - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(filter, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - - if (Object.isString(filter)) - filter = new RegExp(filter); - - this.each(function(value, index) { - if (filter.match(value)) - results.push(iterator(value, index)); - }); - return results; - }, - - include: function(object) { - if (Object.isFunction(this.indexOf)) - if (this.indexOf(object) != -1) return true; - - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - }, - - inGroupsOf: function(number, fillWith) { - fillWith = Object.isUndefined(fillWith) ? null : fillWith; - return this.eachSlice(number, function(slice) { - while(slice.length < number) slice.push(fillWith); - return slice; - }); - }, - - inject: function(memo, iterator, context) { - iterator = iterator.bind(context); - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.map(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == null || value >= result) - result = value; - }); - return result; - }, - - min: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == null || value < result) - result = value; - }); - return result; - }, - - partition: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var trues = [], falses = []; - this.each(function(value, index) { - (iterator(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator, context) { - iterator = iterator.bind(context); - return this.map(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.map(); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (Object.isFunction(args.last())) - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - return iterator(collections.pluck(index)); - }); - }, - - size: function() { - return this.toArray().length; - }, - - inspect: function() { - return '#'; - } -}; - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - filter: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray, - every: Enumerable.all, - some: Enumerable.any -}); -function $A(iterable) { - if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); - var length = iterable.length || 0, results = new Array(length); - while (length--) results[length] = iterable[length]; - return results; -} - -if (Prototype.Browser.WebKit) { - $A = function(iterable) { - if (!iterable) return []; - if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') && - iterable.toArray) return iterable.toArray(); - var length = iterable.length || 0, results = new Array(length); - while (length--) results[length] = iterable[length]; - return results; - }; -} - -Array.from = $A; - -Object.extend(Array.prototype, Enumerable); - -if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0, length = this.length; i < length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(Object.isArray(value) ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - reduce: function() { - return this.length > 1 ? this : this[0]; - }, - - uniq: function(sorted) { - return this.inject([], function(array, value, index) { - if (0 == index || (sorted ? array.last() != value : !array.include(value))) - array.push(value); - return array; - }); - }, - - intersect: function(array) { - return this.uniq().findAll(function(item) { - return array.detect(function(value) { return item === value }); - }); - }, - - clone: function() { - return [].concat(this); - }, - - size: function() { - return this.length; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - }, - - toJSON: function() { - var results = []; - this.each(function(object) { - var value = Object.toJSON(object); - if (!Object.isUndefined(value)) results.push(value); - }); - return '[' + results.join(', ') + ']'; - } -}); - -// use native browser JS 1.6 implementation if available -if (Object.isFunction(Array.prototype.forEach)) - Array.prototype._each = Array.prototype.forEach; - -if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { - i || (i = 0); - var length = this.length; - if (i < 0) i = length + i; - for (; i < length; i++) - if (this[i] === item) return i; - return -1; -}; - -if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { - i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; - var n = this.slice(0, i).reverse().indexOf(item); - return (n < 0) ? n : i - n - 1; -}; - -Array.prototype.toArray = Array.prototype.clone; - -function $w(string) { - if (!Object.isString(string)) return []; - string = string.strip(); - return string ? string.split(/\s+/) : []; -} - -if (Prototype.Browser.Opera){ - Array.prototype.concat = function() { - var array = []; - for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); - for (var i = 0, length = arguments.length; i < length; i++) { - if (Object.isArray(arguments[i])) { - for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) - array.push(arguments[i][j]); - } else { - array.push(arguments[i]); - } - } - return array; - }; -} -Object.extend(Number.prototype, { - toColorPart: function() { - return this.toPaddedString(2, 16); - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - }, - - toPaddedString: function(length, radix) { - var string = this.toString(radix || 10); - return '0'.times(length - string.length) + string; - }, - - toJSON: function() { - return isFinite(this) ? this.toString() : 'null'; - } -}); - -$w('abs round ceil floor').each(function(method){ - Number.prototype[method] = Math[method].methodize(); -}); -function $H(object) { - return new Hash(object); -}; - -var Hash = Class.create(Enumerable, (function() { - - function toQueryPair(key, value) { - if (Object.isUndefined(value)) return key; - return key + '=' + encodeURIComponent(String.interpret(value)); - } - - return { - initialize: function(object) { - this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); - }, - - _each: function(iterator) { - for (var key in this._object) { - var value = this._object[key], pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - set: function(key, value) { - return this._object[key] = value; - }, - - get: function(key) { - return this._object[key]; - }, - - unset: function(key) { - var value = this._object[key]; - delete this._object[key]; - return value; - }, - - toObject: function() { - return Object.clone(this._object); - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - index: function(value) { - var match = this.detect(function(pair) { - return pair.value === value; - }); - return match && match.key; - }, - - merge: function(object) { - return this.clone().update(object); - }, - - update: function(object) { - return new Hash(object).inject(this, function(result, pair) { - result.set(pair.key, pair.value); - return result; - }); - }, - - toQueryString: function() { - return this.map(function(pair) { - var key = encodeURIComponent(pair.key), values = pair.value; - - if (values && typeof values == 'object') { - if (Object.isArray(values)) - return values.map(toQueryPair.curry(key)).join('&'); - } - return toQueryPair(key, values); - }).join('&'); - }, - - inspect: function() { - return '#'; - }, - - toJSON: function() { - return Object.toJSON(this.toObject()); - }, - - clone: function() { - return new Hash(this); - } - } -})()); - -Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; -Hash.from = $H; -var ObjectRange = Class.create(Enumerable, { - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - while (this.include(value)) { - iterator(value); - value = value.succ(); - } - }, - - include: function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } -}); - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -}; - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new XMLHttpRequest()}, - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')} - ) || false; - }, - - activeRequestCount: 0 -}; - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responder) { - if (!this.include(responder)) - this.responders.push(responder); - }, - - unregister: function(responder) { - this.responders = this.responders.without(responder); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (Object.isFunction(responder[callback])) { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) { } - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { Ajax.activeRequestCount++ }, - onComplete: function() { Ajax.activeRequestCount-- } -}); - -Ajax.Base = Class.create({ - initialize: function(options) { - this.options = { - method: 'post', - asynchronous: true, - contentType: 'application/x-www-form-urlencoded', - encoding: 'UTF-8', - parameters: '', - evalJSON: true, - evalJS: true - }; - Object.extend(this.options, options || { }); - - this.options.method = this.options.method.toLowerCase(); - - if (Object.isString(this.options.parameters)) - this.options.parameters = this.options.parameters.toQueryParams(); - else if (Object.isHash(this.options.parameters)) - this.options.parameters = this.options.parameters.toObject(); - } -}); - -Ajax.Request = Class.create(Ajax.Base, { - _complete: false, - - initialize: function($super, url, options) { - $super(options); - this.transport = Ajax.getTransport(); - this.request(url); - }, - - request: function(url) { - this.url = url; - this.method = this.options.method; - var params = Object.clone(this.options.parameters); - - if (!['get', 'post'].include(this.method)) { - // simulate other verbs over post - params['_method'] = this.method; - this.method = 'post'; - } - - this.parameters = params; - - if (params = Object.toQueryString(params)) { - // when GET, append parameters to URL - if (this.method == 'get') - this.url += (this.url.include('?') ? '&' : '?') + params; - else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) - params += '&_='; - } - - try { - var response = new Ajax.Response(this); - if (this.options.onCreate) this.options.onCreate(response); - Ajax.Responders.dispatch('onCreate', this, response); - - this.transport.open(this.method.toUpperCase(), this.url, - this.options.asynchronous); - - if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); - - this.transport.onreadystatechange = this.onStateChange.bind(this); - this.setRequestHeaders(); - - this.body = this.method == 'post' ? (this.options.postBody || params) : null; - this.transport.send(this.body); - - /* Force Firefox to handle ready state 4 for synchronous requests */ - if (!this.options.asynchronous && this.transport.overrideMimeType) - this.onStateChange(); - - } - catch (e) { - this.dispatchException(e); - } - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState > 1 && !((readyState == 4) && this._complete)) - this.respondToReadyState(this.transport.readyState); - }, - - setRequestHeaders: function() { - var headers = { - 'X-Requested-With': 'XMLHttpRequest', - 'X-Prototype-Version': Prototype.Version, - 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' - }; - - if (this.method == 'post') { - headers['Content-type'] = this.options.contentType + - (this.options.encoding ? '; charset=' + this.options.encoding : ''); - - /* Force "Connection: close" for older Mozilla browsers to work - * around a bug where XMLHttpRequest sends an incorrect - * Content-length header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType && - (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) - headers['Connection'] = 'close'; - } - - // user-defined headers - if (typeof this.options.requestHeaders == 'object') { - var extras = this.options.requestHeaders; - - if (Object.isFunction(extras.push)) - for (var i = 0, length = extras.length; i < length; i += 2) - headers[extras[i]] = extras[i+1]; - else - $H(extras).each(function(pair) { headers[pair.key] = pair.value }); - } - - for (var name in headers) - this.transport.setRequestHeader(name, headers[name]); - }, - - success: function() { - var status = this.getStatus(); - return !status || (status >= 200 && status < 300); - }, - - getStatus: function() { - try { - return this.transport.status || 0; - } catch (e) { return 0 } - }, - - respondToReadyState: function(readyState) { - var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); - - if (state == 'Complete') { - try { - this._complete = true; - (this.options['on' + response.status] - || this.options['on' + (this.success() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - var contentType = response.getHeader('Content-type'); - if (this.options.evalJS == 'force' - || (this.options.evalJS && this.isSameOrigin() && contentType - && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) - this.evalResponse(); - } - - try { - (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); - Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - if (state == 'Complete') { - // avoid memory leak in MSIE: clean up - this.transport.onreadystatechange = Prototype.emptyFunction; - } - }, - - isSameOrigin: function() { - var m = this.url.match(/^\s*https?:\/\/[^\/]*/); - return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ - protocol: location.protocol, - domain: document.domain, - port: location.port ? ':' + location.port : '' - })); - }, - - getHeader: function(name) { - try { - return this.transport.getResponseHeader(name) || null; - } catch (e) { return null } - }, - - evalResponse: function() { - try { - return eval((this.transport.responseText || '').unfilterJSON()); - } catch (e) { - this.dispatchException(e); - } - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Response = Class.create({ - initialize: function(request){ - this.request = request; - var transport = this.transport = request.transport, - readyState = this.readyState = transport.readyState; - - if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { - this.status = this.getStatus(); - this.statusText = this.getStatusText(); - this.responseText = String.interpret(transport.responseText); - this.headerJSON = this._getHeaderJSON(); - } - - if(readyState == 4) { - var xml = transport.responseXML; - this.responseXML = Object.isUndefined(xml) ? null : xml; - this.responseJSON = this._getResponseJSON(); - } - }, - - status: 0, - statusText: '', - - getStatus: Ajax.Request.prototype.getStatus, - - getStatusText: function() { - try { - return this.transport.statusText || ''; - } catch (e) { return '' } - }, - - getHeader: Ajax.Request.prototype.getHeader, - - getAllHeaders: function() { - try { - return this.getAllResponseHeaders(); - } catch (e) { return null } - }, - - getResponseHeader: function(name) { - return this.transport.getResponseHeader(name); - }, - - getAllResponseHeaders: function() { - return this.transport.getAllResponseHeaders(); - }, - - _getHeaderJSON: function() { - var json = this.getHeader('X-JSON'); - if (!json) return null; - json = decodeURIComponent(escape(json)); - try { - return json.evalJSON(this.request.options.sanitizeJSON || - !this.request.isSameOrigin()); - } catch (e) { - this.request.dispatchException(e); - } - }, - - _getResponseJSON: function() { - var options = this.request.options; - if (!options.evalJSON || (options.evalJSON != 'force' && - !(this.getHeader('Content-type') || '').include('application/json')) || - this.responseText.blank()) - return null; - try { - return this.responseText.evalJSON(options.sanitizeJSON || - !this.request.isSameOrigin()); - } catch (e) { - this.request.dispatchException(e); - } - } -}); - -Ajax.Updater = Class.create(Ajax.Request, { - initialize: function($super, container, url, options) { - this.container = { - success: (container.success || container), - failure: (container.failure || (container.success ? null : container)) - }; - - options = Object.clone(options); - var onComplete = options.onComplete; - options.onComplete = (function(response, json) { - this.updateContent(response.responseText); - if (Object.isFunction(onComplete)) onComplete(response, json); - }).bind(this); - - $super(url, options); - }, - - updateContent: function(responseText) { - var receiver = this.container[this.success() ? 'success' : 'failure'], - options = this.options; - - if (!options.evalScripts) responseText = responseText.stripScripts(); - - if (receiver = $(receiver)) { - if (options.insertion) { - if (Object.isString(options.insertion)) { - var insertion = { }; insertion[options.insertion] = responseText; - receiver.insert(insertion); - } - else options.insertion(receiver, responseText); - } - else receiver.update(responseText); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { - initialize: function($super, container, url, options) { - $super(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = { }; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.options.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(response) { - if (this.options.decay) { - this.decay = (response.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = response.responseText; - } - this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -function $(element) { - if (arguments.length > 1) { - for (var i = 0, elements = [], length = arguments.length; i < length; i++) - elements.push($(arguments[i])); - return elements; - } - if (Object.isString(element)) - element = document.getElementById(element); - return Element.extend(element); -} - -if (Prototype.BrowserFeatures.XPath) { - document._getElementsByXPath = function(expression, parentElement) { - var results = []; - var query = document.evaluate(expression, $(parentElement) || document, - null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); - for (var i = 0, length = query.snapshotLength; i < length; i++) - results.push(Element.extend(query.snapshotItem(i))); - return results; - }; -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Node) var Node = { }; - -if (!Node.ELEMENT_NODE) { - // DOM level 2 ECMAScript Language Binding - Object.extend(Node, { - ELEMENT_NODE: 1, - ATTRIBUTE_NODE: 2, - TEXT_NODE: 3, - CDATA_SECTION_NODE: 4, - ENTITY_REFERENCE_NODE: 5, - ENTITY_NODE: 6, - PROCESSING_INSTRUCTION_NODE: 7, - COMMENT_NODE: 8, - DOCUMENT_NODE: 9, - DOCUMENT_TYPE_NODE: 10, - DOCUMENT_FRAGMENT_NODE: 11, - NOTATION_NODE: 12 - }); -} - -(function() { - var element = this.Element; - this.Element = function(tagName, attributes) { - attributes = attributes || { }; - tagName = tagName.toLowerCase(); - var cache = Element.cache; - if (Prototype.Browser.IE && attributes.name) { - tagName = '<' + tagName + ' name="' + attributes.name + '">'; - delete attributes.name; - return Element.writeAttribute(document.createElement(tagName), attributes); - } - if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); - return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); - }; - Object.extend(this.Element, element || { }); -}).call(window); - -Element.cache = { }; - -Element.Methods = { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function(element) { - element = $(element); - Element[Element.visible(element) ? 'hide' : 'show'](element); - return element; - }, - - hide: function(element) { - $(element).style.display = 'none'; - return element; - }, - - show: function(element) { - $(element).style.display = ''; - return element; - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - return element; - }, - - update: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - content = Object.toHTML(content); - element.innerHTML = content.stripScripts(); - content.evalScripts.bind(content).defer(); - return element; - }, - - replace: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - else if (!Object.isElement(content)) { - content = Object.toHTML(content); - var range = element.ownerDocument.createRange(); - range.selectNode(element); - content.evalScripts.bind(content).defer(); - content = range.createContextualFragment(content.stripScripts()); - } - element.parentNode.replaceChild(content, element); - return element; - }, - - insert: function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = {bottom:insertions}; - - var content, insert, tagName, childNodes; - - for (var position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - insert = Element._insertionTranslations[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - insert(element, content); - continue; - } - - content = Object.toHTML(content); - - tagName = ((position == 'before' || position == 'after') - ? element.parentNode : element).tagName.toUpperCase(); - - childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - - if (position == 'top' || position == 'after') childNodes.reverse(); - childNodes.each(insert.curry(element)); - - content.evalScripts.bind(content).defer(); - } - - return element; - }, - - wrap: function(element, wrapper, attributes) { - element = $(element); - if (Object.isElement(wrapper)) - $(wrapper).writeAttribute(attributes || { }); - else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); - else wrapper = new Element('div', wrapper); - if (element.parentNode) - element.parentNode.replaceChild(wrapper, element); - wrapper.appendChild(element); - return wrapper; - }, - - inspect: function(element) { - element = $(element); - var result = '<' + element.tagName.toLowerCase(); - $H({'id': 'id', 'className': 'class'}).each(function(pair) { - var property = pair.first(), attribute = pair.last(); - var value = (element[property] || '').toString(); - if (value) result += ' ' + attribute + '=' + value.inspect(true); - }); - return result + '>'; - }, - - recursivelyCollect: function(element, property) { - element = $(element); - var elements = []; - while (element = element[property]) - if (element.nodeType == 1) - elements.push(Element.extend(element)); - return elements; - }, - - ancestors: function(element) { - return $(element).recursivelyCollect('parentNode'); - }, - - descendants: function(element) { - return $(element).select("*"); - }, - - firstDescendant: function(element) { - element = $(element).firstChild; - while (element && element.nodeType != 1) element = element.nextSibling; - return $(element); - }, - - immediateDescendants: function(element) { - if (!(element = $(element).firstChild)) return []; - while (element && element.nodeType != 1) element = element.nextSibling; - if (element) return [element].concat($(element).nextSiblings()); - return []; - }, - - previousSiblings: function(element) { - return $(element).recursivelyCollect('previousSibling'); - }, - - nextSiblings: function(element) { - return $(element).recursivelyCollect('nextSibling'); - }, - - siblings: function(element) { - element = $(element); - return element.previousSiblings().reverse().concat(element.nextSiblings()); - }, - - match: function(element, selector) { - if (Object.isString(selector)) - selector = new Selector(selector); - return selector.match($(element)); - }, - - up: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(element.parentNode); - var ancestors = element.ancestors(); - return Object.isNumber(expression) ? ancestors[expression] : - Selector.findElement(ancestors, expression, index); - }, - - down: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return element.firstDescendant(); - return Object.isNumber(expression) ? element.descendants()[expression] : - element.select(expression)[index || 0]; - }, - - previous: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); - var previousSiblings = element.previousSiblings(); - return Object.isNumber(expression) ? previousSiblings[expression] : - Selector.findElement(previousSiblings, expression, index); - }, - - next: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); - var nextSiblings = element.nextSiblings(); - return Object.isNumber(expression) ? nextSiblings[expression] : - Selector.findElement(nextSiblings, expression, index); - }, - - select: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element, args); - }, - - adjacent: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element.parentNode, args).without(element); - }, - - identify: function(element) { - element = $(element); - var id = element.readAttribute('id'), self = arguments.callee; - if (id) return id; - do { id = 'anonymous_element_' + self.counter++ } while ($(id)); - element.writeAttribute('id', id); - return id; - }, - - readAttribute: function(element, name) { - element = $(element); - if (Prototype.Browser.IE) { - var t = Element._attributeTranslations.read; - if (t.values[name]) return t.values[name](element, name); - if (t.names[name]) name = t.names[name]; - if (name.include(':')) { - return (!element.attributes || !element.attributes[name]) ? null : - element.attributes[name].value; - } - } - return element.getAttribute(name); - }, - - writeAttribute: function(element, name, value) { - element = $(element); - var attributes = { }, t = Element._attributeTranslations.write; - - if (typeof name == 'object') attributes = name; - else attributes[name] = Object.isUndefined(value) ? true : value; - - for (var attr in attributes) { - name = t.names[attr] || attr; - value = attributes[attr]; - if (t.values[attr]) name = t.values[attr](element, value); - if (value === false || value === null) - element.removeAttribute(name); - else if (value === true) - element.setAttribute(name, name); - else element.setAttribute(name, value); - } - return element; - }, - - getHeight: function(element) { - return $(element).getDimensions().height; - }, - - getWidth: function(element) { - return $(element).getDimensions().width; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - var elementClassName = element.className; - return (elementClassName.length > 0 && (elementClassName == className || - new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - if (!element.hasClassName(className)) - element.className += (element.className ? ' ' : '') + className; - return element; - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - element.className = element.className.replace( - new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); - return element; - }, - - toggleClassName: function(element, className) { - if (!(element = $(element))) return; - return element[element.hasClassName(className) ? - 'removeClassName' : 'addClassName'](className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - var node = element.firstChild; - while (node) { - var nextNode = node.nextSibling; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - element.removeChild(node); - node = nextNode; - } - return element; - }, - - empty: function(element) { - return $(element).innerHTML.blank(); - }, - - descendantOf: function(element, ancestor) { - element = $(element), ancestor = $(ancestor); - var originalAncestor = ancestor; - - if (element.compareDocumentPosition) - return (element.compareDocumentPosition(ancestor) & 8) === 8; - - if (element.sourceIndex && !Prototype.Browser.Opera) { - var e = element.sourceIndex, a = ancestor.sourceIndex, - nextAncestor = ancestor.nextSibling; - if (!nextAncestor) { - do { ancestor = ancestor.parentNode; } - while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode); - } - if (nextAncestor && nextAncestor.sourceIndex) - return (e > a && e < nextAncestor.sourceIndex); - } - - while (element = element.parentNode) - if (element == originalAncestor) return true; - return false; - }, - - scrollTo: function(element) { - element = $(element); - var pos = element.cumulativeOffset(); - window.scrollTo(pos[0], pos[1]); - return element; - }, - - getStyle: function(element, style) { - element = $(element); - style = style == 'float' ? 'cssFloat' : style.camelize(); - var value = element.style[style]; - if (!value) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css[style] : null; - } - if (style == 'opacity') return value ? parseFloat(value) : 1.0; - return value == 'auto' ? null : value; - }, - - getOpacity: function(element) { - return $(element).getStyle('opacity'); - }, - - setStyle: function(element, styles) { - element = $(element); - var elementStyle = element.style, match; - if (Object.isString(styles)) { - element.style.cssText += ';' + styles; - return styles.include('opacity') ? - element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; - } - for (var property in styles) - if (property == 'opacity') element.setOpacity(styles[property]); - else - elementStyle[(property == 'float' || property == 'cssFloat') ? - (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : - property] = styles[property]; - - return element; - }, - - setOpacity: function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - return element; - }, - - getDimensions: function(element) { - element = $(element); - var display = $(element).getStyle('display'); - if (display != 'none' && display != null) // Safari bug - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - var originalDisplay = els.display; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = 'block'; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = originalDisplay; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - return element; - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - return element; - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return element; - element._overflow = Element.getStyle(element, 'overflow') || 'auto'; - if (element._overflow !== 'hidden') - element.style.overflow = 'hidden'; - return element; - }, - - undoClipping: function(element) { - element = $(element); - if (!element._overflow) return element; - element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; - element._overflow = null; - return element; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - if (element.tagName == 'BODY') break; - var p = Element.getStyle(element, 'position'); - if (p !== 'static') break; - } - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - absolutize: function(element) { - element = $(element); - if (element.getStyle('position') == 'absolute') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - var offsets = element.positionedOffset(); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - return element; - }, - - relativize: function(element) { - element = $(element); - if (element.getStyle('position') == 'relative') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - return element; - }, - - cumulativeScrollOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - getOffsetParent: function(element) { - if (element.offsetParent) return $(element.offsetParent); - if (element == document.body) return $(element); - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return $(element); - - return $(document.body); - }, - - viewportOffset: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent == document.body && - Element.getStyle(element, 'position') == 'absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - if (!Prototype.Browser.Opera || element.tagName == 'BODY') { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } - } while (element = element.parentNode); - - return Element._returnOffset(valueL, valueT); - }, - - clonePosition: function(element, source) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || { }); - - // find page position of source - source = $(source); - var p = source.viewportOffset(); - - // find coordinate system to use - element = $(element); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(element, 'position') == 'absolute') { - parent = element.getOffsetParent(); - delta = parent.viewportOffset(); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if (options.setWidth) element.style.width = source.offsetWidth + 'px'; - if (options.setHeight) element.style.height = source.offsetHeight + 'px'; - return element; - } -}; - -Element.Methods.identify.counter = 1; - -Object.extend(Element.Methods, { - getElementsBySelector: Element.Methods.select, - childElements: Element.Methods.immediateDescendants -}); - -Element._attributeTranslations = { - write: { - names: { - className: 'class', - htmlFor: 'for' - }, - values: { } - } -}; - -if (Prototype.Browser.Opera) { - Element.Methods.getStyle = Element.Methods.getStyle.wrap( - function(proceed, element, style) { - switch (style) { - case 'left': case 'top': case 'right': case 'bottom': - if (proceed(element, 'position') === 'static') return null; - case 'height': case 'width': - // returns '0px' for hidden elements; we want it to return null - if (!Element.visible(element)) return null; - - // returns the border-box dimensions rather than the content-box - // dimensions, so we subtract padding and borders from the value - var dim = parseInt(proceed(element, style), 10); - - if (dim !== element['offset' + style.capitalize()]) - return dim + 'px'; - - var properties; - if (style === 'height') { - properties = ['border-top-width', 'padding-top', - 'padding-bottom', 'border-bottom-width']; - } - else { - properties = ['border-left-width', 'padding-left', - 'padding-right', 'border-right-width']; - } - return properties.inject(dim, function(memo, property) { - var val = proceed(element, property); - return val === null ? memo : memo - parseInt(val, 10); - }) + 'px'; - default: return proceed(element, style); - } - } - ); - - Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( - function(proceed, element, attribute) { - if (attribute === 'title') return element.title; - return proceed(element, attribute); - } - ); -} - -else if (Prototype.Browser.IE) { - // IE doesn't report offsets correctly for static elements, so we change them - // to "relative" to get the values, then change them back. - Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( - function(proceed, element) { - element = $(element); - var position = element.getStyle('position'); - if (position !== 'static') return proceed(element); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - - $w('positionedOffset viewportOffset').each(function(method) { - Element.Methods[method] = Element.Methods[method].wrap( - function(proceed, element) { - element = $(element); - var position = element.getStyle('position'); - if (position !== 'static') return proceed(element); - // Trigger hasLayout on the offset parent so that IE6 reports - // accurate offsetTop and offsetLeft values for position: fixed. - var offsetParent = element.getOffsetParent(); - if (offsetParent && offsetParent.getStyle('position') === 'fixed') - offsetParent.setStyle({ zoom: 1 }); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - }); - - Element.Methods.getStyle = function(element, style) { - element = $(element); - style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); - var value = element.style[style]; - if (!value && element.currentStyle) value = element.currentStyle[style]; - - if (style == 'opacity') { - if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) - if (value[1]) return parseFloat(value[1]) / 100; - return 1.0; - } - - if (value == 'auto') { - if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) - return element['offset' + style.capitalize()] + 'px'; - return null; - } - return value; - }; - - Element.Methods.setOpacity = function(element, value) { - function stripAlpha(filter){ - return filter.replace(/alpha\([^\)]*\)/gi,''); - } - element = $(element); - var currentStyle = element.currentStyle; - if ((currentStyle && !currentStyle.hasLayout) || - (!currentStyle && element.style.zoom == 'normal')) - element.style.zoom = 1; - - var filter = element.getStyle('filter'), style = element.style; - if (value == 1 || value === '') { - (filter = stripAlpha(filter)) ? - style.filter = filter : style.removeAttribute('filter'); - return element; - } else if (value < 0.00001) value = 0; - style.filter = stripAlpha(filter) + - 'alpha(opacity=' + (value * 100) + ')'; - return element; - }; - - Element._attributeTranslations = { - read: { - names: { - 'class': 'className', - 'for': 'htmlFor' - }, - values: { - _getAttr: function(element, attribute) { - return element.getAttribute(attribute, 2); - }, - _getAttrNode: function(element, attribute) { - var node = element.getAttributeNode(attribute); - return node ? node.value : ""; - }, - _getEv: function(element, attribute) { - attribute = element.getAttribute(attribute); - return attribute ? attribute.toString().slice(23, -2) : null; - }, - _flag: function(element, attribute) { - return $(element).hasAttribute(attribute) ? attribute : null; - }, - style: function(element) { - return element.style.cssText.toLowerCase(); - }, - title: function(element) { - return element.title; - } - } - } - }; - - Element._attributeTranslations.write = { - names: Object.extend({ - cellpadding: 'cellPadding', - cellspacing: 'cellSpacing' - }, Element._attributeTranslations.read.names), - values: { - checked: function(element, value) { - element.checked = !!value; - }, - - style: function(element, value) { - element.style.cssText = value ? value : ''; - } - } - }; - - Element._attributeTranslations.has = {}; - - $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + - 'encType maxLength readOnly longDesc').each(function(attr) { - Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; - Element._attributeTranslations.has[attr.toLowerCase()] = attr; - }); - - (function(v) { - Object.extend(v, { - href: v._getAttr, - src: v._getAttr, - type: v._getAttr, - action: v._getAttrNode, - disabled: v._flag, - checked: v._flag, - readonly: v._flag, - multiple: v._flag, - onload: v._getEv, - onunload: v._getEv, - onclick: v._getEv, - ondblclick: v._getEv, - onmousedown: v._getEv, - onmouseup: v._getEv, - onmouseover: v._getEv, - onmousemove: v._getEv, - onmouseout: v._getEv, - onfocus: v._getEv, - onblur: v._getEv, - onkeypress: v._getEv, - onkeydown: v._getEv, - onkeyup: v._getEv, - onsubmit: v._getEv, - onreset: v._getEv, - onselect: v._getEv, - onchange: v._getEv - }); - })(Element._attributeTranslations.read.values); -} - -else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1) ? 0.999999 : - (value === '') ? '' : (value < 0.00001) ? 0 : value; - return element; - }; -} - -else if (Prototype.Browser.WebKit) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - - if (value == 1) - if(element.tagName == 'IMG' && element.width) { - element.width++; element.width--; - } else try { - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch (e) { } - - return element; - }; - - // Safari returns margins on body which is incorrect if the child is absolutely - // positioned. For performance reasons, redefine Element#cumulativeOffset for - // KHTML/WebKit only. - Element.Methods.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return Element._returnOffset(valueL, valueT); - }; -} - -if (Prototype.Browser.IE || Prototype.Browser.Opera) { - // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements - Element.Methods.update = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - - content = Object.toHTML(content); - var tagName = element.tagName.toUpperCase(); - - if (tagName in Element._insertionTranslations.tags) { - $A(element.childNodes).each(function(node) { element.removeChild(node) }); - Element._getContentFromAnonymousElement(tagName, content.stripScripts()) - .each(function(node) { element.appendChild(node) }); - } - else element.innerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -if ('outerHTML' in document.createElement('div')) { - Element.Methods.replace = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - element.parentNode.replaceChild(content, element); - return element; - } - - content = Object.toHTML(content); - var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); - - if (Element._insertionTranslations.tags[tagName]) { - var nextSibling = element.next(); - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - parent.removeChild(element); - if (nextSibling) - fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); - else - fragments.each(function(node) { parent.appendChild(node) }); - } - else element.outerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -Element._returnOffset = function(l, t) { - var result = [l, t]; - result.left = l; - result.top = t; - return result; -}; - -Element._getContentFromAnonymousElement = function(tagName, html) { - var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; - if (t) { - div.innerHTML = t[0] + html + t[1]; - t[2].times(function() { div = div.firstChild }); - } else div.innerHTML = html; - return $A(div.childNodes); -}; - -Element._insertionTranslations = { - before: function(element, node) { - element.parentNode.insertBefore(node, element); - }, - top: function(element, node) { - element.insertBefore(node, element.firstChild); - }, - bottom: function(element, node) { - element.appendChild(node); - }, - after: function(element, node) { - element.parentNode.insertBefore(node, element.nextSibling); - }, - tags: { - TABLE: ['', '
', 1], - TBODY: ['', '
', 2], - TR: ['', '
', 3], - TD: ['
', '
', 4], - SELECT: ['', 1] - } -}; - -(function() { - Object.extend(this.tags, { - THEAD: this.tags.TBODY, - TFOOT: this.tags.TBODY, - TH: this.tags.TD - }); -}).call(Element._insertionTranslations); - -Element.Methods.Simulated = { - hasAttribute: function(element, attribute) { - attribute = Element._attributeTranslations.has[attribute] || attribute; - var node = $(element).getAttributeNode(attribute); - return node && node.specified; - } -}; - -Element.Methods.ByTag = { }; - -Object.extend(Element, Element.Methods); - -if (!Prototype.BrowserFeatures.ElementExtensions && - document.createElement('div').__proto__) { - window.HTMLElement = { }; - window.HTMLElement.prototype = document.createElement('div').__proto__; - Prototype.BrowserFeatures.ElementExtensions = true; -} - -Element.extend = (function() { - if (Prototype.BrowserFeatures.SpecificElementExtensions) - return Prototype.K; - - var Methods = { }, ByTag = Element.Methods.ByTag; - - var extend = Object.extend(function(element) { - if (!element || element._extendedByPrototype || - element.nodeType != 1 || element == window) return element; - - var methods = Object.clone(Methods), - tagName = element.tagName, property, value; - - // extend methods for specific tags - if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - - for (property in methods) { - value = methods[property]; - if (Object.isFunction(value) && !(property in element)) - element[property] = value.methodize(); - } - - element._extendedByPrototype = Prototype.emptyFunction; - return element; - - }, { - refresh: function() { - // extend methods for all tags (Safari doesn't need this) - if (!Prototype.BrowserFeatures.ElementExtensions) { - Object.extend(Methods, Element.Methods); - Object.extend(Methods, Element.Methods.Simulated); - } - } - }); - - extend.refresh(); - return extend; -})(); - -Element.hasAttribute = function(element, attribute) { - if (element.hasAttribute) return element.hasAttribute(attribute); - return Element.Methods.Simulated.hasAttribute(element, attribute); -}; - -Element.addMethods = function(methods) { - var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; - - if (!methods) { - Object.extend(Form, Form.Methods); - Object.extend(Form.Element, Form.Element.Methods); - Object.extend(Element.Methods.ByTag, { - "FORM": Object.clone(Form.Methods), - "INPUT": Object.clone(Form.Element.Methods), - "SELECT": Object.clone(Form.Element.Methods), - "TEXTAREA": Object.clone(Form.Element.Methods) - }); - } - - if (arguments.length == 2) { - var tagName = methods; - methods = arguments[1]; - } - - if (!tagName) Object.extend(Element.Methods, methods || { }); - else { - if (Object.isArray(tagName)) tagName.each(extend); - else extend(tagName); - } - - function extend(tagName) { - tagName = tagName.toUpperCase(); - if (!Element.Methods.ByTag[tagName]) - Element.Methods.ByTag[tagName] = { }; - Object.extend(Element.Methods.ByTag[tagName], methods); - } - - function copy(methods, destination, onlyIfAbsent) { - onlyIfAbsent = onlyIfAbsent || false; - for (var property in methods) { - var value = methods[property]; - if (!Object.isFunction(value)) continue; - if (!onlyIfAbsent || !(property in destination)) - destination[property] = value.methodize(); - } - } - - function findDOMClass(tagName) { - var klass; - var trans = { - "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", - "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", - "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", - "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", - "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": - "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": - "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": - "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": - "FrameSet", "IFRAME": "IFrame" - }; - if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName.capitalize() + 'Element'; - if (window[klass]) return window[klass]; - - window[klass] = { }; - window[klass].prototype = document.createElement(tagName).__proto__; - return window[klass]; - } - - if (F.ElementExtensions) { - copy(Element.Methods, HTMLElement.prototype); - copy(Element.Methods.Simulated, HTMLElement.prototype, true); - } - - if (F.SpecificElementExtensions) { - for (var tag in Element.Methods.ByTag) { - var klass = findDOMClass(tag); - if (Object.isUndefined(klass)) continue; - copy(T[tag], klass.prototype); - } - } - - Object.extend(Element, Element.Methods); - delete Element.ByTag; - - if (Element.extend.refresh) Element.extend.refresh(); - Element.cache = { }; -}; - -document.viewport = { - getDimensions: function() { - var dimensions = { }; - var B = Prototype.Browser; - $w('width height').each(function(d) { - var D = d.capitalize(); - dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] : - (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D]; - }); - return dimensions; - }, - - getWidth: function() { - return this.getDimensions().width; - }, - - getHeight: function() { - return this.getDimensions().height; - }, - - getScrollOffsets: function() { - return Element._returnOffset( - window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, - window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); - } -}; -/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, - * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style - * license. Please see http://www.yui-ext.com/ for more information. */ - -var Selector = Class.create({ - initialize: function(expression) { - this.expression = expression.strip(); - this.compileMatcher(); - }, - - shouldUseXPath: function() { - if (!Prototype.BrowserFeatures.XPath) return false; - - var e = this.expression; - - // Safari 3 chokes on :*-of-type and :empty - if (Prototype.Browser.WebKit && - (e.include("-of-type") || e.include(":empty"))) - return false; - - // XPath can't do namespaced attributes, nor can it read - // the "checked" property from DOM nodes - if ((/(\[[\w-]*?:|:checked)/).test(this.expression)) - return false; - - return true; - }, - - compileMatcher: function() { - if (this.shouldUseXPath()) - return this.compileXPathMatcher(); - - var e = this.expression, ps = Selector.patterns, h = Selector.handlers, - c = Selector.criteria, le, p, m; - - if (Selector._cache[e]) { - this.matcher = Selector._cache[e]; - return; - } - - this.matcher = ["this.matcher = function(root) {", - "var r = root, h = Selector.handlers, c = false, n;"]; - - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : - new Template(c[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.matcher.push("return h.unique(n);\n}"); - eval(this.matcher.join('\n')); - Selector._cache[this.expression] = this.matcher; - }, - - compileXPathMatcher: function() { - var e = this.expression, ps = Selector.patterns, - x = Selector.xpath, le, m; - - if (Selector._cache[e]) { - this.xpath = Selector._cache[e]; return; - } - - this.matcher = ['.//*']; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - if (m = e.match(ps[i])) { - this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : - new Template(x[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.xpath = this.matcher.join(''); - Selector._cache[this.expression] = this.xpath; - }, - - findElements: function(root) { - root = root || document; - if (this.xpath) return document._getElementsByXPath(this.xpath, root); - return this.matcher(root); - }, - - match: function(element) { - this.tokens = []; - - var e = this.expression, ps = Selector.patterns, as = Selector.assertions; - var le, p, m; - - while (e && le !== e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - // use the Selector.assertions methods unless the selector - // is too complex. - if (as[i]) { - this.tokens.push([i, Object.clone(m)]); - e = e.replace(m[0], ''); - } else { - // reluctantly do a document-wide search - // and look for a match in the array - return this.findElements(document).include(element); - } - } - } - } - - var match = true, name, matches; - for (var i = 0, token; token = this.tokens[i]; i++) { - name = token[0], matches = token[1]; - if (!Selector.assertions[name](element, matches)) { - match = false; break; - } - } - - return match; - }, - - toString: function() { - return this.expression; - }, - - inspect: function() { - return "#"; - } -}); - -Object.extend(Selector, { - _cache: { }, - - xpath: { - descendant: "//*", - child: "/*", - adjacent: "/following-sibling::*[1]", - laterSibling: '/following-sibling::*', - tagName: function(m) { - if (m[1] == '*') return ''; - return "[local-name()='" + m[1].toLowerCase() + - "' or local-name()='" + m[1].toUpperCase() + "']"; - }, - className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", - id: "[@id='#{1}']", - attrPresence: function(m) { - m[1] = m[1].toLowerCase(); - return new Template("[@#{1}]").evaluate(m); - }, - attr: function(m) { - m[1] = m[1].toLowerCase(); - m[3] = m[5] || m[6]; - return new Template(Selector.xpath.operators[m[2]]).evaluate(m); - }, - pseudo: function(m) { - var h = Selector.xpath.pseudos[m[1]]; - if (!h) return ''; - if (Object.isFunction(h)) return h(m); - return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); - }, - operators: { - '=': "[@#{1}='#{3}']", - '!=': "[@#{1}!='#{3}']", - '^=': "[starts-with(@#{1}, '#{3}')]", - '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", - '*=': "[contains(@#{1}, '#{3}')]", - '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", - '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" - }, - pseudos: { - 'first-child': '[not(preceding-sibling::*)]', - 'last-child': '[not(following-sibling::*)]', - 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', - 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", - 'checked': "[@checked]", - 'disabled': "[@disabled]", - 'enabled': "[not(@disabled)]", - 'not': function(m) { - var e = m[6], p = Selector.patterns, - x = Selector.xpath, le, v; - - var exclusion = []; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in p) { - if (m = e.match(p[i])) { - v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); - exclusion.push("(" + v.substring(1, v.length - 1) + ")"); - e = e.replace(m[0], ''); - break; - } - } - } - return "[not(" + exclusion.join(" and ") + ")]"; - }, - 'nth-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); - }, - 'nth-last-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); - }, - 'nth-of-type': function(m) { - return Selector.xpath.pseudos.nth("position() ", m); - }, - 'nth-last-of-type': function(m) { - return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); - }, - 'first-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); - }, - 'last-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); - }, - 'only-of-type': function(m) { - var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); - }, - nth: function(fragment, m) { - var mm, formula = m[6], predicate; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - if (mm = formula.match(/^(\d+)$/)) // digit only - return '[' + fragment + "= " + mm[1] + ']'; - if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (mm[1] == "-") mm[1] = -1; - var a = mm[1] ? Number(mm[1]) : 1; - var b = mm[2] ? Number(mm[2]) : 0; - predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + - "((#{fragment} - #{b}) div #{a} >= 0)]"; - return new Template(predicate).evaluate({ - fragment: fragment, a: a, b: b }); - } - } - } - }, - - criteria: { - tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', - className: 'n = h.className(n, r, "#{1}", c); c = false;', - id: 'n = h.id(n, r, "#{1}", c); c = false;', - attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', - attr: function(m) { - m[3] = (m[5] || m[6]); - return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); - }, - pseudo: function(m) { - if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); - return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); - }, - descendant: 'c = "descendant";', - child: 'c = "child";', - adjacent: 'c = "adjacent";', - laterSibling: 'c = "laterSibling";' - }, - - patterns: { - // combinators must be listed first - // (and descendant needs to be last combinator) - laterSibling: /^\s*~\s*/, - child: /^\s*>\s*/, - adjacent: /^\s*\+\s*/, - descendant: /^\s/, - - // selectors follow - tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, - id: /^#([\w\-\*]+)(\b|$)/, - className: /^\.([\w\-\*]+)(\b|$)/, - pseudo: -/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, - attrPresence: /^\[([\w]+)\]/, - attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ - }, - - // for Selector.match and Element#match - assertions: { - tagName: function(element, matches) { - return matches[1].toUpperCase() == element.tagName.toUpperCase(); - }, - - className: function(element, matches) { - return Element.hasClassName(element, matches[1]); - }, - - id: function(element, matches) { - return element.id === matches[1]; - }, - - attrPresence: function(element, matches) { - return Element.hasAttribute(element, matches[1]); - }, - - attr: function(element, matches) { - var nodeValue = Element.readAttribute(element, matches[1]); - return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); - } - }, - - handlers: { - // UTILITY FUNCTIONS - // joins two collections - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - a.push(node); - return a; - }, - - // marks an array of nodes for counting - mark: function(nodes) { - var _true = Prototype.emptyFunction; - for (var i = 0, node; node = nodes[i]; i++) - node._countedByPrototype = _true; - return nodes; - }, - - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._countedByPrototype = undefined; - return nodes; - }, - - // mark each child node with its position (for nth calls) - // "ofType" flag indicates whether we're indexing for nth-of-type - // rather than nth-child - index: function(parentNode, reverse, ofType) { - parentNode._countedByPrototype = Prototype.emptyFunction; - if (reverse) { - for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { - var node = nodes[i]; - if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; - } - } else { - for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) - if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; - } - }, - - // filters out duplicates and extends all nodes - unique: function(nodes) { - if (nodes.length == 0) return nodes; - var results = [], n; - for (var i = 0, l = nodes.length; i < l; i++) - if (!(n = nodes[i])._countedByPrototype) { - n._countedByPrototype = Prototype.emptyFunction; - results.push(Element.extend(n)); - } - return Selector.handlers.unmark(results); - }, - - // COMBINATOR FUNCTIONS - descendant: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName('*')); - return results; - }, - - child: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) { - for (var j = 0, child; child = node.childNodes[j]; j++) - if (child.nodeType == 1 && child.tagName != '!') results.push(child); - } - return results; - }, - - adjacent: function(nodes) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - var next = this.nextElementSibling(node); - if (next) results.push(next); - } - return results; - }, - - laterSibling: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, Element.nextSiblings(node)); - return results; - }, - - nextElementSibling: function(node) { - while (node = node.nextSibling) - if (node.nodeType == 1) return node; - return null; - }, - - previousElementSibling: function(node) { - while (node = node.previousSibling) - if (node.nodeType == 1) return node; - return null; - }, - - // TOKEN FUNCTIONS - tagName: function(nodes, root, tagName, combinator) { - var uTagName = tagName.toUpperCase(); - var results = [], h = Selector.handlers; - if (nodes) { - if (combinator) { - // fastlane for ordinary descendant combinators - if (combinator == "descendant") { - for (var i = 0, node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName(tagName)); - return results; - } else nodes = this[combinator](nodes); - if (tagName == "*") return nodes; - } - for (var i = 0, node; node = nodes[i]; i++) - if (node.tagName.toUpperCase() === uTagName) results.push(node); - return results; - } else return root.getElementsByTagName(tagName); - }, - - id: function(nodes, root, id, combinator) { - var targetNode = $(id), h = Selector.handlers; - if (!targetNode) return []; - if (!nodes && root == document) return [targetNode]; - if (nodes) { - if (combinator) { - if (combinator == 'child') { - for (var i = 0, node; node = nodes[i]; i++) - if (targetNode.parentNode == node) return [targetNode]; - } else if (combinator == 'descendant') { - for (var i = 0, node; node = nodes[i]; i++) - if (Element.descendantOf(targetNode, node)) return [targetNode]; - } else if (combinator == 'adjacent') { - for (var i = 0, node; node = nodes[i]; i++) - if (Selector.handlers.previousElementSibling(targetNode) == node) - return [targetNode]; - } else nodes = h[combinator](nodes); - } - for (var i = 0, node; node = nodes[i]; i++) - if (node == targetNode) return [targetNode]; - return []; - } - return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; - }, - - className: function(nodes, root, className, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - return Selector.handlers.byClassName(nodes, root, className); - }, - - byClassName: function(nodes, root, className) { - if (!nodes) nodes = Selector.handlers.descendant([root]); - var needle = ' ' + className + ' '; - for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { - nodeClassName = node.className; - if (nodeClassName.length == 0) continue; - if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) - results.push(node); - } - return results; - }, - - attrPresence: function(nodes, root, attr, combinator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - if (nodes && combinator) nodes = this[combinator](nodes); - var results = []; - for (var i = 0, node; node = nodes[i]; i++) - if (Element.hasAttribute(node, attr)) results.push(node); - return results; - }, - - attr: function(nodes, root, attr, value, operator, combinator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - if (nodes && combinator) nodes = this[combinator](nodes); - var handler = Selector.operators[operator], results = []; - for (var i = 0, node; node = nodes[i]; i++) { - var nodeValue = Element.readAttribute(node, attr); - if (nodeValue === null) continue; - if (handler(nodeValue, value)) results.push(node); - } - return results; - }, - - pseudo: function(nodes, name, value, root, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - if (!nodes) nodes = root.getElementsByTagName("*"); - return Selector.pseudos[name](nodes, value, root); - } - }, - - pseudos: { - 'first-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.previousElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'last-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.nextElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'only-child': function(nodes, value, root) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) - results.push(node); - return results; - }, - 'nth-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root); - }, - 'nth-last-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true); - }, - 'nth-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, false, true); - }, - 'nth-last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true, true); - }, - 'first-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, false, true); - }, - 'last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, true, true); - }, - 'only-of-type': function(nodes, formula, root) { - var p = Selector.pseudos; - return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); - }, - - // handles the an+b logic - getIndices: function(a, b, total) { - if (a == 0) return b > 0 ? [b] : []; - return $R(1, total).inject([], function(memo, i) { - if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); - return memo; - }); - }, - - // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type - nth: function(nodes, formula, root, reverse, ofType) { - if (nodes.length == 0) return []; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - var h = Selector.handlers, results = [], indexed = [], m; - h.mark(nodes); - for (var i = 0, node; node = nodes[i]; i++) { - if (!node.parentNode._countedByPrototype) { - h.index(node.parentNode, reverse, ofType); - indexed.push(node.parentNode); - } - } - if (formula.match(/^\d+$/)) { // just a number - formula = Number(formula); - for (var i = 0, node; node = nodes[i]; i++) - if (node.nodeIndex == formula) results.push(node); - } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (m[1] == "-") m[1] = -1; - var a = m[1] ? Number(m[1]) : 1; - var b = m[2] ? Number(m[2]) : 0; - var indices = Selector.pseudos.getIndices(a, b, nodes.length); - for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { - for (var j = 0; j < l; j++) - if (node.nodeIndex == indices[j]) results.push(node); - } - } - h.unmark(nodes); - h.unmark(indexed); - return results; - }, - - 'empty': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - // IE treats comments as element nodes - if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; - results.push(node); - } - return results; - }, - - 'not': function(nodes, selector, root) { - var h = Selector.handlers, selectorType, m; - var exclusions = new Selector(selector).findElements(root); - h.mark(exclusions); - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node._countedByPrototype) results.push(node); - h.unmark(exclusions); - return results; - }, - - 'enabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node.disabled) results.push(node); - return results; - }, - - 'disabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.disabled) results.push(node); - return results; - }, - - 'checked': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.checked) results.push(node); - return results; - } - }, - - operators: { - '=': function(nv, v) { return nv == v; }, - '!=': function(nv, v) { return nv != v; }, - '^=': function(nv, v) { return nv.startsWith(v); }, - '$=': function(nv, v) { return nv.endsWith(v); }, - '*=': function(nv, v) { return nv.include(v); }, - '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, - '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } - }, - - split: function(expression) { - var expressions = []; - expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { - expressions.push(m[1].strip()); - }); - return expressions; - }, - - matchElements: function(elements, expression) { - var matches = $$(expression), h = Selector.handlers; - h.mark(matches); - for (var i = 0, results = [], element; element = elements[i]; i++) - if (element._countedByPrototype) results.push(element); - h.unmark(matches); - return results; - }, - - findElement: function(elements, expression, index) { - if (Object.isNumber(expression)) { - index = expression; expression = false; - } - return Selector.matchElements(elements, expression || '*')[index || 0]; - }, - - findChildElements: function(element, expressions) { - expressions = Selector.split(expressions.join(',')); - var results = [], h = Selector.handlers; - for (var i = 0, l = expressions.length, selector; i < l; i++) { - selector = new Selector(expressions[i].strip()); - h.concat(results, selector.findElements(element)); - } - return (l > 1) ? h.unique(results) : results; - } -}); - -if (Prototype.Browser.IE) { - Object.extend(Selector.handlers, { - // IE returns comment nodes on getElementsByTagName("*"). - // Filter them out. - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - if (node.tagName !== "!") a.push(node); - return a; - }, - - // IE improperly serializes _countedByPrototype in (inner|outer)HTML. - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node.removeAttribute('_countedByPrototype'); - return nodes; - } - }); -} - -function $$() { - return Selector.findChildElements(document, $A(arguments)); -} -var Form = { - reset: function(form) { - $(form).reset(); - return form; - }, - - serializeElements: function(elements, options) { - if (typeof options != 'object') options = { hash: !!options }; - else if (Object.isUndefined(options.hash)) options.hash = true; - var key, value, submitted = false, submit = options.submit; - - var data = elements.inject({ }, function(result, element) { - if (!element.disabled && element.name) { - key = element.name; value = $(element).getValue(); - if (value != null && (element.type != 'submit' || (!submitted && - submit !== false && (!submit || key == submit) && (submitted = true)))) { - if (key in result) { - // a key is already present; construct an array of values - if (!Object.isArray(result[key])) result[key] = [result[key]]; - result[key].push(value); - } - else result[key] = value; - } - } - return result; - }); - - return options.hash ? data : Object.toQueryString(data); - } -}; - -Form.Methods = { - serialize: function(form, options) { - return Form.serializeElements(Form.getElements(form), options); - }, - - getElements: function(form) { - return $A($(form).getElementsByTagName('*')).inject([], - function(elements, child) { - if (Form.Element.Serializers[child.tagName.toLowerCase()]) - elements.push(Element.extend(child)); - return elements; - } - ); - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) return $A(inputs).map(Element.extend); - - for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || (name && input.name != name)) - continue; - matchingInputs.push(Element.extend(input)); - } - - return matchingInputs; - }, - - disable: function(form) { - form = $(form); - Form.getElements(form).invoke('disable'); - return form; - }, - - enable: function(form) { - form = $(form); - Form.getElements(form).invoke('enable'); - return form; - }, - - findFirstElement: function(form) { - var elements = $(form).getElements().findAll(function(element) { - return 'hidden' != element.type && !element.disabled; - }); - var firstByIndex = elements.findAll(function(element) { - return element.hasAttribute('tabIndex') && element.tabIndex >= 0; - }).sortBy(function(element) { return element.tabIndex }).first(); - - return firstByIndex ? firstByIndex : elements.find(function(element) { - return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - form = $(form); - form.findFirstElement().activate(); - return form; - }, - - request: function(form, options) { - form = $(form), options = Object.clone(options || { }); - - var params = options.parameters, action = form.readAttribute('action') || ''; - if (action.blank()) action = window.location.href; - options.parameters = form.serialize(true); - - if (params) { - if (Object.isString(params)) params = params.toQueryParams(); - Object.extend(options.parameters, params); - } - - if (form.hasAttribute('method') && !options.method) - options.method = form.method; - - return new Ajax.Request(action, options); - } -}; - -/*--------------------------------------------------------------------------*/ - -Form.Element = { - focus: function(element) { - $(element).focus(); - return element; - }, - - select: function(element) { - $(element).select(); - return element; - } -}; - -Form.Element.Methods = { - serialize: function(element) { - element = $(element); - if (!element.disabled && element.name) { - var value = element.getValue(); - if (value != undefined) { - var pair = { }; - pair[element.name] = value; - return Object.toQueryString(pair); - } - } - return ''; - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - return Form.Element.Serializers[method](element); - }, - - setValue: function(element, value) { - element = $(element); - var method = element.tagName.toLowerCase(); - Form.Element.Serializers[method](element, value); - return element; - }, - - clear: function(element) { - $(element).value = ''; - return element; - }, - - present: function(element) { - return $(element).value != ''; - }, - - activate: function(element) { - element = $(element); - try { - element.focus(); - if (element.select && (element.tagName.toLowerCase() != 'input' || - !['button', 'reset', 'submit'].include(element.type))) - element.select(); - } catch (e) { } - return element; - }, - - disable: function(element) { - element = $(element); - element.blur(); - element.disabled = true; - return element; - }, - - enable: function(element) { - element = $(element); - element.disabled = false; - return element; - } -}; - -/*--------------------------------------------------------------------------*/ - -var Field = Form.Element; -var $F = Form.Element.Methods.getValue; - -/*--------------------------------------------------------------------------*/ - -Form.Element.Serializers = { - input: function(element, value) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element, value); - default: - return Form.Element.Serializers.textarea(element, value); - } - }, - - inputSelector: function(element, value) { - if (Object.isUndefined(value)) return element.checked ? element.value : null; - else element.checked = !!value; - }, - - textarea: function(element, value) { - if (Object.isUndefined(value)) return element.value; - else element.value = value; - }, - - select: function(element, index) { - if (Object.isUndefined(index)) - return this[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - else { - var opt, value, single = !Object.isArray(index); - for (var i = 0, length = element.length; i < length; i++) { - opt = element.options[i]; - value = this.optionValue(opt); - if (single) { - if (value == index) { - opt.selected = true; - return; - } - } - else opt.selected = index.include(value); - } - } - }, - - selectOne: function(element) { - var index = element.selectedIndex; - return index >= 0 ? this.optionValue(element.options[index]) : null; - }, - - selectMany: function(element) { - var values, length = element.length; - if (!length) return null; - - for (var i = 0, values = []; i < length; i++) { - var opt = element.options[i]; - if (opt.selected) values.push(this.optionValue(opt)); - } - return values; - }, - - optionValue: function(opt) { - // extend element because hasAttribute may not be native - return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; - } -}; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = Class.create(PeriodicalExecuter, { - initialize: function($super, element, frequency, callback) { - $super(callback, frequency); - this.element = $(element); - this.lastValue = this.getValue(); - }, - - execute: function() { - var value = this.getValue(); - if (Object.isString(this.lastValue) && Object.isString(value) ? - this.lastValue != value : String(this.lastValue) != String(value)) { - this.callback(this.element, value); - this.lastValue = value; - } - } -}); - -Form.Element.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = Class.create({ - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - Form.getElements(this.element).each(this.registerCallback, this); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - default: - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -}); - -Form.Element.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) var Event = { }; - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - KEY_HOME: 36, - KEY_END: 35, - KEY_PAGEUP: 33, - KEY_PAGEDOWN: 34, - KEY_INSERT: 45, - - cache: { }, - - relatedTarget: function(event) { - var element; - switch(event.type) { - case 'mouseover': element = event.fromElement; break; - case 'mouseout': element = event.toElement; break; - default: return null; - } - return Element.extend(element); - } -}); - -Event.Methods = (function() { - var isButton; - - if (Prototype.Browser.IE) { - var buttonMap = { 0: 1, 1: 4, 2: 2 }; - isButton = function(event, code) { - return event.button == buttonMap[code]; - }; - - } else if (Prototype.Browser.WebKit) { - isButton = function(event, code) { - switch (code) { - case 0: return event.which == 1 && !event.metaKey; - case 1: return event.which == 1 && event.metaKey; - default: return false; - } - }; - - } else { - isButton = function(event, code) { - return event.which ? (event.which === code + 1) : (event.button === code); - }; - } - - return { - isLeftClick: function(event) { return isButton(event, 0) }, - isMiddleClick: function(event) { return isButton(event, 1) }, - isRightClick: function(event) { return isButton(event, 2) }, - - element: function(event) { - var node = Event.extend(event).target; - return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node); - }, - - findElement: function(event, expression) { - var element = Event.element(event); - if (!expression) return element; - var elements = [element].concat(element.ancestors()); - return Selector.findElement(elements, expression, 0); - }, - - pointer: function(event) { - return { - x: event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)), - y: event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)) - }; - }, - - pointerX: function(event) { return Event.pointer(event).x }, - pointerY: function(event) { return Event.pointer(event).y }, - - stop: function(event) { - Event.extend(event); - event.preventDefault(); - event.stopPropagation(); - event.stopped = true; - } - }; -})(); - -Event.extend = (function() { - var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { - m[name] = Event.Methods[name].methodize(); - return m; - }); - - if (Prototype.Browser.IE) { - Object.extend(methods, { - stopPropagation: function() { this.cancelBubble = true }, - preventDefault: function() { this.returnValue = false }, - inspect: function() { return "[object Event]" } - }); - - return function(event) { - if (!event) return false; - if (event._extendedByPrototype) return event; - - event._extendedByPrototype = Prototype.emptyFunction; - var pointer = Event.pointer(event); - Object.extend(event, { - target: event.srcElement, - relatedTarget: Event.relatedTarget(event), - pageX: pointer.x, - pageY: pointer.y - }); - return Object.extend(event, methods); - }; - - } else { - Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__; - Object.extend(Event.prototype, methods); - return Prototype.K; - } -})(); - -Object.extend(Event, (function() { - var cache = Event.cache; - - function getEventID(element) { - if (element._prototypeEventID) return element._prototypeEventID[0]; - arguments.callee.id = arguments.callee.id || 1; - return element._prototypeEventID = [++arguments.callee.id]; - } - - function getDOMEventName(eventName) { - if (eventName && eventName.include(':')) return "dataavailable"; - return eventName; - } - - function getCacheForID(id) { - return cache[id] = cache[id] || { }; - } - - function getWrappersForEventName(id, eventName) { - var c = getCacheForID(id); - return c[eventName] = c[eventName] || []; - } - - function createWrapper(element, eventName, handler) { - var id = getEventID(element); - var c = getWrappersForEventName(id, eventName); - if (c.pluck("handler").include(handler)) return false; - - var wrapper = function(event) { - if (!Event || !Event.extend || - (event.eventName && event.eventName != eventName)) - return false; - - Event.extend(event); - handler.call(element, event); - }; - - wrapper.handler = handler; - c.push(wrapper); - return wrapper; - } - - function findWrapper(id, eventName, handler) { - var c = getWrappersForEventName(id, eventName); - return c.find(function(wrapper) { return wrapper.handler == handler }); - } - - function destroyWrapper(id, eventName, handler) { - var c = getCacheForID(id); - if (!c[eventName]) return false; - c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); - } - - function destroyCache() { - for (var id in cache) - for (var eventName in cache[id]) - cache[id][eventName] = null; - } - - if (window.attachEvent) { - window.attachEvent("onunload", destroyCache); - } - - return { - observe: function(element, eventName, handler) { - element = $(element); - var name = getDOMEventName(eventName); - - var wrapper = createWrapper(element, eventName, handler); - if (!wrapper) return element; - - if (element.addEventListener) { - element.addEventListener(name, wrapper, false); - } else { - element.attachEvent("on" + name, wrapper); - } - - return element; - }, - - stopObserving: function(element, eventName, handler) { - element = $(element); - var id = getEventID(element), name = getDOMEventName(eventName); - - if (!handler && eventName) { - getWrappersForEventName(id, eventName).each(function(wrapper) { - element.stopObserving(eventName, wrapper.handler); - }); - return element; - - } else if (!eventName) { - Object.keys(getCacheForID(id)).each(function(eventName) { - element.stopObserving(eventName); - }); - return element; - } - - var wrapper = findWrapper(id, eventName, handler); - if (!wrapper) return element; - - if (element.removeEventListener) { - element.removeEventListener(name, wrapper, false); - } else { - element.detachEvent("on" + name, wrapper); - } - - destroyWrapper(id, eventName, handler); - - return element; - }, - - fire: function(element, eventName, memo) { - element = $(element); - if (element == document && document.createEvent && !element.dispatchEvent) - element = document.documentElement; - - var event; - if (document.createEvent) { - event = document.createEvent("HTMLEvents"); - event.initEvent("dataavailable", true, true); - } else { - event = document.createEventObject(); - event.eventType = "ondataavailable"; - } - - event.eventName = eventName; - event.memo = memo || { }; - - if (document.createEvent) { - element.dispatchEvent(event); - } else { - element.fireEvent(event.eventType, event); - } - - return Event.extend(event); - } - }; -})()); - -Object.extend(Event, Event.Methods); - -Element.addMethods({ - fire: Event.fire, - observe: Event.observe, - stopObserving: Event.stopObserving -}); - -Object.extend(document, { - fire: Element.Methods.fire.methodize(), - observe: Element.Methods.observe.methodize(), - stopObserving: Element.Methods.stopObserving.methodize(), - loaded: false -}); - -(function() { - /* Support for the DOMContentLoaded event is based on work by Dan Webb, - Matthias Miller, Dean Edwards and John Resig. */ - - var timer; - - function fireContentLoadedEvent() { - if (document.loaded) return; - if (timer) window.clearInterval(timer); - document.fire("dom:loaded"); - document.loaded = true; - } - - if (document.addEventListener) { - if (Prototype.Browser.WebKit) { - timer = window.setInterval(function() { - if (/loaded|complete/.test(document.readyState)) - fireContentLoadedEvent(); - }, 0); - - Event.observe(window, "load", fireContentLoadedEvent); - - } else { - document.addEventListener("DOMContentLoaded", - fireContentLoadedEvent, false); - } - - } else { - document.write("' ); - - iframe_doc.close(); - - // Update the Iframe's hash, for great justice. - iframe.location.hash = hash; - } - }; - - })(); - // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^ - // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - return self; - })(); - -})(jQuery,this); -/* -* jQuery Mobile Framework : "page" plugin -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { - -$.widget( "mobile.page", $.mobile.widget, { - options: { - backBtnText: "Back", - addBackBtn: true, - backBtnTheme: null, - degradeInputs: { - color: false, - date: false, - datetime: false, - "datetime-local": false, - email: false, - month: false, - number: false, - range: "number", - search: true, - tel: false, - time: false, - url: false, - week: false - }, - keepNative: null - }, - - _create: function() { - var $elem = this.element, - o = this.options; - - this.keepNative = ":jqmData(role='none'), :jqmData(role='nojs')" + (o.keepNative ? ", " + o.keepNative : ""); - - if ( this._trigger( "beforeCreate" ) === false ) { - return; - } - - //some of the form elements currently rely on the presence of ui-page and ui-content - // classes so we'll handle page and content roles outside of the main role processing - // loop below. - $elem.find( ":jqmData(role='page'), :jqmData(role='content')" ).andSelf().each(function() { - $(this).addClass( "ui-" + $(this).jqmData( "role" ) ); - }); - - $elem.find( ":jqmData(role='nojs')" ).addClass( "ui-nojs" ); - - // pre-find data els - var $dataEls = $elem.find( ":jqmData(role)" ).andSelf().each(function() { - var $this = $( this ), - role = $this.jqmData( "role" ), - theme = $this.jqmData( "theme" ); - - //apply theming and markup modifications to page,header,content,footer - if ( role === "header" || role === "footer" ) { - $this.addClass( "ui-bar-" + (theme || $this.parent( ":jqmData(role='page')" ).jqmData( "theme" ) || "a") ); - - // add ARIA role - $this.attr( "role", role === "header" ? "banner" : "contentinfo" ); - - //right,left buttons - var $headeranchors = $this.children( "a" ), - leftbtn = $headeranchors.hasClass( "ui-btn-left" ), - rightbtn = $headeranchors.hasClass( "ui-btn-right" ); - - if ( !leftbtn ) { - leftbtn = $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length; - } - - if ( !rightbtn ) { - rightbtn = $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length; - } - - // auto-add back btn on pages beyond first view - if ( o.addBackBtn && role === "header" && - $( ".ui-page" ).length > 1 && - $elem.jqmData( "url" ) !== $.mobile.path.stripHash( location.hash ) && - !leftbtn && $this.jqmData( "backbtn" ) !== false ) { - - var backBtn = $( ""+ o.backBtnText +"" ).prependTo( $this ); - - //if theme is provided, override default inheritance - if( o.backBtnTheme ){ - backBtn.attr( "data-"+ $.mobile.ns +"theme", o.backBtnTheme ); - } - } - - //page title - $this.children( "h1, h2, h3, h4, h5, h6" ) - .addClass( "ui-title" ) - //regardless of h element number in src, it becomes h1 for the enhanced page - .attr({ "tabindex": "0", "role": "heading", "aria-level": "1" }); - - } else if ( role === "content" ) { - if ( theme ) { - $this.addClass( "ui-body-" + theme ); - } - - // add ARIA role - $this.attr( "role", "main" ); - - } else if ( role === "page" ) { - $this.addClass( "ui-body-" + (theme || "c") ); - } - - switch(role) { - case "header": - case "footer": - case "page": - case "content": - $this.addClass( "ui-" + role ); - break; - case "collapsible": - case "fieldcontain": - case "navbar": - case "listview": - case "dialog": - $this[ role ](); - break; - } - }); - - //enhance form controls - this._enhanceControls(); - - //links in bars, or those with data-role become buttons - $elem.find( ":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a" ) - .not( ".ui-btn" ) - .not(this.keepNative) - .buttonMarkup(); - - $elem - .find(":jqmData(role='controlgroup')") - .controlgroup(); - - //links within content areas - $elem.find( "a:not(.ui-btn):not(.ui-link-inherit)" ) - .not(this.keepNative) - .addClass( "ui-link" ); - - //fix toolbars - $elem.fixHeaderFooter(); - }, - - _typeAttributeRegex: /\s+type=["']?\w+['"]?/, - - _enhanceControls: function() { - var o = this.options, self = this; - - // degrade inputs to avoid poorly implemented native functionality - this.element.find( "input" ).not(this.keepNative).each(function() { - var type = this.getAttribute( "type" ), - optType = o.degradeInputs[ type ] || "text"; - - if ( o.degradeInputs[ type ] ) { - $( this ).replaceWith( - $( "
" ).html( $(this).clone() ).html() - .replace( self._typeAttributeRegex, " type=\""+ optType +"\" data-" + $.mobile.ns + "type=\""+type+"\" " ) ); - } - }); - - // We re-find form elements since the degredation code above - // may have injected new elements. We cache the non-native control - // query to reduce the number of times we search through the entire page. - - var allControls = this.element.find("input, textarea, select, button"), - nonNativeControls = allControls.not(this.keepNative); - - // XXX: Temporary workaround for issue 785. Turn off autocorrect and - // autocomplete since the popup they use can't be dismissed by - // the user. Note that we test for the presence of the feature - // by looking for the autocorrect property on the input element. - - var textInputs = allControls.filter( "input[type=text]" ); - if (textInputs.length && typeof textInputs[0].autocorrect !== "undefined") { - textInputs.each(function(){ - // Set the attribute instead of the property just in case there - // is code that attempts to make modifications via HTML. - this.setAttribute("autocorrect", "off"); - this.setAttribute("autocomplete", "off"); - }); - } - - // enchance form controls - nonNativeControls - .filter( "[type='radio'], [type='checkbox']" ) - .checkboxradio(); - - nonNativeControls - .filter( "button, [type='button'], [type='submit'], [type='reset'], [type='image']" ) - .button(); - - nonNativeControls - .filter( "input, textarea" ) - .not( "[type='radio'], [type='checkbox'], [type='button'], [type='submit'], [type='reset'], [type='image'], [type='hidden']" ) - .textinput(); - - nonNativeControls - .filter( "input, select" ) - .filter( ":jqmData(role='slider'), :jqmData(type='range')" ) - .slider(); - - nonNativeControls - .filter( "select:not(:jqmData(role='slider'))" ) - .selectmenu(); - } -}); - -})( jQuery ); -/*! - * jQuery Mobile v@VERSION - * http://jquerymobile.com/ - * - * Copyright 2010, jQuery Project - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - */ - -(function( $, window, undefined ) { - - //jQuery.mobile configurable options - $.extend( $.mobile, { - - //namespace used framework-wide for data-attrs. Default is no namespace - ns: "", - - //define the url parameter used for referencing widget-generated sub-pages. - //Translates to to example.html&ui-page=subpageIdentifier - //hash segment before &ui-page= is used to make Ajax request - subPageUrlKey: "ui-page", - - //anchor links with a data-rel, or pages with a data-role, that match these selectors will be untrackable in history - //(no change in URL, not bookmarkable) - nonHistorySelectors: "dialog", - - //class assigned to page currently in view, and during transitions - activePageClass: "ui-page-active", - - //class used for "active" button state, from CSS framework - activeBtnClass: "ui-btn-active", - - //automatically handle clicks and form submissions through Ajax, when same-domain - ajaxEnabled: true, - - //automatically load and show pages based on location.hash - hashListeningEnabled: true, - - // TODO: deprecated - remove at 1.0 - //automatically handle link clicks through Ajax, when possible - ajaxLinksEnabled: true, - - // TODO: deprecated - remove at 1.0 - //automatically handle form submissions through Ajax, when possible - ajaxFormsEnabled: true, - - //set default transition - 'none' for no transitions - defaultTransition: "slide", - - //show loading message during Ajax requests - //if false, message will not appear, but loading classes will still be toggled on html el - loadingMessage: "loading", - - //error response message - appears when an Ajax page request fails - pageLoadErrorMessage: "Error Loading Page", - - //configure meta viewport tag's content attr: - //note: this feature is deprecated in A4 in favor of adding - //the meta viewport element directly in the markup - metaViewportContent: "width=device-width, minimum-scale=1, maximum-scale=1", - - //support conditions that must be met in order to proceed - //default enhanced qualifications are media query support OR IE 7+ - gradeA: function(){ - return $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7; - }, - - //TODO might be useful upstream in jquery itself ? - keyCode: { - ALT: 18, - BACKSPACE: 8, - CAPS_LOCK: 20, - COMMA: 188, - COMMAND: 91, - COMMAND_LEFT: 91, // COMMAND - COMMAND_RIGHT: 93, - CONTROL: 17, - DELETE: 46, - DOWN: 40, - END: 35, - ENTER: 13, - ESCAPE: 27, - HOME: 36, - INSERT: 45, - LEFT: 37, - MENU: 93, // COMMAND_RIGHT - NUMPAD_ADD: 107, - NUMPAD_DECIMAL: 110, - NUMPAD_DIVIDE: 111, - NUMPAD_ENTER: 108, - NUMPAD_MULTIPLY: 106, - NUMPAD_SUBTRACT: 109, - PAGE_DOWN: 34, - PAGE_UP: 33, - PERIOD: 190, - RIGHT: 39, - SHIFT: 16, - SPACE: 32, - TAB: 9, - UP: 38, - WINDOWS: 91 // COMMAND - }, - - //scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value - silentScroll: function( ypos ) { - ypos = ypos || 0; - // prevent scrollstart and scrollstop events - $.event.special.scrollstart.enabled = false; - - setTimeout(function() { - window.scrollTo( 0, ypos ); - $(document).trigger( "silentscroll", { x: 0, y: ypos }); - },20); - - setTimeout(function() { - $.event.special.scrollstart.enabled = true; - }, 150 ); - } - }); - - //mobile version of data and removeData and hasData methods - //ensures all data is set and retrieved using jQuery Mobile's data namespace - $.fn.jqmData = function( prop, value ){ - return this.data( prop ? $.mobile.ns + prop : prop, value ); - }; - - $.jqmData = function( elem, prop, value ){ - return $.data( elem, prop && $.mobile.ns + prop, value ); - }; - - $.fn.jqmRemoveData = function( prop ){ - return this.removeData( $.mobile.ns + prop ); - }; - - $.jqmRemoveData = function( elem, prop ){ - return $.removeData( elem, prop && $.mobile.ns + prop ); - }; - - $.jqmHasData = function( elem, prop ){ - return $.hasData( elem, prop && $.mobile.ns + prop ); - }; - - - // Monkey-patching Sizzle to filter the :jqmData selector - var oldFind = $.find; - - $.find = function( selector, context, ret, extra ) { - selector = selector.replace(/:jqmData\(([^)]*)\)/g, "[data-" + ($.mobile.ns || "") + "$1]"); - - return oldFind.call( this, selector, context, ret, extra ); - }; - - $.extend( $.find, oldFind ); - - $.find.matches = function( expr, set ) { - return $.find( expr, null, null, set ); - }; - - $.find.matchesSelector = function( node, expr ) { - return $.find( expr, null, null, [node] ).length > 0; - }; -})( jQuery, this ); -/* -* jQuery Mobile Framework : core utilities for auto ajax navigation, base tag mgmt, -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { - - //define vars for interal use - var $window = $(window), - $html = $('html'), - $head = $('head'), - - //url path helpers for use in relative url management - path = { - - //get path from current hash, or from a file path - get: function( newPath ){ - if( newPath === undefined ){ - newPath = location.hash; - } - return path.stripHash( newPath ).replace(/[^\/]*\.[^\/*]+$/, ''); - }, - - //return the substring of a filepath before the sub-page key, for making a server request - getFilePath: function( path ){ - var splitkey = '&' + $.mobile.subPageUrlKey; - return path && path.split( splitkey )[0].split( dialogHashKey )[0]; - }, - - //set location hash to path - set: function( path ){ - location.hash = path; - }, - - //location pathname from intial directory request - origin: '', - - setOrigin: function(){ - path.origin = path.get( location.protocol + '//' + location.host + location.pathname ); - }, - - //prefix a relative url with the current path - // TODO rename to reflect conditional functionality - makeAbsolute: function( url ){ - // only create an absolute path when the hash can be used as one - return path.isPath(window.location.hash) ? path.get() + url : url; - }, - - // test if a given url (string) is a path - // NOTE might be exceptionally naive - isPath: function( url ){ - return /\//.test(url); - }, - - //return a url path with the window's location protocol/hostname/pathname removed - clean: function( url ){ - // Replace the protocol, host, and pathname only once at the beginning of the url to avoid - // problems when it's included as a part of a param - // Also, since all urls are absolute in IE, we need to remove the pathname as well. - var leadingUrlRootRegex = new RegExp("^" + location.protocol + "//" + location.host + location.pathname); - return url.replace(leadingUrlRootRegex, ""); - }, - - //just return the url without an initial # - stripHash: function( url ){ - return url.replace( /^#/, "" ); - }, - - //check whether a url is referencing the same domain, or an external domain or different protocol - //could be mailto, etc - isExternal: function( url ){ - return path.hasProtocol( path.clean( url ) ); - }, - - hasProtocol: function( url ){ - return (/^(:?\w+:)/).test( url ); - }, - - //check if the url is relative - isRelative: function( url ){ - return (/^[^\/|#]/).test( url ) && !path.hasProtocol( url ); - }, - - isEmbeddedPage: function( url ){ - return (/^#/).test( url ); - } - }, - - //will be defined when a link is clicked and given an active class - $activeClickedLink = null, - - //urlHistory is purely here to make guesses at whether the back or forward button was clicked - //and provide an appropriate transition - urlHistory = { - //array of pages that are visited during a single page load. each has a url and optional transition - stack: [], - - //maintain an index number for the active page in the stack - activeIndex: 0, - - //get active - getActive: function(){ - return urlHistory.stack[ urlHistory.activeIndex ]; - }, - - getPrev: function(){ - return urlHistory.stack[ urlHistory.activeIndex - 1 ]; - }, - - getNext: function(){ - return urlHistory.stack[ urlHistory.activeIndex + 1 ]; - }, - - // addNew is used whenever a new page is added - addNew: function( url, transition, title, storedTo ){ - //if there's forward history, wipe it - if( urlHistory.getNext() ){ - urlHistory.clearForward(); - } - - urlHistory.stack.push( {url : url, transition: transition, title: title, page: storedTo } ); - - urlHistory.activeIndex = urlHistory.stack.length - 1; - }, - - //wipe urls ahead of active index - clearForward: function(){ - urlHistory.stack = urlHistory.stack.slice( 0, urlHistory.activeIndex + 1 ); - }, - - directHashChange: function(opts){ - var back , forward, newActiveIndex; - - // check if url isp in history and if it's ahead or behind current page - $.each( urlHistory.stack, function( i, historyEntry ){ - - //if the url is in the stack, it's a forward or a back - if( opts.currentUrl === historyEntry.url ){ - //define back and forward by whether url is older or newer than current page - back = i < urlHistory.activeIndex; - forward = !back; - newActiveIndex = i; - } - }); - - // save new page index, null check to prevent falsey 0 result - this.activeIndex = newActiveIndex !== undefined ? newActiveIndex : this.activeIndex; - - if( back ){ - opts.isBack(); - } else if( forward ){ - opts.isForward(); - } - }, - - //disable hashchange event listener internally to ignore one change - //toggled internally when location.hash is updated to match the url of a successful page load - ignoreNextHashChange: true - }, - - //define first selector to receive focus when a page is shown - focusable = "[tabindex],a,button:visible,select:visible,input", - - //contains role for next page, if defined on clicked link via data-rel - nextPageRole = null, - - //queue to hold simultanious page transitions - pageTransitionQueue = [], - - // indicates whether or not page is in process of transitioning - isPageTransitioning = false, - - //nonsense hash change key for dialogs, so they create a history entry - dialogHashKey = "&ui-state=dialog", - - //existing base tag? - $base = $head.children("base"), - hostURL = location.protocol + '//' + location.host, - docLocation = path.get( hostURL + location.pathname ), - docBase = docLocation; - - if ($base.length){ - var href = $base.attr("href"); - if (href){ - if (href.search(/^[^:\/]+:\/\/[^\/]+\/?/) === -1){ - //the href is not absolute, we need to turn it into one - //so that we can turn paths stored in our location hash into - //relative paths. - if (href.charAt(0) === '/'){ - //site relative url - docBase = hostURL + href; - } - else { - //the href is a document relative url - docBase = docLocation + href; - //XXX: we need some code here to calculate the final path - // just in case the docBase contains up-level (../) references. - } - } - else { - //the href is an absolute url - docBase = href; - } - } - //make sure docBase ends with a slash - docBase = docBase + (docBase.charAt(docBase.length - 1) === '/' ? ' ' : '/'); - } - - //base element management, defined depending on dynamic base tag support - var base = $.support.dynamicBaseTag ? { - - //define base element, for use in routing asset urls that are referenced in Ajax-requested markup - element: ($base.length ? $base : $("", { href: docBase }).prependTo( $head )), - - //set the generated BASE element's href attribute to a new page's base path - set: function( href ){ - base.element.attr('href', docBase + path.get( href )); - }, - - //set the generated BASE element's href attribute to a new page's base path - reset: function(){ - base.element.attr('href', docBase ); - } - - } : undefined; - - - - //set location pathname from intial directory request - path.setOrigin(); - -/* - internal utility functions ---------------------------------------*/ - - - //direct focus to the page title, or otherwise first focusable element - function reFocus( page ){ - var pageTitle = page.find( ".ui-title:eq(0)" ); - if( pageTitle.length ){ - pageTitle.focus(); - } - else{ - page.find( focusable ).eq(0).focus(); - } - } - - //remove active classes after page transition or error - function removeActiveLinkClass( forceRemoval ){ - if( !!$activeClickedLink && (!$activeClickedLink.closest( '.ui-page-active' ).length || forceRemoval )){ - $activeClickedLink.removeClass( $.mobile.activeBtnClass ); - } - $activeClickedLink = null; - } - - //animation complete callback - $.fn.animationComplete = function( callback ){ - if($.support.cssTransitions){ - return $(this).one('webkitAnimationEnd', callback); - } - else{ - // defer execution for consistency between webkit/non webkit - setTimeout(callback, 0); - return $(this); - } - }; - - - -/* exposed $.mobile methods */ - - //update location.hash, with or without triggering hashchange event - //TODO - deprecate this one at 1.0 - $.mobile.updateHash = path.set; - - //expose path object on $.mobile - $.mobile.path = path; - - //expose base object on $.mobile - $.mobile.base = base; - - //url stack, useful when plugins need to be aware of previous pages viewed - //TODO: deprecate this one at 1.0 - $.mobile.urlstack = urlHistory.stack; - - //history stack - $.mobile.urlHistory = urlHistory; - - //enable cross-domain page support - $.mobile.allowCrossDomainPages = false; - - // changepage function - $.mobile.changePage = function( to, transition, reverse, changeHash, fromHashChange ){ - //from is always the currently viewed page - var toIsArray = $.type(to) === "array", - toIsObject = $.type(to) === "object", - from = toIsArray ? to[0] : $.mobile.activePage; - - to = toIsArray ? to[1] : to; - - var url = $.type(to) === "string" ? path.stripHash( to ) : "", - fileUrl = url, - data, - type = 'get', - isFormRequest = false, - duplicateCachedPage = null, - currPage = urlHistory.getActive(), - back = false, - forward = false - pageTitle = document.title; - - - // If we are trying to transition to the same page that we are currently on ignore the request. - // an illegal same page request is defined by the current page being the same as the url, as long as there's history - // and to is not an array or object (those are allowed to be "same") - if( currPage && urlHistory.stack.length > 1 && currPage.url === url && !toIsArray && !toIsObject ) { - return; - } - else if(isPageTransitioning) { - pageTransitionQueue.unshift(arguments); - return; - } - - isPageTransitioning = true; - - // if the changePage was sent from a hashChange event guess if it came from the history menu - // and match the transition accordingly - if( fromHashChange ){ - urlHistory.directHashChange({ - currentUrl: url, - isBack: function(){ - forward = !(back = true); - reverse = true; - transition = transition || currPage.transition; - }, - isForward: function(){ - forward = !(back = false); - transition = transition || urlHistory.getActive().transition; - } - }); - - //TODO forward = !back was breaking for some reason - } - - if( toIsObject && to.url ){ - url = to.url; - data = to.data; - type = to.type; - isFormRequest = true; - //make get requests bookmarkable - if( data && type === 'get' ){ - if($.type( data ) === "object" ){ - data = $.param(data); - } - - url += "?" + data; - data = undefined; - } - } - - //reset base to pathname for new request - if(base){ base.reset(); } - - //kill the keyboard - $( window.document.activeElement ).add( "input:focus, textarea:focus, select:focus" ).blur(); - - function defaultTransition(){ - if(transition === undefined){ - transition = ( nextPageRole && nextPageRole === 'dialog' ) ? 'pop' : $.mobile.defaultTransition; - } - } - - function releasePageTransitionLock(){ - isPageTransitioning = false; - if(pageTransitionQueue.length>0) { - $.mobile.changePage.apply($.mobile, pageTransitionQueue.pop()); - } - } - - //function for transitioning between two existing pages - function transitionPages() { - $.mobile.silentScroll(); - - //get current scroll distance - var currScroll = $window.scrollTop(), - perspectiveTransitions = [ "flip" ], - pageContainerClasses = []; - - //support deep-links to generated sub-pages - if( url.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ){ - to = $( ":jqmData(url='" + url + "')" ); - } - - if( from ){ - //set as data for returning to that spot - from.jqmData( "lastScroll", currScroll); - //trigger before show/hide events - from.data( "page" )._trigger( "beforehide", null, { nextPage: to } ); - } - to.data( "page" )._trigger( "beforeshow", null, { prevPage: from || $("") } ); - - function loadComplete(){ - - if( changeHash !== false && url ){ - //disable hash listening temporarily - urlHistory.ignoreNextHashChange = false; - //update hash and history - path.set( url ); - } - - //if title element wasn't found, try the page div data attr too - var newPageTitle = to.attr( ":jqmData(title)" ) || to.find(".ui-header .ui-title" ).text(); - if( !!newPageTitle && pageTitle == document.title ){ - pageTitle = newPageTitle; - } - - //add page to history stack if it's not back or forward - if( !back && !forward ){ - urlHistory.addNew( url, transition, pageTitle, to ); - } - - //set page title - document.title = urlHistory.getActive().title; - - removeActiveLinkClass(); - - //jump to top or prev scroll, sometimes on iOS the page has not rendered yet. I could only get by this with a setTimeout, but would like to avoid that. - $.mobile.silentScroll( to.jqmData( "lastScroll" ) ); - - reFocus( to ); - - //trigger show/hide events - if( from ){ - from.data( "page" )._trigger( "hide", null, { nextPage: to } ); - } - //trigger pageshow, define prevPage as either from or empty jQuery obj - to.data( "page" )._trigger( "show", null, { prevPage: from || $("") } ); - - //set "to" as activePage - $.mobile.activePage = to; - - //if there's a duplicateCachedPage, remove it from the DOM now that it's hidden - if (duplicateCachedPage !== null) { - duplicateCachedPage.remove(); - } - - //remove initial build class (only present on first pageshow) - $html.removeClass( "ui-mobile-rendering" ); - - releasePageTransitionLock(); - } - - function addContainerClass(className){ - $.mobile.pageContainer.addClass(className); - pageContainerClasses.push(className); - } - - function removeContainerClasses(){ - $.mobile - .pageContainer - .removeClass(pageContainerClasses.join(" ")); - - pageContainerClasses = []; - } - - if(transition && (transition !== 'none')){ - $.mobile.pageLoading( true ); - if( $.inArray(transition, perspectiveTransitions) >= 0 ){ - addContainerClass('ui-mobile-viewport-perspective'); - } - - addContainerClass('ui-mobile-viewport-transitioning'); - - if( from ){ - from.addClass( transition + " out " + ( reverse ? "reverse" : "" ) ); - } - to.addClass( $.mobile.activePageClass + " " + transition + - " in " + ( reverse ? "reverse" : "" ) ); - - // callback - remove classes, etc - to.animationComplete(function() { - to.add(from).removeClass("out in reverse " + transition ); - if( from ){ - from.removeClass( $.mobile.activePageClass ); - } - loadComplete(); - removeContainerClasses(); - }); - } - else{ - $.mobile.pageLoading( true ); - if( from ){ - from.removeClass( $.mobile.activePageClass ); - } - to.addClass( $.mobile.activePageClass ); - loadComplete(); - } - } - - //shared page enhancements - function enhancePage(){ - - //set next page role, if defined - if ( nextPageRole || to.jqmData('role') === 'dialog' ) { - url = urlHistory.getActive().url + dialogHashKey; - if(nextPageRole){ - to.attr( "data-" + $.mobile.ns + "role", nextPageRole ); - nextPageRole = null; - } - } - - //run page plugin - to.page(); - } - - //if url is a string - if( url ){ - to = $( ":jqmData(url='" + url + "')" ); - fileUrl = path.getFilePath(url); - } - else{ //find base url of element, if avail - var toID = to.attr( "data-" + $.mobile.ns + "url" ), - toIDfileurl = path.getFilePath(toID); - - if(toID !== toIDfileurl){ - fileUrl = toIDfileurl; - } - } - - // ensure a transition has been set where pop is undefined - defaultTransition(); - - // find the "to" page, either locally existing in the dom or by creating it through ajax - if ( to.length && !isFormRequest ) { - if( fileUrl && base ){ - base.set( fileUrl ); - } - enhancePage(); - transitionPages(); - } else { - - //if to exists in DOM, save a reference to it in duplicateCachedPage for removal after page change - if( to.length ){ - duplicateCachedPage = to; - } - - $.mobile.pageLoading(); - - $.ajax({ - url: fileUrl, - type: type, - data: data, - success: function( html ) { - //pre-parse html to check for a data-url, - //use it as the new fileUrl, base path, etc - var all = $("
"), - redirectLoc, - - //page title regexp - newPageTitle = html.match( /]*>([^<]*)/ ) && RegExp.$1, - - // TODO handle dialogs again - pageElemRegex = new RegExp(".*(<[^>]+\\bdata-" + $.mobile.ns + "role=[\"']?page[\"']?[^>]*>).*"), - dataUrlRegex = new RegExp("\\bdata-" + $.mobile.ns + "url=[\"']?([^\"'>]*)[\"']?"); - - - // data-url must be provided for the base tag so resource requests can be directed to the - // correct url. loading into a temprorary element makes these requests immediately - if(pageElemRegex.test(html) && RegExp.$1 && dataUrlRegex.test(RegExp.$1) && RegExp.$1) { - redirectLoc = RegExp.$1; - } - - if( redirectLoc ){ - if(base){ - base.set( redirectLoc ); - } - url = fileUrl = path.getFilePath( redirectLoc ); - } - else { - if(base){ - base.set(fileUrl); - } - } - - //workaround to allow scripts to execute when included in page divs - all.get(0).innerHTML = html; - to = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first(); - - //finally, if it's defined now, set the page title for storage in urlHistory - if( newPageTitle ){ - pageTitle = newPageTitle; - } - - //rewrite src and href attrs to use a base url - if( !$.support.dynamicBaseTag ){ - var newPath = path.get( fileUrl ); - to.find( "[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]" ).each(function(){ - var thisAttr = $(this).is('[href]') ? 'href' : 'src', - thisUrl = $(this).attr(thisAttr); - - - //if full path exists and is same, chop it - helps IE out - thisUrl = thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' ); - - if( !/^(\w+:|#|\/)/.test(thisUrl) ){ - $(this).attr(thisAttr, newPath + thisUrl); - } - }); - } - - //append to page and enhance - to - .attr( "data-" + $.mobile.ns + "url", fileUrl ) - .appendTo( $.mobile.pageContainer ); - - enhancePage(); - setTimeout(function() { transitionPages(); }, 0); - }, - error: function() { - - //remove loading message - $.mobile.pageLoading( true ); - - //clear out the active button state - removeActiveLinkClass(true); - - //set base back to current path - if( base ){ - base.set( path.get() ); - } - - //release transition lock so navigation is free again - releasePageTransitionLock(); - - //show error message - $("

"+ $.mobile.pageLoadErrorMessage +"

") - .css({ "display": "block", "opacity": 0.96, "top": $(window).scrollTop() + 100 }) - .appendTo( $.mobile.pageContainer ) - .delay( 800 ) - .fadeOut( 400, function(){ - $(this).remove(); - }); - } - }); - } - - }; - - -/* Event Bindings - hashchange, submit, and click */ - - //bind to form submit events, handle with Ajax - $( "form" ).live('submit', function(event){ - if( !$.mobile.ajaxEnabled || - //TODO: deprecated - remove at 1.0 - !$.mobile.ajaxFormsEnabled || - $(this).is( ":jqmData(ajax='false')" ) ){ return; } - - var type = $(this).attr("method"), - url = path.clean( $(this).attr( "action" ) ), - target = $(this).attr("target"); - - //external submits use regular HTTP - if( path.isExternal( url ) || target ){ - return; - } - - //if it's a relative href, prefix href with base url - if( path.isRelative( url ) ){ - url = path.makeAbsolute( url ); - } - - $.mobile.changePage({ - url: url.length && url || path.get(), - type: type.length && type.toLowerCase() || "get", - data: $(this).serialize() - }, - $(this).jqmData("transition"), - $(this).jqmData("direction"), - true - ); - event.preventDefault(); - }); - - - //temporary fix for allowing 3rd party onclick handlers to still function. - var preventClickDefault = false, stopClickPropagation = false; - - //click routing - direct to HTTP or Ajax, accordingly - $( "a" ).live( "vclick", function(event) { - - var $this = $(this), - - //get href, if defined, otherwise fall to null # - href = $this.attr( "href" ) || "#", - - //cache a check for whether the link had a protocol - //if this is true and the link was same domain, we won't want - //to prefix the url with a base (esp helpful in IE, where every - //url is absolute - hadProtocol = path.hasProtocol( href ), - - //get href, remove same-domain protocol and host - url = path.clean( href ), - - //rel set to external - isRelExternal = $this.is( "[rel='external']" ), - - //rel set to external - isEmbeddedPage = path.isEmbeddedPage( url ), - - // Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR - // requests if the document doing the request was loaded via the file:// protocol. - // This is usually to allow the application to "phone home" and fetch app specific - // data. We normally let the browser handle external/cross-domain urls, but if the - // allowCrossDomainPages option is true, we will allow cross-domain http/https - // requests to go through our page loading logic. - isCrossDomainPageLoad = ($.mobile.allowCrossDomainPages && location.protocol === "file:" && url.search(/^https?:/) != -1), - - //check for protocol or rel and its not an embedded page - //TODO overlap in logic from isExternal, rel=external check should be - // moved into more comprehensive isExternalLink - isExternal = (path.isExternal(url) && !isCrossDomainPageLoad) || (isRelExternal && !isEmbeddedPage), - - //if target attr is specified we mimic _blank... for now - hasTarget = $this.is( "[target]" ), - - //if data-ajax attr is set to false, use the default behavior of a link - hasAjaxDisabled = $this.is( ":jqmData(ajax='false')" ); - - //reset our prevDefault value because I'm paranoid. - preventClickDefault = stopClickPropagation = false; - - //if there's a data-rel=back attr, go back in history - if( $this.is( ":jqmData(rel='back')" ) ){ - window.history.back(); - preventClickDefault = stopClickPropagation = true; - return; - } - - //prevent # urls from bubbling - //path.get() is replaced to combat abs url prefixing in IE - if( url.replace(path.get(), "") == "#" ){ - //for links created purely for interaction - ignore - //don't call preventDefault on the event here, vclick - //may have been triggered by a touchend, before any moues - //click event was dispatched and we want to make sure - //3rd party onclick handlers get triggered. If and when - //a mouse click event is generated, our live("click") handler - //will get triggered and do the preventDefault. - preventClickDefault = true; - return; - } - - $activeClickedLink = $this.closest( ".ui-btn" ).addClass( $.mobile.activeBtnClass ); - - if( isExternal || hasAjaxDisabled || hasTarget || !$.mobile.ajaxEnabled || - // TODO: deprecated - remove at 1.0 - !$.mobile.ajaxLinksEnabled ){ - //remove active link class if external (then it won't be there if you come back) - window.setTimeout(function() {removeActiveLinkClass(true);}, 200); - - //use default click handling - return; - } - - //use ajax - var transition = $this.jqmData( "transition" ), - direction = $this.jqmData("direction"), - reverse = (direction && direction === "reverse") || - // deprecated - remove by 1.0 - $this.jqmData( "back" ); - - //this may need to be more specific as we use data-rel more - nextPageRole = $this.attr( "data-" + $.mobile.ns + "rel" ); - - //if it's a relative href, prefix href with base url - if( path.isRelative( url ) && !hadProtocol ){ - url = path.makeAbsolute( url ); - } - - url = path.stripHash( url ); - - $.mobile.changePage( url, transition, reverse); - preventClickDefault = true; - }); - - $( "a" ).live( "click", function(event) { - if (preventClickDefault){ - event.preventDefault(); - preventClickDefault = false; - } - if (stopClickPropagation){ - event.stopPropagation(); - stopClickPropagation = false; - } - }); - - //hashchange event handler - $window.bind( "hashchange", function( e, triggered ) { - //find first page via hash - var to = path.stripHash( location.hash ), - //transition is false if it's the first page, undefined otherwise (and may be overridden by default) - transition = $.mobile.urlHistory.stack.length === 0 ? false : undefined; - - //if listening is disabled (either globally or temporarily), or it's a dialog hash - if( !$.mobile.hashListeningEnabled || !urlHistory.ignoreNextHashChange ){ - if( !urlHistory.ignoreNextHashChange ){ - urlHistory.ignoreNextHashChange = true; - } - - return; - } - - // special case for dialogs - if( urlHistory.stack.length > 1 && - to.indexOf( dialogHashKey ) > -1 ){ - - // If current active page is not a dialog skip the dialog and continue - // in the same direction - if(!$.mobile.activePage.is( ".ui-dialog" )) { - //determine if we're heading forward or backward and continue accordingly past - //the current dialog - urlHistory.directHashChange({ - currentUrl: to, - isBack: function(){ window.history.back(); }, - isForward: function(){ window.history.forward(); } - }); - - // prevent changepage - return; - } else { - var setTo = function(){ to = $.mobile.urlHistory.getActive().page; }; - // if the current active page is a dialog and we're navigating - // to a dialog use the dialog objected saved in the stack - urlHistory.directHashChange({ currentUrl: to, isBack: setTo, isForward: setTo }); - } - } - - //if to is defined, load it - if ( to ){ - $.mobile.changePage( to, transition, undefined, false, true ); - } - //there's no hash, go to the first page in the dom - else { - $.mobile.changePage( $.mobile.firstPage, transition, true, false, true ); - } - }); - -})( jQuery ); -/* -* jQuery Mobile Framework : "fixHeaderFooter" plugin - on-demand positioning for headers,footers -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.fn.fixHeaderFooter = function(options){ - if( !$.support.scrollTop ){ return this; } - - return this.each(function(){ - var $this = $(this); - - if( $this.jqmData('fullscreen') ){ $this.addClass('ui-page-fullscreen'); } - $this.find( ".ui-header:jqmData(position='fixed')" ).addClass('ui-header-fixed ui-fixed-inline fade'); //should be slidedown - $this.find( ".ui-footer:jqmData(position='fixed')" ).addClass('ui-footer-fixed ui-fixed-inline fade'); //should be slideup - }); -}; - -//single controller for all showing,hiding,toggling -$.fixedToolbars = (function(){ - if( !$.support.scrollTop ){ return; } - var currentstate = 'inline', - autoHideMode = false, - showDelay = 100, - delayTimer, - ignoreTargets = 'a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed', - toolbarSelector = '.ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last', - stickyFooter, //for storing quick references to duplicate footers - supportTouch = $.support.touch, - touchStartEvent = supportTouch ? "touchstart" : "mousedown", - touchStopEvent = supportTouch ? "touchend" : "mouseup", - stateBefore = null, - scrollTriggered = false, - touchToggleEnabled = true; - - function showEventCallback(event) - { - // An event that affects the dimensions of the visual viewport has - // been triggered. If the header and/or footer for the current page are in overlay - // mode, we want to hide them, and then fire off a timer to show them at a later - // point. Events like a resize can be triggered continuously during a scroll, on - // some platforms, so the timer is used to delay the actual positioning until the - // flood of events have subsided. - // - // If we are in autoHideMode, we don't do anything because we know the scroll - // callbacks for the plugin will fire off a show when the scrolling has stopped. - if (!autoHideMode && currentstate == 'overlay') { - if (!delayTimer) - $.fixedToolbars.hide(true); - $.fixedToolbars.startShowTimer(); - } - } - - $(function() { - $(document) - .bind( "vmousedown",function(event){ - if( touchToggleEnabled ) { - stateBefore = currentstate; - } - }) - .bind( "vclick",function(event){ - if( touchToggleEnabled ) { - if( $(event.target).closest(ignoreTargets).length ){ return; } - if( !scrollTriggered ){ - $.fixedToolbars.toggle(stateBefore); - stateBefore = null; - } - } - }) - .bind('scrollstart',function(event){ - scrollTriggered = true; - if(stateBefore == null){ stateBefore = currentstate; } - - // We only enter autoHideMode if the headers/footers are in - // an overlay state or the show timer was started. If the - // show timer is set, clear it so the headers/footers don't - // show up until after we're done scrolling. - var isOverlayState = stateBefore == 'overlay'; - autoHideMode = isOverlayState || !!delayTimer; - if (autoHideMode){ - $.fixedToolbars.clearShowTimer(); - if (isOverlayState) { - $.fixedToolbars.hide(true); - } - } - }) - .bind('scrollstop',function(event){ - if( $(event.target).closest(ignoreTargets).length ){ return; } - scrollTriggered = false; - if (autoHideMode) { - autoHideMode = false; - $.fixedToolbars.startShowTimer(); - } - stateBefore = null; - }) - .bind('silentscroll', showEventCallback); - - $(window).bind('resize', showEventCallback); - }); - - //before page is shown, check for duplicate footer - $('.ui-page').live('pagebeforeshow', function(event, ui){ - var page = $(event.target), - footer = page.find( ":jqmData(role='footer')" ), - id = footer.data('id'), - prevPage = ui.prevPage; - - prevFooter = prevPage && prevPage.find( ":jqmData(role='footer')" ); - var prevFooterMatches = prevFooter.jqmData( "id" ) === id; - - if( id && prevFooterMatches ){ - stickyFooter = footer; - setTop( stickyFooter.removeClass( "fade in out" ).appendTo( $.mobile.pageContainer ) ); - } - }); - - //after page is shown, append footer to new page - $('.ui-page').live('pageshow', function(event, ui){ - var $this = $(this); - - if( stickyFooter && stickyFooter.length ){ - - setTimeout(function(){ - setTop( stickyFooter.appendTo( $this ).addClass("fade") ); - stickyFooter = null; - }, 500); - } - - $.fixedToolbars.show(true, this); - }); - - - // element.getBoundingClientRect() is broken in iOS 3.2.1 on the iPad. The - // coordinates inside of the rect it returns don't have the page scroll position - // factored out of it like the other platforms do. To get around this, - // we'll just calculate the top offset the old fashioned way until core has - // a chance to figure out how to handle this situation. - // - // TODO: We'll need to get rid of getOffsetTop() once a fix gets folded into core. - - function getOffsetTop(ele) - { - var top = 0; - if (ele) - { - var op = ele.offsetParent, body = document.body; - top = ele.offsetTop; - while (ele && ele != body) - { - top += ele.scrollTop || 0; - if (ele == op) - { - top += op.offsetTop; - op = ele.offsetParent; - } - ele = ele.parentNode; - } - } - return top; - } - - function setTop(el){ - var fromTop = $(window).scrollTop(), - thisTop = getOffsetTop(el[0]), // el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead. - thisCSStop = el.css('top') == 'auto' ? 0 : parseFloat(el.css('top')), - screenHeight = window.innerHeight, - thisHeight = el.outerHeight(), - useRelative = el.parents('.ui-page:not(.ui-page-fullscreen)').length, - relval; - if( el.is('.ui-header-fixed') ){ - relval = fromTop - thisTop + thisCSStop; - if( relval < thisTop){ relval = 0; } - return el.css('top', ( useRelative ) ? relval : fromTop); - } - else{ - //relval = -1 * (thisTop - (fromTop + screenHeight) + thisCSStop + thisHeight); - //if( relval > thisTop ){ relval = 0; } - relval = fromTop + screenHeight - thisHeight - (thisTop - thisCSStop); - return el.css('top', ( useRelative ) ? relval : fromTop + screenHeight - thisHeight ); - } - } - - //exposed methods - return { - show: function(immediately, page){ - $.fixedToolbars.clearShowTimer(); - currentstate = 'overlay'; - var $ap = page ? $(page) : ($.mobile.activePage ? $.mobile.activePage : $(".ui-page-active")); - return $ap.children( toolbarSelector ).each(function(){ - var el = $(this), - fromTop = $(window).scrollTop(), - thisTop = getOffsetTop(el[0]), // el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead. - screenHeight = window.innerHeight, - thisHeight = el.outerHeight(), - alreadyVisible = (el.is('.ui-header-fixed') && fromTop <= thisTop + thisHeight) || (el.is('.ui-footer-fixed') && thisTop <= fromTop + screenHeight); - - //add state class - el.addClass('ui-fixed-overlay').removeClass('ui-fixed-inline'); - - if( !alreadyVisible && !immediately ){ - el.animationComplete(function(){ - el.removeClass('in'); - }).addClass('in'); - } - setTop(el); - }); - }, - hide: function(immediately){ - currentstate = 'inline'; - var $ap = $.mobile.activePage ? $.mobile.activePage : $(".ui-page-active"); - return $ap.children( toolbarSelector ).each(function(){ - var el = $(this); - - var thisCSStop = el.css('top'); thisCSStop = thisCSStop == 'auto' ? 0 : parseFloat(thisCSStop); - - //add state class - el.addClass('ui-fixed-inline').removeClass('ui-fixed-overlay'); - - if (thisCSStop < 0 || (el.is('.ui-header-fixed') && thisCSStop != 0)) - { - if(immediately){ - el.css('top',0); - } - else{ - if( el.css('top') !== 'auto' && parseFloat(el.css('top')) !== 0 ){ - var classes = 'out reverse'; - el.animationComplete(function(){ - el.removeClass(classes); - el.css('top',0); - }).addClass(classes); - } - } - } - }); - }, - startShowTimer: function(){ - $.fixedToolbars.clearShowTimer(); - var args = $.makeArray(arguments); - delayTimer = setTimeout(function(){ - delayTimer = undefined; - $.fixedToolbars.show.apply(null, args); - }, showDelay); - }, - clearShowTimer: function() { - if (delayTimer) { - clearTimeout(delayTimer); - } - delayTimer = undefined; - }, - toggle: function(from){ - if(from){ currentstate = from; } - return (currentstate == 'overlay') ? $.fixedToolbars.hide() : $.fixedToolbars.show(); - }, - setTouchToggleEnabled: function(enabled) { - touchToggleEnabled = enabled; - } - }; -})(); - -})(jQuery); -/* -* jQuery Mobile Framework : "checkboxradio" plugin -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.widget( "mobile.checkboxradio", $.mobile.widget, { - options: { - theme: null - }, - _create: function(){ - var self = this, - input = this.element, - //NOTE: Windows Phone could not find the label through a selector - //filter works though. - label = input.closest("form,fieldset,:jqmData(role='page')").find("label").filter("[for=" + input[0].id + "]"), - inputtype = input.attr( "type" ), - checkedicon = "ui-icon-" + inputtype + "-on", - uncheckedicon = "ui-icon-" + inputtype + "-off"; - - if ( inputtype != "checkbox" && inputtype != "radio" ) { return; } - - //expose for other methods - $.extend( this,{ - label : label, - inputtype : inputtype, - checkedicon : checkedicon, - uncheckedicon : uncheckedicon - }); - - // If there's no selected theme... - if( !this.options.theme ) { - this.options.theme = this.element.jqmData( "theme" ); - } - - label - .buttonMarkup({ - theme: this.options.theme, - icon: this.element.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedicon, - shadow: false - }); - - // wrap the input + label in a div - input - .add( label ) - .wrapAll( "
" ); - - label.bind({ - vmouseover: function() { - if( $(this).parent().is('.ui-disabled') ){ return false; } - }, - - vclick: function( event ){ - if ( input.is( ":disabled" ) ){ - event.preventDefault(); - return; - } - - self._cacheVals(); - input.attr( "checked", inputtype === "radio" && true || !input.is( ":checked" ) ); - self._updateAll(); - return false; - } - - }); - - input - .bind({ - vmousedown: function(){ - this._cacheVals(); - }, - - vclick: function(){ - self._updateAll(); - }, - - focus: function() { - label.addClass( "ui-focus" ); - }, - - blur: function() { - label.removeClass( "ui-focus" ); - } - }); - - this.refresh(); - - }, - - _cacheVals: function(){ - this._getInputSet().each(function(){ - $(this).jqmData("cacheVal", $(this).is(":checked") ); - }); - }, - - //returns either a set of radios with the same name attribute, or a single checkbox - _getInputSet: function(){ - return this.element.closest( "form,fieldset,:jqmData(role='page')" ) - .find( "input[name='"+ this.element.attr( "name" ) +"'][type='"+ this.inputtype +"']" ); - }, - - _updateAll: function(){ - this._getInputSet().each(function(){ - if( $(this).is(":checked") || this.inputtype === "checkbox" ){ - $(this).trigger("change"); - } - }) - .checkboxradio( "refresh" ); - }, - - refresh: function( ){ - var input = this.element, - label = this.label, - icon = label.find( ".ui-icon" ); - - if ( input[0].checked ) { - label.addClass( $.mobile.activeBtnClass ); - icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon ); - - } else { - label.removeClass( $.mobile.activeBtnClass ); - icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon ); - } - - if( input.is( ":disabled" ) ){ - this.disable(); - } - else { - this.enable(); - } - }, - - disable: function(){ - this.element.attr("disabled",true).parent().addClass("ui-disabled"); - }, - - enable: function(){ - this.element.attr("disabled",false).parent().removeClass("ui-disabled"); - } -}); -})( jQuery ); -/* -* jQuery Mobile Framework : "textinput" plugin for text inputs, textareas -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.widget( "mobile.textinput", $.mobile.widget, { - options: { - theme: null - }, - _create: function(){ - var input = this.element, - o = this.options, - theme = o.theme, - themeclass; - - if ( !theme ) { - var themedParent = this.element.closest("[class*='ui-bar-'],[class*='ui-body-']"); - theme = themedParent.length ? - /ui-(bar|body)-([a-z])/.exec( themedParent.attr("class") )[2] : - "c"; - } - - themeclass = " ui-body-" + theme; - - $('label[for='+input.attr('id')+']').addClass('ui-input-text'); - - input.addClass('ui-input-text ui-body-'+ o.theme); - - var focusedEl = input; - - //"search" input widget - if( input.is( "[type='search'],:jqmData(type='search')" ) ){ - focusedEl = input.wrap('').parent(); - var clearbtn = $('clear text') - .tap(function( e ){ - input.val('').focus(); - input.trigger('change'); - clearbtn.addClass('ui-input-clear-hidden'); - e.preventDefault(); - }) - .appendTo(focusedEl) - .buttonMarkup({icon: 'delete', iconpos: 'notext', corners:true, shadow:true}); - - function toggleClear(){ - if(input.val() == ''){ - clearbtn.addClass('ui-input-clear-hidden'); - } - else{ - clearbtn.removeClass('ui-input-clear-hidden'); - } - } - - toggleClear(); - input.keyup(toggleClear); - } - else{ - input.addClass('ui-corner-all ui-shadow-inset' + themeclass); - } - - input - .focus(function(){ - focusedEl.addClass('ui-focus'); - }) - .blur(function(){ - focusedEl.removeClass('ui-focus'); - }); - - //autogrow - if ( input.is('textarea') ) { - var extraLineHeight = 15, - keyupTimeoutBuffer = 100, - keyup = function() { - var scrollHeight = input[0].scrollHeight, - clientHeight = input[0].clientHeight; - if ( clientHeight < scrollHeight ) { - input.css({ height: (scrollHeight + extraLineHeight) }); - } - }, - keyupTimeout; - input.keyup(function() { - clearTimeout( keyupTimeout ); - keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer ); - }); - } - }, - - disable: function(){ - ( this.element.attr("disabled",true).is( "[type='search'],:jqmData(type='search')" ) ? this.element.parent() : this.element ).addClass("ui-disabled"); - }, - - enable: function(){ - ( this.element.attr("disabled", false).is( "[type='search'],:jqmData(type='search')" ) ? this.element.parent() : this.element ).removeClass("ui-disabled"); - } -}); -})( jQuery ); -/* -* jQuery Mobile Framework : "selectmenu" plugin -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.widget( "mobile.selectmenu", $.mobile.widget, { - options: { - theme: null, - disabled: false, - icon: 'arrow-d', - iconpos: 'right', - inline: null, - corners: true, - shadow: true, - iconshadow: true, - menuPageTheme: 'b', - overlayTheme: 'a', - hidePlaceholderMenuItems: true, - closeText: 'Close', - nativeMenu: true - }, - _create: function(){ - - var self = this, - - o = this.options, - - select = this.element - .wrap( "
" ), - - selectID = select.attr( "id" ), - - label = $( "label[for="+ selectID +"]" ).addClass( "ui-select" ), - - //IE throws an exception at options.item() function when - //there is no selected item - //select first in this case - selectedIndex = select[0].selectedIndex == -1 ? 0 : select[0].selectedIndex, - - button = ( self.options.nativeMenu ? $( "
" ) : $( "", { - "href": "#", - "role": "button", - "id": buttonId, - "aria-haspopup": "true", - "aria-owns": menuId - }) ) - .text( $( select[0].options.item( selectedIndex ) ).text() ) - .insertBefore( select ) - .buttonMarkup({ - theme: o.theme, - icon: o.icon, - iconpos: o.iconpos, - inline: o.inline, - corners: o.corners, - shadow: o.shadow, - iconshadow: o.iconshadow - }), - - //multi select or not - isMultiple = self.isMultiple = select[0].multiple; - - //Opera does not properly support opacity on select elements - //In Mini, it hides the element, but not its text - //On the desktop,it seems to do the opposite - //for these reasons, using the nativeMenu option results in a full native select in Opera - if( o.nativeMenu && window.opera && window.opera.version ){ - select.addClass( "ui-select-nativeonly" ); - } - - //vars for non-native menus - if( !o.nativeMenu ){ - var options = select.find("option"), - - buttonId = selectID + "-button", - - menuId = selectID + "-menu", - - thisPage = select.closest( ".ui-page" ), - - //button theme - theme = /ui-btn-up-([a-z])/.exec( button.attr("class") )[1], - - menuPage = $( "
" + - "
" + - "
" + label.text() + "
"+ - "
"+ - "
"+ - "
" ) - .appendTo( $.mobile.pageContainer ) - .page(), - - menuPageContent = menuPage.find( ".ui-content" ), - - menuPageClose = menuPage.find( ".ui-header a" ), - - screen = $( "
", {"class": "ui-selectmenu-screen ui-screen-hidden"}) - .appendTo( thisPage ), - - listbox = $( "
", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all pop ui-body-" + o.overlayTheme } ) - .insertAfter(screen), - - list = $( "
    ", { - "class": "ui-selectmenu-list", - "id": menuId, - "role": "listbox", - "aria-labelledby": buttonId - }) - .attr( "data-" + $.mobile.ns + "theme", theme ) - .appendTo( listbox ), - - header = $( "
    ", { - "class": "ui-header ui-bar-" + theme - }) - .prependTo( listbox ), - - headerTitle = $( "

    ", { - "class": "ui-title" - }) - .appendTo( header ), - - headerClose = $( "", { - "text": o.closeText, - "href": "#", - "class": "ui-btn-left" - }) - .attr( "data-" + $.mobile.ns + "iconpos", "notext" ) - .attr( "data-" + $.mobile.ns + "icon", "delete" ) - .appendTo( header ) - .buttonMarkup(), - - menuType; - } //end non native vars - - // add counter for multi selects - if( isMultiple ){ - self.buttonCount = $('') - .addClass( 'ui-li-count ui-btn-up-c ui-btn-corner-all' ) - .hide() - .appendTo( button ); - } - - //disable if specified - if( o.disabled ){ this.disable(); } - - //events on native select - select - .change(function(){ - self.refresh(); - }); - - //expose to other methods - $.extend(self, { - select: select, - optionElems: options, - selectID: selectID, - label: label, - buttonId:buttonId, - menuId:menuId, - thisPage:thisPage, - button:button, - menuPage:menuPage, - menuPageContent:menuPageContent, - screen:screen, - listbox:listbox, - list:list, - menuType:menuType, - header:header, - headerClose:headerClose, - headerTitle:headerTitle, - placeholder: '' - }); - - //support for using the native select menu with a custom button - if( o.nativeMenu ){ - - select - .appendTo(button) - .bind( "vmousedown", function( e ){ - //add active class to button - button.addClass( $.mobile.activeBtnClass ); - }) - .bind( "focus vmouseover", function(){ - button.trigger( "vmouseover" ); - }) - .bind( "vmousemove", function(){ - //remove active class on scroll/touchmove - button.removeClass( $.mobile.activeBtnClass ); - }) - .bind( "change blur vmouseout", function(){ - button - .trigger( "vmouseout" ) - .removeClass( $.mobile.activeBtnClass ); - }); - - - } else { - - //create list from select, update state - self.refresh(); - - select - .attr( "tabindex", "-1" ) - .focus(function(){ - $(this).blur(); - button.focus(); - }); - - //button events - button - .bind( "vclick keydown" , function( event ){ - if( event.type == "vclick" || - event.keyCode && ( event.keyCode === $.mobile.keyCode.ENTER || event.keyCode === $.mobile.keyCode.SPACE ) ){ - self.open(); - event.preventDefault(); - } - }); - - //events for list items - list - .attr( "role", "listbox" ) - .delegate( ".ui-li>a", "focusin", function() { - $( this ).attr( "tabindex", "0" ); - }) - .delegate( ".ui-li>a", "focusout", function() { - $( this ).attr( "tabindex", "-1" ); - }) - .delegate("li:not(.ui-disabled, .ui-li-divider)", "vclick", function(event){ - - // index of option tag to be selected - var oldIndex = select[0].selectedIndex, - newIndex = list.find( "li:not(.ui-li-divider)" ).index( this ), - option = self.optionElems.eq( newIndex )[0]; - - // toggle selected status on the tag for multi selects - option.selected = isMultiple ? !option.selected : true; - - // toggle checkbox class for multiple selects - if( isMultiple ){ - $(this) - .find('.ui-icon') - .toggleClass('ui-icon-checkbox-on', option.selected) - .toggleClass('ui-icon-checkbox-off', !option.selected); - } - - // trigger change if value changed - if( oldIndex !== newIndex ){ - select.trigger( "change" ); - } - - //hide custom select for single selects only - if( !isMultiple ){ - self.close(); - } - - event.preventDefault(); - }) - //keyboard events for menu items - .keydown(function( e ) { - var target = $( e.target ), - li = target.closest( "li" ); - - // switch logic based on which key was pressed - switch ( e.keyCode ) { - // up or left arrow keys - case 38: - var prev = li.prev(); - - // if there's a previous option, focus it - if ( prev.length ) { - target - .blur() - .attr( "tabindex", "-1" ); - - prev.find( "a" ).first().focus(); - } - - return false; - break; - - // down or right arrow keys - case 40: - var next = li.next(); - - // if there's a next option, focus it - if ( next.length ) { - target - .blur() - .attr( "tabindex", "-1" ); - - next.find( "a" ).first().focus(); - } - - return false; - break; - - // if enter or space is pressed, trigger click - case 13: - case 32: - target.trigger( "vclick" ); - - return false; - break; - } - }); - - //events on "screen" overlay - screen.bind("vclick", function( event ){ - self.close(); - }); - - //close button on small overlays - self.headerClose.click(function(){ - if( self.menuType == "overlay" ){ - self.close(); - return false; - } - }) - } - }, - - _buildList: function(){ - var self = this, - o = this.options, - placeholder = this.placeholder, - optgroups = [], - lis = [], - dataIcon = self.isMultiple ? "checkbox-off" : "false"; - - self.list.empty().filter('.ui-listview').listview('destroy'); - - //populate menu with options from select element - self.select.find( "option" ).each(function( i ){ - var $this = $(this), - $parent = $this.parent(), - text = $this.text(), - anchor = ""+ text +"", - classes = [], - extraAttrs = []; - - // are we inside an optgroup? - if( $parent.is("optgroup") ){ - var optLabel = $parent.attr("label"); - - // has this optgroup already been built yet? - if( $.inArray(optLabel, optgroups) === -1 ){ - lis.push( "
  • "+ optLabel +"
  • " ); - optgroups.push( optLabel ); - } - } - - //find placeholder text - if( !this.getAttribute('value') || text.length == 0 || $this.jqmData('placeholder') ){ - if( o.hidePlaceholderMenuItems ){ - classes.push( "ui-selectmenu-placeholder" ); - } - placeholder = self.placeholder = text; - } - - // support disabled option tags - if( this.disabled ){ - classes.push( "ui-disabled" ); - extraAttrs.push( "aria-disabled='true'" ); - } - - lis.push( "
  • "+ anchor +"
  • " ) - }); - - self.list.html( lis.join(" ") ); - - self.list.find( "li" ) - .attr({ "role": "option", "tabindex": "-1" }) - .first().attr( "tabindex", "0" ); - - // hide header close link for single selects - if( !this.isMultiple ){ - this.headerClose.hide(); - } - - // hide header if it's not a multiselect and there's no placeholder - if( !this.isMultiple && !placeholder.length ){ - this.header.hide(); - } else { - this.headerTitle.text( this.placeholder ); - } - - //now populated, create listview - self.list.listview(); - }, - - refresh: function( forceRebuild ){ - var self = this, - select = this.element, - isMultiple = this.isMultiple, - options = this.optionElems = select.find("option"), - selected = options.filter(":selected"), - - // return an array of all selected index's - indicies = selected.map(function(){ - return options.index( this ); - }).get(); - - if( !self.options.nativeMenu && ( forceRebuild || select[0].options.length != self.list.find('li').length )){ - self._buildList(); - } - - self.button - .find( ".ui-btn-text" ) - .text(function(){ - if( !isMultiple ){ - return selected.text(); - } - - return selected.length ? - selected.map(function(){ return $(this).text(); }).get().join(', ') : - self.placeholder; - }); - - // multiple count inside button - if( isMultiple ){ - self.buttonCount[ selected.length > 1 ? 'show' : 'hide' ]().text( selected.length ); - } - - if( !self.options.nativeMenu ){ - self.list - .find( 'li:not(.ui-li-divider)' ) - .removeClass( $.mobile.activeBtnClass ) - .attr( 'aria-selected', false ) - .each(function( i ){ - if( $.inArray(i, indicies) > -1 ){ - var item = $(this).addClass( $.mobile.activeBtnClass ); - - // aria selected attr - item.find( 'a' ).attr( 'aria-selected', true ); - - // multiple selects: add the "on" checkbox state to the icon - if( isMultiple ){ - item.find('.ui-icon').removeClass('ui-icon-checkbox-off').addClass('ui-icon-checkbox-on'); - } - } - }); - } - }, - - open: function(){ - if( this.options.disabled || this.options.nativeMenu ){ return; } - - var self = this, - menuHeight = self.list.parent().outerHeight(), - menuWidth = self.list.parent().outerWidth(), - scrollTop = $(window).scrollTop(), - btnOffset = self.button.offset().top, - screenHeight = window.innerHeight, - screenWidth = window.innerWidth; - - //add active class to button - self.button.addClass( $.mobile.activeBtnClass ); - - //remove after delay - setTimeout(function(){ - self.button.removeClass( $.mobile.activeBtnClass ); - }, 300); - - function focusMenuItem(){ - self.list.find( ".ui-btn-active" ).focus(); - } - - if( menuHeight > screenHeight - 80 || !$.support.scrollTop ){ - - //for webos (set lastscroll using button offset) - if( scrollTop == 0 && btnOffset > screenHeight ){ - self.thisPage.one('pagehide',function(){ - $(this).jqmData('lastScroll', btnOffset); - }); - } - - self.menuPage.one('pageshow', function() { - // silentScroll() is called whenever a page is shown to restore - // any previous scroll position the page may have had. We need to - // wait for the "silentscroll" event before setting focus to avoid - // the browser's "feature" which offsets rendering to make sure - // whatever has focus is in view. - $(window).one("silentscroll", function(){ focusMenuItem(); }); - }); - - self.menuType = "page"; - self.menuPageContent.append( self.list ); - $.mobile.changePage(self.menuPage, 'pop', false, true); - } - else { - self.menuType = "overlay"; - - self.screen - .height( $(document).height() ) - .removeClass('ui-screen-hidden'); - - //try and center the overlay over the button - var roomtop = btnOffset - scrollTop, - roombot = scrollTop + screenHeight - btnOffset, - halfheight = menuHeight / 2, - maxwidth = parseFloat(self.list.parent().css('max-width')), - newtop, newleft; - - if( roomtop > menuHeight / 2 && roombot > menuHeight / 2 ){ - newtop = btnOffset + ( self.button.outerHeight() / 2 ) - halfheight; - } - else{ - //30px tolerance off the edges - newtop = roomtop > roombot ? scrollTop + screenHeight - menuHeight - 30 : scrollTop + 30; - } - - // if the menuwidth is smaller than the screen center is - if (menuWidth < maxwidth) { - newleft = (screenWidth - menuWidth) / 2; - } else { //otherwise insure a >= 30px offset from the left - newleft = self.button.offset().left + self.button.outerWidth() / 2 - menuWidth / 2; - // 30px tolerance off the edges - if (newleft < 30) { - newleft = 30; - } else if ((newleft + menuWidth) > screenWidth) { - newleft = screenWidth - menuWidth - 30; - } - } - - self.listbox - .append( self.list ) - .removeClass( "ui-selectmenu-hidden" ) - .css({ - top: newtop, - left: newleft - }) - .addClass("in"); - - focusMenuItem(); - } - - // wait before the dialog can be closed - setTimeout(function(){ - self.isOpen = true; - }, 400); - }, - - close: function(){ - if( this.options.disabled || !this.isOpen || this.options.nativeMenu ){ return; } - var self = this; - - function focusButton(){ - setTimeout(function(){ - self.button.focus(); - }, 40); - - self.listbox.removeAttr('style').append( self.list ); - } - - if(self.menuType == "page"){ - $.mobile.changePage([self.menuPage,self.thisPage], 'pop', true, false); - self.menuPage.one("pagehide", focusButton); - } - else{ - self.screen.addClass( "ui-screen-hidden" ); - self.listbox.addClass( "ui-selectmenu-hidden" ).removeAttr( "style" ).removeClass("in"); - focusButton(); - } - - // allow the dialog to be closed again - this.isOpen = false; - }, - - disable: function(){ - this.element.attr("disabled",true); - this.button.addClass('ui-disabled').attr("aria-disabled", true); - return this._setOption( "disabled", true ); - }, - - enable: function(){ - this.element.attr("disabled",false); - this.button.removeClass('ui-disabled').attr("aria-disabled", false); - return this._setOption( "disabled", false ); - } -}); -})( jQuery ); - -/* -* jQuery Mobile Framework : plugin for making button-like links -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { - -$.fn.buttonMarkup = function( options ){ - return this.each( function() { - var el = $( this ), - o = $.extend( {}, $.fn.buttonMarkup.defaults, el.jqmData(), options), - - // Classes Defined - buttonClass, - innerClass = "ui-btn-inner", - iconClass; - - if ( attachEvents ) { - attachEvents(); - } - - // if not, try to find closest theme container - if ( !o.theme ) { - var themedParent = el.closest("[class*='ui-bar-'],[class*='ui-body-']"); - o.theme = themedParent.length ? - /ui-(bar|body)-([a-z])/.exec( themedParent.attr("class") )[2] : - "c"; - } - - buttonClass = "ui-btn ui-btn-up-" + o.theme; - - if ( o.inline ) { - buttonClass += " ui-btn-inline"; - } - - if ( o.icon ) { - o.icon = "ui-icon-" + o.icon; - o.iconpos = o.iconpos || "left"; - - iconClass = "ui-icon " + o.icon; - - if ( o.shadow ) { - iconClass += " ui-icon-shadow"; - } - } - - if ( o.iconpos ) { - buttonClass += " ui-btn-icon-" + o.iconpos; - - if ( o.iconpos == "notext" && !el.attr("title") ) { - el.attr( "title", el.text() ); - } - } - - if ( o.corners ) { - buttonClass += " ui-btn-corner-all"; - innerClass += " ui-btn-corner-all"; - } - - if ( o.shadow ) { - buttonClass += " ui-shadow"; - } - - el - .attr( "data-" + $.mobile.ns + "theme", o.theme ) - .addClass( buttonClass ); - - var wrap = ("" + - ( o.icon ? "" : "" ) + - "").replace(/D/g, o.wrapperEls); - - el.wrapInner( wrap ); - }); -}; - -$.fn.buttonMarkup.defaults = { - corners: true, - shadow: true, - iconshadow: true, - wrapperEls: "span" -}; - -var attachEvents = function() { - $(".ui-btn:not(.ui-disabled)").live({ - "vmousedown": function() { - var theme = $(this).attr( "data-" + $.mobile.ns + "theme" ); - $(this).removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme ); - }, - "vmousecancel vmouseup": function() { - var theme = $(this).attr( "data-" + $.mobile.ns + "theme" ); - $(this).removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme ); - }, - "vmouseover focus": function() { - var theme = $(this).attr( "data-" + $.mobile.ns + "theme" ); - $(this).removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme ); - }, - "vmouseout blur": function() { - var theme = $(this).attr( "data-" + $.mobile.ns + "theme" ); - $(this).removeClass( "ui-btn-hover-" + theme ).addClass( "ui-btn-up-" + theme ); - } - }); - - attachEvents = null; -}; - -})(jQuery); -/* -* jQuery Mobile Framework : "button" plugin - links that proxy to native input/buttons -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.widget( "mobile.button", $.mobile.widget, { - options: { - theme: null, - icon: null, - iconpos: null, - inline: null, - corners: true, - shadow: true, - iconshadow: true - }, - _create: function(){ - var $el = this.element, - o = this.options; - - //add ARIA role - this.button = $( "
    " ) - .text( $el.text() || $el.val() ) - .buttonMarkup({ - theme: o.theme, - icon: o.icon, - iconpos: o.iconpos, - inline: o.inline, - corners: o.corners, - shadow: o.shadow, - iconshadow: o.iconshadow - }) - .insertBefore( $el ) - .append( $el.addClass('ui-btn-hidden') ); - - //add hidden input during submit - var type = $el.attr('type'); - if( type !== 'button' && type !== 'reset' ){ - $el.bind("vclick", function(){ - var $buttonPlaceholder = $("", - {type: "hidden", name: $el.attr("name"), value: $el.attr("value")}) - .insertBefore($el); - - //bind to doc to remove after submit handling - $(document).submit(function(){ - $buttonPlaceholder.remove(); - }); - }); - } - this.refresh(); - - }, - - enable: function(){ - this.element.attr("disabled", false); - this.button.removeClass("ui-disabled").attr("aria-disabled", false); - return this._setOption("disabled", false); - }, - - disable: function(){ - this.element.attr("disabled", true); - this.button.addClass("ui-disabled").attr("aria-disabled", true); - return this._setOption("disabled", true); - }, - - refresh: function(){ - if( this.element.attr('disabled') ){ - this.disable(); - } - else{ - this.enable(); - } - } -}); -})( jQuery );/* -* jQuery Mobile Framework : "slider" plugin -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.widget( "mobile.slider", $.mobile.widget, { - options: { - theme: null, - trackTheme: null, - disabled: false - }, - _create: function(){ - var self = this, - - control = this.element, - - parentTheme = control.parents('[class*=ui-bar-],[class*=ui-body-]').eq(0), - - parentTheme = parentTheme.length ? parentTheme.attr('class').match(/ui-(bar|body)-([a-z])/)[2] : 'c', - - theme = this.options.theme ? this.options.theme : parentTheme, - - trackTheme = this.options.trackTheme ? this.options.trackTheme : parentTheme, - - cType = control[0].nodeName.toLowerCase(), - selectClass = (cType == 'select') ? 'ui-slider-switch' : '', - controlID = control.attr('id'), - labelID = controlID + '-label', - label = $('[for='+ controlID +']').attr('id',labelID), - val = function(){ - return (cType == 'input') ? parseFloat(control.val()) : control[0].selectedIndex; - }, - min = (cType == 'input') ? parseFloat(control.attr('min')) : 0, - max = (cType == 'input') ? parseFloat(control.attr('max')) : control.find('option').length-1, - step = window.parseFloat(control.attr('step') || 1), - slider = $('
    '), - handle = $('') - .appendTo(slider) - .buttonMarkup({corners: true, theme: theme, shadow: true}) - .attr({ - 'role': 'slider', - 'aria-valuemin': min, - 'aria-valuemax': max, - 'aria-valuenow': val(), - 'aria-valuetext': val(), - 'title': val(), - 'aria-labelledby': labelID - }); - - $.extend(this, { - slider: slider, - handle: handle, - dragging: false, - beforeStart: null - }); - - if(cType == 'select'){ - slider.wrapInner('
    '); - var options = control.find('option'); - - control.find('option').each(function(i){ - var side = (i==0) ?'b':'a', - corners = (i==0) ? 'right' :'left', - theme = (i==0) ? ' ui-btn-down-' + trackTheme :' ui-btn-active'; - $('
    ').prependTo(slider); - $(''+$(this).text()+'').prependTo(handle); - }); - - } - - label.addClass('ui-slider'); - - // monitor the input for updated values - control - .addClass((cType == 'input') ? 'ui-slider-input' : 'ui-slider-switch') - .change(function(){ - self.refresh( val(), true ); - }) - .keyup(function(){ // necessary? - self.refresh( val(), true, true ); - }) - .blur(function(){ - self.refresh( val(), true ); - }); - - // prevent screen drag when slider activated - $(document).bind( "vmousemove", function(event){ - if ( self.dragging ) { - self.refresh( event ); - return false; - } - }); - - slider - .bind( "vmousedown", function(event){ - self.dragging = true; - if ( cType === "select" ) { - self.beforeStart = control[0].selectedIndex; - } - self.refresh( event ); - return false; - }); - - slider - .add(document) - .bind( "vmouseup", function(){ - if ( self.dragging ) { - self.dragging = false; - if ( cType === "select" ) { - if ( self.beforeStart === control[0].selectedIndex ) { - //tap occurred, but value didn't change. flip it! - self.refresh( self.beforeStart === 0 ? 1 : 0 ); - } - var curval = val(); - var snapped = Math.round( curval / (max - min) * 100 ); - handle - .addClass("ui-slider-handle-snapping") - .css("left", snapped + "%") - .animationComplete(function(){ - handle.removeClass("ui-slider-handle-snapping"); - }); - } - return false; - } - }); - - slider.insertAfter(control); - - // NOTE force focus on handle - this.handle - .bind( "vmousedown", function(){ - $(this).focus(); - }); - - this.handle - .bind( "keydown", function( event ) { - var index = val(); - - if ( self.options.disabled ) { - return; - } - - // In all cases prevent the default and mark the handle as active - switch ( event.keyCode ) { - case $.mobile.keyCode.HOME: - case $.mobile.keyCode.END: - case $.mobile.keyCode.PAGE_UP: - case $.mobile.keyCode.PAGE_DOWN: - case $.mobile.keyCode.UP: - case $.mobile.keyCode.RIGHT: - case $.mobile.keyCode.DOWN: - case $.mobile.keyCode.LEFT: - event.preventDefault(); - - if ( !self._keySliding ) { - self._keySliding = true; - $( this ).addClass( "ui-state-active" ); - } - break; - } - - // move the slider according to the keypress - switch ( event.keyCode ) { - case $.mobile.keyCode.HOME: - self.refresh(min); - break; - case $.mobile.keyCode.END: - self.refresh(max); - break; - case $.mobile.keyCode.PAGE_UP: - case $.mobile.keyCode.UP: - case $.mobile.keyCode.RIGHT: - self.refresh(index + step); - break; - case $.mobile.keyCode.PAGE_DOWN: - case $.mobile.keyCode.DOWN: - case $.mobile.keyCode.LEFT: - self.refresh(index - step); - break; - } - }) // remove active mark - .keyup(function( event ) { - if ( self._keySliding ) { - self._keySliding = false; - $( this ).removeClass( "ui-state-active" ); - } - }); - - this.refresh(); - }, - - refresh: function(val, isfromControl, preventInputUpdate){ - if ( this.options.disabled ) { return; } - - var control = this.element, percent, - cType = control[0].nodeName.toLowerCase(), - min = (cType === "input") ? parseFloat(control.attr("min")) : 0, - max = (cType === "input") ? parseFloat(control.attr("max")) : control.find("option").length - 1; - - if ( typeof val === "object" ) { - var data = val, - // a slight tolerance helped get to the ends of the slider - tol = 8; - if ( !this.dragging - || data.pageX < this.slider.offset().left - tol - || data.pageX > this.slider.offset().left + this.slider.width() + tol ) { - return; - } - percent = Math.round( ((data.pageX - this.slider.offset().left) / this.slider.width() ) * 100 ); - } else { - if ( val == null ) { - val = (cType === "input") ? parseFloat(control.val()) : control[0].selectedIndex; - } - percent = (parseFloat(val) - min) / (max - min) * 100; - } - - if ( isNaN(percent) ) { return; } - if ( percent < 0 ) { percent = 0; } - if ( percent > 100 ) { percent = 100; } - - var newval = Math.round( (percent / 100) * (max - min) ) + min; - if ( newval < min ) { newval = min; } - if ( newval > max ) { newval = max; } - - //flip the stack of the bg colors - if ( percent > 60 && cType === "select" ) { - - } - this.handle.css("left", percent + "%"); - this.handle.attr({ - "aria-valuenow": (cType === "input") ? newval : control.find("option").eq(newval).attr("value"), - "aria-valuetext": (cType === "input") ? newval : control.find("option").eq(newval).text(), - title: newval - }); - - // add/remove classes for flip toggle switch - if ( cType === "select" ) { - if ( newval === 0 ) { - this.slider.addClass("ui-slider-switch-a") - .removeClass("ui-slider-switch-b"); - } else { - this.slider.addClass("ui-slider-switch-b") - .removeClass("ui-slider-switch-a"); - } - } - - if(!preventInputUpdate){ - // update control's value - if ( cType === "input" ) { - control.val(newval); - } else { - control[ 0 ].selectedIndex = newval; - } - if (!isfromControl) { control.trigger("change"); } - } - }, - - enable: function(){ - this.element.attr("disabled", false); - this.slider.removeClass("ui-disabled").attr("aria-disabled", false); - return this._setOption("disabled", false); - }, - - disable: function(){ - this.element.attr("disabled", true); - this.slider.addClass("ui-disabled").attr("aria-disabled", true); - return this._setOption("disabled", true); - } - -}); -})( jQuery ); - -/* -* jQuery Mobile Framework : "collapsible" plugin -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.widget( "mobile.collapsible", $.mobile.widget, { - options: { - expandCueText: ' click to expand contents', - collapseCueText: ' click to collapse contents', - collapsed: false, - heading: '>:header,>legend', - theme: null, - iconTheme: 'd' - }, - _create: function(){ - - var $el = this.element, - o = this.options, - collapsibleContain = $el.addClass('ui-collapsible-contain'), - collapsibleHeading = $el.find(o.heading).eq(0), - collapsibleContent = collapsibleContain.wrapInner('
    ').find('.ui-collapsible-content'), - collapsibleParent = $el.closest( ":jqmData(role='collapsible-set')" ).addClass('ui-collapsible-set'); - - //replace collapsibleHeading if it's a legend - if(collapsibleHeading.is('legend')){ - collapsibleHeading = $('
    '+ collapsibleHeading.html() +'
    ').insertBefore(collapsibleHeading); - collapsibleHeading.next().remove(); - } - - //drop heading in before content - collapsibleHeading.insertBefore(collapsibleContent); - - //modify markup & attributes - collapsibleHeading.addClass('ui-collapsible-heading') - .append('') - .wrapInner('') - .find('a:eq(0)') - .buttonMarkup({ - shadow: !!!collapsibleParent.length, - corners:false, - iconPos: 'left', - icon: 'plus', - theme: o.theme - }) - .find('.ui-icon') - .removeAttr('class') - .buttonMarkup({ - shadow: true, - corners:true, - iconPos: 'notext', - icon: 'plus', - theme: o.iconTheme - }); - - if( !collapsibleParent.length ){ - collapsibleHeading - .find('a:eq(0)') - .addClass('ui-corner-all') - .find('.ui-btn-inner') - .addClass('ui-corner-all'); - } - else { - if( collapsibleContain.jqmData('collapsible-last') ){ - collapsibleHeading - .find('a:eq(0), .ui-btn-inner') - .addClass('ui-corner-bottom'); - } - } - - - //events - collapsibleContain - .bind('collapse', function(event){ - if( !event.isDefaultPrevented() ){ - event.preventDefault(); - collapsibleHeading - .addClass('ui-collapsible-heading-collapsed') - .find('.ui-collapsible-heading-status').text(o.expandCueText); - - collapsibleHeading.find('.ui-icon').removeClass('ui-icon-minus').addClass('ui-icon-plus'); - collapsibleContent.addClass('ui-collapsible-content-collapsed').attr('aria-hidden',true); - - if( collapsibleContain.jqmData('collapsible-last') ){ - collapsibleHeading - .find('a:eq(0), .ui-btn-inner') - .addClass('ui-corner-bottom'); - } - } - - }) - .bind('expand', function(event){ - if( !event.isDefaultPrevented() ){ - event.preventDefault(); - collapsibleHeading - .removeClass('ui-collapsible-heading-collapsed') - .find('.ui-collapsible-heading-status').text(o.collapseCueText); - - collapsibleHeading.find('.ui-icon').removeClass('ui-icon-plus').addClass('ui-icon-minus'); - collapsibleContent.removeClass('ui-collapsible-content-collapsed').attr('aria-hidden',false); - - if( collapsibleContain.jqmData('collapsible-last') ){ - collapsibleHeading - .find('a:eq(0), .ui-btn-inner') - .removeClass('ui-corner-bottom'); - } - - } - }) - .trigger(o.collapsed ? 'collapse' : 'expand'); - - - //close others in a set - if( collapsibleParent.length && !collapsibleParent.jqmData("collapsiblebound") ){ - collapsibleParent - .jqmData("collapsiblebound", true) - .bind("expand", function( event ){ - $(this).find( ".ui-collapsible-contain" ) - .not( $(event.target).closest( ".ui-collapsible-contain" ) ) - .not( "> .ui-collapsible-contain .ui-collapsible-contain" ) - .trigger( "collapse" ); - }); - var set = collapsibleParent.find( ":jqmData(role=collapsible)" ) - - set.first() - .find('a:eq(0)') - .addClass('ui-corner-top') - .find('.ui-btn-inner') - .addClass('ui-corner-top'); - - set.last().jqmData('collapsible-last', true) - } - - collapsibleHeading - .bind("vclick", function(e){ - if( collapsibleHeading.is('.ui-collapsible-heading-collapsed') ){ - collapsibleContain.trigger('expand'); - } - else { - collapsibleContain.trigger('collapse'); - } - e.preventDefault(); - }); - } -}); -})( jQuery );/* -* jQuery Mobile Framework: "controlgroup" plugin - corner-rounding for groups of buttons, checks, radios, etc -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.fn.controlgroup = function(options){ - - return this.each(function(){ - var o = $.extend({ - direction: $( this ).jqmData( "type" ) || "vertical", - shadow: false - },options); - var groupheading = $(this).find('>legend'), - flCorners = o.direction == 'horizontal' ? ['ui-corner-left', 'ui-corner-right'] : ['ui-corner-top', 'ui-corner-bottom'], - type = $(this).find('input:eq(0)').attr('type'); - - //replace legend with more stylable replacement div - if( groupheading.length ){ - $(this).wrapInner('
    '); - $('
    '+ groupheading.html() +'
    ').insertBefore( $(this).children(0) ); - groupheading.remove(); - } - - $(this).addClass('ui-corner-all ui-controlgroup ui-controlgroup-'+o.direction); - - function flipClasses(els){ - els - .removeClass('ui-btn-corner-all ui-shadow') - .eq(0).addClass(flCorners[0]) - .end() - .filter(':last').addClass(flCorners[1]).addClass('ui-controlgroup-last'); - } - flipClasses($(this).find('.ui-btn')); - flipClasses($(this).find('.ui-btn-inner')); - if(o.shadow){ - $(this).addClass('ui-shadow'); - } - }); -}; -})(jQuery);/* -* jQuery Mobile Framework : "fieldcontain" plugin - simple class additions to make form row separators -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.fn.fieldcontain = function(options){ - return this.addClass('ui-field-contain ui-body ui-br'); -}; -})(jQuery);/* -* jQuery Mobile Framework : "listview" plugin -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { - -$.widget( "mobile.listview", $.mobile.widget, { - options: { - theme: "c", - countTheme: "c", - headerTheme: "b", - dividerTheme: "b", - splitIcon: "arrow-r", - splitTheme: "b", - inset: false - }, - - _create: function() { - var $list = this.element, - o = this.options; - - // create listview markup - $list - .addClass( "ui-listview" ); - - if ( o.inset ) { - $list.addClass( "ui-listview-inset ui-corner-all ui-shadow" ); - } - - this._itemApply( $list, $list ); - - this.refresh( true ); - - }, - - _itemApply: function( $list, item ) { - // TODO class has to be defined in markup - item.find( ".ui-li-count" ) - .addClass( "ui-btn-up-" + ($list.jqmData( "counttheme" ) || this.options.countTheme) + " ui-btn-corner-all" ); - - item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ); - - item.find( "p, dl" ).addClass( "ui-li-desc" ); - - $list.find( "li" ).find( ">img:eq(0), >:first>img:eq(0)" ).addClass( "ui-li-thumb" ).each(function() { - $( this ).closest( "li" ).addClass( $(this).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" ); - }); - - var aside = item.find( ".ui-li-aside" ); - - if ( aside.length ) { - aside.each(function(i, el) { - $(el).prependTo( $(el).parent() ); //shift aside to front for css float - }); - } - - if ( $.support.cssPseudoElement || !$.nodeName( item[0], "ol" ) ) { - return; - } - }, - - _removeCorners: function(li){ - li - .add( li.find(".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb") ) - .removeClass( "ui-corner-top ui-corner-bottom ui-corner-br ui-corner-bl ui-corner-tr ui-corner-tl" ); - }, - - refresh: function( create ) { - this._createSubPages(); - - var o = this.options, - $list = this.element, - self = this, - dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme, - li = $list.children( "li" ), - counter = $.support.cssPseudoElement || !$.nodeName( $list[0], "ol" ) ? 0 : 1; - - if ( counter ) { - $list.find( ".ui-li-dec" ).remove(); - } - - li.each(function( pos ) { - var item = $( this ), - itemClass = "ui-li"; - - // If we're creating the element, we update it regardless - if ( !create && item.hasClass( "ui-li" ) ) { - return; - } - - var itemTheme = item.jqmData("theme") || o.theme; - - var a = item.find( ">a" ); - - if ( a.length ) { - var icon = item.jqmData("icon"); - - item - .buttonMarkup({ - wrapperEls: "div", - shadow: false, - corners: false, - iconpos: "right", - icon: a.length > 1 || icon === false ? false : icon || "arrow-r", - theme: itemTheme - }); - - a.first().addClass( "ui-link-inherit" ); - - if ( a.length > 1 ) { - itemClass += " ui-li-has-alt"; - - var last = a.last(), - splittheme = $list.jqmData( "splittheme" ) || last.jqmData( "theme" ) || o.splitTheme; - - last - .appendTo(item) - .attr( "title", last.text() ) - .addClass( "ui-li-link-alt" ) - .empty() - .buttonMarkup({ - shadow: false, - corners: false, - theme: itemTheme, - icon: false, - iconpos: false - }) - .find( ".ui-btn-inner" ) - .append( $( "" ).buttonMarkup({ - shadow: true, - corners: true, - theme: splittheme, - iconpos: "notext", - icon: $list.jqmData( "spliticon" ) || last.jqmData( "icon" ) || o.splitIcon - } ) ); - } - - } else if ( item.jqmData( "role" ) === "list-divider" ) { - itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme; - item.attr( "role", "heading" ); - - //reset counter when a divider heading is encountered - if ( counter ) { - counter = 1; - } - - } else { - itemClass += " ui-li-static ui-body-" + itemTheme; - } - - - if( o.inset ){ - if ( pos === 0 ) { - itemClass += " ui-corner-top"; - - item - .add( item.find( ".ui-btn-inner" ) ) - .find( ".ui-li-link-alt" ) - .addClass( "ui-corner-tr" ) - .end() - .find( ".ui-li-thumb" ) - .addClass( "ui-corner-tl" ); - if(item.next().next().length){ - self._removeCorners( item.next() ); - } - - } - if ( pos === li.length - 1 ) { - itemClass += " ui-corner-bottom"; - - item - .add( item.find( ".ui-btn-inner" ) ) - .find( ".ui-li-link-alt" ) - .addClass( "ui-corner-br" ) - .end() - .find( ".ui-li-thumb" ) - .addClass( "ui-corner-bl" ); - - if(item.prev().prev().length){ - self._removeCorners( item.prev() ); - } - } - } - - - if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) { - - var countParent = item.is(".ui-li-static:first") ? item : item.find( ".ui-link-inherit" ); - - countParent - .addClass( "ui-li-jsnumbering" ) - .prepend( "" + (counter++) + ". " ); - } - - item.add( item.find( ".ui-btn-inner" ) ).addClass( itemClass ); - - if ( !create ) { - self._itemApply( $list, item ); - } - }); - }, - - //create a string for ID/subpage url creation - _idStringEscape: function( str ){ - return str.replace(/[^a-zA-Z0-9]/g, '-'); - }, - - _createSubPages: function() { - var parentList = this.element, - parentPage = parentList.closest( ".ui-page" ), - parentId = parentPage.jqmData( "url" ), - o = this.options, - self = this, - persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ); - - $( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function( i ) { - var list = $( this ), - parent = list.parent(), - nodeEls = $( list.prevAll().toArray().reverse() ), - nodeEls = nodeEls.length ? nodeEls : $( "" + $.trim(parent.contents()[ 0 ].nodeValue) + "" ), - title = nodeEls.first().text(),//url limits to first 30 chars of text - id = parentId + "&" + $.mobile.subPageUrlKey + "=" + self._idStringEscape(title + " " + i), - theme = list.jqmData( "theme" ) || o.theme, - countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme, - newPage = list.wrap( "
    " ) - .parent() - .before( "
    " + title + "
    " ) - .after( persistentFooterID ? $( "
    ") : "" ) - .parent() - .attr( "data-" + $.mobile.ns + "url", id ) - .attr( "data-" + $.mobile.ns + "theme", theme ) - .attr( "data-" + $.mobile.ns + "count-theme", countTheme ) - .appendTo( $.mobile.pageContainer ); - - newPage.page(); - var anchor = parent.find('a:first'); - if (!anchor.length) { - anchor = $("").html( nodeEls || title ).prependTo(parent.empty()); - } - anchor.attr('href','#' + id); - }).listview(); - } -}); - -})( jQuery ); -/* -* jQuery Mobile Framework : "listview" filter extension -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { - -$.mobile.listview.prototype.options.filter = false; -$.mobile.listview.prototype.options.filterPlaceholder = "Filter items..."; - -$( ":jqmData(role='listview')" ).live( "listviewcreate", function() { - var list = $( this ), - listview = list.data( "listview" ); - - if ( !listview.options.filter ) { - return; - } - - var wrapper = $( "
    ", { "class": "ui-listview-filter ui-bar-c", "role": "search" } ), - - search = $( "", { - placeholder: listview.options.filterPlaceholder - }) - .attr( "data-" + $.mobile.ns + "type", "search" ) - .bind( "keyup change", function() { - var val = this.value.toLowerCase(), - listItems = list.children(); - listItems.show(); - if ( val ) { - // This handles hiding regular rows without the text we search for - // and any list dividers without regular rows shown under it - var childItems = false, - item; - - for (var i = listItems.length; i >= 0; i--) { - item = $(listItems[i]); - if (item.is("li:jqmData(role=list-divider)")) { - if (!childItems) { - item.hide(); - } - // New bucket! - childItems = false; - } else if (item.text().toLowerCase().indexOf( val ) === -1) { - item.hide(); - } else { - // There's a shown item in the bucket - childItems = true; - } - } - } - }) - .appendTo( wrapper ) - .textinput(); - - if ($( this ).jqmData( "inset" ) ) { - wrapper.addClass( "ui-listview-filter-inset" ); - } - - wrapper.insertBefore( list ); -}); - -})( jQuery ); -/* -* jQuery Mobile Framework : "dialog" plugin. -* Copyright (c) jQuery Project -* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. -* Note: Code is in draft form and is subject to change -*/ -(function($, undefined ) { -$.widget( "mobile.dialog", $.mobile.widget, { - options: { - closeBtnText: "Close" - }, - _create: function(){ - var self = this, - $el = self.element; - - /* class the markup for dialog styling */ - this.element - //add ARIA role - .attr("role","dialog") - .addClass('ui-page ui-dialog ui-body-a') - .find( ":jqmData(role=header)" ) - .addClass('ui-corner-top ui-overlay-shadow') - .prepend( ""+ this.options.closeBtnText +"" ) - .end() - .find('.ui-content:not([class*="ui-body-"])') - .addClass('ui-body-c') - .end() - .find( ".ui-content,:jqmData(role='footer')" ) - .last() - .addClass('ui-corner-bottom ui-overlay-shadow'); - - /* bind events - - clicks and submits should use the closing transition that the dialog opened with - unless a data-transition is specified on the link/form - - if the click was on the close button, or the link has a data-rel="back" it'll go back in history naturally - */ - this.element - .bind( "vclick submit", function(e){ - var $targetel; - if( e.type == "vclick" ){ - $targetel = $(e.target).closest("a"); - } - else{ - $targetel = $(e.target).closest("form"); - } - - if( $targetel.length && !$targetel.jqmData("transition") ){ - $targetel - .attr("data-" + $.mobile.ns + "transition", $.mobile.urlHistory.getActive().transition ) - .attr("data-" + $.mobile.ns + "direction", "reverse"); - } - }); - - }, - - //close method goes back in history - close: function(){ - window.history.back(); - } -}); -})( jQuery );/* -* jQuery Mobile Framework : "navbar" plugin -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.widget( "mobile.navbar", $.mobile.widget, { - options: { - iconpos: 'top', - grid: null - }, - _create: function(){ - var $navbar = this.element, - $navbtns = $navbar.find("a"), - iconpos = $navbtns.filter( ":jqmData(icon)").length ? this.options.iconpos : undefined; - - $navbar - .addClass('ui-navbar') - .attr("role","navigation") - .find("ul") - .grid({grid: this.options.grid }); - - if( !iconpos ){ - $navbar.addClass("ui-navbar-noicons"); - } - - $navbtns - .buttonMarkup({ - corners: false, - shadow: false, - iconpos: iconpos - }); - - $navbar.delegate("a", "vclick",function(event){ - $navbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass ); - $( this ).addClass( $.mobile.activeBtnClass ); - }); - } -}); -})( jQuery ); -/* -* jQuery Mobile Framework : plugin for creating CSS grids -* Copyright (c) jQuery Project -* Dual licensed under the MIT or GPL Version 2 licenses. -* http://jquery.org/license -*/ -(function($, undefined ) { -$.fn.grid = function(options){ - return this.each(function(){ - var o = $.extend({ - grid: null - },options); - - - var $kids = $(this).children(), - gridCols = {solo:1, a:2, b:3, c:4, d:5}, - grid = o.grid, - iterator; - - if( !grid ){ - if( $kids.length <= 5 ){ - for(var letter in gridCols){ - if(gridCols[letter] == $kids.length){ grid = letter; } - } - } - else{ - grid = 'a'; - } - } - iterator = gridCols[grid]; - - $(this).addClass('ui-grid-' + grid); - - $kids.filter(':nth-child(' + iterator + 'n+1)').addClass('ui-block-a'); - if(iterator > 1){ - $kids.filter(':nth-child(' + iterator + 'n+2)').addClass('ui-block-b'); - } - if(iterator > 2){ - $kids.filter(':nth-child(3n+3)').addClass('ui-block-c'); - } - if(iterator > 3){ - $kids.filter(':nth-child(4n+4)').addClass('ui-block-d'); - } - if(iterator > 4){ - $kids.filter(':nth-child(5n+5)').addClass('ui-block-e'); - } - - }); -}; -})(jQuery);/*! - * jQuery Mobile v@VERSION - * http://jquerymobile.com/ - * - * Copyright 2010, jQuery Project - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - */ - -(function( $, window, undefined ) { - var $html = $( "html" ), - $head = $( "head" ), - $window = $( window ); - - //trigger mobileinit event - useful hook for configuring $.mobile settings before they're used - $( window.document ).trigger( "mobileinit" ); - - //support conditions - //if device support condition(s) aren't met, leave things as they are -> a basic, usable experience, - //otherwise, proceed with the enhancements - if ( !$.mobile.gradeA() ) { - return; - } - - //add mobile, initial load "rendering" classes to docEl - $html.addClass( "ui-mobile ui-mobile-rendering" ); - - //define & prepend meta viewport tag, if content is defined - //NOTE: this is now deprecated. We recommend placing the meta viewport element in - //the markup from the start. - $.mobile.metaViewportContent && !$head.find( "meta[name='viewport']" ).length ? $( "", { name: "viewport", content: $.mobile.metaViewportContent}).prependTo( $head ) : undefined; - - //loading div which appears during Ajax requests - //will not appear if $.mobile.loadingMessage is false - var $loader = $.mobile.loadingMessage ? $( "
    " + "" + "

    " + $.mobile.loadingMessage + "

    " + "
    " ) : undefined; - - if(typeof $loader === "undefined"){ - alert($.mobile.loadingMessage); - } - - $.extend($.mobile, { - // turn on/off page loading message. - pageLoading: function ( done ) { - if ( done ) { - $html.removeClass( "ui-loading" ); - } else { - if( $.mobile.loadingMessage ){ - var activeBtn = $( "." + $.mobile.activeBtnClass ).first(); - - - if(typeof $loader === "undefined"){ - alert($.mobile.loadingMessage); - } - - $loader - .appendTo( $.mobile.pageContainer ) - //position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top - .css( { - top: $.support.scrollTop && $(window).scrollTop() + $(window).height() / 2 || - activeBtn.length && activeBtn.offset().top || 100 - } ); - } - - $html.addClass( "ui-loading" ); - } - }, - - // find and enhance the pages in the dom and transition to the first page. - initializePage: function(){ - //find present pages - var $pages = $( ":jqmData(role='page')" ); - - //add dialogs, set data-url attrs - $pages.add( ":jqmData(role='dialog')" ).each(function(){ - var $this = $(this); - - // unless the data url is already set set it to the id - if( !$this.jqmData('url') ){ - $this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) ); - } - }); - - //define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback) - $.mobile.firstPage = $pages.first(); - - //define page container - $.mobile.pageContainer = $pages.first().parent().addClass( "ui-mobile-viewport" ); - - //cue page loading message - $.mobile.pageLoading(); - - // if hashchange listening is disabled or there's no hash deeplink, change to the first page in the DOM - if( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ){ - $.mobile.changePage( $.mobile.firstPage, false, true, false, true ); - } - // otherwise, trigger a hashchange to load a deeplink - else { - $window.trigger( "hashchange", [ true ] ); - } - } - }); - - //dom-ready inits - $( $.mobile.initializePage ); - - //window load event - //hide iOS browser chrome on load - $window.load( $.mobile.silentScroll ); -})( jQuery, this ); - --- /dev/null +++ b/js/jquery.mobile-1.0rc1.js @@ -1,1 +1,6765 @@ - +/*! + * jQuery Mobile v1.0rc1 + * http://jquerymobile.com/ + * + * Copyright 2010, jQuery Project + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + */ +/*! + * jQuery UI Widget @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function( $, undefined ) { + +// jQuery 1.4+ +if ( $.cleanData ) { + var _cleanData = $.cleanData; + $.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $( elem ).triggerHandler( "remove" ); + } + _cleanData( elems ); + }; +} else { + var _remove = $.fn.remove; + $.fn.remove = function( selector, keepData ) { + return this.each(function() { + if ( !keepData ) { + if ( !selector || $.filter( selector, [ this ] ).length ) { + $( "*", this ).add( [ this ] ).each(function() { + $( this ).triggerHandler( "remove" ); + }); + } + } + return _remove.call( $(this), selector, keepData ); + }); + }; +} + +$.widget = function( name, base, prototype ) { + var namespace = name.split( "." )[ 0 ], + fullName; + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName ] = function( elem ) { + return !!$.data( elem, name ); + }; + + $[ namespace ] = $[ namespace ] || {}; + $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + var basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from +// $.each( basePrototype, function( key, val ) { +// if ( $.isPlainObject(val) ) { +// basePrototype[ key ] = $.extend( {}, val ); +// } +// }); + basePrototype.options = $.extend( true, {}, basePrototype.options ); + $[ namespace ][ name ].prototype = $.extend( true, basePrototype, { + namespace: namespace, + widgetName: name, + widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name, + widgetBaseClass: fullName + }, prototype ); + + $.widget.bridge( name, $[ namespace ][ name ] ); +}; + +$.widget.bridge = function( name, object ) { + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = Array.prototype.slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.extend.apply( null, [ true, options ].concat(args) ) : + options; + + // prevent calls to internal methods + if ( isMethodCall && options.charAt( 0 ) === "_" ) { + return returnValue; + } + + if ( isMethodCall ) { + this.each(function() { + var instance = $.data( this, name ); + if ( !instance ) { + throw "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'"; + } + if ( !$.isFunction( instance[options] ) ) { + throw "no such method '" + options + "' for " + name + " widget instance"; + } + var methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, name ); + if ( instance ) { + instance.option( options || {} )._init(); + } else { + $.data( this, name, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } +}; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + options: { + disabled: false + }, + _createWidget: function( options, element ) { + // $.widget.bridge stores the plugin instance, but we do it anyway + // so that it's stored even before the _create function runs + $.data( element, this.widgetName, this ); + this.element = $( element ); + this.options = $.extend( true, {}, + this.options, + this._getCreateOptions(), + options ); + + var self = this; + this.element.bind( "remove." + this.widgetName, function() { + self.destroy(); + }); + + this._create(); + this._trigger( "create" ); + this._init(); + }, + _getCreateOptions: function() { + var options = {}; + if ( $.metadata ) { + options = $.metadata.get( element )[ this.widgetName ]; + } + return options; + }, + _create: function() {}, + _init: function() {}, + + destroy: function() { + this.element + .unbind( "." + this.widgetName ) + .removeData( this.widgetName ); + this.widget() + .unbind( "." + this.widgetName ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetBaseClass + "-disabled " + + "ui-state-disabled" ); + }, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.extend( {}, this.options ); + } + + if (typeof key === "string" ) { + if ( value === undefined ) { + return this.options[ key ]; + } + options = {}; + options[ key ] = value; + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var self = this; + $.each( options, function( key, value ) { + self._setOption( key, value ); + }); + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + [ value ? "addClass" : "removeClass"]( + this.widgetBaseClass + "-disabled" + " " + + "ui-state-disabled" ) + .attr( "aria-disabled", value ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _trigger: function( type, event, data ) { + var callback = this.options[ type ]; + + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + data = data || {}; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if ( event.originalEvent ) { + for ( var i = $.event.props.length, prop; i; ) { + prop = $.event.props[ --i ]; + event[ prop ] = event.originalEvent[ prop ]; + } + } + + this.element.trigger( event, data ); + + return !( $.isFunction(callback) && + callback.call( this.element[0], event, data ) === false || + event.isDefaultPrevented() ); + } +}; + +})( jQuery ); +/* +* jQuery Mobile Framework : widget factory extentions for mobile +* Copyright (c) jQuery Project +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +*/ + +(function( $, undefined ) { + +$.widget( "mobile.widget", { + // decorate the parent _createWidget to trigger `widgetinit` for users + // who wish to do post post `widgetcreate` alterations/additions + // + // TODO create a pull request for jquery ui to trigger this event + // in the original _createWidget + _createWidget: function() { + $.Widget.prototype._createWidget.apply( this, arguments ); + this._trigger( 'init' ); + }, + + _getCreateOptions: function() { + + var elem = this.element, + options = {}; + + $.each( this.options, function( option ) { + + var value = elem.jqmData( option.replace( /[A-Z]/g, function( c ) { + return "-" + c.toLowerCase(); + }) + ); + + if ( value !== undefined ) { + options[ option ] = value; + } + }); + + return options; + } +}); + +})( jQuery ); +/* +* jQuery Mobile Framework : a workaround for window.matchMedia +* Copyright (c) jQuery Project +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +*/ +(function( $, undefined ) { + +var $window = $( window ), + $html = $( "html" ); + +/* $.mobile.media method: pass a CSS media type or query and get a bool return + note: this feature relies on actual media query support for media queries, though types will work most anywhere + examples: + $.mobile.media('screen') //>> tests for screen media type + $.mobile.media('screen and (min-width: 480px)') //>> tests for screen media type with window width > 480px + $.mobile.media('@media screen and (-webkit-min-device-pixel-ratio: 2)') //>> tests for webkit 2x pixel ratio (iPhone 4) +*/ +$.mobile.media = (function() { + // TODO: use window.matchMedia once at least one UA implements it + var cache = {}, + testDiv = $( "
    " ), + fakeBody = $( "" ).append( testDiv ); + + return function( query ) { + if ( !( query in cache ) ) { + var styleBlock = document.createElement( "style" ), + cssrule = "@media " + query + " { #jquery-mediatest { position:absolute; } }"; + + //must set type for IE! + styleBlock.type = "text/css"; + + if ( styleBlock.styleSheet ){ + styleBlock.styleSheet.cssText = cssrule; + } else { + styleBlock.appendChild( document.createTextNode(cssrule) ); + } + + $html.prepend( fakeBody ).prepend( styleBlock ); + cache[ query ] = testDiv.css( "position" ) === "absolute"; + fakeBody.add( styleBlock ).remove(); + } + return cache[ query ]; + }; +})(); + +})(jQuery);/* +* jQuery Mobile Framework : support tests +* Copyright (c) jQuery Project +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +(function( $, undefined ) { + +var fakeBody = $( "" ).prependTo( "html" ), + fbCSS = fakeBody[ 0 ].style, + vendors = [ "Webkit", "Moz", "O" ], + webos = "palmGetResource" in window, //only used to rule out scrollTop + bb = window.blackberry; //only used to rule out box shadow, as it's filled opaque on BB + +// thx Modernizr +function propExists( prop ) { + var uc_prop = prop.charAt( 0 ).toUpperCase() + prop.substr( 1 ), + props = ( prop + " " + vendors.join( uc_prop + " " ) + uc_prop ).split( " " ); + + for ( var v in props ){ + if ( fbCSS[ props[ v ] ] !== undefined ) { + return true; + } + } +} + +// Test for dynamic-updating base tag support ( allows us to avoid href,src attr rewriting ) +function baseTagTest() { + var fauxBase = location.protocol + "//" + location.host + location.pathname + "ui-dir/", + base = $( "head base" ), + fauxEle = null, + href = "", + link, rebase; + + if ( !base.length ) { + base = fauxEle = $( "", { "href": fauxBase }).appendTo( "head" ); + } else { + href = base.attr( "href" ); + } + + link = $( "" ).prependTo( fakeBody ); + rebase = link[ 0 ].href; + base[ 0 ].href = href ? href : location.pathname; + + if ( fauxEle ) { + fauxEle.remove(); + } + return rebase.indexOf( fauxBase ) === 0; +} + + +// non-UA-based IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683 +// allows for inclusion of IE 6+, including Windows Mobile 7 +$.mobile.browser = {}; +$.mobile.browser.ie = (function() { + var v = 3, + div = document.createElement( "div" ), + a = div.all || []; + + while ( div.innerHTML = "", a[ 0 ] ); + + return v > 4 ? v : !v; +})(); + + +$.extend( $.support, { + orientation: "orientation" in window, + touch: "ontouchend" in document, + cssTransitions: "WebKitTransitionEvent" in window, + pushState: "pushState" in history && "replaceState" in history, + mediaquery: $.mobile.media( "only all" ), + cssPseudoElement: !!propExists( "content" ), + touchOverflow: !!propExists( "overflowScrolling" ), + boxShadow: !!propExists( "boxShadow" ) && !bb, + scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos, + dynamicBaseTag: baseTagTest() +}); + +fakeBody.remove(); + + +// $.mobile.ajaxBlacklist is used to override ajaxEnabled on platforms that have known conflicts with hash history updates (BB5, Symbian) +// or that generally work better browsing in regular http for full page refreshes (Opera Mini) +// Note: This detection below is used as a last resort. +// We recommend only using these detection methods when all other more reliable/forward-looking approaches are not possible +var nokiaLTE7_3 = (function(){ + + var ua = window.navigator.userAgent; + + //The following is an attempt to match Nokia browsers that are running Symbian/s60, with webkit, version 7.3 or older + return ua.indexOf( "Nokia" ) > -1 && + ( ua.indexOf( "Symbian/3" ) > -1 || ua.indexOf( "Series60/5" ) > -1 ) && + ua.indexOf( "AppleWebKit" ) > -1 && + ua.match( /(BrowserNG|NokiaBrowser)\/7\.[0-3]/ ); +})(); + +$.mobile.ajaxBlacklist = + // BlackBerry browsers, pre-webkit + window.blackberry && !window.WebKitPoint || + // Opera Mini + window.operamini && Object.prototype.toString.call( window.operamini ) === "[object OperaMini]" || + // Symbian webkits pre 7.3 + nokiaLTE7_3; + +// Lastly, this workaround is the only way we've found so far to get pre 7.3 Symbian webkit devices +// to render the stylesheets when they're referenced before this script, as we'd recommend doing. +// This simply reappends the CSS in place, which for some reason makes it apply +if ( nokiaLTE7_3 ) { + $(function() { + $( "head link[rel=stylesheet]" ).attr( "rel", "alternate stylesheet" ).attr( "rel", "stylesheet" ); + }); +} + +// For ruling out shadows via css +if ( !$.support.boxShadow ) { + $( "html" ).addClass( "ui-mobile-nosupport-boxshadow" ); +} + +})( jQuery );/* +* jQuery Mobile Framework : "mouse" plugin +* Copyright (c) jQuery Project +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +*/ + +// This plugin is an experiment for abstracting away the touch and mouse +// events so that developers don't have to worry about which method of input +// the device their document is loaded on supports. +// +// The idea here is to allow the developer to register listeners for the +// basic mouse events, such as mousedown, mousemove, mouseup, and click, +// and the plugin will take care of registering the correct listeners +// behind the scenes to invoke the listener at the fastest possible time +// for that device, while still retaining the order of event firing in +// the traditional mouse environment, should multiple handlers be registered +// on the same element for different events. +// +// The current version exposes the following virtual events to jQuery bind methods: +// "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel" + +(function( $, window, document, undefined ) { + +var dataPropertyName = "virtualMouseBindings", + touchTargetPropertyName = "virtualTouchID", + virtualEventNames = "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split( " " ), + touchEventProps = "clientX clientY pageX pageY screenX screenY".split( " " ), + activeDocHandlers = {}, + resetTimerID = 0, + startX = 0, + startY = 0, + didScroll = false, + clickBlockList = [], + blockMouseTriggers = false, + blockTouchTriggers = false, + eventCaptureSupported = "addEventListener" in document, + $document = $( document ), + nextTouchID = 1, + lastTouchID = 0; + +$.vmouse = { + moveDistanceThreshold: 10, + clickDistanceThreshold: 10, + resetTimerDuration: 1500 +}; + +function getNativeEvent( event ) { + + while ( event && typeof event.originalEvent !== "undefined" ) { + event = event.originalEvent; + } + return event; +} + +function createVirtualEvent( event, eventType ) { + + var t = event.type, + oe, props, ne, prop, ct, touch, i, j; + + event = $.Event(event); + event.type = eventType; + + oe = event.originalEvent; + props = $.event.props; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if ( oe ) { + for ( i = props.length, prop; i; ) { + prop = props[ --i ]; + event[ prop ] = oe[ prop ]; + } + } + + // make sure that if the mouse and click virtual events are generated + // without a .which one is defined + if ( t.search(/mouse(down|up)|click/) > -1 && !event.which ){ + event.which = 1; + } + + if ( t.search(/^touch/) !== -1 ) { + ne = getNativeEvent( oe ); + t = ne.touches; + ct = ne.changedTouches; + touch = ( t && t.length ) ? t[0] : ( (ct && ct.length) ? ct[ 0 ] : undefined ); + + if ( touch ) { + for ( j = 0, len = touchEventProps.length; j < len; j++){ + prop = touchEventProps[ j ]; + event[ prop ] = touch[ prop ]; + } + } + } + + return event; +} + +function getVirtualBindingFlags( element ) { + + var flags = {}, + b, k; + + while ( element ) { + + b = $.data( element, dataPropertyName ); + + for ( k in b ) { + if ( b[ k ] ) { + flags[ k ] = flags.hasVirtualBinding = true; + } + } + element = element.parentNode; + } + return flags; +} + +function getClosestElementWithVirtualBinding( element, eventType ) { + var b; + while ( element ) { + + b = $.data( element, dataPropertyName ); + + if ( b && ( !eventType || b[ eventType ] ) ) { + return element; + } + element = element.parentNode; + } + return null; +} + +function enableTouchBindings() { + blockTouchTriggers = false; +} + +function disableTouchBindings() { + blockTouchTriggers = true; +} + +function enableMouseBindings() { + lastTouchID = 0; + clickBlockList.length = 0; + blockMouseTriggers = false; + + // When mouse bindings are enabled, our + // touch bindings are disabled. + disableTouchBindings(); +} + +function disableMouseBindings() { + // When mouse bindings are disabled, our + // touch bindings are enabled. + enableTouchBindings(); +} + +function startResetTimer() { + clearResetTimer(); + resetTimerID = setTimeout(function(){ + resetTimerID = 0; + enableMouseBindings(); + }, $.vmouse.resetTimerDuration ); +} + +function clearResetTimer() { + if ( resetTimerID ){ + clearTimeout( resetTimerID ); + resetTimerID = 0; + } +} + +function triggerVirtualEvent( eventType, event, flags ) { + var ve; + + if ( ( flags && flags[ eventType ] ) || + ( !flags && getClosestElementWithVirtualBinding( event.target, eventType ) ) ) { + + ve = createVirtualEvent( event, eventType ); + + $( event.target).trigger( ve ); + } + + return ve; +} + +function mouseEventCallback( event ) { + var touchID = $.data(event.target, touchTargetPropertyName); + + if ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) ){ + var ve = triggerVirtualEvent( "v" + event.type, event ); + if ( ve ) { + if ( ve.isDefaultPrevented() ) { + event.preventDefault(); + } + if ( ve.isPropagationStopped() ) { + event.stopPropagation(); + } + if ( ve.isImmediatePropagationStopped() ) { + event.stopImmediatePropagation(); + } + } + } +} + +function handleTouchStart( event ) { + + var touches = getNativeEvent( event ).touches, + target, flags; + + if ( touches && touches.length === 1 ) { + + target = event.target; + flags = getVirtualBindingFlags( target ); + + if ( flags.hasVirtualBinding ) { + + lastTouchID = nextTouchID++; + $.data( target, touchTargetPropertyName, lastTouchID ); + + clearResetTimer(); + + disableMouseBindings(); + didScroll = false; + + var t = getNativeEvent( event ).touches[ 0 ]; + startX = t.pageX; + startY = t.pageY; + + triggerVirtualEvent( "vmouseover", event, flags ); + triggerVirtualEvent( "vmousedown", event, flags ); + } + } +} + +function handleScroll( event ) { + if ( blockTouchTriggers ) { + return; + } + + if ( !didScroll ) { + triggerVirtualEvent( "vmousecancel", event, getVirtualBindingFlags( event.target ) ); + } + + didScroll = true; + startResetTimer(); +} + +function handleTouchMove( event ) { + if ( blockTouchTriggers ) { + return; + } + + var t = getNativeEvent( event ).touches[ 0 ], + didCancel = didScroll, + moveThreshold = $.vmouse.moveDistanceThreshold; + didScroll = didScroll || + ( Math.abs(t.pageX - startX) > moveThreshold || + Math.abs(t.pageY - startY) > moveThreshold ), + flags = getVirtualBindingFlags( event.target ); + + if ( didScroll && !didCancel ) { + triggerVirtualEvent( "vmousecancel", event, flags ); + } + + triggerVirtualEvent( "vmousemove", event, flags ); + startResetTimer(); +} + +function handleTouchEnd( event ) { + if ( blockTouchTriggers ) { + return; + } + + disableTouchBindings(); + + var flags = getVirtualBindingFlags( event.target ), + t; + triggerVirtualEvent( "vmouseup", event, flags ); + + if ( !didScroll ) { + var ve = triggerVirtualEvent( "vclick", event, flags ); + if ( ve && ve.isDefaultPrevented() ) { + // The target of the mouse events that follow the touchend + // event don't necessarily match the target used during the + // touch. This means we need to rely on coordinates for blocking + // any click that is generated. + t = getNativeEvent( event ).changedTouches[ 0 ]; + clickBlockList.push({ + touchID: lastTouchID, + x: t.clientX, + y: t.clientY + }); + + // Prevent any mouse events that follow from triggering + // virtual event notifications. + blockMouseTriggers = true; + } + } + triggerVirtualEvent( "vmouseout", event, flags); + didScroll = false; + + startResetTimer(); +} + +function hasVirtualBindings( ele ) { + var bindings = $.data( ele, dataPropertyName ), + k; + + if ( bindings ) { + for ( k in bindings ) { + if ( bindings[ k ] ) { + return true; + } + } + } + return false; +} + +function dummyMouseHandler(){} + +function getSpecialEventObject( eventType ) { + var realType = eventType.substr( 1 ); + + return { + setup: function( data, namespace ) { + // If this is the first virtual mouse binding for this element, + // add a bindings object to its data. + + if ( !hasVirtualBindings( this ) ) { + $.data( this, dataPropertyName, {}); + } + + // If setup is called, we know it is the first binding for this + // eventType, so initialize the count for the eventType to zero. + var bindings = $.data( this, dataPropertyName ); + bindings[ eventType ] = true; + + // If this is the first virtual mouse event for this type, + // register a global handler on the document. + + activeDocHandlers[ eventType ] = ( activeDocHandlers[ eventType ] || 0 ) + 1; + + if ( activeDocHandlers[ eventType ] === 1 ) { + $document.bind( realType, mouseEventCallback ); + } + + // Some browsers, like Opera Mini, won't dispatch mouse/click events + // for elements unless they actually have handlers registered on them. + // To get around this, we register dummy handlers on the elements. + + $( this ).bind( realType, dummyMouseHandler ); + + // For now, if event capture is not supported, we rely on mouse handlers. + if ( eventCaptureSupported ) { + // If this is the first virtual mouse binding for the document, + // register our touchstart handler on the document. + + activeDocHandlers[ "touchstart" ] = ( activeDocHandlers[ "touchstart" ] || 0) + 1; + + if (activeDocHandlers[ "touchstart" ] === 1) { + $document.bind( "touchstart", handleTouchStart ) + .bind( "touchend", handleTouchEnd ) + + // On touch platforms, touching the screen and then dragging your finger + // causes the window content to scroll after some distance threshold is + // exceeded. On these platforms, a scroll prevents a click event from being + // dispatched, and on some platforms, even the touchend is suppressed. To + // mimic the suppression of the click event, we need to watch for a scroll + // event. Unfortunately, some platforms like iOS don't dispatch scroll + // events until *AFTER* the user lifts their finger (touchend). This means + // we need to watch both scroll and touchmove events to figure out whether + // or not a scroll happenens before the touchend event is fired. + + .bind( "touchmove", handleTouchMove ) + .bind( "scroll", handleScroll ); + } + } + }, + + teardown: function( data, namespace ) { + // If this is the last virtual binding for this eventType, + // remove its global handler from the document. + + --activeDocHandlers[ eventType ]; + + if ( !activeDocHandlers[ eventType ] ) { + $document.unbind( realType, mouseEventCallback ); + } + + if ( eventCaptureSupported ) { + // If this is the last virtual mouse binding in existence, + // remove our document touchstart listener. + + --activeDocHandlers[ "touchstart" ]; + + if ( !activeDocHandlers[ "touchstart" ] ) { + $document.unbind( "touchstart", handleTouchStart ) + .unbind( "touchmove", handleTouchMove ) + .unbind( "touchend", handleTouchEnd ) + .unbind( "scroll", handleScroll ); + } + } + + var $this = $( this ), + bindings = $.data( this, dataPropertyName ); + + // teardown may be called when an element was + // removed from the DOM. If this is the case, + // jQuery core may have already stripped the element + // of any data bindings so we need to check it before + // using it. + if ( bindings ) { + bindings[ eventType ] = false; + } + + // Unregister the dummy event handler. + + $this.unbind( realType, dummyMouseHandler ); + + // If this is the last virtual mouse binding on the + // element, remove the binding data from the element. + + if ( !hasVirtualBindings( this ) ) { + $this.removeData( dataPropertyName ); + } + } + }; +} + +// Expose our custom events to the jQuery bind/unbind mechanism. + +for ( var i = 0; i < virtualEventNames.length; i++ ){ + $.event.special[ virtualEventNames[ i ] ] = getSpecialEventObject( virtualEventNames[ i ] ); +} + +// Add a capture click handler to block clicks. +// Note that we require event capture support for this so if the device +// doesn't support it, we punt for now and rely solely on mouse events. +if ( eventCaptureSupported ) { + document.addEventListener( "click", function( e ){ + var cnt = clickBlockList.length, + target = e.target, + x, y, ele, i, o, touchID; + + if ( cnt ) { + x = e.clientX; + y = e.clientY; + threshold = $.vmouse.clickDistanceThreshold; + + // The idea here is to run through the clickBlockList to see if + // the current click event is in the proximity of one of our + // vclick events that had preventDefault() called on it. If we find + // one, then we block the click. + // + // Why do we have to rely on proximity? + // + // Because the target of the touch event that triggered the vclick + // can be different from the target of the click event synthesized + // by the browser. The target of a mouse/click event that is syntehsized + // from a touch event seems to be implementation specific. For example, + // some browsers will fire mouse/click events for a link that is near + // a touch event, even though the target of the touchstart/touchend event + // says the user touched outside the link. Also, it seems that with most + // browsers, the target of the mouse/click event is not calculated until the + // time it is dispatched, so if you replace an element that you touched + // with another element, the target of the mouse/click will be the new + // element underneath that point. + // + // Aside from proximity, we also check to see if the target and any + // of its ancestors were the ones that blocked a click. This is necessary + // because of the strange mouse/click target calculation done in the + // Android 2.1 browser, where if you click on an element, and there is a + // mouse/click handler on one of its ancestors, the target will be the + // innermost child of the touched element, even if that child is no where + // near the point of touch. + + ele = target; + + while ( ele ) { + for ( i = 0; i < cnt; i++ ) { + o = clickBlockList[ i ]; + touchID = 0; + + if ( ( ele === target && Math.abs( o.x - x ) < threshold && Math.abs( o.y - y ) < threshold ) || + $.data( ele, touchTargetPropertyName ) === o.touchID ) { + // XXX: We may want to consider removing matches from the block list + // instead of waiting for the reset timer to fire. + e.preventDefault(); + e.stopPropagation(); + return; + } + } + ele = ele.parentNode; + } + } + }, true); +} +})( jQuery, window, document ); +/* +* jQuery Mobile Framework : events +* Copyright (c) jQuery Project +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +*/ +(function( $, window, undefined ) { + +// add new event shortcuts +$.each( ( "touchstart touchmove touchend orientationchange throttledresize " + + "tap taphold swipe swipeleft swiperight scrollstart scrollstop" ).split( " " ), function( i, name ) { + + $.fn[ name ] = function( fn ) { + return fn ? this.bind( name, fn ) : this.trigger( name ); + }; + + $.attrFn[ name ] = true; +}); + +var supportTouch = $.support.touch, + scrollEvent = "touchmove scroll", + touchStartEvent = supportTouch ? "touchstart" : "mousedown", + touchStopEvent = supportTouch ? "touchend" : "mouseup", + touchMoveEvent = supportTouch ? "touchmove" : "mousemove"; + +function triggerCustomEvent( obj, eventType, event ) { + var originalType = event.type; + event.type = eventType; + $.event.handle.call( obj, event ); + event.type = originalType; +} + +// also handles scrollstop +$.event.special.scrollstart = { + + enabled: true, + + setup: function() { + + var thisObject = this, + $this = $( thisObject ), + scrolling, + timer; + + function trigger( event, state ) { + scrolling = state; + triggerCustomEvent( thisObject, scrolling ? "scrollstart" : "scrollstop", event ); + } + + // iPhone triggers scroll after a small delay; use touchmove instead + $this.bind( scrollEvent, function( event ) { + + if ( !$.event.special.scrollstart.enabled ) { + return; + } + + if ( !scrolling ) { + trigger( event, true ); + } + + clearTimeout( timer ); + timer = setTimeout(function() { + trigger( event, false ); + }, 50 ); + }); + } +}; + +// also handles taphold +$.event.special.tap = { + setup: function() { + var thisObject = this, + $this = $( thisObject ); + + $this.bind( "vmousedown", function( event ) { + + if ( event.which && event.which !== 1 ) { + return false; + } + + var origTarget = event.target, + origEvent = event.originalEvent, + timer; + + function clearTapTimer() { + clearTimeout( timer ); + } + + function clearTapHandlers() { + clearTapTimer(); + + $this.unbind( "vclick", clickHandler ) + .unbind( "vmouseup", clearTapTimer ) + .unbind( "vmousecancel", clearTapHandlers ); + } + + function clickHandler(event) { + clearTapHandlers(); + + // ONLY trigger a 'tap' event if the start target is + // the same as the stop target. + if ( origTarget == event.target ) { + triggerCustomEvent( thisObject, "tap", event ); + } + } + + $this.bind( "vmousecancel", clearTapHandlers ) + .bind( "vmouseup", clearTapTimer ) + .bind( "vclick", clickHandler ); + + timer = setTimeout(function() { + triggerCustomEvent( thisObject, "taphold", $.Event( "taphold" ) ); + }, 750 ); + }); + } +}; + +// also handles swipeleft, swiperight +$.event.special.swipe = { + scrollSupressionThreshold: 10, // More than this horizontal displacement, and we will suppress scrolling. + + durationThreshold: 1000, // More time than this, and it isn't a swipe. + + horizontalDistanceThreshold: 30, // Swipe horizontal displacement must be more than this. + + verticalDistanceThreshold: 75, // Swipe vertical displacement must be less than this. + + setup: function() { + var thisObject = this, + $this = $( thisObject ); + + $this.bind( touchStartEvent, function( event ) { + var data = event.originalEvent.touches ? + event.originalEvent.touches[ 0 ] : event, + start = { + time: ( new Date() ).getTime(), + coords: [ data.pageX, data.pageY ], + origin: $( event.target ) + }, + stop; + + function moveHandler( event ) { + + if ( !start ) { + return; + } + + var data = event.originalEvent.touches ? + event.originalEvent.touches[ 0 ] : event; + + stop = { + time: ( new Date() ).getTime(), + coords: [ data.pageX, data.pageY ] + }; + + // prevent scrolling + if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) { + event.preventDefault(); + } + } + + $this.bind( touchMoveEvent, moveHandler ) + .one( touchStopEvent, function( event ) { + $this.unbind( touchMoveEvent, moveHandler ); + + if ( start && stop ) { + if ( stop.time - start.time < $.event.special.swipe.durationThreshold && + Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold && + Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) { + + start.origin.trigger( "swipe" ) + .trigger( start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight" ); + } + } + start = stop = undefined; + }); + }); + } +}; + +(function( $, window ) { + // "Cowboy" Ben Alman + + var win = $( window ), + special_event, + get_orientation, + last_orientation; + + $.event.special.orientationchange = special_event = { + setup: function() { + // If the event is supported natively, return false so that jQuery + // will bind to the event using DOM methods. + if ( $.support.orientation ) { + return false; + } + + // Get the current orientation to avoid initial double-triggering. + last_orientation = get_orientation(); + + // Because the orientationchange event doesn't exist, simulate the + // event by testing window dimensions on resize. + win.bind( "throttledresize", handler ); + }, + teardown: function(){ + // If the event is not supported natively, return false so that + // jQuery will unbind the event using DOM methods. + if ( $.support.orientation ) { + return false; + } + + // Because the orientationchange event doesn't exist, unbind the + // resize event handler. + win.unbind( "throttledresize", handler ); + }, + add: function( handleObj ) { + // Save a reference to the bound event handler. + var old_handler = handleObj.handler; + + handleObj.handler = function( event ) { + // Modify event object, adding the .orientation property. + event.orientation = get_orientation(); + + // Call the originally-bound event handler and return its result. + return old_handler.apply( this, arguments ); + }; + } + }; + + // If the event is not supported natively, this handler will be bound to + // the window resize event to simulate the orientationchange event. + function handler() { + // Get the current orientation. + var orientation = get_orientation(); + + if ( orientation !== last_orientation ) { + // The orientation has changed, so trigger the orientationchange event. + last_orientation = orientation; + win.trigger( "orientationchange" ); + } + }; + + // Get the current page orientation. This method is exposed publicly, should it + // be needed, as jQuery.event.special.orientationchange.orientation() + $.event.special.orientationchange.orientation = get_orientation = function() { + var elem = document.documentElement; + return elem && elem.clientWidth / elem.clientHeight < 1.1 ? "portrait" : "landscape"; + }; + +})( jQuery, window ); + + +// throttled resize event +(function() { + + $.event.special.throttledresize = { + setup: function() { + $( this ).bind( "resize", handler ); + }, + teardown: function(){ + $( this ).unbind( "resize", handler ); + } + }; + + var throttle = 250, + handler = function() { + curr = ( new Date() ).getTime(); + diff = curr - lastCall; + + if ( diff >= throttle ) { + + lastCall = curr; + $( this ).trigger( "throttledresize" ); + + } else { + + if ( heldCall ) { + clearTimeout( heldCall ); + } + + // Promise a held call will still execute + heldCall = setTimeout( handler, throttle - diff ); + } + }, + lastCall = 0, + heldCall, + curr, + diff; +})(); + + +$.each({ + scrollstop: "scrollstart", + taphold: "tap", + swipeleft: "swipe", + swiperight: "swipe" +}, function( event, sourceEvent ) { + + $.event.special[ event ] = { + setup: function() { + $( this ).bind( sourceEvent, $.noop ); + } + }; +}); + +})( jQuery, this ); +/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ + +// Script: jQuery hashchange event +// +// *Version: 1.3, Last updated: 7/21/2010* +// +// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/ +// GitHub - http://github.com/cowboy/jquery-hashchange/ +// Source - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js +// (Minified) - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped) +// +// About: License +// +// Copyright (c) 2010 "Cowboy" Ben Alman, +// Dual licensed under the MIT and GPL licenses. +// http://benalman.com/about/license/ +// +// About: Examples +// +// These working examples, complete with fully commented code, illustrate a few +// ways in which this plugin can be used. +// +// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/ +// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/ +// +// About: Support and Testing +// +// Information about what version or versions of jQuery this plugin has been +// tested with, what browsers it has been tested in, and where the unit tests +// reside (so you can test it yourself). +// +// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2 +// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5, +// Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5. +// Unit Tests - http://benalman.com/code/projects/jquery-hashchange/unit/ +// +// About: Known issues +// +// While this jQuery hashchange event implementation is quite stable and +// robust, there are a few unfortunate browser bugs surrounding expected +// hashchange event-based behaviors, independent of any JavaScript +// window.onhashchange abstraction. See the following examples for more +// information: +// +// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/ +// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/ +// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/ +// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/ +// +// Also note that should a browser natively support the window.onhashchange +// event, but not report that it does, the fallback polling loop will be used. +// +// About: Release History +// +// 1.3 - (7/21/2010) Reorganized IE6/7 Iframe code to make it more +// "removable" for mobile-only development. Added IE6/7 document.title +// support. Attempted to make Iframe as hidden as possible by using +// techniques from http://www.paciellogroup.com/blog/?p=604. Added +// support for the "shortcut" format $(window).hashchange( fn ) and +// $(window).hashchange() like jQuery provides for built-in events. +// Renamed jQuery.hashchangeDelay to and +// lowered its default value to 50. Added +// and properties plus document-domain.html +// file to address access denied issues when setting document.domain in +// IE6/7. +// 1.2 - (2/11/2010) Fixed a bug where coming back to a page using this plugin +// from a page on another domain would cause an error in Safari 4. Also, +// IE6/7 Iframe is now inserted after the body (this actually works), +// which prevents the page from scrolling when the event is first bound. +// Event can also now be bound before DOM ready, but it won't be usable +// before then in IE6/7. +// 1.1 - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug +// where browser version is incorrectly reported as 8.0, despite +// inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag. +// 1.0 - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special +// window.onhashchange functionality into a separate plugin for users +// who want just the basic event & back button support, without all the +// extra awesomeness that BBQ provides. This plugin will be included as +// part of jQuery BBQ, but also be available separately. + +(function($,window,undefined){ + '$:nomunge'; // Used by YUI compressor. + + // Reused string. + var str_hashchange = 'hashchange', + + // Method / object references. + doc = document, + fake_onhashchange, + special = $.event.special, + + // Does the browser support window.onhashchange? Note that IE8 running in + // IE7 compatibility mode reports true for 'onhashchange' in window, even + // though the event isn't supported, so also test document.documentMode. + doc_mode = doc.documentMode, + supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 ); + + // Get location.hash (or what you'd expect location.hash to be) sans any + // leading #. Thanks for making this necessary, Firefox! + function get_fragment( url ) { + url = url || location.href; + return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' ); + }; + + // Method: jQuery.fn.hashchange + // + // Bind a handler to the window.onhashchange event or trigger all bound + // window.onhashchange event handlers. This behavior is consistent with + // jQuery's built-in event handlers. + // + // Usage: + // + // > jQuery(window).hashchange( [ handler ] ); + // + // Arguments: + // + // handler - (Function) Optional handler to be bound to the hashchange + // event. This is a "shortcut" for the more verbose form: + // jQuery(window).bind( 'hashchange', handler ). If handler is omitted, + // all bound window.onhashchange event handlers will be triggered. This + // is a shortcut for the more verbose + // jQuery(window).trigger( 'hashchange' ). These forms are described in + // the section. + // + // Returns: + // + // (jQuery) The initial jQuery collection of elements. + + // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and + // $(elem).hashchange() for triggering, like jQuery does for built-in events. + $.fn[ str_hashchange ] = function( fn ) { + return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange ); + }; + + // Property: jQuery.fn.hashchange.delay + // + // The numeric interval (in milliseconds) at which the + // polling loop executes. Defaults to 50. + + // Property: jQuery.fn.hashchange.domain + // + // If you're setting document.domain in your JavaScript, and you want hash + // history to work in IE6/7, not only must this property be set, but you must + // also set document.domain BEFORE jQuery is loaded into the page. This + // property is only applicable if you are supporting IE6/7 (or IE8 operating + // in "IE7 compatibility" mode). + // + // In addition, the property must be set to the + // path of the included "document-domain.html" file, which can be renamed or + // modified if necessary (note that the document.domain specified must be the + // same in both your main JavaScript as well as in this file). + // + // Usage: + // + // jQuery.fn.hashchange.domain = document.domain; + + // Property: jQuery.fn.hashchange.src + // + // If, for some reason, you need to specify an Iframe src file (for example, + // when setting document.domain as in ), you can + // do so using this property. Note that when using this property, history + // won't be recorded in IE6/7 until the Iframe src file loads. This property + // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7 + // compatibility" mode). + // + // Usage: + // + // jQuery.fn.hashchange.src = 'path/to/file.html'; + + $.fn[ str_hashchange ].delay = 50; + /* + $.fn[ str_hashchange ].domain = null; + $.fn[ str_hashchange ].src = null; + */ + + // Event: hashchange event + // + // Fired when location.hash changes. In browsers that support it, the native + // HTML5 window.onhashchange event is used, otherwise a polling loop is + // initialized, running every milliseconds to + // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7 + // compatibility" mode), a hidden Iframe is created to allow the back button + // and hash-based history to work. + // + // Usage as described in : + // + // > // Bind an event handler. + // > jQuery(window).hashchange( function(e) { + // > var hash = location.hash; + // > ... + // > }); + // > + // > // Manually trigger the event handler. + // > jQuery(window).hashchange(); + // + // A more verbose usage that allows for event namespacing: + // + // > // Bind an event handler. + // > jQuery(window).bind( 'hashchange', function(e) { + // > var hash = location.hash; + // > ... + // > }); + // > + // > // Manually trigger the event handler. + // > jQuery(window).trigger( 'hashchange' ); + // + // Additional Notes: + // + // * The polling loop and Iframe are not created until at least one handler + // is actually bound to the 'hashchange' event. + // * If you need the bound handler(s) to execute immediately, in cases where + // a location.hash exists on page load, via bookmark or page refresh for + // example, use jQuery(window).hashchange() or the more verbose + // jQuery(window).trigger( 'hashchange' ). + // * The event can be bound before DOM ready, but since it won't be usable + // before then in IE6/7 (due to the necessary Iframe), recommended usage is + // to bind it inside a DOM ready handler. + + // Override existing $.event.special.hashchange methods (allowing this plugin + // to be defined after jQuery BBQ in BBQ's source code). + special[ str_hashchange ] = $.extend( special[ str_hashchange ], { + + // Called only when the first 'hashchange' event is bound to window. + setup: function() { + // If window.onhashchange is supported natively, there's nothing to do.. + if ( supports_onhashchange ) { return false; } + + // Otherwise, we need to create our own. And we don't want to call this + // until the user binds to the event, just in case they never do, since it + // will create a polling loop and possibly even a hidden Iframe. + $( fake_onhashchange.start ); + }, + + // Called only when the last 'hashchange' event is unbound from window. + teardown: function() { + // If window.onhashchange is supported natively, there's nothing to do.. + if ( supports_onhashchange ) { return false; } + + // Otherwise, we need to stop ours (if possible). + $( fake_onhashchange.stop ); + } + + }); + + // fake_onhashchange does all the work of triggering the window.onhashchange + // event for browsers that don't natively support it, including creating a + // polling loop to watch for hash changes and in IE 6/7 creating a hidden + // Iframe to enable back and forward. + fake_onhashchange = (function(){ + var self = {}, + timeout_id, + + // Remember the initial hash so it doesn't get triggered immediately. + last_hash = get_fragment(), + + fn_retval = function(val){ return val; }, + history_set = fn_retval, + history_get = fn_retval; + + // Start the polling loop. + self.start = function() { + timeout_id || poll(); + }; + + // Stop the polling loop. + self.stop = function() { + timeout_id && clearTimeout( timeout_id ); + timeout_id = undefined; + }; + + // This polling loop checks every $.fn.hashchange.delay milliseconds to see + // if location.hash has changed, and triggers the 'hashchange' event on + // window when necessary. + function poll() { + var hash = get_fragment(), + history_hash = history_get( last_hash ); + + if ( hash !== last_hash ) { + history_set( last_hash = hash, history_hash ); + + $(window).trigger( str_hashchange ); + + } else if ( history_hash !== last_hash ) { + location.href = location.href.replace( /#.*/, '' ) + history_hash; + } + + timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay ); + }; + + // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv + // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + $.browser.msie && !supports_onhashchange && (function(){ + // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8 + // when running in "IE7 compatibility" mode. + + var iframe, + iframe_src; + + // When the event is bound and polling starts in IE 6/7, create a hidden + // Iframe for history handling. + self.start = function(){ + if ( !iframe ) { + iframe_src = $.fn[ str_hashchange ].src; + iframe_src = iframe_src && iframe_src + get_fragment(); + + // Create hidden Iframe. Attempt to make Iframe as hidden as possible + // by using techniques from http://www.paciellogroup.com/blog/?p=604. + iframe = $('