var d = document; var MPOI = {}; var loader = 'maps_zloader.php'; MPOI['records'] = {}; MPOI['idmap'] = {}; MPOI['last_popup'] = 0; function ylib_Browser() { d=document; this.agt=navigator.userAgent.toLowerCase(); this.major = parseInt(navigator.appVersion); this.dom=(d.getElementById)?1:0; // true for ie6, ns6 this.ns=(d.layers); this.ns4=(this.ns && this.major == 4); this.ns4up=(this.ns && this.major >=4); this.ns6=(this.dom&&navigator.appName=="Netscape"); this.op=(window.opera? 1:0); this.op6= ((this.agt.indexOf("opera 6") > 0) || (this.agt.indexOf("opera/6") > 0)); this.ie=(d.all); this.ie4=(d.all&&!this.dom)?1:0; this.ie4up=(this.ie && this.major >= 4); this.ie5=(d.all&&this.dom && navigator.userAgent.match(/MSIE 5/)); this.ie6=(d.nodeType)? 1:0; this.sf=(this.agt.indexOf("safari")!=-1); this.win=((this.agt.indexOf("win")!=-1) || (this.agt.indexOf("16bit")!=-1)); this.mac=(this.agt.indexOf("mac")!=-1); } var oBw = new ylib_Browser(); // this function assumes the inclusion of js/env_detection function mpoi_is_supported() { if (oBw.op) return 0; if (oBw.ns4) return 0; if (oBw.mac && oBw.ie) return 0; if (oBw.dom) return 1; return 0; } // popups function mpoi_mouseout(event) { var record = _mpoi_get_record(event); if (!record) { return false; } var state = record['popup_state']; if (state == 'title') { var icon = record['icon_div']; icon.style.zIndex = 50; var icon_size = 16; if ( record['isize'] ) icon_size = record['isize']; mpoi_set_icon(icon, record['icon'], 'mouseout', icon_size, icon_size, record['x'], record['y']); var popup = record['popup_div']; popup.style.visibility = 'hidden'; popup.style.zIndex = 100; record['popup_state'] = 'closed'; var id = record['id']; oLi = document.getElementById(id); if ( oLi ) { if (oLi.style.backgroundColor == "#d8e6fa"){ oLi.style.backgroundColor = ""; } } } return true; } function mpoi_mouseover(event) { var record = _mpoi_get_record(event); if (!record) { return false; } var state = record['popup_state']; if (!state || state == 'closed') { var icon = record['icon_div']; icon.style.zIndex = 1000; mpoi_set_icon(icon, record['icon'], 'mouseover', 20, 20, record['x'], record['y']); var popup = record['popup_div']; var c = mpoi_make_popup(record, 'title'); _mpoi_set_popup(popup, c); mpoi_position_popup(record); popup.style.zIndex = 1500; record['popup_state'] = 'title'; var id = record['id']; oLi = document.getElementById(id); if ( oLi ) { if (oLi.style.backgroundColor == ""){ oLi.style.backgroundColor = "#d8e6fa"; } else { oLi.style.backgroundColor = ""; } } } return true; } function _mpoi_set_popup(popup, msg) { popup.style.left = '0px'; popup.style.top = '0px'; popup.style.width = '200px'; popup.innerHTML = msg; popup.style.visibility = 'visible'; } function mpoi_onclick(event) { var record = _mpoi_get_record(event); if (!record) { return false; } var state = record['popup_state']; if (state == 'closed' || state == 'title') { var icon = record['icon_div']; icon.style.zIndex = 1000; if(oBw.ie5) record['cat'] = null; //no tracking for ie5, url length issue mpoi_set_icon(icon, record['icon'], 'click', 20, 20, record['x'], record['y'], record['cat']); var popup = record['popup_div']; var c = mpoi_make_popup(record, 'expand'); _mpoi_set_popup(popup, c); mpoi_position_popup(record); popup.style.zIndex = 1100; record['popup_state'] = 'expand'; if (MPOI['last_popup'] != record['id']) { mpoi_close(MPOI['last_popup']); } MPOI['last_popup'] = record['id']; } else if (state == 'expand') { mpoi_close(record['id']); } return true; } function mpoi_expand_popup(id) { var idmap = MPOI['idmap']; if (idmap[id]) { var record =idmap[id]; var icon = record['icon_div']; icon.className = 'mpoiselected'; var popup = record['popup_div']; var c = mpoi_make_popup(record, 'expand'); _mpoi_set_popup(popup, c); mpoi_position_popup(record); record['popup_state'] = 'expand'; } } function mpoi_position_popup(record) { var popup = record['popup_div']; var icon = record['icon_div']; var icon_w = icon.width; var icon_h = icon.height ; var width = popup.offsetWidth; var height = popup.offsetHeight; var image = document.getElementById('map'); var x = parseInt(record['x']); var y = parseInt(record['y']); if ((x + 4 + icon_w/2 + width) >= image.offsetWidth) { x = x - width - icon_w/2 - 2; } else { x = x + 4 + icon_w/2; } if ((y + height) >= image.offsetHeight) { y = (y - height) + icon_h / 2; } else { y = y - icon_h / 2; } popup.style.left = x + 'px'; popup.style.top = y + 'px'; popup.style.zIndex = 1000; } function mpoi_close(id) { var record = MPOI['records'][id]; if (!record) { return false; } var icon = record['icon_div']; icon_size = 16; if (record['isize']) icon_size = record['isize']; mpoi_set_icon(icon, record['icon'], 'mouseout', icon_size, icon_size, record['x'], record['y']); var popup = record['popup_div']; popup.style.visibility = 'hidden'; record['popup_state'] = 'closed'; var id = record['id']; oLi = document.getElementById(id); if ( oLi ) { if (oLi.style.backgroundColor == "#d8e6fa"){ oLi.style.backgroundColor = ""; } } } function _mpoi_get_record(event) { if (!event) { event = window.event; } var src = event.srcElement; if (!src) { src = event.currentTarget; } if (!src) { return; } var idmap = MPOI['idmap']; while (src) { var id = src.id; if (id) { var record = idmap[id]; if (record) { return record; } } src = src.parentNode; } return; } function mpoi_pan(x, y) { // TODO: decouple from mpoi_form name var form = document.getElementById('mpoi_form'); if (x == 0) { x = 1; } if (y == 0) { y = 1; } form.pan_x.value = x; form.pan_y.value = y; return mpoi_update_state(form); } function mpoi_pan_dir(dir) { var form = document.getElementById('mpoi_form'); form.compass.value = dir; return mpoi_update_state(form); } function mpoi_zoom(z) { // TODO: decouple from mpoi_form name var form = document.getElementById('mpoi_form'); if (z == 0 && form.mag.value > 1) { form.mag.value--; } else if (z == 11 && form.mag.value < 10) { form.mag.value++; } else { form.mag.value = z; } return mpoi_update_state(form); } function mpoi_map_click(event) { if (!event) { event = window.event; } var src = event.srcElement; var form = document.getElementById('mpoi_form'); if (!src) { src = event.currentTarget; } if (!src) { return false; } var pan_x; var pan_y; if (event.layerX) { pan_x = event.layerX; pan_y = event.layerY; } else { pan_x = event.offsetX; pan_y = event.offsetY; } var panable; if ( form.panable ) return mpoi_pan(pan_x, pan_y); else return true; } function mpoi_server_update() { var data = mpoi_expand_data(mpoi_fields, mpoi_data); mpoi_clear_points(); for (var i = 0; i < data.length; i++) { var record = data[i]; var id = record['id']; mpoi_add_point(id, record); } } function mpoi_add_point(id, record) { var mpoi_records = MPOI['records']; var mpoi_idmap = MPOI['idmap']; if (mpoi_records[id]) { // duplicate id return; } var container = document.getElementById('mpoi_container'); var x = record['x']; var y = record['y']; var icon = record['icon']; var id = record['id']; var icon_size = 16; if ( record['isize'] ) icon_size = record['isize']; // icon var iconimg = document.createElement('img'); iconimg.width = icon_size; iconimg.height = icon_size; iconimg.border = 0; iconimg.style.position = 'absolute'; iconimg.style.zIndex = '500'; mpoi_set_icon(iconimg, icon, 'mouseout', icon_size, icon_size, x, y); iconimg.onmouseout = mpoi_mouseout; iconimg.onmouseover = mpoi_mouseover; iconimg.onclick = mpoi_onclick; domid = iconimg.id = id + '_icon'; mpoi_idmap[domid] = record; record['icon_div'] = iconimg; container.appendChild(iconimg); // popup var popup = document.createElement('div'); popup.style.position = 'absolute'; popup.style.left = '0px'; popup.style.top = '0px'; popup.style.visibility = 'hidden'; domid = popup.id = id + '_popup'; mpoi_idmap[domid] = record; record['popup_div'] = popup; container.appendChild(popup); mpoi_records[id] = record; mpoi_idmap[id] = record; if (record['state'] && record['state'] == 'expand') { setTimeout('mpoi_expand_popup(' + id + ')', 10); } } function mpoi_set_icon(imgnode, name, state, width, height, x, y, track) { if (!name) return; x = x - width / 2; y = y - height / 2; var url = 'http://us.i1.yimg.com/us.yimg.com/i/us/map/gr/' + name; if (state == 'mouseout') { url += '_s.gif'; } else if (state == 'click') { url += '_r.gif'; } else if (state == 'mouseover') { url += '_c.gif'; } else { // unknown state return; } if (track) { url = 'http://us.rd.yahoo.com/maps/mapresults/mpoi/' + track + '/*' + url; } imgnode.style.left = x + 'px'; imgnode.style.top = y + 'px'; imgnode.style.cursor = 'hand'; imgnode.src = url; imgnode.width = width; imgnode.height = height; } function mpoi_make_el(tag, attrs) { var result = document.createElement(tag); if (attrs) { for (var attr in attrs) { if (attr == 'className') { result.setAttribute('class', attrs[attr]); } result.setAttribute(attr, attrs[attr]); } } return result; } function mpoi_make_popup(record, state) { var c = ''; // should the title be shown? if (state == 'title') { c += '
'; c += ''; c += ''; c += ''; c += '
' + record['title'] + '
Click icon for more info
'; } else if (state == 'expand') { var id = record['id']; c += '
'; c += ''; c += '
' + record['title'] + ''; c += 'Close'; c += '
'; c += record['body']; c += '
'; } return c; } function mpoi_clear_points() { var records = MPOI['records']; for (var id in records) { var record = records[id]; var popup = record['popup_div']; var div = record['icon_div']; var container = div.parentNode; container.removeChild(div); container.removeChild(popup); } MPOI['records'] = {}; MPOI['idmap'] = {}; MPOI['last_popup'] = 0; } function mpoi_sync_client(imgurl) { var mapimg = document.getElementById('map'); mapimg.src = imgurl; } function mpoi_load_content(url) { var head = document.getElementsByTagName('head').item(0); var s = document.getElementById('mpoi_script_node'); if (s) { var parent = s.parentNode; parent.removeChild(s); } s = document.createElement('script'); s.src = url; s.id = 'mpoi_script_node'; head.appendChild(s); } function mpoi_build_query(form) { var qs = ''; var bfkey = ''; for (e=0;e < form.elements.length;e++) { var el = form.elements[e]; if (el.name!='') { if (el.name=='BFKey' && el.type!='radio') { bfkey = el.value; } if (el.type == 'radio') { if (!el.checked) { continue; } if (el.checked && bfkey!='') { continue; } } if (el.type == 'checkbox' && !el.checked) { continue; } qs+=(qs=='')?'?':'&' qs+=el.name+'='+escape(el.value) } } return qs; } function mpoi_update_state(form) { var url = loader + mpoi_build_query(form); if (mpoi_is_supported() && !oBw.sf) { form.pan_x.value = 0; form.pan_y.value = 0; mpoi_load_content(url); return false; } else { form.submit(); return false; } } function mpoi_init_ui(pan, zoom, load) { if (load) { loader = load; } if (!pan) { pan = 'mpoi_pan_'; } if (!zoom) { zoom = 'mpoi_zoom_'; } // register event handlers on the pan controls var directions = ['n', 'nw', 'w', 'sw', 's', 'se', 'e', 'ne']; for (var i = 0; i < directions.length; i++) { var dir = directions[i]; var id = pan + dir; var node = document.getElementById(id); if (node) { if (mpoi_is_supported()) { node.compass = dir; node.onclick = mpoi_pan_ui; } node.onmouseover = mpoi_handler; node.onmouseout = mpoi_handler; } else { // did not get a pan node } } // register event handlers on the zoom controls for (var i = 0; i <= 11; i++) { var id = zoom + i; var node = document.getElementById(id); if (node) { if (mpoi_is_supported()) { node.mag = i; node.onclick = mpoi_zoom_ui; } } else { // did not get a zoom node } } // on the resize handlers if (mpoi_is_supported()) { var node = document.getElementById('ymaprsz'); if (node) { node.onclick = mpoi_handler; } node = document.getElementById('ymaprszic'); if (node) { node.onclick = mpoi_handler; } } } function mpoi_get_width() { return 400; } function mpoi_get_height() { return 400; } function mpoi_zoom_ui(event) { if (!event) { event = window.event; } var src = event.srcElement; if (!src) { src = event.currentTarget; } while (src) { var mag = src.mag; if (typeof(mag) != 'undefined') { return mpoi_zoom(mag); } src = src.parentNode; } return true; } function mpoi_pan_ui(event) { if (!event) { event = window.event; } var src = event.srcElement; if (!src) { src = event.currentTarget; } if (src) { var dir = src.compass; if (!dir) { return true; } return mpoi_pan_dir(dir); } else { return true; } } function mpoi_expand_data(fields, raw) { var result = []; var raw_len = raw.length; var fields_len = fields.length; var rec_count = raw_len / fields_len; for (var i = 0; i < rec_count; i++) { var rec = result[i] = []; for (var j = 0; j < fields_len; j++) { rec[fields[j]] = unescape(raw[i * fields_len + j]); } } return result; } function getZoomLabel(lvl, state, loc) { var lbl; //add a left margin to 1-9 zoom level (lvl<10 && lvl !=0) ? lbl=' '+ lvl + '' : lbl=' '+ lvl + ''; if (lvl == 0) { switch (loc) { case 'us': lbl = 'Zoom
In
'; break; case 'e1': lbl = 'Acercar'; break; case 'cf': lbl = 'Vue rapprochée'; break; case 'ca': lbl = 'Zoom
In
'; break; default: lbl = 'Zoom
In
'; break; } } else if (lvl == 2 || lvl == 4 || lvl == 8 || lvl == 10) { var view; switch (loc) { case 'us': view = new Array(0,0,'street',0,'city',0,0,0,'state',0,'country'); break; case 'e1': view = new Array(0,0,'calle',0,'ciudad',0,0,0,'estado',0,'pais'); break; case 'cf': view = new Array(0,0,'rue',0,'ville',0,0,0,'provincial',0,'pays'); break; case 'ca': view = new Array(0,0,'street',0,'city',0,0,0,'province',0,'country'); break; default: view = new Array(0,0,'street',0,'city',0,0,0,'state',0,'country'); break; } lbl += ' ' + view[lvl]; } else if (lvl == 11) { switch (loc) { case 'us': lbl = 'Zoom
Out
'; break; case 'e1': lbl = 'Alejar'; break; case 'cf': lbl = 'Vue éloignée'; break; case 'ca': lbl = 'Zoom
Out
'; break; default: lbl = 'Zoom
Out
'; break; } } if (state == 'on') { lbl = '' + lbl + ''; } return lbl; } function updateZoomButtons(lvl, loc) { var oId = document.getElementById('ymapzoom'); var oDl = oId.getElementsByTagName('div'); for (var i = 1; i < 11; i++) { if (i != lvl) { oDl[i].innerHTML = getZoomLabel(i, 'on', loc); oDl[i].className = 'ymapzoomnums'; } else { oDl[i].innerHTML = getZoomLabel(i, 'off', loc); oDl[i].className = 'ymapzoomon'; } } if (lvl != 1 && lvl != 0) { oDl[0].innerHTML = getZoomLabel(0, 'on', loc); oDl[0].className = ''; } else { oDl[0].innerHTML = getZoomLabel(0, 'off', loc); oDl[0].className = 'ymapzoomin'; oDl[1].innerHTML = getZoomLabel(1,'off',loc); oDl[1].className= 'ymapzoomon'; } if (lvl != 10 && lvl != 11) { oDl[11].innerHTML = getZoomLabel(11, 'on', loc); oDl[11].className = ''; } else { oDl[11].innerHTML = getZoomLabel(11, 'off', loc); oDl[11].className = 'ymapzoomout'; oDl[10].innerHTML = getZoomLabel(10,'off',loc); oDl[10].className= 'ymapzoomon'; } } function mpoi_handler(evt) { evt = (evt) ? evt : ((window.event) ? window.event : ""); if (evt) { var o = getTargetObj(evt); switch(evt.type) { case "mouseover": o.src = o.src.replace("nrm", "sel"); break; case "mouseout": o.src = o.src.replace("sel", "nrm"); break; case "click": if (o.id == 'ymaprsz') { submitMapForm(o); return false; break; } if (o.parentNode.id == 'ymaprszic') { //resize icon submitMapForm(o.parentNode); return false; break; } } } } function getTargetObj(evt) { var o = (evt.target) ? ( (evt.target.nodeType == 3) ? evt.target.parentNode : evt.target ) : evt.srcElement; return o; } function submitMapForm(o) { if (o) { var form = document.getElementById('mpoi_form'); if (o.id == 'ymaprsz' || o.id == 'ymaprszic') { var resize = form.resize; if (resize.value != 'l') { resize.value = 'l'; } else { resize.value = 's'; } } else { form.compass.value = o.compass; } } form.submit(); } // this function handles the logic when a category is selected function mpoi_select_cat(cat) { if (mpoi_is_supported()) { var form = document.getElementById('mpoi_form'); if (form.cat.value == cat) { form.cat.value = ''; } else { form.cat.value = cat; } var bf = form.BFKey; if (bf) { for (var i = 0; i < bf.length; i++) { if (bf[i].checked) { bf[i].checked = 0; } } } form.rezoom.value = 1; form.submit(); return false; } else { return true; } } // this function handles the logic when a sub category is selected function mpoi_select_subcat(node, subcat) { var form = node.form; form.rezoom.value = 1; if (mpoi_is_supported()) { form.action = form.action.replace("mapclick", "subcat/" + subcat); form.submit(); return false; } else { // no rd tracking for these browsers var url = 'maps_result' + mpoi_build_query(form) + '#mapcontent'; window.location = url; return true; } }