var numThumbnails = 30;
var lastPos = 0;
window.onfleXcrollRun = function() {
	var updateThumbs = function(e) {
		var target = e.target;
		if(!target )
			return;
			
		if (!target.className)
			return;
		
		if (!target.className.match(/scrollgeneric/)) 
			return;
		
		
		var myObj;
		if (target.id.match(/hscrollerbase/)) {
			// look for child element.
			for (var i = 0; i < target.childNodes.length; i++) {
				if (target.childNodes[i].id.match(/hscrollerbar/)) {
					myObj = target.childNodes[i];
					break;
				}
			}
			
		} else {
			myObj = target;
		}
		if (!myObj) {
			return;
		}
		var myLeft = parseInt(myObj.style.left.replace(/px/, ''));
		var myWidth = parseInt(myObj.style.width.replace(/px/, ''));
		if (isNaN(myLeft) || isNaN(myWidth)) {
			return;
		}
		var browserDim = browserWindowSize();
		var movableSpace = browserDim[0] * .8 - myWidth;
		var currentIndex = myLeft / movableSpace * theThumbWidths.length;
		refreshThumbs(parseInt(currentIndex));
				
	};
	
	fleXenv.addTrggr(this, "mousemove", updateThumbs);
	fleXenv.addTrggr(this, "mouseup", updateThumbs);
	fleXenv.addTrggr(this, "mousedown", updateThumbs);
	fleXenv.addTrggr(this, "click", updateThumbs);
}

function getAvailableImageHeight() {
	var w = browserWindowSize();
	return parseInt(w[1] - 320);
}

function getAvailableImageWidth() {
	var w = browserWindowSize();
	return parseInt(w[0] * .8 - 250);
}

var backgroundImageObjects = new Array();

function resizeBackgroundImages() {
	if (window.backgroundImages === undefined) {
		return;
	}	
	
	
	var w = browserWindowSize();
	var width = parseInt(w[0] * .4);
	var height = getAvailableImageHeight();	
	for (var key in backgroundImages) {
		addCssClass(_elementById(key), "loading");
		var obj = new Image();
		obj.theKey = key;
		obj.onload = function() {
			removeCssClass(_elementById(this.theKey), "loading");
		}
		obj.src = backgroundImages[key] + "?height=" + height + "&width=" + width + "&rand=" + randNum();
		backgroundImageObjects[key] = obj;
	}
}


function resizeImage() {
	theRandomNumber = 0;
	
	resizeBackgroundImages();
	
	var obj = document.getElementById('vTheImage');
	
	if (!obj) {
		return;
	}
	
	var imgContainer = document.getElementById('vImageContainer');
	if (imgContainer) {
		imgContainer.style.height = (getAvailableImageHeight() + 7) + "px";
	}
	setUrl(obj, getAvailableImageHeight(), getAvailableImageWidth());	
	
	
	
}

var theRandomNumber = 0;

function randNum() {
	if (0 == theRandomNumber) {
		theRandomNumber = parseInt(Math.random() * 10000);
	} 
	return theRandomNumber;
}

function getQueryParam(url, paramName) {
	var qString = url.split("?");
	if (qString.length < 2) {
		return false;
	}
	var pairs = qString[1].split("&");
	for (var i = 0; i < pairs.length; i++) {
		var pair = pairs[i].split("=");
		if (pair[0] == paramName) {
			return pair[1];
		}
	}
	return false;
}

function setUrl(obj, height, width) {
	
	var newUrl = obj.src;
	
	if (false != getQueryParam(newUrl, "height")) {
        	newUrl = newUrl.replace(/height=\d+/g, "");
	} 
	if (false != getQueryParam(newUrl, "width")) {
	   newUrl = newUrl.replace(/width=\d+/g, "");
	}
	
	if (false != getQueryParam(newUrl, "rand")) {
	  newUrl = newUrl.replace(/rand=\d+/g, "");
	} 
		
	if (newUrl.indexOf("?") == -1) {
		newUrl += "?";
	}	
	newUrl += "height=" + height + "&width=" + width + "&rand=" + randNum();		
	
	//alert(newUrl);
	obj.src = newUrl;
}


function getScreenHeight() {
	var mainContent = document.getElementById('mainContent');
	if (!mainContent) {
		return 450;
	}
        return mainContent.clientHeight;
}


function getScreenWidth() {
	var mainContent = document.getElementById('mainContent');
	if (!mainContent) {
		return 450;
	}
        return mainContent.clientWidth;
}


window.onresize = resizeImage;
window.onload = resizeImage;
window.onkeydown = checkKeyCode;

function checkKeyCode(e) {
	if (window.theImages === undefined)  {
		return;
	}
	var keycode;
	if (window.event) keycode = window.event.keyCode;
	else if (e) keycode = e.which;
	if (37 == keycode) {
		// move previous image
		updateScrollPos(0, 'previous');
	}
	else if (39 == keycode) {
		// move to next image
		updateScrollPos(0, 'next');
	}
	
}

var currentImageId = null;	


function updateScrollPos(currentId, action) {
	
	if (null == currentImageId) {
				currentImageId = currentId;
	}
	switch (action) {
		case 'this':
		case 'gallery':
			currentImageId = currentId;
			break;	
		case 'next':
			if ((currentImageId + 1) == theImages.length) {
				currentImageId = 0;
			} else {
				currentImageId = currentImageId + 1;
			}
			break;
		case 'previous':
			if (currentImageId == 0) {
				currentImageId = theImages.length - 1;
			} else {
				currentImageId = currentImageId - 1;
			}
			break;
		default:
			// unknown event.
			break;
	}
	_loadingNextImageStart();
	
	var test = new Image();
	test.onload = function() {
		_loadingNextImageStop();
	}
	test.src = theImages[currentImageId] + "?height=" + getAvailableImageHeight() + "&width=" + getAvailableImageWidth() + "&rand=" + randNum();
	
	
	
	document.getElementById('vTheImage').src = test.src;
	document.getElementById('vTheImage').title = theImageCaptions[currentImageId];
	document.getElementById('vTheCounter').innerHTML = (currentImageId + 1) + "/" + theImages.length;
	document.getElementById('vTheCaption').innerHTML = theImageCaptions[currentImageId];
	refreshThumbs(currentImageId);
	refreshSidebar(currentImageId);
	
	
	var totalWidth = 0;
	for (var i = 0; i < theThumbWidths.length; i++) {
		totalWidth += theThumbWidths[i] + 4;
	}
	
	var scrollBy = 0;
	for (var i = 0; i <= currentImageId; i++) {
		scrollBy += theThumbWidths[i] + 4;
	}

	var browserDim = browserWindowSize();
	var availWidth = browserDim[0] * .8 / 2;
	if (scrollBy < availWidth) {
		scrollBy = 0;
	} else if (scrollBy > totalWidth - availWidth) {
		var remainingWidth = 0;
		for (var i = theThumbWidths.length - 1; i > currentImageId; i--) {
			remainingWidth += theThumbWidths[i] + 4;
		}
		scrollBy -= availWidth  + availWidth - remainingWidth;
	} else {
		scrollBy -= availWidth;
	}
	var theContainer = document.getElementById('vThumbsContainer');
	//alert(theContainer.findPos() + " " + theContainer.delta );
	if (action != 'this') {
		theContainer.contentScroll(scrollBy +"px", "0px", false);
	}
	flashImage(currentImageId);
	return false;
	
	
}

function _loadingNextImageStart() {
	// FIXME insert other effect here.
	document.getElementById("imageLoading").style.display = "block";
}

function _loadingNextImageStop() {
	document.getElementById("imageLoading").style.display = "none";
	
}

var running = new Array();

function flashImage(currentId) {
	var obj = document.getElementById("vTheThumb_" + currentId);
	if (!obj) {
		return;
	}
	obj.style.MozOpacity = 0;
	running[currentImageId] = window.setInterval("doFlashImage('" + currentId + "')", 20);
}

function doFlashImage(currentId) {
	var currentObj = document.getElementById("vTheThumb_" + currentId);
	if (!currentObj) {
		window.clearInterval(running[currentId]);
		return;
	}
	if (currentObj.style.MozOpacity >= 1) {
		window.clearInterval(running[currentId]);
		return;
	}
	currentObj.style.MozOpacity = parseFloat(currentObj.style.MozOpacity) + 0.01;
	
}

function addCssClass(e, clazz) {
	var arr = e.className.split(" ");
	for (var i = 0; i < arr.length; i++) {
		if (arr[i] == clazz) {
			return;
		}
	}
	arr[arr.length] = clazz;
	e.className = arr.join(" ");
}

function removeCssClass(e, clazz) {
	var arr = e.className.split(" ");
	
	for (var i = 0; i < arr.length; i++) {
		if (arr[i] == clazz) {
			arr[i] = "";
		}	
	}
	e.className = arr.join(" ");
}

function refreshSidebar(currentImageId) {
		
	refreshBar("categorySideBar", theCategories, currentImageId);
	refreshBar("photographerSideBar", thePhotographers, currentImageId);
}

function refreshBar(prefix, arr, currentImageId) {
	var obj = document.getElementById(prefix + "_" + arr[currentImageId]);
	if (obj) {
		var uniq = unique(arr);
		for (var i = 0; i < uniq.length; i++) {
			var x = document.getElementById(prefix + "_" + uniq[i]);
			if (x) {
				removeCssClass(x, "active");
			}
		}
		addCssClass(obj, "active");
	}
}


function refreshThumbs(currentImageId) {
	var startPos = currentImageId - numThumbnails;
	var endPos = currentImageId + numThumbnails;
	if (startPos < 1) {
		startPos = 0;
		endPos += numThumbnails - currentImageId;
	}
	if (endPos >= theImages.length - 1) {
		endPos = theImages.length - 1;
		startPos -= theImages.length - currentImageId;
	}

	for (var i = currentImageId - numThumbnails; i <= currentImageId + numThumbnails; i++) {
		var obj = document.getElementById('vTheThumb_' + i);
		if (obj && obj.src.search(/clear\.gif/)) {
			// obj.style.backgroundColor = "#F6F6F6";		
			obj.style.backgroundImage="url(fileadmin/img/loadingAni.gif)";
			obj.style.backgroundRepeat = "no-repeat";
			obj.style.backgroundPosition = "center center";
			obj.src = theImages[i] + "?height=64&width=200&rand=" + randNum();
		}
	}
}


function _lang(key) {
	return translations[key];
}

function _obj(hrefObj) {
	return _elementById(_getId(hrefObj));
}

function _elementById(id) {
  var obj = document.getElementById(id);
  if (!obj) {
  	//alert(id);
  }
  return obj;
}
 
function _getId(hrefObj) {
	return hrefObj.attributes.id.value;
}

function in_array(needle, haystack) {
	for (var i = 0; i < haystack.length; i++) {
		if (haystack[i] == needle) {
			return true;
		}
	}
	return false;
}


function _setBackgroundImage(elementId) {
	var box = browserWindowSize();
	if (backgroundImageObjects[elementId] === undefined) {
		return;
	}
	var mc = _elementById("theOverviewImage");
	mc.src = backgroundImageObjects[elementId].src;	
}

function _setBackgroundImageNull() {
	var mc = _elementById("theOverviewImage");
	mc.src = "clear.gif";
}

function _fadeInAction(id, arr) {
	_setBackgroundImage(id);
	for (var x in arr) {
		if (x == id) {
			continue;
		}
		for (var i = 0; i < arr[x].length; i++) {
			swapCssClass(arr[x][i], "active", "inactive");
		}
	}
	if (arr == photoMapping) {
		for (var i = 0; i < photographers.length; i++) {
			if (photographers[i] == id) {
				swapCssClass(photographers[i], "inactive", "active");
			} else {
				swapCssClass(photographers[i], "active", "inactive");
			}
		}
	} else {
		for (var i = 0; i < tags.length; i++) {
			if (tags[i] == id) {
				swapCssClass(tags[i], "inactive", "active");
			} else {
				swapCssClass(tags[i], "active", "inactive");
			}
		}
	}
	for (var i = 0; i <arr[id].length; i++) {
		swapCssClass(arr[id][i], "inactive", "active");
	} 
	
}



function swapCssClass(id, oldclass, newclass) {
	var mc = _elementById(id);
	removeCssClass(mc, oldclass);
	addCssClass(mc, newclass);
}


function _fadeOutAction(id, arr) {
	_setBackgroundImageNull();
	for (var i = 0; i < tags.length; i++) {
		var mc = _elementById(tags[i]);
		removeCssClass(mc, "inactive");
		removeCssClass(mc, "active");
	}
	for (var i = 0; i < photographers.length; i++) {
		var mc = _elementById(photographers[i]);
		removeCssClass(mc, "inactive");
		removeCssClass(mc, "active");
	}
}

function _fadeIn(id) {
	var myId = _getId(id);
	if (in_array(myId, photographers)) {
		return _fadeInAction(myId, photoMapping);
	}
	return _fadeInAction(myId, tagMapping);
}



function _fadeOut(id) {
	var myId = _getId(id);
	if (in_array(myId, photographers)) {
		return _fadeOutAction(myId, photoMapping);
	}
	return _fadeOutAction(myId, tagMapping);
}

function _linkTo(id) {
    var my = _getId(id);
    if (in_array(my, photographers)) {
      var params = new Array();
      params['photographer'] = my;
      params['category'] = 'null';
      params['height'] = getAvailableImageHeight();
      params['width'] = getAvailableImageWidth();
       _doLinkTo(params);
       return false;
    }
    var params = new Array();
	params['photographer'] = 'null';
    params['category'] = my;
    params['height'] = getAvailableImageHeight();
    params['width'] = getAvailableImageWidth();
       _doLinkTo(params);
	return false;
}

function _doLinkTo(params) {
  var url = document.location.href;
  var theParams = new Array();
  if (url.indexOf('?') == -1) {
  	url += '?';
  	theParams = params;
  } else {
  
  	
  
  	var myParams = url.substring(url.indexOf('?') + 1, url.length).split('&');
  	url = url.substring(0, url.indexOf('?') + 1);
  	
  	
  	for (var i = 0; i < myParams.length; i++) {
  	  var val = myParams[i].split('=');
  	  theParams[val[0]] = val[1] ? val[1] : '';
  	}
  	
  	for (key in params) {
  		theParams[key] = params[key];
  	}
  
  }
  
  
  for (key in theParams) {
    url += "&" + key + "=" + theParams[key];
  } 

  document.location.href = url;
}


function browserWindowSize() {
	var browserWinWidth = 0;
	var browserWinHeight = 0;
	if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		browserWinWidth = window.innerWidth;
		browserWinHeight = window.innerHeight;
	} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		browserWinWidth = document.documentElement.clientWidth;
		browserWinHeight = document.documentElement.clientHeight;
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		browserWinWidth = document.body.clientWidth;
		browserWinHeight = document.body.clientHeight;
	}
	var response = new Array(2);
	response[0] = browserWinWidth;
	response[1] = browserWinHeight;
    return response;
}



/**
 * Removes duplicates in the array 'a'
 * @author Johan Känngård, http://dev.kanngard.net
 */
function unique(a) {
	tmp = new Array(0);
	for(i=0;i<a.length;i++){
		if(!contains(tmp, a[i])){
			tmp.length+=1;
			tmp[tmp.length-1]=a[i];
		}
	}
	return tmp;
}

/**
 * Returns true if 's' is contained in the array 'a'
 * @author Johan Känngård, http://dev.kanngard.net
 */
function contains(a, e) {
	for(j=0;j<a.length;j++)if(a[j]==e)return true;
	return false;
}

