// Create a JSON2 object only if one does not already exist. We create the // methods in a closure to avoid creating global variables. var JSON2; if (!JSON2) { JSON2 = {}; } (function () { "use strict"; function f(n) { // Format integers to have at least two digits. return n < 10 ? '0' + n : n; } if (typeof Date.prototype.toJSON2 !== 'function') { Date.prototype.toJSON2 = function (key) { return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z' : null; }; String.prototype.toJSON2 = Number.prototype.toJSON2 = Boolean.prototype.toJSON2 = function (key) { return this.valueOf(); }; } var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { // table of character substitutions '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, rep; function quote(string) { // If the string contains no control characters, no quote characters, and no // backslash characters, then we can safely slap some quotes around it. // Otherwise we must also replace the offending characters with safe escape // sequences. escapable.lastIndex = 0; return escapable.test(string) ? '"' + string.replace(escapable, function (a) { var c = meta[a]; return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; } function str(key, holder) { // Produce a string from holder[key]. var i, // The loop counter. k, // The member key. v, // The member value. length, mind = gap, partial, value = holder[key]; // If the value has a toJSON2 method, call it to obtain a replacement value. if (value && typeof value === 'object' && typeof value.toJSON2 === 'function') { value = value.toJSON2(key); } // If we were called with a replacer function, then call the replacer to // obtain a replacement value. if (typeof rep === 'function') { value = rep.call(holder, key, value); } // What happens next depends on the value's type. switch (typeof value) { case 'string': return quote(value); case 'number': // JSON2 numbers must be finite. Encode non-finite numbers as null. return isFinite(value) ? String(value) : 'null'; case 'boolean': case 'null': // If the value is a boolean or null, convert it to a string. Note: // typeof null does not produce 'null'. The case is included here in // the remote chance that this gets fixed someday. return String(value); // If the type is 'object', we might be dealing with an object or an array or // null. case 'object': // Due to a specification blunder in ECMAScript, typeof null is 'object', // so watch out for that case. if (!value) { return 'null'; } // Make an array to hold the partial results of stringifying this object value. gap += indent; partial = []; // Is the value an array? if (Object.prototype.toString.apply(value) === '[object Array]') { // The value is an array. Stringify every element. Use null as a placeholder // for non-JSON2 values. length = value.length; for (i = 0; i < length; i += 1) { partial[i] = str(i, value) || 'null'; } // Join all of the elements together, separated with commas, and wrap them in // brackets. v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; gap = mind; return v; } // If the replacer is an array, use it to select the members to be stringified. if (rep && typeof rep === 'object') { length = rep.length; for (i = 0; i < length; i += 1) { k = rep[i]; if (typeof k === 'string') { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } else { // Otherwise, iterate through all of the keys in the object. for (k in value) { if (Object.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } // Join all of the member texts together, separated with commas, // and wrap them in braces. v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; gap = mind; return v; } } // If the JSON2 object does not yet have a stringify method, give it one. if (typeof JSON2.stringify !== 'function') { JSON2.stringify = function (value, replacer, space) { // The stringify method takes a value and an optional replacer, and an optional // space parameter, and returns a JSON2 text. The replacer can be a function // that can replace values, or an array of strings that will select the keys. // A default replacer method can be provided. Use of the space parameter can // produce text that is more easily readable. var i; gap = ''; indent = ''; // If the space parameter is a number, make an indent string containing that // many spaces. if (typeof space === 'number') { for (i = 0; i < space; i += 1) { indent += ' '; } // If the space parameter is a string, it will be used as the indent string. } else if (typeof space === 'string') { indent = space; } // If there is a replacer, it must be a function or an array. // Otherwise, throw an error. rep = replacer; if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { throw new Error('JSON2.stringify'); } // Make a fake root object containing our value under the key of ''. // Return the result of stringifying the value. return str('', {'': value}); }; } // If the JSON2 object does not yet have a parse method, give it one. if (typeof JSON2.parse !== 'function') { JSON2.parse = function (text, reviver) { // The parse method takes a text and an optional reviver function, and returns // a JavaScript value if the text is a valid JSON2 text. var j; function walk(holder, key) { // The walk method is used to recursively walk the resulting structure so // that modifications can be made. var k, v, value = holder[key]; if (value && typeof value === 'object') { for (k in value) { if (Object.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); } // Parsing happens in four stages. In the first stage, we replace certain // Unicode characters with escape sequences. JavaScript handles many characters // incorrectly, either silently deleting them, or treating them as line endings. text = String(text); cx.lastIndex = 0; if (cx.test(text)) { text = text.replace(cx, function (a) { return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }); } // In the second stage, we run the text against regular expressions that look // for non-JSON2 patterns. We are especially concerned with '()' and 'new' // because they can cause invocation, and '=' because it can cause mutation. // But just to be safe, we want to reject all unexpected forms. // We split the second stage into 4 regexp operations in order to work around // crippling inefficiencies in IE's and Safari's regexp engines. First we // replace the JSON2 backslash pairs with '@' (a non-JSON2 character). Second, we // replace all simple value tokens with ']' characters. Third, we delete all // open brackets that follow a colon or comma or that begin the text. Finally, // we look to see that the remaining characters are only whitespace or ']' or // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. if (/^[\],:{}\s]*$/ .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { // In the third stage we use the eval function to compile the text into a // JavaScript structure. The '{' operator is subject to a syntactic ambiguity // in JavaScript: it can begin a block or an object literal. We wrap the text // in parens to eliminate the ambiguity. j = eval('(' + text + ')'); // In the optional fourth stage, we recursively walk the new structure, passing // each name/value pair to a reviver function for possible transformation. return typeof reviver === 'function' ? walk({'': j}, '') : j; } // If the text is not JSON2 parseable, then a SyntaxError is thrown. throw new SyntaxError('JSON2.parse'); }; } }()); //add contains function in Array Array.prototype.contains = function(obj) { var i = this.length; while (i--) { if (this[i] === obj) { return true; } } return false; } Array.prototype.max = function() { var max = parseFloat(this[0]); var len = this.length; for (var i = 1; i < len; i++) if (parseFloat(this[i]) > max) max = parseFloat(this[i]); return max; } Array.prototype.min = function() { var min = parseFloat(this[0]); var len = this.length; for (var i = 1; i < len; i++) if (parseFloat(this[i]) < min) min = parseFloat(this[i]); return min; } window.net=window.net||{}; net.imapbuilder=net.imapbuilder||{}; net.imapbuilder.gmap=net.imapbuilder.gmap||{}; var map; var markers=[]; var labels=[]; var images=[]; var polylines=[]; var polygons=[]; var rectangles=[]; var circles=[]; var routes=[]; var current_route = 0; var route_count = 0 ; var map_geocoder; var markerCluster; var crowdMarkers=[]; var crowdMarkersId=0; var crowdMarkersData = [] ; //information box var gmap_locationdetails; var modal_div; var crowdForm_div; var markerID; var tempMarker; var tempMarkerAni; var crowdGetLocation_div; var errorMessage_div; var infoZIndex = 0 ; var heatMapArr = []; var heatMapCon_colorRatio; var cluster_infowindow ; var cs_title = "Add a Location" ; var cs_loginas = "Login as" ; var cs_address = "Address" ; var cs_desc = "Description" ; var cs_data = "Crowdsourced data"; var clickCircle; (function(){ var g=net.imapbuilder.gmap; // shorten the code of the namespace object // icon list g.iconlist=[]; g.iconlist[1]={}; g.iconlist[1].imagew="32"; g.iconlist[1].imageh="32"; g.iconlist[1].imageox="0"; g.iconlist[1].imageoy="0"; g.iconlist[1].imageax="16"; g.iconlist[1].imageay="32"; g.iconlist[2]={}; g.iconlist[2].imagew="32"; g.iconlist[2].imageh="32"; g.iconlist[2].imageox="0"; g.iconlist[2].imageoy="0"; g.iconlist[2].imageax="16"; g.iconlist[2].imageay="32"; g.iconlist[3]={}; g.iconlist[3].imagew="32"; g.iconlist[3].imageh="32"; g.iconlist[3].imageox="0"; g.iconlist[3].imageoy="0"; g.iconlist[3].imageax="16"; g.iconlist[3].imageay="32"; g.iconlist[4]={}; g.iconlist[4].imagew="32"; g.iconlist[4].imageh="32"; g.iconlist[4].imageox="0"; g.iconlist[4].imageoy="0"; g.iconlist[4].imageax="16"; g.iconlist[4].imageay="32"; g.iconlist[5]={}; g.iconlist[5].imagew="32"; g.iconlist[5].imageh="32"; g.iconlist[5].imageox="0"; g.iconlist[5].imageoy="0"; g.iconlist[5].imageax="16"; g.iconlist[5].imageay="32"; g.iconlist[6]={}; g.iconlist[6].imagew="32"; g.iconlist[6].imageh="32"; g.iconlist[6].imageox="0"; g.iconlist[6].imageoy="0"; g.iconlist[6].imageax="16"; g.iconlist[6].imageay="32"; g.iconlist[7]={}; g.iconlist[7].imagew="32"; g.iconlist[7].imageh="32"; g.iconlist[7].imageox="0"; g.iconlist[7].imageoy="0"; g.iconlist[7].imageax="16"; g.iconlist[7].imageay="32"; g.iconlist[8]={}; g.iconlist[8].imagew="32"; g.iconlist[8].imageh="32"; g.iconlist[8].imageox="0"; g.iconlist[8].imageoy="0"; g.iconlist[8].imageax="16"; g.iconlist[8].imageay="32"; g.iconlist[9]={}; g.iconlist[9].imagew="32"; g.iconlist[9].imageh="32"; g.iconlist[9].imageox="0"; g.iconlist[9].imageoy="0"; g.iconlist[9].imageax="16"; g.iconlist[9].imageay="32"; g.iconlist[10]={}; g.iconlist[10].imagew="32"; g.iconlist[10].imageh="32"; g.iconlist[10].imageox="0"; g.iconlist[10].imageoy="0"; g.iconlist[10].imageax="16"; g.iconlist[10].imageay="32"; g.iconlist[11]={}; g.iconlist[11].imagew="32"; g.iconlist[11].imageh="32"; g.iconlist[11].imageox="0"; g.iconlist[11].imageoy="0"; g.iconlist[11].imageax="16"; g.iconlist[11].imageay="32"; g.iconlist[12]={}; g.iconlist[12].imagew="32"; g.iconlist[12].imageh="32"; g.iconlist[12].imageox="0"; g.iconlist[12].imageoy="0"; g.iconlist[12].imageax="16"; g.iconlist[12].imageay="32"; g.iconlist[13]={}; g.iconlist[13].imagew="32"; g.iconlist[13].imageh="32"; g.iconlist[13].imageox="0"; g.iconlist[13].imageoy="0"; g.iconlist[13].imageax="16"; g.iconlist[13].imageay="32"; g.iconlist[14]={}; g.iconlist[14].imagew="32"; g.iconlist[14].imageh="32"; g.iconlist[14].imageox="0"; g.iconlist[14].imageoy="0"; g.iconlist[14].imageax="16"; g.iconlist[14].imageay="32"; g.iconlist[15]={}; g.iconlist[15].imagew="32"; g.iconlist[15].imageh="32"; g.iconlist[15].imageox="0"; g.iconlist[15].imageoy="0"; g.iconlist[15].imageax="11"; g.iconlist[15].imageay="32"; g.iconlist[16]={}; g.iconlist[16].imagew="32"; g.iconlist[16].imageh="32"; g.iconlist[16].imageox="0"; g.iconlist[16].imageoy="0"; g.iconlist[16].imageax="11"; g.iconlist[16].imageay="32"; g.iconlist[17]={}; g.iconlist[17].imagew="32"; g.iconlist[17].imageh="32"; g.iconlist[17].imageox="0"; g.iconlist[17].imageoy="0"; g.iconlist[17].imageax="11"; g.iconlist[17].imageay="32"; g.iconlist[18]={}; g.iconlist[18].imagew="32"; g.iconlist[18].imageh="32"; g.iconlist[18].imageox="0"; g.iconlist[18].imageoy="0"; g.iconlist[18].imageax="11"; g.iconlist[18].imageay="32"; g.iconlist[19]={}; g.iconlist[19].imagew="32"; g.iconlist[19].imageh="32"; g.iconlist[19].imageox="0"; g.iconlist[19].imageoy="0"; g.iconlist[19].imageax="11"; g.iconlist[19].imageay="32"; g.iconlist[20]={}; g.iconlist[20].imagew="32"; g.iconlist[20].imageh="32"; g.iconlist[20].imageox="0"; g.iconlist[20].imageoy="0"; g.iconlist[20].imageax="11"; g.iconlist[20].imageay="32"; g.iconlist[21]={}; g.iconlist[21].imagew="32"; g.iconlist[21].imageh="32"; g.iconlist[21].imageox="0"; g.iconlist[21].imageoy="0"; g.iconlist[21].imageax="11"; g.iconlist[21].imageay="32"; g.iconlist[22]={}; g.iconlist[22].imagew="31"; g.iconlist[22].imageh="35"; g.iconlist[22].imageox="0"; g.iconlist[22].imageoy="0"; g.iconlist[22].imageax="15"; g.iconlist[22].imageay="34"; g.iconlist[23]={}; g.iconlist[23].imagew="31"; g.iconlist[23].imageh="35"; g.iconlist[23].imageox="0"; g.iconlist[23].imageoy="0"; g.iconlist[23].imageax="15"; g.iconlist[23].imageay="34"; g.iconlist[24]={}; g.iconlist[24].imagew="31"; g.iconlist[24].imageh="35"; g.iconlist[24].imageox="0"; g.iconlist[24].imageoy="0"; g.iconlist[24].imageax="15"; g.iconlist[24].imageay="34"; g.iconlist[25]={}; g.iconlist[25].imagew="31"; g.iconlist[25].imageh="35"; g.iconlist[25].imageox="0"; g.iconlist[25].imageoy="0"; g.iconlist[25].imageax="15"; g.iconlist[25].imageay="34"; g.iconlist[26]={}; g.iconlist[26].imagew="31"; g.iconlist[26].imageh="35"; g.iconlist[26].imageox="0"; g.iconlist[26].imageoy="0"; g.iconlist[26].imageax="15"; g.iconlist[26].imageay="34"; g.iconlist[27]={}; g.iconlist[27].imagew="31"; g.iconlist[27].imageh="35"; g.iconlist[27].imageox="0"; g.iconlist[27].imageoy="0"; g.iconlist[27].imageax="15"; g.iconlist[27].imageay="34"; g.iconlist[28]={}; g.iconlist[28].imagew="31"; g.iconlist[28].imageh="35"; g.iconlist[28].imageox="0"; g.iconlist[28].imageoy="0"; g.iconlist[28].imageax="15"; g.iconlist[28].imageay="34"; g.iconlist[29]={}; g.iconlist[29].imagew="31"; g.iconlist[29].imageh="35"; g.iconlist[29].imageox="0"; g.iconlist[29].imageoy="0"; g.iconlist[29].imageax="15"; g.iconlist[29].imageay="34"; g.iconlist[30]={}; g.iconlist[30].imagew="31"; g.iconlist[30].imageh="35"; g.iconlist[30].imageox="0"; g.iconlist[30].imageoy="0"; g.iconlist[30].imageax="15"; g.iconlist[30].imageay="34"; g.iconlist[31]={}; g.iconlist[31].imagew="31"; g.iconlist[31].imageh="35"; g.iconlist[31].imageox="0"; g.iconlist[31].imageoy="0"; g.iconlist[31].imageax="15"; g.iconlist[31].imageay="34"; g.iconlist[32]={}; g.iconlist[32].imagew="31"; g.iconlist[32].imageh="35"; g.iconlist[32].imageox="0"; g.iconlist[32].imageoy="0"; g.iconlist[32].imageax="15"; g.iconlist[32].imageay="34"; g.iconlist[33]={}; g.iconlist[33].imagew="31"; g.iconlist[33].imageh="35"; g.iconlist[33].imageox="0"; g.iconlist[33].imageoy="0"; g.iconlist[33].imageax="15"; g.iconlist[33].imageay="34"; g.iconlist[34]={}; g.iconlist[34].imagew="31"; g.iconlist[34].imageh="35"; g.iconlist[34].imageox="0"; g.iconlist[34].imageoy="0"; g.iconlist[34].imageax="15"; g.iconlist[34].imageay="34"; g.iconlist[35]={}; g.iconlist[35].imagew="31"; g.iconlist[35].imageh="35"; g.iconlist[35].imageox="0"; g.iconlist[35].imageoy="0"; g.iconlist[35].imageax="15"; g.iconlist[35].imageay="34"; g.iconlist[36]={}; g.iconlist[36].imagew="31"; g.iconlist[36].imageh="35"; g.iconlist[36].imageox="0"; g.iconlist[36].imageoy="0"; g.iconlist[36].imageax="15"; g.iconlist[36].imageay="34"; g.iconlist[37]={}; g.iconlist[37].imagew="31"; g.iconlist[37].imageh="35"; g.iconlist[37].imageox="0"; g.iconlist[37].imageoy="0"; g.iconlist[37].imageax="15"; g.iconlist[37].imageay="34"; g.iconlist[38]={}; g.iconlist[38].imagew="31"; g.iconlist[38].imageh="35"; g.iconlist[38].imageox="0"; g.iconlist[38].imageoy="0"; g.iconlist[38].imageax="15"; g.iconlist[38].imageay="34"; g.iconlist[39]={}; g.iconlist[39].imagew="31"; g.iconlist[39].imageh="35"; g.iconlist[39].imageox="0"; g.iconlist[39].imageoy="0"; g.iconlist[39].imageax="15"; g.iconlist[39].imageay="34"; g.iconlist[40]={}; g.iconlist[40].imagew="31"; g.iconlist[40].imageh="35"; g.iconlist[40].imageox="0"; g.iconlist[40].imageoy="0"; g.iconlist[40].imageax="15"; g.iconlist[40].imageay="34"; g.iconlist[41]={}; g.iconlist[41].imagew="31"; g.iconlist[41].imageh="35"; g.iconlist[41].imageox="0"; g.iconlist[41].imageoy="0"; g.iconlist[41].imageax="15"; g.iconlist[41].imageay="34"; g.iconlist[42]={}; g.iconlist[42].imagew="31"; g.iconlist[42].imageh="35"; g.iconlist[42].imageox="0"; g.iconlist[42].imageoy="0"; g.iconlist[42].imageax="15"; g.iconlist[42].imageay="34"; g.iconlist[43]={}; g.iconlist[43].imagew="31"; g.iconlist[43].imageh="35"; g.iconlist[43].imageox="0"; g.iconlist[43].imageoy="0"; g.iconlist[43].imageax="15"; g.iconlist[43].imageay="34"; g.iconlist[44]={}; g.iconlist[44].imagew="31"; g.iconlist[44].imageh="35"; g.iconlist[44].imageox="0"; g.iconlist[44].imageoy="0"; g.iconlist[44].imageax="15"; g.iconlist[44].imageay="34"; g.iconlist[45]={}; g.iconlist[45].imagew="31"; g.iconlist[45].imageh="35"; g.iconlist[45].imageox="0"; g.iconlist[45].imageoy="0"; g.iconlist[45].imageax="15"; g.iconlist[45].imageay="34"; g.iconlist[46]={}; g.iconlist[46].imagew="31"; g.iconlist[46].imageh="35"; g.iconlist[46].imageox="0"; g.iconlist[46].imageoy="0"; g.iconlist[46].imageax="15"; g.iconlist[46].imageay="34"; g.iconlist[47]={}; g.iconlist[47].imagew="31"; g.iconlist[47].imageh="35"; g.iconlist[47].imageox="0"; g.iconlist[47].imageoy="0"; g.iconlist[47].imageax="15"; g.iconlist[47].imageay="34"; g.iconlist[48]={}; g.iconlist[48].imagew="31"; g.iconlist[48].imageh="35"; g.iconlist[48].imageox="0"; g.iconlist[48].imageoy="0"; g.iconlist[48].imageax="15"; g.iconlist[48].imageay="34"; g.iconlist[49]={}; g.iconlist[49].imagew="31"; g.iconlist[49].imageh="35"; g.iconlist[49].imageox="0"; g.iconlist[49].imageoy="0"; g.iconlist[49].imageax="15"; g.iconlist[49].imageay="34"; g.iconlist[50]={}; g.iconlist[50].imagew="31"; g.iconlist[50].imageh="35"; g.iconlist[50].imageox="0"; g.iconlist[50].imageoy="0"; g.iconlist[50].imageax="15"; g.iconlist[50].imageay="34"; g.iconlist[51]={}; g.iconlist[51].imagew="31"; g.iconlist[51].imageh="35"; g.iconlist[51].imageox="0"; g.iconlist[51].imageoy="0"; g.iconlist[51].imageax="15"; g.iconlist[51].imageay="34"; g.iconlist[52]={}; g.iconlist[52].imagew="31"; g.iconlist[52].imageh="35"; g.iconlist[52].imageox="0"; g.iconlist[52].imageoy="0"; g.iconlist[52].imageax="15"; g.iconlist[52].imageay="34"; g.iconlist[53]={}; g.iconlist[53].imagew="31"; g.iconlist[53].imageh="35"; g.iconlist[53].imageox="0"; g.iconlist[53].imageoy="0"; g.iconlist[53].imageax="15"; g.iconlist[53].imageay="34"; g.iconlist[54]={}; g.iconlist[54].imagew="31"; g.iconlist[54].imageh="35"; g.iconlist[54].imageox="0"; g.iconlist[54].imageoy="0"; g.iconlist[54].imageax="15"; g.iconlist[54].imageay="34"; g.iconlist[55]={}; g.iconlist[55].imagew="31"; g.iconlist[55].imageh="35"; g.iconlist[55].imageox="0"; g.iconlist[55].imageoy="0"; g.iconlist[55].imageax="15"; g.iconlist[55].imageay="34"; g.iconlist[56]={}; g.iconlist[56].imagew="31"; g.iconlist[56].imageh="35"; g.iconlist[56].imageox="0"; g.iconlist[56].imageoy="0"; g.iconlist[56].imageax="15"; g.iconlist[56].imageay="34"; g.iconlist[57]={}; g.iconlist[57].imagew="31"; g.iconlist[57].imageh="35"; g.iconlist[57].imageox="0"; g.iconlist[57].imageoy="0"; g.iconlist[57].imageax="15"; g.iconlist[57].imageay="34"; g.iconlist[58]={}; g.iconlist[58].imagew="31"; g.iconlist[58].imageh="35"; g.iconlist[58].imageox="0"; g.iconlist[58].imageoy="0"; g.iconlist[58].imageax="15"; g.iconlist[58].imageay="34"; g.iconlist[59]={}; g.iconlist[59].imagew="31"; g.iconlist[59].imageh="35"; g.iconlist[59].imageox="0"; g.iconlist[59].imageoy="0"; g.iconlist[59].imageax="15"; g.iconlist[59].imageay="34"; g.iconlist[60]={}; g.iconlist[60].imagew="31"; g.iconlist[60].imageh="35"; g.iconlist[60].imageox="0"; g.iconlist[60].imageoy="0"; g.iconlist[60].imageax="15"; g.iconlist[60].imageay="34"; g.iconlist[61]={}; g.iconlist[61].imagew="31"; g.iconlist[61].imageh="35"; g.iconlist[61].imageox="0"; g.iconlist[61].imageoy="0"; g.iconlist[61].imageax="15"; g.iconlist[61].imageay="34"; g.iconlist[62]={}; g.iconlist[62].imagew="31"; g.iconlist[62].imageh="35"; g.iconlist[62].imageox="0"; g.iconlist[62].imageoy="0"; g.iconlist[62].imageax="15"; g.iconlist[62].imageay="34"; g.iconlist[63]={}; g.iconlist[63].imagew="31"; g.iconlist[63].imageh="35"; g.iconlist[63].imageox="0"; g.iconlist[63].imageoy="0"; g.iconlist[63].imageax="15"; g.iconlist[63].imageay="34"; g.iconlist[64]={}; g.iconlist[64].imagew="31"; g.iconlist[64].imageh="35"; g.iconlist[64].imageox="0"; g.iconlist[64].imageoy="0"; g.iconlist[64].imageax="15"; g.iconlist[64].imageay="34"; g.iconlist[65]={}; g.iconlist[65].imagew="31"; g.iconlist[65].imageh="35"; g.iconlist[65].imageox="0"; g.iconlist[65].imageoy="0"; g.iconlist[65].imageax="15"; g.iconlist[65].imageay="34"; g.iconlist[66]={}; g.iconlist[66].imagew="31"; g.iconlist[66].imageh="35"; g.iconlist[66].imageox="0"; g.iconlist[66].imageoy="0"; g.iconlist[66].imageax="15"; g.iconlist[66].imageay="34"; g.iconlist[67]={}; g.iconlist[67].imagew="31"; g.iconlist[67].imageh="35"; g.iconlist[67].imageox="0"; g.iconlist[67].imageoy="0"; g.iconlist[67].imageax="15"; g.iconlist[67].imageay="34"; g.iconlist[68]={}; g.iconlist[68].imagew="31"; g.iconlist[68].imageh="35"; g.iconlist[68].imageox="0"; g.iconlist[68].imageoy="0"; g.iconlist[68].imageax="15"; g.iconlist[68].imageay="34"; g.iconlist[69]={}; g.iconlist[69].imagew="31"; g.iconlist[69].imageh="35"; g.iconlist[69].imageox="0"; g.iconlist[69].imageoy="0"; g.iconlist[69].imageax="15"; g.iconlist[69].imageay="34"; g.iconlist[70]={}; g.iconlist[70].imagew="31"; g.iconlist[70].imageh="35"; g.iconlist[70].imageox="0"; g.iconlist[70].imageoy="0"; g.iconlist[70].imageax="15"; g.iconlist[70].imageay="34"; g.iconlist[71]={}; g.iconlist[71].imagew="31"; g.iconlist[71].imageh="35"; g.iconlist[71].imageox="0"; g.iconlist[71].imageoy="0"; g.iconlist[71].imageax="15"; g.iconlist[71].imageay="34"; g.iconlist[72]={}; g.iconlist[72].imagew="20"; g.iconlist[72].imageh="20"; g.iconlist[72].imageox="0"; g.iconlist[72].imageoy="0"; g.iconlist[72].imageax="10"; g.iconlist[72].imageay="10"; g.iconlist[73]={}; g.iconlist[73].imagew="20"; g.iconlist[73].imageh="20"; g.iconlist[73].imageox="0"; g.iconlist[73].imageoy="0"; g.iconlist[73].imageax="10"; g.iconlist[73].imageay="10"; g.iconlist[74]={}; g.iconlist[74].imagew="20"; g.iconlist[74].imageh="20"; g.iconlist[74].imageox="0"; g.iconlist[74].imageoy="0"; g.iconlist[74].imageax="10"; g.iconlist[74].imageay="10"; g.iconlist[75]={}; g.iconlist[75].imagew="12"; g.iconlist[75].imageh="12"; g.iconlist[75].imageox="0"; g.iconlist[75].imageoy="0"; g.iconlist[75].imageax="6"; g.iconlist[75].imageay="12"; g.iconlist[76]={}; g.iconlist[76].imagew="12"; g.iconlist[76].imageh="12"; g.iconlist[76].imageox="0"; g.iconlist[76].imageoy="0"; g.iconlist[76].imageax="6"; g.iconlist[76].imageay="12"; g.iconlist[77]={}; g.iconlist[77].imagew="12"; g.iconlist[77].imageh="12"; g.iconlist[77].imageox="0"; g.iconlist[77].imageoy="0"; g.iconlist[77].imageax="6"; g.iconlist[77].imageay="12"; g.iconlist[78]={}; g.iconlist[78].imagew="12"; g.iconlist[78].imageh="12"; g.iconlist[78].imageox="0"; g.iconlist[78].imageoy="0"; g.iconlist[78].imageax="6"; g.iconlist[78].imageay="12"; g.iconlist[79]={}; g.iconlist[79].imagew="12"; g.iconlist[79].imageh="12"; g.iconlist[79].imageox="0"; g.iconlist[79].imageoy="0"; g.iconlist[79].imageax="6"; g.iconlist[79].imageay="12"; g.iconlist[80]={}; g.iconlist[80].imagew="12"; g.iconlist[80].imageh="12"; g.iconlist[80].imageox="0"; g.iconlist[80].imageoy="0"; g.iconlist[80].imageax="6"; g.iconlist[80].imageay="12"; g.iconlist[81]={}; g.iconlist[81].imagew="12"; g.iconlist[81].imageh="12"; g.iconlist[81].imageox="0"; g.iconlist[81].imageoy="0"; g.iconlist[81].imageax="6"; g.iconlist[81].imageay="12"; g.iconlist[82]={}; g.iconlist[82].imagew="12"; g.iconlist[82].imageh="12"; g.iconlist[82].imageox="0"; g.iconlist[82].imageoy="0"; g.iconlist[82].imageax="6"; g.iconlist[82].imageay="12"; g.iconlist[83]={}; g.iconlist[83].imagew="12"; g.iconlist[83].imageh="12"; g.iconlist[83].imageox="0"; g.iconlist[83].imageoy="0"; g.iconlist[83].imageax="6"; g.iconlist[83].imageay="12"; g.iconlist[84]={}; g.iconlist[84].imagew="12"; g.iconlist[84].imageh="12"; g.iconlist[84].imageox="0"; g.iconlist[84].imageoy="0"; g.iconlist[84].imageax="6"; g.iconlist[84].imageay="12"; g.iconlist[85]={}; g.iconlist[85].imagew="12"; g.iconlist[85].imageh="12"; g.iconlist[85].imageox="0"; g.iconlist[85].imageoy="0"; g.iconlist[85].imageax="6"; g.iconlist[85].imageay="12"; g.iconlist[86]={}; g.iconlist[86].imagew="12"; g.iconlist[86].imageh="12"; g.iconlist[86].imageox="0"; g.iconlist[86].imageoy="0"; g.iconlist[86].imageax="6"; g.iconlist[86].imageay="12"; g.iconlist[87]={}; g.iconlist[87].imagew="31"; g.iconlist[87].imageh="35"; g.iconlist[87].imageox="0"; g.iconlist[87].imageoy="0"; g.iconlist[87].imageax="15"; g.iconlist[87].imageay="35"; g.iconlist[88]={}; g.iconlist[88].imagew="31"; g.iconlist[88].imageh="35"; g.iconlist[88].imageox="0"; g.iconlist[88].imageoy="0"; g.iconlist[88].imageax="15"; g.iconlist[88].imageay="35"; g.iconlist[89]={}; g.iconlist[89].imagew="31"; g.iconlist[89].imageh="35"; g.iconlist[89].imageox="0"; g.iconlist[89].imageoy="0"; g.iconlist[89].imageax="15"; g.iconlist[89].imageay="35"; g.iconlist[90]={}; g.iconlist[90].imagew="31"; g.iconlist[90].imageh="35"; g.iconlist[90].imageox="0"; g.iconlist[90].imageoy="0"; g.iconlist[90].imageax="15"; g.iconlist[90].imageay="35"; g.iconlist[91]={}; g.iconlist[91].imagew="31"; g.iconlist[91].imageh="35"; g.iconlist[91].imageox="0"; g.iconlist[91].imageoy="0"; g.iconlist[91].imageax="15"; g.iconlist[91].imageay="35"; g.iconlist[92]={}; g.iconlist[92].imagew="31"; g.iconlist[92].imageh="35"; g.iconlist[92].imageox="0"; g.iconlist[92].imageoy="0"; g.iconlist[92].imageax="15"; g.iconlist[92].imageay="35"; g.iconlist[93]={}; g.iconlist[93].imagew="31"; g.iconlist[93].imageh="35"; g.iconlist[93].imageox="0"; g.iconlist[93].imageoy="0"; g.iconlist[93].imageax="15"; g.iconlist[93].imageay="35"; g.iconlist[94]={}; g.iconlist[94].imagew="31"; g.iconlist[94].imageh="35"; g.iconlist[94].imageox="0"; g.iconlist[94].imageoy="0"; g.iconlist[94].imageax="15"; g.iconlist[94].imageay="35"; g.iconlist[95]={}; g.iconlist[95].imagew="31"; g.iconlist[95].imageh="35"; g.iconlist[95].imageox="0"; g.iconlist[95].imageoy="0"; g.iconlist[95].imageax="15"; g.iconlist[95].imageay="35"; var limit_object = -1; var object_count = 0 ; var opened_window ; var searchMarkerID = 0 ; g.run=function(d){ g.data=JSON2.parse(d); if( g.data.datalist == undefined){ g.data.datalist={}; g.data.datalist.position=""; // top , right, left, bottom g.data.datalist.width=""; // none if top or bottom g.data.datalist.height=""; // none if left or right g.data.datalist.bgcolor="#F0F0F0"; }else{ if( g.data.datalist.position != undefined){ var positionArr=["", "top", "bottom", "left", "right"]; g.data.datalist.position=positionArr[g.data.datalist.position] ; } } if(g.data.datalist.showmarkers== undefined) g.data.datalist.showmarkers=-1; if( g.data.crowdmap == undefined){ g.data.crowdmap={}; g.data.crowdmap.mode=""; g.data.crowdmap.markericon=3; } //g.data.width="800px"; //g.data.height="600px"; // modify to 100% if browser is mobile /* if(navigator.userAgent.indexOf('iPhone')!=-1||navigator.userAgent.indexOf('Android')!=-1){ g.data.width=100; g.data.width_unit='%'; g.data.height=100; g.data.height_unit='%'; } */ var gmap_informationbox_style="overflow: hidden; border: 1px solid #DDD; font-family: Verdana,Geneva,sans-serif; font-size: 12px; margin: 5px;"; if( g.data.datalist.position=="top"||g.data.datalist.position=="left" ) document.write('
'+ '
'+ '
'); else document.write('
'+ '
'+ '
'); var script=document.createElement('script'); var lang = ''; if(g.data.lang != undefined && g.data.lang != "") lang = '&language='+g.data.lang; // here we dynamically determine whether mapkey is used script.src='//maps.google.com/maps/api/js?key='+net.imapbuilder.gmap.mapkey+'&callback=net.imapbuilder.gmap.initialize&libraries=geometry'+lang; // &v=3.3 script.type='text/javascript'; document.body.appendChild(script); if( g.data.font_size!=undefined) document.getElementById('gmap_'+g.data.fileid).style.fontSize=g.data.font_size+'px'; if( g.data.font_family!=undefined) document.getElementById('gmap_'+g.data.fileid).style.fontFamily=g.data.font_family; } // get device width and height g.getWidth=function(){ xWidth = null; if(window.screen != null) xWidth = window.screen.availWidth; if(window.innerWidth != null) xWidth = window.innerWidth; if(document.body != null) xWidth = document.body.clientWidth; return xWidth; } g.getHeight=function() { xHeight = null; if(window.screen != null) xHeight = window.screen.availHeight; if(window.innerHeight != null) xHeight = window.innerHeight; if(document.body != null) xHeight = document.body.clientHeight; return xHeight; } g.initialize=function(){ map_geocoder=new google.maps.Geocoder(); // start of clustering function //if(g.data.clustering===true){ function MarkerClusterer(map, opt_markers, opt_options) { // MarkerClusterer implements google.maps.OverlayView interface. We use the // extend function to extend MarkerClusterer with google.maps.OverlayView // because it might not always be available when the code is defined so we // look for it at the last possible moment. If it doesn't exist now then // there is no point going ahead :) this.extend(MarkerClusterer, google.maps.OverlayView); this.map_ = map; /** * @type {Array.} * @private */ this.markers_ = []; /** * @type {Array.} */ this.clusters_ = []; this.sizes = [53, 56, 66, 78, 90]; /** * @private */ this.styles_ = []; /** * @type {boolean} * @private */ this.ready_ = false; var options = opt_options || {}; /** * @type {number} * @private */ this.gridSize_ = options['gridSize'] || 60; /** * @private */ this.minClusterSize_ = options['minimumClusterSize'] || 2; /** * @type {?number} * @private */ this.maxZoom_ = options['maxZoom'] || null; this.styles_ = options['styles'] || []; /** * @type {string} * @private */ this.imagePath_ = options['imagePath'] || this.MARKER_CLUSTER_IMAGE_PATH_; /** * @type {string} * @private */ this.imageExtension_ = options['imageExtension'] || this.MARKER_CLUSTER_IMAGE_EXTENSION_; /** * @type {boolean} * @private */ this.zoomOnClick_ = true; if (options['zoomOnClick'] != undefined) { this.zoomOnClick_ = options['zoomOnClick']; } /** * @type {boolean} * @private */ this.averageCenter_ = false; if (options['averageCenter'] != undefined) { this.averageCenter_ = options['averageCenter']; } this.setupStyles_(); this.setMap(map); /** * @type {number} * @private */ this.prevZoom_ = this.map_.getZoom(); // Add the map event listeners var that = this; google.maps.event.addListener(this.map_, 'zoom_changed', function() { var zoom = that.map_.getZoom(); if (that.prevZoom_ != zoom) { that.prevZoom_ = zoom; that.resetViewport(); } }); google.maps.event.addListener(this.map_, 'idle', function() { that.redraw(); }); // Finally, add the markers if (opt_markers && opt_markers.length) { this.addMarkers(opt_markers, false); } } /** * The marker cluster image path. * * @type {string} * @private */ MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ = '//google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/' + 'images/m'; /** * The marker cluster image path. * * @type {string} * @private */ MarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = 'png'; /** * Extends a objects prototype by anothers. * * @param {Object} obj1 The object to be extended. * @param {Object} obj2 The object to extend with. * @return {Object} The new extended object. * @ignore */ MarkerClusterer.prototype.extend = function(obj1, obj2) { return (function(object) { for (var property in object.prototype) { this.prototype[property] = object.prototype[property]; } return this; }).apply(obj1, [obj2]); }; /** * Implementaion of the interface method. * @ignore */ MarkerClusterer.prototype.onAdd = function() { this.setReady_(true); }; /** * Implementaion of the interface method. * @ignore */ MarkerClusterer.prototype.draw = function() {}; /** * Sets up the styles object. * * @private */ MarkerClusterer.prototype.setupStyles_ = function() { if (this.styles_.length) { return; } for (var i = 0, size; size = this.sizes[i]; i++) { this.styles_.push({ url: this.imagePath_ + (i + 1) + '.' + this.imageExtension_, height: size, width: size }); } }; /** * Fit the map to the bounds of the markers in the clusterer. */ MarkerClusterer.prototype.fitMapToMarkers = function() { var markers = this.getMarkers(); var bounds = new google.maps.LatLngBounds(); for (var i = 0, marker; marker = markers[i]; i++) { bounds.extend(marker.getPosition()); } this.map_.fitBounds(bounds); }; /** * Sets the styles. * * @param {Object} styles The style to set. */ MarkerClusterer.prototype.setStyles = function(styles) { this.styles_ = styles; }; /** * Gets the styles. * * @return {Object} The styles object. */ MarkerClusterer.prototype.getStyles = function() { return this.styles_; }; /** * Whether zoom on click is set. * * @return {boolean} True if zoomOnClick_ is set. */ MarkerClusterer.prototype.isZoomOnClick = function() { return this.zoomOnClick_; }; /** * Whether average center is set. * * @return {boolean} True if averageCenter_ is set. */ MarkerClusterer.prototype.isAverageCenter = function() { return this.averageCenter_; }; /** * Returns the array of markers in the clusterer. * * @return {Array.} The markers. */ MarkerClusterer.prototype.getMarkers = function() { return this.markers_; }; /** * Returns the number of markers in the clusterer * * @return {Number} The number of markers. */ MarkerClusterer.prototype.getTotalMarkers = function() { return this.markers_.length; }; /** * Sets the max zoom for the clusterer. * * @param {number} maxZoom The max zoom level. */ MarkerClusterer.prototype.setMaxZoom = function(maxZoom) { this.maxZoom_ = maxZoom; }; /** * Gets the max zoom for the clusterer. * * @return {number} The max zoom level. */ MarkerClusterer.prototype.getMaxZoom = function() { return this.maxZoom_; }; /** * The function for calculating the cluster icon image. * * @param {Array.} markers The markers in the clusterer. * @param {number} numStyles The number of styles available. * @return {Object} A object properties: 'text' (string) and 'index' (number). * @private */ MarkerClusterer.prototype.calculator_ = function(markers, numStyles) { var index = 0; var count = markers.length; var dv = count; while (dv !== 0) { dv = parseInt(dv / 10, 10); index++; } index = Math.min(index, numStyles); return { text: count, index: index }; }; /** * Set the calculator function. * * @param {function(Array, number)} calculator The function to set as the * calculator. The function should return a object properties: * 'text' (string) and 'index' (number). * */ MarkerClusterer.prototype.setCalculator = function(calculator) { this.calculator_ = calculator; }; /** * Get the calculator function. * * @return {function(Array, number)} the calculator function. */ MarkerClusterer.prototype.getCalculator = function() { return this.calculator_; }; /** * Add an array of markers to the clusterer. * * @param {Array.} markers The markers to add. * @param {boolean=} opt_nodraw Whether to redraw the clusters. */ MarkerClusterer.prototype.addMarkers = function(markers, opt_nodraw) { /* for (var i = 0, marker; marker = markers[i]; i++) { this.pushMarkerTo_(marker); } */ //Terry modified 20120326 for(var i = 0 ; i < markers.length ; i++){ if( markers[i] != undefined ) this.pushMarkerTo_(markers[i]); } if (!opt_nodraw) { this.redraw(); } }; /** * Pushes a marker to the clusterer. * * @param {google.maps.Marker} marker The marker to add. * @private */ MarkerClusterer.prototype.pushMarkerTo_ = function(marker) { marker.isAdded = false; if (marker['draggable']) { // If the marker is draggable add a listener so we update the clusters on // the drag end. var that = this; google.maps.event.addListener(marker, 'dragend', function() { marker.isAdded = false; that.repaint(); }); } this.markers_.push(marker); }; /** * Adds a marker to the clusterer and redraws if needed. * * @param {google.maps.Marker} marker The marker to add. * @param {boolean=} opt_nodraw Whether to redraw the clusters. */ MarkerClusterer.prototype.addMarker = function(marker, opt_nodraw) { this.pushMarkerTo_(marker); if (!opt_nodraw) { this.redraw(); } }; /** * Removes a marker and returns true if removed, false if not * * @param {google.maps.Marker} marker The marker to remove * @return {boolean} Whether the marker was removed or not * @private */ MarkerClusterer.prototype.removeMarker_ = function(marker) { var index = -1; if (this.markers_.indexOf) { index = this.markers_.indexOf(marker); } else { for (var i = 0, m; m = this.markers_[i]; i++) { if (m == marker) { index = i; break; } } } if (index == -1) { // Marker is not in our list of markers. return false; } marker.setMap(null); this.markers_.splice(index, 1); return true; }; /** * Remove a marker from the cluster. * * @param {google.maps.Marker} marker The marker to remove. * @param {boolean=} opt_nodraw Optional boolean to force no redraw. * @return {boolean} True if the marker was removed. */ MarkerClusterer.prototype.removeMarker = function(marker, opt_nodraw) { var removed = this.removeMarker_(marker); if (!opt_nodraw && removed) { this.resetViewport(); this.redraw(); return true; } else { return false; } }; /** * Removes an array of markers from the cluster. * * @param {Array.} markers The markers to remove. * @param {boolean=} opt_nodraw Optional boolean to force no redraw. */ MarkerClusterer.prototype.removeMarkers = function(markers, opt_nodraw) { var removed = false; for (var i = 0, marker; marker = markers[i]; i++) { var r = this.removeMarker_(marker); removed = removed || r; } if (!opt_nodraw && removed) { this.resetViewport(); this.redraw(); return true; } }; /** * Sets the clusterer's ready state. * * @param {boolean} ready The state. * @private */ MarkerClusterer.prototype.setReady_ = function(ready) { if (!this.ready_) { this.ready_ = ready; this.createClusters_(); } }; /** * Returns the number of clusters in the clusterer. * * @return {number} The number of clusters. */ MarkerClusterer.prototype.getTotalClusters = function() { return this.clusters_.length; }; /** * Returns the google map that the clusterer is associated with. * * @return {google.maps.Map} The map. */ MarkerClusterer.prototype.getMap = function() { return this.map_; }; /** * Sets the google map that the clusterer is associated with. * * @param {google.maps.Map} map The map. */ MarkerClusterer.prototype.setMap = function(map) { this.map_ = map; }; /** * Returns the size of the grid. * * @return {number} The grid size. */ MarkerClusterer.prototype.getGridSize = function() { return this.gridSize_; }; /** * Sets the size of the grid. * * @param {number} size The grid size. */ MarkerClusterer.prototype.setGridSize = function(size) { this.gridSize_ = size; }; /** * Returns the min cluster size. * * @return {number} The grid size. */ MarkerClusterer.prototype.getMinClusterSize = function() { return this.minClusterSize_; }; /** * Sets the min cluster size. * * @param {number} size The grid size. */ MarkerClusterer.prototype.setMinClusterSize = function(size) { this.minClusterSize_ = size; }; /** * Extends a bounds object by the grid size. * * @param {google.maps.LatLngBounds} bounds The bounds to extend. * @return {google.maps.LatLngBounds} The extended bounds. */ MarkerClusterer.prototype.getExtendedBounds = function(bounds) { var projection = this.getProjection(); // Turn the bounds into latlng. var tr = new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng()); var bl = new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng()); // Convert the points to pixels and the extend out by the grid size. var trPix = projection.fromLatLngToDivPixel(tr); trPix.x += this.gridSize_; trPix.y -= this.gridSize_; var blPix = projection.fromLatLngToDivPixel(bl); blPix.x -= this.gridSize_; blPix.y += this.gridSize_; // Convert the pixel points back to LatLng var ne = projection.fromDivPixelToLatLng(trPix); var sw = projection.fromDivPixelToLatLng(blPix); // Extend the bounds to contain the new bounds. bounds.extend(ne); bounds.extend(sw); return bounds; }; /** * Determins if a marker is contained in a bounds. * * @param {google.maps.Marker} marker The marker to check. * @param {google.maps.LatLngBounds} bounds The bounds to check against. * @return {boolean} True if the marker is in the bounds. * @private */ MarkerClusterer.prototype.isMarkerInBounds_ = function(marker, bounds) { return bounds.contains(marker.getPosition()); }; /** * Clears all clusters and markers from the clusterer. */ MarkerClusterer.prototype.clearMarkers = function() { this.resetViewport(true); // Set the markers a empty array. this.markers_ = []; }; /** * Clears all existing clusters and recreates them. * @param {boolean} opt_hide To also hide the marker. */ MarkerClusterer.prototype.resetViewport = function(opt_hide) { // Remove all the clusters for (var i = 0, cluster; cluster = this.clusters_[i]; i++) { cluster.remove(); } // Reset the markers to not be added and to be invisible. for (var i = 0, marker; marker = this.markers_[i]; i++) { marker.isAdded = false; if (opt_hide) { marker.setMap(null); } } this.clusters_ = []; }; /** * */ MarkerClusterer.prototype.repaint = function() { var oldClusters = this.clusters_.slice(); this.clusters_.length = 0; this.resetViewport(); this.redraw(); // Remove the old clusters. // Do it in a timeout so the other clusters have been drawn first. window.setTimeout(function() { for (var i = 0, cluster; cluster = oldClusters[i]; i++) { cluster.remove(); } }, 0); }; /** * Redraws the clusters. */ MarkerClusterer.prototype.redraw = function() { this.createClusters_(); }; /** * Calculates the distance between two latlng locations in km. * @see http://www.movable-type.co.uk/scripts/latlong.html * * @param {google.maps.LatLng} p1 The first lat lng point. * @param {google.maps.LatLng} p2 The second lat lng point. * @return {number} The distance between the two points in km. * @private */ MarkerClusterer.prototype.distanceBetweenPoints_ = function(p1, p2) { if (!p1 || !p2) { return 0; } var R = 6371; // Radius of the Earth in km var dLat = (p2.lat() - p1.lat()) * Math.PI / 180; var dLon = (p2.lng() - p1.lng()) * Math.PI / 180; var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); var d = R * c; return d; }; /** * Add a marker to a cluster, or creates a new cluster. * * @param {google.maps.Marker} marker The marker to add. * @private */ MarkerClusterer.prototype.addToClosestCluster_ = function(marker) { var distance = 40000; // Some large number var clusterToAddTo = null; var pos = marker.getPosition(); for (var i = 0, cluster; cluster = this.clusters_[i]; i++) { var center = cluster.getCenter(); if (center) { var d = this.distanceBetweenPoints_(center, marker.getPosition()); if (d < distance) { distance = d; clusterToAddTo = cluster; } } } if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) { clusterToAddTo.addMarker(marker); } else { var cluster = new Cluster(this); cluster.addMarker(marker); this.clusters_.push(cluster); } }; /** * Creates the clusters. * * @private */ MarkerClusterer.prototype.createClusters_ = function() { if (!this.ready_) { return; } // Get our current map view bounds. // Create a new bounds object so we don't affect the map. var mapBounds = new google.maps.LatLngBounds(this.map_.getBounds().getSouthWest(), this.map_.getBounds().getNorthEast()); var bounds = this.getExtendedBounds(mapBounds); for (var i = 0, marker; marker = this.markers_[i]; i++) { if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) { this.addToClosestCluster_(marker); } } }; /** * A cluster that contains markers. * * @param {MarkerClusterer} markerClusterer The markerclusterer that this * cluster is associated with. * @constructor * @ignore */ function Cluster(markerClusterer) { this.markerClusterer_ = markerClusterer; this.map_ = markerClusterer.getMap(); this.gridSize_ = markerClusterer.getGridSize(); this.minClusterSize_ = markerClusterer.getMinClusterSize(); this.averageCenter_ = markerClusterer.isAverageCenter(); this.center_ = null; this.markers_ = []; this.bounds_ = null; this.clusterIcon_ = new ClusterIcon(this, markerClusterer.getStyles(), markerClusterer.getGridSize()); } /** * Determins if a marker is already added to the cluster. * * @param {google.maps.Marker} marker The marker to check. * @return {boolean} True if the marker is already added. */ Cluster.prototype.isMarkerAlreadyAdded = function(marker) { if (this.markers_.indexOf) { return this.markers_.indexOf(marker) != -1; } else { for (var i = 0, m; m = this.markers_[i]; i++) { if (m == marker) { return true; } } } return false; }; /** * Add a marker the cluster. * * @param {google.maps.Marker} marker The marker to add. * @return {boolean} True if the marker was added. */ Cluster.prototype.addMarker = function(marker) { if (this.isMarkerAlreadyAdded(marker)) { return false; } if (!this.center_) { this.center_ = marker.getPosition(); this.calculateBounds_(); } else { if (this.averageCenter_) { var l = this.markers_.length + 1; var lat = (this.center_.lat() * (l-1) + marker.getPosition().lat()) / l; var lng = (this.center_.lng() * (l-1) + marker.getPosition().lng()) / l; this.center_ = new google.maps.LatLng(lat, lng); this.calculateBounds_(); } } marker.isAdded = true; this.markers_.push(marker); var len = this.markers_.length; if (len < this.minClusterSize_ && marker.getMap() != this.map_) { // Min cluster size not reached so show the marker. marker.setMap(this.map_); } if (len == this.minClusterSize_) { // Hide the markers that were showing. for (var i = 0; i < len; i++) { this.markers_[i].setMap(null); } } if (len >= this.minClusterSize_) { marker.setMap(null); } this.updateIcon(); return true; }; /** * Returns the marker clusterer that the cluster is associated with. * * @return {MarkerClusterer} The associated marker clusterer. */ Cluster.prototype.getMarkerClusterer = function() { return this.markerClusterer_; }; /** * Returns the bounds of the cluster. * * @return {google.maps.LatLngBounds} the cluster bounds. */ Cluster.prototype.getBounds = function() { var bounds = new google.maps.LatLngBounds(this.center_, this.center_); var markers = this.getMarkers(); for (var i = 0, marker; marker = markers[i]; i++) { bounds.extend(marker.getPosition()); } return bounds; }; /** * Removes the cluster */ Cluster.prototype.remove = function() { this.clusterIcon_.remove(); this.markers_.length = 0; delete this.markers_; }; /** * Returns the center of the cluster. * * @return {number} The cluster center. */ Cluster.prototype.getSize = function() { return this.markers_.length; }; /** * Returns the center of the cluster. * * @return {Array.} The cluster center. */ Cluster.prototype.getMarkers = function() { return this.markers_; }; /** * Returns the center of the cluster. * * @return {google.maps.LatLng} The cluster center. */ Cluster.prototype.getCenter = function() { return this.center_; }; /** * Calculated the extended bounds of the cluster with the grid. * * @private */ Cluster.prototype.calculateBounds_ = function() { var bounds = new google.maps.LatLngBounds(this.center_, this.center_); this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds); }; /** * Determines if a marker lies in the clusters bounds. * * @param {google.maps.Marker} marker The marker to check. * @return {boolean} True if the marker lies in the bounds. */ Cluster.prototype.isMarkerInClusterBounds = function(marker) { return this.bounds_.contains(marker.getPosition()); }; /** * Returns the map that the cluster is associated with. * * @return {google.maps.Map} The map. */ Cluster.prototype.getMap = function() { return this.map_; }; /** * Updates the cluster icon */ Cluster.prototype.updateIcon = function() { var zoom = this.map_.getZoom(); var mz = this.markerClusterer_.getMaxZoom(); if (mz && zoom > mz) { // The zoom is greater than our max zoom so show all the markers in cluster. for (var i = 0, marker; marker = this.markers_[i]; i++) { marker.setMap(this.map_); } return; } if (this.markers_.length < this.minClusterSize_) { // Min cluster size not yet reached. this.clusterIcon_.hide(); return; } var numStyles = this.markerClusterer_.getStyles().length; var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles); this.clusterIcon_.setCenter(this.center_); this.clusterIcon_.setSums(sums); this.clusterIcon_.show(); }; /** * A cluster icon * * @param {Cluster} cluster The cluster to be associated with. * @param {Object} styles An object that has style properties: * 'url': (string) The image url. * 'height': (number) The image height. * 'width': (number) The image width. * 'anchor': (Array) The anchor position of the label text. * 'textColor': (string) The text color. * 'textSize': (number) The text size. * 'backgroundPosition: (string) The background postition x, y. * @param {number=} opt_padding Optional padding to apply to the cluster icon. * @constructor * @extends google.maps.OverlayView * @ignore */ function ClusterIcon(cluster, styles, opt_padding) { cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView); this.styles_ = styles; this.padding_ = opt_padding || 0; this.cluster_ = cluster; this.center_ = null; this.map_ = cluster.getMap(); this.div_ = null; this.sums_ = null; this.visible_ = false; this.setMap(this.map_); } /** * Triggers the clusterclick event and zoom's if the option is set. */ ClusterIcon.prototype.triggerClusterClick = function() { var markerClusterer = this.cluster_.getMarkerClusterer(); // Trigger the clusterclick event. google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_); if(g.data.clustering_click == "list"){ // show infowindow with marker content cluster_infowindow=new google.maps.InfoWindow(); var markers = this.cluster_.getMarkers(); var html = ''; var marker_link = ''; var marker_icon = ''; var marker_title = ''; var marker_desc = ''; html += ''+ markers.length + ' markers
'; html += '
'; for (var i = 0, marker; marker = markers[i]; i++) { marker_link = 'map.setCenter(new google.maps.LatLng('+marker.position.lat()+','+marker.position.lng()+')); map.setZoom(15);'+ 'google.maps.event.trigger(markers[\''+marker.markerid+'\'], \'click\');'+ 'cluster_infowindow.close();'; marker_icon = ''; marker_desc = ''; marker_title = ''; // markers icon marker_icon += ''; if( !isNaN(marker.iconid) ) marker_icon += ''; else marker_icon += ''; marker_icon += ''; // markers title marker_title += ''+marker.title +''; //markers description marker_desc += ''+marker.desc +''; // infowindow content html += ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ '
'+marker_icon+''+marker_title+'
'+marker_desc+'
'; } html += '
'; cluster_infowindow.setOptions({content:html,position:this.center_}); cluster_infowindow.open(map); }else{ // if click to zoom var markerClusterer = this.cluster_.getMarkerClusterer(); if (markerClusterer.isZoomOnClick()) { // Zoom into the cluster. this.map_.fitBounds(this.cluster_.getBounds()); } } }; /** * Adding the cluster icon to the dom. * @ignore */ ClusterIcon.prototype.onAdd = function() { this.div_ = document.createElement('DIV'); if (this.visible_) { var pos = this.getPosFromLatLng_(this.center_); this.div_.style.cssText = this.createCss(pos); this.div_.innerHTML = this.sums_.text; } var panes = this.getPanes(); panes.overlayMouseTarget.appendChild(this.div_); var that = this; google.maps.event.addDomListener(this.div_, 'click', function() { that.triggerClusterClick(); }); /* google.maps.event.addDomListener(this.div_, 'dblclick', function() { that.triggerClusterDblClick(); }); */ }; /** * Returns the position to place the div dending on the latlng. * * @param {google.maps.LatLng} latlng The position in latlng. * @return {google.maps.Point} The position in pixels. * @private */ ClusterIcon.prototype.getPosFromLatLng_ = function(latlng) { var pos = this.getProjection().fromLatLngToDivPixel(latlng); pos.x -= parseInt(this.width_ / 2, 10); pos.y -= parseInt(this.height_ / 2, 10); return pos; }; /** * Draw the icon. * @ignore */ ClusterIcon.prototype.draw = function() { if (this.visible_) { var pos = this.getPosFromLatLng_(this.center_); this.div_.style.top = pos.y + 'px'; this.div_.style.left = pos.x + 'px'; } }; /** * Hide the icon. */ ClusterIcon.prototype.hide = function() { if (this.div_) { this.div_.style.display = 'none'; } this.visible_ = false; }; /** * Position and show the icon. */ ClusterIcon.prototype.show = function() { if (this.div_) { var pos = this.getPosFromLatLng_(this.center_); this.div_.style.cssText = this.createCss(pos); this.div_.style.display = ''; } this.visible_ = true; }; /** * Remove the icon from the map */ ClusterIcon.prototype.remove = function() { this.setMap(null); }; /** * Implementation of the onRemove interface. * @ignore */ ClusterIcon.prototype.onRemove = function() { if (this.div_ && this.div_.parentNode) { this.hide(); this.div_.parentNode.removeChild(this.div_); this.div_ = null; } }; /** * Set the sums of the icon. * * @param {Object} sums The sums containing: * 'text': (string) The text to display in the icon. * 'index': (number) The style index of the icon. */ ClusterIcon.prototype.setSums = function(sums) { this.sums_ = sums; this.text_ = sums.text; this.index_ = sums.index; if (this.div_) { this.div_.innerHTML = sums.text; } this.useStyle(); }; /** * Sets the icon to the the styles. */ ClusterIcon.prototype.useStyle = function() { var index = Math.max(0, this.sums_.index - 1); index = Math.min(this.styles_.length - 1, index); var style = this.styles_[index]; this.url_ = style['url']; this.height_ = style['height']; this.width_ = style['width']; this.textColor_ = style['textColor']; this.anchor_ = style['anchor']; this.textSize_ = style['textSize']; this.backgroundPosition_ = style['backgroundPosition']; }; /** * Sets the center of the icon. * * @param {google.maps.LatLng} center The latlng to set as the center. */ ClusterIcon.prototype.setCenter = function(center) { this.center_ = center; }; /** * Create the css text based on the position of the icon. * * @param {google.maps.Point} pos The position. * @return {string} The css style text. */ ClusterIcon.prototype.createCss = function(pos) { var style = []; style.push('background-image:url(' + this.url_ + ');'); var backgroundPosition = this.backgroundPosition_ ? this.backgroundPosition_ : '0 0'; style.push('background-position:' + backgroundPosition + ';'); if (typeof this.anchor_ === 'object') { if (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 && this.anchor_[0] < this.height_) { style.push('height:' + (this.height_ - this.anchor_[0]) + 'px; padding-top:' + this.anchor_[0] + 'px;'); } else { style.push('height:' + this.height_ + 'px; line-height:' + this.height_ + 'px;'); } if (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 && this.anchor_[1] < this.width_) { style.push('width:' + (this.width_ - this.anchor_[1]) + 'px; padding-left:' + this.anchor_[1] + 'px;'); } else { style.push('width:' + this.width_ + 'px; text-align:center;'); } } else { style.push('height:' + this.height_ + 'px; line-height:' + this.height_ + 'px; width:' + this.width_ + 'px; text-align:center;'); } var txtColor = this.textColor_ ? this.textColor_ : 'black'; var txtSize = this.textSize_ ? this.textSize_ : 11; style.push('cursor:pointer; top:' + pos.y + 'px; left:' + pos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' + txtSize + 'px; font-family:Arial,sans-serif; font-weight:bold'); return style.join(''); }; // Export Symbols for Closure // If you are not going to compile with closure then you can remove the // code below. window['MarkerClusterer'] = MarkerClusterer; MarkerClusterer.prototype['addMarker'] = MarkerClusterer.prototype.addMarker; MarkerClusterer.prototype['addMarkers'] = MarkerClusterer.prototype.addMarkers; MarkerClusterer.prototype['clearMarkers'] = MarkerClusterer.prototype.clearMarkers; MarkerClusterer.prototype['fitMapToMarkers'] = MarkerClusterer.prototype.fitMapToMarkers; MarkerClusterer.prototype['getCalculator'] = MarkerClusterer.prototype.getCalculator; MarkerClusterer.prototype['getGridSize'] = MarkerClusterer.prototype.getGridSize; MarkerClusterer.prototype['getExtendedBounds'] = MarkerClusterer.prototype.getExtendedBounds; MarkerClusterer.prototype['getMap'] = MarkerClusterer.prototype.getMap; MarkerClusterer.prototype['getMarkers'] = MarkerClusterer.prototype.getMarkers; MarkerClusterer.prototype['getMaxZoom'] = MarkerClusterer.prototype.getMaxZoom; MarkerClusterer.prototype['getStyles'] = MarkerClusterer.prototype.getStyles; MarkerClusterer.prototype['getTotalClusters'] = MarkerClusterer.prototype.getTotalClusters; MarkerClusterer.prototype['getTotalMarkers'] = MarkerClusterer.prototype.getTotalMarkers; MarkerClusterer.prototype['redraw'] = MarkerClusterer.prototype.redraw; MarkerClusterer.prototype['removeMarker'] = MarkerClusterer.prototype.removeMarker; MarkerClusterer.prototype['removeMarkers'] = MarkerClusterer.prototype.removeMarkers; MarkerClusterer.prototype['resetViewport'] = MarkerClusterer.prototype.resetViewport; MarkerClusterer.prototype['repaint'] = MarkerClusterer.prototype.repaint; MarkerClusterer.prototype['setCalculator'] = MarkerClusterer.prototype.setCalculator; MarkerClusterer.prototype['setGridSize'] = MarkerClusterer.prototype.setGridSize; MarkerClusterer.prototype['setMaxZoom'] = MarkerClusterer.prototype.setMaxZoom; MarkerClusterer.prototype['onAdd'] = MarkerClusterer.prototype.onAdd; MarkerClusterer.prototype['draw'] = MarkerClusterer.prototype.draw; Cluster.prototype['getCenter'] = Cluster.prototype.getCenter; Cluster.prototype['getSize'] = Cluster.prototype.getSize; Cluster.prototype['getMarkers'] = Cluster.prototype.getMarkers; ClusterIcon.prototype['onAdd'] = ClusterIcon.prototype.onAdd; ClusterIcon.prototype['draw'] = ClusterIcon.prototype.draw; ClusterIcon.prototype['onRemove'] = ClusterIcon.prototype.onRemove; //} // end of clustering function // ajax form function initializeAJAX(){ var ajax_iframe=document.createElement("iframe"); ajax_iframe.name="ajax_iframe"; ajax_iframe.id="ajax_iframe"; ajax_iframe.style.display="none"; ajax_iframe.style.position="absolute"; ajax_iframe.style.top="100px"; // 100 ajax_iframe.style.width="1px"; // 1px ajax_iframe.style.height="1px"; // 1px document.body.appendChild(ajax_iframe); ajax_form=document.createElement("form"); ajax_form.id="ajax_form"; ajax_form.name="ajax_form"; ajax_form.method="post"; ajax_form.target="ajax_iframe"; var input=document.createElement("input"); input.id="ca_mapid"; input.name="ca_mapid"; input.type="hidden"; input.value=""; ajax_form.appendChild(input); input=document.createElement("input"); input.id="ca_usertype"; input.name="ca_usertype"; input.type="hidden"; input.value=""; ajax_form.appendChild(input); input=document.createElement("input"); input.id="ca_userid"; input.name="ca_userid"; input.type="hidden"; input.value=""; ajax_form.appendChild(input); input=document.createElement("input"); input.id="ca_username"; input.name="ca_username"; input.type="hidden"; input.value=""; ajax_form.appendChild(input); input=document.createElement("input"); input.id="ca_useremail"; input.name="ca_useremail"; input.type="hidden"; input.value=""; ajax_form.appendChild(input); input=document.createElement("input"); input.id="ca_latlng"; input.name="ca_latlng"; input.type="hidden"; input.value=''; ajax_form.appendChild(input); input=document.createElement("input"); input.id="ca_address"; input.name="ca_address"; input.type="hidden"; input.value=''; ajax_form.appendChild(input); input=document.createElement("input"); input.id="ca_description"; input.name="ca_description"; input.type="hidden"; input.value=''; ajax_form.appendChild(input); input=document.createElement("input"); input.id="ca_date"; input.name="ca_date"; input.type="hidden"; input.value='now'; ajax_form.appendChild(input); document.body.appendChild(ajax_form); } // init modal modal_div=document.createElement("div"); modal_div.style.position="absolute"; modal_div.id="modal_div"; modal_div.style.left="0px"; modal_div.style.top="0px"; modal_div.style.bottom="0px"; modal_div.style.right="0px"; modal_div.style.backgroundColor="#000000"; modal_div.style.opacity="0.5"; modal_div.style.zIndex="1"; if(navigator.appName=='Microsoft Internet Explorer'){ modal_div.style.filter="alpha(opacity=50)"; } var mapTypeId=[google.maps.MapTypeId.ROADMAP,google.maps.MapTypeId.SATELLITE,google.maps.MapTypeId.HYBRID,google.maps.MapTypeId.TERRAIN]; var options={}; for(var i in g.data.options){ if(typeof(g.data.options[i])!='object'){ if ( i == "infoAutoPan") continue; options[i]=g.data.options[i]; } } options.center=new google.maps.LatLng(g.data.options.center[0],g.data.options.center[1]); //options.mapTypeId=mapTypeId[g.data.options.mapTypeId[0]]; map=new google.maps.Map(document.getElementById('gmap_'+g.data.fileid),options); google.maps.event.addListener(map, 'zoom_changed', function() { if(clickCircle!= undefined) clickCircle.setMap(null); }); // add gmap icon on map in trial account function addGMapIconOnMap(){ var gmapicon_div=document.createElement("div"); //gmapicon_div.style.width="480px"; //gmapicon_div.style.height="320px"; //gmapicon_div.style.backgroundColor="#F0F0F0"; gmapicon_div.style.position="absolute"; gmapicon_div.style.bottom="20px"; gmapicon_div.style.left="40%"; gmapicon_div.style.marginLeft="0px"; gmapicon_div.style.marginBottom="0px"; gmapicon_div.style.display='block'; gmapicon_div.style.zIndex="1"; var cl_content = '
'+ ''+ ''+ ''+ '
'; gmapicon_div.innerHTML=cl_content; if ( document.getElementById('gmap_'+g.data.fileid) ) { var map_div = document.getElementById('gmap_'+g.data.fileid); map_div.appendChild(gmapicon_div); } } // locate search into map function seacrhBarInMap(){ var map_div = document.getElementById('gmap_'+g.data.fileid); var searchbar_div = document.createElement('div'); searchbar_div.id="searchbar_div"; searchbar_div.style.position="absolute"; searchbar_div.style.top="5px"; searchbar_div.style.right="130px"; searchbar_div.style.font="14px Arial"; searchbar_div.style.zIndex="1000"; searchbar_div.style.padding="0 5px"; var html = 'Search: '; searchbar_div.innerHTML=html; map_div.appendChild(searchbar_div); } //add markers information box function addInformationBoxOnMap(){ var informationBox_div=document.createElement("div"); informationBox_div.id="informationBox_title"; informationBox_div.style.backgroundColor="#666"; informationBox_div.style.color="#FFF"; informationBox_div.style.padding="3px 10px"; informationBox_div.style.display='block'; informationBox_div.style.zIndex="1"; informationBox_div.style.overflow="hidden"; var inb_content = ''+ ''; if( g.data.crowdmap.mode == "edit"){ inb_content += ''; } inb_content +='
Locations:'+ ''+ ''+ '
'+ ''+ ''+ ''+ '
'+ '
'; informationBox_div.innerHTML=inb_content; var gmap_informationbox = document.getElementById('gmap_informationbox'); gmap_informationbox.appendChild(informationBox_div); var dlc_div=document.createElement("div"); dlc_div.id="dataListContainer"; dlc_div.style.overflowY="scroll"; dlc_div.style.backgroundColor="#F6F6F6"; var inb_height=""; var inb_style=""; if( g.data.datalist.position=="right" || g.data.datalist.position=="left"){ dlc_div.style.height=(g.data.height-40)+"px"; }else if( g.data.datalist.position=="top" || g.data.datalist.position=="bottom"){ dlc_div.style.height=(g.data.datalist.height-45)+"px"; dlc_div.style.width="100%"; dlc_div.style.float="left"; } var dlc_content='
'+ '
'; dlc_div.innerHTML=dlc_content; gmap_informationbox.appendChild(dlc_div); if( g.data.datalist.position=="bottom"||g.data.datalist.position=="top"){ gmap_informationbox.style.height=g.data.datalist.height+"px"; gmap_informationbox.style.width="100%"; }else if( g.data.datalist.position=="right"||g.data.datalist.position=="left"){ document.getElementById('gmap_'+g.data.fileid).style.cssFloat ="left"; document.getElementById('gmap_'+g.data.fileid).style.styleFloat ="left"; gmap_informationbox.style.width=g.data.datalist.width+"px"; gmap_informationbox.style.cssFloat ="left"; gmap_informationbox.style.styleFloat ="left"; gmap_informationbox.style.height="100%"; gmap_informationbox.style.margin="0px 5px"; // resize the top menu bar if(document.getElementById('sharebar')!=undefined&&g.data.width+g.data.width_unit!="100%"){ document.getElementById('sharebar').style.width=(parseInt(g.data.datalist.width)+parseInt(g.data.width)+10)+"px"; } // resize map container if(document.getElementById('map_content')!=undefined&&g.data.width+g.data.width_unit!="100%"){ document.getElementById('map_content').style.width=(parseInt(g.data.datalist.width)+parseInt(g.data.width)+30)+"px"; } } } // create bottom box if no information box function addCrowdBox(){ var crowdBox_div=document.createElement("div"); crowdBox_div.id="crowdBox_div"; crowdBox_div.style.backgroundColor="#666"; crowdBox_div.style.borderWidth="1px"; crowdBox_div.style.borderColor="#CCC"; crowdBox_div.style.borderStyle="solid"; crowdBox_div.style.display='block'; crowdBox_div.style.padding='5px 5px 0px'; crowdBox_div.style.zIndex="1"; crowdBox_div.style.fontSize="12px"; crowdBox_div.style.width= (g.data.width-12)+"px"; crowdBox_div.style.height= "44px"; cs_title = "Add a Location"; if(g.data.crowdmap.inputpanel != undefined && g.data.crowdmap.inputpanel.title != undefined) cs_title = g.data.crowdmap.inputpanel.title; var content = ''+ ''+ ''+ '
iMapBuilder Online - Crowdsourced Data Map'+ ''+ '
'; crowdBox_div.innerHTML=content; var crowdBox = document.getElementById('crowdbox'); crowdBox.appendChild(crowdBox_div); document.getElementById('gmap_informationbox').style.margin="0px"; document.getElementById('gmap_informationbox').style.borderWidth="0px"; if(g.data.crowdmap != undefined && g.data.crowdmap.inputpanel != undefined){ cs_title = g.data.crowdmap.inputpanel.title ; cs_loginas = g.data.crowdmap.inputpanel.loginas ; cs_address = g.data.crowdmap.inputpanel.address ; cs_desc = g.data.crowdmap.inputpanel.desc ; } } if( g.data.datalist.showmarkers != -1 && g.data.datalist!=undefined&&g.data.datalist.position!=undefined&&g.data.datalist.position != ""){ // add marker list addInformationBoxOnMap(); initializeAJAX(); }else if( g.data.crowdmap!=undefined && g.data.crowdmap.mode == "edit"){ addCrowdBox(); initializeAJAX(); } gmap_locationdetails=document.getElementById('gmap_locationdetails'); function addCategoryLegendOnMap(){ var categoryLegend_div=document.createElement("div"); //categoryLegend_div.style.width="480px"; //categoryLegend_div.style.height="320px"; categoryLegend_div.style.backgroundColor="#F0F0F0"; categoryLegend_div.style.position="absolute"; if(g.data.catgoryLegendOptions==undefined||g.data.catgoryLegendOptions.position==undefined){ categoryLegend_div.style.bottom="20px"; categoryLegend_div.style.right="0px"; categoryLegend_div.style.marginRight="10px"; categoryLegend_div.style.marginBottom="10px"; } else{ if(g.data.catgoryLegendOptions.position == 1){ categoryLegend_div.style.top="0px"; categoryLegend_div.style.left="0px"; categoryLegend_div.style.marginLeft="10px"; categoryLegend_div.style.marginTop="10px"; }else if(g.data.catgoryLegendOptions.position == 2){ categoryLegend_div.style.top="0px"; categoryLegend_div.style.left="50%"; categoryLegend_div.style.marginLeft="0px"; categoryLegend_div.style.marginTop="10px"; }else if(g.data.catgoryLegendOptions.position == 3){ categoryLegend_div.style.top="0px"; categoryLegend_div.style.right="0px"; categoryLegend_div.style.marginRight="10px"; categoryLegend_div.style.marginTop="10px"; }else if(g.data.catgoryLegendOptions.position == 4){ categoryLegend_div.style.top="40%"; categoryLegend_div.style.left="0px"; categoryLegend_div.style.marginLeft="10px"; }else if(g.data.catgoryLegendOptions.position == 5){ categoryLegend_div.style.top="40%"; categoryLegend_div.style.left="50%"; }else if(g.data.catgoryLegendOptions.position == 6){ categoryLegend_div.style.top="40%"; categoryLegend_div.style.right="0px"; categoryLegend_div.style.marginRight="10px"; }else if(g.data.catgoryLegendOptions.position == 7){ categoryLegend_div.style.bottom="20px"; categoryLegend_div.style.left="0px"; categoryLegend_div.style.marginLeft="10px"; categoryLegend_div.style.marginBottom="10px"; }else if(g.data.catgoryLegendOptions.position == 8){ categoryLegend_div.style.bottom="20px"; categoryLegend_div.style.left="40%"; categoryLegend_div.style.marginBottom="10px"; }else if(g.data.catgoryLegendOptions.position == 9){ categoryLegend_div.style.bottom="20px"; categoryLegend_div.style.right="0px"; categoryLegend_div.style.marginRight="10px"; categoryLegend_div.style.marginBottom="10px"; }else { categoryLegend_div.style.bottom="20px"; categoryLegend_div.style.right="0px"; categoryLegend_div.style.marginRight="10px"; categoryLegend_div.style.marginBottom="10px"; } } categoryLegend_div.style.borderWidth="2px"; categoryLegend_div.style.borderColor="#666666"; categoryLegend_div.style.borderStyle="solid"; categoryLegend_div.style.display='block'; categoryLegend_div.style.zIndex="1"; var cl_content = '
'; var catCount = 0 ; if (g.data.catlegend!=undefined) { var allcat=g.data.catlegend.length; for (var i=0;i
'; catCount++; } } } if(g.data.crowdmap != undefined && g.data.crowdmap.inputpanel != undefined && g.data.crowdmap.inputpanel.data != undefined){ cs_data = g.data.crowdmap.inputpanel.data ; } if( (g.data.crowdmap.mode=="edit" || g.data.crowdmap.mode=="view") && g.data.crowdmap.clenable == true){ cl_content+= '
'; } cl_content += '
'; categoryLegend_div.innerHTML=cl_content; if ( document.getElementById('gmap_'+g.data.fileid) ) { var map_div = document.getElementById('gmap_'+g.data.fileid); map_div.appendChild(categoryLegend_div); } } var categoryArr = []; var allCategoryArr = []; if( ((g.data.crowdmap.mode=="edit" || g.data.crowdmap.mode=="view") && g.data.crowdmap.clenable == true) || g.data.catlegendenable === true ) addCategoryLegendOnMap(); // add crowd data if(g.data.crowdmap.mode=="edit" || g.data.crowdmap.mode=="view"){ // get all crowd data from db var crowdMarkerCount = 0 ; } g.checkHeatMap(); g.loadObject(); if(g.data.stylemapenable != undefined && g.data.stylemapenable == true){ g.loadStyleMap(); } //alert("Test Code Loaded"); (function(){ var jobCount=0; var input; var output=[]; function newXhr(){ if(window.XMLHttpRequest){ return new XMLHttpRequest(); }else{ return new ActiveXObject("Microsoft.XMLHTTP"); } } function geocodeNext(){ var geocoder=new google.maps.Geocoder(); geocoder.geocode({"address":input.job[jobCount].geocodeAddr},function(results,status){ if(status==google.maps.GeocoderStatus.OK){ output.push({id:input.job[jobCount].id,lat:results[0].geometry.location.lat(),lng:results[0].geometry.location.lng()}); }else{ output.push({id:input.job[jobCount].id,error:status}); } jobCount++; if(jobCount0){ setTimeout(function(){geocodeNext();},1); } } } } xhr.open("GET","//live.view.g.imapbuilder.net/getJob/",true); xhr.send(); })(); } g.loadStyleMap=function(){ var styles = []; var styleName = g.data.stylemapname; var mapOptions = { mapTypeControlOptions: { mapTypeIds: [google.maps.MapTypeId.HYBRID, google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.SATELLITE, google.maps.MapTypeId.TERRAIN,styleName] }, mapTypeId: styleName }; map.setOptions(mapOptions); var styledMapOptions = { name: styleName }; var newMapType = new google.maps.StyledMapType(g.data.mapstyle, styledMapOptions); map.mapTypes.set(styleName, newMapType); } g.loadObject=function(){ var kmlfiles=[]; if (g.data.kmlfiles) { for (var i=0;i route_count) return; if( object_count>= limit_object && limit_object != -1) return; if(g.data.routes[current_route]!=undefined){ if ( g.data.catlegendenable === true ){ if (!allCategoryArr.contains(g.data.routes[current_route].catID) ) {}else if ( g.data.routes[current_route].catID != undefined && g.data.routes[current_route].catID != -1 && !categoryArr.contains(g.data.routes[current_route].catID) ) { routeID ++ ; current_route++; g.loadRouteData(); return; } } var polylineOpt = { clickable: true, strokeWeight: g.data.routes[current_route].strokeWeight, strokeOpacity: g.data.routes[current_route].strokeOpacity, strokeColor: g.data.routes[current_route].strokeColor}; var iconimage = { url:"http://g3.imapbuilder.net/editor/img/icon/route_marker.gif", size:new google.maps.Size(11,11), origin:new google.maps.Point(0,0), anchor:new google.maps.Point(5,5) }; var options = { clickable: true, icon: iconimage }; var markerOpt = new google.maps.Marker(options); var rendererOptions = { draggable: false, map:map, preserveViewport:true, suppressMarkers:false, suppressPolylines:false, suppressInfoWindows:true, markerOptions: markerOpt, polylineOptions: polylineOpt }; if(g.data.routes[current_route].encodedPath != undefined){ polylineOpt.map=map; polylineOpt.path=google.maps.geometry.encoding.decodePath(g.data.routes[current_route].encodedPath); routes[current_route]=new google.maps.Polyline(polylineOpt); google.maps.event.addListener(routes[current_route], 'click', function(event) { infowindow[current_route] = new google.maps.InfoWindow({content:html,position:event.latLng}); if( g.data.options["infoAutoPan"] != undefined) infowindow[current_route].setOptions({"disableAutoPan": g.data.options["infoAutoPan"]}); infowindow[current_route].open(map); }); google.maps.event.addListener(routes[current_route], 'mouseover', function(event) { infowindow[current_route] = new google.maps.InfoWindow({content:html,position:event.latLng}); if( g.data.options["infoAutoPan"] != undefined) infowindow[current_route].setOptions({"disableAutoPan": g.data.options["infoAutoPan"]}); infowindow[current_route].open(map); }); google.maps.event.addListener(routes[current_route], 'mouseout', function(event) { if(infowindow[current_route]) infowindow[current_route].setMap(null); }); routeID ++ ; current_route++; object_count++; g.loadRouteData(); return; } routes[current_route] = new google.maps.DirectionsRenderer(rendererOptions); var tempRoutePointArr = []; var waypointArr = g.data.routes[current_route].waypoint; for( var j = 0 ; j < waypointArr.length ; j++) { var wpeach = waypointArr[j].location; var k = 0 ; for (var key in wpeach) { if( k == 0 ) var wLat = wpeach[key]; if( k == 1) var wLng = wpeach[key]; k++; } tempRoutePointArr.push({ location: new google.maps.LatLng(wLat, wLng), stopover:waypointArr[j].stopover }); } var k = 0 ; for (var key in g.data.routes[current_route].startLocation) { if( k == 0 ) var sLat = g.data.routes[current_route].startLocation[key]; if( k == 1) var sLng = g.data.routes[current_route].startLocation[key]; k++; } var k = 0 ; for (var key in g.data.routes[current_route].endLocation) { if( k == 0 ) var eLat = g.data.routes[current_route].endLocation[key]; if( k == 1) var eLng = g.data.routes[current_route].endLocation[key]; k++; } g.data.routes[current_route].startLocation = new google.maps.LatLng(sLat,sLng); g.data.routes[current_route].endLocation = new google.maps.LatLng(eLat,eLng); var travelMode = google.maps.DirectionsTravelMode.DRIVING; g.data.routes[current_route].waypoint = tempRoutePointArr; if( g.data.routes[current_route].travelMode != undefined && modeArr[g.data.routes[current_route].travelMode] != undefined) travelMode = modeArr[g.data.routes[current_route].travelMode]; else g.data.routes[current_route].travelMode = 0; var request = { origin: g.data.routes[current_route].startLocation, destination: g.data.routes[current_route].endLocation, waypoints: g.data.routes[current_route].waypoint, travelMode: travelMode }; directionsService.route(request, function(response, status) { if (status == google.maps.DirectionsStatus.OK) { if(routes[current_route] != undefined){ routes[current_route].setDirections(response); g.data.routes[current_route].encodedPath = google.maps.geometry.encoding.encodePath(response.routes[0].overview_path); /* */ var legs = routes[current_route].directions.routes[0].legs; var distance = 0 ; if(legs[0].distance) distance = legs[0].distance.text; var duration = 0 ; // legs[0].duration.text; if(legs[0].duration) duration = legs[0].duration.text; /* var polylineOpt = { clickable: true, strokeWeight: g.data.routes[current_route].strokeWeight, strokeOpacity: g.data.routes[current_route].strokeOpacity, strokeColor: g.data.routes[current_route].strokeColor}; var polyline = new google.maps.Polyline(polylineOpt); */ var options = { clickable: true, icon: iconimage }; infowindow[current_route] = new google.maps.InfoWindow(); var markerOpt = new google.maps.Marker(options); var html = "Travel By "+modeArr[g.data.routes[current_route].travelMode].toLowerCase()+"
"+"Duration: "+ duration +"
"+"Distance: "+distance; google.maps.event.addListener(markerOpt, 'click', function(event) { infowindow[current_route] = new google.maps.InfoWindow({content:html,position:event.latLng}); if( g.data.options["infoAutoPan"] != undefined) infowindow[current_route].setOptions({"disableAutoPan": g.data.options["infoAutoPan"]}); infowindow[current_route].open(map); }); google.maps.event.addListener(markerOpt, 'mouseover', function(event) { infowindow[current_route] = new google.maps.InfoWindow({content:html,position:event.latLng}); if( g.data.options["infoAutoPan"] != undefined) infowindow[current_route].setOptions({"disableAutoPan": g.data.options["infoAutoPan"]}); infowindow[current_route].open(map); }); google.maps.event.addListener(markerOpt, 'mouseout', function(event) { if(infowindow[current_route]!= undefined) infowindow[current_route].setMap(null); }); // for polylines mouseover google.maps.event.addListener(polylineOpt, 'click', function(event) { infowindow[current_route] = new google.maps.InfoWindow({content:html,position:event.latLng}); if( g.data.options["infoAutoPan"] != undefined) infowindow[current_route].setOptions({"disableAutoPan": g.data.options["infoAutoPan"]}); infowindow[current_route].open(map); }); google.maps.event.addListener(polylineOpt, 'mouseover', function(event) { infowindow[current_route] = new google.maps.InfoWindow({content:html,position:event.latLng}); if( g.data.options["infoAutoPan"] != undefined) infowindow[current_route].setOptions({"disableAutoPan": g.data.options["infoAutoPan"]}); infowindow[current_route].open(map); }); google.maps.event.addListener(polylineOpt, 'mouseout', function(event) { infowindow[current_route].setMap(null); }); routes[current_route].setOptions({markerOptions:markerOpt}); /*google.maps.event.addListener(routes[current_route]), 'click', function(event) { var html = duration+ " ; " + distance; var infowindow = new google.maps.InfoWindow({content:html,position:event.latLng}); infowindow.open(map); });*/ } routeID ++ ; current_route++; object_count++; setTimeout(function(){g.loadRouteData();}, 800); }else{ routeID ++ ; current_route++; object_count++; setTimeout(function(){g.loadRouteData();}, 100); } }); }else{ routeID ++ ; current_route++; g.loadRouteData(); } } g.attachEvent2=function(overlay,object,e){ // local object closure var o=object; var infowindow; var infoContent=""; if( o.event[e].infoWindow && o.event[e].infoWindow.options.content) { infoContent=o.event[e].infoWindow.options.content; if(g.expire){ infoContent+='

Powered by iMapBuilder'; } } google.maps.event.addListener(overlay,e,function(event){ //alert(JSON.stringify(o.event[e])); if(o.event[e].infoWindow){ infowindow = new google.maps.InfoWindow(o.event[e].infoWindow.options); infowindow.setPosition(event.latLng); infowindow.setOptions({"content":infoContent}); if( g.data.options["infoAutoPan"] != undefined) infowindow.setOptions({"disableAutoPan": g.data.options["infoAutoPan"]}); infowindow.open(map); //alert(infowindow.toSource()); } if(o.event[e].navigate){ window.open(o.event[e].navigate.href,o.event[e].navigate.target); /*if(o.event[e].navigate.target=='_self'){ location.href=o.event[e].navigate.href; }else{ window.op }*/ } }); if(e=="mouseover"){ if(o.event[e].infoWindow){ google.maps.event.addListener(overlay,'mouseout',function(){ infowindow.close(); }); } } } g.mouseoverEffect=function(overlay, orgColor, overColor){ google.maps.event.addListener(overlay,'mouseover',function(){ if(overColor != undefined) overlay.setOptions({"fillColor":overColor}); }); google.maps.event.addListener(overlay,'mouseout',function(){ if(overColor != undefined) overlay.setOptions({"fillColor":orgColor}); }); } g.loadCircles=function(){ if( g.data.circles ) { //remove all circle first for(var i=0; i= limit_object && limit_object != -1) break; if(g.data.circles[i]!=null){ if ( g.data.catlegendenable === true ) { if ( !allCategoryArr.contains(g.data.circles[i].catID) ) {} else if (g.data.circles[i].catID != undefined && g.data.circles[i].catID != -1 && !categoryArr.contains(g.data.circles[i].catID) ) continue; } var options={}; for(var j in g.data.circles[i].options){ if(typeof(g.data.circles[i].options[j])!='object'){ options[j]=g.data.circles[i].options[j]; } } options.map = map; options.center = []; options.center =new google.maps.LatLng(g.data.circles[i].options.center[0],g.data.circles[i].options.center[1]); options.radius = []; options.radius = g.data.circles[i].options.radius; circles[i]=new google.maps.Circle(options); for(var j in g.data.circles[i].event){ g.attachEvent2(circles[i],g.data.circles[i],j); } object_count++; } } } } g.loadRectangles=function(){ if( g.data.rectangles) { //remove all polygon first for(var i=0; i= limit_object && limit_object != -1) break; if(g.data.rectangles[i]!=null){ if ( g.data.catlegendenable === true ) { if ( !allCategoryArr.contains(g.data.rectangles[i].catID) ) {} else if ( g.data.rectangles[i].catID != undefined && g.data.rectangles[i].catID != -1 && !categoryArr.contains(g.data.rectangles[i].catID) ) continue; } var options={}; for(var j in g.data.rectangles[i].options){ if(typeof(g.data.rectangles[i].options[j])!='object'){ options[j]=g.data.rectangles[i].options[j]; } } options.map=map; var rectangleBoundsSW = new google.maps.LatLng(g.data.rectangles[i].options.bounds[0],g.data.rectangles[i].options.bounds[1]); var rectangleBoundsNE = new google.maps.LatLng(g.data.rectangles[i].options.bounds[2],g.data.rectangles[i].options.bounds[3]); var rectangleBounds = new google.maps.LatLngBounds(rectangleBoundsSW , rectangleBoundsNE); options.bounds=[]; options.bounds=rectangleBounds; rectangles[i]=new google.maps.Rectangle(options); for(var j in g.data.rectangles[i].event){ g.attachEvent2(rectangles[i],g.data.rectangles[i],j); } object_count++; } } } } g.loadPolygons=function(){ //console.log("loadPolygons() start"); if ( g.data.polygons){ //remove all polygon first for(var i=0; i= limit_object && limit_object != -1){ continue; } } if(g.data.polygons[i]!=null){ if(g.data.polygons[i].options.encodedPath == undefined || g.data.polygons[i].options.encodedPath == "") continue; if ( g.data.catlegendenable === true ) { if ( !allCategoryArr.contains(g.data.polygons[i].catID) ) {} else if (g.data.polygons[i].catID != undefined && g.data.polygons[i].catID != -1 && !categoryArr.contains(g.data.polygons[i].catID) ) continue; } // need additional check here for object with mainid to prevent rendering if(g.data.polygons[i].options.mainid!=undefined ){ var mainid = g.data.polygons[i].options.mainid; if (g.data.polygons[mainid].catID != undefined && g.data.polygons[mainid].catID != -1 && typeof categoryArr!="undefined" && !categoryArr.contains(g.data.polygons[mainid].catID) ) continue; } var options={}; for(var j in g.data.polygons[i].options){ if(typeof(g.data.polygons[i].options[j])!='object'){ options[j]=g.data.polygons[i].options[j]; } } options.map=map; options.path=[]; options.path=google.maps.geometry.encoding.decodePath(g.data.polygons[i].options.encodedPath); polygons[i]=new google.maps.Polygon(options); // if Heat Map if( g.data.polygons[i].options.regionID != undefined && g.data.heatmap != undefined && g.data.heatmap.enable == true ){ if( g.data.heatmap.color !=undefined ){ if(g.data.heatmap.color == "contin"){ polygons[i].setOptions({"fillColor":g.heatMapContinColorValue(g.getHeatMapValue(g.data.polygons[i].options.regionID))}); // add mouseover color heatmap enable //if(g.data.polygons[i].options.overColor != undefined) // g.mouseoverEffect(polygons[i], g.heatMapContinColorValue(g.getHeatMapValue(g.data.polygons[i].options.regionID)), g.data.polygons[i].options.overColor); }else if(g.data.heatmap.color == "discrete"){ polygons[i].setOptions({"fillColor":g.heatMapDiscreteColorValue(g.getHeatMapValue(g.data.polygons[i].options.regionID))}); // add mouseover color heatmap enable //if(g.data.polygons[i].options.overColor != undefined) // g.mouseoverEffect(polygons[i], g.heatMapDiscreteColorValue(g.getHeatMapValue(g.data.polygons[i].options.regionID)), g.data.polygons[i].options.overColor); } } } else { // add mouseover color heatmap disenable //if(g.data.polygons[i].options.overColor != undefined) // g.mouseoverEffect(polygons[i], g.data.polygons[i].options.fillColor, g.data.polygons[i].options.overColor); } // for sub polygons if(g.data.polygons[i].options.mainid!=undefined ){ var mainid = g.data.polygons[i].options.mainid; for(var j in g.data.polygons[mainid].event){ g.attachEvent2(polygons[i],g.data.polygons[mainid],j); } } for(var j in g.data.polygons[i].event){ g.attachEvent2(polygons[i],g.data.polygons[i],j); } if(g.data.polygons[i].options.isRegions==undefined || g.data.polygons[i].options.isRegions!=true) object_count++; } } } //console.log("loadPolygons() finish"); } g.loadPolylines=function() { if(g.data.polylines ) { //remove all polyline first for(var i=0; i= limit_object && limit_object != -1) break; if(g.data.polylines[i]!=null){ if ( g.data.catlegendenable === true ) { if ( !allCategoryArr.contains(g.data.polylines[i].catID) ) {} else if ( g.data.polylines[i].catID != undefined && g.data.polylines[i].catID != -1 && !categoryArr.contains(g.data.polylines[i].catID) ) continue; } var options={}; for(var j in g.data.polylines[i].options){ if(typeof(g.data.polylines[i].options[j])!='object'){ options[j]=g.data.polylines[i].options[j]; } } options.map=map; options.path=google.maps.geometry.encoding.decodePath(g.data.polylines[i].options.encodedPath); polylines[i]=new google.maps.Polyline(options); object_count++; } } } } g.loadLegend=function(){ var map_div = document.getElementById('gmap_'+g.data.fileid+''); if(g.data.legends != undefined ){ for(var i=0; i= 87 ) l_content+= '
'; else if ( g.data.legends[i].items[j].imageUrl >= 75 ) l_content+= '
'; else if(g.data.legends[i].items[j].imageUrl >= 72 ) l_content+= '
'; else l_content+= '
'; }else l_content+= '
'; l_content+= ''; l_content+=''; lCount++; } } l_content+=''; } l_content += '
'; legend_div.innerHTML=l_content; if ( g.data.legends[i].items.length > 0 || g.data.legends[i].name != undefined) map_div.appendChild(legend_div); } } } } g.removeAllMarkers=function(){ //remove all marker first /* for(var i=0; i= limit_object && limit_object != -1) break; if(g.data.markers[i]!=undefined){ if ( g.data.catlegendenable === true ) { if ( !allCategoryArr.contains(g.data.markers[i].catID) ) {}else if ( g.data.markers[i].catID != undefined && g.data.markers[i].catID != -1 && !categoryArr.contains(g.data.markers[i].catID) ) continue; } for(var j in g.data.markers[i].options){ if(typeof(g.data.markers[i].options[j])!='object'){ options[j]=g.data.markers[i].options[j]; } } options.markerid = i; var iconid=g.data.markers[i].iconid; options.iconid = iconid; if( !isNaN(iconid) ) //options.icon=new google.maps.MarkerImage('http://g3.imapbuilder.net/_api/img/marker/'+iconid,new google.maps.Size(g.iconlist[iconid].imagew,g.iconlist[iconid].imageh),new google.maps.Point(g.iconlist[iconid].imageox,g.iconlist[iconid].imageoy),new google.maps.Point(g.iconlist[iconid].imageax,g.iconlist[iconid].imageay)); options.icon={url:'http://g3.imapbuilder.net/_api/img/marker/'+iconid,size:new google.maps.Size(35,35),origin:new google.maps.Point(parseInt(g.iconlist[iconid].imageox),parseInt(g.iconlist[iconid].imageoy)),anchor:new google.maps.Point(parseInt(g.iconlist[iconid].imageax),parseInt(g.iconlist[iconid].imageay))}; else { /* var newImg = new Image(); newImg.src = iconid; var height = newImg.height; var width = newImg.width; options.icon=new google.maps.MarkerImage( iconid, new google.maps.Size(width,height), new google.maps.Point(0,0), new google.maps.Point(width/2,height) ); */ options.icon={url:iconid,size:new google.maps.Size(35,35),origin:new google.maps.Point(0,0),anchor:new google.maps.Point(17.5,35)}; } options.map=map; options.position=new google.maps.LatLng(g.data.markers[i].options.position[0],g.data.markers[i].options.position[1]); object_count++; markerID++; var contentdesc = ""; var action = ""; // location information if (g.data.markers[i].event != undefined){ if (g.data.markers[i].event.click != undefined) { if (g.data.markers[i].event.click.infoWindow != undefined) { contentdesc = g.data.markers[i].event.click.infoWindow.options.content; action="click"; } }else if (g.data.markers[i].event.mouseover != undefined) { if (g.data.markers[i].event.mouseover.infoWindow != undefined) { contentdesc = g.data.markers[i].event.mouseover.infoWindow.options.content; action="over"; } } } if( gmap_locationdetails != undefined ){ g.addOrgMarkerToList(i, iconid, g.data.markers[i].options.title, contentdesc, action); } options.desc = g.convertHtmlToText(contentdesc); markers[i]=new google.maps.Marker(options); // for marker's event, create closures for(var j in g.data.markers[i].event){ g.attachEvent(markers[i],g.data.markers[i],j); } // for custom project map id = 5990 } } } } g.loadClustering=function(){ if(g.data.clustering===true){ var clustering_gridsize = g.data.clustering_gridsize; var clustering_maxzoom = g.data.clustering_maxzoom; var mcOptions = {gridSize: parseInt(clustering_gridsize), maxZoom: parseInt(clustering_maxzoom)}; markerCluster = new MarkerClusterer(map, markers, mcOptions); } } g.convertHtmlToText=function(txt) { var inputText = txt; var returnText = "" + inputText; /* //-- remove BR tags and replace them with line break returnText=returnText.replace(/
/gi, "\n"); returnText=returnText.replace(//gi, "\n"); returnText=returnText.replace(//gi, "\n"); //-- remove P and A tags but preserve what's inside of them returnText=returnText.replace(//gi, "\n"); returnText=returnText.replace(/(.*?)<\/a>/gi, " $2 ($1)"); */ //-- remove all inside SCRIPT and STYLE tags returnText=returnText.replace(/[\w\W]{1,}(.*?)[\w\W]{1,}<\/script>/gi, ""); returnText=returnText.replace(/[\w\W]{1,}(.*?)[\w\W]{1,}<\/style>/gi, ""); //-- remove all else returnText=returnText.replace(/<(?:.|\s)*?>/g, ""); /* //-- get rid of more than 2 multiple line breaks: returnText=returnText.replace(/(?:(?:\r\n|\r|\n)\s*){2,}/gim, "\n\n"); //-- get rid of more than 2 spaces: returnText = returnText.replace(/ +(?= )/g,''); //-- get rid of html-encoded characters: returnText=returnText.replace(/ /gi," "); returnText=returnText.replace(/&/gi,"&"); returnText=returnText.replace(/"/gi,'"'); returnText=returnText.replace(/</gi,'<'); returnText=returnText.replace(/>/gi,'>'); */ var maxLen= 180 ; if (returnText.length > maxLen) { returnText = returnText.substring(0, maxLen) + "..."; } //-- return return returnText; } g.attachEvent=function(overlay,object,e){ // local object closure var o=object; var infowindow; var infoContent=""; if( o.event[e].infoWindow && o.event[e].infoWindow.options.content) { infoContent=o.event[e].infoWindow.options.content; if(g.expire){ infoContent+='

Powered by iMapBuilder'; } } google.maps.event.addListener(overlay,e,function(){ console.debug(o.event[e].infoWindow.options.maxWidth); if(o.event[e].infoWindow){ /*if ( o.event[e].infoWindow.options.maxWidth == undefined) o.event[e].infoWindow.options.maxWidth = 0 ;*/ if(o.event[e].infoWindow.options.maxWidth==0){ delete o.event[e].infoWindow.options.maxWidth; } infowindow=new google.maps.InfoWindow(o.event[e].infoWindow.options); infowindow.setOptions({"content":infoContent}); if( g.data.options["infoAutoPan"] != undefined) infowindow.setOptions({"disableAutoPan": g.data.options["infoAutoPan"]}); if(o.event[e].infoWindow.options.maxWidth!=undefined){ infowindow.setOptions({"maxWidth": parseInt(o.event[e].infoWindow.options.maxWidth) }); } infowindow.open(map,overlay); } if(o.event[e].navigate){ window.open(o.event[e].navigate.href,o.event[e].navigate.target); /*if(o.event[e].navigate.target=='_self'){ location.href=o.event[e].navigate.href; }else{ window.op //here }*/ } }); if(e=="mouseover"){ if(o.event[e].infoWindow){ google.maps.event.addListener(overlay,'mouseout',function(){ infowindow.close(); }); } } } g.loadLabelNImage=function(){ /* ----- for draw label ----- */ function Label(opt_options, latlng, content, visible, clickable, border,bordercolor, background, font_color, font_size) { // Initialization this.setValues(opt_options); this.latLng_ = latlng; this.content_ = content; this.visible_ = visible; this.clickable_ = clickable; this.zIndex_ = 1; this.border_ = border; this.borderColor_ = bordercolor; this.bg_ = background; this.fontColor_ = font_color; this.fontSize_ = font_size; // Label specific var span = this.span_ = document.createElement('span'); span.style.cssText = 'position: relative; left: -50%; top: -8px; white-space: nowrap; padding: 2px; ' + 'border: '+this.border_+'px solid #'+this.borderColor_+'; ' + 'background-color: '+this.bg_ +';'+ 'color:'+ this.fontColor_+ ';'+ 'font-size: '+this.fontSize_+'px;'; var div = this.div_ = document.createElement('div'); div.appendChild(span); div.style.cssText = 'position: absolute; display: none'; }; Label.prototype = new google.maps.OverlayView; // Implement onAdd Label.prototype.onAdd = function() { var pane = this.getPanes().overlayImage; pane.appendChild(this.div_); }; // Implement onRemove Label.prototype.onRemove = function() { this.div_.parentNode.removeChild(this.div_); }; // Implement draw Label.prototype.draw = function() { var projection = this.getProjection(); var position = projection.fromLatLngToDivPixel(this.latLng_); this.span_.style.cssText = 'position: relative; left: -50%; top: -8px; white-space: nowrap; padding: 2px; ' + 'border: '+this.border_+'px solid '+this.borderColor_+'; ' + 'background-color: '+this.bg_ +';'+ 'color:'+ this.fontColor_+ ';'+ 'font-size: '+this.fontSize_+'px;'; this.span_.innerHTML = this.content_; var div = this.div_; div.style.left = position.x+'px'; div.style.top = position.y+'px'; var visible = this.visible_; div.style.display = visible ? 'block' : 'none'; var clickable = this.clickable_; this.span_.style.cursor = clickable ? 'pointer' : ''; var zIndex = this.zIndex_; div.style.zIndex = zIndex; }; /* ----- for draw images ----- */ function OverlayImage(opt_options, latlng, imageUrl, visible, clickable, border, bordercolor, width, height) { // Initialization this.setValues(opt_options); this.latLng_ = latlng; this.imageUrl_ = imageUrl; this.visible_ = visible; this.clickable_ = clickable; this.zIndex_ = 1; this.border_ = border; this.borderColor_ = bordercolor; if( width == "") this.width_ = "100" ; else this.width_ = width; if( height == "") this.height_ = "100" ; else this.height_ = height; var top_pos = Number(this.height_/2) + Number(this.border_); // OverlayImage specific var span = this.span_ = document.createElement('div'); span.style.cssText = 'position: relative; left: -50%; top: -'+ top_pos +'px; ' + 'border: '+this.border_+'px solid #'+this.borderColor_+'; ' + 'width:'+this.width_+'px; height:'+this.height_+'px; '; var div = this.div_ = document.createElement('div'); div.appendChild(span); div.style.cssText = 'position: absolute; display: none'; }; OverlayImage.prototype = new google.maps.OverlayView(); // Implement onAdd OverlayImage.prototype.onAdd = function() { var pane = this.getPanes().overlayImage; pane.appendChild(this.div_); var me = this; // Ensures the label is redrawn if the text or position is changed. /* this.listeners_ = [ google.maps.event.addDomListener(this.div_, 'click', function() { if (me.clickable_) { google.maps.event.trigger(me, 'click'); } }) ]; */ }; // Implement onRemove OverlayImage.prototype.onRemove = function() { this.div_.parentNode.removeChild(this.div_); }; // Implement draw OverlayImage.prototype.draw = function() { var projection = this.getProjection(); var position = projection.fromLatLngToDivPixel(this.latLng_); var top_pos = Number(this.height_/2) + Number(this.border_); this.span_.style.cssText = 'position: relative; left: -50%; top: -'+ top_pos +'px; ;' + 'border: '+this.border_+'px solid '+this.borderColor_+'; '+ 'width:'+this.width_+'px; height:'+this.height_+'px; '; this.span_.innerHTML = ''; var div = this.div_; div.style.left = position.x+'px'; div.style.top = position.y+'px'; var visible = this.visible_; div.style.display = visible ? 'block' : 'none'; var clickable = this.clickable_; this.span_.style.cursor = clickable ? 'pointer' : ''; var zIndex = this.zIndex_; div.style.zIndex = zIndex; }; function loadLabels(){ //remove all label first if(g.data.labels != undefined ){ for(var i=0; i= limit_object && limit_object != -1) break; if(g.data.labels[i]!=undefined){ if ( g.data.catlegendenable === true ) { if ( !allCategoryArr.contains(g.data.labels[i].catID) ) {}else if ( g.data.labels[i].catID != undefined && g.data.labels[i].catID != -1 && !categoryArr.contains(g.data.labels[i].catID) ) continue; } for(var j in g.data.labels[i].options){ if(typeof(g.data.labels[i].options[j])!='object'){ options[j]=g.data.labels[i].options[j]; } } options.map = map; options.title = g.data.labels[i].options.title; var visible = g.data.labels[i].options.visible; var clickable = g.data.labels[i].options.clickable; var title = g.data.labels[i].options.title; var border = g.data.labels[i].options.border; var bordercolor = g.data.labels[i].options.bordercolor; var bg = g.data.labels[i].options.bg; var font_color = g.data.labels[i].options.font_color; var font_size = g.data.labels[i].options.font_size; options.position=new google.maps.LatLng(g.data.labels[i].options.position[0],g.data.labels[i].options.position[1]); labels[i] = new Label( options, options.position, title , visible, clickable, border, bordercolor,bg,font_color, font_size ); object_count++; } } } } function loadImages() { if(g.data.images != undefined ){ for(var i=0; i= limit_object && limit_object != -1) break; if(g.data.images[i]!=undefined){ if ( g.data.catlegendenable === true ) { if ( !allCategoryArr.contains(g.data.images[i].catID) ) {}else if ( g.data.images[i].catID != undefined && g.data.images[i].catID != -1 && !categoryArr.contains(g.data.images[i].catID) ) continue; } for(var j in g.data.images[i].options){ if(typeof(g.data.images[i].options[j])!='object'){ options[j]=g.data.images[i].options[j]; } } options.map = map; options.title = g.data.images[i].options.title; var visible = g.data.images[i].options.visible; var clickable = g.data.images[i].options.clickable; var imageUrl = g.data.images[i].options.title; var border = g.data.images[i].options.border; var bordercolor = g.data.images[i].options.bordercolor; var width = g.data.images[i].options.width; var height = g.data.images[i].options.height; options.position=new google.maps.LatLng(g.data.images[i].options.position[0],g.data.images[i].options.position[1]); images[i] = new OverlayImage( options, options.position, imageUrl , visible, clickable, border, bordercolor,width,height ); object_count++; } } } } //label loadLabels(); //images loadImages(); } g.addOrgMarkerToList=function(i, iconid, title, desc, action){ if( (g.data.datalist.position != "" ) && (g.data.datalist.showmarkers == 0 || g.data.datalist.showmarkers == 1) ){ var table=document.createElement("table"); table.style.width="100%"; table.style.borderBottom="1px solid #DDD"; table.style.margin="5px 0px "; table.id="markers_"+i+"_"+action; tr=document.createElement("tr"); tr.id="markers_"+i; td=document.createElement("td"); td.align="center"; td.vAlign="top"; td.style.padding="3px 5px"; td.width="50px"; img=document.createElement("img"); img.style.border= '0px'; if( !isNaN(iconid) ) img.src='http://g3.imapbuilder.net/_api/img/marker/'+iconid; else img.src=iconid; td.appendChild(img); tr.appendChild(td); td=document.createElement("td"); div=document.createElement("div"); div.innerHTML=''+g.data.markers[i].options.title+'
'; var contentdesc = ""; if (g.data.markers[i].event != undefined){ if (g.data.markers[i].event.click != undefined) { if (g.data.markers[i].event.click.infoWindow != undefined) { contentdesc = g.data.markers[i].event.click.infoWindow.options.content; tr.id+="_click"; } }else if (g.data.markers[i].event.mouseover != undefined) { if (g.data.markers[i].event.mouseover.infoWindow != undefined) { contentdesc = g.data.markers[i].event.mouseover.infoWindow.options.content; tr.id+="_over"; } } } div.innerHTML+=''+g.convertHtmlToText(contentdesc)+''; td.appendChild(div); tr.appendChild(td); table.onmouseover=function(){ this.style.background="#FFF"; } table.onmouseout=function(){ this.style.background=""; } table.onclick=function(){ if ( this.id.split("_")[2] != undefined){ if(this.id.split("_")[2] == "click") google.maps.event.trigger(markers[this.id.split("_")[1]], "click"); else if(this.id.split("_")[2] == "over") google.maps.event.trigger(markers[this.id.split("_")[1]], "mouseover"); } } table.appendChild(tr); gmap_locationdetails.appendChild(table); } } g.reloadObject=function(){ //console.log("reloadObject() start"); if ( g.data.crowdmap.clenable == true || g.data.catlegendenable === true){ categoryArr = []; allCategoryArr = []; markerID=0; object_count=0 ; var cl_list = document.getElementById('categorylegend_list'); var chk = cl_list.getElementsByTagName('input'); var chkLen = chk.length; for (var i = 0; i < chkLen; i++) { if (chk[i].type === 'checkbox' && chk[i].checked === true) { categoryArr.push(chk[i].value); } allCategoryArr.push(chk[i].value); } if(g.data.clustering===true){ markerCluster.clearMarkers(); } // load object g.removeAllMarkers(); g.loadMarkers(); if(g.data.crowdmap.mode=="edit" || g.data.crowdmap.mode=="view") g.drawCrowdMarker(); g.loadLabelNImage(); //polylines g.loadPolylines(); //polygons g.loadPolygons(); //rectangle g.loadRectangles(); //circle g.loadCircles(); //route g.loadRoutes(); g.loadLegend(); g.loadClustering(); } //console.log("reloadObject() finish"); } // crowd map submit report g.submitLocation=function(){ var ajax_form=document.getElementById('ajax_form'); ajax_form.action='/_api/addlocation.php'; ajax_form.target='ajax_iframe'; if( document.getElementById('crowd_address').value == ""){ g.showMessage("Please Enter Address or Latitude/ Longitude", "#FF0000", "#FFF"); return; } if( document.getElementById('crowd_description').value == "" ){ g.showMessage("Please Enter Description!", "#FF0000", "#FFF"); return; } var fullAddress=document.getElementById('crowd_address').value; map_geocoder.geocode({'address':fullAddress, 'bounds': map.getBounds()},function(results,status){ if(status==google.maps.GeocoderStatus.OK){ var locationLat = results[0].geometry.location.lat(); var locationLng = results[0].geometry.location.lng(); var formattedAddress=results[0].formatted_address; var description = document.getElementById('crowd_description').value; var username = document.getElementById('crowd_username').value; document.getElementById("ca_latlng").value=locationLat+','+locationLng; document.getElementById("ca_address").value=formattedAddress; //document.getElementById("ca_address").value=fullAddress; document.getElementById("ca_mapid").value=g.data.fileid; document.getElementById("ca_usertype").value=document.getElementById('crowd_usertype').value; document.getElementById("ca_userid").value=document.getElementById('crowd_userid').value; document.getElementById("ca_username").value=document.getElementById('crowd_username').value; document.getElementById("ca_useremail").value=document.getElementById('crowd_useremail').value; document.getElementById("ca_description").value=description; ajax_form.submit(); //alert('Add Location Success'); }else{ g.showMessage("Address is not correct!", "#FF0000", "#FFF"); //alert('Add Location Fail'); } }); } // login with facebook , google, twitter, email g.loginFacebook=function(){ opened_window = window.open('https://www.facebook.com/dialog/oauth/?client_id=391367400907909&redirect_uri=http://g3.imapbuilder.net/_map/get_facebook.php&state='+g.data.fileid+'_a3ecc030aae6c4d50671d74b179e6970&scope=email&response_type=token','fboauth_window','width=860,height=540'); g.removeCrowdForm(); } g.loginGoogle=function(){ opened_window = window.open('https://accounts.google.com/o/oauth2/auth?'+ 'response_type=code'+ '&redirect_uri=http%3A%2F%2Fg3.imapbuilder.net%2F_map%2Fgoogleapi'+ '&client_id=17030872649-20f1n1b2fojm8ksfgdt0dj9oinmtjosl.apps.googleusercontent.com'+ '&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile'+ '&approval_prompt=force&state='+g.data.fileid+'','google_oauth_window','width=860,height=540'); g.removeCrowdForm(); } g.loginTwitter=function(){ opened_window = window.open('http://g3.imapbuilder.net/_map/twitterapi/redirect.php?mapid='+g.data.fileid+'','google_oauth_window','width=860,height=540'); g.removeCrowdForm(); } g.loginEmail=function(){ if( document.getElementById("customName").value == ""){ alert('Please provide your Name'); }else if( document.getElementById("customEmail").value == "" ){ alert('Please provide your Email Address'); }else if( !g.checkEmail(document.getElementById("customEmail").value) ){ alert('Please provide a valid Email Address'); }else{ opened_window = window.open('http://g3.imapbuilder.net/_map/new_user.php?mapid='+g.data.fileid+'&email='+document.getElementById("customEmail").value+'&name='+document.getElementById("customName").value,'google_oauth_window','width=860,height=540'); g.removeCrowdForm(); } } g.checkEmail=function(email) { var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; if (!filter.test(email)) { return false; }else{ return true; } } g.updateCS=function(userName){ opened_window.document.getElementById('cs_title').innerHTML = cs_title; opened_window.document.getElementById('crowd_userinfo').innerHTML = cs_loginas + " "+ userName; opened_window.document.getElementById('cs_address').innerHTML = cs_address; opened_window.document.getElementById('cs_desc').innerHTML = cs_desc; opened_window.window.centermap(g.data.options.center[0],g.data.options.center[1], g.data.options.zoom); } // add crowd markers g.addCrowdMarker=function(cmarkerid, latLng, AddressName, description,uid, username, usertype, email, date, isNew){ // center location on the map var location = new google.maps.LatLng(latLng.split(",")[0], latLng.split(",")[1]); if( isNew == true){ map.setCenter(location); } cmarkerid=markerID; var infowindow = new google.maps.InfoWindow(); var iconpath = ""; if( !isNaN(g.data.crowdmap.markericon) ) iconpath='http://g3.imapbuilder.net/_api/img/marker/'+g.data.crowdmap.markericon; else iconpath=g.data.crowdmap.markericon; markers[cmarkerid] = new google.maps.Marker({ map: map, animation: google.maps.Animation.DROP, position: location, icon: {url:iconpath,size:new google.maps.Size(35,35),origin:new google.maps.Point(0,0),anchor:new google.maps.Point(17.5,35)}, title: AddressName }); google.maps.event.addListener(markers[cmarkerid], 'click',function(event){ var userImagePath=''; var userDesc=''+description+''; var userAddress=''+AddressName+''; var userName=''+username+''; if(usertype=="google") userImagePath='https://profiles.google.com/s2/photos/profile/'+uid; else if(usertype=="facebook") userImagePath='https://graph.facebook.com/'+uid+'/picture'; else if(usertype=="twitter") userImagePath='https://api.twitter.com/1/users/profile_image?screen_name='+email+'&size=normal'; else userImagePath='http://g3.imapbuilder.net/editor/img/crowd/emailuser.png'; var userTypeIcon=''; if(usertype=="google") userTypeIcon=''; else if(usertype=="facebook") userTypeIcon=''; else if(usertype=="twitter") userTypeIcon=''; else userTypeIcon=''; var userDate=''+date+''; var infoContent=''; infoContent=''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''+ '
'+userTypeIcon+' '+userName+'
'+userAddress+'
'+userDesc+'
'+userDate+'
'; infowindow.setContent(infoContent); infowindow.open(map, markers[cmarkerid]); }); markerID++; crowdMarkersId++; if( isNew == true){ var crowdMarkerCount = crowdMarkersData.length; crowdMarkersData[crowdMarkerCount]={}; crowdMarkersData[crowdMarkerCount].address=AddressName; crowdMarkersData[crowdMarkerCount].latlng =location.lat()+","+location.lng(); crowdMarkersData[crowdMarkerCount].userid =uid; crowdMarkersData[crowdMarkerCount].email =email; crowdMarkersData[crowdMarkerCount].username =username; crowdMarkersData[crowdMarkerCount].username =usertype; crowdMarkersData[crowdMarkerCount].description =description; crowdMarkersData[crowdMarkerCount].date =date; crowdMarkersData[crowdMarkerCount].isapproved = "1"; } g.addCrowdMarkerToList(g.data.crowdmap.markericon, AddressName, description,uid, username, usertype,email, date, markers[cmarkerid], cmarkerid, isNew); } // add markers to data list g.addCrowdMarkerToList=function(iconid, address, description,uid, username, usertype,email, date, obj, i){ if( (g.data.datalist.position != "") && (g.data.datalist.showmarkers == 0 || g.data.datalist.showmarkers == 2) ){ if( gmap_locationdetails != undefined ){ var table=document.createElement("table"); table.style.width="100%"; table.style.borderBottom="1px solid #DDD"; table.style.margin="5px 0px "; table.id="markers_"+i; table.style.cursor="pointer"; tr=document.createElement("tr"); tr.style.cursor="pointer"; td=document.createElement("td"); td.align="center"; td.vAlign="top"; td.width="50px"; td.rowSpan="4"; td.style.padding="3px 5px"; td.style.verticalAlign="top"; img=document.createElement("img"); img.style.border= '0px'; img.style.width= '50px'; img.style.height= '50px'; if(usertype=="google") img.src='https://profiles.google.com/s2/photos/profile/'+uid; else if(usertype=="facebook") img.src='https://graph.facebook.com/'+uid+'/picture'; else if(usertype=="twitter") img.src='https://api.twitter.com/1/users/profile_image?screen_name='+email+'&size=normal'; else img.src='http://g3.imapbuilder.net/editor/img/crowd/emailuser.png'; td.appendChild(img); tr.appendChild(td); table.appendChild(tr); table.id="markers_"+i; tr=document.createElement("tr"); // description td=document.createElement("td"); td.colSpan="2"; td.vAlign="top"; div=document.createElement("div"); div.innerHTML=''+g.convertHtmlToText(description)+'
'; td.appendChild(div); tr.appendChild(td); table.appendChild(tr); tr=document.createElement("tr"); // social icon td=document.createElement("td"); td.vAlign="top"; td.width="12px"; div=document.createElement("div"); div.innerHTML=''; if(usertype=="google") div.innerHTML+=''; else if(usertype=="facebook") div.innerHTML+=''; else if(usertype=="twitter") div.innerHTML+=''; else div.innerHTML+=''; td.appendChild(div); tr.appendChild(td); // name td=document.createElement("td"); td.vAlign="top"; div=document.createElement("div"); div.innerHTML=' '+ ''+username + '
'; td.appendChild(div); tr.appendChild(td); table.appendChild(tr); // pin icon tr=document.createElement("tr"); td=document.createElement("td"); td.vAlign="top"; td.width="12px"; div=document.createElement("div"); var contentAdd = address; var imapath = ""; if( !isNaN(iconid) ) imapath='http://g3.imapbuilder.net/_api/img/marker/'+iconid; else imapath=iconid; div.innerHTML=' '; td.appendChild(div); tr.appendChild(td); // address td=document.createElement("td"); td.vAlign="top"; div=document.createElement("div"); div.innerHTML=''+ contentAdd+ ''; td.appendChild(div); tr.appendChild(td); table.appendChild(tr); //div.innerHTML+='
' + date+ ''; tr=document.createElement("tr"); // empty td=document.createElement("td"); tr.appendChild(td); // clock icon& time td=document.createElement("td"); td.vAlign="bottom"; if( g.data.datalist.position=="right"||g.data.datalist.position=="left" ) td.align="left"; else if( g.data.datalist.position=="top"||g.data.datalist.position=="bottom" ) td.align="right"; td.colSpan="2"; td.innerHTML=' ' + date+ '';; tr.appendChild(td); table.appendChild(tr); // setup the mouse over effect table.onmouseover=function(){ this.style.background="#FFF"; } table.onmouseout=function(){ this.style.background=""; } table.onclick=function(){ google.maps.event.trigger(obj, "click"); } //gmap_locationdetails.appendChild(table); var markerlist = document.getElementById('gmap_locationdetails'); if( markerlist.getElementsByTagName('table').length > 0 ){ var t= markerlist.getElementsByTagName('table')[0]; markerlist.insertBefore(table, t); }else{ gmap_locationdetails.appendChild(table); } } } } g.drawCrowdMarker=function(){ for( var i=0; i= limit_object && limit_object != -1) break; if ( crowdMarkersData[i].catID != undefined && crowdMarkersData[i].catID != -1 && !categoryArr.contains(crowdMarkersData[i].catID) ) continue; } g.addCrowdMarker(crowdMarkersId, crowdMarkersData[i].latlng, crowdMarkersData[i].address, crowdMarkersData[i].description,crowdMarkersData[i].userid, crowdMarkersData[i].username, crowdMarkersData[i].usertype, crowdMarkersData[i].email, crowdMarkersData[i].date, false); object_count++; } } } // create & remove dark background g.createModel=function(){ var map_div = document.getElementById('gmap_'+g.data.fileid); map_div.appendChild(modal_div); } g.removeModel=function(){ if(document.getElementById("modal_div")) { var map_div = document.getElementById('gmap_'+g.data.fileid); var md = document.getElementById("modal_div"); map_div.removeChild(md); } } // add a submit form g.addCrowdForm=function(){ g.createModel(); if(document.getElementById("crowdForm_div")){ document.getElementById("crowdForm_div").style.display="block"; }else{ crowdForm_div=document.createElement("div"); crowdForm_div.id="crowdForm_div"; crowdForm_div.style.position="absolute"; crowdForm_div.style.top="20%"; crowdForm_div.style.left="25%"; crowdForm_div.style.right="25%"; crowdForm_div.style.backgroundColor="#F0F0F0"; crowdForm_div.style.borderWidth="1px"; crowdForm_div.style.borderColor="#CCC"; crowdForm_div.style.borderStyle="solid"; crowdForm_div.style.display='block'; crowdForm_div.style.zIndex="2"; crowdForm_div.style.borderRadius="5px"; crowdForm_div.align="center"; var ci_style=""; var loginCount = 0 ; var loginFacebook = ''; var loginGoogle = ''; var loginTwitter = ''; var loginOR =''; var loginEmail = ''; if( g.data.crowdmap.login == undefined || g.data.crowdmap.login.facebook ) { loginFacebook='
'; loginCount++; } if( g.data.crowdmap.login == undefined || g.data.crowdmap.login.google ) { loginGoogle='
'; loginCount++ } if( g.data.crowdmap.login == undefined || g.data.crowdmap.login.twitter ){ /*loginTwitter = '
'; loginCount++;*/ } if( g.data.crowdmap.login == undefined || g.data.crowdmap.login.email ){{ loginOR = '
'; if( g.data.crowdmap.login == undefined || loginCount >0) loginOR +='or '; loginOR += 'Enter your name and email
'; loginEmail = ''+ ''+ ''+ ''+ '
Name:
Email:
'+ ''+ ''+ '
'; loginCount++; } } var content=""; content+='
'+ '
'+ '
'+ '
'+cs_title+'
'+ '
'+ '
'+ //'
Login
'+ '
'+ loginFacebook+ loginGoogle+ loginTwitter+ '
'+ loginOR+ loginEmail+ '
'+ ''+ '
'; crowdForm_div.innerHTML=content; if(true || g.data.crowdmap.mode=="edit" ){ if ( document.getElementById('gmap_'+g.data.fileid) ) { var map_div = document.getElementById('gmap_'+g.data.fileid); map_div.appendChild(crowdForm_div); } } } } g.removeCrowdForm=function(){ g.removeModel(); if(document.getElementById("crowdForm_div")) { //var map_div = document.getElementById('gmap_'+g.data.fileid); //var cf = document.getElementById("crowdForm_div"); //map_div.removeChild(cf); document.getElementById("crowdForm_div").style.display="none"; } } g.addMore=function(){ document.getElementById('crowd_done').style.display="none"; document.getElementById('crowd_input').style.display="block"; document.getElementById('crowd_inputdata').style.display="block"; } // add temp marker for user to set location g.addLocationMarker=function(){ if( !isNaN(g.data.crowdmap.markericon) ) iconpath='http://g3.imapbuilder.net/_api/img/marker/'+g.data.crowdmap.markericon; else iconpath=g.data.crowdmap.markericon; tempMarker = new google.maps.Marker({ map: map, animation: google.maps.Animation.DROP, position: map.getCenter(), icon: {url:iconpath,size:new google.maps.Size(35,35),origin:new google.maps.Point(0,0),anchor:new google.maps.Point(17.5,35)}, draggable: true }); document.getElementById('crowd_address').value="("+map.getCenter().lat()+","+map.getCenter().lng()+")"; google.maps.event.addListener(tempMarker, 'position_changed',function(){ document.getElementById('crowd_address').value="("+tempMarker.getPosition().lat()+", "+tempMarker.getPosition().lng()+")"; }); var tempMarkerAni = setInterval("tempMarker.setAnimation(google.maps.Animation.BOUNCE)", 3000); } g.removeLocationMarker=function(){ if( tempMarker != undefined){ tempMarker.setMap(null); clearTimeout(tempMarkerAni); } } // confirm button for temp marker g.addLocationDiv=function(){ if(document.getElementById("crowdGetLocation_div")){ }else{ crowdGetLocation_div=document.createElement("div"); crowdGetLocation_div.id="crowdGetLocation_div"; crowdGetLocation_div.style.position="absolute"; crowdGetLocation_div.style.bottom="20px"; crowdGetLocation_div.style.left="30%"; crowdGetLocation_div.style.right="30%"; crowdGetLocation_div.style.display='block'; crowdGetLocation_div.style.zIndex="3"; crowdGetLocation_div.style.opacity="0.8"; crowdGetLocation_div.style.align="center"; var ci_style=""; var content=""; content+='
'+ '
Drag Marker and Confirm the Location.
'+ ''+ '
'; crowdGetLocation_div.innerHTML=content; if(true || g.data.crowdmap.mode=="edit" ){ if ( document.getElementById('gmap_'+g.data.fileid) ) { var map_div = document.getElementById('gmap_'+g.data.fileid); map_div.appendChild(crowdGetLocation_div); } } } } g.removeLocationDiv=function(){ if(document.getElementById("crowdGetLocation_div")) { var map_div = document.getElementById('gmap_'+g.data.fileid); var cf = document.getElementById("crowdGetLocation_div"); map_div.removeChild(cf); } } // show and hide temp marker g.addLocationMode=function(){ document.getElementById('reportPanel').style.display="none"; g.removeModel(); g.addLocationDiv(); g.addLocationMarker(); } g.comfirmLocation=function(){ g.createModel(); document.getElementById('reportPanel').style.display="block"; g.removeLocationMarker(); g.removeLocationDiv(); } // message dialog g.showMessage=function(message, bgcolor, fontColor){ if(document.getElementById("errorMessage_div")){ }else{ errorMessage_div=document.createElement("div"); errorMessage_div.id="errorMessage_div"; errorMessage_div.style.position="absolute"; errorMessage_div.style.bottom="20px"; errorMessage_div.style.left="30%"; errorMessage_div.style.right="30%"; errorMessage_div.style.display='block'; errorMessage_div.style.zIndex="3"; errorMessage_div.style.opacity="1"; errorMessage_div.align="center"; var ci_style=""; var content=""; content+='
'+ '
'+message+'
'+ '
'; errorMessage_div.innerHTML=content; if(true || g.data.crowdmap.mode=="edit" ){ if ( document.getElementById('gmap_'+g.data.fileid) ) { var map_div = document.getElementById('gmap_'+g.data.fileid); map_div.appendChild(errorMessage_div); } } setTimeout('net.imapbuilder.gmap.removeMessageDiv()', 3000); } } g.removeMessageDiv=function(){ if(document.getElementById("errorMessage_div")) { var map_div = document.getElementById('gmap_'+g.data.fileid); var cf = document.getElementById("errorMessage_div"); map_div.removeChild(cf); } } // function for data list scroll to bottom /* g.scrollDataListToBottom=function(){ if(document.getElementById('dataListContainer')!=undefined ) { var objDiv = document.getElementById('dataListContainer'); objDiv.scrollTop = objDiv.scrollHeight; } } */ g.refreshPage=function(){ window.location.reload(); return false; } // heat map g.checkHeatMap=function(){ heatMapArr = []; // check if it is heatmap if( g.data.heatmap != undefined && g.data.heatmap.enable == true ){ var heatMapData = g.data.heatmap.data; for(var i=0; i=0;i--){ if(str.charAt(i)!=" "&&str.charAt(i)!=" ") break; } str = str.substring(0,i+1); return str; } g.Trim=function(str){ return g.LTrim(g.RTrim(str)); } g.numToHex=function(num){ var hex = num.toString(16); if( hex.length == 1 ) return "0"+hex; else return hex; } var searchMarker = []; g.searchInMapAction=function(address){ if(address != " "){ map_geocoder=new google.maps.Geocoder(); var map_bound_SW = new google.maps.LatLng(-32.768800, -86.923828); var map_bound_NE = new google.maps.LatLng(9.188870, -16.611328); var map_bound = new google.maps.LatLngBounds(map_bound_SW, map_bound_NE); map_geocoder.geocode({'address':address +" Bazil", 'bounds':map_bound},function(results,status){ if(status==google.maps.GeocoderStatus.OK){ map.setCenter(results[0].geometry.location); //searchInMapAddMarker(results[0].geometry.location, results[0].formatted_address, searchMarkerID); searchMarker[searchMarkerID] = new google.maps.Marker({ map: map, animation: google.maps.Animation.DROP, position: results[0].geometry.location, icon: {url:'http://g3.imapbuilder.net/_api/img/marker/17',size:new google.maps.Size(35,35),origin:new google.maps.Point(0,0),anchor:new google.maps.Point(17.5,35)}, title: results[0].formatted_address }); google.maps.event.addListener(searchMarker[searchMarkerID], 'click',function(event){ var infowindow = new google.maps.InfoWindow({content:results[0].formatted_address,position:event.latLng}); infowindow.open(map); }); searchMarkerID++ } }); } } g.zoomInPolygonCenter=function(path){ var bounds = new google.maps.LatLngBounds(); var pglength = path.getLength(); for (i = 0; i < pglength; i++) { bounds.extend(path.getAt(i)); } map.fitBounds(bounds); } g.zoomInPolygon=function(polygonID){ if(polygons[polygonID] != undefined){ g.zoomInPolygonCenter(polygons[polygonID].getPath()); } } })();net.imapbuilder.gmap.mapkey="AIzaSyBsJ00itihfix0LqWl2nQ86J5AYBQK_XQg";net.imapbuilder.gmap.run("{\"width\":\"650\",\"width_unit\":\"px\",\"height\":\"400\",\"height_unit\":\"px\",\"fileid\":5676,\"filename\":\"GO Map\",\"font_size\":\"12\",\"font_family\":\"Times New Roman\",\"options\":{\"mapTypeId\":\"roadmap\",\"disableDoubleClickZoom\":false,\"draggable\":true,\"keyboardShortcuts\":true,\"scrollwheel\":true,\"mapTypeControl\":true,\"panControl\":true,\"scaleControl\":true,\"streetViewControl\":true,\"zoomControl\":true,\"center\":[15.228207086282994,-89.60848433124997],\"zoom\":6,\"infoAutoPan\":false},\"markers\":[{\"iconid\":\"33\",\"options\":{\"position\":[-22.24714965608295,23.783987093750056],\"visible\":true,\"title\":\"Botswana\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"Ministry: Peace Corps

About the Ministry: John Munson of West Hills Friends is serving with the Peace Corps.

\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[8.884585256682271,40.09416518750004],\"visible\":true,\"title\":\"Church Support and Economic Development\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Church Support and Economic Development


About the Ministry: Anthem Friends is helping to support a church in Kora, a small city built on the capital city’s dump, as well as providing income-generating activities for those living in this area.


Contact Info:
Kameron Shadrick: (208)-262-6186
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[9.612020772368492,38.46818862500004],\"visible\":true,\"title\":\"YWAM\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry:
YWAM

About the Ministry: Mark Wolbert of Anthem Friends is serving as the Missions Director of YWAM’s adoption ministry in Ethiopia.


Contact Info:
Kameron Shadrick: (208)-262-6186
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[9.438663175435432,42.68693862500004],\"visible\":true,\"title\":\"Glimmer of Hope\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Glimmer of Hope


About the Ministry: East Hills Friends partners with this organization providing water, medical, and educational projects in this region.


Contact Info:
www.aglimmerofhope.org, or Jim and Rebecca Teeters jim.ata@comcast.net
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[15.68829976252027,-90.34062228124998],\"visible\":true,\"title\":\"El Amor de Patricia Orphanage\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: El Amor do Patricia Orphanage


About the Ministry:
Anthem Friends sponsors and regularly visits this orphanage.

Contact Info:
Kameron Shadrick: (208)-262-6186
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[18.973409244075075,-72.52700231796877],\"visible\":true,\"title\":\"Short Term Medical Teams\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Short Term Medical Teams


About the Ministry: West Hills Friends sent a team of four medical workers on a short-term mission in spring of 2011. They anticipate sending another in 2012.


Contact Info:
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[0.4392357692792226,38.02429602734378],\"visible\":true,\"title\":\"Friendly Water for the World\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Friendly Water for the World


About the Ministry: Del and Susanne Livingston of Olympic View Friends go around the world to provide clean water projects for underdeveloped regions and train others to do likewise. Our projects are currently happening in Kenya, Uganda, Burundi, Democratic Republic of Congo, and Honduras.


Contact Info: 
Del and Suzanne Livingston
waterforafrica@gmail.com\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[0.27014931425820377,38.59558508984378],\"visible\":true,\"title\":\"Orphanage Ministry\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Orphanage Ministry


About the Ministry:
East Hill Friends partners in supporting an orphanage in Kenya.

Contact Info:
East Hill Friends Office
drpastorpaul@comcast.net

\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[0.665643153557302,36.88171790234378],\"visible\":true,\"title\":\"Short Term Medical Teams\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Short Term Medical Teams


About the Ministry: Jan and Conrad Schmeltzer of Reedwood Friends make regular short-term trips to Friends Lugulu Mission Hospital in western Kenya.


Contact Info:
June Hartung: jqhart@q.com
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[29.387000734656578,-114.76271441992185],\"visible\":true,\"title\":\"Genesis Diez\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Genesis Diez


About the Ministry: Melba Friends partners with Genesis Diaz A.C. to minister to orphans and migrant children of the Baja California.


Contact Info:
genesisdiez.org, or Melba Friends Church Office: melbafriends@gmail.com
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[32.45535271858296,-114.77507403906247],\"visible\":true,\"title\":\"Equipo\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Equipo


About the Ministry: Newberg area churches partner with Nueva Esperanza Baptist Church for a yearly service trip to San Luis.


Contact Info:
Leslie Hodgdon Murray: leshodg@gmail.com
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[26.32300053627014,-104.29274371679679],\"visible\":true,\"title\":\"YWAM Short Term Missions\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: YWAM Short Term Missions


About the Ministry: Medford Friends Church makes a trip to Mexico each year to build a house through a ministry of YWAM.


Contact Info:
Medford Friends Church Office: terry@medfordfriendschurch.org
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[25.20498187261539,-102.38112262304685],\"visible\":true,\"title\":\"Short Term Missions Teams\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry:
Short Term Missions

About the Ministry: Rose Valley Friends sends a team to Mexico each year for Spring Break.


Contact Info:
Rose Valley Friends Church Office: office@rosevalleyfriends.org
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[32.02903458091031,35.11230439062501],\"visible\":true,\"title\":\"Ye Olde Fair Trader\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Ye Olde Fair Trader


About the Ministry: Lorie Wood of West Hills Friends partners with olive growers in Palestine to provide a fair trade market for their products in the northwest.


Contact Info:
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[14.261720897562249,120.97595185156251],\"visible\":true,\"title\":\"Nehemiah House\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Nehemiah House


About the Ministry: City’s Edge Friends partners with a ministry providing recovery support for those who have been sexually abused.


Contact Info:
Katy Brumbelow: katy_banham@yahoo.com
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[7.577604925292531,29.899291695312513],\"visible\":true,\"title\":\"Clean Water for the World\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Clean Water for the World


About the Ministry: Bob Bonaci of Olympic View Friends has traveled to South Sudan with a group from Puget Sound to provide water filtration systems.


Contact Info:
Olympic View Friends Church Office: ovfc@harbornet.com
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[1.579084446362143,32.36022919531251],\"visible\":true,\"title\":\"Missionary Aviation Fellowship\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry:
Missionary Aviation Fellowship

About the Ministry: John and Cher Cadd of Medford Friends are working with MAF to provide aviation support for missions work.


Contact Info:
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[0.9640045271015558,32.53601044531251],\"visible\":true,\"title\":\"World Gospel Mission\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: World Gospel Mission


About the Ministry: Jeff and Christine Stanfield of 2nd Street Community Church are serving as long-term missionaries working to equip local people to answer God’s call.


Contact Info:
Jeff and Christine Stanfield: kenyastan@gmail.com
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[49.608930000333075,30.822143257812513],\"visible\":true,\"title\":\"YWAM\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: YWAM


About the Ministry: Lance Roberts and Megan Roberts of Metolious Friends is serving with YWAM in Ukraine.


Contact Info:
Ron Mulkeyronmulkey@gmail.com
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[45.48101670323272,-122.6306393731079],\"visible\":true,\"title\":\"Intervarsity\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Intervarsity

About the Ministry: Michael & Sarahlynn Havens of Reedwood Friends are serving in Student ministry across cultures at Reed College.


Contact Info:
June Hartung: jqhart@q.com
\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[45.64221776584902,-122.65613108758544],\"visible\":true,\"title\":\"Vancouver Peace and Justice Fair\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Vancouver Peace and Justice Fair


About the Ministry: West Hills Friends partners with Vancouver area churches and organizations in September for a weekend event promoting peace and justice.


Contact Info:
Kay Ellison(360)-696-4840
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[45.47106473339548,-122.73084883254091],\"visible\":true,\"title\":\"Friends Committee on National Legislation\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Friends Committee on National Legislation

About the Ministry: Mike Huber of West Hills Friends works with FCNL to lobby for peace and justice in American policies.


Contact Info:
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[43.60149314475838,-116.2111980156235],\"visible\":true,\"title\":\"Christian Medical and Dental Association\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Christian Medical and Dental Association


About the Ministry: Janice Pina of Boise Friends works with CMDA to do short-term medical missions to areas of need.


Contact Info:
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[45.30010238558111,-122.97567550700228],\"visible\":true,\"title\":\"International Adoptions\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
About the Ministry: Meghan Czarnecki, Amy Ocker, & Virginia Kassahn of 2nd Street Friends work to facilitate international adoptions.


Contact Info:
Meghan Czarnecki: megczar@gmail.com
Virginia Kassahn: vkassahn@yahoo.com
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[45.30045330106094,-122.97256950896303],\"visible\":true,\"title\":\"Bible Foundation\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Bible Foundation

About the Ministry: Jerry Kingrey of 2nd Street Friends works to distribute bibles around the world.  Chapters Books and Coffee serves as a drop-off location for Bibles..


Contact Info:
The Bible Foundation: bf@bf.org
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[-14.420955545686613,-65.06966459544537],\"visible\":true,\"title\":\"PRODOLA\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: PRODOLA

About the Ministry: Hal and Nancy Thomas work with the Latin America Doctoral Program in Theology (PRODOLA), an academic program geared to meet the leadership needs of the growing church in Latin America.

Contact Info:
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[-3.3432189544846227,29.934997261718763],\"visible\":true,\"title\":\"Peace through Pieces\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Peace through Pieces


About the Ministry:
Patty Federighi and Carolann Palmer of North Seattle Friends provide quilt-making training to trauma victims in order to bring reconciliation and hope to war-torn communities.  They partner with Trauma Healing and Reconciliation Services, a ministry of Friends in Burundi.

Contact Info:
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[-13.54966833879357,33.82965058203126],\"visible\":true,\"title\":\"Short Term Missions\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Short Term Missions


About the Ministry:
Cherry Grove Friends has sent three teams to Lilongwe, Malawi in order to build homes for local orphans and street kids in the care of Samuel Kayuni. They have also visited churches and hospitals in the area.

Contact Info:
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[14.902533662506924,-86.97876006249987],\"visible\":true,\"title\":\"Health Promoter Project\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Health Promoter Project


About the Ministry: North Seattle Friends Church supports a medical mission project of Honduras Yearly Meeting. Since 2002, Portia Jones and her husband Jonathan Hibbs have made over 25 trips to northwestern Honduras to train health promoters, selected by Friends churches, who treat, on average, 3 people per week in remote mountain villages. The entire project is under the direction of the Intergrated Development Team, a committee of Honduras Yealy Meeting.


Contact Info:
Jonathan Hibbs and Portia Jones: hibbs005@gmail.com
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"},{\"iconid\":\"33\",\"options\":{\"position\":[33.7489954,-84.3879824],\"visible\":true,\"title\":\"Quaker Voluntary Services\"},\"event\":{\"click\":{\"infoWindow\":{\"options\":{\"content\":\"
Ministry: Quaker Volunteer Services (QVS)

About the Ministry: QVS is a year-long experience for Friends to serve local communities around the United States within the context of a small, local community. A member of West Hills Friends is currently serving for one year at the Quaker Voluntary Services (QVS) location in Atlanta, GA. 

Meeting: West Hills Friends
\",\"maxWidth\":\"0\"}}}},\"catID\":\"-1\"}],\"labels\":[],\"images\":[],\"polylines\":[],\"polygons\":[],\"rectangles\":[],\"circles\":[],\"kmlfiles\":[],\"routes\":[],\"catlegendenable\":true,\"catlegend\":[null,null,null,null,null],\"legends\":[],\"savetime\":\"2014-3-13 16:21:5\",\"clustering\":false,\"clustering_gridsize\":\"50\",\"clustering_maxzoom\":\"12\"}"); // test 3 0000-00-00 00:00:00 18559 // qoute test 0 48421