Insider's Guide to Beijing 2008
This is the Beijing guidebook other Beijing guidebooks wish they could be. We tell you what's happening right here, right now, all over Beijing, because ... we live here. So do our 40 specialist contributors. With this book, you'll learn which songs will melt hearts in a Beijing karaoke bar, who has the best deal on antique furniture, how to take your landlord to court, and what Mandarin language program is for you. Along with all this wisdom goes the wit that has become the trademark of the Insider's Guide to Beijing over the years.

Fully updated for the countdown to the 2008 Olympics, crammed with listings of hundreds of shops, bars and restaurants, lavishly illustrated with more than 750 full color photos by the capital city's best photographers, the Insider's Guide to Beijing is indispensable for residents and tourists alike.
This edition also comes packaged with an up-to-date, fully bilingual pullout map of Beijing and its Olympic venues, printed on waterproof, tear-resistant paper stock.
Stop looking for the key to the city.
You are holding it in your hand.
Insider's Guide to Beijing 2008
type="text/javascript">
function registerNamespace(ns)
{
var parts = ns.split(".");
var root = window;
for(var i = 0; i < parts.length; i++)
{
if(!root[parts[i]])
{
root[parts[i]] = new Object();
}
root = root[parts[i]];
}
}
registerNamespace('Associates.Util');
Associates.Util.getElementsByTagAndClass = function(tag, class_name, parent_element)
{
if(!parent_element){ parent_element = document; }
var tags = parent_element.getElementsByTagName(tag);
var class_tags = new Array();
var class_regex = new RegExp("\\b" + class_name + "\\b");
for (var i = 0; i < tags.length; i++)
{
if(tags[i].className.match(class_regex))
{
class_tags.push(tags[i]);
}
}
return class_tags;
}
Associates.Util.findAncestor = function(child, test)
{
var test_func;
if(typeof test == 'object')
{
test_func = function(obj){ return obj == test };
}
else if (typeof test == 'string')
{
test_func = function(obj){ return obj.nodeName == test };
}
else
{
test_func = test;
}
while(child && !test_func(child))
{
child = child.parentNode;
}
return child;
}
function AttachEventListener(object, event, handler, useCapture)
{
if( !useCapture )
{
useCapture = false;
}
if( object.addEventListener )
{
object.addEventListener(event, handler, useCapture);
}
else
{
object.attachEvent('on' + event, handler);
}
}
registerNamespace('Assoc.DOMEvent');
Assoc.DOMEvent.AddHandler = function(object, event, handler, context)
{
var event_handler;
if(context)
event_handler = function(event){ handler.call(context, event) };
else
event_handler = handler;
AttachEventListener(object, event, event_handler);
}
function GetEventTarget(event)
{
return (event.target)? event.target : event.srcElement;
}
//borrowed from quirksmode. Stops event bubbling.
function StopEventPropagation(event)
{
if(!event) { event = window.event; }
//MSIE
event.cancelBubble = true;
//w3c
if(event.stopPropagation) { event.stopPropagation(); }
}
function StopEventDefault(event)
{
if(!event) { event = window.event; }
//MSIE
event.returnValue = false;
//w3c
if(event.preventDefault) { event.preventDefault() };
}
//does both StopEventPropogation and StopEventDefault
function StopEvent(event)
{
StopEventDefault(event);
StopEventPropagation(event);
}
function mouseOverFromElement(event)
{
return (event.relatedTarget)? event.relatedTarget : event.fromTarget;
}
function mouseOutToElement(event)
{
return (event.relatedTarget)? event.relatedTarget : event.toTarget;
}
var wImages;
var link = document.getElementById('imageViewerLink');
function openImageViewer(event)
{
if (wImages == null || wImages.closed)
{
wImages = window.open(link.rel="nofollow" href, 'ImageView',
'width=625,height=700,scrollbars,resizable');
}
else
{
wImages.location = link.rel="nofollow" href;
}
wImages.focus();
return false;
}
AttachEventListener(link, 'click', openImageViewer);