/**
The Mark List Page is fully dependent on this JavaScript.

Nomenclature to understand:
PG_CNT = Total number of Mark List Items marked on this Page when the page is loaded for the first time.
	This is hidden variable in the form. As soon as the page is loaded this script doPageInitialization() executes to capture this information
	and stores this in this PG_CNT Object.
MARK_CNT = Total number of Mark List Items marked on the server. This includes even the items marked on this particular page.
At any point of time the MARK_CNT is the system of record for the mark List contents.

The PG_CNT & MARK_CNT will be constants till the page reloads !!!!

At any point of time we can find the total items in the Mark List by using the following equation
MARK_CNT - PG_CNT + CURRENT_COUNT

CURRENT_COUNT = Current number of Items Marked on the current page. It is calculated throug the function getNoOfMarkedItem()
Finding the Actual Items marked on the page is really tricky. Hence we have all this javascript functions to take care of this.

**/
// Variable to ta
//var initialmarkedinthispage=0;

// Keeps track of all the javascript variables during page initialization.

function doPageInitialization()	 {
	var ml = getDynamicSearchFormObj();
	var pgCnt = 0;
	var len = ml.elements.length;
	var e;
	var checkAllBx = true;  // Flag to check or uncheck the checkAll box in searchresult page.
	for (var i = 0; i < len; i++) {
		e = ml.elements[i];
		if (e.name.substring(0, 8) == "markList") {
            if (e.checked ==true) {
                pgCnt += 1;
            }  else {
                checkAllBx = false;
            }
        }
    }
	if( checkAllBx == true ) {
		if(ml.markAllChk!=null){
			ml.markAllChk.checked = true;
		}
	}
	document.marked.PG_CNT.value = pgCnt;
	//alert("PG_CNT="+pgCnt+" MARK_CNT="+document.marked.MARK_CNT.value);
}

// Returns the current count of number of Items marked in the particular page.
function getNoOfMarkedItem()	{
	var ml = getDynamicSearchFormObj();

	var len = ml.elements.length;
	var e;
	var curCnt = 0;
    // Check for total number of Marked & capture the status of each marked Checkboxes.
	// If it exceeds the predefined count then it break.
	for (var i = 0; i < len; i++) {
        e = ml.elements[i];
        if (e.name.substring(0, 8) == "markList") {
            if (e.checked ==true) {
                curCnt += 1;
             }
         }
	}
	return curCnt;
}

/**
* Generic function to prepare the Marked String that needs to be sent to the browser for Update.
* This is written in a generic fashion to cater to both "Select" for individual checkboxes and "SelectAll" checkbox as well.
*
* All what it does it creates a Mark List String of all the items in the current page with their status appended with appropriate delimiter
*/
function prepareMarkedString(dirtyMarkedString, updateStatus)	{
    // Retrieving the Tab ID from the String.
    // The original format of the string would be <TABID>_<DocID>_<BucketSubID>_<PageNo>
    // Final Format would be <TabID>_<DocID>_<UpdateStatus>_<BucketSubID>_<PageNo>
    var markedInfo = "";
    markedInfo +=  dirtyMarkedString.substring(0,dirtyMarkedString.indexOf('_')); // Retrieve the tabID & store in markedInfo
    dirtyMarkedString = dirtyMarkedString.substring(dirtyMarkedString.indexOf('_') + 1); // Remove the tabID from the markedString.

    // Retrieving the DocID
    markedInfo +=  "_"+ dirtyMarkedString.substring(0,dirtyMarkedString.indexOf('_')); // Retrieve the docID from markedString.
    dirtyMarkedString =  dirtyMarkedString.substring(dirtyMarkedString.indexOf('_') + 1); // Remove the docID from the markedString

    if(updateStatus == "1")	{
        markedInfo += "_"+"1";
    } else {
        markedInfo += "_"+"0";
    }

    // append the rest to the markedInfo
    markedInfo += "_" + dirtyMarkedString;
/**
    var tmpIndex = dirtyMarkedString.indexOf('_'); // Check for availability of PageNum
    if( tmpIndex != -1)	{ // Page Num available
        //markedInfo +=  "_" + dirtyMarkedString.substring(0,dirtyMarkedString.indexOf('_'));
        markedInfo +=  dirtyMarkedString; // Appending the bucketSubID & Page Num.
    } else { // Page Num not available
        markedInfo += "_" + dirtyMarkedString; // Appending the bucketSubID.
    }
    */
    markedInfo += "^";
    return markedInfo;
}

// Returns the MarkListString for all the checkboxes depending on their state.
function getMarkListString()	 {
	var ml = getDynamicSearchFormObj();
	var len = ml.elements.length;
	var e;

	var markedInfo = "";
	for (var i = 0; i < len; i++) {
        e = ml.elements[i];
        if (e.name.substring(0, 8) == "markList") {
            var markedString = e.value;
            if (e.checked == true ) {
                markedInfo += prepareMarkedString(markedString,"1");
            }else {
                markedInfo += prepareMarkedString(markedString,"0");
            }
        }
	}
	return markedInfo;
}

// Returns the MarkListString for the clicked checkbox depending on its state.
/*
function getSingleMarkListString(chkbox)	 {

	var markedInfo = "";
  var markedString = chkbox.value;
  if (chkbox.checked == true ) {
      markedInfo += prepareMarkedString(markedString,"1");
  }else {
      markedInfo += prepareMarkedString(markedString,"0");
  }

  return getMarkListURLForMarkedInfo(markedInfo);
}
*/

/* create and return an XML HTTP Request object */
function createXmlHttpRequest() {
	var xmlhttp=false;
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	// JScript gives us Conditional compilation, we can cope with old IE versions.
	// and security blocked creation of the objects.
	 try {
	  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	 } catch (e) {
	  try {
	   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	  } catch (E) {
	   xmlhttp = false;
	  }
	 }
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
	  xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}

/* parse and post a request using XML HTTP Request */
function postRequest(url)
{
	var urlParams = "";
	var baseURL = url;

    var ipos = url.indexOf('?');
    if (ipos > -1) {
		urlParams = url.substr(ipos+1);
		baseURL = url.substr(0, ipos);
	}

    var xmlhttp = createXmlHttpRequest();
	xmlhttp.open("POST", baseURL, true);
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlhttp.send(urlParams);
}

// Displays the ViewMarkListButton depending on the availability of MarkListItems.
// The view markListItem button would be made invisible if no markListItems are present.
function displayViewMarkList(totalMarked)	 {

    // Display the marked count on the browser.
    var viewMarkList =  new Image();

      viewMarkList = getReturnObj("viewmarklist");
	if( totalMarked > 0)	{
    	viewMarkList.src = "http://g.ggimg.com/gvrl/gvrl_2_3_8_234/images/b_viewmkh.gif";
    }
    else {
     	viewMarkList.src = "http://g.ggimg.com/gvrl/gvrl_2_3_8_234/images/whitespace.gif";
    }
}

function getTotalMarkedCount() {
    var markCnt = document.marked.MARK_CNT.value;
	var pgCnt =  document.marked.PG_CNT.value;
	var curCnt = getNoOfMarkedItem();
	var totalMarked = markCnt - pgCnt + curCnt;
	return totalMarked;
}

function getMarkListURL() {
    var markedInfo = getMarkListString();
    return getMarkListURLForMarkedInfo(markedInfo);
}

function getMarkListURLForMarkedInfo(markedInfo) {
    var timeNow = new Date();
    var qrystring = updateMarkListLink + "&markedString="+markedInfo;
    qrystring += "&a="+timeNow.getTime();
    return qrystring;
}

// Marks the markListItem on the result list & markList page.
//# var tmpImg = new Image();
function mark(chkbox) {
    if (inCheckAll) return;
    var xmlhttp = createXmlHttpRequest();

     var ml = getDynamicSearchFormObj();
     var isAllChecked  = true;
    // Ignore unchecking/checking markAll checkbox if an item is marked/unmarked in
    // the mark list page.
    if(ml.elements.markAllChk != null)
    {
		for (var i = 0; i < ml.elements.length; i++) {
	        e = ml.elements[i];
	        if (e.name.substring(0, 8) == "markList") {
	          if (e.checked == false)
	          {
	            isAllChecked  = false;
	            break;
	          }
	        }
	     }

	    ml.elements.markAllChk.checked = isAllChecked;
    }
	var totalMarked = getTotalMarkedCount();
	var markedInfo ="";
	if(chkbox.checked == true)	{
		if( totalMarked <= 50 )	{
		    var markedURL = getMarkListURL();
	        postRequest(markedURL);

		} else {
			alert(MARKLIST_ERR_MSG);
			chkbox.checked = false;
			ml.elements.markAllChk.checked = false;
			return;
		}
	} else {
	    var markedURL = getMarkListURL();
        postRequest(markedURL);
	}
	//enableMySavedItem(getTotalMarkedCount());
}

// changes the state of each of the checkbox.
var inCheckAll = false;
function updateMarkListCheckBoxes(chkBox)	{
    inCheckAll = true;
	// Check for total number of Marked & capture the status of each marked Checkboxes.
	var ml = getDynamicSearchFormObj();
	var e;
	for (var i = 0; i < ml.elements.length; i++) {
        e = ml.elements[i];
        if (e.name.substring(0, 8) == "markList") {
            if (chkBox.checked ==true) { // If CheckAll is True, makes all of them as Checked.
                e.checked = true;
                Toggle(e);
            } else {
                e.checked = false;
                Toggle(e);
            }
        }
	}
	inCheckAll = false;
}

// Updates the Server with the given markedString.
// This variable is used to passing the marked Info String  to this function.
var markedInfoString="";
function updateServerForCheckAll()	{
    // Update the Server
    var markedInfo = markedInfoString;
    var qrystring = getMarkListURLForMarkedInfo(markedInfo);

    postRequest(qrystring);
}

// Marks all the checkboxes to either checked or unchecked.
function markAll(chkBox)	{
	var ml = getDynamicSearchFormObj();
	var len = ml.elements.length;

    //alert(document.marked.PG_CNT.value);
	var markCnt = document.marked.MARK_CNT.value;
	var pgCnt =  document.marked.PG_CNT.value;
	//alert("MarkCNT="+markCnt+"  PGCNT="+pgCnt);
	// Total number of Checkboxes.
    var elementCnt = 0;
    for (var i = 0; i < len; i++) {
		e = ml.elements[i];
		if (e.name.substring(0, 8) == "markList") {
		    elementCnt++;
		}
    }

    var totalMarked = markCnt - pgCnt  + elementCnt;

	if( chkBox.checked == true  )	{
        if( totalMarked <= 50 )	{
            updateMarkListCheckBoxes(chkBox);
            var markedURL = getMarkListURL();
   	        postRequest(markedURL);

        } else {
            // Here is doesn't update the server at all.
            alert(MARKLIST_ALL_ERR_MSG1+" "+MARKLIST_ALL_ERR_MSG2);
            chkBox.checked = false;
            return;
        }
    }	else {
        // For uncheck there is no need to do any validation.
        // It basically unchecks all and then enables or disables the viewmarklist button and updates the server.
        updateMarkListCheckBoxes(chkBox);
        var markedURL = getMarkListURL();
        postRequest(markedURL);
	}
	//enableMySavedItem(getTotalMarkedCount());
}

// Marks the markListItem on the result list & markList page.
function markPage(chkbox) {
	var markCnt = document.marked.MARK_CNT.value;
	var pgCnt =  document.marked.PG_CNT.value;
	var totalMarked = markCnt;
	//alert( "T:"+totalMarked+" M:"+markCnt+" P:"+pgCnt+" C:"+curCnt);
	var markedInfo ="";
	if(chkbox.checked == true)	{
		if( totalMarked < 50 )	{
			var markedInfo = prepareMarkedString(chkbox.value,"1");
            var qrystring = getMarkListURLForMarkedInfo(markedInfo);
   	        postRequest(qrystring);
			totalMarked += 1;

		} else {
			alert("There are already 50 articles marked.");
			chkbox.checked = false;
			return;
		}
	} else {
			var markedInfo = prepareMarkedString(chkbox.value,"0");
            var qrystring = getMarkListURLForMarkedInfo(markedInfo);
   	        postRequest(qrystring);
			totalMarked -= 1;
	}
	//enableMySavedItem(totalMarked);
}

function closeRow(row){
    toClose = getReturnedObj(row);
	toClose.style.display = "none";
}

function reduceCountByOne(spanId) {
    var spanObj = getReturnedObj(spanId);
	var totalNumber = spanObj.innerHTML.replace(/<[^>]+>/g,'');

	if(isNaN(totalNumber)) {
    	totalNumber = 0;
	} else {
	    --totalNumber;
	}
	var parsedText = document.createTextNode(' '+totalNumber+' ');
	spanObj.innerHTML = "";
	spanObj.appendChild(parsedText);
}

function removeItemFromMarkList(checkBoxID, rowId, tabListId){
	var checkBoxObj = getReturnedObj(checkBoxID);
// alert(checkBoxObj.parentElement);  // undefined
// alert(checkBoxObj.parentNode);  // object HTML Span element

	checkBoxObj.checked=false;
	mark(checkBoxObj);
	reduceCountByOne(tabListId);
	reduceCountByOne('totalNoOfItems');

	//To disable the marked item image and link, if the marked items are empty.
	var spanObj = getReturnedObj('totalNoOfItems');
	var totalNumber = spanObj.innerHTML.replace(/<[^>]+>/g,'');
	if(isNaN(totalNumber)) {
		totalNumber = 0;
	}
	//enableMySavedItem(totalNumber);
	closeRow(rowId);
	adjustFollowingLabels(rowId);
    removeSyllabusHiddenFields(rowId);
}

function adjustFollowingLabels(rowId) {
	var nextRowId = getNextRow(rowId);
  	var nextRow = getReturnedObj(nextRowId);
	while (nextRow != null)  {
		linkArray = nextRow.getElementsByTagName("SPAN");
		for (i=0; i < linkArray.length; ++i) {
       		var idAttribute = linkArray[i].getAttribute("ID");
       		if("sequencenumber" == idAttribute) {
       			var newSequenceNumber = parseInt(linkArray[i].innerHTML)-1;
       			linkArray[i].innerHTML = newSequenceNumber;
       		}
    	}
	  	nextRowId = getNextRow(nextRowId);
    	nextRow = getReturnedObj(nextRowId);	
	}
}	

function removeSyllabusHiddenFields(rowId) {
    var removeHdnDiv = "hdnFld_" + rowId;
	var hdnDivObj = getReturnedObj(removeHdnDiv);

    if(typeof hdnDivObj != 'undefined') {
        hdnDivObj.innerHTML = " ";
    }
}

function submitSyllabusForm(formName) {
    var formObj = getReturnedObj(formName);
    var spanObj = getReturnedObj('totalNoOfItems');
    var totalNumber = spanObj.innerHTML.replace(/<[^>]+>/g,'');
    if(isNaN(totalNumber)) {
        totalNumber = 0;
    }

    if(totalNumber > 0) {
        formObj.submit();
        return true;
    }else{
        alert(NO_RECORDS_MARKED_MSG);
    }
}


// adjust links for the rows following the deleted one.
// TODO:  Find a better way
function adjustFollowingLinks(rowId) {
	var nextRowId = getNextRow(rowId);
  var nextRow = getReturnedObj(nextRowId);
	while (nextRow != null)  {
	  linkArray = nextRow.getElementsByTagName("A");

    for (i=0; i < linkArray.length; ++i) {
       var hrefLink = linkArray[i].getAttribute("HREF");
       linkArray[i].href = adjustLink(hrefLink);
    }

	  nextRowId = getNextRow(nextRowId);
    var nextRow = getReturnedObj(nextRowId);
	}
}

// adjust link
function adjustLink(hrefLink) {
	var PARAM = "currentPosition";
	var paramPos = hrefLink.indexOf(PARAM);
	if (-1 == paramPos) {
		return hrefLink;
	}

	paramPos = paramPos+PARAM.length+1;
	var endLink = hrefLink.substring(paramPos);
	var ampPos = endLink.indexOf("&");  // assume found
	var oldOffset = parseInt(endLink.substring(0, ampPos));  // assume valid integer.
	if (oldOffset == 0) {
		 return hrefLink;  // for pub search
	}

	return hrefLink.substring(0,paramPos) + (oldOffset - 1) + endLink.substring(ampPos);

}

function getNextRow(rowId) {
	var rowParams = rowId.split("_");
  // assume 3 parameters
  var nextRowNum = parseInt(rowParams[0].substring(7))+1 ;
  var nextRowId = "markRow" + nextRowNum + "_" + rowParams[1] + "_" + rowParams[2];
  return nextRowId;
}


// Allows the info mark to go further only when the mark list is not empty.
function processInfoMark(url,winName) {
	var currentCount = getNoOfMarkedItem();

	if(currentCount <= 0) {
		alert(NO_RECORDS_MARKED_MSG);
	}
	else {
		if((winName == '')||(winName == null)){
	 			this.location.href = url;
	 	} else {
			open(url,winName,'menubar=yes,toolbar=no,resizable=yes,scrollbars=yes,width=850,height=500')
		}
	}
}


// To check the no of records selected while clicking the print/email option
//If the any records selected than only the user is allowed to go further
function checkMarkedRecords(url,winName)
 {
 	var currentCount = getNoOfMarkedItem();
 	if( currentCount <= 0 ){
 		alert(NO_RECORDS_MARKED_MSG);
 	}else{
 		if((winName == '')||(winName == null)){
 			this.location.href = url;
 		}else{
 			open(url, winName, 'toolbar=no, directories=no, status=yes, location=no, resizable=yes, menubar=yes, scrollbars=yes,screenX=50,screenY=50,top=50,left=50,width=650,height=600');
 		}
 	}
}

function downloadDocument(url,winName,tabID){
  var markedItems = getNoOfMarkedItemForTab(tabID);
  if( markedItems <= 0 ){
   alert(NO_RECORDS_DOWNLOAD_MSG);
   return ;
  }
  if((winName == '')||(winName == null)){
     this.location.href = url;
  }else{
      open(url,winName,'toolbar=no,resizable=yes,scrollbars=yes,width=650,height=500');
  }

 }

function getNoOfMarkedItemForTab(tabID) {
 var spanObj = getReturnedObj(tabID);
 var totalNumber = spanObj.innerHTML.replace(/<[^>]+>/g,'');
  if(isNaN(totalNumber)) {
      totalNumber = 0;
 }
  return totalNumber;
}
