var LinkHandler_subtype = LinkHandler.extend({ externalTargetDefault: "_blank", internalTargetDefault: "_blank", ebookTargetDefault: "_self", // If an href points directly to an image file in the asset/ directory // then it will pop by default. Change this to "_blank" in order to have // it open in a new blank window instead imageTargetDefault: "_pop", // Set this to "on" if you want all internal image links to open // using supp_win.html (which will allow you to set the width) // NOTE: this is turned on with the global cfg_displayImagesInSuppHtml setting displayImagesInSuppHtml: "off", // If your altsrc points to an image and you want it to automatically open the // corresponding html file instead (same file path/name as the image except // extension ends in .html) set this to "on" autoHtml: "off", // target="_pop" /* The href can be: - filename of ebook page (OK, no changes needed) - path to file in asset/ directory (OK, no changes needed) - fully qualified URL to resource outside of ebook (OK, no changes needed) - ID to an element in the ebook (NOT OK, need to find filename) */ fn_pop: function(target, $jqLinkObj, event) { safe_log("fn_pop"); if (event !== undefined) { event.stopImmediatePropagation(); } var href = this.getHref($jqLinkObj); if (href === undefined) { return false; } // Links to other pages in the book need to be opened in the // special page navigator supp window if (xBookUtils.ebookPage(href)) { // If we are already in the supp win nav page then we can just // bring up the next page directly if (xBookUtils.inSuppWinNavPage()) { href = xBookUtils.getBaseUrl() + href; window.location.href = href; return false; } else { xBookUtils.openPageSuppWin({page: href}); return false; } } // special processing for internal links (file in asset/) if (!xBookUtils.externalUrl(href)) { // special cases for images if (/\.(jpg|gif|png|tiff)$/.test(href)) { // do we autoconvert image file name to html file name? if (this.autoHtml === "on") { href = href.replace(/\.(jpg|gif|png|tiff)$/, ".html"); } // or do we use supp_win.html to display image? else if (this.displayImagesInSuppHtml === "on") { var width = $jqLinkObj.data('htmlwidth'); if (!xBookUtils.emptyValue(width) && /^\d+$/.test(width)) { width = "&imgwidth=" + width; } else { width = ""; } href = "asset/supp_win.html?bookid=" + xBookUtils.getBookId() + "&image=" + href + width + "&baseurl=" + xBookUtils.getBaseUrl(); } } // end special image case href = xBookUtils.getBaseUrl() + href; } xBookUtils.openSuppWin({url: href}); return false; }, // end fn_pop // target="_blank" fn_blank: function(target, $jqLinkObj, event) { safe_log("fn_blank"); if (event !== undefined) { event.stopImmediatePropagation(); } var href = this.getHref($jqLinkObj); if (href === undefined) { return false; } // special processing for internal links (file in asset/) if (!xBookUtils.externalUrl(href)) { // special cases for images if (/\.(jpg|gif|png|tiff)$/.test(href)) { // do we autoconvert image file name to html file name? if (this.autoHtml === "on") { href = href.replace(/\.(jpg|gif|png|tiff)$/, ".html"); } // or do we use supp_win.html to display image? else if (this.displayImagesInSuppHtml === "on") { var width = $jqLinkObj.data('htmlwidth'); if (!xBookUtils.emptyValue(width) && /^\d+$/.test(width)) { width = "&imgwidth=" + width; } else { width = ""; } href = "asset/supp_win.html?bookid=" + xBookUtils.getBookId() + "&image=" + href + width + "&baseurl=" + xBookUtils.getBaseUrl(); } } // end special image case href = xBookUtils.getBaseUrl() + href; } if (xBookUtils.inMainContentFrame()) { window.open(href, "_blank"); return false; } else { if (window.opener) { window.opener.open(href, "_blank"); return false; } else { window.open(href, "_blank"); return false; } } }, // end fn_blank /* target="_self" This is complicated because how we open this link will depend on which platform we are viewing the page from. */ fn_self: function(target, $jqLinkObj, event) { safe_log("fn_self"); if (event !== undefined) { event.stopImmediatePropagation(); } var href = this.getHref($jqLinkObj); if (href === undefined) { return false; } // The only links that should be calling this function are ebook pages if (!xBookUtils.ebookPage(href)) { safe_log("LinkHandler: non ebook page link attempting target=_self"); return false; } // If we are not in PX then this is easy if (!xBookUtils.inPX()) { if (xBookUtils.inMainContentFrame()) { safe_log("in Main Content Frame"); safe_log("opening " + href); window.open(href, "_self"); return false; } else { safe_log("in supp win"); if (window.top.opener) { window.top.opener.open(href, "_self"); return false; } else if (window.opener) { window.opener.open(href, "_self"); return false; } } } // We are in PX var PX_id = $jqLinkObj.data('px-id'); if (xBookUtils.emptyValue(PX_id)) { PX_id = this.getPxId(href); } if (PX_id === undefined) { safe_log("fn_self: Can't find PX ID for href " + href); return false; } safe_log("fn_self: found PX ID (" + PX_id + ") for href " + href); if (xBookUtils.inMainContentFrame()) { try { top.PxPage.openContent({id: PX_id}); } catch(err) { safe_log("PxPage.openContent failed: " + err.message); } return false; } // need to figure out how to load a page in the main content window // from a supp window }, // end fn_self FN_HREF_EMPTY: function(target, $jqLinkObj, event) { safe_log("FN_HREF_EMPTY"); if (event !== undefined) { event.stopImmediatePropagation(); } safe_log("LinkHandler: href is empty"); return false; }, // end FN_HREF_EMPTY FN_DEFAULT: function(target, $jqLinkObj, event) { safe_log("FN_DEFAULT"); if (event !== undefined) { event.stopImmediatePropagation(); } var href = this.getHref($jqLinkObj); if (href === undefined) { return false; } // special processing for internal links (file in asset/) if (!xBookUtils.externalUrl(href)) { // special cases for images if (/\.(jpg|gif|png|tiff)$/.test(href)) { // do we autoconvert image file name to html file name? if (this.autoHtml === "on") { href = href.replace(/\.(jpg|gif|png|tiff)$/, ".html"); } // or do we use supp_win.html to display image? else if (this.displayImagesInSuppHtml === "on") { var width = $jqLinkObj.data('htmlwidth'); if (!xBookUtils.emptyValue(width) && /^\d+$/.test(width)) { width = "&imgwidth=" + width; } else { width = ""; } href = "asset/supp_win.html?bookid=" + xBookUtils.getBookId() + "&image=" + href + width + "&baseurl=" + xBookUtils.getBaseUrl(); } } // end special image case href = xBookUtils.getBaseUrl() + href; } if (xBookUtils.inMainContentFrame()) { window.open(href, target); return false; } else { window.opener.open(href, target); return false; } }, // end FN_DEFAULT getHref: function($jqLinkObj) { var href = $jqLinkObj.attr('href'); if (/^#/.test(href)) { var href_id = href.replace(/#/, ""); var html_file = xBookUtils.IDlinks[href_id]; if (!xBookUtils.emptyValue(html_file)) { return xBookUtils.getBookId() + "_" + html_file + ".html"; } html_file = $jqLinkObj.data('html-file'); if (!xBookUtils.emptyValue(html_file)) { return html_file; } safe_log("getHref: Can't find html file for ID " + href); return undefined; } return href; }, getPxId: function(href) { var href_key; if (/^[a-z\d]+_\d+$/.test(href)) { href_key = href; } else { var match = href.match(/([a-z\d]+_\d+)\.html$/); if (match === null) { safe_log("getPxId: bad href " + href); return undefined; } href_key = match[1]; } var px_id = xBookUtils.HTMLlinks[href_key]; if (!xBookUtils.emptyValue(px_id)) { return px_id; } safe_log("getPxId: Can't find PX ID for href " + href); return undefined; }, init: function() { // configurable variables this.externalTargetDefault = player.cfg_LH_externalTargetDefault || this.externalTargetDefault; this.internalTargetDefault = player.cfg_LH_internalTargetDefault || this.internalTargetDefault; this.ebookTargetDefault = player.cfg_LH_ebookTargetDefault || this.ebookTargetDefault; this.imageTargetDefault = player.cfg_LH_imageTargetDefault || this.imageTargetDefault; this.displayImagesInSuppHtml = player.cfg_displayImagesInSuppHtml || this.displayImagesInSuppHtml; this.autoHtml = player.cfg_LH_autoHtml || this.autoHtml; // save off current object context for use in handler below var that = this; $("#manuscript").delegate('a', 'click', function(event) { var $clickedLink = $(this); var linkHref = $.trim($clickedLink.attr('href')); var linkTarget = $.trim($clickedLink.attr('target')); // If link is disabled do nothing if (linkTarget === "_disable" || linkTarget === "_disabled") { if (event !== undefined) { event.stopImmediatePropagation(); } return false; } // If href attribute is empty then send link to special empty // handler if it exists, otherwise do nothing if (xBookUtils.emptyValue(linkHref)) { if (typeof that["FN_HREF_EMPTY"] === 'function') { return that["FN_HREF_EMPTY"]($clickedLink, event); } if (event !== undefined) { event.stopImmediatePropagation(); } safe_log("LinkHandler: href is empty"); return false; } // Check for local anchor (href will start with # and the ID it points // to will be an element on the page) if (/^#/.test(linkHref)) { var anchor_elem = document.getElementById(linkHref.replace(/#/, "")); if (anchor_elem !== null) { if (event !== undefined) { event.stopImmediatePropagation(); } anchor_elem.scrollIntoView(); return false; } } // We should not be doing this any more but just in case someone // is still embedding javascript functions in links we better // check for it var pattern = /^javascript:/i; if (pattern.test(linkHref)) { return true; } var set_by_xrefs = $.trim($clickedLink.data('xrefs-target')); // set target if none exists or target was set by XRefs if (xBookUtils.emptyValue(linkTarget) || (set_by_xrefs === "1")) { // link to image if (!xBookUtils.externalUrl(linkHref) && /asset\/[\w\/\-\.]+\.(jpg|gif|png|tiff)$/.test(linkHref)) { if (!xBookUtils.emptyValue(that.imageTargetDefault)) { linkTarget = that.imageTargetDefault; } else { linkTarget = "_pop"; } } // link to ebook page else if (xBookUtils.ebookPage(linkHref)) { if (!xBookUtils.emptyValue(that.ebookTargetDefault)) { linkTarget = that.ebookTargetDefault; } else { linkTarget = "_self"; } } // link to external resource else if (xBookUtils.externalUrl(linkHref)) { if (!xBookUtils.emptyValue(that.externalDefault)) { linkTarget = that.externalTargetDefault; } else { linkTarget = "_blank"; } } // link to internal resource else { if (!xBookUtils.emptyValue(that.internalDefault)) { linkTarget = that.internalTargetDefault; } else { linkTarget = "_blank"; } } } // We need to enforce one strict rule: if the link is NOT to an // ebook page then it should NOT have target="_self" if (linkTarget === "_self" && !xBookUtils.ebookPage(linkHref)) { linkTarget = "_blank"; } safe_log("linkTarget: " + linkTarget); // name of the function to call to handle link var fn_name = "fn" + linkTarget; // If function is defined then call it if (typeof that[fn_name] === 'function') { return that[fn_name](linkTarget, $clickedLink, event); } else if (typeof that["FN_DEFAULT"] === 'function') { return that["FN_DEFAULT"](linkTarget, $clickedLink, event); } // Otherwise let browser handle it else { $clickedLink.attr('href', linkHref); return true; } }); // end delegate } // end init }); // end LinkHandler_subtype var Activity_subtype = Activity_manuscript_type.extend({ initialize: function() { this._super(); } }); var Player_subtype = Player_manuscript_type.extend({ // Chitra, uncomment the following two lines after you have your figure supp files uploaded cfg_Figures_autoHtml: "on", cfg_LH_autoHtml: "on", // Holds the 'anchor_id' passed in via the query string anchorId: undefined, /* brb: 20131218 - Commenting this out for now because it was breaking auto scrolling for the in-page nav menu. Also, I don't think it is needed because apparently there are no b-head links in the LC activities which I believe was the reason we had it in here in the first place. show_section_animate: function(section_to_show, force) { // no call to _super() as we need to override this method completely //safe_log("show_section_animate:" + section_to_show); // parent function includes direction as param; we just define it here // and include the "force" parameter var direction; if (section_to_show == this.section_currently_showing && force != "force") { return; } else if (section_to_show < this.section_currently_showing) { direction = "left"; } else { direction = "right"; } // make sure modal window is closed -- not needed unless we bring toc_dialog back $("#toc_dialog").dialog("close"); // if we're not already showing all sections... if (this.last_section_showing < this.sections.length - 1 || this.sections.length == 1) { // if we're showing a later section, make sure that // all sections between the current and the new section are showing var i = this.section_currently_showing; if (i == null) { i = 0; } if (section_to_show >= i) { for (; i <= section_to_show; ++i) { if (i < section_to_show) { this.sections[i].jq.addClass("singlepage"); } this.sections[i].jq.show(); $(".rightnav_page").filter("[section_index=" + i + "]").html(player.rightnav_page_off_showing_html); } } } // update last_section_showing if necessary if (this.last_section_showing < section_to_show) { this.last_section_showing = section_to_show; } // scroll to the top of the section we're jumping to var scroll_top = Math.round(this.sections[section_to_show].jq.offset().top) - 20; //safe_log("scroll_top: " + scroll_top); // have to do this after a delay, in case the PX code is resizing the window //setTimeout("player.scrolling_window_jq.scrollTop(" + scroll_top + ")", 100); // brb: Setting a single timer doesn't always work unless you set the timeout // much higher and then you'll have a lag in scrolling. // The following uses the height of the document-body-iframe to determine // when we can actually scroll (if the height of document-body-iframe is // larger than where we want to scroll to then we can scroll there). var $parentIFrame = $(); // iframe that wraps the ebook page (function() { var $iframes = $("iframe", window.parent.document); $iframes.each(function(index, element) { $this = $(element); try { var $child = $this.contents().find("html"); if ($child.hasClass("show-sec-animate")) { $parentIFrame = $this; return false; } } catch (err) { // do nothing } }); })(); var $scrollingWindow; // = this.scrolling_window_jq; // If the parent has an id of 'content' then we are in the LC viewer // and the iframe does the scrolling as usual so we want to set // both the scrollingWindow and parentIframe to . if ($parentIFrame.attr('id') == "content") { //safe_log("setting scrollwindow to html"); $scrollingWindow = $("html"); $parentIFrame = $scrollingWindow; } // This is the div that does the scrolling in PX else if (xBookUtils.inPXFrame()) { $scrollingWindow = this.scrolling_window_jq; } // DF else { $scrollingWindow = $("html"); $parentIFrame = $scrollingWindow; } // Now attempt to scroll to the section by checking to make sure the // page is tall enough to scroll there. Keep trying until the page // is long enough or we run out of tries. if (($parentIFrame.length > 0) && ($scrollingWindow.length > 0)) { //safe_log("scrolling page, parentIFrame height: " + $parentIFrame.height() + ", scrollwindow class = " + $scrollingWindow.attr('class')); var numIntervalTries = 50; var scrollTo = scroll_top; var timerID = setInterval(function(){ numIntervalTries--; //safe_log("scroll interval: " + numIntervalTries); // If the height of parentIFrame is larger than where we // want to scroll to then we are safe to scroll there if (scrollTo < $parentIFrame.height()) { $scrollingWindow.scrollTop(scrollTo); clearInterval(timerID); } // Safety shutoff valve to make sure we don't get stuck in an // infinite loop else if (numIntervalTries < 1) { // One last try safe_log("last setInterval for scrolling"); $scrollingWindow.scrollTop(scrollTo); clearInterval(timerID); } },100); } this.section_currently_showing = section_to_show; // update right nav this.update_right_nav(); // if this is the last section, change the readon button to go to the next item if (this.section_currently_showing == (this.sections.length - 1)) { this.switch_readon_button_to_next_unit_item(); } player.update_last_viewed_section(); }, */ initialize_sections: function() { this._super(); // anything that needs to be done before the page displays // should be done here. //"Worked Examples: " is being stripped out of the
tag immediately before the figure div $fig.before("
" + img_title + "
"); } var width = $fig.data('layout-width') + "x"; var match = width.match(/(\d+)/); if (match !== null) { $fig.attr('style',"width:" + match[1] + "px"); var $img = $fig.children("img"); $img.attr('style',"width:" + match[1] + "px"); } }); $("[data-type='table']").each(function(index,element) { var $this = $(this); if ($this.find("figure").length < 1 && ($this.find("[data-type='table_caption']").length > 0)) { $this.addClass("show_table_text"); } if ($this.find("[data-type='table_caption']").length > 0){ var $table_caption = $this.find("[data-type='table_caption']"); // safe_log($table_caption.html()); var table_caption_text = $table_caption.html(); table_caption_text = table_caption_text.replace(/(TABLE) (\d+-\d+) (.*)/, "$1 $2 $3"); // add header astag immediately before the table div otherwise the caption shows up after the table $this.before("
" + table_caption_text + "
"); //$table_caption.html(table_caption_text); } }); }, initialize: function() { var anchor = xBookUtils.getURLParameter('anchor_id'); if (anchor !== undefined) { //safe_log("found anchor_id: " + anchor); this.anchorId = anchor; } this._super(); this.xrefs = new XRefs_manuscript_subtype(); //this.glossary = new Glossary_manuscript_subtype(); this.figures = new Figures_manuscript_subtype(); }, initialize2: function() { this._super(); // Check if we need to scroll to the anchorId // First, add a special class onto the html tag (to be used // by show_section_animate for scrolling) if (this.anchorId !== undefined) { $("html").addClass("show-sec-animate"); var secNumToShow = xBookUtils.getSectionNumForId(this.anchorId); //safe_log("secNumToShow: " + secNumToShow); if (secNumToShow !== undefined) { //safe_log("scrolling to section " + secNumToShow); this.show_section_animate(secNumToShow, null); } } // anything that you can do after the page displays // should be done here. var link_handler = new LinkHandler_subtype(); $("[data-block_type='show_answer_button'] p").click(function(event) { $this = $(this); $this.parent("[data-block_type='show_answer_button']").toggleClass('displayed'); }); } }); player = new Player_subtype(); // link information xBookUtils.IDlinks = {}; xBookUtils.HTMLlinks = {}; $.extend(xBookUtils.HTMLlinks, { "ch1_1": "krugmanwellsgraddyessentials3_1_0", "ch1_2": "krugmanwellsgraddyessentials3_1_1", "ch1_3": "krugmanwellsgraddyessentials3_1_2", "ch1_4": "krugmanwellsgraddyessentials3_1_3", "ch1_5": "krugmanwellsgraddyessentials3_1_4", "ch1_6": "krugmanwellsgraddyessentials3_1_5", "ch1_7": "krugmanwellsgraddyessentials3_1_6", "ch1_8": "krugmanwellsgraddyessentials3_1_7", "ch2_1": "krugmanwellsgraddyessentials3_2_0", "ch2_2": "krugmanwellsgraddyessentials3_2_1", "ch2_3": "krugmanwellsgraddyessentials3_2_2", "ch2_4": "krugmanwellsgraddyessentials3_2_3", "ch2_5": "krugmanwellsgraddyessentials3_2_4", "ch2_6": "krugmanwellsgraddyessentials3_2_5", "ch2_7": "krugmanwellsgraddyessentials3_2_6", "ch3_1": "krugmanwellsgraddyessentials3_3_0", "ch3_4": "krugmanwellsgraddyessentials3_3_3", "ch3_5": "krugmanwellsgraddyessentials3_3_4", "ch3_10": "krugmanwellsgraddyessentials3_3_9", "ch3_11": "krugmanwellsgraddyessentials3_3_10", "ch4_1": "krugmanwellsgraddyessentials3_4_0", "ch4_2": "krugmanwellsgraddyessentials3_4_1", "ch4_3": "krugmanwellsgraddyessentials3_4_2", "ch4_4": "krugmanwellsgraddyessentials3_4_3", "ch4_5": "krugmanwellsgraddyessentials3_4_4", "ch4_6": "krugmanwellsgraddyessentials3_4_5", "ch4_7": "krugmanwellsgraddyessentials3_4_6", "ch4_8": "krugmanwellsgraddyessentials3_4_7", "ch4_9": "krugmanwellsgraddyessentials3_4_8", "ch4_10": "krugmanwellsgraddyessentials3_4_9", "ch4_11": "krugmanwellsgraddyessentials3_4_10", "ch4_12": "krugmanwellsgraddyessentials3_4_11", "ch5_1": "krugmanwellsgraddyessentials3_5_0", "ch5_2": "krugmanwellsgraddyessentials3_5_1", "ch5_3": "krugmanwellsgraddyessentials3_5_2", "ch5_4": "krugmanwellsgraddyessentials3_5_3", "ch5_5": "krugmanwellsgraddyessentials3_5_4", "ch5_6": "krugmanwellsgraddyessentials3_5_5", "ch5_7": "krugmanwellsgraddyessentials3_5_6", "ch5_8": "krugmanwellsgraddyessentials3_5_7", "ch5_9": "krugmanwellsgraddyessentials3_5_8", "ch5_10": "krugmanwellsgraddyessentials3_5_9", "ch5_11": "krugmanwellsgraddyessentials3_5_10", "ch5_12": "krugmanwellsgraddyessentials3_5_11", "ch6_1": "krugmanwellsgraddyessentials3_6_0", "ch6_2": "krugmanwellsgraddyessentials3_6_1", "ch6_3": "krugmanwellsgraddyessentials3_6_2", "ch6_4": "krugmanwellsgraddyessentials3_6_3", "ch6_5": "krugmanwellsgraddyessentials3_6_4", "ch6_6": "krugmanwellsgraddyessentials3_6_5", "ch6_7": "krugmanwellsgraddyessentials3_6_6", "ch6_8": "krugmanwellsgraddyessentials3_6_7", "ch7_1": "krugmanwellsgraddyessentials3_7_0", "ch7_2": "krugmanwellsgraddyessentials3_7_1", "ch7_3": "krugmanwellsgraddyessentials3_7_2", "ch7_4": "krugmanwellsgraddyessentials3_7_3", "ch7_5": "krugmanwellsgraddyessentials3_7_4", "ch7_6": "krugmanwellsgraddyessentials3_7_5", "ch7_7": "krugmanwellsgraddyessentials3_7_6", "ch7_8": "krugmanwellsgraddyessentials3_7_7", "ch7_9": "krugmanwellsgraddyessentials3_7_8", "ch8_1": "krugmanwellsgraddyessentials3_8_0", "ch8_2": "krugmanwellsgraddyessentials3_8_1", "ch8_3": "krugmanwellsgraddyessentials3_8_2", "ch8_4": "krugmanwellsgraddyessentials3_8_3", "ch8_5": "krugmanwellsgraddyessentials3_8_4", "ch8_6": "krugmanwellsgraddyessentials3_8_5", "ch8_7": "krugmanwellsgraddyessentials3_8_6", "ch8_8": "krugmanwellsgraddyessentials3_8_7", "ch8_9": "krugmanwellsgraddyessentials3_8_8", "ch8_10": "krugmanwellsgraddyessentials3_8_9", "ch9_1": "krugmanwellsgraddyessentials3_9_0", "ch9_2": "krugmanwellsgraddyessentials3_9_1", "ch9_3": "krugmanwellsgraddyessentials3_9_2", "ch9_4": "krugmanwellsgraddyessentials3_9_3", "ch9_5": "krugmanwellsgraddyessentials3_9_4", "ch9_6": "krugmanwellsgraddyessentials3_9_5", "ch9_7": "krugmanwellsgraddyessentials3_9_6", "ch9_8": "krugmanwellsgraddyessentials3_9_7", "ch9_9": "krugmanwellsgraddyessentials3_9_8", "ch9_10": "krugmanwellsgraddyessentials3_9_9", "ch10_1": "krugmanwellsgraddyessentials3_10_0", "ch10_2": "krugmanwellsgraddyessentials3_10_1", "ch10_3": "krugmanwellsgraddyessentials3_10_2", "ch10_4": "krugmanwellsgraddyessentials3_10_3", "ch10_5": "krugmanwellsgraddyessentials3_10_4", "ch10_6": "krugmanwellsgraddyessentials3_10_5", "ch10_7": "krugmanwellsgraddyessentials3_10_6", "ch10_8": "krugmanwellsgraddyessentials3_10_7", "ch10_9": "krugmanwellsgraddyessentials3_10_8", "ch11_1": "krugmanwellsgraddyessentials3_11_0", "ch11_2": "krugmanwellsgraddyessentials3_11_1", "ch11_3": "krugmanwellsgraddyessentials3_11_2", "ch11_4": "krugmanwellsgraddyessentials3_11_3", "ch11_5": "krugmanwellsgraddyessentials3_11_4", "ch11_6": "krugmanwellsgraddyessentials3_11_5", "ch11_7": "krugmanwellsgraddyessentials3_11_6", "ch11_8": "krugmanwellsgraddyessentials3_11_7", "ch12_1": "krugmanwellsgraddyessentials3_12_0", "ch12_2": "krugmanwellsgraddyessentials3_12_1", "ch12_3": "krugmanwellsgraddyessentials3_12_2", "ch12_4": "krugmanwellsgraddyessentials3_12_3", "ch12_5": "krugmanwellsgraddyessentials3_12_4", "ch12_6": "krugmanwellsgraddyessentials3_12_5", "ch12_7": "krugmanwellsgraddyessentials3_12_6", "ch12_8": "krugmanwellsgraddyessentials3_12_7", "ch12_9": "krugmanwellsgraddyessentials3_12_8", "ch13_1": "krugmanwellsgraddyessentials3_13_0", "ch13_2": "krugmanwellsgraddyessentials3_13_1", "ch13_3": "krugmanwellsgraddyessentials3_13_2", "ch13_4": "krugmanwellsgraddyessentials3_13_3", "ch13_5": "krugmanwellsgraddyessentials3_13_4", "ch13_6": "krugmanwellsgraddyessentials3_13_5", "ch13_7": "krugmanwellsgraddyessentials3_13_6", "ch13_8": "krugmanwellsgraddyessentials3_13_7", "ch13_9": "krugmanwellsgraddyessentials3_13_8", "ch13_10": "krugmanwellsgraddyessentials3_13_9", "ch14_1": "krugmanwellsgraddyessentials3_14_0", "ch14_2": "krugmanwellsgraddyessentials3_14_1", "ch14_3": "krugmanwellsgraddyessentials3_14_2", "ch14_4": "krugmanwellsgraddyessentials3_14_3", "ch14_5": "krugmanwellsgraddyessentials3_14_4", "ch14_6": "krugmanwellsgraddyessentials3_14_5", "ch14_7": "krugmanwellsgraddyessentials3_14_6", "ch14_8": "krugmanwellsgraddyessentials3_14_7", "ch14_9": "krugmanwellsgraddyessentials3_14_8", "ch14_10": "krugmanwellsgraddyessentials3_14_9", "ch15_1": "krugmanwellsgraddyessentials3_15_0", "ch15_2": "krugmanwellsgraddyessentials3_15_1", "ch15_3": "krugmanwellsgraddyessentials3_15_2", "ch15_4": "krugmanwellsgraddyessentials3_15_3", "ch15_5": "krugmanwellsgraddyessentials3_15_4", "ch15_6": "krugmanwellsgraddyessentials3_15_5", "ch15_7": "krugmanwellsgraddyessentials3_15_6", "ch15_8": "krugmanwellsgraddyessentials3_15_7", "ch15_9": "krugmanwellsgraddyessentials3_15_8", "ch16_1": "krugmanwellsgraddyessentials3_16_0", "ch16_2": "krugmanwellsgraddyessentials3_16_1", "ch16_3": "krugmanwellsgraddyessentials3_16_2", "ch16_4": "krugmanwellsgraddyessentials3_16_3", "ch16_5": "krugmanwellsgraddyessentials3_16_4", "ch16_6": "krugmanwellsgraddyessentials3_16_5", "ch16_7": "krugmanwellsgraddyessentials3_16_6", "ch16_8": "krugmanwellsgraddyessentials3_16_7", "ch16_9": "krugmanwellsgraddyessentials3_16_8", "ch16_10": "krugmanwellsgraddyessentials3_16_9", "ch17_1": "krugmanwellsgraddyessentials3_17_0", "ch17_2": "krugmanwellsgraddyessentials3_17_1", "ch17_3": "krugmanwellsgraddyessentials3_17_2", "ch17_4": "krugmanwellsgraddyessentials3_17_3", "ch17_5": "krugmanwellsgraddyessentials3_17_4", "ch17_6": "krugmanwellsgraddyessentials3_17_5", "ch17_7": "krugmanwellsgraddyessentials3_17_6", "ch17_8": "krugmanwellsgraddyessentials3_17_7", "ch17_9": "krugmanwellsgraddyessentials3_17_8", "ch18_1": "krugmanwellsgraddyessentials3_18_0", "ch18_2": "krugmanwellsgraddyessentials3_18_1", "ch18_3": "krugmanwellsgraddyessentials3_18_2", "ch18_4": "krugmanwellsgraddyessentials3_18_3", "ch18_5": "krugmanwellsgraddyessentials3_18_4", "ch18_6": "krugmanwellsgraddyessentials3_18_5", "ch18_7": "krugmanwellsgraddyessentials3_18_6", "ch18_8": "krugmanwellsgraddyessentials3_18_7", "ch18_9": "krugmanwellsgraddyessentials3_18_8", "ch18_10": "krugmanwellsgraddyessentials3_18_9", "ch19_1": "krugmanwellsgraddyessentials3_19_0", "ch19_2": "krugmanwellsgraddyessentials3_19_1", "ch19_3": "krugmanwellsgraddyessentials3_19_2", "ch19_4": "krugmanwellsgraddyessentials3_19_3", "ch19_5": "krugmanwellsgraddyessentials3_19_4", "ch19_6": "krugmanwellsgraddyessentials3_19_5", "ch19_7": "krugmanwellsgraddyessentials3_19_6", "ch19_8": "krugmanwellsgraddyessentials3_19_7", "ch19_9": "krugmanwellsgraddyessentials3_19_8", "ch19_10": "krugmanwellsgraddyessentials3_19_9", "ch19_11": "krugmanwellsgraddyessentials3_19_10" });