// 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"; g.expire=true; var limit_object = 8; 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;"; var width = g.data.width+g.data.width_unit; var height = g.data.height+g.data.height_unit; if(g.data.width+g.data.width_unit == "100%" || g.data.height+g.data.height_unit == "100%"){ width = g.getWidth()+"px"; height = g.getHeight()+"px"; } 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"; if( g.data.width_unit == "%" ){ dlc_div.style.width=(g.data.width)+g.data.width_unit; dlc_div.style.float="left"; }else{ dlc_div.style.width=(g.data.width)+"px"; 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=g.data.width+g.data.width_unit; }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=g.data.height+g.data.height_unit; 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+'_ffe05c1cd9c7e92f5e5c04f9c0443bf1&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.expire=true;net.imapbuilder.gmap.mapkey="AIzaSyBsJ00itihfix0LqWl2nQ86J5AYBQK_XQg";net.imapbuilder.gmap.run("{\"width\":\"700\",\"width_unit\":\"px\",\"height\":\"400\",\"height_unit\":\"px\",\"fileid\":\"\",\"filename\":\"Richland City Soccer Territory\",\"options\":{\"mapTypeId\":\"roadmap\",\"disableDoubleClickZoom\":false,\"draggable\":true,\"keyboardShortcuts\":true,\"scrollwheel\":true,\"mapTypeControl\":true,\"panControl\":true,\"scaleControl\":true,\"streetViewControl\":true,\"zoomControl\":true,\"center\":[32.22848517914985,-90.15378723144533],\"zoom\":13},\"markers\":[],\"labels\":[],\"images\":[],\"polylines\":[{\"options\":{\"encodedPath\":\"ka_dEnclePnMmvAnj@wIpM}EjS}b@ti@cjAx]_k@jJyRhEoT?}[vAkZlI}[f\\\\mlBrLc@wAxxEfuAa@rBkDtzAa@ZlTx`CcAvAia@r`@`@?|Lna@qG]sVvuCa@\\\\d_@co@taB?zKkYdPoMjb@~H`]eQzK~Hpd@dGvg@nMnr@uKf`@qCxqB{StpByTdm@c[nd@y@uf@pV`@hFiRcRaOuU}[vKyJgP_hAqa@cPc[}LmDoTfPa@xJ{KmDuWrL{K_SeBmDzKmDjDgPgQ_S|L{S_\\\\`\\\\_NZyJiYaOeQ}ZmDtt@sBpGyJa@oMgQ_IlTed@iRaRiRu_@lb@sVgBlNlSmD~Mwh@f}@eZdQ`H_]kO{KuKxJgFiCpC_NgPeP_IjDeGvXcQhRwTuHgP{KuUor@_S??cPbHqd@{SyJmNnFy@|Lic@cAwJcAkOkp@\",\"geodesic\":false,\"strokeColor\":\"#000000\",\"strokeOpacity\":1,\"strokeWeight\":3}}],\"polygons\":[],\"rectangles\":[],\"circles\":[],\"kmlfiles\":[],\"routes\":[],\"savetime\":\"2012-2-14 9:9:16\"}"); // test 2 2012-08-08 22:49:45 12655 // qoute test 0 0