function getObj(n, d) {
    var p, i, x;
    if (!d) {
        d = document;
    }
    if ((p = n.indexOf("?")) > 0 && parent.frames.length) {
        d = parent.frames[n.substring(p + 1)].document;
        n = n.substring(0, p);
    }
    if (!(x = d[n]) && d.all) {
        x = d.all[n];
    }
    for (i = 0; !x && i < d.forms.length; i++) {
        x = d.forms[i][n];
    }
    for (i = 0; !x && d.layers && i < d.layers.length; i++) {
        x = getObj(n, d.layers[i].document);
    }
    if (!x && d.getElementById) {
        x = d.getElementById(n);
    }
    return x;
}

function Replace(argvalue, x, y) {
    if (argvalue) {
        if ((x == y) || (parseInt(y.indexOf(x)) > -1)) {
            errmessage = 'replace function error: \n';
            errmessage += 'Second argument and third argument could be the same ';
            errmessage += 'or third argument contains second argument.\n';
            errmessage += 'This will create an infinite loop as it\'s replaced globally.';
            alert(errmessage);
            return false;
        }
        while (argvalue.indexOf(x) != -1) {
            var leading = argvalue.substring(0, argvalue.indexOf(x));
            var trailing = argvalue.substring(argvalue.indexOf(x) + x.length,
			argvalue.length);
            argvalue = leading + y + trailing;
        }
    }
    return argvalue;
}
//-----------------------------------------------------------------------------
function GetPosition(obj, leftOrTop) {
    var topValue = 0;
    var leftValue = 0;
    while (obj) {
        leftValue += obj.offsetLeft;
        topValue += obj.offsetTop;
        obj = obj.offsetParent;
    }
    if (leftOrTop == 'L') {
        return leftValue;
    } else {
        return topValue;
    }
}

//-----------------------------------------------------------------------------
function GetViewPortSize(widthOrHeight) {
	var viewportWidth;
	var viewportHeight;
	
	// the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
	if (typeof window.innerWidth != 'undefined') {
		viewportWidth = window.innerWidth,
		viewportHeight = window.innerHeight
	}
	
	// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
	else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) {
		viewportWidth = document.documentElement.clientWidth,
		viewportHeight = document.documentElement.clientHeight
	}
	// older versions of IE
	else {
		viewportWidth = document.getElementsByTagName('body')[0].clientWidth,
		viewportHeight = document.getElementsByTagName('body')[0].clientHeight
	}

	if (widthOrHeight == 'W') {
	    return viewportWidth;
	} else {
	    return viewportHeight;
	}
}

function getDocHeight() {
    var D = document;
    return Math.max(
        Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
        Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
        Math.max(D.body.clientHeight, D.documentElement.clientHeight)
    );
}




//-----------------------------------------------------------------------------
// Ratings Gadgets - Show Information Window
//-----------------------------------------------------------------------------
function showGadgetInfoWindow(rtype, basehref) {
	currentImg = getObj('gadgetInfoArrow_' + rtype).src;
	if (currentImg.indexOf('_dn') != -1) {
		getObj('gadgetInfoWindow_' + rtype).style.display = 'block';
		getObj('gadgetInfoArrow_' + rtype).src = Replace(currentImg,'_dn','_up');
		var ButtonPosLeft = GetPosition(getObj('gadgetInfoArrow_' + rtype), 'L');
		var ButtonPosHeight = GetPosition(getObj('gadgetInfoArrow_' + rtype), 'T');
		var ViewPortHeight = $(document).height();
		var ViewPortWidth = $(document).width();
		
		//alert('Button Height = ' + ButtonPos);
		//alert('Viewport Height = ' + ViewPortHeight);
		//alert('User Scrolled = ' + document.documentElement.scrollTop);
		//alert('Doc Height = ' + docHeight);
		//alert(ViewPortHeight + document.documentElement.scrollTop-350);
		
		if ((ButtonPosLeft + 350) > ViewPortWidth) {
			getObj('gadgetInfoWindow_' + rtype).style.left = (ButtonPosLeft - 350) + 'px';
		}
		
		
		if (ButtonPosHeight > ((ViewPortHeight + document.documentElement.scrollTop)-300)) {
			getObj('gadgetInfoWindow_' + rtype).style.top = (ButtonPosHeight - 350) + 'px';
		} else {
			getObj('gadgetInfoWindow_' + rtype).style.top = (ButtonPosHeight + 18) + 'px';
		}
	    
	} else {
		getObj('gadgetInfoWindow_' + rtype).style.display = 'none';
		getObj('gadgetInfoArrow_' + rtype).src = Replace(currentImg,'_up','_dn');
	}
    
}

//-----------------------------------------------------------------------------
// Ratings Gadgets - Move from one review to next
//-----------------------------------------------------------------------------
function ChangeReview(nextprev, rtype, numreviews, currentReview) {
	if (numreviews > 10) {
			numreviews = 10
	}
	if (nextprev == 'N') {
		if (currentReview < numreviews) {
			nextreview = parseInt(currentReview + 1);
		} else {
			nextreview = 1;
		}
		getObj('Review_' + rtype + '|' + currentReview).style.display = 'none';
		getObj('Review_' + rtype + '|' + nextreview).style.display = 'block';
		getObj('NextReviewLink_' + rtype).href = 'javascript:ChangeReview(\'N\',' + rtype + ',' + numreviews + ',' + nextreview + ')';
		getObj('PrevReviewLink_' + rtype).href = 'javascript:ChangeReview(\'P\',' + rtype + ',' + numreviews + ',' + nextreview + ')';
	} else {
		if (currentReview > 1) {
			prevreview = parseInt(currentReview - 1);
		} else {
			prevreview = numreviews;
		}
		getObj('Review_' + rtype + '|' + currentReview).style.display = 'none';
		getObj('Review_' + rtype + '|' + prevreview).style.display = 'block';
		getObj('PrevReviewLink_' + rtype).href = 'javascript:ChangeReview(\'P\',' + rtype + ',' + numreviews + ',' + prevreview + ')';
		getObj('NextReviewLink_' + rtype).href = 'javascript:ChangeReview(\'N\',' + rtype + ',' + numreviews + ',' + prevreview + ')';
	}
}



//-----------------------------------------------------------------------------
// Reviews Gadget - Click on more arrow
//-----------------------------------------------------------------------------
function showRev(id) {
	var divs = document.getElementsByTagName('div');
	var len = divs.length;
	for (var i = 0; i < len; i++) {
		d_id = divs[i].id;
		if (d_id.indexOf('FullReview_') != -1) {
			divs[i].style.display = 'none';
		}
		if (d_id.indexOf('SnipReview_') != -1) {
			divs[i].style.display = 'block';
		}
	}
	objFullReview = document.getElementById('FullReview_' + id);
	objSnipReview = document.getElementById('SnipReview_' + id);
	
	objFullReview.style.display = 'block';
	objSnipReview.style.display = 'none';
}



//-----------------------------------------------------------------------------
// CITY KEY MAP WIDGET
//-----------------------------------------------------------------------------
var objGMap = null;
function ShowCategories()
{
    if (getObj('cats').style.display == '')
    {
        // Display the category menu
	    getObj('cats').style.display = 'block';
	    // Hide the location menu
	    getObj('locs').style.display = '';
	}
	else
	{
	    // Hide the category menu
	    getObj('cats').style.display = '';
	    // Hide the location menu
	    getObj('locs').style.display = '';
	}
}

//-----------------------------------------------------------------------------
function ShowLocations()
{
    if (getObj('locs').style.display == '')
    {
        // Display the location menu
	    getObj('locs').style.display = 'block';
	    // Hide the category menu
	    getObj('cats').style.display = '';
	}
	else
	{
	    // Hide the location menu
	    getObj('locs').style.display = '';
	    // Hide the category menu
	    getObj('cats').style.display = '';
	}
}

//-----------------------------------------------------------------------------
function LoadMap()
{
	var catMap = getObj('catMap');
	if (catMap != null && arrMapData != null) {
	    var navigationControlOptions = { style: google.maps.NavigationControlStyle.ZOOM_PAN };

	    var centreLatLong = new google.maps.LatLng(51.45497, -2.59157);
	    
	    var myOptions = {
	        zoom: 10,
	        center: centreLatLong,
	        scrollwheel: false,
	        mapTypeId: google.maps.MapTypeId.ROADMAP,
	        navigationControlOptions: navigationControlOptions
	    };
	    
	    objGMap = new google.maps.Map(catMap, myOptions);

	    if (arrMapData.length > 0) {
	        var bounds = new google.maps.LatLngBounds();
	        var infoWindowOptions = { map: objGMap };
	        var infoWindow = new google.maps.InfoWindow(infoWindowOptions);
	        
	        for (var i = 0; i < arrMapData.length; i++) {
	            poundsPos = arrMapData[i].indexOf('££');
	            dollarPos = arrMapData[i].indexOf('$$');

	            var lat = arrMapData[i].substr(0, poundsPos);
	            var lon = arrMapData[i].substr(poundsPos + 2, ((dollarPos - poundsPos) - 2));
	            var info = arrMapData[i].substr(dollarPos + 2);
	            
	            var decodedLat = LatLongDecode(lat);
	            var decodedLon = LatLongDecode(lon);

	            if (decodedLat != 0 && decodedLon != 0) {
	                var letter = String.fromCharCode('A'.charCodeAt(0) + i);

	                var letterIcon = new google.maps.MarkerImage('/fx/mapmarkers/blue_Marker' + letter + '.png',
	                    // This marker is 20 pixels wide by 32 pixels tall.
                        new google.maps.Size(20, 34),
	                    // The origin for this image is 0,0.
                        new google.maps.Point(0, 0),
	                    // The anchor for this image is the base of the baloon at (0, 25).
                        new google.maps.Point(0, 25));

	                var point = new google.maps.LatLng(decodedLat, decodedLon);

	                var marker = AddMarker(objGMap, infoWindow, info, point, letterIcon, i);

	                bounds.extend(point);
	            }
	        }

	        objGMap.setCenter(bounds.getCenter());

	        // Make the info window close when clicking anywhere on the map.
	        google.maps.event.addListener(objGMap, 'click', function() {
	            infoWindow.close();
	        });
	    } else {		
			objGMap.setZoom(11);
		}
	}
}

//-----------------------------------------------------------------------------
function AddMarker(objGMap, infoWindow, info, latLng, icon, index) {
    var markerOptions = { map: objGMap, position: latLng, icon: icon, title: 'more info...', zIndex: -index };
    var marker = new google.maps.Marker(markerOptions);

    // Handle the click on an icon to bring up the info window
    google.maps.event.addListener(marker, 'click', function() {
        infoWindow.setContent(info);
        infoWindow.open(objGMap, marker);
    });
}

//-----------------------------------------------------------------------------
function LatLongDecode(fLatOrLon)
{
	var strLatOrLon = fLatOrLon.toString();
	var fDecoded = 0;
	if (strLatOrLon.length != 0)
	{
		var strDecoded = '';
		var strLen = 0;
		strLen = strLatOrLon.length;
		
		var thisChar = '';
		for (var x = 0; x < strLen; x++)
		{
			thisChar = strLatOrLon.charAt(x);
			switch (thisChar)
			{
				case '0':
					thisChar = '6';
					break;
				case '1':
					thisChar = '4';
					break;
				case '2':
					thisChar = '5';
					break;
				case '3':
					thisChar = '9';
					break;
				case '4':
					thisChar = '7';
					break;
				case '5':
					thisChar = '8';
					break;
				case '6':
					thisChar = '0';
					break;
				case '7':
					thisChar = '2';
					break;
				case '8':
					thisChar = '3';
					break;
				case '9':
					thisChar = '1';
					break;
				default:
					thisChar = thisChar;
					break;
			}
			
			strDecoded += thisChar;
		}
		fDecoded = new Number(strDecoded);
	}
	
	return fDecoded;
}

//-----------------------------------------------------------------------------
function ReloadMap(catId, town, width, height, logo)
{
    // Hide the menus
    getObj('locs').style.display = '';
    getObj('cats').style.display = '';
 
    // Show loading
    if (objGMap != null) {
        var loadingImage = new google.maps.MarkerImage('/fx/fi_loading.gif',
            new google.maps.Size(100, 100),
            new google.maps.Point(0, 0),
            new google.maps.Point(50, -50),
            new google.maps.Size(100, 100));

        var centreLatLng = objGMap.getCenter();
        var markerOptions = { map: objGMap, position: centreLatLng, icon: loadingImage, title: 'Loading', zIndex: 100 };
        var marker = new google.maps.Marker(markerOptions);
    }
    
    // Reload data
    var url = 'createcitykey.asp?catid=' + catId + '&city=' + town + '&w=' + width + '&h=' + height + '&logo=' + logo;
    location.href = url;
}
