/* ==================================================================
    Generic Functions for Showing/Insert/Modify/Delete Div based List
  ==================================================================== */
//-- Main Function Call to Add/Delete/Modify xmlDOM nodes/records
function updateList(xmlDOM,xslDOM,targetDiv,updateMode,targetWin) {

if(xmlDOM==null ){return;}
	if (updateMode == "add") {
	
		var curElem = getCurrentDOMElement(targetDiv,xmlDOM,targetWin)
	
		if( curElem !=null)
		{		
		addDOMRecord(xmlDOM,xslDOM,curElem,targetDiv,targetWin);}
	}
	else if (updateMode == "edit") {
		//Get Current Element
		var curElem = getCurrentDOMElement(targetDiv,xmlDOM,targetWin )
		//Modify
		modifyDOMRecord(xmlDOM,xslDOM,curElem,targetDiv,targetWin);
	}
	else if (updateMode == "delete") {

		//Get Current Element
		var curElem = getCurrentDOMElement(targetDiv,xmlDOM,targetWin )
		//Delete
		deleteDOMRecord(xmlDOM,xslDOM,curElem,targetDiv,targetWin);
	}
}

//-- Function to Add xmlDOM nodes/records
function addDOMRecord(xmlDOM,xslDOM,curElem,targetDiv,targetWin ) {
 	//Create New Node     
   	var newElem = xmlDOM.createElement("z:row");
	newElem.setAttribute("xmlns:z", "RowsetSchema");
	//Customized function updating module specific attributes into newElem(passed by ref)
	setUpdatedElement(newElem);
	//Append & Transform on Div 
   	xmlDOM.documentElement.childNodes.item(1).appendChild(newElem);
   	
	targetDiv.innerHTML = xmlDOM.transformNode(xslDOM);    
	//Highlight the added row
	var i = targetWin.getRowNobyElementandDiv(curElem,targetDiv);
	
	highLightRowByRowNo(targetDiv,i)
}


//-- Function to modify xmlDOM nodes/records
function modifyDOMRecord(xmlDOM,xslDOM,thisElem,targetDiv,targetWin ) { 		
	//Customized function updating module specific attributes into newElem(passed by ref)
        setUpdatedElement(thisElem);
	//Transform on Div
	xmlDOM.transformNode(xslDOM);    
	targetDiv.innerHTML = xmlDOM.transformNode(xslDOM);    
	//HighLight current row again
	var i = targetWin.getRowNobyElementandDiv(thisElem,targetDiv);
	highLightRowByRowNo(targetDiv,i)
}


//-- Function to delete xmlDOM nodes/records
function deleteDOMRecord(xmlDOM,xslDOM,thisElem,targetDiv,targetWin) {

	//Get Current Row in DOM
        var i = FindRowNoByElement(xmlDOM,thisElem);
	//Get CurrentRow in Table
	var j = targetWin.getRowNobyElementandDiv(thisElem,targetDiv) ;
	//Go Privious Row
	j = j - 1 

	 // Remove the element from DOM
	oldChild = xmlDOM.documentElement.childNodes.item(1).removeChild(xmlDOM.documentElement.childNodes.item(1).childNodes.item(i));
        // Transform XML
        targetDiv.innerHTML = xmlDOM.transformNode(xslDOM);              
        // HighLightRow a valid row
        var nodeCount;
        var nodeList; 
        nodeList = xmlDOM.documentElement.childNodes.item(1).childNodes;
        nodeCount = nodeList.length;        
        // Find Current Node identification number
	
	if ( nodeCount != 0   )	{
		if ( j == 0 )	{
			highLightRowByRowNo(targetDiv,1);  
		}      
		else { 
			highLightRowByRowNo(targetDiv,j);
		}
        }
}


//-- Function to execute delete query and delete the selected row/element from DOM
function deleteRecord(deleteURL,xmlDOM,xslDOM,targetDiv,msg,targetWin) {
	//Get Current Element
	var xmlElem = getCurrentDOMElement(targetDiv,xmlDOM,targetWin )
	if ( xmlElem == null )	{
		alert("Please select the record to Delete");
		return;
	}
	
	if (confirm(msg))	{
		var returnValue = getDataByURL(deleteURL)
	
		if ( returnValue == 1 )	{			
			updateList(xmlDOM,xslDOM,targetDiv,"delete",targetWin)
		}
		else if ( returnValue == 5 ){
		alert("Record is being accessed by other user, Please try later")
		}
		else if ( returnValue == 6 ){
		alert("Your session has Expired Please Login Again")
		}
		else if ( returnValue == 7 ){
		alert("CanNot Delete ShortListed Candidate")
		}
		else {
			alert("Delete Failed")
		}
	 }
}



//-- Function to hightlight the row corrosponding to a particular DOM element (not being called)
function highlightDOMRecord(xmlDOM,elem,targetDiv){
	var i;
	i = FindRowNoByElement(xmlDOM,elem);
	i = i+ 1;
	highLightRowByRowNo(targetDiv,i);
}


//-- Function to get current element
function  getCurrentDOMElement(targetDiv,xmlDOM,targetWin){		
	//Find the current row	
	var curRow = getCurrentTableRow(targetDiv)
if(curRow != null)
{
	//Get Filter.This is customized for every page
	var filter= targetWin.getFilter(curRow,xmlDOM)
	//Filter & return current element
	
	curElem = xmlDOM.selectSingleNode(filter);	
		return curElem	
}
		



}



//-- Function to find row no. corrosponding to a particular DOM element
function FindRowNoByElement(xmlDOM,thisElem) {	
	var i=null;
	var nodeCount;
	var nodeList; 
	nodeList = xmlDOM.documentElement.childNodes.item(1).childNodes;
	nodeCount = nodeList.length;   
	for (i=0; i< nodeCount; i++){ 
		if (thisElem.xml == xmlDOM.documentElement.childNodes.item(1).childNodes.item(i).xml ){
			break;	
		}	
	}    

    return i;
}


//-- Filter on Particular Field
function filterData(query,xslDOM,xmlDOM,targetDiv) {
	selectField = xslDOM.selectSingleNode("//@select");
	//alert (selectField.xml);
	selectField.value = query;
	//alert (selectField.xml);
	targetDiv.innerHTML = xmlDOM.transformNode(xslDOM);
}

//-- Function to get data by firing a URL. This is used for executing SP and read their return value
function getDataByURL(URL) {

	var xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP"); 
	xmlHTTP.open("POST",URL, false);
	xmlHTTP.send("No=data");
	var returnValue = xmlHTTP.responseText;
//	alert("returnValue = "+returnValue);
	return returnValue
}

//-- Function to render any url in a specified div
function renderDetailsData(targetDiv,detailsURL) {
	var returnValue = getDataByURL(detailsURL)
        targetDiv.innerHTML = returnValue  
}

//-- Function to find current/clicked table row element
function getCurrentTableRowByHTMLElement(src){
	while(src.tagName!="TR")  thisRow = src.parentElement;	
	return src
}

//==================================================================
//These functions are common for list and detail
//==================================================================

//-- Function to hightlight the specified table row from a div
function highLightRowByRowNo(targetDiv,i)	{
	var totRow
	totRow = targetDiv.childNodes(0).childNodes(0).childNodes.length 
  
	if (totRow <= 1) { return }  // Modified ///////////////////////////////
      	if (totRow <= i) { return }  // Required because of cookies set on browser

	for(var j=0 ; j < totRow; j++ ){
		targetDiv.childNodes(0).childNodes(0).childNodes(j).style.background="#E5E5E5";	     	
	}
	targetDiv.childNodes(0).childNodes(0).childNodes(i).style.background="#BFC6D7";	     
}

//-- Function to return currently highlighted row
function getCurrentTableRow(targetDiv){


	var totRow
	totRow = targetDiv.childNodes(0).childNodes(0).childNodes.length 
	for(var i=0 ; i<totRow; i++ ) {

		if ( targetDiv.childNodes(0).childNodes(0).childNodes(i).style.background=="#e5eee5") {                       


			return targetDiv.childNodes(0).childNodes(0).childNodes(i)

		}
	}	
	return null
}

//-- Function to find row no. of a currently highlighted row
function getCurrentHighLightRowNo(targetDiv){
	var totRow
	totRow = targetDiv.childNodes(0).childNodes(0).childNodes.length 
	for(var i=0 ; i<totRow; i++ ) {
	if ( targetDiv.childNodes(0).childNodes(0).childNodes(i).style.background=="#bfc6d7") {                       
		return i 
		}
	}	
	return 0
}

/* ================================================================
    Tab related Functions
  ================================================================ */
var maxTabs // Maximum No of Tabls
var currTab //current visible tab 

//Functionto Display talb
function showTabs(itab){
	currTab = itab;
	
	for (var i=0;i<maxTabs;i++) {
		if (i == itab) {
			tabs.childNodes(i).style.color = 'black';										
			tabs.childNodes(i).bgColor = 'E5E5E5';
			main.childNodes(i).style.visibility='visible';					
			main.childNodes(i).style.position='absolute';}
		else {
			tabs.childNodes(i).style.color = 'black';															
			tabs.childNodes(i).background='white';
			main.childNodes(i).style.visibility='hidden';
	     }
	}
}

//Funtion to set Maximun no of tabs
function setTabs(max){
	maxTabs = max;
}


/*====================================================================
	Handle keydown event
======================================================================*/
function doKeyDown() {
	if (window.event.ctrlKey && window.event.keyCode=='9') {
		currTab++;
		if (currTab >= maxTabs) { currTab=0; }

		//hideResume();
		//showTabs(currTab);
		tabber(currTab);
		window.focus();
	}
}  
function changeClass(obj, new_style) {
    obj.className = new_style;
}

/*====================================================================
	Handle Checkbox
======================================================================*/
function onClickCheckBox(field){
	if ( field.checked == true ){
		field.value = "ON"
	}
	else{
		field.value = "OFF"
	}
}

function setCheckBoxValues(){
	for (var i = 0; i<document.detailsform.elements.length; i++) {
		if ((document.detailsform.elements[i].type.toLowerCase().indexOf('checkbox') > -1)) {
			if ( document.detailsform.elements[i].checked == true ){
				document.detailsform.elements[i].value = "ON"
			}
			else{
				document.detailsform.elements[i].value = "OFF"
			}
		}
    }
}

/*====================================================================
	Form State
======================================================================*/

function getFieldsString() {
    var answer = '';
	for (var i = 0; i<document.detailsform.elements.length; i++) {
		answer += document.detailsform.elements[i].value + ' | ';
    }
    return answer
}


//-- Function to execute delete query and delete the selected row/element from DOM
function deleteRecord_return(deleteURL,xmlDOM,xslDOM,targetDiv,msg,targetWin) {


	//Get Current Element
	var xmlElem = getCurrentDOMElement(targetDiv,xmlDOM,targetWin )
	if ( xmlElem == null )	{
		alert("Please select the record to Delete");
		return;
	}
	
	if (confirm(msg))	
	{
		var returnValue = getDataByURL(deleteURL)
		if ( returnValue == 1 )	
		{			
			updateList(xmlDOM,xslDOM,targetDiv,"delete",targetWin)
			return 1
		}
		else 
			return returnValue
	 }
}
function replaceSubstring(inputString, fromString, toString) {
   // Goes through the inputString and replaces every occurrence of fromString with toString
   var temp = inputString;
   if (fromString == "") {
      return inputString;
   }
   if (toString.indexOf(fromString) == -1) { // If the string being replaced is not a part of the replacement string (normal situation)
      while (temp.indexOf(fromString) != -1) {
         var toTheLeft = temp.substring(0, temp.indexOf(fromString));
         var toTheRight = temp.substring(temp.indexOf(fromString)+fromString.length, temp.length);
         temp = toTheLeft + toString + toTheRight;
      }
   } else { // String being replaced is part of replacement string (like "+" being replaced with "++") - prevent an infinite loop
      var midStrings = new Array("~", "`", "_", "^", "#");
      var midStringLen = 1;
      var midString = "";
      // Find a string that doesn't exist in the inputString to be used
      // as an "inbetween" string
      while (midString == "") {
         for (var i=0; i < midStrings.length; i++) {
            var tempMidString = "";
            for (var j=0; j < midStringLen; j++) { tempMidString += midStrings[i]; }
            if (fromString.indexOf(tempMidString) == -1) {
               midString = tempMidString;
               i = midStrings.length + 1;
            }
         }
      } // Keep on going until we build an "inbetween" string that doesn't exist
      // Now go through and do two replaces - first, replace the "fromString" with the "inbetween" string
      while (temp.indexOf(fromString) != -1) {
         var toTheLeft = temp.substring(0, temp.indexOf(fromString));
         var toTheRight = temp.substring(temp.indexOf(fromString)+fromString.length, temp.length);
         temp = toTheLeft + midString + toTheRight;
      }
      // Next, replace the "inbetween" string with the "toString"
      while (temp.indexOf(midString) != -1) {
         var toTheLeft = temp.substring(0, temp.indexOf(midString));
         var toTheRight = temp.substring(temp.indexOf(midString)+midString.length, temp.length);
         temp = toTheLeft + toString + toTheRight;
      }
   } // Ends the check to see if the string being replaced is part of the replacement string or not
   return temp; // Send the updated string back to the user
} // Ends the
