/**********************************************************/
/*        Thematic maps main script                       */
/*        Requires: Yui libraries						  */
/*		  Wisdom 2008	                                  */
/**********************************************************/


/* Global YAHOO library shortcut variables */

var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event;
YAHOO.namespace ("bosatlas");

/**********************************************************/
/*        Page init                                       */
/**********************************************************/

var pageInit = function() {
	YAHOO.bosatlas.tabHandler.init();
}

Event.addListener(window,"load",pageInit);


YAHOO.bosatlas.thematicalForm = {
	settings : {
		mapSetupFormId 				: "newBosatlasMapSetupForm",
		gpsMapSetupFormId			: "newGpsMapSetupForm",
		ownMapSetupFormId			: "newOwnDataMapSetupForm",
		ownMapSetupNextButtonId		: "ownDataConfigSubmit",
		existingMapFormId			: "newExistingMapSetupForm",
		addThemeSetupFormId			: "addThemeSetupForm",
		yearDiffSetupFormId			: "displayYearDiffForm",
		showBarDiagramFormId		: "displayBarDiagramForm",
		newBosatlasMapUrl			: "thematicMapBosatlasDataN.do",
		newOwnDataMapUrl			: "thematicMapOwnDataN.do",
		newOwnGPSMapUrl				: "thematicMapGpsDataN.do",
		newExistingMapUrl			: "loadMapN.do",
		addThemeMapUrl				: "thematicMapBosatlasDataN.do",
		yearDiffMapUrl				: "todo.do",
		selectValidationClass 		: "pickOne",
		textInputValidationClass	: "needsText",
		minOneCheckClass			: "needsOneChecked",
		validationErrorSuffix		: "Exception",
		uploadErrorId				: "uploadException",
		themeComboboxId				: "mapThemeSelect"
	},

	init : function() {
		// bind some validation events
		
		if(Dom.get("gspFileInput")) {
			Event.addListener("gspFileInput", "change", this.validateFile, {inputId:"gspFileInput", fileExt:"gpx", refObj:this});
		}

		if(Dom.get("mapFileInput")) {
			Event.addListener("mapFileInput", "change", this.validateFile, {inputId:"mapFileInput", fileExt:"map", refObj:this});
		}
		
		if(Dom.get("mapNameInput")) {
			Event.addListener("mapNameInput", "keyup", function(){validateTextInput(this);});
		}
		
		if(Dom.get("userThemeYear")) {
			Event.addListener("userThemeYear", "keyup", function(){validateNumericInput(this);});
		}
	},

	submit : function(formId, upload) {
		var selectedTab = YAHOO.bosatlas.tabHandler.getActiveTab();
		var tabId = selectedTab.getAttributeConfig('element').value.id.split("_")[1];
		switch(formId) {
			case this.settings.mapSetupFormId:
				var ajaxSubmitUrl = this.settings.newBosatlasMapUrl;
				var paramExt = "?";
			break;

			case this.settings.ownMapSetupFormId:
				var ajaxSubmitUrl = this.settings.newOwnDataMapUrl;
				var paramExt = "?";
			break;

			case this.settings.gpsMapSetupFormId:
				if(upload == true && !this.validateFile(null,{inputId:"gspFileInput", fileExt:"gpx", refObj:this})) {
					return false;
				}
				var ajaxSubmitUrl = this.settings.newOwnGPSMapUrl;
				var paramExt = "?";
			break;

			case this.settings.existingMapFormId:
				var ajaxSubmitUrl = this.settings.newExistingMapUrl;
				var paramExt = "?";
			break;

			case this.settings.addThemeSetupFormId:
				var ajaxSubmitUrl = this.settings.addThemeMapUrl;
				var paramExt = "?";
			break;
			
			case this.settings.yearDiffSetupFormId:
				var ajaxSubmitUrl = this.settings.yearDiffMapUrl;
				var paramExt = "?";
			break;

			default:
			return false; /* no context */
		}
		var callback =  {

			cache:false,

			success: function(o) {
				
				// refresh content
				var lightboxContext = Dom.getElementsByClassName("bd", "div", "lightboxPanel")[0];
				lightboxContext.innerHTML = "";
				lightboxContext.innerHTML = o.responseText;

				// init tooltips
				YAHOO.bosatlas.tooltip.init();

				// TODO anders oplossen
				if(o.argument.formId == o.argument.thematicalForm.settings.ownMapSetupFormId && o.argument.upload == -1  ) {
					// go to step 2
					YAHOO.bosatlas.simpleTabs.gotoTab(1);
				}

				// TODO anders oplossen
				if(o.argument.formId == o.argument.thematicalForm.settings.gpsMapSetupFormId && o.argument.upload == -1  ) {
					YAHOO.bosatlas.simpleTabs.gotoTab(1);
				}
				// disable default form behaviour
				o.argument.thematicalForm.disableForm(YAHOO.bosatlas.lightboxPanel.panelName);

				// format theme combobox
				o.argument.thematicalForm.formatCombobox(Dom.get(o.argument.thematicalForm.settings.themeComboboxId));
				
				// re-init thematic form
				o.argument.thematicalForm.init();
			},

			failure: function(o) {
				// something went wrong (4xx/ 5xx)
				// close lightbox && add feedback
				if(parseInt(o.status) == 403) {
					drawSessionErrorNotification(o.argument.tabId,LANG_SESSION_ERROR,"canvas", true);
				}
				
				if(parseInt(o.status) == 500 || parseInt(o.status) == 404) {
					drawGeneralErrorNotification(o.argument.tabId,LANG_GENERAL_ERROR,"appContent", true);
				}
			},
			upload : function(o) {
				if(o.argument.formId == o.argument.thematicalForm.settings.existingMapFormId) {
					// in this case we need to check the o.responseText output
					// to check if the upload succeeded and if the map is valid
					// if succes, then draw the SVGMap in de tabcontext and close the lightbox
					YAHOO.bosatlas.lightboxPanel.close();
				}
				else {
					if(stripTags(trim(o.responseText)) == "error") {
						Dom.setStyle(o.argument.thematicalForm.settings.uploadErrorId, "display", "block");
					}
					else {
						// set filename manually
						var fileNameString = Dom.get("gspFileInput").value.split("\\");
						var fileName = fileNameString[fileNameString.length -1];
						Dom.get("gpsUploadFile").innerHTML = fileName;

						YAHOO.bosatlas.tooltip.init();
						// go next step
						YAHOO.bosatlas.simpleTabs.gotoTab(1);
					}

					// enable form inputs after DOM reload
					o.argument.thematicalForm.toggleInputs(o.argument.formId,true);
				}
			},
			argument : {thematicalForm: this, formId:formId, upload:upload, tabId:tabId}
		}
		if(upload == true) {
			YAHOO.util.Connect.setForm(Dom.get(formId), true);
		} else {
			YAHOO.util.Connect.setForm(Dom.get(formId));
		}
		
		var transaction = YAHOO.util.Connect.asyncRequest('POST', ajaxSubmitUrl + paramExt + "tabId=" + tabId , callback);

		// disable form inputs while posting (may need a timeout)
		this.toggleInputs(formId,false);

	},
	
	validateStep : function(formId,nextStep) {
		var submitButton = Dom.get(this.settings.ownMapSetupNextButtonId);
		var formIsValid = this.validateSelects(formId) && this.validateTextInputs(formId);
		if(formIsValid && !Dom.hasClass(submitButton, "active")) {
			Dom.addClass(submitButton, "active");
			YAHOO.bosatlas.thematicalForm.submit(formId, -1);
		}
	},
	
	validate: function(formId, operation) {

		var formIsValid = this.validateSelects(formId) && this.validateTextInputs(formId) && this.validateCheckboxInput(formId);
		if(formIsValid) {
			if (operation) {
				// Only change the operation when the form is valid
				setOperation(operation);
			}
			// extra check for .map

			if(formId == this.settings.existingMapFormId) {
				if(this.validateFile(null,{inputId:"mapFileInput", fileExt:"map", refObj:this})) {
					YAHOO.bosatlas.SVGMap.loadMap(formId, true);
				}
			}
			else if(formId == this.settings.ownMapSetupFormId) {
				//format data form, disable un-used fields
				//formatOdForm(formId);
				YAHOO.bosatlas.SVGMap.loadMap(formId, false);	
			}
			else if(formId == this.settings.showBarDiagramFormId) {
				// additional theme select check
				var multipleThemes = Dom.getElementsByClassName("chartThemeCheck");
				if(multipleThemes.length > 1) {
					if(multipleThemes[0].checked || multipleThemes[1].checked) {
						YAHOO.bosatlas.SVGMap.loadMap(formId, false);
					} else {
						Dom.setStyle(multipleThemes[0].className + this.settings.validationErrorSuffix, "display", "block");
						return false;
					} 
					
				} else {
					YAHOO.bosatlas.SVGMap.loadMap(formId, false);
				}
			}
			else {
				// post data to maphandler
				YAHOO.bosatlas.SVGMap.loadMap(formId, false);
			}

		} else {
			return false;
		}
	},

	validateSelects : function(formId) {
		//check dropdowns
		var perfect = true;
		var checkSelects = Dom.getElementsByClassName(this.settings.selectValidationClass, "select", Dom.get(formId));
		for(var i=0; i<checkSelects.length; i++) {
			if(Dom.getStyle(checkSelects[i].parentNode.parentNode, 'display').toString() != "none") {
				if (checkSelects[i].selectedIndex == 0) {
					Dom.setStyle(Dom.get(checkSelects[i].id + this.settings.validationErrorSuffix), "display", "block");
					perfect = false;
				} else {
					Dom.setStyle(Dom.get(checkSelects[i].id + this.settings.validationErrorSuffix), "display", "none");
				}
			}
		}
		return perfect;
	},

	validateTextInputs : function(formId) {
		//check inputs
		var perfect = true;
		var checkInputs = Dom.getElementsByClassName(this.settings.textInputValidationClass, "input", Dom.get(formId));
		for(var i=0; i<checkInputs.length; i++) {
			if(Dom.getStyle(checkInputs[i].parentNode.parentNode, 'display').toString() != "none") {
				if (checkInputs[i].value == '') {
					Dom.setStyle(Dom.get(checkInputs[i].id + this.settings.validationErrorSuffix), "display", "block");
					perfect = false;
				} else {
					Dom.setStyle(Dom.get(checkInputs[i].id + this.settings.validationErrorSuffix), "display", "none");
				}
			}
		}
		return perfect;
	},
	
	validateCheckboxInput : function(formId) {
		var minChecksRequired = 1;
		var checkboxInputs = Dom.getElementsByClassName(this.settings.minOneCheckClass, "input", Dom.get(formId));
		if(checkboxInputs.length == 0) {
			return true; // skip check no imputs
		} else {
			var numChecked = 0;
			for(var i=0; i<checkboxInputs.length; i++) {
				if(checkboxInputs[i].checked) {
					numChecked++;
				}
			}
			if(numChecked >= minChecksRequired) {
				Dom.setStyle(Dom.get("checkbox" + this.settings.validationErrorSuffix), "display", "none");
				return true;
			}
			else {
				Dom.setStyle(Dom.get("checkbox" + this.settings.validationErrorSuffix), "display", "block");
				return false;
			}
		}

	},
	
	validateFile : function(e, fileObj) {
		var fileExt = Dom.get(fileObj.inputId).value.split(".");
		fileExt = fileExt[fileExt.length -1];

		if(fileExt != fileObj.fileExt) {
			Dom.setStyle(Dom.get(fileObj.inputId + fileObj.refObj.settings.validationErrorSuffix), "display", "block");
			return false;
		} else {
			Dom.setStyle(fileObj.inputId + fileObj.refObj.settings.validationErrorSuffix, "display", "none");
			return true;
		}
	},
	
	toggleInputs : function(formId, enable) {
		var formObjects = Dom.getElementsBy(function(e) { return e.nodeName == "INPUT" || e.nodeName == "SELECT"}, null,formId);
		for(var i=0; i<formObjects.length; i++) {
			if(enable) {
				formObjects[i].disabled = false;
				formObjects[i].removeAttribute("disabled");
			} else {
				formObjects[i].disabled = true;
				formObjects[i].setAttribute("disabled", "disabled");

			}
		}
	},
	
	formatCombobox : function(selectObj) {
		if(selectObj) {
			var sOptions = selectObj.getElementsByTagName("option");
			for(var i=0; i<sOptions.length; i++) {
				// add title attribute
				sOptions[i].setAttribute("title",sOptions[i].firstChild.nodeValue);
			}
		}
	},
	
	disableForm : function(lightBoxId) {
		var currentForm = Dom.get(lightBoxId).getElementsByTagName("form");
		Event.addListener(currentForm, "submit", function(e){Event.preventDefault(e)});
	}
}



/**********************************************************/
/*        SVG MAP loader 								  */
/**********************************************************/
YAHOO.bosatlas.SVGMap = {
	settings : {
		
		// POST/GET URLS
		svgMapPostUrl				: "thematicMapBosatlasDataN.do",
		svgMapGetUrl				: "thematicMapBosatlasDataTabN.do",
		svgMapOwnDataPostUrl		: "thematicMapOwnDataN.do",
		svgMapOwnDataGetUrl			: "thematicMapBosatlasDataTabN.do",
		showBarChartPostUrl			: "thematicTableN.do",
		showBarChartGetUrl			: "thematicTableN.do?operation=displayChartBarFromTab",
		showPieChartPostUrl			: "thematicTableN.do",
		showPieChartGetUrl			: "thematicTableN.do?operation=displayChartPieFromTab",
		addAerialPhotoUrl			: "thematicMapGpsN.do",
		addBackgroundUrl			: "thematicMapGpsN.do",
		showYearDiffPostUrl			: "thematicTableN.do?operation=differentialMap",
		showYearDiffGetUrl			: "thematicMapBosatlasDataTabN.do", 
		showAerialPhotoGetUrl		: "thematicMapGpsN.do?operation=toSatBackground",
		showBackgroundGetUrl		: "thematicMapGpsN.do?operation=toTopoBackground",
		showExtraThemePostUrl		: "thematicMapBosatlasDataN.do",
		showExtraThemeGetUrl		: "thematicMapN.do?operation=getMapHistogramChart",
		gpsMapPostUrl				: "thematicMapGpsDataN.do",
		gpsMapGetUrl				: "thematicMapGpsN.do?operation=getEmptyMap",
		existingMapPostUrl			: "loadMapN.do",
		existingMapGetUrl			: "thematicMapBosatlasDataTabN.do",
		displayMapGetUrl			: "displayAsMapN.do",
		
		// Wizard form id's
		mapSetupFormId 				: "newBosatlasMapSetupForm",
		gpsMapSetupFormId			: "newGpsMapSetupForm",
		ownMapSetupFormId			: "newOwnDataMapSetupForm",
		existingMapFormId			: "newExistingMapSetupForm",
		addBackgroundFormId			: "addBackgroundToMapForm",
		addAerialPhotoFormId		: "addAerialPhotoForm",
		showBarDiagramFormId		: "displayBarDiagramForm",
		showCircleDiagramFormId		: "displayCircleDiagramForm",
		showYearDiffFormId			: "displayYearDiffForm",
		addThemeFormId				: "addThemeSetupForm",
		
		// Misc settings
		actionParamInputId			: "svgMapParams",
		mapNameInputId				: "mapNameInput",
		mapFileInputId				: "mapFileInput",
		printPreviewId				: "printMapPreview",
		printLegendContainerId		: "printLegendContainer",
		printMapContainerId			: "printMapContainer",
		mapLegendPrefix				: "legendPrintRegion_",
		svgMapObjPrefix				: "objMapView_",
		svgMapContainer				: "svgMapContainer",
		svgChartContainer			: "svgChartContainer",
		svgBackgroundContainer		: "svgBackgroundContainer"

	},
	loadMap : function(formId,upload) {

		var selectedTab = YAHOO.bosatlas.tabHandler.getActiveTab();
		var tabId = selectedTab.getAttributeConfig('element').value.id.split("_")[1];
		var rnd = randomString(16);
		
		// get actionparams
		var mapParams = Dom.get(this.settings.actionParamInputId);
		var mapNameInput = Dom.get(this.settings.mapNameInputId);
		if(mapNameInput) {
			var mapName = mapNameInput.value;
		}
		else {
			var mapName = false;
		}
		if(mapParams) {
			var mapParamValue = mapParams.value;
		}
		else {
			// if no params set errror and return false
			if(!Dom.get("noMapException")) {
				var errorMsg = document.createElement("div");
				errorMsg.setAttribute("id", "noMapException");
				Dom.addClass(errorMsg, "notify");
				var errorP = document.createElement("p");
				var errorText = document.createTextNode(LANG_ERROR_MESSAGES[0])
				errorP.appendChild(errorText);
				errorMsg.appendChild(errorP);

				var activeForm = Dom.get(formId);
				if(activeForm) {
					activeForm.appendChild(errorMsg)
				}
			}
			return false;
		}
		// get action based on formId

		switch(formId) {

			case this.settings.mapSetupFormId:
				var postUrl = this.settings.svgMapPostUrl;
				var getUrl = this.settings.svgMapGetUrl + "?tabId=" + tabId;
				// set feedback msg (based on maptype)
				YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[0]);
			break;

			case this.settings.gpsMapSetupFormId:
				var postUrl = this.settings.gpsMapPostUrl;
				var getUrl = this.settings.gpsMapGetUrl + "&tabId=" + tabId;
				// set feedback msg (based on maptype)
				YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[9]);
			break;

			case this.settings.ownMapSetupFormId:
				var postUrl = this.settings.svgMapOwnDataPostUrl;
				var getUrl = this.settings.svgMapOwnDataGetUrl + "?tabId=" + tabId;
				// set feedback msg (based on maptype)
				YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[10]);
			break;

			case this.settings.existingMapFormId:
				var postUrl = this.settings.existingMapPostUrl;
				var getUrl = this.settings.existingMapGetUrl + "?tabId=" + tabId;
				var inputString = Dom.get(this.settings.mapFileInputId).value.split("\\");
				var fileName = inputString[inputString.length - 1].split(".")[0];
				// set feedback msg (based on maptype)
				YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[11]);
			break;

			case this.settings.showBarDiagramFormId:
				var postUrl = this.settings.showBarChartPostUrl;
				var getUrl = this.settings.showBarChartGetUrl + "&tabId=" + tabId;
				// set feedback msg (based on maptype)
				YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[1]);

			break;

			case this.settings.showCircleDiagramFormId:
				var postUrl = this.settings.showPieChartPostUrl;
				var getUrl = this.settings.showPieChartGetUrl + "&tabId=" + tabId;
				// set feedback msg (based on maptype)
				YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[2]);
			break;

			case this.settings.showYearDiffFormId:
				var postUrl = this.settings.showYearDiffPostUrl;
				var getUrl = this.settings.showYearDiffGetUrl + "?tabId=" + tabId;
				// set feedback msg (based on maptype)
				YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[12]);
			break;

			case this.settings.addThemeFormId:
				var postUrl = this.settings.showExtraThemePostUrl;
				var getUrl = this.settings.showExtraThemeGetUrl + "&tabId=" + tabId; 
				// set feedback msg (based on maptype)
				YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[8]);
			break;

			default:
			break;
		}
		
		// set ajax loader
		YAHOO.bosatlas.tabHandler.setAjaxLoader(1);
		
		// clear the tabContext
		Dom.get("tabContent_" + tabId).innerHTML = "";

		// submit form
		var callback =  {

			cache:false,

			success: function(o) {
				
				var tabId = o.argument.tabId;
				// refresh content
				Dom.get("tabContent_" + tabId).innerHTML = o.responseText;

				// set tabName
				if(o.argument.mapName) {
					o.argument.activeTab.set("label" , o.argument.mapName);
				}
				// set new tabdata src
				o.argument.activeTab.set("dataSrc" , o.argument.tabUrl);

				// init svg mapview
				o.argument.SVGMap.initMapView(tabId, "map");
				
				// set ajax loader
				YAHOO.bosatlas.tabHandler.setAjaxLoader(0);
			},

			failure: function(o) {
				// add feedback
				if(parseInt(o.status) == 403) {
					drawSessionErrorNotification(o.argument.tabId,LANG_SESSION_ERROR,"canvas", false)
				}
				
				if(parseInt(o.status) == 500 || parseInt(o.status) == 404 ) {
					drawGeneralErrorNotification(o.argument.tabId,LANG_GENERAL_ERROR,"appContent", false)
				}
				
				// set ajax loader
				YAHOO.bosatlas.tabHandler.setAjaxLoader(0);
			},

			upload : function(o) {

				// set tablabel
				o.argument.activeTab.set("label" , o.argument.fileName);

				// set new tab content
				var tabId = o.argument.tabId;
				Dom.get("tabContent_" + tabId).innerHTML = o.responseText;

				// set new tabdata src
				o.argument.activeTab.set("dataSrc" , o.argument.tabUrl);

				// init svg mapview
				o.argument.SVGMap.initMapView(tabId, "map");
				
				// set ajax loader
				YAHOO.bosatlas.tabHandler.setAjaxLoader(0);
			},

			argument : {SVGMap: this, tabId:tabId, activeTab:selectedTab, tabUrl:getUrl + "&rnd=" + rnd, mapName:mapName, fileName:fileName}
		}

		if(upload) {
			YAHOO.util.Connect.setForm(Dom.get(formId), true);
		} else {
			YAHOO.util.Connect.setForm(Dom.get(formId));
		}

		YAHOO.util.Connect.initHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8",true);
		
		var transaction;
		if((mapParamValue) && (mapParamValue != '')) {
			transaction = YAHOO.util.Connect.asyncRequest('POST', postUrl + mapParamValue, callback);
		} else {
			transaction = YAHOO.util.Connect.asyncRequest('POST', postUrl, callback);
		}
		
		// disable submit button to avoid abuse
		YAHOO.bosatlas.thematicalForm.toggleInputs(formId,false);
		
		YAHOO.bosatlas.lightboxPanel.close();
	},
	addBackground : function(formId) {
		var selectedTab = YAHOO.bosatlas.tabHandler.getActiveTab();
		var tabId = selectedTab.getAttributeConfig('element').value.id.split("_")[1];
		var rnd = randomString(16);
		
		switch(formId) {
			case this.settings.addBackgroundFormId:
			var ajaxSubmitUrl = this.settings.addBackgroundUrl;
			var tabUrl = this.settings.showBackgroundGetUrl + "&tabId="+ tabId;
			YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[6]);
			break;

			case this.settings.addAerialPhotoFormId:
			var ajaxSubmitUrl = this.settings.addAerialPhotoUrl;
			var tabUrl = this.settings.showAerialPhotoGetUrl + "&tabId="+ tabId;
			YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[7]);
			break;

			default:
			// invalid formId & close lightbox
			YAHOO.bosatlas.lightboxPanel.close();
			return false;
			break;
		}

		var callback =  {

			cache:false,

			success: function(o) {
				var tabId = o.argument.tabId;
			
				// set new data in tab
				Dom.get("tabContent_" + tabId).innerHTML = o.responseText;

				// set new tabdata src
				o.argument.activeTab.set("dataSrc" , o.argument.tabUrl);

				/* if output == false, there is no background available */
				if(o.responseText == "false") {
					// set feedback msg (based on maptype)
					YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[13]);
				}
				
				// init svg mapview
				o.argument.SVGMap.initMapView(tabId, "background");
				
				// set ajax loader
				YAHOO.bosatlas.tabHandler.setAjaxLoader(0);
			},

			failure: function(o) {
				// add feedback
				
				if(parseInt(o.status) == 403) {
					drawSessionErrorNotification(o.argument.tabId,LANG_SESSION_ERROR,"canvas", false)
				}
				
				if(parseInt(o.status) == 500 || parseInt(o.status) == 404) {
					drawGeneralErrorNotification(o.argument.tabId,LANG_GENERAL_ERROR,"appContent", false)
				}
				
				// set ajax loader
				YAHOO.bosatlas.tabHandler.setAjaxLoader(0);
			},
			argument : {SVGMap: this, formId:formId, tabId:tabId, tabUrl:tabUrl + "&rnd=" + rnd, activeTab:selectedTab}
		}

		YAHOO.util.Connect.setForm(Dom.get(formId));
		var transaction = YAHOO.util.Connect.asyncRequest('POST', ajaxSubmitUrl, callback);
		YAHOO.bosatlas.lightboxPanel.close();

		// set ajax loader
		YAHOO.bosatlas.tabHandler.setAjaxLoader(1);
		
		// clear the tabcontent to see the loading indicator;
		Dom.get("tabContent_" + tabId).innerHTML = "";
	},
	initMapView : function(tabId, type) {
		var tabContext = Dom.get("tabContent_" + tabId);
		var mapContext = Dom.getElementsByClassName("map", "div", tabContext)[0];
		
		if(mapContext) {
			// add feedback message (if feedback message was set)
			YAHOO.bosatlas.feedback.drawFeedback(mapContext);
		}
		
		this.activateLegend(tabId);
		
		if(type = "svg") {
			// init SVG
			var timedInit = window.setTimeout(function(){
					YAHOO.bosatlas.SVG.init(tabId);
			}, 2000);
			
			// toggle addtab button
			YAHOO.bosatlas.tabHandler.toggleAddTabLink();
		}
	},
	showMap : function(tabId, mapType, extraTheme) {
		// update tab data src & re-render tab based on tabId
		var selectedTab = YAHOO.bosatlas.tabHandler.getActiveTab();
		var rnd = randomString(16);
		
		switch(mapType) {
			case "bosatlas":
				var tabUrl = this.settings.displayMapGetUrl + "?tabId=" + tabId;
			break;

			default:
			return false; /* no context */
		}

		// set new tabdata src if scr was changed
		// nb this function causes a double init due to a bug in Yui 
		var currentUri = selectedTab.get("dataSrc").split("&rnd")[0];
		if(currentUri != tabUrl) {
			selectedTab.set("dataSrc" , tabUrl + "&rnd=" + rnd);
			selectedTab.refresh();
		}
	},
	formatPrintPreview : function() {
		if(Dom.get(this.settings.printPreviewId)) {
			var legendPlaceholder = Dom.get(this.settings.printLegendContainerId);
			var mapPlaceholder = Dom.get(this.settings.printMapContainerId);
			var selectedTab = YAHOO.bosatlas.tabHandler.getActiveTab();
			var tabId = selectedTab.getAttributeConfig('element').value.id.split("_")[1];
			var tabContextObj = Dom.get("tabContent_" + tabId);

			// transport maplegend & svgmap to print preview lightbox
			var svgMapContext = Dom.getElementsByClassName(this.settings.svgMapContainer, "div",tabContextObj)[0];
			var svgChartContext = Dom.getElementsByClassName(this.settings.svgChartContainer, "div",tabContextObj)[0];
			var svgBackgroundContext = Dom.getElementsByClassName(this.settings.svgBackgroundContainer, "div",tabContextObj)[0];

			if(svgMapContext) {
				var printContent = svgMapContext.innerHTML;
			}

			else if(svgChartContext) {
				var printContent = svgChartContext.innerHTML;
			}

			else if(svgBackgroundContext) {
				var printContent = svgBackgroundContext.innerHTML;
			}

			mapPlaceholder.innerHTML = printContent;

			// add printlegend if any
			if(Dom.get(this.settings.mapLegendPrefix + tabId)) {
				var legendContent = Dom.get(this.settings.mapLegendPrefix + tabId).innerHTML;
				legendPlaceholder.innerHTML = legendContent;
			}
		}
		else {
			return false;
		}
	},
	activateLegend : function(tabId) {
		var legendContext = Dom.get("mapLegend_" + tabId);
		
		if(legendContext) {
			dd = new YAHOO.util.DD("mapLegend_" + tabId, "paneldrag_" + tabId);
			var handleId = Dom.get("mapLegend_" + tabId).getElementsByTagName("h2")[0];
			dd.setHandleElId(handleId);
			
			// set legend controls
			
			var toggleControl = Dom.getElementsByClassName("toggleLegend", "a", legendContext)[0];
			Event.addListener(toggleControl, "click", function(e){Event.preventDefault(e)});
			Event.addListener(toggleControl,"click",this.toggleLegend, tabId);
			
		}
	},
	toggleLegend : function(e,tabId) {
		var legendContext = Dom.get("mapLegend_" + tabId);
		var legendContent = Dom.getElementsByClassName("mapLegendContent", "div", legendContext)[0];
		if(Dom.getStyle(legendContent, "display") == "block") {
			Dom.setStyle(legendContent, "display", "none");
			Dom.removeClass(this, "selected");
			Dom.addClass("overlayPanel_" + tabId, "toggleOut");
		} else {
			Dom.setStyle(legendContent, "display", "block");
			Dom.addClass(this, "selected");
			Dom.removeClass("overlayPanel_" + tabId, "toggleOut");
		}
	}

}


/**********************************************************/
/*        Country documentation                           */
/**********************************************************/

YAHOO.bosatlas.countryDocumentation = {
	settings : {
		countryLoadClass 			: "loadCountryInfo",
		countryInfoUrl				: "countryInfoN.do",
		countryListParentId			: "countryResult",
		countryNavigationClass		: "countryNav",
		countryNavigationParentId	: "countryAlfabet",
		countryNavListClass			: "countryList",
		countryNavListPrefix		: "countryList_",
		countryNavHeaderId			: "alfabetLetter",
		countrySwitchId				: "countrySwitch"
	},
	init : function() {

		if(Dom.get(this.settings.countryNavigationParentId)) {
			// set navigation controls
			var allNavItems = Dom.getElementsByClassName(this.settings.countryNavigationClass, "a", this.settings.countryNavigationParentId);
			for(var i=0; i<allNavItems.length; i++) {
				Event.addListener(allNavItems[i], "click", function(e){Event.preventDefault(e)});
				Event.addListener(allNavItems[i], "click", this.navigateTo, this);
			}
		}
		if(Dom.get(this.settings.countryListParentId)) {
			// set ajax handlers
			var allCountries = Dom.getElementsByClassName(this.settings.countryLoadClass, "a", this.settings.countryListParentId);
			for(var i=0; i<allCountries.length; i++) {
				Event.addListener(allCountries[i], "click", function(e){Event.preventDefault(e)});
				Event.addListener(allCountries[i], "click", this.loadCountryInfo, this);
			}
		}
		if(Dom.get(this.settings.countrySwitchId)) {
			var allNavItems = Dom.getElementsByClassName(this.settings.countryNavigationClass, "a");
			for(var i=0; i<allNavItems.length; i++) {
				Event.addListener(allNavItems[i], "click", function(e){Event.preventDefault(e)});
				Event.addListener(allNavItems[i], "click", this.loadCountryInfo, this);
			}
		}

	},
	loadCountryInfo : function(e, refObj) {

		var selectedTab = YAHOO.bosatlas.tabHandler.getActiveTab();
		var tabId = selectedTab.getAttributeConfig('element').value.id.split("_")[1];
		var countryName = this.getAttribute("title");
		var countryNavParam = "?countryId=" + this.rev;
		
		// set ajax loader
		YAHOO.bosatlas.tabHandler.setAjaxLoader(1);
		
		var callback =  {

			cache:false,

			success: function(o) {

				// refresh tabcontext

				var activeTabContent = Dom.get("tabContent_" + o.argument.tabId );
				activeTabContent.innerHTML = o.responseText;

				// set tab datasource
				YAHOO.bosatlas.tabHandler.getActiveTab().set("dataSrc" , o.argument.loadCountryInfo.settings.countryInfoUrl + o.argument.countryNavParam + "&" + o.argument.tabId);

				// set tabheader
				var activeTabLink = Dom.get("appTab_" +o.argument.tabId);
				var activeTabLinkText = activeTabLink.getElementsByTagName("em")[0];
				var countryNameFull = o.argument.countryName;

				if(countryNameFull.length > 18) {
					var countryName = countryNameFull.substring(0,16) + "..";
				} else {
					var countryName = countryNameFull;
				}
				activeTabLinkText.innerHTML = countryName ;

				// attach prev/next navigation events 500ms delay to prevent slow IE DOM change
				var refObj = o.argument.loadCountryInfo;
				var timedEventAttach = window.setTimeout(function() {
					var allNavItems = Dom.getElementsByClassName(refObj.settings.countryNavigationClass, "a");
					for(var i=0; i<allNavItems.length; i++) {
						Event.addListener(allNavItems[i], "click", function(e){Event.preventDefault(e)});
						Event.addListener(allNavItems[i], "click", refObj.loadCountryInfo, refObj);
					}
				}, 500);

				// enable add country tab button
				YAHOO.bosatlas.tabHandler.toggleAddTabLink();
				
				// set ajax loader
				YAHOO.bosatlas.tabHandler.setAjaxLoader(0);
			},

			failure: function(o) {
				// add feedback
				if(parseInt(o.status) == 403) {
					drawSessionErrorNotification(o.argument.tabId,LANG_SESSION_ERROR,"canvas", false)
				}
				if(parseInt(o.status) == 500 || parseInt(o.status) == 404) {
					drawGeneralErrorNotification(o.argument.tabId,LANG_GENERAL_ERROR,"appContent", false)
				}
			},

			argument : {loadCountryInfo: refObj,countryNavParam:countryNavParam, tabId: tabId, countryName:countryName}
		}
		// get attributes

		var transaction = YAHOO.util.Connect.asyncRequest('GET', refObj.settings.countryInfoUrl + countryNavParam + "&tabId=" + tabId, callback, null);

	},
	navigateTo : function(e, refObj) {
		// hide all block
		var allNavBlocks = Dom.getElementsByClassName(refObj.settings.countryNavListClass, "div", refObj.settings.countryListParentId);
		for(var i=0; i<allNavBlocks.length; i++) {
			Dom.setStyle(allNavBlocks[i], "display", "none");

		}

		// remove active classes
		var allNavLinks = Dom.getElementsByClassName(refObj.settings.countryNavigationClass, "a", refObj.settings.countryNavigationParentId);
		for(var i=0; i<allNavLinks.length; i++) {
			Dom.removeClass(allNavLinks[i], "active");
		}

		// set current active class
		Dom.addClass(this, "active");


		// show selected block
		var selectedBlock = Dom.get(refObj.settings.countryNavListPrefix + this.rev);
		if(selectedBlock) {
			Dom.setStyle(selectedBlock, "display", "block");
		}

		// set header
		var currentList = Dom.getElementsByClassName("countryNav active", "a");
		Dom.get(refObj.settings.countryNavHeaderId).innerHTML = currentList[0].innerHTML;
	}

}


/**********************************************************/
/*        Colorscheme                                     */
/**********************************************************/

YAHOO.bosatlas.colorScheme = {
	config: {
		colorSchemeId			: "colorScheme",
		colorPreviewId			: "colorSchemePreview",
		colorSetupId			: "colorSchemeSetup",
		colorPresetId			: "colorPreset",
		colorPickerId			: "colorPicker",
		colorPickerContainerId	: "colorPickerContainer",
		colorClassNumberId		: "colorClassNumber",
		colorSettingsId			: "colorSettings",
		colorSettingsApplyUrl	: "thematicMapN.do?operation=getThematicalMap&customLegend=true",
		colorSettingsApplyUrl2	: "thematicMapN.do?operation=getMapHistogramChart&isThemeMapLeading=false",
		paramsId				: "params",
		colorSchemeFormId		: "mapLegendColorSchemeForm",
		changeColorFormId		: "changeColorForm",
		freeArrangmentValue		: "2",
		colorInputFieldPrefix	: "legendColors_",
		rangeErrorMsgId			: "rangeInputErrorMessage",
		dataArrangement 		: null,
		histogramClass			: "histogram",
		maxColors				: 8
	},
	changeScheme: function(settings) {
		var colorSettings = settings.split(";");
		var previewColorNodes = Dom.get(this.config.colorPreviewId).getElementsByTagName("li");
		var setupColorNodes = Dom.get(this.config.colorSetupId).getElementsByTagName("li");

		var classSelect = Dom.get(this.config.colorClassNumberId);
		var numColors = parseInt(classSelect.options[classSelect.selectedIndex].value);

		switch(numColors) {
			case 1:
				var colorIndex = [0];
			break;
			case 2:
				var colorIndex = [0,7];
			break;

			case 3:
				var colorIndex = [0,3,7];
			break;

			case 4:
				var colorIndex = [0,2,5,7];
			break;

			case 5:
				var colorIndex = [0,2,4,6,7];
			break;

			case 6:
				var colorIndex = [0,1,3,4,6,7];
			break;

			case 7:
				var colorIndex = [0,1,2,4,5,6,7];
			break;

			case 8:
				var colorIndex = [0,1,2,3,4,5,6,7];
			break;
		}


		//for(var i=0; i< numColors; i++) {
		for(var i=0; i< this.config.maxColors; i++) {

			//var color2Use = colorSettings[colorIndex[i]];
			var color2Use = colorSettings[i];
			
			// set mini color preview
			Dom.setStyle(previewColorNodes[i], "background-color", color2Use);

			// set color preview & picker
			Dom.setStyle(Dom.getElementsByClassName("previewColor", "a", setupColorNodes[i])[0], "background-color", color2Use);

			// set hidden color input field
			Dom.get(this.config.colorInputFieldPrefix + i).value = color2Use;
		}

		// clean up new scheme's
		var newSchemes = Dom.getElementsByClassName("newScheme", "li");
		for(var i=0; i<newSchemes.length; i++) {
			newSchemes[i].parentNode.removeChild(newSchemes[i]);
		}
	},
	addScheme: function() {
		var colorSetupParent = Dom.get(this.config.colorSetupId);
		var colorPreviewParent = Dom.get(this.config.colorPreviewId);
		if(!Dom.get(colorSetupParent)) {
			return false; // can't add setuprow
		}

		// clone a setup row
		var sheep = colorSetupParent.getElementsByTagName("li")[0];
		var newColorScheme  = sheep.cloneNode(true);
		Dom.addClass(newColorScheme, "newScheme");
		var newPreviewEl = Dom.getElementsByClassName("previewColor", "a",newColorScheme)[0];
		Dom.setStyle(newPreviewEl, "background-color", "#ffffff");
		newPreviewEl.setAttribute("rel", colorSetupParent.getElementsByTagName("li").length + 1);

		// reset input values
		var newlowValue =  Dom.getElementsByClassName("lowValue", "input",newColorScheme)[0];
		var newhighValue =  Dom.getElementsByClassName("highValue", "input",newColorScheme)[0];
		newlowValue.value = "";
		newhighValue.value = "";

		// add new node
		colorSetupParent.appendChild(newColorScheme);

		// clone mini preview
		var sheep2 = colorPreviewParent.getElementsByTagName("li")[0];
		var newColorPreviewNode = sheep2.cloneNode(true);
		Dom.addClass(newColorPreviewNode, "newScheme");

		Dom.setStyle(newColorPreviewNode, "background-color", "#ffffff");
		Dom.replaceClass(newColorPreviewNode, "color1", "color" + (colorPreviewParent.getElementsByTagName("li").length + 1));
		colorPreviewParent.appendChild(newColorPreviewNode);
	},
	formatScheme : function(rows,userAction) {
		rows = Dom.get(this.config.colorClassNumberId).options[Dom.get(this.config.colorClassNumberId).selectedIndex].value;
			
		if(Dom.get(this.config.colorSchemeId)) {
			var previewRows = Dom.get(this.config.colorPreviewId).getElementsByTagName("li");
			var setupRows = Dom.get(this.config.colorSetupId).getElementsByTagName("li");

			var minValue = parseFloat( Dom.getElementsByClassName("minValue", "input", this.config.colorSchemeId)[0].value.replace(",", "."));
			minValue = Math.round(minValue*Math.pow(10,2)) / Math.pow(10,2);

			var maxValue = parseFloat( Dom.getElementsByClassName("maxValue", "input", this.config.colorSchemeId)[0].value.replace(",", "."));
			maxValue = Math.round(maxValue*Math.pow(10,2)) / Math.pow(10,2);
			var dataRange = this.getDataRanges(minValue, maxValue, rows);

			var dataArrangement = document.getElementsByName("legendRangeType");
			var selectedArrangment = null;
			for(var i=0; i<dataArrangement.length; i++) {
				if(dataArrangement[i].checked){
					selectedArrangment = dataArrangement[i].value;
				}
			}

			// set dataArrangement
			this.config.dataArrangement = selectedArrangment;
			
			var setField = function(field,disable) {
				if(disable) {
					field.disabled = true;
					field.setAttribute("disabled", "disabled")
					Dom.addClass(field, "hidden");
					Dom.addClass(field, "disabled");
				}
				else {
					field.disabled = false;
					field.removeAttribute("disabled")
					Dom.removeClass(field, "hidden");
					Dom.removeClass(field, "disabled");
				}
			}
			
			for(var i=0; i<previewRows.length; i++) {

				var inputObj = Dom.getElementsByClassName("highValue", "input", setupRows[i])[0];
				var inputObj2 = Dom.getElementsByClassName("lowValue", "input", setupRows[i])[0];

				// set ranges

				if(i < rows) {
					// format linear (default)
					var lowVal = dataRange[i].split("-")[0];
					var highVal = dataRange[i].split("-")[1];
					inputObj2.value = Math.round(lowVal*Math.pow(10,2)) / Math.pow(10,2);
					inputObj.value = Math.round(highVal*Math.pow(10,2)) / Math.pow(10,2);
							
					switch(parseInt(selectedArrangment)) {
						case 0:
							setField(inputObj2, false);
							setField(inputObj, false);
							
							var sepObj = Dom.getElementsByClassName("separator", "span", setupRows[i])[0];
							sepObj.innerHTML = "-";
							
						break;

						case 1:
							// format same frequency (data not available)
							setField(inputObj2, true);
							setField(inputObj, true);

							// change separator content
							var sepObj = Dom.getElementsByClassName("separator", "span", setupRows[i])[0];
							sepObj.innerHTML = LANG_LEGEND_FREQUENCY + " " + (i+1);
						break;

						case 2:
							// no format
							inputObj2.value = inputObj2.value.replace(",", ".");
							inputObj.value =  inputObj.value.replace(",", ".");
							setField(inputObj2, false);
							setField(inputObj, false);
								
							var sepObj = Dom.getElementsByClassName("separator", "span", setupRows[i])[0];
							sepObj.innerHTML = "-";
						break;
					}
				}

				// removing max value class
				if(Dom.hasClass(inputObj, "maxValue")) {
					Dom.removeClass(inputObj, "maxValue");
					if(selectedArrangment == this.config.freeArrangmentValue) {
						Dom.removeClass(inputObj, "disabled");
						inputObj.readOnly = false;
						inputObj.removeAttribute("readonly");
					}
				}

				if(i+1 == rows ) {
					Dom.addClass(inputObj, "maxValue");
					Dom.addClass(inputObj, "disabled");
					inputObj.readOnly  = true;
					inputObj.setAttribute("readonly", "readonly");
				}

				if(i >= rows) {
					Dom.setStyle(previewRows[i], "display", "none");
					Dom.setStyle(setupRows[i], "display", "none");
					inputObj.disabled  = true;
					inputObj.setAttribute("disabled", "disabled");
					inputObj2.disabled  = true;
					inputObj2.setAttribute("disabled", "disabled");
				} else {
					Dom.setStyle(previewRows[i], "display", "inline");
					Dom.setStyle(setupRows[i], "display", "block");
					inputObj.disabled  = false;
					inputObj.removeAttribute("disabled");
					inputObj2.disabled  = false;
					inputObj2.removeAttribute("disabled");
				}
			}
		}

		// format colors
		var colorPresetSelect = Dom.get(this.config.colorPresetId);
		var colorSettings = colorPresetSelect.options[colorPresetSelect.selectedIndex].value;
		this.changeScheme(colorSettings);

	},
	getDataRanges : function(min,max,rows) {
		var rangePerRow = (max - min) / rows;
		var dataRanges = [];
		var startIndex = min;

		for(var i=0; i<rows; i++) {
			var currentRange = startIndex + "-" + (startIndex + rangePerRow);
			dataRanges[i] = currentRange;
			startIndex = startIndex + rangePerRow;
		}

		return dataRanges;
	},
	formatDataRange : function(refObj, index) {


		if(!Dom.hasClass(refObj, "maxValue")) {

			var minValue = parseFloat(Dom.getElementsByClassName("minValue", "input", this.config.colorSchemeId)[0].value);
			var maxValue = parseFloat(Dom.getElementsByClassName("maxValue", "input", this.config.colorSchemeId)[0].value);
			var userVal = parseFloat(refObj.value);

			var setupRows = Dom.get(this.config.colorSetupId).getElementsByTagName("li");
			var classSibling = Dom.getElementsByClassName("lowValue", "input", setupRows[index])[0];
			var nextSibling = Dom.getElementsByClassName("lowValue", "input", setupRows[index + 1])[0];

			if(userVal < minValue || userVal >= maxValue || userVal <= parseFloat(classSibling.value) || isNaN(userVal) ) {
			// add error class
			Dom.addClass(refObj, "legendRangeError");
			// set error message
			Dom.setStyle(this.config.rangeErrorMsgId, "display", "inline");
			Dom.get(this.config.rangeErrorMsgId).innerHTML = LANG_LEGEND_INVALIDINPUT_ERROR;

			return false;
			} else {
				// remove class error if was set
				Dom.removeClass(refObj, "legendRangeError");

				// hide error message
				Dom.setStyle(this.config.rangeErrorMsgId, "display", "none");
				Dom.get(this.config.rangeErrorMsgId).innerHTML = "";

				// set nextSibling value
				nextSibling.value = refObj.value;
			}
		}

	},
	validateRanges : function() {
		var isValid = true;
		var minValue = parseFloat(Dom.getElementsByClassName("minValue", "input", this.config.colorSchemeId)[0].value);
		var maxValue = parseFloat(Dom.getElementsByClassName("maxValue", "input", this.config.colorSchemeId)[0].value);
		var setupRows = Dom.get(this.config.colorSetupId).getElementsByTagName("li");
		var classSelect = Dom.get(this.config.colorClassNumberId);
		var numColors = parseInt(classSelect.options[classSelect.selectedIndex].value);

		for(var i=0; i<numColors; i++) {
			var classSibling = Dom.getElementsByClassName("lowValue", "input", setupRows[i])[0];
			var refInput = Dom.getElementsByClassName("highValue", "input",setupRows[i])[0];
			var refInputValue = parseFloat(refInput.value);


			if(!Dom.hasClass(refInput, "maxValue")) {
				if(refInputValue < minValue || refInputValue >= maxValue || refInputValue <= parseFloat(classSibling.value) || isNaN(refInputValue) ) {
					Dom.addClass(refInput, "legendRangeError");
					isValid = false;
				}
			}
		}
		return isValid;
	},
	applyScheme : function(tabId, refObj) {
		if(this.config.dataArrangement == 2 && !this.validateRanges()) {
			Dom.setStyle(this.config.rangeErrorMsgId, "display", "inline");
			Dom.get(this.config.rangeErrorMsgId).innerHTML = LANG_LEGEND_INCOMPLETE_ERROR;
			return false;
		}
	
		// close lightbox
		YAHOO.bosatlas.lightboxPanel.close();
		
		// set color combobox
		var colorCombobox = Dom.get(this.config.colorPresetId);
		var colorRows = Dom.get(this.config.colorSetupId).getElementsByTagName("li");
		var colorSettings = "";
		for(var i=0; i<colorRows.length; i++) {
			colorSettings += Dom.get(this.config.colorInputFieldPrefix + i).value + ";";
		}
		colorSettings = colorSettings.substring(0,(colorSettings.length -1));
		colorCombobox.options[colorCombobox.selectedIndex].value = colorSettings;
		
		// send form to maphandler
		var callback =  {

			cache:false,

			success: function(o) {

				// refresh mapcontext
				// new tab/chart info in session so we only need to set the content once in de selected tab (via DOM)
				var rnd = randomString(16);
				var activeTabContent = Dom.get("tabContent_" + o.argument.tabId );
				activeTabContent.innerHTML = o.responseText;

				// init new tab content
				var activeTab = YAHOO.bosatlas.tabHandler.getActiveTab();
				YAHOO.bosatlas.tabHandler.initTabContent(null,activeTab);
				
				// update tabdata src add random number to avoid cache issues
				activeTab.set("dataSrc" , activeTab.get("dataSrc") + "&rnd=" + rnd);

				// add feedback message
				var mapContext = Dom.getElementsByClassName("map", "div", activeTabContent)[0];
				YAHOO.bosatlas.feedback.setFeedbackMsg(LANG_FEEDBACK_MESSAGES[4]);
				YAHOO.bosatlas.feedback.drawFeedback(mapContext);
				
				// set ajax loader
				YAHOO.bosatlas.tabHandler.setAjaxLoader(0);
			},

			failure: function(o) {
				// add feedback
			},

			argument : {colorScheme: this, tabId: tabId}
		}
		YAHOO.util.Connect.setForm(Dom.get(this.config.colorSchemeFormId));

		// check maptype and get posturl
		var params = Dom.get(this.config.paramsId).value;
	
		if(Dom.hasClass("objMapView_" + tabId, this.config.histogramClass)) {
			var postUrl = this.config.colorSettingsApplyUrl2 + "&tabId=" + tabId + params;
		} else {
			var postUrl = this.config.colorSettingsApplyUrl + "&tabId=" + tabId + params;
		}
		
		// clear tabcontent
		var activeTabContent = Dom.get("tabContent_" + tabId );
		activeTabContent.innerHTML = "";
		
		// set ajax loader
		YAHOO.bosatlas.tabHandler.setAjaxLoader(1);
		
		var transaction = YAHOO.util.Connect.asyncRequest('POST', postUrl, callback);
		
		// disable submit button to avoid abuse
		YAHOO.bosatlas.thematicalForm.toggleInputs(this.config.colorSchemeFormId,false);
	},
	drawColorPicker: function(refObj) {

			if(Dom.get(this.config.colorPickerId)) {
				return false;
			}
			else {
				var pickerPlaceHolder = document.createElement("div");
				pickerPlaceHolder.setAttribute("id", this.config.colorPickerId);
				Dom.get(this.config.colorPickerContainerId).appendChild(pickerPlaceHolder);
			}

			picker = new YAHOO.widget.ColorPicker(this.config.colorPickerId, {
						showcontrols: false,
						showhexcontrols: false,
						showhsvcontrols: false,
						showhexsummary: false,
						showwebsafe:false,
						showrgbcontrols: false,
						images: {
							PICKER_THUMB: RESOURCE_PATH + "/gfx/picker_thumb.png",
							HUE_THUMB: RESOURCE_PATH + "/gfx/hue_thumb.png"
						}
			});

			if(Dom.hasClass(refObj, "previewColor")) {
				var scol = Dom.getStyle(refObj, 'backgroundColor').toString();
			}
			else {

				var nextSibling = refObj.nextSibling;
				while(nextSibling.nodeName != "A") {
						nextSibling = nextSibling.nextSibling;
				}
				var scol = Dom.getStyle(nextSibling, 'backgroundColor').toString();
			}

			/* IE / FF switch */

			if(scol.indexOf('#') == -1) {
				scol = scol.substring(4,scol.length-1).split(",");
				picker.setValue(scol, false);
			} else {
				scol = this.hexToRBG(scol);
				picker.setValue(scol, false);
			}

			// add set button
			var setColorButton = document.createElement("a");
			var setColorButtonText = document.createTextNode(LANG_DEFAULT_OK);
			Dom.addClass(setColorButton, "button");

			setColorButton.appendChild(setColorButtonText);
			setColorButton.setAttribute("id", "setColor");
			Dom.get(this.config.colorPickerId).appendChild(setColorButton);

			// add cancel button
			var cancelButton = document.createElement("a");
			var cancelButtonText = document.createTextNode(LANG_DEFAULT_CANCEL);
			cancelButton.appendChild(cancelButtonText);

			cancelButton.setAttribute("id", "cancelColorPicker");
			Dom.addClass(cancelButton, "button");
			Dom.get(this.config.colorPickerId).appendChild(cancelButton);

			var closeColorPicker = function(e,cp) {
				// close colorpicker
				picker.unsubscribeAll();
				Event.purgeElement(cp.config.colorPickerId, true);
				Dom.get(cp.config.colorPickerContainerId).removeChild(Dom.get(cp.config.colorPickerId));
				Dom.get(cp.config.colorPickerContainerId).style.display = 'none';
			}

			Event.addListener(cancelButton, "click", closeColorPicker, this);

			var setColor = function(e, cp) {

				var selectedColor = "#" + Dom.getElementsByClassName("yui-picker-hex", "input", "colorPicker")[0].value;

				// set color in setup node (check if link or color block was clicked)

				if(Dom.hasClass(refObj, "previewColor")) {
					Dom.setStyle(refObj, 'background-color', selectedColor);
				}
				else {
					var nextSibling = refObj.nextSibling;
					while(nextSibling.nodeName != "A") {
						nextSibling = nextSibling.nextSibling;
					}
					Dom.setStyle(nextSibling, 'background-color', selectedColor);
				}

				// set color in preview node (optional)
				Dom.setStyle(Dom.getElementsByClassName("color" + refObj.rel, "li", "colorSchemePreview")[0], 'background-color', selectedColor);

				// set hidden color input field
				Dom.get(YAHOO.bosatlas.colorScheme.config.colorInputFieldPrefix + refObj.rel).value = selectedColor;
				closeColorPicker(e,cp);
			}

			Event.on("setColor", "click", setColor, this);

			//  show colorpicker
			Dom.get(this.config.colorPickerContainerId).style.display = "block";

	},
	setDataRanges : function(enabled) {

		var allDataEntries = Dom.get(this.config.colorSetupId).getElementsByTagName("input");

		for(var i=0; i<allDataEntries.length; i++) {
			if(enabled && Dom.hasClass(allDataEntries[i], "highValue") && !Dom.hasClass(allDataEntries[i], "maxValue")) {
				allDataEntries[i].removeAttribute("readonly");
				allDataEntries[i].readOnly = false;
				Dom.removeClass(allDataEntries[i], "disabled");
			} else {
				allDataEntries[i].setAttribute("readonly", "readonly");
				allDataEntries[i].readOnly = true;
				Dom.removeClass(allDataEntries[i], "disabled");
				Dom.addClass(allDataEntries[i], "disabled");
			}
		}
	},
	validateDataRange : function(i) {
		var re = /^[0-9.-]*$/;
		if (!re.test(i.value)) {

			i.value = i.value.replace(/[^0-9.-]/g,"");
		}else {

		}
	},

	hexToRBG : function(hexValue) {

		var R = HexToR(hexValue);
		var G = HexToG(hexValue);
		var B = HexToB(hexValue);

		function HexToR(h) {return parseInt((cutHex(h)).substring(0,2),16)}
		function HexToG(h) {return parseInt((cutHex(h)).substring(2,4),16)}
		function HexToB(h) {return parseInt((cutHex(h)).substring(4,6),16)}
		function cutHex(h) {return (h.charAt(0)=="#") ? h.substring(1,7):h}

		return [R,G,B];
	},

	RGBToHex : function (str) {
		str = str.replace(/rgb\(|\)/g, "").split(",");
		str[0] = parseInt(str[0], 10).toString(16).toLowerCase();
		str[1] = parseInt(str[1], 10).toString(16).toLowerCase();
		str[2] = parseInt(str[2], 10).toString(16).toLowerCase();
		str[0] = (str[0].length == 1) ? '0' + str[0] : str[0];
		str[1] = (str[1].length == 1) ? '0' + str[1] : str[1];
		str[2] = (str[2].length == 1) ? '0' + str[2] : str[2];
		return ('#' + str.join(""));
	}

}

/**********************************************************/
/*        Map setup wizard tabs                           */
/**********************************************************/

YAHOO.bosatlas.simpleTabs = {
	gotoTab : function(t) {
		var tabControls = Dom.getElementsByClassName("tabLink", "a");
		var controlEl;
		var relatedEl;
		for(var i=0; i<tabControls.length; i++) {
			// reset tabs
			Dom.removeClass(tabControls[i].parentNode, "selected");
			Dom.removeClass(Dom.get(tabControls[i].rel), "showTab");
			Dom.addClass(Dom.get(tabControls[i].rel), "hideTab");
			if (i==t) controlEl = tabControls[i].rel;
		}
		relatedEl = Dom.getElementsBy(function(e){ return e.rel == controlEl}, "a");
		for(var i=0; i<relatedEl.length; i++) {
			Dom.addClass(relatedEl[i].parentNode, "selected");
		}

		Dom.removeClass(Dom.get(controlEl), "hideTab");
		Dom.addClass(Dom.get(controlEl), "showTab");
	}

}

/**********************************************************/
/*        Feedback				                          */
/**********************************************************/

YAHOO.bosatlas.feedback = {
	settings : {
		feedbackMsgId				: "mapFeedback",
		feedbackAppendContainer		: "",
		activeFeedbackMessage		: false
	},
	setFeedbackMsg : function(feedbackMsg) {
		this.settings.activeFeedbackMessage = feedbackMsg;
	},
	drawFeedback : function(parentNode) {
		// draw feedback message if one was set
		if(this.settings.activeFeedbackMessage) {
			this.settings.feedbackAppendContainer = parentNode;
			var feedbackNode = document.createElement("div");
			var feedbackText = document.createTextNode(this.settings.activeFeedbackMessage);
			feedbackNode.appendChild(feedbackText);
			feedbackNode.setAttribute("id", this.settings.feedbackMsgId);
			Dom.setStyle(feedbackNode, "opacity", 0);
			Dom.addClass(feedbackNode, "mapFeedback");
			if(Dom.get(this.settings.feedbackAppendContainer)) {
				Dom.get(this.settings.feedbackAppendContainer).insertBefore(feedbackNode, Dom.get(this.settings.feedbackAppendContainer).firstChild);
				this.animatedFeedback('in');
			}

			// clear active feedback message
			this.setFeedbackMsg(false);
		}

	},
	animatedFeedback : function(direction) {
		switch(direction) {
			case 'in':

			var feedbackOpacityAnimation = new YAHOO.util.ColorAnim(this.settings.feedbackMsgId, {
				opacity: { to: 0.9}
			}, 0.3, YAHOO.util.Easing.easeOut);

			var refObj = this;
			var timedFadeout = window.setTimeout(function() {
				refObj.animatedFeedback('out');
				}, 2000);
			feedbackOpacityAnimation.onComplete.subscribe(timedFadeout);
			feedbackOpacityAnimation.animate();

			// change size anim
			var feedbackSizeAnimation = new YAHOO.util.Anim(this.settings.feedbackMsgId,
			{
				width:{from:100,to:37, unit:'em'},
				height:{from:6,to:1.8, unit:'em'}
			}, 0.3,YAHOO.util.Easing.easeOut);
			feedbackSizeAnimation.animate();
			break;

			case 'out':
			var refObj = this;
			var removeFeedback = function() {
				refObj.removeFeedback();
			}
			var feedbackOpacityAnimation = new YAHOO.util.ColorAnim(this.settings.feedbackMsgId, {
				opacity: { to: 0}
			}, 0.2, YAHOO.util.Easing.easeOut);
			feedbackOpacityAnimation.onComplete.subscribe(removeFeedback);
			feedbackOpacityAnimation.animate();
			break;
		}
	},
	removeFeedback : function() {
		var feedbackNode = Dom.get(this.settings.feedbackMsgId);
		feedbackNode.parentNode.removeChild(feedbackNode);
	}
}

/**********************************************************/
/*        Datatable format script                         */
/**********************************************************/

YAHOO.bosatlas.dataTable = {
		
	formatTable :  function() {
		/*if(Dom.get("ownMapDataTableDiv")) {

			YAHOO.bosatlas.EnhanceFromMarkup = new function() {
				var myColumnDefs = [
					{key:"tai1",label:"Regio",sortable:true},
					{key:"tai2",label:"Waarde", sortable:false},
					{key:"tai3",label:"", sortable:false}
				];

				this.myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("dataTable"));
				this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
				this.myDataSource.responseSchema = {
					fields: [{key:"tai1",parser:YAHOO.util.DataSource.parseString},
							{key:"tai2"},
							{key:"tai3"}
					]
				};
				
				var oConfigs = {
	                caption:"" 
        		};
        
				this.myDataTable = new YAHOO.widget.DataTable("ownMapDataTableDiv", myColumnDefs, this.myDataSource,oConfigs);
			};
		}*/
		
		if(Dom.get("dataTable")) {
			
			/* setting up datatable */
			var tableHeader1 = Dom.get("datatableCol1Header").getAttribute("title");
			var tableHeader2 = Dom.get("datatableCol2Header").getAttribute("title");
			if(Dom.get("datatableCol3Header")) {
				var tableHeader3 = Dom.get("datatableCol3Header").getAttribute("title");
			}
			
			if(Dom.get("dataTableDiv")) {
				var dataClass = "dataTableDiv";
				var myColumnDefs = [
					{key:"tai0",label:"",width:30, sortable:false},
					{key:"tai1",label:tableHeader1,sortable:true},
					{key:"tai2",label:tableHeader2,formatter:"number", sortable:true}
				];
				var dataFields = {
					fields: [{key:"tai0"},
							{key:"tai1",parser:YAHOO.util.DataSource.parseString},
							{key:"tai2",parser:YAHOO.util.DataSource.parseNumber}]
					}
			} 
			else if(Dom.get("dataTableDiv2")) {
				var dataClass = "dataTableDiv2";
				var myColumnDefs = [
						{key:"tai0",label:"",width:30, sortable:false},
						{key:"tai1",label:tableHeader1,sortable:true},
						{key:"tai2",label:tableHeader2,formatter:"number",sortable:true},
						{key:"tai3",label:tableHeader3,formatter:"number",sortable:true}
				];
				var dataFields = {
					fields: [{key:"tai0"},
							{key:"tai1",parser:YAHOO.util.DataSource.parseString},
							{key:"tai2",parser:YAHOO.util.DataSource.parseNumber}, 
							{key:"tai3",parser:YAHOO.util.DataSource.parseNumber}]
					}
			}
			else {
				// no context return false;
				return false;
			}
			
			YAHOO.bosatlas.EnhanceFromMarkup = new function() {
	
				this.myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("dataTable"));
				this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
				this.myDataSource.responseSchema = dataFields;
	
				this.myDataTable = new YAHOO.widget.DataTable(dataClass, myColumnDefs, this.myDataSource,
						{caption:""}
				);
				
				var resetSelection = function() {
					Dom.setStyle(Dom.get("checkbox" + YAHOO.bosatlas.thematicalForm.settings.validationErrorSuffix), "display", "none");
					Dom.get("barDisplayNotify").style.display = "none";
					var selectedRows = Dom.getElementsByClassName("highlight", "tr", "displayBarDiagramForm");
					for(var i=0; i<selectedRows.length; i++) {
						Dom.removeClass(selectedRows[i], "highlight");
					}
				}
				this.myDataTable.subscribe("columnSortEvent", resetSelection);
			};
		}		
	},
	toggleRow : function(refObj) {

		// hide any notify message
		Dom.setStyle(Dom.get("checkbox" + YAHOO.bosatlas.thematicalForm.settings.validationErrorSuffix), "display", "none");

		var maxAllowed = 15;
		var targetRow = refObj.parentNode.parentNode.parentNode;
		var numChecked = Dom.getElementsByClassName("highlight", "tr", "dataDisplay").length;

		if(refObj.checked) {
			Dom.addClass(targetRow, "highlight");
			numChecked ++;
		}
		else {
			Dom.removeClass(targetRow, "highlight");
			numChecked --;
		}

		if(numChecked == maxAllowed + 1) {
			refObj.removeAttribute("checked");
			refObj.checked = false;
			Dom.removeClass(targetRow, "highlight");
			numChecked --;
			//return false;
		}

		if(YAHOO.bosatlas.validator.validateCheckboxes(Dom.get("dataTableForm"))) {
			// activate next button
			Dom.removeClass(Dom.get("dataDisplayViewButton"), "inactive");
		}
		else {
			// de-activate next button
			Dom.addClass(Dom.get("dataDisplayViewButton"), "inactive");
		}

		// activate notify

		if(numChecked == 0) {
			// hide notify
			Dom.get("barDisplayNotify").style.display = "none";
		}
		else {
			Dom.get("barDisplayNotify").style.display = "block";
			var numLeft = (maxAllowed  - numChecked);

			if(numChecked > 1) {
				var barText1 = LANG_BAR_PLURAL;
			}
			else {
				var barText1 = LANG_BAR_SINGULAR;
			}

			if(numLeft == 1) {
				var barText2 = LANG_BAR_SINGULAR;
			}
			else {
				var barText2 = LANG_BAR_PLURAL;
			}

			// set numbers & text in notify
			Dom.get("numSelectedBars").innerHTML = numChecked;
			Dom.get("numRemainingBars").innerHTML = numLeft;
			Dom.get("numSelectedBarsText").innerHTML = barText1;
			Dom.get("numRemainingBarsText").innerHTML = barText2;
		}
	}
}

/**********************************************************/
/*       From validator                                   */
/**********************************************************/

YAHOO.bosatlas.validator = {

	// basic checkbox validation
	validateCheckboxes : function(rootObj) {
		// check if any input box is checked
		var allCheckBoxes = Dom.getElementsByClassName("checkbox", "input", rootObj);
		for(var i=0; i<allCheckBoxes.length; i++) {
			if(allCheckBoxes[i].checked) {
				return true;
			}
		}
		return false;
	},
	validateFileInput : function(inputObj) {
		if(inputObj.value == "") {
			return false
		}
		else {
			return true;
		}
	}
}

/**********************************************************/
/*        Tooltips                                        */
/**********************************************************/

YAHOO.bosatlas.tooltip = {

	init : function() {
		/* first cleanup DOM, remove any active tooltips */
		this.cleanDOM();
		var tooltipElements = Dom.getElementsByClassName("tooltip", "a");
		for(var i=0; i<tooltipElements.length; i++) {
			this.add(tooltipElements[i]);
		}
	},
	cleanDOM : function() {
		var tooltipGen = Dom.getElementsByClassName("yui-tt", "div");
		for(var i=0; i<tooltipGen.length; i++) {
			Event.purgeElement(tooltipGen[i], true);
			tooltipGen[i].parentNode.removeChild(tooltipGen[i]);
		}
	},

	add : function(tooltipNode) {

		var tooltipId = "tooltip_" + randomString(6);
		var tooltip = new YAHOO.widget.Tooltip(tooltipId, { context:tooltipNode });
		tooltip.setHeader(tooltipNode.rel);
	}
}

/**********************************************************/
/*        Error notification functions                    */
/**********************************************************/

drawSessionErrorNotification = function(tabId, errorMsg, targetId, closeLightbox) {
	// close lightbox
	if(closeLightbox) YAHOO.bosatlas.lightboxPanel.close();
	Dom.get(targetId).innerHTML = errorMsg;
}

drawGeneralErrorNotification = function(tabId, errorMsg, targetClass, closeLightbox) {
	// close lightbox
	if(closeLightbox) YAHOO.bosatlas.lightboxPanel.close();
	var targetObj = Dom.get("tabContent_" + tabId);
	if(targetObj) {
		targetObj.innerHTML = '<div class="appContent">' + errorMsg + '</div>';
	} else {
		Dom.get("canvas").innerHTML = errorMsg;	
	}
}

var clearSVGTooltip = function() {
	var ttNodes = Dom.getElementsByClassName("svgTTNode");
	for(var i=0; i<ttNodes.length; i++) {
		ttNodes[i].innerHTML = "";
	}
}

/**********************************************************/
/*        Custom functions for map with own data          */
/**********************************************************/

var setOdRow = function(refObj,enable) {
	
	var allFields = refObj.getElementsByTagName("input");
	
	for(var i=0; i<allFields.length; i++) {
		if(allFields[i].type == "hidden") {
			if(!enable) {
				allFields[i].removeAttribute("disabled");
				allFields[i].disabled = false;
				
			} else {
				allFields[i].setAttribute("disabled", "disabled");
				allFields[i].disabled = true;
			}
		}
	}
}

var formatOdForm = function(formId) {
	var allTextFields = Dom.getElementsByClassName("textField", "input", formId);
	for(var i=0; i<allTextFields.length; i++) {
		if(allTextFields[i].value == "") {
			allTextFields[i].setAttribute("disabled", "disabled");
			allTextFields[i].disabled = true;
			
			// also set siblings
			setOdRow(allTextFields[i].parentNode, true);
		}
	}	
}

/**********************************************************/
/*        SVG Map menu       							  */
/**********************************************************/

function expandSubs(appMenuItem) {
	//collapse all
	var appMenuDiv = appMenuItem.parentNode.parentNode;
	var liNodes = Dom.get(appMenuDiv).getElementsByTagName("li");
	Dom.removeClass(liNodes, "expanded");
	
	//expand this one
	Dom.addClass(appMenuItem.parentNode, "expanded");
}

/**********************************************************/
/*        Wizard supporting functions                     */
/**********************************************************/

function activateMaakKaart() {
	Dom.removeClass(Dom.getElementsByClassName("greyed", "li", Dom.get("menu"))[0], "greyed");
}

function newMapOwnDataNextTab() {
	Dom.removeClass(Dom.getElementsByClassName("disabled", "a", Dom.get("ownDataMapWizardTabs")), "disabled");
}

function setOperationOnSelect(input_select) {
	var is = input_select.options[input_select.selectedIndex].value;
	setOperation(is);
	return YAHOO.bosatlas.thematicalForm.submit('newGpsMapSetupForm', -1);
}

function setOperation(operation) {
	var input_operation = Dom.get("myOperationId");
	input_operation.value = operation;
}


/**********************************************************/
/*        Atlastrainers functions                         */
/**********************************************************/

function clickLinkQuizN(answerIdValue,itemSelectedValue,setActivelink,action) {
    Dom.get('quiz_submit').className = 'button';
    Dom.get('quiz_submit').href = action;
	Dom.get('answerId').value=answerIdValue;
	Dom.get('itemSelected').value=itemSelectedValue;

	nElements = Dom.get('mapAnswers').getElementsByTagName('a');

	for (i=0; i<nElements.length; i++)
	{
		if (nElements[i].id == setActivelink) {
			nElements[i].parentNode.className = 'selected';
		} else {
			nElements[i].parentNode.className = '';
		}
    }
	// previous loop cleared the classname of the parent of the submit button, fix this
	Dom.get('quiz_submit').parentNode.className = "submit clear";
}

function clickValidateLinkN() {
    disableLinkQuiz('mapAnswers');
    Dom.get('quiz_submit').href= '#';
    Dom.get('quiz_submit').className = 'button disabled';
    Dom.get('next_question').className = 'button';
    Dom.get('next_question').href = Dom.get('actionLinkInput').value;//$F('actionLinkInput');
    makeRequest('../FastServlet','GET', 'service=qfeedbackN&aNo='+Dom.get('itemSelected').value+'&aId='+Dom.get('answerId').value, 'feedback');
    Dom.get('quiz_submit').className = 'button disabled';
}

function enableComboboxes(ids,enable) {
	var comboIds = ids.split(";");
	for(var i=0; i<comboIds.length; i++) {
		var currentCombo = Dom.get(comboIds[i]);
		if (currentCombo) {
			if(enable) {
				currentCombo.disabled = false;
				currentCombo.removeAttribute("disabled");
			} else {
				currentCombo.disabled = true;
				currentCombo.setAttribute("disabled", "disabled");
			}
		}
	}
}

function disableLinkQuiz(id_div) {
	nElements = Dom.get(id_div).getElementsByTagName('a');
	for (i=0; i<nElements.length; i++)
	{
	   nElements[i].href = '#';
	}
}

function makeRequest(url,method,params,update_id)
{
	var callback = {
			success: function(o) {
				// refresh content
				var content_holder = Dom.get(update_id);
				content_holder.innerHTML = "";
				content_holder.innerHTML = o.responseText;
			},
			failure: function(o) {
				// report error somewhere
			}
	};
	YAHOO.util.Connect.asyncRequest(method, url + "?" + params, callback);
}

/**********************************************************/
/*        General JS utilities                            */
/**********************************************************/

function randomString(length) {
   var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
   var randomString = "";

   for(x=0;x<length;x++) {
      i = Math.floor(Math.random() * 62);
      randomString += chars.charAt(i);
   }

   return randomString;
}

function isOdd(num) {
  return (num % 2) == 1;
}

function isEven(num) {
  return (num % 2) == 0;
}

function trim(value) {
  if(!value || value.length == 0) {
  	return "";
  }
  else {
  	value = value.replace(/^\s+/,'');
  	value = value.replace(/\s+$/,'');
  	return value;
  }
}

Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};

function trimContent(inputString, size) {
	if(size > inputString.length) {
		size = inputString.length;
	}
	var i = 1;
	var currentpos = size;

	while((size + i < inputString.length) && (inputString.substring(currentpos, size + i) != " ") )  {
		currentpos++;
		i++;
	}
	return inputString.substring(0,size + i);
}

function validateTextInput(i) {
	var re = /^[a-zA-Z0-9,\s]*$/;
	if (!re.test(i.value)) {
		i.value = i.value.replace(/[^a-zA-Z0-9,\s]/g,"");
	}
}
function validateNumericInput(i) {
	var re = /^[0-9]*$/;
	if (!re.test(i.value)) {
		i.value = i.value.replace(/[^0-9]/g,"");
	}
}

function stripTags(str) {
	return str.replace(/<\/?[^>]+>/gi, '');
}
