
	var gwps = new wps.base();
	var globalShownAlt = new Array();
	var uploadTryCounter= 0;
	var forms = new Array();
	var sendToFriendForms = new Array();
	var uploadTryCounter = 0;
	var reactObjects = $H({});
	var paddingCorrection = 12;
	var floaterEvents = $H({});
	var floaters = $H({});
	var isDragging = false;
	var currCountry = '';
	var currCity = '';
		
	function startPage(){
		resize();
		gwps.addEvent(window, 'resize', resize);
		setTimeout(function(){openUI(gRelRootPath + 'Start Here/');}, 1500);
	}

	function openHome(imgID){
		if (isDragging) return;
		var wpsRPC = new wps.file;
		var URI = 'http://' + location.hostname  + '/' +  gRelRootPath + '/foundAHomeAt/&action=parse&id=' + imgID ;
		var currImgData = imageMetaData[imgID];
		var func = function(req){setContent(req, currImgData['name'] + ', ' + currImgData['city'] + ', ' + currImgData['country'])}
		wpsRPC.attachWaiter(waiter);
		wpsRPC.attachUnWaiter(unWaiter);
		wpsRPC.createCall(URI, func);
		wpsRPC.call();
	}

	function openUI(pageName){
		if (gwps.is_ie() && pageName.indexOf('Video') == 1){ // VERRY VERRY VERRY nasty & dirty MSIE-hack.. what the heck... it's MSIE.. they should use a real browser.
			window.open('http://' + location.hostname  + '/' +  gRelRootPath + '/' + pageName + '/' , 'VideoPlayer', "status=no,scrollbars=no,location=no,width=425,height=320")
		}else{
			var wpsRPC = new wps.file;
			var URI = 'http://' + location.hostname  + '/' +  gRelRootPath + '/' + pageName + '/' ;
			var func = function(req){setContent(req, pageName)}
			wpsRPC.attachWaiter(waiter);
			wpsRPC.attachUnWaiter(unWaiter);
			wpsRPC.createCall(URI, func);
			wpsRPC.call();
		}
	}
	
	function setContent(req, pageName){
		if (pageName.indexOf('/') > -1){
			pageName = pageName.split('/');
			var newPageName = $A(pageName).reverse().findAll(
				function(thingy){
					if (thingy.length > 0) return thingy; 
				}
			)
			pageName = newPageName[0];
		}
			
		if (floaters[pageName]) return;
		var uiObj = mainFloater.getObjectById('gerritFloater');
		uiObj = uiObj.copy(uiObj);
		if (pageName.length > 35) pageName = pageName.substring(0, 35) + '..';
		uiObj.options.title = pageName;
		floaters[pageName] = uiObj;
		var func = function(){removeFloaterObj(pageName)};
		uiObj.addCloseEvent(func, this);
		
		var newYPos =  (floaters.keys().length * 18);
		var screenSize = Element.getDimensions(document.body);
		var absBottom = screenSize.height;
		if (newYPos > absBottom){
			newYPos = newYPos - absBottom;
		} 
		//uiObj.openAtX = (floaters.keys().length * 20);
		uiObj.openAtY = (floaters.keys().length * 18);
		uiObj.drawPage('', '');
		uiObj.setContent(req.responseText);
		//currFloater = uiObj;
	}
	
	function removeFloaterObj(pageName){
		floaters[pageName] = '';
	}
	
	function getReactions(pageName, container, id){
		var react = getReactObj(id,container);
		var floater = floaters[pageName];
		setTimeout(function(){floater.doAutoResize();}, 1500);
		react.getReactions(id, container);
	}
	
	function  openReactFormAtReactNode(elem, id, container){
		var react = getReactObj(id,container);
		react.openReactFormAtReactNode(elem);
	}
	
	function getReactObj(id, container){
		var elem = Builder.node('p');
		if (!container) container ='';
		
		if (!reactObjects[id]){
			var react = new wps.blogReact(id, container, false, elem);
		}else{
			var react = reactObjects[id]
		}	
		return react;
	}
	
	
	function waiter(){
		$('gerrit_waiter').show();
	}
	
	function unWaiter(){
		$('gerrit_waiter').hide();
	}
	
 	function resize(){
		var screenSize = Element.getDimensions(document.body);
		var absBottom = screenSize.height;
		var absRight = screenSize.width;
		var width = (absRight - 305 - 30);
	 	$('mainContainer').style.width = width + 'px';
	 	$('mainContainer').style.height = (absBottom - 60) + 'px';
	 	loadDefaultContent(currCountry, currCity); 
	}

	function loadDefaultContent(country, city){
		if (!country) country = '';
		if (!city) city = '';
		var screenSize = Element.getDimensions($('mainContainer'));
		try{
			new Ajax.Updater(
				'mainContainer', 
				gRelRootPath + 'get_images/&city=' + city + '&c=' + country + '&w=' + (screenSize.width) + '&h=' +(screenSize.height ), 
					{
						asynchronous:true, 
						evalScripts:true,
						onLoading : waiter,
						onLoaded : unWaiter,
						onComplete :function(transport){ makeSortable(); }
					}
				);
		}catch(e){
		}
		if (country && (currCity =='')){
			//load cities at country
			/* ENABLE THIS TO FILTER ON CITY
			$('city').appendChild(Builder.node('option', {}, ["Loading cities..."]));
			$('city').style.display = 'block';
			$('resetButton').style.display = 'block';
			var wpsRPC = new wps.rpc;
			wpsRPC.debug = true;
			wpsRPC.attachWaiter(waiter);
			wpsRPC.attachUnWaiter(unWaiter);
			wpsRPC.createCall('gerrit', refreshCities);
			wpsRPC.call('getCities', 'country=' + country);
			*/
		}
		return false;
	}	

	function resetFilters(){
		cleanCityList();
		currCity = '';
		currCountry = '';
		$('city').style.display = 'none';
		$('country').options[0].selected = true;
		//$('resetButton').style.display = 'none';
		resize();
	}
	
	function refreshCities(req){
		cleanCityList();
		var dom  = req.responseXML;
		if (dom.getElementsByTagName('row').length == 0){
			$('city').appendChild(Builder.node('option', {}, ["No cities found..."]));
			return;
		}
		$('city').appendChild(Builder.node('option', {}, ["Select a city"]));
		$A(dom.getElementsByTagName('row')).each(
			function(row){
				var city = wps.dom.getFieldValueFromRowNode(row, 'city');
				$('city').appendChild(Builder.node('option', {value:city}, [city]));
			}
		)
		$('city').options[0].selected = true;
	}

	function cleanCityList(){
		$A($('city').options).each(
			(function (anOption){
				$('city').removeChild(anOption);
			}).bind(this)
		);
	}

	function filterCities(elem){
		var value = elem.options[elem.selectedIndex].value;
		if (!value) return false;
		currCity = value;
		loadDefaultContent(currCountry, value);
	}
	
	function filterCountries(elem){
		var value = elem.options[elem.selectedIndex].value;
		if (value == 'reset') {
			resetFilters();
			return;
		}
		$('city').style.display = 'none';
		currCity = '';
		cleanCityList();
		loadDefaultContent(value);
		currCountry = value;
	}
	
	function makeSortable(){
	   /*Sortable.create("mainContainer",
		     {
		     	tag:'img',
		     	overlap:'horizontal',
		     	constraint: false,
		      	onChange:function(){isDragging = true},
		      	onUpdate:function(){setTimeout(function(){isDragging = false}, 250)}
	      	}
	     );		*/
		$('waiter').style.display = 'none';
	   	 if (gwps.is_ie()){
	   	 	// set timeout for MSiE, coz it wont unload the loader
	   	 	setTimeout(
	   	 		function(){$('waiter').style.display = 'none'}, 1000
	   	 	)
	   	 }
	     return; // DISABLE THIS TO GET THE COLOURED BORDERS BACK
	     // set random border-colors at each image
	     $A($('mainContainer').getElementsByTagName('img')).each(
	     	function (img){
	     		var color = getRndColor();
	     		img.style.border ='4px solid '+ color;
	     	}
	     ) 
	}

	function getRndColor(){
		var colors = ['#e5005b', '#e3003b', '#f49d00', '#e40083', '#00a6ea', '#00a0a6', '#e50003', '#67529f', '#00a0a7', '#2d1b85', '#ffed00', '#bdcf00', '#fcc400'];
		var rnd = getRnd(colors.length);
		return colors[rnd];
	}

	function getRnd(topCnt){
		var random = parseInt(Math.random()*10);
		if ( (random <= topCnt)){
			return random;
		}else{
			return getRnd(topCnt);
		}
	}
	
	
	function showAlt(event, imgID, imageMetaData){
		if (!floaterEvents[imgID]) return;
		var currImgData = imageMetaData[imgID];
		var text = currImgData['name'] +', ' + currImgData['city'];
		var uiObj = altFloater.getObjectById('altText');
		uiObj = uiObj.copy(uiObj);
		uiObj.drawPage('', imgID);
		uiObj.setContent(text);		
		globalShownAlt.push(imgID);
		setTimeout(
			(function(){
				globalShownAlt.pop(imgID)
			}).bind(this),
			1500
		);
	}
	
	function unRegisterEvent(imgID){
		floaterEvents[imgID] = 0;
	}
	
	function showTinyText(event, imgID){
		if (isDragging ) return;
		if (globalShownAlt.indexOf(imgID) == -1){
			floaterEvents[imgID] = 1;
			var func = function(){showAlt(event, imgID, imageMetaData)}
			setTimeout(func, 450);
		}
	}

	function uploadStarted(){
		waiter();
		var isOK = false;
		var uploadIframe = $('uploadFrame');
		var iFrameDOM = uploadIframe.contentDocument;
		if ( (iFrameDOM.getElementsByTagName('message').length == 0) && (this.uploadTryCounter < 240) ){   
			uploadTryCounter++;
			setTimeout(uploadStarted, 1000);
			return;
		}
		// we got here, there was a response from servert
		uploadTryCounter = 0;
		//check for errors:
		var messages = iFrameDOM.getElementsByTagName('message');
		$A(messages).each(
			function(message){
				var messageValue = message.childNodes.item(0).nodeValue;
				if (messageValue != "true"){
					// there's an error!
					var errElem = $('errors_for_' + message.getAttribute("field"));
					Element.update(errElem, '');
					Element.update(errElem, messageValue);
				}else{
					isOK = true;
				}
			}
		)	
		unWaiter();
		if (isOK) {
			var tmp = $('uploadFrame').parentNode;
			tmp.removeChild($('uploadFrame'));
			loadDefaultContent('/gerrit_rails/reactions');		
		}
	}
	
	/** Send to friend functions **/
	function addSendToFriendForm(form){
		if (sendToFriendForms.indexOf(form.id) == -1){
			// retrieve a GUID from the mailer-server
			//var iframe = Builder.node('iframe', {width:'200',heigth:'200', frameborder:'0', src:'http://mailer.i-v-o.nl/index.php?page=Home/&action=mailer&rpc=1&xmlReq=<command><call><method>authenticatePost</method><arg>out=plain</arg></call></command>', name:'sendToFriendFrame', id:'sendToFriendFrame'});
			//form.parentNode.appendChild(iframe);
			sendToFriendForms.push(form.id);
		}
	}
	
	function sendMailToFriendForm(form){
		var ok = true;
		//check names:
		if ( (form.elements['name'].value == '' ) || (form.elements['name'].value == 'Your name') ){
			ok = false;
			$('nameError').style.display = 'inline';
			$('nameError').update('Please enter your name');
		}else{
			$('nameError').style.display = 'none';
			$('nameError').update('');
		}
		if ( (form.elements['friendName'].value == '') || (form.elements['friendName'].value == "Your friend's name") ){
			ok = false;
			$('friendNameError').style.display = 'inline';
			$('friendNameError').update('Please enter your friends name');
		}else{
			$('friendNameError').style.display = 'none';
			$('friendNameError').update('');
		}
		
		if (!form.elements['email'].value || !gwps.is_email(form.elements['email'].value)){
			ok = false;
			$('emailError').style.display = 'inline';
			$('emailError').update('Please enter your email');
		}else{
			$('emailError').style.display = 'none';
			$('emailError').update('');
		}
		
		if (!form.elements['friendEmail'].value || !gwps.is_email(form.elements['friendEmail'].value)){
			ok = false;
			$('friendEmailError').style.display = 'inline';
			$('friendEmailError').update('Please enter your friends email');
		}else{
			$('friendEmailError').style.display = 'none';
			$('friendEmailError').update('');
		}
				
		if (ok){
			//finish form make up and send the mofo:
			var func = function(req){ postSendToFriendForm(req, form);}
			var wpsRPC = new wps.rpc;
			wpsRPC.debug = true;
			wpsRPC.createCall('mailer', func);
			wpsRPC.setURI('/mailer/')
			wpsRPC.call('authenticatePost');
		}	
		return false;
	}

	function postSendToFriendForm(req, form){
		var GUID = req.responseXML.getElementsByTagName('message').item(0).childNodes.item(0).nodeValue;
		floaters['Tell your friends'] = false;		
		var func = function(req){$('contactForm').update("Your email was sent!<br/><br/><a onclick=\"openUI('Tell your friends');\">Tell another friend!</a>")}
		var wpsRPC = new wps.rpc;
		wpsRPC.debug = true;
		wpsRPC.createCall('mailer', func);
		wpsRPC.setURI('/mailer/')
		wpsRPC.call('sendMail', 'mailerID=1', 'GUID=' + GUID, 'emailFrom=' + form.elements['email'].value, 'emailTo=' + form.elements['friendEmail'].value, 'senderName=' + form.elements['name'].value, 'friendName=' + form.elements['friendName'].value);
	}
	
	/** TELL-US FORM FUNCTIONS **/
	
	function addTellUsForm(form){
		if (forms.indexOf(form.id) == -1){
			// add autocompletion on city:
			var cityElem = $('city');
			var value = cityElem.getAttribute('value');
			var cityCompletionElem = $('cityCompletion');
			new Ajax.Autocompleter(
						cityElem, 
						cityCompletionElem, 
						gRelRootPath+"Home/", 
						{
							paramName: "city", 
							minChars: 2, 
							parameters:"&action=autocompleter&field=city"
							//updateElement: cityCompletionElem
						}
			);
			forms.push(form.id);
		}
	}
	
	function checkInput(elem){
		var allowedExt = ['jpg', 'gif', 'png'];
		var ok = true;
		if ( (elem.id == 'email') && (elem.value) ){
			if (!gwps.is_email(elem.value)){
				ok = false;
				$('emailError').update('That\'s not a valid email-address.');
			}else{
				$('emailError').update('');
			}
		}

		if ( elem.id == 'name' ){
			if (!elem.value){
				ok = false;
				$('nameError').update('Please enter your name');
			}else{
				$('nameError').update('');
			}
		}

		if ( elem.id == 'image' ){
			var aFileName = elem.value;
			if (aFileName){
				var pathArr = aFileName.split('/');
				if (pathArr.length <= 1){
					var pathArr = aFileName.split('\\');
				}
				var fileName = pathArr[(pathArr.length-1)]; 
				var ext = fileName.split('.');
				ext = ext[(ext.length-1)];
				ext = ext.toLowerCase();
				//var re = /^[\w][\w\.\-]{1,32}$/i;   
				//if(!re.test(fileName)){	
					//$('imageError').update("Invalid file... (please rename file and remove spaces)");
					//	ok = false;
				//}else{
					if (allowedExt.indexOf(ext) == -1){
						$('imageError').update('That file (' + ext + ') is not allowed.');
						ok = false;
						return false;
					}else{
						$('imageError').update('');
					}
				//}
			}
		}


		if ( elem.id == 'city' ){
			if (!elem.value){
				ok = false;
				$('cityError').update('Please enter a city');
			}else{
				$('cityError').update('');
			}
		}

		if ( elem.id == 'country' ){
			if (elem.options[elem.selectedIndex].value == ''){
				$('countryError').update('Please select a country..');
				ok = false;
			}else{
				$('countryError').update('');
			}
		}
		return ok;
	}
	
	function checkTellUsForm(form){
		var ok = true;
		$A(form.elements).each(
			function(elem){
				if (!checkInput(elem)) ok = false;
			}
		)
		if (ok){
			$('submitButton').disabled = 'true';
			//get authString from servert:
			authenticatePost(form);
		}
	}
	
	function sendContactForm(){
		//get values:
		var formName = $('name').value;
		var formEmail = $('email').value;
		var msg = $('message').value
		var ok = true;
		if (!formName){
			Element.toggle($('nameError'));
			ok = false;
		}else{
			$('nameError').style.display='none';
		}
		if ( (!formEmail) || (!gwps.is_email(formEmail)) ){
			Element.toggle($('emailError'));
			ok = false;
		}else{
			$('emailError').style.display='none';
		}
		if (!formName){
			Element.toggle($('messageError'));
			ok = false;
		}else{
			$('messageError').style.display='none';
		}
		if (ok){
			var func = function(req){$('contactForm').update("Your email was sent!")}
			var wpsRPC = new wps.rpc;
			wpsRPC.debug = true;
			wpsRPC.createCall('gerrit', func);
			wpsRPC.call('sendGerritMessage', 'name=' + formName, 'email=' + formEmail, 'message=' + msg);
		}
		return false;		
	}
	
	function authenticatePost(form){
		var func = function(req){setGUID(req, form)}
		var wpsRPC = new wps.rpc;
		wpsRPC.createCall('gerrit', func);
		wpsRPC.call('authenticatePost');
	}
	
	function setGUID(req, form){
		var GUID = wps.dom.getElementValue(req.responseXML.getElementsByTagName('message').item(0));
		var newGUID = '';
		$A(GUID.split('-')).each(
			function(str){
				newGUID +=str;
			}
		)
		if ($('image').value)	$('localWaiter').toggle();
		var hiddenItem = Builder.node('input', {name:'GUID', value:GUID, type:'hidden'});
		form.appendChild(hiddenItem);
		form.action = gRelRootPath + 'Home/';
		form.appendChild(Builder.node('input', {type:'hidden', name:'action', value:'gerrit'}));
		form.appendChild(Builder.node('input', {type:'hidden', name:'rpc', value:'1'}));
		form.appendChild(Builder.node('input', {type:'hidden', name:'subAction', value:'storeReaction'}));
		form.target = "gerritUpload"; 
//		form.target = "_blank";
		// 	build temp iframe
		var iframe = Builder.node('iframe', {width:'0',heigth:'0', frameborder:'0', name:'gerritUpload', id:'gerritUpload'});
		form.parentNode.appendChild(iframe);
		form.submit();
		//disableForm();
		if ($('image').value){
			var hasFile = true;		
		}else{
			var hasFile = false;		
		}
		Element.toggle('plsWait');
		checkUploadStatus(hasFile);
	}	

	function checkUploadStatus(){
		var uploadIframe = $('gerritUpload');
		if (gwps.is_ie()){
			var msgCount = window.frames['gerritUpload'].document.getElementsByTagName('message').length;
		}else{
			var iFrameDOM = uploadIframe.contentDocument;
			var msgCount = iFrameDOM.getElementsByTagName('message').length;
		}
		if ( (msgCount == 0) && (uploadTryCounter < 240) ){ 
			uploadTryCounter++;
			setTimeout(checkUploadStatus, 500);
			return;
		}
		//get payoff text:
		new Ajax.Updater(
			$('gerritUpload').parentNode, 
			gRelRootPath + 'Thanks/', 
				{
					asynchronous:true, 
					evalScripts:true,
					onLoading : waiter,
					onLoaded : unWaiter,
					onComplete :function(transport){ if (transport.status=='404' || transport.status=='501' ) $('gerritUpload').parentNode.update('?... Something went wrong!! Please contact the webmaster at info@i-v-o.nl'); }
				}
			);
		Element.toggle('plsWait');
		Element.toggle('localWaiter');
		resize();
	} 
	
	
	
// UI-Library OVERRIDES

	wps.ui.alttext.prototype.notify = function(){
		var contentContainer = document.createElement('div');
		contentContainer.setAttribute('id', 'content_' + this.instID);

		var tbody = Builder.node('tbody');
		var table = Builder.node('table', {cellpadding:0, cellspacing:0, border:0}, [tbody]);
		
		var row = Builder.node('tr');
		tbody.appendChild(row);
		
		var spannedCell = Builder.node('td', {colspan:'2'});
		row.appendChild(spannedCell);

		var img = Builder.node('img', {src:gStaticPath + 'images/freubeltje.gif', align:'left'});
		var row = Builder.node('tr');
		tbody.appendChild(row);
		row.appendChild(Builder.node('td', {align:'left'}, [img]));
		row.appendChild(Builder.node('td', {align:'left'}));
		
		contentContainer.appendChild(table);
		this.contentContainer = spannedCell; 
		this.outputNode = contentContainer;
		this.setProperties();

	}

	wps.ui.alttext.prototype.draw = function(container, imgID){
		if (this.drawn) return;

		var screenSize = Element.getDimensions(document.body);
		var absRight = screenSize.width;
		var img = $('img_' + imgID);
		var imgPos = Position.cumulativeOffset(img);
		var currXpos = (img.width/2 ) + imgPos[0];
		var currYpos = imgPos[1] - 45;
		if (currYpos < 0) currYpos = -10; // first row, keep image below top of viewport

		this.outputNode.style.left =  currXpos;
		this.outputNode.style.top =  currYpos;

		if (!this.readyToDraw){
			setTimeout( (function(){this.draw(container, event);}).bind(this), 1000);
		}else{
			$A(this.uiObjects).each(
				(function(aUIObject){
					if (this.debug) wps.debug.log('Drawing childObject ' + aUIObject.instID + ' from parent : ' + this.instID + ' to Container : '+ this.outputNode.id);
					aUIObject.draw(this.contentContainer, event);
				}).bind(this)
			)
		}
		if (this.pob){
			if (!container){
				container = Builder.node('div', {style:'position:absolute;top:20px;left:20px;display:inline;z-index:99;'});
			 	/*container = document.createElement('div');
			 	container.style.position = 'absolute';
			 	container.style.top = '20px';
			 	container.style.left = '20px';
			 	container.style.display = 'inline';
				container.style.zIndex= '99';*/
				document.getElementsByTagName('body').item(0).appendChild(container);
			}
			container.appendChild(this.outputNode);
		}
		this.outputNode.onclick = this.setForeGround.bind(this);
		//this.applyDropShadows(this.outputNode,'shadow1');
		//this.outputNode.setAttribute('class', 'shadowMe');
		this.outputNode.style.display = 'block';
		// make header draggable:
		this.dragger = new Draggable(
										this.outputNode, 
										{
											revert : false
										}
									);
		this.drawn = true;
		setTimeout(
			this.closeMe.bind(this),
			(this.timeOut * 1000)
		);
		
	}

