/*! echo v1.5.0 | (c) 2014 @toddmotto | mit license | github.com/toddmotto/echo */ (function (root, factory) { if (typeof define === 'function' && define.amd) { define(factory); } else if (typeof exports === 'object') { module.exports = factory; } else { root.echo = factory(root); } })(this, function (root) { 'use strict'; var exports = {}; var callback = function () {}; var offset, poll, throttle, unload; var inview = function (element, view) { var box = element.getboundingclientrect(); return (box.right >= view.l && box.bottom >= view.t && box.left <= view.r && box.top <= view.b); }; var debounce = function () { cleartimeout(poll); poll = settimeout(exports.render, throttle); }; exports.init = function (opts) { opts = opts || {}; var offsetall = opts.offset || 0; var offsetvertical = opts.offsetvertical || offsetall; var offsethorizontal = opts.offsethorizontal || offsetall; var optiontoint = function (opt, fallback) { return parseint(opt || fallback, 10); }; offset = { t: optiontoint(opts.offsettop, offsetvertical), b: optiontoint(opts.offsetbottom, offsetvertical), l: optiontoint(opts.offsetleft, offsethorizontal), r: optiontoint(opts.offsetright, offsethorizontal) }; throttle = optiontoint(opts.throttle, 250); unload = !!opts.unload; callback = opts.callback || callback; exports.render(); if (document.addeventlistener) { root.addeventlistener('scroll', debounce, false); root.addeventlistener('load', debounce, false); } else { root.attachevent('onscroll', debounce); root.attachevent('onload', debounce); } }; exports.render = function () { var nodes = document.queryselectorall('img[data-echo]'); var length = nodes.length; var src, elem; var view = { l: 0 - offset.l, t: 0 - offset.t, b: (root.innerheight || document.documentelement.clientheight) + offset.b, r: (root.innerwidth || document.documentelement.clientwidth) + offset.r }; for (var i = 0; i < length; i++) { elem = nodes[i]; if (inview(elem, view)) { if (unload) { elem.setattribute('data-echo-placeholder', elem.src); } elem.src = elem.getattribute('data-echo'); if (!unload) { elem.removeattribute('data-echo'); } callback(elem, 'load'); } else if (unload && !!(src = elem.getattribute('data-echo-placeholder'))) { elem.src = src; elem.removeattribute('data-echo-placeholder'); callback(elem, 'unload'); } } if (!length) { exports.detach(); } }; exports.detach = function () { if (document.removeeventlistener) { root.removeeventlistener('scroll', debounce); } else { root.detachevent('onscroll', debounce); } cleartimeout(poll); }; return exports; });