{ // Script will bail out after this many milliseconds. var timeout = 2000; var start = new Date(); start = start.getTime(); var redirect = new RegExp("^http://www\\.amazon\\.(com|ca|co\\.jp|de|fr|co\\.uk)/(exec/obidos|o)/redirect", "i"); var asin = new RegExp("^http://www\\.amazon\\.(com|ca|co\\.jp|de|fr|co\\.uk)/(exec/obidos|o)/ASIN\\d?/\\w{10}/(ref=nosim/)?([^/?]+)", "i"); var isbn = new RegExp("^http://www\\.amazon\\.(com|ca|co\\.jp|de|fr|co\\.uk)/(exec/obidos|o)/ISBN=\\w{10}/(ref=nosim/)?([^/?]+)A", "i"); var mp = new RegExp("^http://www\\.amazon\\.(com|ca|co\\.jp|de|fr|co\\.uk)/gp/associates/link-types/marketplace", "i"); var allLinks = document.getElementsByTagName('a'); var imp = {}; var orgUnit = { 'com' : 1, 'ca' : 15, 'co.jp' : 9, 'de' : 3, 'fr' : 8, 'co.uk' : 2 }; var ccmid = { 'as2' : '374929', '-as2' : '9325', 'as3' : '373489', 'am2' : '374925', '-am2' : '9325', 'am3' : '373493' }; var camp = '211189'; var timeoutReached = false; // Do not decorate links in unsupported browsers var amazonTreatment = false; var agent = new String(navigator.userAgent); if (agent.match(/(MSIE.*Windows|Firefox|Netscape|Windows.*Gecko)/)) { // Set treatment cookie if it's not already set if (amazon_getcookie('amazon_vf') == null) { var randy = (Math.random() > 0.5) ? 'on' : 'off'; amazon_setcookie('amazon_vf', randy); } // Read treatment cookie amazonTreatment = (amazon_getcookie('amazon_vf') == 'on') ? true : false; } for (var i=0; i < allLinks.length; i++) { // Check if it's an Amazon redirect link var href = new String(allLinks[i].href); var results; if (results = href.match(redirect)) { var locale = results[1]; // Change link code to impression-tracked version if (href.match(/link_code=asn/)) { var code = ((locale == 'com') && amazonTreatment) ? 'as3' : 'as2'; href = href.replace(/link_code=asn/, 'link_code=' + code); href = href.replace(/creative=\d+/, 'creative=' + ccmid[code]); href = href.replace(/camp=\d+/, 'camp=' + camp); allLinks[i].href = href; var tag = href.match(/tag=([^&]+)/)[1]; imp = amazon_logImpression(imp, locale, tag, code); } else if (href.match(/link_code=asm/)) { var code = ((locale == 'com') && amazonTreatment) ? 'am3' : 'am2'; href = href.replace(/link_code=asm/, 'link_code=' + code); href = href.replace(/creative=\d+/, 'creative=' + ccmid[code]); href = href.replace(/camp=\d+/, 'camp=' + camp); allLinks[i].href = href; var tag = href.match(/tag=([^&]+)/)[1]; imp = amazon_logImpression(imp, locale, tag, code); } else if (href.match(/link_code=ure/)) { href = href.replace(/link_code=ure/, 'link_code=ur2'); allLinks[i].href = href; var tag = href.match(/tag=([^&]+)/)[1]; imp = amazon_logImpression(imp, locale, tag, 'ur2'); } else if (href.match(/link_code=as2/)) { // Existing as2 link var code = 'as2'; if ((locale == 'com') && amazonTreatment) { code = 'as3'; href = href.replace(/link_code=as2/, 'link_code=as3'); } href = href.replace(/creative=\d+/, 'creative=' + ccmid[code]); href = href.replace(/camp=\d+/, 'camp=' + camp); allLinks[i].href = href; var tag = href.match(/tag=([^&]+)/)[1]; imp = amazon_logImpression(imp, locale, tag, code); imp = amazon_logImpression(imp, locale, tag, '-as2', -1); } else if (href.match(/link_code=am2/)) { // Existing am2 link var code = 'am2'; if ((locale == 'com') && amazonTreatment) { code = 'am3'; href = href.replace(/link_code=am2/, 'link_code=am3'); } href = href.replace(/creative=\d+/, 'creative=' + ccmid[code]); href = href.replace(/camp=\d+/, 'camp=' + camp); allLinks[i].href = href; var tag = href.match(/tag=([^&]+)/)[1]; imp = amazon_logImpression(imp, locale, tag, code); imp = amazon_logImpression(imp, locale, tag, '-am2', -1); } else if (!href.match(/link_code=/) && href.match(/tag=([^&]+)/)) { href = href + '&link_code=ur2&camp=' + camp + '&creative=9325'; allLinks[i].href = href; var tag = href.match(/tag=([^&]+)/)[1]; imp = amazon_logImpression(imp, locale, tag, 'ur2'); } } // Check if it's an old-style ASIN link else if (results = href.match(asin)) { var locale = results[1]; var code = ((locale == 'com') && amazonTreatment) ? 'as3' : 'as2'; // Replace ASIN handler with redirect href = href.replace(/ASIN\d?\/(\w{10})\/(ref=nosim\/)?([^\/\?]+).*/i, 'redirect?tag=$3&creative=' + ccmid[code] + '&camp=' + camp + '&link_code=' + code + '&path=ASIN/$1'); allLinks[i].href = href; var tag = results[4]; imp = amazon_logImpression(imp, locale, tag, code); } // Check if it's a really-old-style ISBN link else if (results = href.match(isbn)) { var locale = results[1]; var code = ((locale == 'com') && amazonTreatment) ? 'as3' : 'as2'; // Replace ISBN handler with redirect href = href.replace(/ISBN=(\w{10})\/(ref=nosim\/)?([^\/\?]+)A.*/, 'redirect?tag=$3&creative=' + ccmid[code] + '&camp=' + camp + '&link_code=' + code + '&path=ASIN/$1'); allLinks[i].href = href; var tag = results[4]; imp = amazon_logImpression(imp, locale, tag, code); } // Check if it's an old-style marketplace link else if (results = href.match(mp)) { var locale = results[1]; var code = ((locale == 'com') && amazonTreatment) ? 'am3' : 'am2'; // Replace marketplace handler with redirect var mpTarget = new RegExp('/gp/associates/link-types/marketplace\\.html\\?asin=(\\w{10})&(amp;)?t=([^/]+)'); href = href.replace(mpTarget, '/exec/obidos/redirect?tag=$3&creative=' + ccmid[code] + '&camp=' + camp + '&link_code=' + code + '&path=tg/stores/offering/list/-/$1/all/$1'); var mpTarget = new RegExp('/gp/associates/link-types/marketplace\\.html\\?t=([^&]+)&(amp;)?asin=(\\w{10})'); href = href.replace(mpTarget, '/exec/obidos/redirect?tag=$1&creative=' + ccmid[code] + '&camp=' + camp + '&link_code=' + code + '&path=tg/stores/offering/list/-/$3/all/$3'); allLinks[i].href = href; var tag = href.match(/tag=([^&]+)/)[1]; imp = amazon_logImpression(imp, locale, tag, code); } if (amazonTreatment && (locale == 'com')) { amazon_enhanceLink(allLinks[i]); } // Have we gone over our time limit? var now = new Date(); now = now.getTime(); if (now > (start + timeout)) { timeoutReached = true; break; } } var tagID; var scripts = document.getElementsByTagName('script'); for (var i=0; i < scripts.length; i++) { var source = new String(scripts[i].src); var tagIDObj; if (tagIDObj = source.match(/link-enhancer.*\?tag=([^&]+)/)) { tagID = tagIDObj[1]; break; } } if (amazonTreatment) { document.write(''); } var total = 0; // Send data to impression recorder via img tags for (var locale in imp) { var tld = (locale == 'co.jp') ? 'jp' : locale; for (var tag in imp[locale]) { // Record the fact that this script was served. var tc = ((locale == 'com') && amazonTreatment) ? 'pv3' : 'pv2'; document.write(''); for (var code in imp[locale][tag]) { var link_code = new String(code); link_code = link_code.replace(/^-/, ''); document.write(''); total += imp[locale][tag][code]; } } } if (timeoutReached) { document.write(''); } } function amazon_logImpression(imp, locale, tag, code, count) { if (!count) { count = 1; } if (imp[locale]) { if (imp[locale][tag]) { if (imp[locale][tag][code]) { imp[locale][tag][code] = imp[locale][tag][code] + count; } else { imp[locale][tag][code] = count; } } else { imp[locale][tag] = {}; imp[locale][tag][code] = count; } } else { imp[locale] = {}; imp[locale][tag] = {}; imp[locale][tag][code] = count; } return imp; } // Attach product data to the link function amazon_enhanceLink(link) { if (!link.name) { if (link.href.match(redirect)) { var href = new String(link.href); var results = href.match(/ASIN\/(\w{10})/); if (!results) { results = href.match(/offering\/list\/-\/(\w{10})/); } if (results) { if (href.match(/link_code=as3/)) { link.name = 'evtst|a|' + results[1]; amazon_decorateLink(link); } else if (href.match(/link_code=am3/)) { link.name = 'evtst|a|' + results[1]; amazon_decorateLink(link); } } } } } // Change the style of the link to a dashed underline. function amazon_decorateLink(link) { link.style.textDecoration = 'none'; var children = link.childNodes; for (var i=0; i < children.length; i++) { // Apply dashed underline to non-image elements within the link. if (children[i].nodeName == '#text') { var span = amazon_textToSpan(children[i]); link.replaceChild(span, children[i]); span.style.borderBottom = '1px dashed'; } else if (children[i].nodeName != 'IMG') { if (children[i].style) { children[i].style.borderBottom = '1px dashed'; } } // Use events to change decoration on mouseover/mouseout. amazon_addEvent(children[i], 'mouseover', amazon_mouseover, false); amazon_addEvent(children[i], 'mouseout', amazon_mouseout, false); } } function amazon_textToSpan(textNode) { var span = document.createElement('span'); var textNodeCopy = document.createTextNode(textNode.nodeValue); span.appendChild(textNodeCopy); return span; } // Change link decoration on mouseover (cross-browser) function amazon_mouseover(event) { // In IE, it's srcElement. var target = (event.target) ? event.target : event.srcElement; var link = target.parentNode; var children = link.childNodes; for (var i=0; i < children.length; i++) { // Apply solid underline to non-image elements within the link. if (children[i].nodeName != 'IMG') { children[i].style.borderBottom = '1px solid'; } } } // Change link decoration on mouseout (cross-browser) function amazon_mouseout(event) { // In IE, it's srcElement. var target = (event.target) ? event.target : event.srcElement; var link = target.parentNode; var children = link.childNodes; for (var i=0; i < children.length; i++) { // Apply dashed underline to non-image elements within the link. if (children[i].nodeName != 'IMG') { children[i].style.borderBottom = '1px dashed'; } } } // Cross-browser event attachment interface. function amazon_addEvent(obj, evType, fn, useCapture) { if (obj.addEventListener) { obj.addEventListener(evType, fn, useCapture); return true; } else if (obj.attachEvent) { var r = obj.attachEvent("on"+evType, fn); return r; } } // Cookie functions function amazon_getcookie(name) { var re = new RegExp(name + "=([^;]+);?"); var results = re.exec(document.cookie); return results ? results[1] : null; } function amazon_setcookie(name, value) { // Cookie will expire in a year var d = new Date; d.setFullYear(d.getFullYear() + 1); var host = document.location.host; var domain = host.replace(/^www\./, ''); document.cookie = name + '=' + value + ';domain=.' + domain + ';path=/;expires=' + d.toGMTString(); }