(function($, window, document) {
	var ImageLazyload = $.Lazyload.extend({
		init: function(element, options) {
			this._super(element, options);
		},
		_init: function() {
			this.options.selector = '[data-lazyload]';
			this._super();
		},
		_set: function(element, uri) {
			if (element.tagName === 'IMG') {
				element.src = uri;
			} else {
				element.style.backgroundImage = "url(" + uri + ")";
			}
		},
		_hasPlaceholder: function(element) {
			if (element.offsetWidth) {
				if (element.tagName === 'IMG') {
					return !!element.src;
				} else {
					return !!element.style.backgroundImage;
				}
			}
			return false;
		},
		_addPlaceHolder: function(element) {
			var self = this;
			if (element.tagName === 'IMG') {
				self._counter++;
				element.onload = function() {
					self._counter--;
					self.addCallback(element, self.handle);
					this.onload = null;
				};
				self.onPlaceHolder(function(placeholder) {
					self._set(element, placeholder);
				});
			} else {
				element.style.backgroundImage = "url(" + self.options.placeholder + ")";
			}
		},
		addElement: function(element) {
			var self = this;
			var uri = element.getAttribute('data-lazyload');
			if (uri) {
				if (self._hasPlaceholder(element)) {
					self.addCallback(element, self.handle);
				} else {
					self.onPlaceHolder = self._createLoader(function(callback) {
						var img = new Image();
						var placeholder = self.options.placeholder;
						img.src = placeholder;
						img.onload = img.onerror = function() {
							callback(placeholder);
						};
					});
					self._addPlaceHolder(element);
				}
				return true;
			}
			return false;
		},
		set: function(element, uri) {
			var self = this;
			var img = new Image();
			img.onload = function() {
				self._set(element, uri);
				$.trigger(self.element, 'success', {
					element: element,
					uri: uri
				});
			};
			img.onerror = function() {
				$.trigger(self.element, 'error', {
					element: element,
					uri: uri
				});
			};
			img.src = uri;
			element.removeAttribute('data-lazyload'); //只尝试一次，后续可能支持多次尝试
		},
		handle: function(element, key) {
			var uri = element.getAttribute('data-lazyload');
			if (uri) {
				this.set(element, uri);
				//element.parentNode.parentNode.setAttribute('data-lazyload', 'true'); //debug
			}
		},
		destroy: function() {
			this._super();
			this.element.removeAttribute('data-imageLazyload');
		}

	});
	$.fn.imageLazyload = function(options) {
		var lazyloadApis = [];
		this.each(function() {
			var self = this;
			var lazyloadApi = null;
			if (self === document || self === window) {
				self = document.body;
			}
			var id = self.getAttribute('data-imageLazyload');
			if (!id) {
				id = ++$.uuid;
				$.data[id] = lazyloadApi = new ImageLazyload(self, options);
				self.setAttribute('data-imageLazyload', id);
			} else {
				lazyloadApi = $.data[id];
			}
			lazyloadApis.push(lazyloadApi);
		});
		return lazyloadApis.length === 1 ? lazyloadApis[0] : lazyloadApis;
	}
})(mui, window, document);
