XTN = {}; //for Lib - sharing

(function(){ //alles kapseln wegen window scope
	

//+++ helpers +++++++++++++++++++++++
function dbg(){
	if(console.info) console.info(arguments);
}

function reinitImgRollovers(){
	$(".iActObj")
	.bind("mouseenter",imgOnHover)
	.bind("mouseleave",imgOnOut);
}
XTN.reinitImgRollovers = reinitImgRollovers; //shortcut

function imgOnHover(e){
	var imgObj = $(this);
	imgObj.filter(":not(.actItem)").setImgHi();
}

function imgOnOut(e){
	var imgObj = $(this);
	imgObj.filter(":not(.actItem)").setImgLo();
}

jQuery.fn.extend({
	tglClass: function(cssClass,bool){
		return bool? this.addClass(cssClass) : this.removeClass(cssClass);
	},

  left: function(xPos){
    if(xPos==undefined) return this.offset().left;
    else {
      this.css({left:xPos+"px"});
      return this;
    }
  },

  top: function(yPos){
    if(yPos==undefined) return this.offset().top;
    else {
      this.css({top:yPos+"px"});
      return this;
    }
  },

	setImgHi: function(){
		return this.switchSrc("_lo.","_hi.");
	},

	setImgLo: function(){
		return this.switchSrc("_hi.","_lo.");
	},
	
  switchSrc: function(val,newVal){
  	if(this.length) this.attr("src",this.attr("src").replace(val,newVal));
    return this;
	},
	
  opacity: function(val){
  	if(val || val===0){return this.css({"opacity":val});}
    else return this.css("opacity");
  },
  
  tglFadeIn: function(speed, callback){
  	return this.stop(true).hide().opacity(1).fadeIn(speed,callback); //opacity = ziel-opacity!
  },
  
  tglFadeOut: function(speed, callback){
  	if(this.is(":visible"))	return this.stop(true).show().opacity(1).fadeOut(speed,callback); //opacity = ziel-opacity!
  	else return this.hide(); //kein fading erzwingen wenn hidden
  },

	tglFadeInXB: function(speed, callback){
		if($.browser.msie) return this.show(0, callback); //IE transparency bug: just show/hide, no animation
		else return this.tglFadeIn(speed, callback);
	},
	
	tglFadeOutXB: function(speed, callback){
		if($.browser.msie) return this.hide(0, callback); //IE transparency bug: just show/hide, no animation
		else return this.tglFadeOut(speed, callback);
	},

  outerHtml: function(){
    return $( $('<div></div>').html(this.clone())).html();
  },

	getIdFromClass: function(prefix){
  	var retVal = "";
   	if(this.attr("class")){ //error handling
    	$.each(this.attr("class").split(/\s+/), function(){
       	if(this.indexOf(prefix)!=-1) retVal = this.replace(prefix, "");
     	});
   	}
   	return retVal;
	}
  
});

//+++ classes +++++++++++++++++++++++

var gx_NewsScroller = (function gx_NewsScroller(){

/*
	public methods:
		reinitNewsScroller()
		
	private methods:
		_startAutoSkip()
		_endAutoSkip()
		_skipNext()
		_modDomForInfinite()
		_clk_skipPane(e)
		_skipToPane(nextPane,dir)
		_updateControls()
		_updateCounter()
		_prefixDigit(intVal)
		
	global vars:
		gAutoSkipTime
		gPaneWidth
		gCurrPane
		gTotalPanes
		gAutoSkipInterval
		gInMoving
		
*/
	
	var gAutoSkipTime = 12; //sekunden
	
	var gPaneWidth, gCurrPane, gTotalPanes, gAutoSkipInterval;
	var gInMoving = false;
	
	function reinitNewsScroller(){
		var panesObj = $("#newsScrollerPanes");
		
		if(panesObj.length){
			var allOrigPaneObjs = panesObj.find(".newsScrollerPane");
			gPaneWidth = parseInt(allOrigPaneObjs.eq(0).css("width"));
			gCurrPane = 0;
			gTotalPanes = allOrigPaneObjs.length;
		
			_updateControls();
		
			_modDomForInfinite();

			$("#newsScrollerArrowPrev").bind("click", {dir:"prev"}, _clk_skipPane);
			$("#newsScrollerArrowNext").bind("click", {dir:"next"}, _clk_skipPane);
			$("#newsScrollerBtnPlay").bind("click", {dir:"next"}, _clk_playPause);
		
			if(allOrigPaneObjs.length>1) _startAutoSkip();

			//bug: IE8 lässt teile der anderen panes raussneaken (grafik bug). 
			//fix: nicht sichtbare panes ausblenden (mit visibility, damit x position erhaltne bleibt)
			if($.browser.msie && $.browser.version>=8) {
				var allPaneObjs = panesObj.find(".newsScrollerPane"); //neu einlesen, weil nach _modDomForInfinite() gibts ja zus. panes
				allPaneObjs.not(":eq(1)").css("visibility","hidden"); //alle ausblenden ausser sichtbarer pane
			}
		} else {
			_endAutoSkip();
		}
	}
	
	function _clk_playPause(e){
		if(gAutoSkipInterval) _endAutoSkip();
		else _startAutoSkip();
	}
	
	function _startAutoSkip(){
		_startInterval();
		var imgBtnObj = $("#newsScrollerBtnPlay");
		imgBtnObj
		.attr("src","img/icon_pause.png")
		.attr("title","stop auto skipping");
	}
	
	function _endAutoSkip(){
		_stopInterval();
		var imgBtnObj = $("#newsScrollerBtnPlay");
		imgBtnObj
		.attr("src","img/icon_play.png")
		.attr("title","start auto skipping");
	}
	
	function _startInterval(){
		_stopInterval(); //first: clean up interval
		gAutoSkipInterval = setInterval(_skipNext,gAutoSkipTime*1000);
	}
	
	function _stopInterval(){
		if(gAutoSkipInterval) {
			clearInterval(gAutoSkipInterval);
			gAutoSkipInterval = false;
		}
	}

	function _skipNext(){
		$("#newsScrollerArrowNext").trigger("click");
	}

	function _modDomForInfinite(){
		
		//füge zus. div an (letztes nochmal am anfang, erstes nochmal am ende)
		
		var panesObj = $("#newsScrollerPanes");
		var allPaneObjs = panesObj.find(".newsScrollerPane");
		
		if(gTotalPanes == allPaneObjs.length){ 
			var firstPaneObj = allPaneObjs.eq(0);
			var lastPaneObj = allPaneObjs.filter(":last");
			lastPaneObj.after(firstPaneObj.clone());
			firstPaneObj.before(lastPaneObj.clone());
			panesObj.left(-gPaneWidth); //correct x, since first pane was added
		}
	}
	
	function _clk_skipPane(e){
		if(!gInMoving) {
			//only, if running
			if(gAutoSkipInterval)	_startInterval(); //start Interval fresh (damit nicht autoskip passiert, wenn gerade manuell geklickt)
			
			var dir = e.data.dir;
		
			var nextPane;
			if(dir=="next") nextPane = gCurrPane < gTotalPanes-1? gCurrPane+1 : 0;
			else if(dir=="prev") nextPane = gCurrPane > 0? gCurrPane-1 : gTotalPanes-1;

			_skipToPane(nextPane,dir);
		}
	}
	
	function _skipToPane(nextPane,dir){
		var panesObj = $("#newsScrollerPanes");
		var allPaneObjs = $(".newsScrollerPane");
		
		var newX, correctXAfterAnimation;
		
		if(gCurrPane==gTotalPanes-1 && nextPane==0 && dir=="next"){ //jump first to additional LAST pane
			newX = -((gCurrPane+2)*gPaneWidth);
			correctXAfterAnimation = -gPaneWidth;
		} else if(gCurrPane==0 && nextPane==gTotalPanes-1 && dir=="prev") { //jump first to additional FIRST pane
			newX = 0;
			correctXAfterAnimation = -(gTotalPanes*gPaneWidth);
		} else { //normal 
			newX = -((nextPane+1)*gPaneWidth);
			correctXAfterAnimation = newX; //no change
		}

		//store
		gCurrPane = nextPane; 
		
		if($.browser.msie && $.browser.version>=8) allPaneObjs.css("visibility","visible"); //anzeigen für sliding animation
		
		gInMoving = true;
		panesObj.animate({
			left:newX+"px"
		},300,function(){
			gInMoving = false;
			panesObj.left(correctXAfterAnimation);
			if($.browser.msie && $.browser.version>=8) allPaneObjs.not(":eq("+(gCurrPane+1)+")").css("visibility","hidden"); //ausblenden NACH animation
		});
        		
		//update counter
		_updateCounter();
		
		/*
		wenn KEIN endlosdurchlauf erwünscht: NICHT _modDomForInfinite() machen und diesen code benutzen:
		//store
		gCurrPane = nextPane; 
		//jump to
		var newX = -(gCurrPane*gPaneWidth);
		
		gInMoving = true;
		$("#newsScrollerPanes").animate({
			left:newX+"px"
		},300,function(){
			gInMoving = false;
		});
        		
		//update counter
		_updateCounter();
		*/
	}
	
	function _updateControls(){
		if(gTotalPanes==1) $("#newsScrollerControlBar").hide();
		else _updateCounter();
	}
	
	function _updateCounter(){
		$("#newsScrollerCounterCurr").html(_prefixDigit(gCurrPane+1));
		$("#newsScrollerCounterTotal").html(_prefixDigit(gTotalPanes));
	}
	
	function _prefixDigit(intVal){
		var retVal = intVal<10? "0"+intVal : intVal;
		return retVal;
	}
	
	return {
		reinitNewsScroller:reinitNewsScroller
		
	};
})();


var gx_page = (function gx_page(){

/*
	public methods:
		initPage()
		reinitInteraction()

	private methods:
		_reinitFlash()
		
*/

	function initPage(){
		$("body").addClass("jsEnabled"); //markierung
	
		reinitInteraction();
	}

	function reinitInteraction(){
		reinitImgRollovers();
		gx_smoothLoad.reinitSmoothLinks();
		gx_members.reinitMembersLinks();
		gx_toggler.reinitTogglers();
		gx_forms.reinitForms();
		reinitLightbox();
		gx_NewsScroller.reinitNewsScroller();
		_reinitFlash();
	}
	
	function _reinitFlash(){
		
		//--- logo
		var logoBox = $("#pageLogo");
		
		if(!logoBox.find("embed,object").length){
			logoBox.flashembed({ 
  	  	src:"flash/cimt_logo_ani.swf", 
	  		version:[9,0],
  			width:174,
	  		height:94,
		  	wmode:'transparent'
  		}); 
  	}

		//--- countdown
		//XB: flashplayer in IE hat grafikbug, wenn flash dynamisch eiingesetzt wird. dehalb steht flash schon im markup drin
		/*
		var countdownBox = $("#flashCounterBox");
		if(countdownBox.length){
			countdownBox.flashembed({ 
  	  	src:"flash/countdown.swf", 
	  		version:[9,0],
  			width:380,
				height:110,
		 		wmode:'transparent'
  		}); 
		}	
		*/		
  	
	}

	return {
		initPage:initPage,
		reinitInteraction:reinitInteraction
	};
	
})();


var gx_smoothLoad = (function gx_smoothLoad(){

/*
	public methods:
		reinitSmoothLinks()
		
	private methods:
		_clk_smoothLink(e)
		_loadNewPage(url)
		_switchObjects(oldObj,newObj,animationMode)
		_updateSpecialPageContents(data,url)
		_updateContents(data,url)
		_updateNavigation(data,url)
		_updateBg(data,url)

	global vars:
		_glo_isSmoothFading		Boolean
	
*/

	var _glo_isSmoothFading = false; //check if already switching to prevent "double"-click
	
	function reinitSmoothLinks(){
		$("a").bind("click",_clk_smoothLink);
	}

	function _clk_smoothLink(e){
		var targetUrl = $(this).attr("href");
		if(targetUrl!="" && targetUrl.indexOf("/")==-1 && targetUrl.indexOf("mailto:")==-1 ){
			
			//XB: flashplayer in IE hat grafikbug, wenn flash dynamisch eingesetzt wird. dehalb muss home direkt geladen werden!
			if($.browser.msie && targetUrl.indexOf("index.htm")!=-1) return true;
			
			if(!_glo_isSmoothFading) _loadNewPage(targetUrl);
			if(this.blur) this.blur(); //remove link focus
			return false;
		}
	}
	
	function _loadNewPage(url){
		_glo_isSmoothFading = true;
		$.get(url,{},
	  	function(data){
	  		setTimeout(function(){_glo_isSmoothFading=false;},500);
				_updateContents(data,url);
				_updateNavigation(data,url);
				_updateBg(data,url);
				_updateSpecialPageContents(data,url);
	  	},
	  	"html");
	}
	
	function _switchObjects(oldObj,newObj,animationMode){
		if(animationMode=="fadeSeriell"){
			oldObj.fadeOut(300,function(){
				if(newObj.length) {
					newObj.hide().insertBefore(oldObj).fadeIn(300);
					gx_page.reinitInteraction();
				}
				oldObj.remove();
			});
		} else if(animationMode=="crossFade"){
			if(newObj.length) {
				newObj.hide().insertBefore(oldObj).fadeIn(300);
				gx_page.reinitInteraction();
			}
			oldObj.fadeOut(300,function(){
				oldObj.remove();
			});
		} else if(animationMode=="noAni") {
			if(newObj.length) {
				newObj.insertAfter(oldObj);
				gx_page.reinitInteraction();
			}
			oldObj.remove();
		}
	}
	
	function _updateSpecialPageContents(data,url){
		$("#pageLogo").tglClass("pageLogoMeta",url.indexOf("meta_")!=-1); //bei META andere position
		$("#newsTeaser").tglClass("newsTeaserMeta",url.indexOf("meta_")!=-1); //bei META nicht sichtbar
		if(url=="index.htm"){
			 if(!$("#homeTextImg,#homeTextBlock").length) $("#homeTextImg,#homeTextBlock",data).insertAfter("#mainContBot");
		} else {
			 $("#homeTextImg,#homeTextBlock").fadeOut(300,function(){
			 	$(this).remove();
			 });
		}
	}
	
	function _updateContents(data,url){
		var oldContents = {
			headline:$("#mainContTop img"),
			body:$("#mainContCenterInner")
		};
		var newContents = {
			headline:$("#mainContTop img",data),
			body:$("#mainContCenterInner",data)
		};
		_switchObjects(oldContents.headline,newContents.headline,"fadeSeriell");
		_switchObjects(oldContents.body,newContents.body,"fadeSeriell");
	}
	
	function _updateNavigation(data,url){
		var oldContents = {
			subNav:$(".subNav"),
			mainNav:$("#mainNav")
		};
		var newContents = {
			subNav:$(".subNav",data),
			mainNav:$("#mainNav",data)
		};
		
		//XB: IE7 hat probleme, die navi item für item zu ersetzten: also komplett ersetzen
		if($.browser.msie && $.browser.version<=7){
			//alte hatte keine subnavi
			if(!oldContents.subNav.length) oldContents.subNav = $("<div/>").insertAfter("#mainNav"); //damit es eine position (obj) gibt, um die neue subnav einzuhängen
			_switchObjects(oldContents.mainNav,newContents.mainNav,"noAni");
			_switchObjects(oldContents.subNav,newContents.subNav,"crossFade");
			
		} else {
			_overwriteNavigation(oldContents.mainNav,newContents.mainNav);
			if(!oldContents.subNav.length){ //alte hatte keine subnavi
				//damit es eine position (obj) gibt, um die neue subnav einzuhängen
				oldContents.subNav = $("<div/>").insertAfter("#mainNav"); 
				_switchObjects(oldContents.subNav,newContents.subNav,"crossFade");
			} else {
				//neue subnavi = alte subnavi
				if(oldContents.subNav.attr("class")==newContents.subNav.attr("class")){
					_overwriteNavigation(oldContents.subNav,newContents.subNav);
				//andere/keine neue subnavi
				} else {
					_switchObjects(oldContents.subNav,newContents.subNav,"crossFade");
				}
			}
		}
	}
	
	function _updateBg(data,url){
		var oldBg = $("#headerBg img");
		var newBg = $("#headerBg img",data);
		if(newBg.length) {
			if(oldBg.attr("src")!=newBg.attr("src")){ //bei gleicher src do nothing
				$("<img/>").attr("src",newBg.attr("src")); //preload while animating
				oldBg.fadeOut(300,function(){
					oldBg.attr("src",newBg.attr("src")).fadeIn(300);
				});
			}
		} else {
			oldBg.fadeOut(300);
		}
	}

	function _overwriteNavigation(pageNaviObj,newNaviObj){
	
		function inc_cloneAttr(attrName, oldObj, newObj){
			newObj.attr(attrName)? oldObj.attr(attrName,newObj.attr(attrName)) : oldObj.removeAttr(attrName);
		}
		
		function inc_isSameBaseImg(img1, img2){
			//compare, if 2 images are the same (except they can differ in _lo./_hi./_act. state
			var baseRegExp = /(_act.|_lo.|_hi.)/;
			return img1.attr("src").replace(baseRegExp,"")==img2.attr("src").replace(baseRegExp,"");
		}
		
		var allPageNaviObjLinks = pageNaviObj.find("a");
		var allNewNaviObjLinks = newNaviObj.find("a");
		
		allPageNaviObjLinks.each(function(i){
			var pageLinkObj = $(this);
			var newLinkObj = allNewNaviObjLinks.eq(i);
			if(pageLinkObj.attr("href")==pageLinkObj.attr("href")){ //check: is it really correlating link
				//--- link obj
				inc_cloneAttr("class", pageLinkObj, newLinkObj); //clone classes
				inc_cloneAttr("id", pageLinkObj, newLinkObj); //clone id
				
				//--- img obj
				var pageLinkImgObj = pageLinkObj.find("img");
				var newLinkImgObj = newLinkObj.find("img");
				if(pageLinkImgObj.length && newLinkImgObj.length){
					if(inc_isSameBaseImg(pageLinkImgObj,newLinkImgObj)){
						inc_cloneAttr("class", pageLinkImgObj, newLinkImgObj); //clone classes
						inc_cloneAttr("id", pageLinkImgObj, newLinkImgObj); //clone id
						inc_cloneAttr("src", pageLinkImgObj, newLinkImgObj); //clone src
					}
				}
			}
		});
		
	}	
	
	return {
		reinitSmoothLinks:reinitSmoothLinks
	};
	
})();


var gx_forms = (function gx_forms(){

/*
	public methods:
		reinitForms()
		
	private methods:
		_ent_formfieldsUL(e)
		_lea_formfieldsUL(e)
		_clk_registerPreSubmit(e)
		_clk_registerChangeSummary(e)
		_chg_registerOnTypeChange(e)
		_chg_registerOnInvitedChange(e)
		_validate_createTooltip(str)
		_validate_validateForm(callback)
		_validate_markFieldError(opt)
		_validate_handleCorrection(listenerObj,eventType,markedObj,ttObj)
		_validate_unmarkFieldError(markedObj,ttObj)
		_foc_formfields_inputOnFocus(e)
		_blr_formfields_inputOnBlur(e)
		_chg_formfields_clickFileInput(e)
		_formfields_getSelectedRadio(radioName)
		_clk_submitFormAbstract(e)
		_clk_submitFormContact(e)
		_clk_submitFormRegister()
		_formsShowLoading()
		_formsShowError()
		_formsShowSuccess()
		_getSerializedForm(formObj)
	
	global vars:
		_glo_registerData		{}
		
*/

	var _glo_registerData;
	
	function reinitForms(){
		$("#inpUL").bind("change",_chg_formfields_clickFileInput);
		$("#submitBtnAbstract").bind("click",_clk_submitFormAbstract);
		$("#submitBtnContact").bind("click",_clk_submitFormContact);
		$("#submitBtnRegister1").bind("click",_clk_registerPreSubmit);
		$("#submitBtnRegister2").bind("click",_clk_submitFormRegister);
		$("#changeBtnRegister").bind("click",_clk_registerChangeSummary);
		$("#inpRegisterType").bind("change",_chg_registerOnTypeChange);
		$("#inpInvitedAs").bind("change",_chg_registerOnInvitedChange);
		
		$("input,textarea")
		.bind("focus",_foc_formfields_inputOnFocus)
		.bind("blur",_blr_formfields_inputOnBlur);
		
		$("#inpUL")
		.bind("mouseenter",_ent_formfieldsUL)
		.bind("mouseleave",_lea_formfieldsUL);
	}
	
	function _ent_formfieldsUL(e){
		$("#browseBtn").switchSrc("_lo","_hi");
	}
	
	function _lea_formfieldsUL(e){
		$("#browseBtn").switchSrc("_hi","_lo");
	}
	
	function _clk_registerPreSubmit(e){ //"pre" submit for confirm
		_validate_validateForm(function(){
			
			//save the vals
			_glo_registerData = {
				regType:$("#inpRegisterType").val(),
				invitedAs:$("#inpRegisterType").val()=="invited"? $("#inpInvitedAs").val() : false,
				firstName:$("#inpFirstName").val(),
				lastName:$("#inpLastName").val(),
				street:$("#inpStreet").val(),
				city:$("#inpCity").val(),
				email:$("#inpEmail").val(),
				institution:$("#inpInstitution").val(),
				ticket:_formfields_getSelectedRadio("ticket").next(".CBText").html().replace("** ","").replace("€","EUR"),
				socialEvent:$("#inpTicketSocial").is(":checked")? $("#inpTicketSocial").next(".CBText").html().replace("€","EUR") : false,
				hotelName: _formfields_getSelectedRadio("hotel").hasClass("idNoHotel")? false : _formfields_getSelectedRadio("hotel").parent().prevAll("h1").eq(0).text(),
				hotelRoom: _formfields_getSelectedRadio("hotel").next(".CBText").html().replace("€","EUR"),
				arrival: $("#inpDateArrival").val(),
				departure: $("#inpDateDeparture").val(),
				updates: $("#inpInfoUpdates").is(":checked")? $("#inpInfoUpdates").next(".CBText").html() : false
			};
			
			//show summary
			var reg = _glo_registerData; //shortcut
			var summaryHtml = "";
		
			summaryHtml += '<b>Type of register</b><br />';
			summaryHtml += reg.regType+"<br /><br />";
			if(reg.invitedAs) {
				summaryHtml += '<b>Invited as</b><br />';
				summaryHtml += reg.invitedAs+"<br /><br />";
			}
			summaryHtml += '<b>Personal data</b><br/>';
			summaryHtml += '<table class="tableMini"><tr><td>First name:</td><td>'+reg.firstName+'</td></tr>';
			summaryHtml += '<tr><td>Last name:</td><td>'+reg.lastName+'</td></tr>';
			summaryHtml += '<tr><td>Street, No.:</td><td>'+reg.street+'</td></tr>';
			summaryHtml += '<tr><td>ZIP, City:</td><td>'+reg.city+'</td></tr>';
			summaryHtml += '<tr><td>Email:</td><td>'+reg.email+'</td></tr>';
			summaryHtml += '<tr><td>Institution:</td><td>'+reg.institution+'</td></tr>';
			summaryHtml += '</table><br />';
			summaryHtml += '<b>Ticket</b><br />';
			summaryHtml += reg.ticket+"<br /><br />";
			if(reg.socialEvent) {
				summaryHtml += '<b>Social event ticket</b><br />';
				summaryHtml += reg.socialEvent+"<br /><br />";
			}
			summaryHtml += '<b>Hotel</b><br />';
			if(reg.hotelName) summaryHtml += reg.hotelName+"<br />";
			summaryHtml += reg.hotelRoom+"<br /><br />";
			summaryHtml += '<b>Arrival/Departure</b><br />';
			summaryHtml += '<table class="tableMini"><tr><td>Arrival:</td><td>'+reg.arrival+'</td></tr>';
			summaryHtml += '<tr><td>Departure:</td><td>'+reg.departure+'</td></tr></table><br />';
			if(reg.updates) {
				summaryHtml += '<b>News</b><br />';
				summaryHtml += reg.updates+"<br /><br />";
			}
			
			$("#registerSummary").html(summaryHtml);
			$("#registerBoxForm").fadeOut(300,function(){
				$("#registerBoxConfirmCheck").fadeIn(300);
			});
		});
	}
	
	function _clk_registerChangeSummary(e){
		$("#registerBoxConfirmCheck").fadeOut(300,function(){
			$("#registerBoxForm").fadeIn(300);
		});
	}
	
	function _chg_registerOnTypeChange(e){
		var newVal = $(this).val();
		$(".formAddInfoText").hide();
		var invitedBox = $("#invitedAsBox");
		if(newVal=="invited") {
			invitedBox.show();
			_chg_registerOnInvitedChange();
		} else {
			invitedBox.hide();
			if(newVal=="exhibitor") $("#registerFormInfoExhibitorGenenral").show();
		}
	}
	
	function _chg_registerOnInvitedChange(e){
		var selectInvited = $("#inpInvitedAs");
		$(".formAddInfoText").hide();
		if(selectInvited.val()=="speaker") $("#registerFormInfoSpeakerGenenral,#registerFormInfoSpeakerHotel").show();
		else if(selectInvited.val()=="chairman") $("#registerFormInfoChairmanGenenral").show();
	}
	
	function _validate_createTooltip(str){
		var retVal = $('<table class="TTVali_TT"><tr><td class="TTVali_left"></td><td class="TTVali_mid"><div class="TTVali_contents">'+str+'</div></td><td class="TTVali_right"></td></tr></table>');
		return retVal;
	}
	
	function _validate_validateForm(callback){
		var hasErrors= false;
		
		$(".valiNotEmpty:visible").each(function(){
			var fieldObj = $(this);
			if($.trim(fieldObj.val())=="") {
				hasErrors = true;
				_validate_markFieldError({fieldObj:fieldObj,mode:"notEmpty"});
			}
		});
		
		$(".valiSelect:visible").each(function(){
			var fieldObj = $(this);
			if(fieldObj.val()=="") {
				hasErrors = true;
				_validate_markFieldError({fieldObj:fieldObj,mode:"select"});
			}
		});
	
		$(".valiUL:visible").each(function(){
			var fieldObj = $(this);
			if(fieldObj.val()=="") {
				hasErrors = true;
				_validate_markFieldError({fieldObj:fieldObj,mode:"UL"});
			}
		});
	
		$(".valiRadioGroup:visible").each(function(){
			var hlObj = $(this);
			var radioGroupName = hlObj.getIdFromClass("idRadioName_");
			var selRadioObj = _formfields_getSelectedRadio(radioGroupName);
			if(!selRadioObj){
				hasErrors = true;
				_validate_markFieldError({hlObj:hlObj,mode:"radioGroup",radioGroupName:radioGroupName});
			}
		});
		
		if(!hasErrors) callback();
		else $(document).scrollTop($(".TTVali_TT").eq(0).top()); //jump to first tooltip
	}
	
	function _validate_markFieldError(opt){
		var markedObj = opt.mode=="radioGroup"? opt.hlObj : opt.fieldObj;
		if(!markedObj.data("hasError")){
			var ttText =
				opt.mode=="radioGroup"? "Please select one option" :
				opt.mode=="select"? "Please select" :
				opt.mode=="UL"? "Please select a file" :
				opt.mode=="notEmpty"? "Please fill in" : "";
			
			var ttHoldingObj = opt.mode=="radioGroup"? opt.hlObj : opt.fieldObj.parent(); //bei radioGroup wird tt direkt in hlObj eingehängt
			var correctionListenerObj = 
				opt.mode=="radioGroup"? $(":radio[name='"+opt.radioGroupName+"']") : 
				opt.mode=="UL"? markedObj.parent() : markedObj;
	
			var ttObj = _validate_createTooltip(ttText).hide().appendTo(ttHoldingObj).fadeIn(300);
			markedObj.addClass("valiHi").data("hasError",true);
			
			//--- correction listener
			var eventType = opt.mode=="UL" || opt.mode=="radioGroup"? "click" : "focus"; //Safari und Chrome kennen für radio buttons kein "focus"!
			_validate_handleCorrection(correctionListenerObj,eventType,markedObj,ttObj);
		}
	}
	
	function _validate_handleCorrection(listenerObj,eventType,markedObj,ttObj){
		function validate_correctErrorField(e){
			_validate_unmarkFieldError(markedObj,ttObj);
			listenerObj.unbind(eventType,validate_correctErrorField); //remove listener
		}		
		listenerObj.bind(eventType,validate_correctErrorField);
	}
	
	function _validate_unmarkFieldError(markedObj,ttObj){
		markedObj.removeClass("valiHi").data("hasError",false);
		ttObj.fadeOut(300,function(){ttObj.remove();});
	}
	
	function _foc_formfields_inputOnFocus(e){
		var inpObj = $(this);
		inpObj.add(inpObj.next("label")).addClass("inputHi");
	}
	
	function _blr_formfields_inputOnBlur(e){
		var inpObj = $(this);
		inpObj.add(inpObj.next("label")).removeClass("inputHi");
	}
	
	function _chg_formfields_clickFileInput(e){
		$("#outUL").val($(this).val());
	}
	
	function _formfields_getSelectedRadio(radioName){
		var retObj = false;
		$(":radio[name='"+radioName+"']").each(function(){
			var radioObj = $(this);
			if(radioObj.is(":checked")) {
				retObj = radioObj;
				return false;
			}
		});
		return retObj;
	}
	
	function _clk_submitFormAbstract(e){
		_validate_validateForm(function(){	
			_formsShowLoading();
			var firstName = $("#inpFirstName").val();
			var lastName = $("#inpLastName").val();
			var email = $("#inpEmail").val();
			var shorttalk = $("#inpShorttalk").is(":checked")? "interested" : "not interested";
			var fileObj = $("#inpUL");
			
			//$("#abstractForm").get(0).submit();
	
			//--- create iframe:
			var iframe = $("#ULIframe").length? $("#ULIframe") : $('<iframe id="ULIframe"></iframe>').appendTo("body");
			iframe.one("load",function(){
				iframe.contents().append('<html><head></head><body></body></html>');
				var iframeBody = iframe.contents().find("body");
				//--- fill with data
				iframeBody.append('<form id="iframeForm" action="php/submit_abstract.php" method="POST" enctype="multipart/form-data"></form>');
				var iframeForm = iframeBody.find("#iframeForm");
				iframeForm.append(fileObj); //use original file-obj!
				iframeForm.append('<input type="hidden" name="firstName" value="'+firstName+'" />');
				iframeForm.append('<input type="hidden" name="lastName" value="'+lastName+'" />');
				iframeForm.append('<input type="hidden" name="email" value="'+email+'" />');
				iframeForm.append('<input type="hidden" name="shorttalk" value="'+shorttalk+'" />');
				//--- submit
				iframe.one("load",function(){
						var returnVal = iframe.contents().find("body").html(); //lies aus HTML
						//--- after submitting form
						//success
						_formsShowSuccess();
						//error
						//_formsShowError();
						//iframe.remove(); //gibt error im firefox
						
				}); //--- end iframe after posting
				iframeForm.submit();
			}); //--- end iframe creation
		});
	}
	
	function _clk_submitFormContact(e){
		_validate_validateForm(function(){	
			var formVals = _getSerializedForm($("#contactForm"));
			_formsShowLoading();
			
			$.post("php/submit_contact.php",formVals,
	  		function(data){
	  			if(data=="OK") _formsShowSuccess(); //success
					else _formsShowError(); //error
		  	});
		 });
	}
	
	function _clk_submitFormRegister(){ //real submit after doublecheck by user
		_formsShowLoading();
		$.post("php/submit_register.php",_glo_registerData,
	  	function(data){
	  		if(data=="OK") _formsShowSuccess(); //success
				else _formsShowError(); //error
	  	});	
	}
	
	function _formsShowLoading(){
		var loadingBox = $('<div id="formLoadingBox">Loading</div>');
		loadingBox.insertAfter($("#formFormBox").hide()).show();
	}
	
	function _formsShowError(){
		var errorBox = $('<div id="formErrorBox">An error occured. Your request could not be processed. Please try again later</div>');
		errorBox.insertAfter($("#formLoadingBox").hide()).show();
	}
	
	function _formsShowSuccess(){
		$("#formLoadingBox").hide();
		$("#formReturnBox").show();
	}
		
	function _getSerializedForm(formObj){
		var retVal = {};
		var inputs = formObj.find("input,textarea,select");
		inputs.each(function(){
			var input = $(this);
			var name = input.attr("name")? input.attr("name") : ""; //prevent error
			var inputVal = input.val();
			retVal[name] = inputVal;
		});
		return retVal;
	}
	
	return {
		reinitForms:reinitForms
	};
	
})();


var gx_members = (function gx_members(){

/*
	public methods:
		reinitMembersLinks()
		
	private methods:
		_cus_onExpandMember(e)
		_cus_onCollapseMember(e)
		_clk_membersLink(e)
		_onHover(e)
		_onOut(e)
		
*/

	function reinitMembersLinks(){
		var previewObj = $("#js_membersPreviewObj");
		if(!previewObj.length) $('<div id="js_membersPreviewObj"><img /></div>').appendTo("body");
	
		$(".membersLink")
		.bind("click",_clk_membersLink)
		.bind("mouseenter",_onHover)
		.bind("mouseleave",_onOut)
		.bind("onToggleExpand",_cus_onExpandMember)
		.bind("onToggleCollapse",_cus_onCollapseMember)
		.each(function(){
			var toggler = $(this);
			if(!toggler.find(".tglIcon").length) toggler.prepend('<img class="tglIcon membersToggler" src="img/toggler_content_col_lo.png" />');
		});
	}
	
	function _cus_onExpandMember(e){
		var nameObj = $(this);
		var toggledBox = nameObj.next(".membersContent");;
		nameObj.find("#js_membersPreviewObj").tglFadeOutXB(300);
	}
	
	function _cus_onCollapseMember(e){
		var nameObj = $(this);
		nameObj.trigger("mouseenter"); //callt _onHover()
	}
	
	function _clk_membersLink(e){
		var toggler = $(this);
		var toggledBox = toggler.next(".membersContent");
		if(toggledBox.data("expanded")){
			toggledBox
			.data("expanded",false)
			.slideUp(300);
			
			toggler
			.trigger("onToggleCollapse")
			.find(".tglIcon").switchSrc("_exp","_col");
		} else {
			toggledBox
			.data("expanded",true)
			.slideDown(300);
			
			if($.browser.msie && $.browser.version>=7) toggledBox.show(); //bugfix: IE8 wont show box
			
			toggler
			.trigger("onToggleExpand")
			.find(".tglIcon").switchSrc("_col","_exp");
		}
	}
	
	function _onHover(e){
		var nameObj = $(this);
	
		nameObj.addClass("hi");
	
		var toggledBox = nameObj.next(".membersContent");
		if(!toggledBox.data("expanded")){ //show preview only in collapsed state
			var origImgObj = toggledBox.find(".membersPortraitBig");
			$("#js_membersPreviewObj")
			.appendTo(nameObj)
			.find("img").attr("src",origImgObj.attr("src")).end()
			.tglFadeInXB(300);
		}
	}
	
	function _onOut(e){
		var nameObj = $(this);
	
		nameObj.removeClass("hi");
		
		var toggledBox = nameObj.next(".membersContent");
		if(!toggledBox.data("expanded")){ //hide preview only in collapsed state
			$("#js_membersPreviewObj").tglFadeOutXB(300);
		}
	}
	
	return {
		reinitMembersLinks:reinitMembersLinks
	};
	
})();


var gx_toggler = (function gx_toggler(){

/*
	public methods:
		reinitTogglers()
		
	private methods:
		_clk_toggler(e)
		
*/


	function reinitTogglers(){
		$(".iToggler").bind("click",_clk_toggler);
	}
	
	function _clk_toggler(e){
		var tglObj = $(this);
		var boxObj = $("#"+tglObj.attr("id")+"Box");
		if(boxObj.data("expanded")){
			boxObj
			.data("expanded",false)
			.slideUp(300);
			tglObj
			.switchSrc("_exp","_col")
			.trigger("onToggleCollapse");
		} else {
			boxObj
			.data("expanded",true)
			.slideDown(300);
			tglObj
			.switchSrc("_col","_exp")
			.trigger("onToggleExpand");
		}
	}


	return {
		reinitTogglers:reinitTogglers
	};
	
})();


function reinitLightbox(){
	$(".lightboxSet").find(".iLightbox img").lightBox();
}


//+++ onload ++++++++++++++++++++++++++++++++++++++++
$(function(){
	gx_page.initPage();
});

})();