function PhotoChanger( ElementToChange ) {
	this.ElementToChange = document.getElementById( ElementToChange );
	if ( this.ElementToChange === null )
		throw 'Element to change is not found';
}

PhotoChanger.prototype.change = function( NewSrc ) {
	var Obj = this.ElementToChange;
	$( this.ElementToChange ).attr( 'newSource', NewSrc ).fadeOut( 'slow', function() {
		var loader = new ImageLoader( $(this).attr( 'newSource' ) );
		loader.element = $(this);
		loader.loadEvent = function( url, image, element ) {
			element.fadeIn( 'slow' );
		}
		loader.load( Obj );
	});
}

function addListener( element, type, expression, bubbling ) {
	bubbling = bubbling || false;
	if( window.addEventListener ) { // Standard
		element.addEventListener( type, expression, bubbling );
		return true;
	} else if(window.attachEvent) { // IE
		element.attachEvent( 'on' + type, expression );
		return true;
	} else {
		return false;
	}
}

var ImageLoader = function(url){
	this.url = url;
	this.image = null;
	this.element = null;
	this.loadEvent = null;
};

ImageLoader.prototype = {
	load:function(image){
		this.image = image;
	    var url = this.url;
	    var image = this.image;
	    var loadEvent = this.loadEvent;
	    var element = this.element;
	    addListener( this.image, 'load', function(e){
	    	if(loadEvent != null){
	    		loadEvent(url, image, element);
	    	}
	    }, false);
	    this.image.src = this.url;
	},
	getImage:function(){
		return this.image;
	}
};
