Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial import into CFGMap Subversion repository

  • Loading branch information...
commit 173ebd2da06dc06d6fdfde31ec333ac4a0d0f2cf 1 parent 782ddde
@cutterbl authored
View
12 .project
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>CFGMap</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ <nature>com.adobe.ide.coldfusion.projectNature</nature>
+ </natures>
+</projectDescription>
View
3  .settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Fri Dec 03 14:08:38 CST 2010
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
View
194 CustomTags/cfgmap.cfm
@@ -0,0 +1,194 @@
+<!--- ===========================================================================
+// CLASS/COMPONENT/TEMPLATE:
+// cfgmap.cfm
+//
+// DESCRIPTION:
+// Custom Tag for Google Maps JavaScript Maps API V3 (http://code.google.com/apis/
+// maps/documentation/javascript/). CFGMap is a fork of Scott Mebberson's Google
+// Maps Tag project (http://googlemapstag.riaforge.org/), to support Google's
+// latest version of their maps javascript api.
+//
+// CFGMap requires an array of location structs, even if there is only a single
+// location, to properly center the map and place a marker on the location(s).
+//
+// Supporting JS file (gMap.js) should be located in the [supportDir]\scripts\ directory
+//
+// DISCLAIMER:
+// This Custom Tag is part of the Google Maps Tag v3 open source project on
+// RIAForge. This project is licensed under the Apache Foundation's Apache
+// License (http://www.apache.org/licenses/LICENSE-2.0)
+//
+// AUTHOR:
+// Steve 'Cutter' Blades (SGB), sbladesATdealerskinsDOTcom
+//
+// PARAMS:
+// supportDir:string This is the absolute path to the resource directory,
+// within which would be the supporting script, and any
+// accompanying files (scripts, css, images, etc).
+// additionalScript:string This is the last external script loaded, if passed
+// in when the tag is called. This is where a developer
+// would place the callback function to use to clean up
+// geocoded location records, control a form to get
+// directions plotted on a map, and more.
+// stylesheet:string Adds a custom stylesheet to the header, in proper
+// flow with other assets
+// printStylesheet:string Adds a custom print stylesheet to the header, in
+// proper flow with other assets
+// locArray:array This is a ColdFusion Array of location structs.
+// Locations structs should have the following keys:
+// {
+// locationId:int,
+// Name:string,
+// Address1:string,
+// Address2:string,
+// City:string,
+// State:string, // Abbreviation
+// Zip:string,
+// Latitude:string,
+// Longitude:string,
+// primaryMarker:boolean, // identifies which *one*
+// //location is the 'primary' location
+// phone:string
+// }
+// locArrayName:string A (unique) string for the JavaScript var that will
+// house the locations
+// uniqueMapObj:string A (unique) string for the JavaScript var that will
+// house the map instance
+// secondaryMapInstance:boolean This denotes if this custom tag call is for
+// an additional map instance on a page
+// TODO: not fully capable yet
+// correctionCallback:string The name of the callback function to correct
+// db records of geocoded locations
+// width:string The width of the map
+// height:string The height of the map
+// zoom:numeric The zoom level of the map
+// mapTypeId:string The mapTypeId of the map object. Valid values are:
+// [ROADMAP|HYBRID|SATELLITE|TERRAIN]
+// mapDiv:string The name of the div element to which the map should render
+// directionsDiv:string the name of the div element to which directions should render
+// bDebug:boolean TODO: to create alternative conditional logic, in the
+// event of debugging
+//
+// REVISION HISTORY:
+//
+// ******************************************************************************
+// User: SGB [Date: 12.02.10]
+// Initial Creation
+// ******************************************************************************
+=========================================================================== --->
+<cfsetting enablecfoutputonly="true">
+
+<cfparam name="ATTRIBUTES.supportDir" default="/" type="string" />
+<cfparam name="ATTRIBUTES.additionalScript" default="" type="string" />
+<cfparam name="ATTRIBUTES.stylesheet" default="" type="string" />
+<cfparam name="ATTRIBUTES.printStylesheet" default="" type="string" />
+<cfparam name="ATTRIBUTES.locArray" default="ArrayNew(1)" type="array" />
+<cfparam name="ATTRIBUTES.locArrayName" default="_locArr" type="string" />
+<cfparam name="ATTRIBUTES.uniqueMapObj" default="_cfGMapObj" type="string" />
+<cfparam name="ATTRIBUTES.secondaryMapInstance" default="false" type="boolean" />
+<cfparam name="ATTRIBUTES.correctionCallback" default="" type="string" />
+<cfparam name="ATTRIBUTES.width" default="800px" type="string" />
+<cfparam name="ATTRIBUTES.height" default="425px" type="string" />
+<cfparam name="ATTRIBUTES.zoom" default="13" type="numeric" />
+<cfparam name="ATTRIBUTES.mapTypeId" default="ROADMAP" type="string" />
+<cfparam name="ATTRIBUTES.mapDiv" default="googlemapstag" type="string" />
+<cfparam name="ATTRIBUTES.directionsDiv" default="googleMapsTag_directions" type="string" />
+<cfparam name="ATTRIBUTES.bDebug" default="false" type="boolean" />
+<!--- Use the VARIABLES scope here, to keep it in the Custom Tag alone --->
+<cfset VARIABLES.LatLng = "" />
+<!--- Putting the API piece here, for easy change --->
+<!--- TODO: The 'sensor' querystring var here is for delineation between desktop and mobile --->
+<cfset VARIABLES.apiStr = "http://maps.google.com/maps/api/js?sensor=false" />
+
+<!--- only return a result when the ExecutionMode is start --->
+<cfif thisTag.ExecutionMode is 'start'>
+
+ <!--- let's output the required javascript --->
+ <cfsavecontent variable="VARIABLES.mapHeader">
+ <cfoutput><script type='text/javascript' src='#ATTRIBUTES.supportDir#scripts/gMap.js'></script>
+ </cfoutput>
+ <cfif Len(ATTRIBUTES.additionalScript)><!--- If an additional script is passed in... --->
+ <cfoutput><script type='text/javascript' src='#ATTRIBUTES.supportDir#scripts/#ATTRIBUTES.additionalScript#'></script>
+ </cfoutput>
+ </cfif>
+ <cfif Len(ATTRIBUTES.stylesheet)><!--- If a stylesheet is passed in... --->
+ <cfoutput><link rel='stylesheet' type='text/css' href='#ATTRIBUTES.supportDir#css/#ATTRIBUTES.stylesheet#' />
+ </cfoutput>
+ </cfif>
+ <cfoutput><style type="text/css">
+ table td {
+ vertical-align: top;
+ }
+ ###ATTRIBUTES.mapDiv# {
+ width: #ATTRIBUTES.width#;
+ height: #ATTRIBUTES.height#;
+ }
+ </style>
+ </cfoutput>
+ <cfif Len(ATTRIBUTES.printStylesheet)><!--- If a print stylesheet is passed in... --->
+ <cfoutput><link rel='stylesheet' type='text/css' media='print' href='#ATTRIBUTES.supportDir#css/#ATTRIBUTES.printStylesheet#' />
+ </cfoutput>
+ </cfif>
+ <cfoutput><script type="text/javascript">
+ // The locations array
+ var #ATTRIBUTES.locArrayName# = new Array();
+ // The CFGMap object instance
+ var #ATTRIBUTES.uniqueMapObj#;
+ // We'll populate the locations array with CFGMapLocation objects
+ </cfoutput>
+ <cfloop array="#ATTRIBUTES.locArray#" index="VARIABLES.i"><cfoutput>#ATTRIBUTES.locArrayName#.push(new CFGMapLocation({
+ locId: #VARIABLES.i['locationID']#,
+ dispName: "#VARIABLES.i['Name']#",
+ addr1: "#VARIABLES.i['Address1']#",
+ addr2: "#VARIABLES.i['Address2']#",
+ city: "#VARIABLES.i['City']#",
+ state: "#VARIABLES.i['State']#",
+ zip: "#VARIABLES.i['zip']#",
+ lat: "#VARIABLES.i['Latitude']#",
+ lng: "#VARIABLES.i['Longitude']#",
+ primary: #VARIABLES.i['primaryMarker']#,
+ phone: "#VARIABLES.i['phone']#"
+ }));</cfoutput>
+ <cfif VARIABLES.i['primaryMarker'] and (Len(VARIABLES.i['Latitude']) and Len(VARIABLES.i['Latitude']))>
+ <cfset VARIABLES.LatLng = VARIABLES.i['Latitude'] & "," & VARIABLES.i['Longitude'] />
+ </cfif>
+ </cfloop>
+ <cfoutput>
+ // This is the callback function, once the api is loaded
+ function initialize(){
+ // Create a new CFGMap object
+ #ATTRIBUTES.uniqueMapObj# = new CFGMap({
+ locs: #ATTRIBUTES.locArrayName#,
+ mapTypeId: google.maps.MapTypeId.#ATTRIBUTES.mapTypeId#,
+ mapEl: document.getElementById("#ATTRIBUTES.mapDiv#"),
+ dirEl: document.getElementById("#ATTRIBUTES.directionsDiv#"),
+ zoom: #ATTRIBUTES.zoom#<cfif Len(VARIABLES.LatLng)>,
+ center: "#VARIABLES.LatLng#"</cfif><cfif Len(ATTRIBUTES.correctionCallback)>,
+ locCorrect: #ATTRIBUTES.correctionCallback#</cfif>
+ });
+ }
+ </cfoutput>
+ <!--- If this is the first map instance then instantiate the Google Maps API --->
+ <!---
+ // TODO: No solid plan yet for implementing multiple maps. Have to figure out how to handle that from
+ // the perspective of the initialization callback.
+ --->
+ <cfif not ATTRIBUTES.secondaryMapInstance>
+ <cfoutput>function loadScript() {
+ var script = document.createElement("script");
+ script.type = "text/javascript";
+ script.src = "#VARIABLES.apiStr#&callback=initialize";
+ document.body.appendChild(script);
+ }
+
+ window.onload = loadScript;</cfoutput>
+ </cfif>
+
+ <cfoutput></script></cfoutput>
+ </cfsavecontent>
+
+ <cfhtmlhead text="#VARIABLES.mapHeader#" />
+
+ <cfoutput><div id="#ATTRIBUTES.mapDiv#"></div></cfoutput>
+</cfif>
+<cfsetting enablecfoutputonly="false" />
View
96 cfc/Locations.cfc
@@ -0,0 +1,96 @@
+<!--- ===========================================================================
+// CLASS/COMPONENT:
+// Locations.cfc
+//
+// DESCRIPTION:
+// Example component for ajax callback to correct lat/lng location information
+// after being Geocoded by Google's JS Map API
+//
+// AUTHOR:
+// Steve 'Cutter' Blades (SGB), cutterDOTblATcutterscrossingDOTcom
+//
+// REVISION HISTORY:
+//
+// ******************************************************************************
+// User: SGB [Date: 12.03.10]
+// Initial Creation
+// None of this works, because no datasource is set
+// ******************************************************************************
+=========================================================================== --->
+
+<cfcomponent displayname="Locations">
+ <cfset VARIABLES.DSN = "" />
+
+ <!---
+ // FUNCTION: correctLocsLatLng(corrArr:string):struct
+ //
+ // DESCRIPTION:
+ // A function taking an array of locations to 'fix' with new lat/lng data.
+ // Takes a JSON object, an array of objects, and converts it to native CF
+ // datatypes before looping each array item for processing.
+ //
+ // ARGUMENTS:
+ // corrArr:string A JSON object (an array of objects [{locId,lat,lng}])
+ //
+ // RETURN:
+ // LOCAL.ret {success:boolean,message?:string}
+ --->
+ <cffunction name="correctLocsLatLng" access="remote" returntype="struct">
+ <cfargument name="corrArr" type="string" required="true" />
+ <cfset var LOCAL = StructNew() />
+ <cfset LOCAL.ret = StructNew() />
+ <cfset LOCAL.ret['success'] = true />
+ <cfset LOCAL.set = DeserializeJson(ARGUMENTS.corrArr,true) />
+ <cftry>
+ <cfloop array="#LOCAL.set#" index="LOCAL.i">
+ <cfset LOCAL.try = setGMapLatLng(argumentCollection:LOCAL.i) />
+ <cfif not LOCAL.try.success>
+ <cfthrow type="Custom_DS" errorcode="LOCAL.i.locId" detail="#LOCAL.try.message#" />
+ </cfif>
+ </cfloop>
+ <cfcatch type="any">
+ <cfset LOCAL.ret['success'] = false />
+ <cfset LOCAL.ret['message'] = CFCATCH.Message />
+ <cfreturn LOCAL.ret />
+ </cfcatch>
+ </cftry>
+ <cfreturn LOCAL.ret />
+ </cffunction>
+
+ <!---
+ // FUNCTION: setGMapLatLng(locId:numeric,lat:numeric,lng:numeric):struct
+ //
+ // DESCRIPT:
+ // Updates the lat/lng info in a record of a specific location
+ //
+ // ARGUMENTS:
+ // locId:numeric Location ID
+ // lat:numeric Location's Latitude
+ // lng:numeric Location's Longitude
+ //
+ // RETURN:
+ // LOCAL.ret:struct {success:boolean,message?:string}
+ --->
+ <cffunction name="setGMapLatLng" access="remote" returntype="struct">
+ <cfargument name="locId" type="numeric" required="true" />
+ <cfargument name="lat" type="numeric" required="true" />
+ <cfargument name="lng" type="numeric" required="true" />
+ <cfset var LOCAL = StructNew() />
+ <cfset LOCAL.ret = StructNew() />
+ <cfset LOCAL.ret['success'] = true />
+ <cftry>
+ <cfquery name="setLatLng" datasource="#VARIABLES.DS2#">
+ UPDATE Location
+ SET Latitude = <cfqueryparam cfsqltype="cf_sql_varchar" value="#ARGUMENTS.lat#" />,
+ Longitude = <cfqueryparam cfsqltype="cf_sql_varchar" value="#ARGUMENTS.lng#" />
+ WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#ARGUMENTS.locId#" />
+ </cfquery>
+ <cfcatch type="any">
+ <cfset LOCAL.ret['success'] = false />
+ <cfset LOCAL.ret['message'] = "We were unable to set the LatLng for Location: #ARGUMENTS.locId# at this time." />
+ <!--- put Error Handling call here --->
+ </cfcatch>
+ </cftry>
+ <cfreturn LOCAL.ret />
+ </cffunction>
+</cfcomponent>
View
71 css/gMap.css
@@ -0,0 +1,71 @@
+/*
+ * STYLESHEET:
+ * gMap.css
+ *
+ * PURPOSE:
+ * Primary stylesheet for example page of the CFGMap Custom Tag
+ *
+ * AUTHOR:
+ * Stephen G 'Cutter' Blades, Jr cutterDOTblATcutterscrossing.com
+ */
+
+#mapContainer {
+ text-align: left;
+ margin: 0 auto;
+}
+
+#mapTitle {
+ width: auto;
+ padding: 6px 0px 8px 8px;
+ color: #FE6B5F;
+ font-size: 14px;
+}
+#mapBlurb {
+ margin: 0 auto;
+ padding: 0px 0px 8px 8px;
+}
+#printLink {
+ float: right;
+ margin: 8px auto;
+}
+#printLink select{
+ margin-right: 28px;
+}
+
+#googlemapstag {
+ margin-right: 10px;
+ float:right;
+ border: solid #000000 1px;
+}
+#frmContainer {
+ height: 425;
+ text-align: left;
+ color: black;
+ margin: 0 auto;
+ width: 158px;
+ float:left;
+}
+#locList {
+ margin: 0 10px;
+}
+
+#frmDiv {
+ margin-left: 8px;
+}
+
+#dirDiv {
+ margin: 8px 0 8px 160px;
+ color: black;
+}
+
+#dirDiv *{
+ color: black;
+}
+.clsDir {
+ background-color: white;
+ color: black;
+}
+
+.infoAddr {
+ color: #000;
+}
View
39 css/gMapPrint.css
@@ -0,0 +1,39 @@
+/*
+ * STYLESHEET:
+ * gMapPrint.css
+ *
+ * PURPOSE:
+ * Print stylesheet for example page of the CFGMap Custom Tag
+ *
+ * AUTHOR:
+ * Stephen G 'Cutter' Blades, Jr cutterDOTblATcutterscrossing.com
+ */
+
+body {
+ background-color: white;
+ color: black;
+ text-align: center;
+}
+
+#mapContainer {
+ text-align: center;
+ margin: 0 auto;
+}
+
+#printLink, #mapTitle, #frmContainer {
+ display: none;
+}
+
+#frmContainer {
+ display: none;
+}
+
+#dirDiv {
+ width: 100%;
+ margin: 0;
+}
+
+#googlemapstag {
+ width: 100%;
+ margin: 0;
+}
View
BIN  images/print_icon.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
224 index.cfm
@@ -0,0 +1,224 @@
+<cfsetting enablecfoutputonly="true" />
+<!--- ===========================================================================
+// CLASS/COMPONENT:
+// index.cfm
+//
+// DESCRIPTION:
+// Example page for Google Maps V3 API, using the CFGMap CustomTag
+//
+// AUTHOR:
+// Steve 'Cutter' Blades (SGB), cutterDOTblATcutterscrossing.comcom
+//
+// LICENSE:
+// Apache Software Foundation's Apache License, Version 2.0
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// REVISION HISTORY:
+//
+// ******************************************************************************
+// User: SGB [Date: 12.03.10]
+// Initial Creation
+// ******************************************************************************
+=========================================================================== --->
+
+<cfscript>
+ // We'll setup an array of locations for testing
+ REQUEST.locArr = ArrayNew(1);
+ REQUEST.loc1 = StructNew();
+ REQUEST.loc1.locationID = 1;
+ REQUEST.loc1.name = "B.B. Kings Blues Club";
+ REQUEST.loc1.address1 = "152 2nd Avenue North";
+ REQUEST.loc1.address2 = "";
+ REQUEST.loc1.city = "Nashville";
+ REQUEST.loc1.state = "TN";
+ REQUEST.loc1.zip = "37201-1902";
+ REQUEST.loc1.phone = "(615) 256-2727";
+ REQUEST.loc1.latitude = "";
+ REQUEST.loc1.longitude = "";
+ REQUEST.loc1.primaryMarker = true;
+ ArrayAppend(REQUEST.locArr,REQUEST.loc1);
+ REQUEST.loc2 = StructNew();
+ REQUEST.loc2.locationID = 2;
+ REQUEST.loc2.name = "Bourbon Street Blues and Boogie Bar";
+ REQUEST.loc2.address1 = "220 Printers Alley";
+ REQUEST.loc2.address2 = "";
+ REQUEST.loc2.city = "Nashville";
+ REQUEST.loc2.state = "TN";
+ REQUEST.loc2.zip = "37201-1403";
+ REQUEST.loc2.phone = "(615) 242-5837";
+ REQUEST.loc2.latitude = "";
+ REQUEST.loc2.longitude = "";
+ REQUEST.loc2.primaryMarker = false;
+ ArrayAppend(REQUEST.locArr,REQUEST.loc2);
+ REQUEST.loc3 = StructNew();
+ REQUEST.loc3.locationID = 3;
+ REQUEST.loc3.name = "3rd and Lindsley Bar & Grill";
+ REQUEST.loc3.address1 = "818 3rd Ave. S.";
+ REQUEST.loc3.address2 = "";
+ REQUEST.loc3.city = "Nashville";
+ REQUEST.loc3.state = "TN";
+ REQUEST.loc3.zip = "37210";
+ REQUEST.loc3.primaryMarker = false;
+ REQUEST.loc3.phone = "(615) 259-9891";
+ REQUEST.loc3.latitude = "";
+ REQUEST.loc3.longitude = "";
+ ArrayAppend(REQUEST.locArr,REQUEST.loc3);
+ REQUEST.loc4 = StructNew();
+ REQUEST.loc4.locationID = 4;
+ REQUEST.loc4.name = "Mercy Loung";
+ REQUEST.loc4.address1 = "One Cannery Row";
+ REQUEST.loc4.address2 = "";
+ REQUEST.loc4.city = "Nashville";
+ REQUEST.loc4.state = "TN";
+ REQUEST.loc4.zip = "37203";
+ REQUEST.loc4.phone = "(615) 251-3020";
+ REQUEST.loc4.latitude = "";
+ REQUEST.loc4.longitude = "";
+ REQUEST.loc4.primaryMarker = false;
+ ArrayAppend(REQUEST.locArr,REQUEST.loc4);
+ /*REQUEST.loc5 = StructNew();
+ REQUEST.loc5.locationID = 5;
+ REQUEST.loc5.name = "";
+ REQUEST.loc5.address1 = "";
+ REQUEST.loc5.address2 = "";
+ REQUEST.loc5.city = "";
+ REQUEST.loc5.state = "";
+ REQUEST.loc5.zip = "";
+ REQUEST.loc5.phone = "";
+ REQUEST.loc5.latitude = "";
+ REQUEST.loc5.longitude = "";
+ REQUEST.loc5.primaryMarker = false;
+ ArrayAppend(REQUEST.locArr,REQUEST.loc5);*/
+
+ // You can also use Nathan Dintenfass' QueryRowToStruct() function to
+ // convert queries into structs to append to the locArr
+ // QueryRowToStruct() can be found at CFLib.org
+ // http://cflib.org/index.cfm?event=page.udfbyid&udfid=358
+
+ REQUEST.originState = "TN";
+ REQUEST.locList = "Franklin;Brentwood;Gallatin;Mt. Juliet;Clarksville, KY";
+</cfscript>
+
+<cfoutput>
+<html>
+ <head>
+ <title>Google Maps JavaScript API v3 - CFGMap Custom Tag</title>
+ <script type='text/javascript' src='/scripts/jquery-1.4.4.min.js'></script>
+ </head>
+ <body>
+ <div id="mapContainer">
+ <div id="printLink">
+ <cfif ArrayLen(REQUEST.locArr) gt 1><!--- For sites with more than one mapped location --->
+ <select id="locID" name="locID">
+ <cfloop array="#REQUEST.locArr#" index="REQUEST.i">
+ <option value="#REQUEST.i.locationID#">#REQUEST.i.name#</option>
+ </cfloop>
+ </select>
+ </cfif>
+ <a href="javascript:window.print();">Print <img src="/images/print_icon.png" width="33" height="28" border="0"></a>
+ </div>
+ <div id="mapTitle">
+ <a name="gMaps"></a>
+ <b>Get Driving Directions</b>
+ <div id="mapBlurb">
+ Use the form below to get direction from your location or select from the list of pre-loaded locations nearby.
+ </div>
+ </div>
+</cfoutput>
+
+<cfscript>
+ REQUEST.attr = {};
+ REQUEST.attr.width = "85%"; // The width of the map
+ REQUEST.attr.height = "500px"; // The height of the map
+ REQUEST.attr.zoom = 14; // The zoom level of the map
+ REQUEST.attr.mapDiv = "googlemapstag"; // The Html Element Id of the div for the map
+ REQUEST.attr.directionsDiv = "dirDiv"; // The Html Element Id of the div for the map's directions
+ REQUEST.attr.locArray = REQUEST.locArr; // The array of location structures
+ REQUEST.attr.locArrayName = "_locArr"; // Unique JS var name for the location array
+ REQUEST.attr.uniqueMapObj = "_cfGMapObj"; // Unique JS var name for this map instance
+ REQUEST.attr.correctionCallback = "correctLocation"; // A JS callback function to correct locations that must be Geocoded
+ REQUEST.attr.supportDir = "/"; // Primary directory root for support assets (scripts and stylesheets)
+ REQUEST.attr.additionalScript = "testmap.js"; // Additional script containing callback functions, custom form binding, etc.
+ REQUEST.attr.stylesheet = "gMap.css"; // Associated stylesheet
+ REQUEST.attr.printStylesheet = "gMapPrint.css"; // Associated print stylesheet
+</cfscript>
+
+<!--- Call for the Custom Tag --->
+<cfimport taglib="/CustomTags" prefix="ui">
+<ui:cfgmap attributeCollection="#REQUEST.attr#" />
+
+<!--- Here's the form to get Driving Directions --->
+<cfoutput>
+ <div id="frmContainer">
+ <div id="frmDiv">
+ <form id="frmDir" name="frmDir">
+ <table border="0">
+ <tr>
+ <td colspan="2" class="frmLabels">
+ Street Address:
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input id="street" name="street" type="text" value="" size="18" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="frmLabels">
+ City:
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input id="suburb" name="suburb" type="text" value="" size="18" />
+ </td>
+ </tr>
+ <tr>
+ <td width="69" class="frmLabels">
+ State:
+ </td>
+ <td width="115" class="frmLabels">
+ Zip:
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <select id="state" name="state" size="1">
+ <option selected="selected" value="TN">TN</option>
+ <!--- Normally you'd populate this with a query --->
+ <!---<cfloop query="REQUEST.states">
+ <option<cfif REQUEST.states.Abrv eq APPLICATION.SiteInfo.State> selected="selected"</cfif>>#REQUEST.states.Abrv#</option>
+ </cfloop>--->
+ </select>
+ </td>
+ <td>
+ <input id="zip" name="zip" type="text" value="" size="5" />
+ </td>
+ </tr>
+ </table>
+ <input type="button" id="updForm" name="updForm" value="Get Directions" />
+ </form>
+ </div>
+ <!--- Here's a div for an additional locations list, that can plot directions --->
+ <cfif ListLen(REQUEST.locList)>
+ <div id="locList">
+ <b>Directions From:</b><br />
+ <cfloop list="#REQUEST.locList#" delimiters=";" index="REQUEST.lstIndex">
+ <cfif ListLen(REQUEST.lstIndex,",") gt 1>
+ <a href="http://maps.google.com">#REQUEST.lstIndex#</a><br />
+ <cfelse>
+ <a href="http://maps.google.com">#REQUEST.lstIndex#, #REQUEST.originState#</a><br />
+ </cfif>
+ </cfloop>
+ </div>
+ </cfif>
+ </div>
+ <br clear="all" />
+ <!--- And the Directions container --->
+ <div id="dirDiv"></div>
+ </div>
+ </body>
+</html>
+</cfoutput>
+
+<cfsetting enablecfoutputonly="false" />
View
158 mapTool_v2.cfm
@@ -0,0 +1,158 @@
+<!--- ===========================================================================
+// CLASS/COMPONENT:
+// DS2/MapTool/mapTool_v2.cfm
+//
+// DESCRIPTION:
+// Display page for Google Maps V3 API
+//
+// AUTHOR:
+// Steve 'Cutter' Blades (SGB), sbladesATdealerskinsDOTcom
+//
+// COPYRIGHT:
+// Copyright (c) 2010 Dealerskins, Inc. All Rights Reserved.
+//
+// REVISION HISTORY:
+//
+// ******************************************************************************
+// User: SGB [Date: 12.02.10]
+// Initial Creation
+// ******************************************************************************
+=========================================================================== --->
+
+<cfparam name="REQUEST.pageWidth" default="#GetPage.PageWidth#" />
+<cfparam name="VARIABLES.locList" default="" />
+<cfparam name="REQUEST.mapWidth" default="830px" />
+<cfparam name="REQUEST.locArr" default="#ArrayNew(1)#" />
+
+<cfscript>
+ // Set the pageWidth, and the mapWidth
+ if((Right(REQUEST.pageWidth,1) neq "%") and isNumeric(REQUEST.pageWidth)){
+ REQUEST.mapWidth = (REQUEST.pageWidth - 170) & "px";
+ REQUEST.pageWidth = REQUEST.pageWidth & "px";
+ }
+ // Get all mapped locations for the site
+ REQUEST.locs = CreateObject("component","cfc.MapTool").getGMapLocations(APPLICATION.SiteInfo.ID);
+ // Turn the locations query into an array of structs
+ for(REQUEST.i = 1;REQUEST.i <= REQUEST.locs.recordCount;REQUEST.i++){
+ REQUEST["loc#REQUEST.i#"] = APPLICATION.CFC.CommonFunctions.QueryRowToStruct(REQUEST.locs,REQUEST.i);
+ ArrayAppend(REQUEST.locArr,Duplicate(REQUEST["loc#REQUEST.i#"]));
+ }
+</cfscript>
+
+<cfquery name="REQUEST.states" datasource="#APPLICATION.DSN.DS2#">
+ SELECT Abrv
+ FROM States
+ ORDER BY Abrv
+</cfquery>
+
+<cfoutput>
+<div id="mapContainer">
+ <div id="printLink">
+ <cfif REQUEST.locs.recordcount gt 1><!--- For sites with more than one mapped location --->
+ <select id="locID" name="locID">
+ <cfloop query="REQUEST.locs">
+ <option value="#REQUEST.locs.locationID#">#REQUEST.locs.tempsitename#</option>
+ </cfloop>
+ </select>
+ </cfif>
+ <a href="javascript:window.print();">Print <img src="/images/print_icon.png" width="33" height="28" border="0"></a>
+ </div>
+ <div id="mapTitle">
+ <a name="gMaps"></a>
+ <b>Get Driving Directions</b>
+ <div id="mapBlurb">
+ Use the form below to get direction from your location or select from the list of pre-loaded locations nearby.
+ </div>
+ </div>
+</cfoutput>
+
+<cfscript>
+ REQUEST.attr = {};
+ REQUEST.attr.width = REQUEST.mapWidth; // The width of the map
+ REQUEST.attr.height = "500px"; // The height of the map
+ REQUEST.attr.zoom = 12; // The zoom level of the map
+ REQUEST.attr.mapDiv = "googlemapstag"; // The Html Element Id of the div for the map
+ REQUEST.attr.directionsDiv = "dirDiv"; // The Html Element Id of the div for the map's directions
+ REQUEST.attr.locArray = REQUEST.locArr; // The array of location structures
+ REQUEST.attr.locArrayName = "_locArr"; // Unique JS var name for the location array
+ REQUEST.attr.uniqueMapObj = "_cfGMapObj"; // Unique JS var name for this map instance
+ REQUEST.attr.correctionCallback = "correctLocation"; // A JS callback function to correct locations that must be Geocoded
+ REQUEST.attr.supportDir = "/Assets/MapTool/"; // Primary directory root for support assets (scripts and stylesheets)
+ REQUEST.attr.additionalScript = "dsGMap.js"; // Additional script containing callback functions, custom form binding, etc.
+ REQUEST.attr.stylesheet = "gMap.css"; // Associated stylesheet
+ REQUEST.attr.printStylesheet = "gMapPrint.css"; // Associated print stylesheet
+</cfscript>
+
+<!--- Call for the Custom Tag --->
+<cfimport taglib="/DSWebRoot/CustomTags/MapTool" prefix="ui">
+<ui:googlemap_v3 attributeCollection="#REQUEST.attr#" />
+
+<!--- Here's the form to get Driving Directions --->
+<cfoutput>
+ <div id="frmContainer">
+ <div id="frmDiv">
+ <form id="frmDir" name="frmDir">
+ <table border="0">
+ <tr>
+ <td colspan="2" class="frmLabels">
+ Street Address:
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input id="street" name="street" type="text" value="" size="18" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="frmLabels">
+ City:
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <input id="suburb" name="suburb" type="text" value="" size="18" />
+ </td>
+ </tr>
+ <tr>
+ <td width="69" class="frmLabels">
+ State:
+ </td>
+ <td width="115" class="frmLabels">
+ Zip:
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <select id="state" name="state" size="1">
+ <cfloop query="REQUEST.states">
+ <option<cfif REQUEST.states.Abrv eq APPLICATION.SiteInfo.State> selected="selected"</cfif>>#REQUEST.states.Abrv#</option>
+ </cfloop>
+ </select>
+ </td>
+ <td>
+ <input id="zip" name="zip" type="text" value="" size="5" />
+ </td>
+ </tr>
+ </table>
+ <input type="button" id="updForm" name="updForm" value="Get Directions" />
+ </form>
+ </div>
+ <!--- Here's a div for an additional locations list, that can plot directions --->
+ <cfif ListLen(VARIABLES.locList)>
+ <div id="locList">
+ <b>Directions From:</b><br />
+ <cfloop list="#VARIABLES.locList#" delimiters=";" index="REQUEST.lstIndex">
+ <cfif ListLen(REQUEST.lstIndex,",") gt 1>
+ <a href="http://maps.google.com">#REQUEST.lstIndex#</a><br />
+ <cfelse>
+ <a href="http://maps.google.com">#REQUEST.lstIndex#, #APPLICATION.SiteInfo.State#</a><br />
+ </cfif>
+ </cfloop>
+ </div>
+ </cfif>
+ </div>
+ <br clear="all" />
+ <!--- And the Directions container --->
+ <div id="dirDiv"></div>
+</div>
+</cfoutput>
View
670 scripts/gMap.js
@@ -0,0 +1,670 @@
+/*
+ * FILE:
+ * gMap.js
+ *
+ * PURPOSE:
+ * Definition of the CFGMapLocation and CFGMap objects, and
+ * accompanying and supporting functions
+ *
+ * AUTHOR:
+ * Stephen G "Cutter" Blades, Jr cutterDOTblATcutterscrossingDOTcom
+ *
+ * EXCEPTIONS:
+ * trim() and JSONString() functions discovered in the wilds of
+ * the internet.
+ *
+ * LICENSE:
+ * CFGMap and CFGMapLocation scripts fall under the Apache
+ * Software Foundation's Apache License, Version 2.0
+ * (http://www.apache.org/licenses/LICENSE-2.0)
+ */
+
+// Adding a 'trim' method to the JS String object
+String.prototype.trim = function () {
+ return this.replace(/^\s*/, "").replace(/\s*$/, "");
+};
+
+var JSONString = function(obj){
+ var s = '[';
+ for(var i = 0; i < obj.length; i++){
+ s += '{';
+ $.each(obj[i], function(k, v){
+ s += '"' + k + '":' + v + ',';
+ });
+ s += '}';
+ if (i < (obj.length - 1)){
+ s += ',';
+ }
+ };
+ return s.replace(/,}/g, '}') + ']';
+};
+
+/*
+ * OBJECT: CFGMapLocation
+ *
+ * DESCRIPTION: A location object, for locations to be placed on the map
+ *
+ * PROPERTIES:
+ * locOpts:Object
+ * locId:int
+ * dispName:String
+ * addr1:String
+ * addr2:String
+ * city:String
+ * state:String
+ * zip:String
+ * lat:String
+ * lng:String
+ * primary:boolean,
+ * phone:String
+ * dirty:boolean
+ */
+
+/*
+ * FUNCTION: constructor
+ *
+ * DESCRIPTION:
+ * Creates a CFGMapLocation instance, applying default arguments when not present in the options
+ *
+ * ARGUMENTS:
+ * options:Object
+ * locId int: the location ID
+ * dispName string: the Display Name/Title of the location
+ * addr1 string: first address line
+ * addr2 string: second address line
+ * city string: city
+ * state string: state abbreviation
+ * zip string: zip code
+ * lat double: latitude of the location
+ * lng double: longitude of the location
+ * primary boolean: is this the primary location (should only be one in the array)
+ * phone string: primary phone number
+ */
+CFGMapLocation = function(options){
+ var args = {
+ "locId":0,
+ "dispName":"",
+ "addr1":"",
+ "addr2":"",
+ "city":"",
+ "state":"",
+ "zip":"",
+ "lat":"",
+ "lng":"",
+ "primary":false,
+ "phone":""
+ };
+ for(var index in args) {
+ if(typeof options[index] == "undefined") options[index] = args[index];
+ }
+ this.locOpts = options;
+ this.dirty = false;
+};
+
+/*
+ * FUNCTION: correct():void
+ *
+ * DESCRIPTION:
+ * Function to update the lat/lng properties of the object, and mark it 'dirty' for change management
+ *
+ * ARGUMENTS:
+ * lat:String
+ * lng:String
+ */
+CFGMapLocation.prototype.correct = function(lat,lng){
+ this.locOpts.lat = lat;
+ this.locOpts.lng = lng;
+ this.setDirty(true);
+};
+
+/*
+ * FUNCTION: setDirty():void
+ *
+ * ARGUMENTS:
+ * value:boolean
+ *
+ * DESCRIPTION:
+ * Sets the 'dirty' property to the value of 'value'
+ */
+CFGMapLocation.prototype.setDirty = function(value){
+ this.dirty = value;
+};
+
+/*
+ * FUNCTION: isDirty():boolean
+ *
+ * DESCRIPTION:
+ * Returns the value of the 'dirty' property
+ */
+CFGMapLocation.prototype.isDirty = function(){
+ return this.dirty;
+};
+
+/*
+ * FUNCTION: getLocId():int
+ *
+ * DESCRIPTION:
+ * Returns the value of the 'locId' property
+ */
+CFGMapLocation.prototype.getLocId = function(){
+ return this.locOpts.locId;
+};
+
+/*
+ * FUNCTION: getLat():String
+ *
+ * DESCRIPTION:
+ * Returns the value of the 'lat' property
+ */
+CFGMapLocation.prototype.getLat = function(){
+ return this.locOpts.lat;
+};
+
+/*
+ * FUNCTION: getLng():String
+ *
+ * DESCRIPTION:
+ * Returns the value of the 'lng' property
+ */
+CFGMapLocation.prototype.getLng = function(){
+ return this.locOpts.lng;
+};
+
+/*
+ * FUNCTION: getDispName():String
+ *
+ * DESCRIPTION:
+ * Returns the value of the 'dispName' property
+ */
+CFGMapLocation.prototype.getDispName = function(){
+ return this.locOpts.dispName;
+};
+
+/*
+ * FUNCTION: isPrimary():boolean
+ *
+ * DESCRIPTION:
+ * Returns the value of the 'primary' property
+ */
+CFGMapLocation.prototype.isPrimary = function(){
+ return this.locOpts.primary;
+};
+
+/*
+ * FUNCTION: getCityState():String
+ *
+ * DESCRIPTION:
+ * Returns a formatted string combining the 'city' and 'state' values
+ */
+CFGMapLocation.prototype.getCityState = function(){
+ var ctySt = "";
+ if(this.locOpts.city.length){
+ ctySt += this.locOpts.city;
+ }
+ if(this.locOpts.state.length){
+ if(ctySt.length){
+ ctySt += ", ";
+ }
+ ctySt += this.locOpts.state;
+ }
+ if(this.locOpts.zip.length){
+ if(ctySt.length){
+ ctySt += " ";
+ }
+ ctySt += this.locOpts.zip;
+ }
+ return ctySt;
+};
+
+/*
+ * FUNCTION: getFullAddress():String
+ *
+ * DESCRIPTION:
+ * Returns a formatted string combining the entire address (for marker placement and directions)
+ */
+CFGMapLocation.prototype.getFullAddress = function(){
+ var loc = "";
+ if(this.locOpts.addr1.length){
+ loc += this.locOpts.addr1;
+ }
+ if(this.locOpts.addr2.length){
+ if(loc.length){
+ loc += " ";
+ }
+ loc += this.locOpts.addr2;
+ }
+ if(this.locOpts.city.length){
+ if(loc.length){
+ loc += ", ";
+ }
+ loc += this.locOpts.city;
+ }
+ if(this.locOpts.state.length){
+ if(loc.length){
+ loc += ", ";
+ }
+ loc += this.locOpts.state;
+ }
+ if(this.locOpts.zip.length){
+ if(loc.length){
+ loc += " ";
+ }
+ loc += this.locOpts.zip;
+ }
+ return loc;
+};
+
+/*
+ * FUNCTION: getContent():String
+ *
+ * DESCRIPTION:
+ * Returns a formatted HTML string fragment of a formatted address (for InfoWindow content)
+ */
+CFGMapLocation.prototype.getContent = function(){
+ var content = '<div class="infoAddr"><address><strong>' + this.getDispName() + '</strong><br />';
+ if(this.locOpts.addr1.length){
+ content += this.locOpts.addr1 + '<br />';
+ }
+ if(this.locOpts.addr2.length){
+ content += this.locOpts.addr2 + '<br />';
+ }
+ if(this.locOpts.city.length){
+ content += this.locOpts.city;
+ }
+ if(this.locOpts.state.length){
+ if(content.length){
+ content += ", ";
+ }
+ content += this.locOpts.state;
+ }
+ if(this.locOpts.zip.length){
+ if(content.length){
+ content += " ";
+ }
+ content += this.locOpts.zip;
+ }
+ if(this.locOpts.phone.length){
+ if(content.length){
+ content += "<br />";
+ }
+ content += "<phone>" + this.locOpts.phone + "</phone>";
+ }
+ content += '</address></div>';
+ return content;
+};
+
+/*
+ * OBJECT: CFGMap
+ *
+ * DESCRIPTION: Map object for Google Maps API v3 implementation
+ *
+ * PROPERTIES:
+ * mapOpts:Object
+ * geocoder:google.maps.Geocoder
+ * directions:google.maps.DirectionsService
+ * renderer:google.maps.DirectionsRenderer
+ * locs:Array
+ * currentLoc:CFGMapLocation
+ * mapEl:HtmlElement
+ * dirEl:HtmlElement
+ * zoom:int
+ * mapTypeId:google.maps.MapTypeId.[ROADMAP|SATELLITE|TERRAIN|HYBRID]
+ * center:String|google.maps.LatLng
+ * locCorrect:function
+ * map:google.maps.Map
+ * corrArr:Array
+ * correct:boolean
+ *
+ * ARGUMENTS:
+ * locs array: array of CFGMapLocation objects, for locations on the map
+ * mapEl HtmlElement: node that the map should populate
+ * dirEl HtmlElement: node that directions will populate
+ *
+ * FUNCTIONS:
+ * init():void - Initializes the CFGMap object, placing the initial markers on the map, and
+ * setting the currentLoc to the primary location
+ * setMarker(loc:CFGMapLocation,init:boolean):void - Places a marker on the map for a location. If Google Map
+ * doesn't yet exist then it will create one, assigning to the global map var. Geocodes locations
+ * who do not yet have lat/lng values. If init is true (only on first run of marker placements), and
+ * locations are geocoded, then those values are passed back to the server for record updates.
+ * getDirections(fromStr:string):void - Plots directions from the fromStr to the currentLoc
+ * attachMarker(marker:google.maps.Marker,loc:CFGMapLocation) - Binds events to markers for display of the InfoWindow
+ * resetCenterToLoc(locId:int) - Re-centers the map to a specific location, and resets the currentLoc var
+ */
+
+/*
+ * FUNCTION: constructor
+ *
+ * DESCRIPTION:
+ * Creates a CFGMap instance, applying default arguments when not present in the options
+ *
+ * ARGUMENTS:
+ * options:Object
+ * geocoder google.maps.Geocoder: Google geocoding object
+ * directions google.maps.DirectionsService: Google's service for getting directions
+ * renderer google.maps.DirectionsRenderer: Google's service for rendering directions
+ * locs array:An array of locations (CFGMapLocations) to plot on the map
+ * currentLoc CFGMapLocations:The current active location (used as the 'to' address when getting directions)
+ * mapEl HtmlElement:The node to which the map will display
+ * dirEl HtmlElement:The node to which the directions will display
+ * zoom int:The map's zoom level
+ * mapTypeId google.maps.MapTypeId:The type of map to display
+ * center String:google.maps.LatLng:The center of the map
+ * locCorrect function:A callback function for updating location info at the server (used on initialization plotting
+ * locations that are geocoded)
+ */
+CFGMap = function(options){
+ var args = {
+ "geocoder": new google.maps.Geocoder(),
+ "directions": new google.maps.DirectionsService(),
+ "renderer": new google.maps.DirectionsRenderer(),
+ "locs": new Array(),
+ "currentLoc": undefined,
+ "mapEl": undefined,
+ "dirEl": undefined,
+ "zoom": 12,
+ "mapTypeId": google.maps.MapTypeId.ROADMAP,
+ "center": undefined,
+ "locCorrect":function(){}
+ };
+ for(var index in args) {
+ if(typeof options[index] == "undefined") options[index] = args[index];
+ }
+ this.mapOpts = options;
+ this.map = undefined;
+ this.corrArr = new Array();
+ this.correct = false;
+ this.init();
+};
+
+/*
+ * FUNCTION: init():void
+ *
+ * DESCRIPTION:
+ * Creates the Google map, centers it on the primary location, and plots all other locations
+ */
+CFGMap.prototype.init = function(){
+ var locs = this.getLocs();
+ var center = this.getCenter();
+ var myOptions = {
+ zoom: this.getZoom(),
+ mapTypeId: this.getMapTypeId()
+ };
+ if(center !== undefined){
+ if (typeof center === "string"){
+ this.setCenter(center);
+ }
+ myOptions.center = this.getCenter();
+ }
+ this.map = new google.maps.Map(this.getMapEl(), myOptions);
+ for(var i = 0;i < locs.length; i++){
+ this.setMarker(locs[i],true,(i === (locs.length-1)));
+ if(locs[i].isPrimary()){
+ this.setCurrentLoc(locs[i]);
+ }
+ }
+};
+
+/*
+ * FUNCTION: getMap():google.maps.Map
+ *
+ * DESCRIPTION:
+ * Returns the 'map' property
+ */
+CFGMap.prototype.getMap = function(){
+ return this.map;
+};
+
+/*
+ * FUNCTION: getGeocoder():google.maps.Geocoder
+ *
+ * DESCRIPTION:
+ * Returns the 'geocoder' property
+ */
+CFGMap.prototype.getGeocoder = function(){
+ return this.mapOpts.geocoder;
+};
+
+/*
+ * FUNCTION: getDirectionsObj():google.maps.DirectionsService
+ *
+ * DESCRIPTION:
+ * Returns the 'directions' property
+ */
+CFGMap.prototype.getDirectionsObj = function(){
+ return this.mapOpts.directions;
+};
+
+/*
+ * FUNCTION: getRenderer():google.maps.DirectionsRenderer
+ *
+ * DESCRIPTION:
+ * Returns the 'renderer' property
+ */
+CFGMap.prototype.getRenderer = function(){
+ return this.mapOpts.renderer;
+};
+
+/*
+ * FUNCTION: getLocs():array
+ *
+ * DESCRIPTION:
+ * Returns the 'locs' property
+ */
+CFGMap.prototype.getLocs = function(){
+ return this.mapOpts.locs;
+};
+
+CFGMap.prototype.getCurrentLoc = function(){
+ return this.mapOpts.currentLoc;
+};
+
+/*
+ * FUNCTION: setCurrentLoc(loc:CFGMapLocation):void
+ *
+ * DESCRIPTION:
+ * Sets the 'currentLoc' property
+ *
+ * ARGUMENTS:
+ * loc:CFGMapLocation
+ */
+CFGMap.prototype.setCurrentLoc = function(loc){
+ this.mapOpts.currentLoc = loc;
+};
+
+/*
+ * FUNCTION: getMapEl():HtmlElement
+ *
+ * DESCRIPTION:
+ * Returns the 'mapEl' property
+ */
+CFGMap.prototype.getMapEl = function(){
+ return this.mapOpts.mapEl;
+};
+
+/*
+ * FUNCTION: getDirEl():HtmlElement
+ *
+ * DESCRIPTION:
+ * Returns the 'dirEl' property
+ */
+CFGMap.prototype.getDirEl = function(){
+ return this.mapOpts.dirEl;
+};
+
+/*
+ * FUNCTION: getZoom():int
+ *
+ * DESCRIPTION:
+ * Returns the 'zoom' property
+ */
+CFGMap.prototype.getZoom = function(){
+ return this.mapOpts.zoom;
+};
+
+/*
+ * FUNCTION: getMapTypeId():google.maps.MapTypeId
+ *
+ * DESCRIPTION:
+ * Returns the 'mapTypeId' property
+ */
+CFGMap.prototype.getMapTypeId = function(){
+ return this.mapOpts.mapTypeId;
+};
+
+/*
+ * FUNCTION: getCenter():String|google.maps.LatLng
+ *
+ * DESCRIPTION:
+ * Returns the 'center' property
+ */
+CFGMap.prototype.getCenter = function(){
+ return this.mapOpts.center;
+};
+
+/*
+ * FUNCTION: setCenter(center:String):void
+ *
+ * DESCRIPTION:
+ * Sets the value of 'center', converting a string to the google.maps.LatLng object type
+ */
+CFGMap.prototype.setCenter = function(center){
+ this.mapOpts.center = new google.maps.LatLng(center);
+};
+
+/*
+ * FUNCTION: setMarker(loc:CFGMapLocation,init:boolean,final:boolean):void
+ *
+ * DESCRIPTION:
+ * Takes a location, geocodes it if necessary, and calls creatMarker()
+ */
+CFGMap.prototype.setMarker = function(loc,init,final){
+ var LatLng = undefined;
+ var el = this;
+ if(loc.getLat() === "" || loc.getLng() === ""){
+ el.getGeocoder().geocode( { 'address': loc.getFullAddress()}, function(results, status) {
+ if (status == google.maps.GeocoderStatus.OK) {
+ loc.correct(results[0].geometry.location.lat(),results[0].geometry.location.lng());
+ el.corrArr.push({locId:loc.getLocId(),lat:loc.getLat(),lng:loc.getLng()});
+ el.correct = true;
+ el.createMarker(loc,el,init,final);
+ } else {
+ alert("Geocoding of this location was not successful\nfor the following reason: " + status);
+ }
+ });
+ } else {
+ el.createMarker(loc,el,init,final);
+ }
+};
+
+/*
+ * FUNCTION: createMarker(loc:CFGMapLocation,mapObj:CFGMap,init:boolean,final:boolean):void
+ *
+ * DESCRIPTION:
+ * Takes a location and puts a marker on the map. Re-centers the map to the primary location.
+ * If 'final' is true, and corrections need to be made to server-side data for the locations,
+ * then it will call the callback method if one is defined in the properties
+ */
+CFGMap.prototype.createMarker = function(loc,mapObj,init,final){
+ var LatLng = new google.maps.LatLng(loc.getLat(), loc.getLng())
+ var map = mapObj.getMap();
+ var marker = new google.maps.Marker({
+ map: map,
+ position: LatLng,
+ title: loc.getDispName()
+ });
+ mapObj.attachMarker(marker,loc);
+ if(init && loc.isPrimary()){
+ map.setCenter(LatLng);
+ }
+ if(final && mapObj.correct){
+ mapObj.callCorrections();
+ }
+};
+
+/*
+ * FUNCTION: getDirections(fromStr:String):void
+ *
+ * DESCRIPTION:
+ * Plots directions on the map from the currentLoc to the 'fromStr'
+ */
+CFGMap.prototype.getDirections = function(fromStr){
+ var el = this;
+ el.getDirectionsObj().route({
+ origin: fromStr,
+ destination: el.getCurrentLoc().getFullAddress(),
+ travelMode: google.maps.DirectionsTravelMode.DRIVING},
+ function(results,status){
+ if(status === "OK"){
+ el.getRenderer().setOptions({
+ directions: results,
+ map: el.getMap(),
+ panel: el.getDirEl()
+ });
+ } else {
+ alert("There was an error retrieving proper routing directions.");
+ }
+ });
+};
+
+/*
+ * FUNCTION: resetCenterToLoc(locId:int):void
+ *
+ * DESCRIPTION:
+ * Re-centers the map to the location in the 'locs' array with the corresponding location id
+ */
+CFGMap.prototype.resetCenterToLoc = function(locId){
+ var locs = this.getLocs();
+ for(var i = 0;i < locs.length;i++){
+ if(locs[i].getLocId() === parseInt(locId)){
+ this.setCurrentLoc(locs[i]);
+ break;
+ }
+ }
+ var LatLng = new google.maps.LatLng(this.getCurrentLoc().getLat(), this.getCurrentLoc().getLng());
+ this.getMap().setCenter(LatLng);
+};
+
+/*
+ * FUNCTION: attachMarker(marker:google.maps.Marker,loc:CFGMapLocation):void
+ *
+ * DESCRIPTION:
+ * A bind function to show/hide an InfoWindow associated with the marker's location
+ */
+CFGMap.prototype.attachMarker = function(marker,loc){
+ var infoWindow = new google.maps.InfoWindow({
+ content: loc.getContent()
+ });
+ google.maps.event.addListener(marker, 'mouseover', function() {
+ infoWindow.open(this.getMap(),marker);
+ });
+ google.maps.event.addListener(marker, 'mouseout', function() {
+ infoWindow.close();
+ });
+};
+
+/*
+ * FUNCTION: callCorrections():void
+ *
+ * DESCRIPTION:
+ * Calls the callback function identified in the 'locCorrect' option. Passes an array of
+ * locations whose lat/lng have be reset by geocoding. Callback function would pass array
+ * to server via ajax to correct database records of the locations.
+ */
+CFGMap.prototype.callCorrections = function(){
+ this.mapOpts.locCorrect(this.corrArr);
+};
+
+/*
+ * FUNCTION: clearDirtyLocs():void
+ *
+ * DESCRIPTION:
+ * Called by success function of the callCorrections ajax post of corrected locations, to
+ * clear the 'dirty' flag of the locations.
+ */
+CFGMap.prototype.clearDirtyLocs = function(){
+ var locs = this.getLocs();
+ for(var i = 0;i < locs.length;i++){
+ locs[i].setDirty(false);
+ }
+};
View
167 scripts/jquery-1.4.4.min.js
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,