(function(win, doc, undefined){ var docElem = doc.documentElement, proxyURL = doc.getElementById("respond-proxy").href, redirectURL = (doc.getElementById("respond-redirect") || location).href, baseElem = doc.getElementsByTagName("base")[0], urls = [], refNode; function encode(url){ return win.encodeURIComponent(url); } function fakejax( url, callback ){ var iframe, AXO; // All hail Google http://j.mp/iKMI19 // Behold, an iframe proxy without annoying clicky noises. if ( "ActiveXObject" in win ) { AXO = new ActiveXObject( "htmlfile" ); AXO.open(); AXO.write( '' ); AXO.close(); iframe = AXO.getElementById( "x" ); } else { iframe = doc.createElement( "iframe" ); iframe.style.cssText = "position:absolute;top:-99em"; docElem.insertBefore(iframe, docElem.firstElementChild || docElem.firstChild ); } iframe.src = checkBaseURL(proxyURL) + "?url=" + encode(redirectURL) + "&css=" + encode(checkBaseURL(url)); function checkFrameName() { var cssText; try { cssText = iframe.contentWindow.name; } catch (e) { } if (cssText) { // We've got what we need. Stop the iframe from loading further content. iframe.src = "about:blank"; iframe.parentNode.removeChild(iframe); iframe = null; // Per http://j.mp/kn9EPh, not taking any chances. Flushing the ActiveXObject if (AXO) { AXO = null; if (win.CollectGarbage) { win.CollectGarbage(); } } callback(cssText); } else{ win.setTimeout(checkFrameName, 100); } } win.setTimeout(checkFrameName, 500); } // http://stackoverflow.com/a/472729 function checkBaseURL(href) { var el = document.createElement('div'), escapedURL = href.split('&').join('&'). split('<').join('<'). split('"').join('"'); el.innerHTML = 'x'; return el.firstChild.href; } function checkRedirectURL() { // IE6 & IE7 don't build out absolute urls in attributes. // So respond.proxy.gif remains relative instead of http://example.com/respond.proxy.gif. // This trickery resolves that issue. if (~ !redirectURL.indexOf(location.host)) { var fakeLink = doc.createElement("div"); fakeLink.innerHTML = ''; docElem.insertBefore(fakeLink, docElem.firstElementChild || docElem.firstChild ); // Grab the parsed URL from that dummy object redirectURL = fakeLink.firstChild.href; // Clean up fakeLink.parentNode.removeChild(fakeLink); fakeLink = null; } } function buildUrls(){ var links = doc.getElementsByTagName( "link" ); for( var i = 0, linkl = links.length; i < linkl; i++ ){ var thislink = links[i], href = links[i].href, extreg = (/^([a-zA-Z:]*\/\/(www\.)?)/).test( href ), ext = (baseElem && !extreg) || extreg; //make sure it's an external stylesheet if( thislink.rel.indexOf( "stylesheet" ) >= 0 && ext ){ (function( link ){ fakejax( href, function( css ){ link.styleSheet.rawCssText = css; respond.update(); } ); })( thislink ); } } } if( !respond.mediaQueriesSupported ){ checkRedirectURL(); buildUrls(); } })( window, document );