var req;

var bDoingRequest = false
var bSubmitFormAfterAjax = false 

function rdAjaxRequest(commandParams, bValidate, sConfirm) {
	if (commandParams.search("rdRequestForwarding=Form") != -1) {
		rdAjaxRequestWithFormVars(commandParams, bValidate, sConfirm)
		return
	}

	if (bValidate) {
		if (bValidate.length != 0) {
	        if (bValidate == "true") {
		        var sErrorMsg = rdValidateForm()
		        if (sErrorMsg) {
			        alert(sErrorMsg)
			        return
		        }
            }
        }
	}
	if (sConfirm) {
		if (sConfirm.length != 0) {
			if (!confirm(sConfirm)) {
				return
			}
		}
	}
    
    if (bDoingRequest) {
        setTimeout('rdAjaxRequest("' + commandParams + '")', Math.floor(Math.random() * 1000))  //Wait a random amount of time between 0 and 1 second.
        return    
    }
    bDoingRequest = true
    rdShowAjaxFeedback(true,commandParams) 

	try {
		var url = "rdTemplate/rdAjax/rdAjax.aspx"
		req = YAHOO.util.Connect.asyncRequest('POST', url, callback, commandParams);
	}
	catch (e) {
		commandParams = commandParams.replace('rdAjaxCommand','rdAjaxAbort') 
		window.open(url + "?" + commandParams,'_self')
	}
}

var handleSuccess = function(o){
	if(o.responseText !== undefined){
        rdUpdatePage(o.responseXML, o.responseText)
        o = null //#3936
	}
}
var handleFailure = function(o){
    document.write(o.responseText) //#9390

}
var callback =
{
  success:handleSuccess,
  failure: handleFailure,
  argument: ['rdArg']
};


function rdAjaxRequestWithFormVars(commandURL, bValidate, sConfirm, bFromOnClick) {

	//Build the request URL.
    if (bFromOnClick) {
        commandURL = decodeURIComponent(commandURL)  //onClick and other events need decoding.#6549 and 
	}
	
	//Form vars:
	var sPrevRadioId
	var frm = document.forms[0]
	for (var i=0; i < frm.elements.length; i++) { 
		if (frm.elements[i].name.lastIndexOf("-PageNr") != -1) {
			if (frm.elements[i].name.lastIndexOf("-PageNr") == frm.elements[i].name.length-7) {
				continue  //Don't forward the interactive page nr.
			}
		}
		//Don't forward security stuff - it's already in session vars.
		if (frm.elements[i].name == "rdUsername") {continue}
		if (frm.elements[i].name == "rdPassword") {continue}
		if (frm.elements[i].name == "rdFormLogon") {continue}
		
		//Don't forward a variable that's already in the list, perhaps from LinkParams.
		if (commandURL.indexOf("&" + frm.elements[i].name + "=")!=-1) {continue}
		
		switch (frm.elements[i].type) {
			case 'hidden':  
			case 'text':  
			case 'textarea':  
			case 'password':  
			case 'select-one':  
			case 'file':  
				var sValue = rdGetFormFieldValue(frm.elements[i])
				commandURL += '&' + frm.elements[i].name + "=" + rdAjaxEncodeValue(sValue)
				break;
			case 'select-multiple':
				var selectedItems = new Array(); 
				for (var k = 0; k < frm.elements[i].length; k++) { 
					if (frm.elements[i].options[k].selected) {
						selectedItems[selectedItems.length] = frm.elements[i].options[k].value
					}
				}
				if (typeof window.rdInputValueDelimiter == 'undefined'){window.rdInputValueDelimiter=','}
				var sValue = selectedItems.join(rdInputValueDelimiter)
				if (sValue.length > 0) { //#5846
				    commandURL += '&' + frm.elements[i].name + "=" + rdAjaxEncodeValue(sValue) 
				}
				break;
			case 'checkbox':
				if (frm.elements[i].checked) {
					var sValue = rdGetFormFieldValue(frm.elements[i])
					commandURL += '&' + frm.elements[i].name + "=" + rdAjaxEncodeValue(sValue)
				}
				break;
			case 'radio': 
				var sRadioId = 'rdRadioButtonGroup' + frm.elements[i].name
				if (sPrevRadioId != sRadioId) {
					sPrevRadioId = sRadioId
					var sValue = rdGetFormFieldValue(document.getElementById(sRadioId))
					commandURL += '&' + frm.elements[i].name + "=" + rdAjaxEncodeValue(sValue)
				}
				break;
		}
	}
    commandURL = commandURL.replace("rdRequestForwarding=Form","") //Don't loop back here again from rdAjaxRequest()
	rdAjaxRequest(commandURL, bValidate, sConfirm)
}

function rdAjaxEncodeValue(sValue){
    sValue = encodeURI(sValue)
    sValue = sValue.replace(/&/g,"%26")  //replace &
    sValue = sValue.replace(/\+/g,"%2B") //replace +
    return sValue
}

function rdUpdatePage(xmlResponse, sResponse) {

	if (sResponse.length != 0) {
	    if (sResponse.indexOf('meta name="rdDebug"')!=-1) { //8465
	        rdReportResponseError(sResponse)
	        return
	    }
	    if (!xmlResponse.documentElement) {
	        rdReportResponseError(sResponse)
	        return
	    }
	    if (!xmlResponse.documentElement.getAttribute("rdAjaxCommand")) {
	        rdReportResponseError(sResponse)
	    }
	    
	    window.status =""
		switch (xmlResponse.documentElement.getAttribute("rdAjaxCommand")) {
		
				case 'RefreshDataTable':
					//Find the HTML TABLE's DIV.
					var sTableDivID = xmlResponse.documentElement.getAttribute('id')
					var eleTableDiv = document.getElementById(sTableDivID)
					if (eleTableDiv) {
						//Remove the outer response's DIV.
						var nDivPos = sResponse.indexOf("<DIV ")
						sResponse = sResponse.substr(sResponse.indexOf(">",nDivPos) + 1)
						sResponse = sResponse.substr(0,sResponse.lastIndexOf("rdDataTableDivEnd"))
						sResponse = sResponse.substr(0,sResponse.lastIndexOf("<"))
						
						//Write the response html to the page, replacing the original table.
						if (!rdAjaxIframe.contentDocument) {
							//IE, Opera	
						    eleTableDiv.innerHTML = sResponse
						} else {
							//Mozilla
							//Remove the table DIV's children
							while (eleTableDiv.childNodes.length!=0) {
							    eleTableDiv.removeChild(eleTableDiv.firstChild)
							}
							//Add the child nodes from the Ajax reponse.
							var doc = rdAjaxIframe.contentDocument
							doc.body.innerHTML = sResponse
    						for (var i=0; i < doc.body.childNodes.length; i++) {
                                var eleNew = doc.body.childNodes[i]
							    var range = document.createRange() 
							    range.selectNode(eleTableDiv) 
							    var docFrag = range.createContextualFragment(getMozillaOuterHtml(eleNew));
							    eleTableDiv.appendChild(docFrag) 
							}
						}
					}
        		break;
					
				case 'RefreshElement':
					var sElementIDs = xmlResponse.documentElement.getAttribute('rdRefreshElementID').split(",")
					for (var i=0; i <  sElementIDs.length; i++) { 
						var eleOld = document.getElementById(sElementIDs[i])
						if (window.rdInputSliderUnload){rdInputSliderUnload(eleOld)}  //Unload old InputSlider.
						if (eleOld) {
						
							if (!rdAjaxIframe.contentDocument) {
						        var eleNew;
						        if (xmlResponse.evaluate) {
							        //Chrome, Safari, Opera
    						        var n = xmlResponse.evaluate("//*[@id='" + sElementIDs[i] + "']", xmlResponse, null, XPathResult.ANY_TYPE, null);    						    
							        eleNew = n.iterateNext();
							        if (eleNew)
							            eleOld.outerHTML  = getNodeInnerText(eleNew);
    						    }	 	
                                else {
                                    //IE
    							    eleNew = xmlResponse.selectSingleNode("//*[@id='" + sElementIDs[i] + "']");
    							    if (eleNew) {
    							        eleOld.outerHTML = eleNew.xml;
    							    }
    						    }					
    					     
							} else {
								//Mozilla
								var doc = rdAjaxIframe.contentDocument
								doc.body.innerHTML = sResponse
								var eleNew = doc.getElementById(sElementIDs[i])
								if (eleNew) {
									var range = document.createRange(); 
									range.selectNode(eleOld); 
									var docFrag = range.createContextualFragment(getMozillaOuterHtml(eleNew)); 
									eleOld.parentNode.replaceChild(docFrag, eleOld) 
								}
							}
						    if (window.rdInitDashboardPanels) {
						        rdInitDashboardPanels()
						    }
						    
						    //Tabs elements need to run some script
						    if (eleOld.getAttribute("rdElement") == "Tabs") {
						        var scriptTab = document.getElementById("rdTabsScript_" + eleOld.id)
						        if (scriptTab) {
						            //Make the script.
						            var sScript = "var currTabIndex = document.getElementById('rdActiveTabIndex_" + eleOld.id + "').value;"
						            sScript += "currTabIndex=parseInt(currTabIndex);"
						            sScript += scriptTab.text
						            sScript += "rdTabs_" + eleOld.id + ".set('activeIndex',currTabIndex);"
						            //Run the script.
						            eval(sScript)
						        }
						    }
						    
//						    Not working because other elements need to be reloaded too.
//						    if (window.rdGmapLoad) {
//						        //May need to reload the map.
//						        if (eleOld.getAttribute("GoogleMapTypes")) {
//						            rdGmapLoad(sElementIDs[i])
//						        }
//						    }

                            if (eleNew) {
                                if (eleNew.getAttribute("rdPopupPanel")=="True") {
                                    //PopupPanel is getting re-hidden with Action.Refresh.  If it was modal, get rid of the shading.
                                    if (rdModalShade) {
                                        rdModalShade.style.display="none"
                                    }
                                }
                                if (eleNew.getAttribute("CLASS")=="rdDataCalendar"){
                                //debug;
                                    if(eleNew.getAttribute("HiddenDate") != null){  // To regulate the addition of the functions from a regular DataCalendar
                                        //rdOnloadColoring(eleNew.getAttribute("HiddenDate"), eleNew.getAttribute("NumberOfMonths"));
                                        rdOnloadColoring(eleNew.getAttribute("id"));
                                        rdOnLoadJavascriptAddition(eleNew.getAttribute("id"))
                                    }
                                }   // to handle the OnLoad Coloring for the DataCalendar
                                
                                //Tab panels need to get re-hidden and re-shown.
                                if (eleNew.getAttribute("id").indexOf("rdTabPanel_")==0) {
                                    var eleActiveTab = document.getElementById(eleNew.getAttribute("id"))
                                    var eleTabs = eleActiveTab.parentNode
                                    for (var i=0; i < eleTabs.childNodes.length; i++) {
                                        if (eleTabs.childNodes[i].id == eleActiveTab.id) {
                                            eleTabs.childNodes[i].style.display=""
                                        }else{
                                            eleTabs.childNodes[i].style.display="none"
                                        }
                                    }
                                }
                                
                            }
						}
					}
					break;
					
				case 'CalendarRefreshElement':  // Block added to support the Ajax refresh for the calendar element
					var sElementIDs = xmlResponse.documentElement.getAttribute('rdCalendarRefreshElementID').split(",")
					for (var i=0; i <  sElementIDs.length; i++) { 
						eleOld = document.getElementById(sElementIDs[i])
						if (window.rdInputSliderUnload){rdInputSliderUnload(eleOld)}  //Unload old InputSlider.
						if (eleOld) {
						
							if (!rdAjaxIframe.contentDocument) {
						        var eleNew;
						        if (xmlResponse.evaluate) {
							        //Chrome, Safari, Opera
    						        var n = xmlResponse.evaluate("//*[@id='" + sElementIDs[i] + "']", xmlResponse, null, XPathResult.ANY_TYPE, null);    						    
							        eleNew = n.iterateNext();
							        if (eleNew){
							        //debug;
							            if ((eleOld.tagName != "INPUT") && (eleOld.parentNode.lastElementChild.id != 'PPDatePickerForInputDate_'+ eleOld.id)){
							                eleOld.outerHTML  = getNodeInnerText(eleNew);
							            }
							        }
    						    }	 	
                                else {
                                    //IE
    							    eleNew = xmlResponse.selectSingleNode("//*[@id='" + sElementIDs[i] + "']");
    							    if (eleNew) {
    							        if ((eleOld.tagName != "INPUT") && (eleOld.parentElement.lastChild.id != 'PPDatePickerForInputDate_'+ eleOld.id)){
    							        // to handle the Calendar element refresh issue.
    							                eleOld.outerHTML = eleNew.xml;
    							        }
    							    }
    						    }					
    					     
							} else {
								//Mozilla
								var doc = rdAjaxIframe.contentDocument
								doc.body.innerHTML = sResponse
								var eleNew = doc.getElementById(sElementIDs[i])
								if (eleNew) {
									var range = document.createRange(); 
									range.selectNode(eleOld); 
									var docFrag = range.createContextualFragment(getMozillaOuterHtml(eleNew)); 
//									if ((eleOld.localName != "INPUT") && (eleOld.parentNode.lastElementChild.id != 'PPDatePickerForInputDate_'+ eleOld.id)){    'FireFox 3.0.15 doesn't work with this.
                                    if ((eleOld.localName != "INPUT") && (eleOld.parentNode.childNodes[eleOld.parentNode.childNodes.length -1].id != 'PPDatePickerForInputDate_'+ eleOld.id)){
									    eleOld.parentNode.replaceChild(docFrag, eleOld) 
									}
								}
							}
						        if(eleNew){
                                    if (eleNew.getAttribute("CLASS")=="rdDataCalendar"){
                                    //debug;
                                        if(eleNew.getAttribute("HiddenDate") != null){  // To regulate the addition of the functions from a regular DataCalendar
                                            //rdOnloadColoring(eleNew.getAttribute("HiddenDate"), eleNew.getAttribute("NumberOfMonths"));
                                            rdOnloadColoring(eleNew.getAttribute("id"));
                                            rdOnLoadJavascriptAddition(eleNew.getAttribute("id"))
                                        }
                                    }   // to handle the OnLoad Coloring for the DataCalendar      
                                }                         
                                
                            }
						}
					break;

				case 'UpdateTreeBranchRows':
					//Find the end position of the clicked table row.
					var sRowGUID =  xmlResponse.documentElement.getAttribute('rdRowGUID')
					var sTableDivID = xmlResponse.documentElement.getAttribute('id')
					var eleTableDiv = document.getElementById(sTableDivID)
					if (eleTableDiv) {
						var sTable = eleTableDiv.innerHTML
						var nInsertPos = sTable.indexOf(sRowGUID)
						nInsertPos = sTable.indexOf("rdRowEnd",nInsertPos)
						nInsertPos = sTable.indexOf("</tr>",nInsertPos) + 5

						//Remove the response's outer DIV.
						sResponse = sResponse.substr(sResponse.indexOf(">") + 1)
						sResponse = sResponse.substr(0,sResponse.lastIndexOf("<"))

						//Insert the returned rows.
						eleTableDiv.innerHTML = sTable.substr(0,nInsertPos) + sResponse + sTable.substr(nInsertPos)
						////Remove the outer DIV.
						//sResponse = sResponse.substr(sResponse.indexOf(">") + 1)
						//sResponse = sResponse.substr(0,sResponse.lastIndexOf("<"))
						
					}
					break;
					
				case 'UpdateMapImage':
				    //Used by AWS Map Images
					var sImageID = xmlResponse.documentElement.getAttribute('id')
					var eleImage = document.getElementById(sImageID)
					if (eleImage) {
					    //Update the image SRC.
		                var sImageSrc = xmlResponse.documentElement.getAttribute('rdSrc')
		                eleImage.setAttribute("src",sImageSrc)
                    }
                    break;
					
				case 'RequestRefreshElement':
				    //Request back to the server so that just this element is refreshed.
					var sElementID = xmlResponse.documentElement.getAttribute('ElementID')
					var sReport = xmlResponse.documentElement.getAttribute('rdReport')
				    rdAjaxRequest('rdAjaxCommand=RefreshElement&rdRefreshElementID=' + sElementID + '&rdReport=' + sReport)
					break;

				case 'RequestRefreshPage':
				    var sHref = window.location.href
				    window.location.href = sHref
					break;

				case 'ShowStatus':
				    window.status = xmlResponse.documentElement.getAttribute("Status")
					
		}
	
		if (typeof window.rdRepositionSliders != 'undefined') {
			//Move CellColorSliders, if there are any.
			rdRepositionSliders()
		}
		if (typeof dragtable!="undefined"){
		    //Reinit DraggableColumns
		    dragtable.init()
		}
	}
	
	//May need to run some script.
    rdAjaxRunOnLoad(xmlResponse)   
	    
	bDoingRequest = false
	bSubmitFormAfterAjax = false
	
    //Manage feedback.
    var bStopFeedback = true
	if (xmlResponse.documentElement.getAttribute("rdAjaxCommand")){
	    if (xmlResponse.documentElement.getAttribute("rdAjaxCommand").indexOf("Request")!=-1) { 
	        //Keep feedback going if we're making another request with RequestRefreshElement or RequestRefreshPage.
	        bStopFeedback = false
        }
    }
    if (bStopFeedback) {
	    rdShowAjaxFeedback(false)
	}
    	   
}

function rdAjaxRunOnLoad(xml) {
    var scripts = xml.getElementsByTagName('SCRIPT')
    for (var i=0; i < scripts.length; i++) {
        var attrRun = scripts[i].attributes.getNamedItem('rdAjaxRunOnLoad')
        if (attrRun) {
            if (attrRun.value == 'True') {
                if (scripts[i].text) {
                    eval(scripts[i].text) //IE
                } else {
                    eval(scripts[i].textContent)
                }
            }
        }
    }
}

function rdGetFormFieldValue(fld) {
	
	var sValue

	if (fld.tagName == "RDRADIOBUTTONGROUP") {
		// Radio buttons
		sFieldId = fld.id.replace(/rdRadioButtonGroup/g, '')
		var cInputs = document.getElementsByTagName("INPUT")
		for (var i = 0; i < cInputs.length; i++) {
			if (cInputs[i].name == sFieldId) {
				if (cInputs[i].checked) {
					sValue = cInputs[i].value
					break
				}
			}
		}
		if (sValue == undefined) {
				sValue = ''
			}

	} else {
		// All other fields
		if (fld.value.length == 0) {
			sValue = ''
		} else {
			sValue = fld.value
		}
	}
	return sValue	
}

function getMozillaOuterHtml(ele) {
	var sHtml = "<" + ele.nodeName
	for (var i=0; i < ele.attributes.length; i++) { 
		sHtml += ' ' + ele.attributes[i].name + '="' + ele.attributes[i].value + '"'
	}
	sHtml += ">"
	sHtml += ele.innerHTML
	sHtml += "</" + ele.nodeName + ">"
	return sHtml
}

function rdReportResponseError(sResponse) {
//    if (sResponse.indexOf('<rdErrorMsgContent>') != -1) {
        document.body.innerHTML = sResponse
//      }
}

var rdCurrFeedbackElementShow
var rdCurrFeedbackElementHide
function rdShowAjaxFeedback(bShow, sCommandParams) {

    //Undo the previous feedback.
    if (rdCurrFeedbackElementShow) {
        rdCurrFeedbackElementShow.style.display="none" 
        rdCurrFeedbackElementShow=null
    }
    if (rdCurrFeedbackElementHide) {
        rdCurrFeedbackElementHide.style.display="" 
        rdCurrFeedbackElementHide=null
    }
    document.documentElement.style.cursor = "auto"

    if (bShow) {
        var sParams
        //Show an element
        sParams = sCommandParams.split("&rdFeedbackShowElementID=")
        if (sParams.length > 1) {
            var sFeedbackElementID = sParams[1].split("&")[0]
            rdCurrFeedbackElementShow=document.getElementById(sFeedbackElementID)
            if (rdCurrFeedbackElementShow) {
                rdCurrFeedbackElementShow.style.display="" 
            }
        }
        //Hide an element
        sParams = sCommandParams.split("&rdFeedbackHideElementID=")
        if (sParams.length > 1) {
            var sFeedbackElementID = sParams[1].split("&")[0]
            rdCurrFeedbackElementHide=document.getElementById(sFeedbackElementID)
            if (rdCurrFeedbackElementHide) {
                rdCurrFeedbackElementHide.style.display="none" 
            }
        }
    }
}

function getNodeInnerText(xmlObj)
{
    var innerText = "";
    var aIndex;
    var attrib;
    
    innerText += assembleElementStartTag(xmlObj);
    innerText += assembleElementChildren(xmlObj);
    innerText += "</" + xmlObj.nodeName + ">";
    
    return innerText;
}

function assembleElementChildren(xmlObj)
{
    var children = "";
    var cIndex = 0;
    var child;
    for (cIndex=0;cIndex<xmlObj.childNodes.length;cIndex++)
    {
        child = xmlObj.childNodes[cIndex];
        if (child.nodeName != null)
        {
            if (child.nodeName != "#text")
            {
                children += assembleElementStartTag(child);
                children += assembleElementChildren(child);
                children += "</" + child.nodeName + ">";
            }
            else
            {
                if (child.nodeValue != null)
                { children += child.nodeValue; }
            }
        }
        else
        {
            var huh = "wha?";
        }
    }
    
    return children;
}

function assembleElementStartTag(xmlObj)
{
    var element = "";
    element += "<" + xmlObj.nodeName;
    
    if (xmlObj.attributes != null)
    {
        var aIndex = 0;
        for (aIndex=0;aIndex<xmlObj.attributes.length;aIndex++)
        {
            attrib = xmlObj.attributes[aIndex];
            element += " " + attrib.nodeName + "=\"" + xmlFriendlyValue(attrib.nodeValue) + "\"";
        }
    }
    
    element += ">";
    if (xmlObj.nodeValue != null)
    { element += xmlObj.nodeValue; }
    
    return element;
}

function xmlFriendlyValue(inValue)
{
    var outValue = inValue;
    outValue = outValue.toString().replace(/>/g,"&gt;") //10228
    outValue = outValue.toString().replace(/</g,"&lt;")
    outValue = outValue.toString().replace(/"/g,"&quot;")
    return outValue;
}

