var ImageChanger = function(imgNode1, imgNode2, images, options) {
	if (window==this) {
		return new ImageChanger(imgNode1, imgNode2, images, options);
	}
	
	var prefix = typeof options.prefix != 'undefined' ? options.prefix : 'img_';
	var klass = typeof options.className != 'undefined' ? options.className : 'active';
	var active = typeof options.active != 'undefined' ? options.active : '';
	var onUpdate = typeof options.onUpdate == 'function' ? options.onUpdate : function() {};
	
	imgNode1 = typeof imgNode1 == 'string' ? document.getElementById(imgNode1) : imgNode1;
	imgNode2 = typeof imgNode2 == 'string' ? document.getElementById(imgNode2) : imgNode2;
	if (!imgNode1 || !imgNode2) return false;
	
	var currentImage = 0;
	
	if (active && active>0 && active<images.length) {
		currentImage = active;
	}
	
	this.change = function(id) {
		var node = document.getElementById(prefix+id);
		
		if (node) node.blur();
		
		var imgUrl = images[id] ? images[id].src : null;
		var imgTitle = images[id] ? images[id].title : null;
		var imgClass = images[id] ? images[id].className : null;
		
		if (imgNode2.src != imgUrl) {
			imgNode2.src = imgUrl;
		}
		
		if (imgNode2.title != imgTitle) {
			imgNode2.title = imgTitle;
		}
		
		if (imgNode2.className != imgClass) {
			imgNode2.className = imgClass;
		}
		
		if (document.getElementById('imagetitle')) {
			document.getElementById('imagetitle').innerHTML = imgTitle;
		}
		
		if (node && node.parentNode) {
			var children = node.parentNode.childNodes;
			var regexp   = new RegExp('(^|\\s)' + klass + '(?:\\s|$)');
			for (var i=0; i<children.length; ++i) {
				if (children[i].className) {
					children[i].className = children[i].className.replace(regexp, '$1');
				}
			}
			
			node.className = node.className + ' ' + klass;
		}
		
		currentImage = id;
		
		var tmp = imgNode1;
		imgNode1 = imgNode2;
		imgNode2 = tmp;
		
		// Fix for Safari
		imgNode1.width = images[id].width;
		
		onUpdate(imgNode1, imgNode2);
		
		return false;
	};
	
	this.next = function() {
		++currentImage;
		if (currentImage >= img.length) {
			currentImage = 0;
		}
		
		return this.change(currentImage);
	};
};