
function makeDropdownList(dropdownBox, optionList){
	var offset=1;
	dropdownBox.options.length=optionList.length+offset;
	for(var index=0;index<optionList.length;index++){
		dropdownBox.options[index+offset]=new Option(optionList[index].text, optionList[index].value);
	}

	return dropdownBox;
}
	
function encodeForm(formObj){
	var result='';
	for(var i=0;i<formObj.elements.length;i++){
		var anElement=formObj.elements[i];
		if(anElement.name && 
				anElement.name!='' && 
				anElement.value!='' /*&&
				!anElement.disabled &&
				!anElement.readOnly  */){
				
			if(anElement.type=='checkbox' || anElement.type=='radio'){
				if(!anElement.checked){
					continue;
				}
			}
			if(result != '')
				result+='&';
			
			result+=encodeURIComponent(formObj.elements[i].name) + "=";
			if(anElement.type=='checkbox')
				result+=encodeURIComponent( formObj.elements[i].checked?"true":"false" );
			else
				result+=encodeURIComponent( formObj.elements[i].value );
		}
	}
	
	return result;
}

pcng_requestObjects=new Object();
PCNG_REQUEST_INVOKED_ALREADY=1;
DONT_USE_AJAX_TIMEOUT_TRICK=0;
var ajaxTimeout=40000;
function autoInvokeResult(almostReadyTime){
	if(pcng_requestObjects[almostReadyTime] && pcng_requestObjects[almostReadyTime]!=PCNG_REQUEST_INVOKED_ALREADY){	
		displayGeneralMessage('A communication problem was detected in your browser. Strongly suggest to upgrade to the lastest version of your browser.');
		displayGeneralMessage('Invoking a counter measure now...');
		reqObj=pcng_requestObjects[almostReadyTime];
		if(reqObj['almostReadyTime'] != almostReadyTime){
			return;
		}
		reqObj['origObj'].handleReadyStateChange(reqObj, reqObj['myCallBack']);
		pcng_requestObjects[almostReadyTime]=PCNG_REQUEST_INVOKED_ALREADY;
	}
}

function SimpleAjaxHelper(httpBaseURL){
	if(pcngIsNull(httpBaseURL)){
		httpBaseURL='';
	}

	this.httpBaseURL=httpBaseURL;	

	this.prepareURL=function(origUrl){
		if(origUrl==null)
			origUrl='';
		var url=this.httpBaseURL;
		if(origUrl+'' != 'undefined')
			url+=origUrl;
		url=addParm(url, "ajaxRequest", "true");
		if(typeof contextPath != "undefined"){
			if(url.startsWith("/") && !url.startsWith(contextPath))
				url = contextPath+url;
		}
		
		return url;
	}
	
	this.doIt=function(method, url, dataLoad, beQuiet, myCallBack, displayMsg){
		this.beQuiet=beQuiet;
		this.myCallBack=myCallBack;
		var req = (!window.XMLHttpRequest)? (ActiveXObject ? (new ActiveXObject("Microsoft.XMLHTTP")):""):(new XMLHttpRequest());

		var async=(typeof myCallBack != 'undefined');
		req.open(method, url, async);
		req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;');
		req.setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" );
		req.setRequestHeader("Cache-Control", "no-cache");
//		req.setRequestHeader("Connection", "close"); 
		if(async){
			if(typeof beQuiet == 'undefined' || !beQuiet)
				showWaitWindow();

			req['origObj']=this;
			req['myCallBack']=myCallBack;
			req_asdsdssddsdsdsds=req; 
			req.onreadystatechange=function(){
				var reqObj=req;
				
				if(reqObj['origObj'].showRequestAndResponse()){
					if(reqObj.readyState!=3){
						try{
							alert("this.readyState="+reqObj.readyState+", status="+reqObj.status+", this.responseText (length="+reqObj.responseText.length+")="+reqObj.responseText);
						}
						catch(err){}
					}
				}
				
				if(reqObj.readyState==3){
				
					if(reqObj['myCallBack'] && reqObj['myCallBack'].onInteractive){
						reqObj['myCallBack'].onInteractive(reqObj);
						return;
					}

					var useAjaxTrick=true;
					if(Get_Cookie)
						Get_Cookie('use_ajax_timeout_trick')				
					if(useAjaxTrick!=DONT_USE_AJAX_TIMEOUT_TRICK){
						
						if(Get_Cookie){
							ajaxTimeout=Get_Cookie('ajax_timeout');
							if(!ajaxTimeout){
								ajaxTimeout=40000;
							}
						}
						almostReadyTime=reqObj['almostReadyTime'];
						if(almostReadyTime && pcng_requestObjects[almostReadyTime]){
							if(pcng_requestObjects[almostReadyTime]==PCNG_REQUEST_INVOKED_ALREADY){
								ajax_timeout*=2;
								if(Set_Cookie)
									Set_Cookie("ajax_timeout", ajax_timeout, 90);
								displayGeneralMessage('Some communication problem was detected. You may want to reload this page.');
								
								return;
							}
							
							// great, it hasn't been executed yet.
							delete pcng_requestObjects[almostReadyTime];
						}
	
						almostReadyTime=(new Date()).getTime();
						reqObj['almostReadyTime']=almostReadyTime;
						pcng_requestObjects[almostReadyTime]=reqObj;
						setTimeout("autoInvokeResult("+almostReadyTime+")", ajaxTimeout);
					}
				}
				
				if(reqObj.readyState==4){ 
					
					if(Set_Cookie){
						Set_Cookie('use_ajax_timeout_trick', DONT_USE_AJAX_TIMEOUT_TRICK, 30);
					}
					if(reqObj['almostReadyTime'] && pcng_requestObjects[reqObj['almostReadyTime']]){
						if(pcng_requestObjects[reqObj['almostReadyTime']]==PCNG_REQUEST_INVOKED_ALREADY){
							// invoked already?
							
							return;
						}
						delete pcng_requestObjects[reqObj['almostReadyTime']];
					}
					if(reqObj['origObj'].msgId){
						clearGeneralMessageDiv(reqObj['origObj'].msgId);
						reqObj['origObj'].msgId=null;
					}
					reqObj['origObj'].handleReadyStateChange(reqObj, reqObj['myCallBack']);
				}
			}
		}

		if(dataLoad==null)
			dataLoad='';
		
		if(this.showRequestAndResponse()){
			alert((async?"Async'ly ":"")+method+" to "+url+" with encoded data:\n\n'"+dataLoad+"'");
		}

		if(displayMsg)
			this.msgId=displayGeneralMessage(displayMsg, 180000);
		
		try{
			req.send(dataLoad);
		}
		catch(err){
			alert(err);
		}
		if(!async){
			this.handleReadyStateChange(req);
		}		
	}
	
	this.showRequestAndResponse=function(){
		if(isDebugJS())
			return getDebugJSLevel()>=200;
		return false;
	}
	
	this.handleReadyStateChange=function(req, myCallBack){
	
		if(req.status==200){
			if(myCallBack && myCallBack.onSuccess){
				myCallBack.onSuccess(req);
			}
			else{
				try{
					eval(req.responseText);
				}
				catch(err){}
			}
			
			cancelWaitWindow();
		}
		else{
			if(req.status==302){
				
//				this.get(req.getResponseHeader("Location"), this.beQuiet, this.myCallBack);
//				return;
			}
			if(myCallBack && myCallBack.onFailure){
				myCallBack.onFailure(req);
			}
			else{
				if(req.status!=0){
					try{
						eval(req.responseText);
					}
					catch(err){}
					
					displayGeneralMessage("Unforunately, your request failed. Please try again later. Error Code=("+req.status+").");
				}
			}
			cancelWaitWindow();
		}
		
		if(myCallBack && (!myCallBack.onSuccess && !myCallBack.onFailure))
			myCallBack();
	}

	this.get=function(url2Get, beQuiet, callBack, displayMsg){
		var url=this.prepareURL(url2Get);
		this.doIt("GET", url, null, beQuiet, callBack, displayMsg);
	}
	this.post=function(formObj, beQuiet, callBack, displayMsg){
		// prepare data if needed:
		clearNodeError(formObj);
		if(formObj.prepare4Submission){
			formObj.prepare4Submission();
		}

		if(typeof beQuiet == 'undefined' || !beQuiet){			
			var validateResults=new Array();
			if(formObj.validate){
				formObj.validate(validateResults);
			}
			validateForm(formObj, validateResults);
			if(validateResults.length!=0){					
				if(formObj.outputErrors)
					formObj.outputErrors(errors);
				else
					outputErrors(formObj, validateResults);
				return false;
			}
		}
		
		cleanError();
		
		// submit now:
		var encoded=encodeForm(formObj);
		var url= this.prepareURL(formObj.getAttribute('action'));

		this.doIt("POST", url, encoded, beQuiet, callBack, displayMsg);
		return true;
	}
}

function validateForm(formObj, errors){
	for(var i=0;i<formObj.elements.length;i++){
		if(formObj.elements[i].className.indexOf("mandatory_data")>=0){
			if(formObj.elements[i].type=="text" && formObj.elements[i].value==''){
				errors[errors.length]=formObj.elements[i].title+" is a required field.";
				
				markNodeError(formObj.elements[i]);
			}
		}
	}
}

var maxLevelUp=4;
var errorBlockStyleName="errorBlock";
var inputTitleCellName="inputTitleCell";
function markNodeError(node){
	var firstCells=null;
	var fromNode=node;
	var level=0;
	while(firstCells==null && fromNode!=null && level++<maxLevelUp){
		fromNode=fromNode.parentNode;
		firstCells=findNodeByClass(fromNode, inputTitleCellName);
	}
	
	if(firstCells!=null){
		for(var i=0;i<firstCells.length;i++){
			firstCells[i].className=firstCells[i].className+" "+errorBlockStyleName;
		}
	}	
}

function clearNodeError(node){
	var firstCells=findNodeByClass(node, inputTitleCellName);
	
	if(firstCells!=null){
		for(var i=0;i<firstCells.length;i++){
			removeClass(firstCells[i], errorBlockStyleName);
		}
	}	
}

var errorDiv=null;
function outputError(str){
	alert(str);
}

function outputErrors(formObj, errors){
	if(!errorDiv)
		errorDiv=document.getElementById("errorDiv");
	if(errorDiv){
		errorDiv.parentNode.removeChild(errorDiv);
		
		// insert as first child:
		formObj.insertBefore(errorDiv, formObj.childNodes[0]);
		var errorUL=findChildById(errorDiv, "errorUL");
		if(errorUL==null){
			errorUL=ptpCreateElement('UL');
			errorDiv.appendChild(errorUL);
		}

		// clean up previous errors:
		while(errorUL.childNodes.length>0){
			errorUL.removeChild(errorUL.childNodes[0]);
		}

		for(var i=0;i<errors.length;i++){
			var ee=ptpCreateElement('LI');
			ee.innerHTML=errors[i];
			errorUL.appendChild(ee);
		}
		
		errorDiv.style.display="block";
	}
	else{
		// no error div?
		var str="You have encountered the following error(s)/warning(s):\n\n";
		str+=errors.join("\t\n");
		alert(str);
	}
}

function cleanError(){
	if(errorDiv)
		errorDiv.style.display="none";
}

function makeLinkText(link, value){
	if(value==''){
		value='(n/a)';
	}
	if(link.childNodes && link.childNodes.length>0)
		link.removeChild(link.childNodes[0]);
	link.appendChild(document.createTextNode(value));
}

function initInPlaceEdit(editNode){
	var elm=document.createElement("A");
	editNode.parentNode.appendChild(elm);

	elm.editModeNode=editNode;
	editNode.displayNode=elm;
	editNode.style.display='none';
	
	editNode.onblur=function(){
		var ajaxHelper=new SimpleAjaxHelper();
		var thisInput=this;
		ajaxHelper.post(this.form, true, function(){
			this.onSuccess=new function(req){
				thisInput.style.display="none";
				thisInput.displayNode.removeChild(thisInput.displayNode.childNodes[0]);
				makeLinkText(thisInput.displayNode, thisInput.value);
				thisInput.displayNode.style.display='block';
			}
			this.onFailure=new function(req){
				outputError("hmm, something failed. can you check your input?");
			};
		});
		
		
	};

	makeLinkText(elm, editNode.value);
	elm.href="#";
	elm.onclick=function(){
		this.style.display="none";
		this.editModeNode.style.display="block";
	};
	
	
	
	
	
	
	
	
	
	
}