var mapviewer, panzoomWidget, overview_widget;

function schedule(objectID, functionCall) {
	if (document.getElementById(objectID)) {
		eval(functionCall);
	} else {
		setTimeout("schedule('" + objectID + "', '" + functionCall + "')", 1);
	}
	return true;
}

function resizeMapviewer() {
    var maps = document.getElementById('mapviewer');
    if (maps) {
        var posi = getAbsolutePosition(maps);
        var dim = getClientDimensions();
        var mapheight = dim.y - posi.top - 33;
        if (mapheight > 200) {
            maps.style.height = mapheight + 'px';
        } else {
            maps.style.height = '200px';
        }
    }
}

function togglepanel(panelId) {
    var oPanel = document.getElementById(panelId);
    if (oPanel) {
        if (oPanel.className.indexOf("expanded") > -1) {
            oPanel.className = 'palette';
        } else {
            oPanel.className = 'palette expanded';
        }
    }
}

function getLockKey() {
    var pos = mapviewer.getCurrentPosition();
    return pos.lat + ',' + pos.lon + '|' + mapviewer.getZoomFactor() + '|' + mapviewer.getMapType();
}

function addPaletteLinks() {
    var sh = document.getElementById('searchHistory').getElementsByTagName('a')[0];
    var fa = document.getElementById('favourites').getElementsByTagName('a')[0];
    sh.onclick = function() {
        // Just set document.location to allow other elements to use this event handler.
        document.location = '/maps/?plt=s&map=' + getLockKey() + '&hloc=' + document.getElementById('country').value;
        return false;
    }
    fa.onclick = function() {
        document.location = '/maps/?plt=f&map=' + getLockKey() + '&hloc=' + document.getElementById('country').value;
        return false;
    }
    document.getElementById('searchHistory').getElementsByTagName('h3')[0].onclick = sh.onclick;
    document.getElementById('favourites').getElementsByTagName('h3')[0].onclick = fa.onclick;
	
	if (document.getElementById('countryMaps') != null) {
		
		var cm = document.getElementById('countryMaps').getElementsByTagName('a')[0];
		cm.onclick = function(){
			document.location = '/world/';
			return false;
		}
		document.getElementById('countryMaps').getElementsByTagName('h3')[0].onclick = cm.onclick;
	}
}

function addTabStates() {
    if ( !document.getElementById('searchListing') ) {
        return false;
    }
    document.getElementById('searchListing').onclick = function(e) {
        var target = MMWCommon.getEventTarget(e);
        var list = target.parentNode.parentNode;
        if (list.id == 'downlinklistsm' || list.parentNode.id == 'alphamenu' || list.parentNode.id == 'resultsPane') {
            if ( MMWCommon.hasCssClass(document.getElementById('left'), 'dir') && target.href.indexOf('javascript:') == -1 ) {
                target.href = target.href + '/?t=r';
            }
        }
        return true;
    }
}

function addPanelToggles() {
    var opagedesc = document.getElementById('pagedesc');
    if (opagedesc) {
        //insert toggle link
        var a = document.createElement('a');
        a.className = 'toggle';
        a.href = 'javascript:togglepanel(\'pagedesc\')\;';
        a.setAttribute('title', 'Toggle panel');
        
        var h1 = opagedesc.getElementsByTagName('h1')[0];
        var strong = opagedesc.getElementsByTagName('h1')[0].getElementsByTagName('strong')[0];
        
        h1.insertBefore(a, strong)
        h1.insertBefore(document.createTextNode(' '), strong)
        opagedesc.className = 'palette';
    }
    var oTdLinks = document.getElementById('tdLinks');
    if (oTdLinks) {
        //insert toggle link
        var a = document.createElement('a');
        a.className = 'toggle';
        a.href = 'javascript:togglepanel(\'tdLinks\')\;';
        a.setAttribute('title', 'Toggle panel');
        
        var h3 = oTdLinks.getElementsByTagName('h3')[0];
        var strong = oTdLinks.getElementsByTagName('h3')[0].getElementsByTagName('strong')[0];
        
        h3.insertBefore(a, strong)
        h3.insertBefore(document.createTextNode(' '), strong)
        oTdLinks.className = 'palette';
    }
    var oDownLinks = document.getElementById('downLinks');
    if (oDownLinks) {
        //insert toggle link
        var a = document.createElement('a');
        a.className = 'toggle';
        a.href = 'javascript:togglepanel(\'downLinks\')\;';
        a.setAttribute('title', 'Toggle panel');
        
        var h3 = oDownLinks.getElementsByTagName('h3')[0];
        var strong = oDownLinks.getElementsByTagName('h3')[0].getElementsByTagName('strong')[0];
        
        h3.insertBefore(a, strong)
        h3.insertBefore(document.createTextNode(' '), strong)
    }		
}

function addTabToggles() {
    var oFindPlace = document.getElementById('findPlace');
    if (oFindPlace) {
        //insert toggle link
        var oFindPlaceLink = oFindPlace.getElementsByTagName('a')[0];
        if (oFindPlaceLink) {
            oFindPlaceLink.href = 'javascript:selecttab(\'loc\')\;';
        }
    }
    var oGetDirections = document.getElementById('getDirections');
    if (oGetDirections) {
        //insert toggle link
        var oGetDirectionsLink = oGetDirections.getElementsByTagName('a')[0];
        if (oGetDirectionsLink) {
            oGetDirectionsLink.href = 'javascript:selecttab(\'dir\')\;';
        }
    }
}
function addFormSubmits() {

    var oPlaceForm = document.getElementById('placeform');
    if (oPlaceForm) {
        addEvent(oPlaceForm, "submit", linkplace);
    }
    var oDirectionsForm = document.getElementById('directionsform');
    if (oDirectionsForm) {
        addEvent(oDirectionsForm, "submit", linkdirections);
    }
}
function linkplace(e) {
    //construct url and redirect to main website
    var oCountry = document.getElementById('country');
    var oLocation = document.getElementById('location');
    if (oCountry && oLocation) {
       var sPlaceURL = '/maps/?qs=' + oLocation.value + '&countryCode=' + oCountry.options[oCountry.selectedIndex].value;
       document.location = sPlaceURL;
    }
    if (e && e.preventDefault)
        e.preventDefault(); // DOM style
    return false; // IE style
}
function linkdirections(e) {
    //construct url and redirect to main website
    var oModeDriving = document.getElementById('mode_driving');
    var oStyleQuickest = document.getElementById('style_quickest');
    var oDirFrom = document.getElementById('dir_from');
    var oCountryFrom = document.getElementById('country_from');
    var oDirTo = document.getElementById('dir_to');
    var oCountryTo = document.getElementById('country_to');
    
    if (oModeDriving && oStyleQuickest && oDirFrom && oCountryFrom && oDirTo && oCountryTo) {
        var iMode = 1, iStyle = 0;
        if (oModeDriving.checked) {
            if (!oStyleQuickest.checked) {
                iStyle = 1;
            }
        } else {
            iMode = 0;
        }
        var sPlaceURL = '/maps/?hroute='+iMode+'|'+iStyle+'|'+oDirFrom.value+':'+oDirTo.value+'|'+oCountryFrom.options[oCountryFrom.selectedIndex].value+':'+oCountryTo.options[oCountryTo.selectedIndex].value+'';
        //alert(sPlaceURL);
        document.location = sPlaceURL;
    }
    if (e && e.preventDefault)
        e.preventDefault(); // DOM style
    return false; // IE style
}
function addTDModeToggles(){
    var oModeDriving = document.getElementById('mode_driving');
    if (oModeDriving) {
        //insert toggle link
        addEvent(oModeDriving, "click", tddrive);
    }
    var oModeWalking = document.getElementById('mode_walking');
    if (oModeWalking) {
        //insert toggle link
        addEvent(oModeWalking, "click", tdwalk);
    }
}
function selecttab(sClass){
       var oLeft = document.getElementById('left');
       if (oLeft){
            oLeft.className = 'column '+sClass;
       }
}
function tdwalk(){
    var oWalkRadio = document.getElementById('mode_walking');
    var oDirOptions = document.getElementById('dirOptions');
    var oStyleQuickest = document.getElementById('style_quickest');
    var oStyleShortest = document.getElementById('style_shortest');
    if(oWalkRadio&&oDirOptions&&oStyleQuickest&&oStyleShortest){
        oDirOptions.className = 'walking';
        oWalkRadio.checked = true;
        oStyleQuickest.disabled = true;
        oStyleShortest.disabled = true;
    }
}
function tddrive(){
    var oDriveRadio = document.getElementById('mode_driving');
    var oDirOptions = document.getElementById('dirOptions');
    var oStyleQuickest = document.getElementById('style_quickest');
    var oStyleShortest = document.getElementById('style_shortest');
    if(oDriveRadio&&oDirOptions&&oStyleQuickest&&oStyleShortest){
        oDirOptions.className = 'driving';
        oDriveRadio.checked = true;
        oStyleQuickest.disabled = false;
        oStyleShortest.disabled = false;
    }
}
function initDownLinks() {
    var downlinklist = document.getElementById('downlinklist');
    var alphamenu = document.getElementById('alphamenu');
    if (downlinklist && alphamenu) {
        var aLinks = downlinklist.getElementsByTagName('li');
        if (aLinks) {
            var aAlpha = new Array();
            aAlpha[0] = aLinks[0].childNodes[0].innerHTML.charAt(0).toUpperCase();
            for(var i=0;i<aLinks.length;i++) {
                var currLetter = aAlpha[aAlpha.length-1].toUpperCase();
                if (aLinks[i].childNodes[0].innerHTML.charAt(0).toUpperCase() != currLetter) {
                    aAlpha.push(aLinks[i].childNodes[0].innerHTML.charAt(0).toUpperCase());
                }
            }
            var ul = document.createElement('ul');
            alphamenu.appendChild(ul);
            
            for(var i=0;i<aAlpha.length;i++) {
                var li = document.createElement('li');
                ul.appendChild(li);
                
                var a = document.createElement('a');
                a.appendChild(document.createTextNode(aAlpha[i]));
                a.setAttribute('title', aAlpha[i]);
                a.href = 'javascript:showlinks(\''+aAlpha[i]+'\')';
                li.appendChild(a);
            }
            alphamenu.style.display = 'block';
            showlinks(aAlpha[0]);
        }
    }
}

function showlinks(sLetter) {
    var downlinklist = document.getElementById('downlinklist');
    var alphamenu = document.getElementById('alphamenu');
    var aLetterLinks = alphamenu.getElementsByTagName('a');
    for(var i=0;i<aLetterLinks.length;i++) {
        if (aLetterLinks[i].title == sLetter) {
            aLetterLinks[i].className = 'active';
        } else {
            aLetterLinks[i].className = '';
        }
    }
    if (downlinklist && alphamenu) {
        var aLinks = downlinklist.getElementsByTagName('li');
        for(var i=0;i<aLinks.length;i++) {
            if (aLinks[i].childNodes[0].innerHTML.charAt(0).toUpperCase() == sLetter) {
                aLinks[i].style.display = 'inline';
            } else {
                aLinks[i].style.display = 'none';
            }
        }
    }
}

function selectOptionByHiddenValue(_selectId,_hiddenValueId) {
            if (document.getElementById(_hiddenValueId)) {
                var matchedOptionValue = document.getElementById(_hiddenValueId).value;
                selectTagId = document.getElementById(_selectId);
                    for (var k=0; k<selectTagId.options.length-1; k++){
                        if (selectTagId.options[k].value==matchedOptionValue){
                            selectTagId.options[k].selected = true;
                            return;
                        } else {
                            selectTagId.options[selectTagId.options.length-1].selected = true;
                        }
                    }
            }
        }

function getClientDimensions() {
    var x,y;
    if (self.innerHeight) {
            x = self.innerWidth;
            y = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight) {
            x = document.documentElement.clientWidth;
            y = document.documentElement.clientHeight;
    }
    else if (document.body) {
            x = document.body.clientWidth;
            y = document.body.clientHeight;
    }
    return { "x":x, "y":y };
}

function getAbsolutePosition(o, stop_at_element) {
    if (!o || typeof o != "object") {
        return false;
    }
    if (!o.offsetParent) {
        return false;
    }
    var position = new Object();
    position["left"] = parseInt(o.offsetLeft);
    position["top"] = parseInt(o.offsetTop);
    while (o = o.offsetParent) {
        if (o == stop_at_element) {
            break;
        }
        position["left"] += parseInt(o.offsetLeft);
        position["top"] += parseInt(o.offsetTop);
    }
    return position;
}

function toggleLeftNav() {
    var oLeft = document.getElementById('left');
    var oContainer = document.getElementById('container');
    var oHideleftnav = document.getElementById('hidesidenav');
    if (oLeft.style.display != 'none') {
        oLeft.style.display = 'none';
        oContainer.style.marginLeft = '0';
        oHideleftnav.className = 'controllerR';
        mapviewer.resize();
    } else {
        oLeft.style.display = 'block';
        oContainer.style.marginLeft = '310px';
        oHideleftnav.className = 'controllerM';
        mapviewer.resize();
    }
}

function addHideLeftNavLink() {
    var map = document.getElementById('map');
    var anchor = document.createElement('a');
    anchor.className = 'controllerM';
    anchor.href = 'javascript:toggleLeftNav()\;';
    anchor.setAttribute('alt', 'Hide side bar');
    anchor.setAttribute('id', 'hidesidenav');
    map.appendChild(anchor);
}

function addEvent(obj, evType, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(evType, fn, false);
        return true;
    } else if (obj.attachEvent) {
        var r = obj.attachEvent("on"+evType, fn);
        return r;
    } else {
        return false;
    }
}

MMWCommon = {}

MMWCommon.getElementsByTagNameClass = function(o, tag_name, css_class) {
    if (!o || typeof o != "object") {
        return false;
    }
    var child_elements = new Array();
    var elements = o.getElementsByTagName( tag_name );
    for (var i = 0, j = elements.length; i<j; i++) {
        if (this.hasCssClass(elements[i], css_class) || css_class == "" || css_class == null) {
            child_elements.push(elements[i]);
        }
    }
    return child_elements;
}

MMWCommon.hasCssClass = function(o, css_class) {
        return o.className.match(new RegExp("\\b" + css_class + "\\b")) == css_class;
   }

MMWCommon.getEventTarget = function(e) {
    var e = e || window.event;
    var targ = e.target || e.srcElement;
    if (targ.nodeType == 3) {// defeat Safari bug
            targ = targ.parentNode;
    }   
    return targ;
}

MMWCore = {}
MMWCore.AdManager = {
    ad_areas: [], // Array of ad placments. 7 on home page. 6 on bundles.
    init: function() {
        var areas = MMWCommon.getElementsByTagNameClass( document.getElementsByTagName('body')[0], 'div', 'advert_area');
        for ( var i = 0, j = areas.length; i < j; ++i ) {
            var area = new MMWCore.AdArea( areas[i].id, areas[i], i );
            this.ad_areas.push( area );
        }
        this.getKeywords();
    },
    getPlacementParams: function() {
        var wai = this.data;;
        var p = {
            'key1': wai && wai.record_sets && wai.record_sets[1] && wai.record_sets[1].records[0] ? wai.record_sets[1].records[0].name : '',
            'key2': wai && wai.record_sets && wai.record_sets[0] && wai.record_sets[0].records[0] ? wai.record_sets[0].records[0].iso : '',
            'key3': 'key3',
            'key4': 'key4',
            'mode': 'maps',
            'ip_country': MMWCore.AdConfig.ad_country(MMWCommon.CurrentCountryIP),
            'channel': 'maps'
        }
        return p;
    },
    refresh: function() {
        var params = this.getPlacementParams();

        // Loop through ad areas and refresh them all
        for( var i = 0, j = this.ad_areas.length; i < j; ++i ) {
            this.ad_areas[i].refresh( params );
        }
        return true;
    },
    getKeywords: function() {
        this.data = new MMWhereAmI(MMWCore.AdManager.callback)
        this.data.coords = mapviewer.getCurrentPosition();
        this.data.zoom_factor = mapviewer.getZoomFactor();
        if (this.data.zoom_factor > 6 ) {
            this.data.search()
        } else {
            MMWCore.AdManager.callback();
        }
    },
    callback: function() {
        setTimeout("MMWCore.AdManager.refresh()", 4000);
    }
} 

MMWCore.AdArea = function( _id, _node ) {
    this.ID = _id;
    this.node = _node;
}

MMWCore.AdArea.prototype = {
    refresh: function( params ) {
        var content = MMWCore.AdConfig[this.ID].template;
        try {
            content = content.replace(/PLACEMENT_ID/, MMWCore.AdConfig[this.ID][params.ip_country][params.channel][params.mode]);
        } catch (e) { }
        content = content.replace(/KEY1/, params.key1);
        content = content.replace(/KEY2/, params.key2);
        content = content.replace(/KEY3/, params.key3);
        content = content.replace(/KEY4/, params.key4);

        // use special API function to avoid Safari innerHTML bug:
        mapviewer.setInnerHTML ( this.node, content );
    }
}

schedule("map", "addHideLeftNavLink()");

if ( window.addEventListener) {
    window.addEventListener('resize', resizeMapviewer, false);
} else if (window.attachEvent) {
    window.attachEvent('onresize', resizeMapviewer);
}

window.onload = function() {
    resizeMapviewer();
    initDownLinks();
    addPanelToggles();
    addTabToggles();
    addTDModeToggles();
    addFormSubmits();
    
    //Add the map
	mapviewer = new MultimapViewer( document.getElementById( 'mapviewer' ) );
	
	var sMapbounds = document.getElementById('mapbounds');
    if (sMapbounds) {
	    // get map coords and zoom level
        var aMapbounds = sMapbounds.content.split(",");
	    mapviewer.goToPosition( new MMBounds(new MMLatLon(parseFloat(aMapbounds[0]),parseFloat(aMapbounds[1])),new MMLatLon(parseFloat(aMapbounds[2]),parseFloat(aMapbounds[3]))));
	} else {
	    // show world map
	    mapviewer.goToPosition( new MMLocation ( new MMLatLon( 20, 30 ), 3 ) );
	}
	
	// Add widgets
	var topRight = new MMBox( 10, 10 );
	panzoomWidget = new MMPanZoomWidget(topRight);
	mapviewer.addWidget( panzoomWidget );
	overview_widget = new MMOverviewWidget( undefined, new MMDimensions( 120, 120 ) );
	mapviewer.addWidget( overview_widget );
        mapviewer.addWidget( new MMMapTypeWidget() );
        MMWCore.AdManager.init();
        addPaletteLinks();
        addTabStates();
}

