var bumpPseudoVideoPoolTime = 50;
var bumpPseudoVideoLoadPackPoolTime = 100;
var bumpPseudoVideoLoadPack = 20;
function bumpPseudoVideo(selector,images, pathtoLoadingImage,callbacks, cdns) {
	var tmpArr = [];
	var tmpArr2 = [];
	var cdnUrls = [];
	
	if (images.length>0) {
		
		for (var i=0;i<images.length;i++) {
			
			if (pathtoLoadingImage) {
				$('#'+selector+i+' img:first').attr('src',pathtoLoadingImage);
			}
			$('#'+selector+i).show();
			
			if (images[i].length>0) {
				var cdnCounter=1;
				for (var j=0;j<images[i].length;j++) {
					if ((cdns) && (cdns.length>0)) {
						if (cdnCounter>cdns.length) {
							cdnCounter = 1;
						}
						var foundInCache = false;
						for (var k=0;k<cdnUrls.length;k++) {
							if (cdnUrls[k][0]==images[i][j][0]) {
								images[i][j][0] = 'http://' + cdns[cdnUrls[k][1]] + images[i][j][0];
								foundInCache=true;
							}
						}
						if (!foundInCache) {
							cdnUrls.push([images[i][j][0], cdnCounter-1]);
							images[i][j][0] = 'http://' + cdns[cdnCounter-1] + images[i][j][0];
						}
						cdnCounter++;
					}
				}
			}

		}
		/////////
		counter = 0;
		
		while (true) {
				stopFlag = true;
				counter++;
				timeSpent = counter*bumpPseudoVideoPoolTime;
				for (var i=0;i<images.length;i++) {
						var layerSeek = 0;
						var layerAllImagesPassed = true;
						if (images[i].length>0) {
							for (var j=0;j<images[i].length;j++) {
								layerSeek = layerSeek+images[i][j][1];
								if (!images[i][j][2]) {
									layerAllImagesPassed=false;
								}
								if ((timeSpent >= layerSeek) && !images[i][j][2]) {
									images[i][j][2]=true; //means we already passed it
									tmpArr2.push(images[i][j][0]);
								}
							}
							if (!layerAllImagesPassed) {
								stopFlag = false;
							}
						}
						
				}
				if (stopFlag) {
					break;
				}
			
		}
		////////
		tmpArr2 = tmpArr2.unique();
		
		bumpPseudoVideoPreloadIteration(images,tmpArr2,0);
 		bumpPseudoVideoReRun(selector,images, callbacks);	   			
		
	}
}
function bumpPseudoVideoReRun(selector,images, callbacks) {
	var counter2 = 0; 
	bumpPseudoVideoIteration(selector,images,callbacks, [], counter2);
}

function bumpPseudoVideoPreloadIteration(images, preloadImages, counter3) {
	var arrToPreload = [];
	for (var i=counter3*bumpPseudoVideoLoadPack;(i<(counter3*bumpPseudoVideoLoadPack+bumpPseudoVideoLoadPack) && i<preloadImages.length);i++) {
		arrToPreload.push(preloadImages[i]);
	}
	
	$.preload(arrToPreload , {
   		init: function(loaded, total) {
   		},
   		loaded: function(img, loaded, total) {
   		},
   		loaded_all: function(loaded, total) {
   			
			for (var k=0;k<arrToPreload.length;k++) {
	   			for (var i=0;i<images.length;i++) {
						if (images[i].length>0) {
							for (var j=0;j<images[i].length;j++) {
								if (images[i][j][0]==arrToPreload[k]) {
									//means we loaded image
									images[i][j][3]=true;
								}
							}
						}
	   			}
			}
   			
   			counter3++;
   			if (counter3*bumpPseudoVideoLoadPack>=preloadImages.length) {
   				return true;
   			} else {
   				intervalId2 = setTimeout(function(){
   					bumpPseudoVideoPreloadIteration(images, preloadImages, counter3);
   				},bumpPseudoVideoLoadPackPoolTime);
   			}

   		}
	});	
	
		
}


function bumpPseudoVideoIteration(selector,images,callbacks,callbacksResult,counter2) {
	
		stopFlag = true;
		intervalId = setTimeout(function(){
			counter2++;
			var timeSpent = counter2*bumpPseudoVideoPoolTime;
			
			if (images.length>0) {
				thisloop:
				for (var i=0;i<images.length;i++) {
						var layerSeek = 0;
						var layerAllImagesPassed = true;
						if (images[i].length>0) {
							for (var j=0;j<images[i].length;j++) {
								layerSeek = layerSeek+images[i][j][1];
								if (!images[i][j][4]) {
									layerAllImagesPassed=false;
								}
								if ((timeSpent >= layerSeek) && !images[i][j][4]) {
									if (!images[i][j][3]) {
										//image wasn't loaded yet
										stopFlag = false;
										break thisloop;
									}
									images[i][j][4]=true; //means we already show it
									$('#'+selector+i+' img').attr('src',images[i][j][0]);
								}
							}
							if (!layerAllImagesPassed) {
								stopFlag = false;
							}
						}
						if ((layerAllImagesPassed) && (callbacks) && (!callbacksResult[i])) {
							eval(callbacks[i]);
							callbacksResult[i] = true;
						}
				}
			}
			if (stopFlag) {
				bumpPseudoVideoFinish(images);
			} else {
				bumpPseudoVideoIteration(selector,images,callbacks,callbacksResult, counter2);
			}
			
			
		},bumpPseudoVideoPoolTime);
		
	
}

function bumpPseudoVideoFinish(images) {
	if (images.length>0) {
		for (var i=0;i<images.length;i++) {
				if (images[i].length>0) {
					for (var j=0;j<images[i].length;j++) {
						images[i][j][4]=false;
					}
				}
		}
	}
}

Array.prototype.unique =
	  function() {
	    var a = [];
	    var l = this.length;
	    var found;
	    for(var i=0; i<l; i++) {
	      found = false;	
	      for(var j=0; j<a.length; j++) {
	        // If this[i] is found later in the array
	        if (this[i] == a[j]) {
	        	found = true;
	        	break;
	        }
	      }
	      if (!found) {
	    	  a.push(this[i]);
	      }
	    }
	    return a;
	  };

