/**
 * brainGuide.com
 *
 * (en) 210-person-detail: Include/Init of all relevant JS Files Functions
 * (de) 210-person-detail: Einf�gen/Initialisierung aller relevanten JS Dateien/Funktionen
 *
 * @copyright       Copyright 2008, Thomas Kalteis brainGuide AG
 * @version         1.0
 * @revision        $Revision: 10 $
 * @lastmodified    $Date: 2008-04-09 s
 */
 /****** 1 Global variables ******/
 /****** 2 Include needed JS files ******/
 /****** 3 Init all JS Datasets and Obersver ******/
 /****** 4 Footer init all widgets after page is loaded  ******/
 /****** 5 Page specific custom functions ******/
 
 
 
 
 /****** 1 Global variables ******/
	var personId;
	var publicationsPage = 1;
	var publicationsPages;
	var eventsPage = 1;
	var eventsPages;
	var intorductionToggle;
	var newsFade;
	var statusRecommendationFade;
	var statusContactFade;
	var helpSP;
	var dsPersonPublications;
	var dsPersonPublications_Authors;
	var dsPersonEvents;
	var tp_person_detail;
	var tp_person_detail_selected;
	var tp_statistik;
	var tp_person_list;
	
	var clickHeatSite;
	var clickHeatGroup;
	var clickHeatServer;

 
 /****** 2 Include needed JS files ******/ 
/* (en) 210-person-detail: Include needed JS Files */
/* (de) 210-person-detail: Einf�gen der ben�tigte JS Dateien */





 /****** 3 Init all JS Datasets and Obersver ******/
/* (en) Calls the function to init all databindings */ 
/* (de) Ruft die Funktion zur Initalisierung der Datenverbindungen auf */

function initJS(id) {
	// person id
	personId = id;

	// fade effect for status messages - if available
	if(document.getElementById("status-message-recommendation")) {
		statusRecommendationFade = new Spry.Effect.Fade('status-message-recommendation',{duration: 1000, from: 0, to: 100});
	}
	if(document.getElementById("status-message-contact")) {
		statusContactFade = new Spry.Effect.Fade('status-message-contact',{duration: 1000, from: 0, to: 100});
	}
	
	// nested data set for the person's publication
	dsPersonPublications = new Spry.Data.JSONDataSet(getURLPersonPublications(), {subPaths: "items"});
	// data source for the person's events
	dsPersonEvents = new Spry.Data.JSONDataSet(getURLPersonEvents(), {subPaths: "items"});

	/* (en) Observer: Adding Observer for Datasets */
	/* (de) Observer: Fügt die Oberserver zu den Datasets hinzu */
	//dsPersonPublications.addObserver(obsPersonPublications);
	//dsPersonEvents.addObserver(obsPersonPublications);
	
	/* (en) Debug window: Setting opens the window */
	/* (de) Debug Fenster: Einstellung �ffnet das Debug Fenster */
	//Spry.Data.Region.debug=true;
	
	
	/* Check for bookmarked persons */
	Spry.Utils.loadURL('get', '/json/controller.do?path=/myBrains&method=getBookmarkedPersons',true,favPersonInitSuccessCallback);
	

}
	



 /****** 4 Footer init all widgets after page is loaded  ******/
function initFooter() {
	
/* (en) Systemnavigation: Init Layer System Navigation */
/* (de) Systemnavigation: Initialisierung der Systemnavigation  */	
	var sysnav = new Spry.Widget.MenuBar("sysnav");
	
	
/* (en) Help: init the help introduction panel */
/* (de) Hilfe: Initialisierung des Hilfe Panels */
	//var sp = new Spry.Widget.SlidingPanels("help");
	//newsFade = new Spry.Effect.Fade('news', {duration: 1500, from: 20, to: 100, toggle:true});
	//intorductionToggle = new Spry.Effect.Slide('intorductionToggle', {duration: 1000, from: '0px', to: '195px', toggle: true});
	
	sendToAFriendFade = new Spry.Effect.Fade('sendToAFriend', {toggle:true});
	//helpSP = new Spry.Widget.SlidingPanels("help");
	
	/* Hides Static Lists */
	//Spry.Utils.addClassName('li_experts_static','hide');
	
	
/* (en) Toolbar: Spry widgets in #col1  */
/* (de) Toolbar: Initialisiert die Spry Widgets von #Col1 */
	// initialize competences widget only if available
	if(document.getElementById('cp_person_themes')) {
		var cp_person_themes = new Spry.Widget.CollapsiblePanel("cp_person_themes", {enableAnimation:false});
	}
	
	
/* (en) Content: Spry widgets in #col3  */
/* (de) Content: Initialisiert die Spry Widgets von #Col3 */

	//tp_person_detail = new Spry.Widget.TabbedPanels("tp_person_detail");
	// check the anchors (var params defined in global.js)
	params = Spry.Utils.getLocationParamsAsObject();
	if(params.panel) {
		initExpertNavigation(params.panel);
	}
	
	
	//try {tp_person_list = new Spry.Widget.TabbedPanels("tp_person_list");} catch(err) { };
	
	tp_person_list = new Spry.Widget.TabbedPanels("tp_person_list");
	
	try {var cp_person_list = new Spry.Widget.CollapsiblePanel("cp_person_list", {enableAnimation:false});} catch(err) { };

/* (en) Init validation of send to a friend form fields */
/* (de) Initialisierung der Validierung für Sendt2Friend Formularfelder */
	initSendToFriendValidation();
	initPersonContactValidation();
	initPersonRecommendationValidation();

/* (en) Init of the heatmap */
/* (de) Initialisierung der Heatmap */	
	//try {configHeatMap();} catch(err) { }
	
/* (en) Applys round Corners to the specified elements */
/* (de) Runded die Ecken der ausgew�hlten Container ab */
	try {roundAll();} catch(err) { }



/* (en) Check for #Anchors */
/* (de) Prüfe ob #Anchors vorhanden */

location.hash == location.href.split('#')[1];

	switch(location.hash) {		
		case '#event':
				var test = Spry.$$("div#person_events");
				if (test != null) {
					try {tp_person_list.showPanel('person_events');} catch(err) { };
					try {location.href=location.href;} catch(err) { };
				}
			break;
		case '#publication':
				var test = Spry.$$("div#person_publications");
				if (test != null) {
					try {tp_person_list.showPanel('person_publications');} catch(err) { };
					try {location.href=location.href;} catch(err) { };
				}
			break;
	}
	
	
}





 /****** 5 Page specific custom functions ******/
/* (en) Site specific Functions */ 
/* (de) Seitenspezifische Funktionen */


/**
  * Observer 
  */

//

var observer = {};

observer.nextEffect = false;
observer.onPostEffect = function(e){
	if (this.nextEffect)
	{
		var eff = this.nextEffect;
		setTimeout(function(){eff.start();}, 10);
	}

	this.nextEffect = false;
}




// Objects that wish to observe a data set must define a callback method
// for each notification it wishes to receive. In this example, our object
// will only be called for PostLoad and DataChanged notifications.

var obsPersonPublications = new Object;
obsPersonPublications.onPostLoad = function(notifier, data) {
	  
	/* Show Content after loading */
	
	//Spry.Debug.trace("obsPersonPublications.onPostLoad called!");
	//Spry.Utils.addClassName('RegionPersonPublicationsLoading','SpryHiddenRegion');
	
}


function showContact() {
	Spry.$$("div#contact").removeClassName("hide");
	Spry.$$("div#contact").removeAttribute("style");
}


function hideContact() {
	Spry.$$("div#contact").addClassName("hide");
	
}

function showStatistic() {
	Spry.$$("*.statDetail").toggleClassName("hide");
	Spry.$$("a#personStatistic").toggleClassName("down");
}



/* initializes validation for person contact form fields */
function initPersonContactValidation() {
	if(document.getElementById("personForm")) {
		var senderName = new Spry.Widget.ValidationTextField("pc-sender-name", "none", {isRequired:true});
		var senderEmail = new Spry.Widget.ValidationTextField("pc-sender-email", "email", {isRequired:true});
		var message = new Spry.Widget.ValidationTextarea("pc-message", {isRequired:true});
		var requestType = new Spry.Widget.ValidationSelect("pc-contact-type", {invalidValue:"-1"});
		var message = new Spry.Widget.ValidationTextarea("pc-message", {isRequired:true});
	}
}

/* initializes validation for person recommendation form fields */
function initPersonRecommendationValidation() {
	if(document.getElementById("recommendationForm")) {
		var textId = new Spry.Widget.ValidationRadio("pr-text");
	}
}

/* validates the person contact form and submits it if validation succeeds */
function validatePersonContact(form){
	if (Spry.Widget.Form.validate(form) == true){
		document.getElementById('loading-contact').style.display = "inline";
		Spry.Utils.submitForm(form, personContactSuccessCallback, {additionalData:'personId=' + personId, errorCallback: personContactErrorCallback});
	}
	return false;
}

/* validates the person recommendation form and submits it if validation succeeds */
function validatePersonRecommendation(form){
	if (document.getElementById('recommendationText').value.length > 0 || Spry.Widget.Form.validate(form) == true){
		document.getElementById('loading-recommendation').style.display = "inline";
		Spry.Utils.submitForm(form, personRecommendationSuccessCallback, {additionalData:'personId=' + personId, errorCallback: personRecommendationErrorCallback});
	}
	return false;
}

/*
 * Callback function to handle the response of the person
 * contact form after submit via XHR.
 */
function personContactSuccessCallback(req) {
	// req.xhRequest.status
	var ds = new Spry.Data.JSONDataSet();
	// load the returned json data into a dataset
	ds.loadDataIntoDataSet(req.xhRequest.responseText);
	// set the css class appropriate to the returned message type
	if(ds.getData()[0]["name"] == "message") {
		Spry.Utils.removeClassName(document.getElementById("status-message-contact"), "error");
		Spry.Utils.addClassName(document.getElementById("status-message-contact"), "confirmation");
		// reset form
		document.getElementById("personForm").reset();
	}
	if(ds.getData()[0]["name"] == "error") {
		Spry.Utils.removeClassName(document.getElementById("status-message-contact"), "confirmation");
		Spry.Utils.addClassName(document.getElementById("status-message-contact"), "error");
	}
	// display returned message
	document.getElementById("status-message-contact").innerHTML = ds.getData()[0]["message"];
	document.getElementById("status-message-contact").style.display = "block";
	statusContactFade.start();
	
	// hide loading image
	document.getElementById('loading-contact').style.display = "none";
}

/*
 * Callback function to handle the response of the person
 * contact form after submit via XHR.
 */
function personContactErrorCallback(req) {
	// display an error message
	Spry.Utils.removeClassName(document.getElementById("status-message-contact"), "confirmation");
	Spry.Utils.addClassName(document.getElementById("status-message-contact"), "error");
	document.getElementById("status-message-contact").innerHTML = "Es ist ein Systemfehler aufgetreten! Bitte versuchen Sie es später noch einmal.";
	statusContactFade.start();
}

/*
 * Callback function to handle the response of the recommend
 * person form after submit via XHR.
 */
function personRecommendationSuccessCallback(req) {
	var ds = new Spry.Data.JSONDataSet();
	// load the returned json data into a dataset
	ds.loadDataIntoDataSet(req.xhRequest.responseText);
	// set the css class appropriate to the returned message type
	if(ds.getData()[0]["name"] == "message") {
		Spry.Utils.removeClassName(document.getElementById("status-message-recommendation"), "error");
		Spry.Utils.addClassName(document.getElementById("status-message-recommendation"), "confirmation");
	}
	if(ds.getData()[0]["name"] == "error") {
		Spry.Utils.removeClassName(document.getElementById("status-message-recommendation"), "confirmation");
		Spry.Utils.addClassName(document.getElementById("status-message-recommendation"), "error");
	}
	// display returned message
	document.getElementById("status-message-recommendation").innerHTML = ds.getData()[0]["message"];
	statusRecommendationFade.start();
	// reset form
	document.getElementById("recommendationForm").reset();
	// hide loading image
	document.getElementById('loading-recommendation').style.display = "none";
}

/*
 * Callback function to handle the response of the person recommendation 
 * form after submit via XHR and a system error occurs.
 */
function personRecommendationErrorCallback(req) {
	// display an error message
	Spry.Utils.removeClassName(document.getElementById('status-message-recommendation'), "confirmation");
	Spry.Utils.addClassName(document.getElementById('status-message-recommendation'), "error");
	document.getElementById('status-message-recommendation').innerHTML = "Es ist ein Systemfehler aufgetreten! Bitte versuchen Sie es später noch einmal.";
	statusRecommendationFade.start();
	// hide loading image
	document.getElementById('loading-recommendation').style.display = "none";
}

/* (en) Configuration of the HeatMap */ 
/* (de) Konfiguration der Heatmap */

function configHeatMap() {
	
	/* Set Local File Name */
	clickHeatSite = '';
	clickHeatGroup = 'person_detail';
	clickHeatServer = '/clickheat/click.php';
	initClickHeat();
	
}

/**
 * Setting Url to JSON Dataset
 */
function getURLPersonPublications() {
	var s = "json/controller.do?path=/experts&method=personPublicationOverviewData&personId=" + personId;
	if(publicationsPage) {
		s += "&page=" + publicationsPage;
	}
	return s;
}

function getURLPersonEvents() {
	var s = "json/controller.do?path=/experts&method=personEventOverviewData&personId=" + personId;
	if(eventsPage) {
		s += "&page=" + eventsPage;
	}
	return s;
}

/**
 * Paging function, loads the previous page with person publications.
 */
function goBack() {
	// do nothing if current page is page 1
	if(publicationsPage == 1) {
		return;
	}
	// decrement page
	publicationsPage = publicationsPage - 1;
	// load the data
	dsPersonPublications.setURL(getURLPersonPublications(), {subPaths: "items"});
	dsPersonPublications.loadData();
}

/**
 * Paging function, loads the previous page with person publications.
 */
function goForward() {
	// return if last page reached
	if(publicationsPage == dsPersonPublications.getData()[0]["publicationsPages"]) {
		return;
	}
	// load data for requested page
	publicationsPage = publicationsPage + 1;
	dsPersonPublications.setURL(getURLPersonPublications(), {subPaths: "items"});
	dsPersonPublications.loadData();
}

/**
 * Paging function, loads the next page with person events.
 */
function nextPageEvents() {
	// do nothing if current page is page 1
	if(eventsPage == dsPersonEvents.getData()[0]["eventsPages"]) {
		return;
	}
	
	// increment page
	eventsPage = eventsPage + 1;
	
	// load the data
	dsPersonEvents.setURL(getURLPersonEvents(), {subPaths: "items"});
	dsPersonEvents.loadData();
}

/**
 * Paging function, loads the previous page with person events.
 */
function prevPageEvents() {
	if(eventsPage == 1) {
		return;
	}
	// decrement page
	eventsPage = eventsPage - 1;
	// load the data
	dsPersonEvents.setURL(getURLPersonEvents(), {subPaths: "items"});
	dsPersonEvents.loadData();
}

/*
 * Function for navigation handling. This function keeps track of the person context navigation panel.
 */
function initExpertNavigation(id) {
	// remember active tab
	tp_person_detail_selected = id;
	switch (tp_person_detail_selected) {
	  case 4:	// contact
		// hide form and show loading image
		document.getElementById("status-message-contact").style.display = "none";
		document.getElementById("personForm").style.display = "none";
	    break;
	  case 5:	// recommendation
		// hide form and show loading image
		document.getElementById("recommendation_login_loader").style.display = "block";
		document.getElementById("recommendation_login_request").style.display = "none";
		document.getElementById("status-message-recommendation").style.display = "none";
		document.getElementById("recommendationForm").style.display = "none";
	    break;
	  default:
	    break;
	}
	// show the panel
	
	// check if a user is registered
	isUserRegistered(isUserRegisteredCallback);
}

/* callback function to handle the response of the isUserRegistered() call */
function isUserRegisteredCallback(req) {
	// check status code
	var ds = new Spry.Data.JSONDataSet();
	// load the returned json data into a dataset
	ds.loadDataIntoDataSet(req.xhRequest.responseText);
	// display content
	if(ds.getData()[0]["email"]) {		// logged in user found
		switch (tp_person_detail_selected) {
		  case 4:	// contact
			// hide loading image and show form
			document.getElementById("contact_login_loader").style.display = "none";
			document.getElementById("personForm").style.display = "block";
		    break;
		  case 5:	// recommendation
			// hide loading image and show form
			document.getElementById("recommendation_login_loader").style.display = "none";
			document.getElementById("recommendationForm").style.display = "block";
		    break;
		  default:
		    break;
		}
	} else {	// no logged in user found...
		switch (tp_person_detail_selected) {
		  case 4:	// contact
			// hide loading image and show login request
			document.getElementById("contact_login_loader").style.display = "none";
			document.getElementById("contact_login_request").style.display = "block";
		    break;
		  case 5:	// recommendation
			// hide loading image and show form
			document.getElementById("recommendation_login_loader").style.display = "none";
			document.getElementById("recommendation_login_request").style.display = "block";
		    break;
		  default:
		    break;
		}
	}
}

/* resets the selection of a radio button in the recommendation form */
function resetRadiobutton() {
	var elements = document.getElementsByName("textId");
	for (var i=0; i < elements.length; i++) {
		if(elements[i].checked) {
			elements[i].checked = false;
		}
	}
}

function addPersonToFavorites() {
	// call method from global js with current id as parameter
	addFavPerson(personId);
}

/**
 * Redirects the user to the cas login screen and appends the current detail page URL
 * as service URL to the login request.
 * 
 * @param panel The active person navigation panel
 */
function ssoRedirect(panel){
	var service = window.location.protocol + "//" + window.location.hostname;
	
	if(panel) {
		var queryString = "/controller.do?path=/person&method=detail&area=1&personId=" + personId;
		var hash = window.location.hash;
		
		if(queryString) {
			params = Spry.Utils.getLocationParamsAsObject();
			// check if panel param available
			if(!params.panel) {
				service += queryString + "&panel=" + panel;
			} else {
				service += queryString;
			}
		} else {
			service += "?panel=" + panel;
		}
		// add hash to service url
		if(hash) {
			service += hash;
		}
	}
	window.location.href = "https://secure.brainguide.com:443/cas/login?service=" + escape(service);
}