﻿// Copyright 2008 Adobe Systems. All rights reserved.
//Copyright 2000, 2001, 2002, 2003 Macromedia, Inc. All rights reserved.

var pageContentDiv;
var tooltipDiv;
var tooltipInnerDiv;
var emoticonDiv;
var cmtsDiv;
var cmtType;
var commentsDiv;
var commonVariableDiv;
var commonPathResources;
var selTextLoc = 0;
var editselTextLoc = 0;
var selTextInstance = 0;
var selText;
var selTextLen = 0;
var gComment = 0;
var cmtSelected = null;
var isEditComment = false;
var isAppendComment = false;
var editCommentID = -1;
var deleteCommentID = -1;
var mouseOnTooltip = false;
var isEditComment = false;
var isAppendComment = false;
var cmts = new Array();
var otherPlatformCmts = new Array();
var filterBoxObj;
var htmlContent;
var convertedHtmlContent = null;
var givenBy = 'author';
var CURRENTUSERNAME;
var scharMap = null;
var propFile;
var comment_string;
var filteredCmts = new Array(); 
var comment_string_xml = null;
var selectedCmtGrp='Public';
var isViewedByAuthor;
var ISIE6 = false;
var ISIE = false;
var CROSSPLATFORMCOMMENT = false;
var CROSSPLATFORMWARNINGMESSAGE;

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   initializeSpecialCharMap() 
//
//  DESCRIPTION:
//    Pick up characters from properties file. Bot Being used right now
//  
//  ARGUMENTS:
//    string to be processed
//  RETURNS:
//    modifeid text
//----------------------------------------------------------------------------------------------------
/*
function initializeSpecialCharMap()
{
	scharMap = new Array();
	var schars = propFile.split(',');
	for(var i=0;i<schars.length;i++)
	{
		var tarray = schars[i].split('=');
		scharMap[tarray[0]] = tarray[1];
	}
}
*/


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_removeNL() 
//
//  DESCRIPTION:
//    
//  
//  ARGUMENTS:
//    string to be processed
//  RETURNS:
//    modifeid text
//----------------------------------------------------------------------------------------------------
function CT_removeNL(s) 
{
  var txt = "<textarea>";
  var etxt = "</textarea>";
  var j = 0, k =0;
  var flag = false;
  var r = new Array();
  if(s == null)
    return r.join('');
  for (var i=0; i < s.length; i++)
  {
    if(!flag && s.charAt(i).toLowerCase() == txt.charAt(j) && j < txt.length)
      j++;
    if(flag && s.charAt(i).toLowerCase() == etxt.charAt(k) && k < etxt.length)
      k++;
    if(j == txt.length)
    {
      flag = true;
      j=0;
    }
    if(k == etxt.length)
    {
      flag = false;
      k=0;
    }
    if(flag)
    {
      r.push(s.charAt(i));
      continue;
    }
    if (s.charAt(i) != '\n' && s.charAt(i) != '\r' && s.charAt(i) != '\t') 
      r.push(s.charAt(i));
  }
  return r.join('');
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_setCommentById() 
//
//  DESCRIPTION:
//    Setting hte comment text, given comment ID
//  
//  ARGUMENTS:
//     comment ID   
//  RETURNS:
//    void 
//----------------------------------------------------------------------------------------------------
function CT_setCommentById(cmtId)
{
  if(cmts == null)
    return;
  for(var i = 0; i < cmts.length; i++)
    if(cmts[i].id == cmtId)
      cmts[i].ctext = gComment;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_setCommentTypeById() 
//
//  DESCRIPTION:
//    Setting the comment type, given comment ID
//  
//  ARGUMENTS:
//     comment ID   
//  RETURNS:
//    void 
//----------------------------------------------------------------------------------------------------
function CT_setCommentTypeById(cmtId,ctype)
{
  if(cmts == null)
    return;
  for(var i = 0; i < cmts.length; i++)
    if(cmts[i].id == cmtId)
      cmts[i].ctype = ctype;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_removeMultipleSpace() 
//
//  DESCRIPTION:
//    Removing multiple sapces from given text. 
//  
//  ARGUMENTS:
//     String to process.
//  RETURNS:
//     Processed String.
//----------------------------------------------------------------------------------------------------
function CT_removeMultipleSpace(value)
{
  return value.replace(new RegExp("\\s+","g"), " ");
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_LTrim() 
//
//  DESCRIPTION:
//    Removes begining white spaces. 
//  
//  ARGUMENTS:
//     String to process.
//  RETURNS:
//     Processed String.
//----------------------------------------------------------------------------------------------------
function CT_LTrim( value ) 
{	
  var re = /\s*((\S+\s*)*)/;
  return value.replace(re, "$1");	
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_RTrim() 
//
//  DESCRIPTION:
//    Removes ending white spaces. 
//  
//  ARGUMENTS:
//     value : String to process.
//  RETURNS:
//     Processed String.
//----------------------------------------------------------------------------------------------------
function CT_RTrim( value ) 
{	
  var re = /((\s*\S+)*)\s*/;
  return value.replace(re, "$1");
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_trim 
//
//  DESCRIPTION:
//    Removes leading and ending whitespaces
//  
//  ARGUMENTS:
//     value : String to process.
//  RETURNS:
//     Processed String.
//----------------------------------------------------------------------------------------------------
function CT_trim( value ) 
{	
  return CT_LTrim(CT_RTrim(value));	 //define this da ganesh j
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_replaceSpecialHTMLCharacters 
//
//  DESCRIPTION:
//    This functions converts all the HTML special characters 
//    It retains the length of the string and inserts spaces.
//  ARGUMENTS:
//     htmlStr : String to process.
//  RETURNS:
//     othHtml : Processed Strinf
//----------------------------------------------------------------------------------------------------
function CT_replaceSpecialHTMLCharacters(htmlStr) 
{
  var outHtml = new Array();
  var length = htmlStr.length;
  var i = 0, pos = 0,m=0;
  var temp = "";

  while (i < length)
  {
    if (htmlStr.charAt(i) == '&') 
    {
      outHtml.push(htmlStr.substring(m,i));
      pos = i;
      m = i;
      temp = "&" + htmlStr.charAt(++i);
      var j = 2;
      var symbol = null;
      while ((symbol = scharMap[temp]) == null && j++ < 7 && i < (length - 1))
	      temp += htmlStr.charAt(++i);
      if(symbol != null) 
      {
	      outHtml.push(symbol.charAt(0));
	      for (var k = 1; k < j; k++)
		      outHtml.push(' ');
      if (htmlStr.charAt(++i) == ';')
      {
        outHtml.push(' ');
        m = i + 1;
      }
      else
        m = i;
    }
  }
  else
    i++;
  }
  outHtml.push(htmlStr.substring(m,i));
  return outHtml.join("");
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_hideTooltip 
//
//  DESCRIPTION:
//    Hides Tooltip by setting the timer
//
//  ARGUMENTS:
//     Void
//  RETURNS:
//     Void
//----------------------------------------------------------------------------------------------------
function CT_hideTooltip()
{
  mouseOnTooltip=false;	
  setTimeout(CT_actualHideTooltip,1000);	
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_actualHideTooltip 
//
//  DESCRIPTION:
//    Actually hides tooltip without calling any timer. Makes a check
//
//  ARGUMENTS:
//     Void
//  RETURNS:
//     Void
//----------------------------------------------------------------------------------------------------
function CT_actualHideTooltip()
{
  if(!mouseOnTooltip)
    CT_forceHideTooltip();
//	else
//		setTimeout(CT_actualHideTooltip,1000);	
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_forceHideTooltip 
//
//  DESCRIPTION:
//    Hides tooltip without calling any timer and sans any check
//
//  ARGUMENTS:
//     Void
//  RETURNS:
//     Void
//----------------------------------------------------------------------------------------------------
function CT_forceHideTooltip() 
{
  if(tooltipDiv.style != null)
  {
    tooltipDiv.style.display='none';
    isEditComment = false;		
    isAppendComment = false;
    selTextLoc = 0;
  }
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_getTooltipTopPos 
//
//  DESCRIPTION:
//    Gets the top positon of tool tip as user hovers over commented text
//
//  ARGUMENTS:
//     Object representing the SPAN div tag
//  RETURNS:
//     Top poistion. 
//----------------------------------------------------------------------------------------------------
function CT_getTooltipTopPos(inputObj)
{		
  var returnValue = inputObj.offsetTop;
  while((inputObj = inputObj.offsetParent) != null)
  {
    if(inputObj.tagName!='HTML')
      returnValue += inputObj.offsetTop;
  }
  return returnValue;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_getTooltipLeftPos 
//
//  DESCRIPTION:
//    Gets the left  positon of tool tip as user hovers over commented text
//
//  ARGUMENTS:
//     Object representing the SPAN div tag
//  RETURNS:
//     Left poistion. 
//----------------------------------------------------------------------------------------------------
function CT_getTooltipLeftPos(inputObj)
{
  var returnValue = inputObj.offsetLeft;
  while((inputObj = inputObj.offsetParent) != null)
  {
    if(inputObj.tagName!='HTML')
      returnValue += inputObj.offsetLeft;
  }
  return returnValue;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_correctPositionTooltip
//
//  DESCRIPTION:
//    Makes sure that tool tip stays inside the browser window.
//    Should be called after every time pop-up is redrwan
//
//  ARGUMENTS:
//     Array representing current positions.
//  RETURNS:
//     Array representing corrected positions. 
//----------------------------------------------------------------------------------------------------
function CT_correctPositionTooltip(positions)
{
  var leftPos = positions[0];
  var topPos = positions[1];
  //code to make sure that comment pop up box doesnt go out of browser window 
  var divWidth = document.getElementById('CT_commentPanelContainer').offsetWidth;
  var divHeight = document.getElementById('CT_commentPanelContainer').offsetHeight;
  if(window.getSelection)
  {
    if((topPos + divHeight) > ( window.innerHeight +  window.pageYOffset ) )
      topPos =  window.innerHeight +  window.pageYOffset - divHeight;
    if(topPos < 0)
      topPos = 5;
    if((leftPos + divWidth) > ( window.innerWidth +  window.pageXOffset ) )
      leftPos =  window.innerWidth +  window.pageXOffset - divWidth;
  }
  else if(document.selection)
  {
    if((topPos + divHeight) > (document.documentElement.clientHeight + document.documentElement.scrollTop) )
      topPos = document.documentElement.clientHeight - divHeight + document.documentElement.scrollTop;
    if(topPos < 0)
      topPos = 0;
    if((leftPos + divWidth) > (document.documentElement.clientWidth + document.documentElement.scrollLeft) )
      leftPos = document.documentElement.clientWidth - divWidth + document.documentElement.scrollLeft;
  }
  tooltipDiv.style.left = leftPos + 'px';
  tooltipDiv.style.top = topPos + 'px';
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_positionTooltip
//
//  DESCRIPTION:
//   Called as user hovers over the comment
//   Used to get the position from the event
//
//  ARGUMENTS:
//     event represnting the hover over comment.
//  RETURNS:
//     Position of the tooltip. 
//----------------------------------------------------------------------------------------------------
function CT_positionTooltip(evt)
{
  var inputObj ;
  if(window.event)
  {
    inputObj = window.event.srcElement;
  }
  else
  {
    inputObj = evt.target;
  }
  var leftPos = CT_getTooltipLeftPos(inputObj) - tooltipDiv.offsetWidth + inputObj.offsetWidth/2; 
  var topPos;
  {
    topPos = CT_getTooltipTopPos(inputObj) + 15;
    leftPos = leftPos + document.documentElement.scrollLeft;
    if((leftPos + 200) > document.body.offsetWidth)
    leftPos -= 150;
  }
  if(leftPos < 0)
    leftPos = 0;
  tooltipDiv.style.left = leftPos + 'px';
  tooltipDiv.style.top = topPos + 'px';
  return [leftPos, topPos];
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_getCommentById
//
//  DESCRIPTION:
//   Gets the comment given its ID
//
//  ARGUMENTS:
//     Comment ID
//  RETURNS:
//     Array represntin gthe comment. 
//----------------------------------------------------------------------------------------------------
function CT_getCommentById(cmtId)
{
  if(cmts == null && otherPlatformCmts == null)
    return null;
  for(var i = 0; i < cmts.length; i++)
  {
    if(cmts[i].id == cmtId)
      return cmts[i];
  }

 for(var j = 0; j < otherPlatformCmts.length; j++)
  {
    if(otherPlatformCmts[j].id == cmtId)
      return otherPlatformCmts[j];
  }

}


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_showTooltipCmt
//
//  DESCRIPTION:
//   Has the entire logic to show the tool-tip.
//   Logic for ,ulti-user, edit , new
//
//  ARGUMENTS:
//     Input object to get the SPAN tag and hence ID
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_showTooltipCmt(inputObj)
{	
  var htmlTooltip = new Array();		
  var currentUserHtmlToolTip = new Array();
  var showNew = true;
  var cmtIdArr = inputObj.cmtId.split('#&');
  var alter = 0;
  var htmlForTwoOtherUsers, htmlForThreeOtherUsers;
  for(var j = 0; j < cmtIdArr.length; j++)
  {
    var cmt = CT_getCommentById(cmtIdArr[j]);
    if(cmt.givenBy != givenBy)
      continue;
    showNew = false;
    currentUserHtmlToolTip.push('<div class="CT_commentPanelHeader"  id="cdiv"' + cmt.id + '>' + cmt.userName +
    '</div><div class="CT_commentContent" id="CT_commentContent_100">');
    currentUserHtmlToolTip.push(cmt.ctext);
    currentUserHtmlToolTip.push('</div>');
  }
  if(!showNew)
    alter= alter+1;
  var otherUserCount = 0;
  for(var j = 0; j < cmtIdArr.length; j++)
  {
    var cmt = CT_getCommentById(cmtIdArr[j]);
    if(cmt.givenBy == givenBy)
      continue;		
    if(otherUserCount == 2)
      htmlForTwoOtherUsers = htmlTooltip.join("") + '</div>'; 		
    if(otherUserCount == 3)
      htmlForThreeOtherUsers = htmlTooltip.join("") + '</div>'; 	
    otherUserCount++;
    if(alter%2 == 0)
      htmlTooltip.push('<div class="CT_commentPanelHeader"  id="cdiv"' + cmt.id + '>' + cmt.userName +
    '</div><div class="CT_commentContent" id="CT_commentContent_100">');
    else
      htmlTooltip.push('<div class="CT_commentPanelSecondaryHeader"  id="cdiv"' + cmt.id + '>' + cmt.userName +
    '</div><div class="CT_commentSecondaryContent" id="CT_commentContent_100">');
    htmlTooltip.push(cmt.ctext);
    htmlTooltip.push('</div>');
    alter = alter+1;
  }
  if(otherUserCount > 2 && !showNew)
  {
    tooltipInnerDiv.style.width = 234 + 'px';
    tooltipInnerDiv.innerHTML = currentUserHtmlToolTip.join("") + htmlForTwoOtherUsers;
    tooltipDiv.style.display = 'block';
    tooltipInnerDiv.style.height =  tooltipInnerDiv.offsetHeight + 'px';
    tooltipInnerDiv.style.overflow = 'auto';
    tooltipDiv.style.display = 'none';	
  }
  if(showNew && otherUserCount > 3)
  {
    tooltipInnerDiv.style.width = 234 + 'px';
    tooltipInnerDiv.innerHTML = htmlForThreeOtherUsers;
    tooltipDiv.style.display = 'block';
    tooltipInnerDiv.style.height =  tooltipInnerDiv.offsetHeight + 'px';
    tooltipInnerDiv.style.overflow = 'auto';
    tooltipDiv.style.display = 'none';		
  }
  tooltipInnerDiv.innerHTML = currentUserHtmlToolTip.join("") + htmlTooltip.join("");

}




//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_showTooltip
//
//  DESCRIPTION:
//   General method called to show any pop-up
//   Decides wether to show the view pop-up or new comment pop-up
//
//  ARGUMENTS:
//     event having the object represnting hover.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_showTooltip(evt)
{
  if(tooltipInnerDiv.style.overflow != null)
  {
    if(tooltipInnerDiv.style.removeAttribute)
    {
      tooltipInnerDiv.style.removeAttribute('overflow');
      tooltipInnerDiv.style.removeAttribute('height');
    }
    else if(tooltipInnerDiv.style.removeProperty)
    {
      tooltipInnerDiv.style.removeProperty('overflow');
      tooltipInnerDiv.style.removeProperty('height'); 
    }
  }
  mouseOnTooltip=true;
  var inputObj;
  if(window.event)
  {
    inputObj=window.event.srcElement;
  }
  else
  {
    inputObj=evt.target;
  }
  var pos = CT_positionTooltip(evt);
  CT_showTooltipCmt(inputObj);
  tooltipDiv.style.display = 'block';
  if(!ISIE6)
  {
    var bgTop = document.getElementById('CT_bgImageTop');
    bgTop.style.display = 'block';
  }
  var bgBottom = document.getElementById('CT_bgImageBottom');
  bgBottom.style.display = 'block';
  CT_correctPositionTooltip(pos);	
}



//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_showCommentBox
//
//  DESCRIPTION:
//  Called to find the position of the new comment pop-up.
//
//  ARGUMENTS:
//     text : legacy dummy variable.
//     evt  : Gets the object
//  RETURNS:
//     Position of the new comment pop-up.
//----------------------------------------------------------------------------------------------------
function CT_showCommentBox(text,evt)
{
  var x = tooltipDiv;			
  var tempX;
  var tempY;	
  tempX = evt.clientX + document.documentElement.scrollLeft;
  tempY = evt.clientY + document.documentElement.scrollTop;		
  if((tempX + 200) > document.body.offsetWidth)
    tempX -= 200;
  if((tempY + 200) > document.body.offsetHeight)
    tempY -= 50;
  x.style.left =  tempX + 'px';
  x.style.top = tempY + 'px';

}


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_checkComment
//
//  DESCRIPTION:
//     Check to see if user has highlighted any text. attached to mouse down event
//
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_checkComment()
{		
  if(selTextLoc != 0)
  {
    var selection = CT_getSelText();
    if(selection == null)
    {
      CT_hideTooltip();
    }
  } 
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_mouseOverToolTip
//
//  DESCRIPTION:
//     Sets flag if mouse hovers over tool tip.
//
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_mouseOverToolTip()
{
  mouseOnTooltip = true;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_mouseOutOfToolTip
//
//  DESCRIPTION:
//     
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_mouseOutOfToolTip()
{
  mouseOnTooltip = false;
  CT_hideTooltip();
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_onContextMenu
//
//  DESCRIPTION:
//     To disable the right click menu.
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_onContextMenu()
{
  return false;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_attachBodyEvents
//
//  DESCRIPTION:
//     To attach body events.
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_attachBodyEvents()
{
  //pageContentDiv.attachEvent('onmouseup', CT_getActiveText);
  //pageContentDiv.attachEvent('onmousedown', CT_checkComment);
  //tooltipDiv.attachEvent('onmouseover', CT_mouseOverToolTip);
  //tooltipDiv.attachEvent('onmouseout', CT_mouseOutOfToolTip);

  //pageContentDiv.onmouseup = CT_getActiveText;
  //pageContentDiv.onmousedown = CT_checkComment;
  document.oncontextmenu = CT_onContextMenu;
  tooltipDiv.onmouseover = CT_mouseOverToolTip;
  tooltipDiv.onmouseout = CT_mouseOutOfToolTip;
  document.onkeydown = CT_onKeyDown;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_onKeyDown
//
//  DESCRIPTION:
//     To block all keys which interfere with the navigation of browser.
//  ARGUMENTS:
//     event.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_onKeyDown(event)
{
  
  var evt, dontBlock = true;
  if(window.event)
  {
    evt = window.event;
  }
  else
  {
    evt= event;
  }
  //blocking ctrl + F5
  if(evt.keyCode == 116)
    dontBlock = false;
  if(evt.srcElement.type != 'textarea')
  {
    //blocking arrow keys for mac
    if(evt.keyCode == 8 || evt.keyCode == 37 || evt.keyCode == 39)
    {
      dontBlock = false;
    }
  } 
  
  return dontBlock;
}


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_initialize
//
//  DESCRIPTION:
//     Called to take in all the informatino about the users
//  ARGUMENTS:
//     Legacy dummy variable.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_initialize(val)
{
	
  pageContentDiv = document.getElementById('CT_page_content_div');
  tooltipDiv = document.getElementById('CT_commentPanelContainer');
  tooltipInnerDiv = document.getElementById('CT_commentPanel');
  commentsDiv = document.getElementById('CT_commentsForThePage');
  commonPathResources = tooltipDiv.getAttribute('PathString');
  givenBy = commentsDiv.getAttribute('currentUserEmail');
  CROSSPLATFORMWARNINGMESSAGE = tooltipDiv.getAttribute('crossPlatformWarning');  
  CURRENTUSERNAME = commentsDiv.getAttribute('currentUser');
  isViewedByAuthor = commentsDiv.getAttribute('isViewedByAuthor');
  if (window.getSelection)
  {
    commentsDiv.innerHTML = commentsDiv.getAttribute('value');
  }
  else if(document.selection)
  {
    commentsDiv.innerText = commentsDiv.getAttribute('value');
  }
  CT_attachBodyEvents();
}


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_attachToolTipEvents
//
//  DESCRIPTION:
//     Attach events to hte tooltip
//  ARGUMENTS:
//     Legacy dummy variable.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_attachToolTipEvents()
{
  if(filteredCmts == null && otherPlatformCmts == null)
  	return;
  
  for(var i = 0; i < filteredCmts.length; i++)
  {
    var cmt = filteredCmts[i];
    var loc = cmt.loc;
    var j = i;
    for(i = i + 1; i < filteredCmts.length; i++)
    if(filteredCmts[i].loc != loc)
      break;
    i--;
    var cmtSpanArr = document.getElementsByName('cmtspan' + cmt.id);
    var cmtIDArray = new Array();	
    for(; j <= i; j++)
      cmtIDArray.push(filteredCmts[j].id);	
    for(var k = i-1; k >= 0; k--)
    {
      if((parseInt(filteredCmts[k].loc) + parseInt(filteredCmts[k].selTextLen)) > parseInt(cmt.loc) && parseInt(cmt.loc) > parseInt(filteredCmts[k].loc))
      {
        cmtIDArray.push(filteredCmts[k].id);
      }
    }
    for(var m = 0; m < cmtSpanArr.length; m++)
    {
      var cmtSpan = cmtSpanArr[m];
      cmtSpan.cmtId = cmtIDArray.join('#&');	
      //cmtSpan.attachEvent('onmouseover', CT_showTooltip);	
      //cmtSpan.attachEvent('onmouseout', CT_hideTooltip);
      cmtSpan.onmouseover = CT_showTooltip;	
      cmtSpan.onmouseout = CT_hideTooltip;	
    }
  }
  if(CROSSPLATFORMCOMMENT)
  {
		var otherPlatformcmtSpanArr = document.getElementsByName('cmtspan99999');
		
		var otherPlatfromCmtIDArray = new Array();

		
		for(var n=0; n < otherPlatformCmts.length; n++)
		{
			otherPlatfromCmtIDArray.push(otherPlatformCmts[n].id);
			
		}
		for(var o=0; o < otherPlatformcmtSpanArr.length; o++)
		{
			var otherSpan = otherPlatformcmtSpanArr[o];
			
			otherSpan.cmtId = otherPlatfromCmtIDArray.join('#&');	
		
    	    otherSpan.onmouseover = CT_showTooltip;	
        	otherSpan.onmouseout = CT_hideTooltip;	
		}
        
  }

}





/********************** methods for xml string parsing ************************/
function comment(givenBy,id,loc,sellen,ctext,ctype,text_instance,counter, userName)
{
  this.givenBy = givenBy;
  this.userName = userName;
  this.id = id;
  this.loc = loc;
  this.selTextLen = sellen;
  this.ctext = ctext;
  this.ctype = ctype;
  this.text_instance = text_instance;
  this.time = counter;

}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_populate_comment_array
//
//  DESCRIPTION:
//     Called to populate the array with informatino from ann file
//  ARGUMENTS:
//     String containg the ann file data
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_populate_comment_array(xmlstring)
{
  xmlstringLower = xmlstring.toLowerCase();
  for(var i=0;i<xmlstring.length;i++)
  {
    var id_start_index = (xmlstringLower.indexOf('<ct_id>',i)== -1)?-1:xmlstringLower.indexOf('<ct_id>',i)+7;

    if (id_start_index != -1)
    {
      id_start_index = (xmlstringLower.indexOf('<ct_id>',i)== -1)?-1:xmlstringLower.indexOf('<ct_id>',i)+7;
      if(id_start_index == -1)
      break;
      i = id_start_index;
      var id_end_index = xmlstringLower.indexOf('</ct_id>',i);
      var cmt_id = xmlstring.substring(id_start_index,id_end_index);

      i = id_end_index;

      var cmt_loc, cmt_sel_len; 
      if(ISIE)
      {
        var loc_start_index = xmlstringLower.indexOf('<ct_seltextloc_ie>',i)+18;
        i = loc_start_index;

        var loc_end_index = xmlstringLower.indexOf('</ct_seltextloc_ie>',i);
        i = loc_end_index;

        cmt_loc = xmlstring.substring(loc_start_index,loc_end_index);

        var len_start_index = xmlstringLower.indexOf('<ct_seltextlen_ie>',i)+18;
        i = len_start_index;

        var len_end_index = xmlstringLower.indexOf('</ct_seltextlen_ie>',i);
        i = len_end_index;

        cmt_sel_len = xmlstring.substring(len_start_index,len_end_index);

      }
      else
      {
        var loc_start_index = xmlstringLower.indexOf('<ct_seltextloc_safari>',i)+22;
        i = loc_start_index;

        var loc_end_index = xmlstringLower.indexOf('</ct_seltextloc_safari>',i);
        i = loc_end_index;

        cmt_loc = xmlstring.substring(loc_start_index,loc_end_index);

        var len_start_index = xmlstringLower.indexOf('<ct_seltextlen_safari>',i)+22;
        i = len_start_index;

        var len_end_index = xmlstringLower.indexOf('</ct_seltextlen_safari>',i);
        i = len_end_index;

        cmt_sel_len = xmlstring.substring(len_start_index,len_end_index);
      }

      var ctext_start_index = xmlstringLower.indexOf('<ct_gcomment>',i)+13;
      i = ctext_start_index;

      var ctext_end_index = xmlstringLower.indexOf('</ct_gcomment>',i);
      i = ctext_end_index;

      var cmt_ctext = xmlstring.substring(ctext_start_index,ctext_end_index);

      var givenBy_start_index = xmlstringLower.indexOf('<ct_givenby>',i)+12;
      i = givenBy_start_index;

      var givenBy_end_index = xmlstringLower.indexOf('</ct_givenby>',i);
      i = givenBy_end_index;

      var cmt_givenBy = xmlstring.substring(givenBy_start_index,givenBy_end_index);


      var userName_start_index = xmlstringLower.indexOf('<ct_username>',i)+13;
      i = userName_start_index;

      var userName_end_index = xmlstringLower.indexOf('</ct_username>',i);
      i = userName_end_index;

      var cmt_userName = xmlstring.substring(userName_start_index,userName_end_index);

      var ctype_start_index = xmlstringLower.indexOf('<ct_ctype>',i)+10;
      i = ctype_start_index;

      var ctype_end_index = xmlstringLower.indexOf('</ct_ctype>',i);
      i = ctype_end_index;

      var cmt_ctype = xmlstring.substring(ctype_start_index,ctype_end_index);		

      var reg = new RegExp(tooltipDiv.getAttribute('PrivateString'),'i');
      var matched = cmt_ctype.match(reg);
      if(matched != null && cmt_givenBy != givenBy && isViewedByAuthor == 'FALSE')
        continue;

      if(parseInt(cmt_loc) != -1)
      {      
        var cmt_obj = new comment(cmt_givenBy,cmt_id,cmt_loc,cmt_sel_len,cmt_ctext,cmt_ctype,0,0,cmt_userName);
        cmts.push(cmt_obj);
	
      }
      else
      {
        if(!CROSSPLATFORMCOMMENT)
        	CROSSPLATFORMCOMMENT = true;
        
        var cmt_obj1 = new comment(cmt_givenBy,cmt_id,0,cmt_sel_len,cmt_ctext,cmt_ctype,0,0,cmt_userName);
        otherPlatformCmts.push(cmt_obj1);
	  }
    }//end of if
  } // end of for
  //sorting to allow inserting of comments in the middle
  for(var i = 0; i < cmts.length-1; ++i)
  {
    var smallest = i;
    for(var j = i+1; j < cmts.length; ++j)
    {
      if( parseInt(cmts[j].loc)  < parseInt(cmts[smallest].loc) )
      smallest = j;	
    }
    if(smallest != i)
    {
      var temp = cmts[i];
      cmts[i] = cmts[smallest];
      cmts[smallest] = temp;
    }
  }
  filteredCmts = cmts;
}
/************************************** methods for xml parsing ends ****************/


/*********************************** html converter.js ********************************/

var str1 = '<span name="cmtspan';
var str11 = '" id="cmtspan';
var str1a = '" style="background-color:#ababab;" >';
var str4 = '</span>';

var str5 = '<img src="';
var str6 = '" width="16" height="16" alt="Annotation Comments" />'
var str7 = '&nbsp;<u><strong><span name="cmtspan99999" id="cmtspan99999" style="background-color:#ababab;">Additional Annotation Comments</span></strong></u>';

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_getConvertedHTML
//
//  DESCRIPTION:
//     Adds span tag for already existing comments, based on the comment array
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_getConvertedHTML() 
{	
	if((filteredCmts == null || filteredCmts.length == 0) && (otherPlatformCmts == null || otherPlatformCmts.length == 0 ))
		return htmlContent;

	var offset = 0;
	var selfCommentsCount = 0;
	var finalHtmlContent = new Array();
	var processedCmts = new Array();
	for(var i = 0; i < filteredCmts.length; i++)
		processedCmts.push(false);
	var i = 0;
	while(true)
	{
		i = 0;
		
		while(processedCmts[i] == true)
			i++;
		
		if(i == filteredCmts.length)
			break;
		for(; i < filteredCmts.length; i++)
		{		
			var cmt = filteredCmts[i];
			var loc = parseInt(cmt.loc);
			var cmtIdlen = cmt.id.length;		
			var cmtBy = cmt.givenBy;		
			var cmtLen = parseInt(cmt.selTextLen);
	                var j = i;
			var flag = true;

			
			if(offset >= (loc + cmtLen))
			{
				processedCmts[i] = true;
				continue;
			}
			for(i = i + 1; i < filteredCmts.length; i++)
				if(filteredCmts[i].loc != loc)
					break;
			i--;	
			if(offset < loc)
			{
				finalHtmlContent.push(htmlContent.substring(offset,loc));
				offset = loc;
			}
			else
			{
				cmtLen = loc + cmtLen - offset;				
//				flag = false;
			}


			var k = cmtLen;
			if((i+1) < filteredCmts.length && processedCmts[i+1] == false)
			{
				var nextCmt = filteredCmts[i+1];		
				if(nextCmt != null && nextCmt.loc < (offset + cmtLen))
					k = nextCmt.loc - offset;				
			}
			finalHtmlContent.push(str1);
			finalHtmlContent.push(cmt.id);
			finalHtmlContent.push(str11);
			finalHtmlContent.push(cmt.id);
			finalHtmlContent.push(str1a);	
			
			for(var m = offset; m < (offset + k); m++)
			{
				var ch = htmlContent.charAt(m);
				if(ch == '<')
				{
					finalHtmlContent.push(str4);
					finalHtmlContent.push(ch);
					ch = htmlContent.charAt(++m);
					while(m < (offset + cmtLen) && ch != '>') 
					{
						finalHtmlContent.push(ch);
						ch = htmlContent.charAt(++m);
					}
					if(ch == '>')
						finalHtmlContent.push(ch);
					else 
						break;
					finalHtmlContent.push(str1);
					finalHtmlContent.push(cmt.id);
					finalHtmlContent.push(str11);
					finalHtmlContent.push(cmt.id);
					finalHtmlContent.push(str1a);	
					
				}
				else
					finalHtmlContent.push(ch);
				}
			offset += k;
			for(; j <= i; j++)
			{
				if(offset >= (filteredCmts[j].loc + filteredCmts[j].selTextLen))
				{
					processedCmts[j] = true;
				}
			}	     
                  finalHtmlContent.push(str4);
			if(k == cmtLen)
				break;
		}	
	}
	finalHtmlContent.push(htmlContent.substr(offset,htmlContent.length));
	if(CROSSPLATFORMCOMMENT)
	{
		var imagePath = commonPathResources + '../Toolbars/images/MM/allow_comments.png' ;
		var additionalComments = str5 + imagePath + str6 + str7;
		finalHtmlContent.push(additionalComments);
	}
        return finalHtmlContent.join("");
}

/*************************************** html converter.js ends **********************/

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_updatePage
//
//  DESCRIPTION:
//     Call to generally refresh the whole page. 
//     Can be calle dto redrwan the comments when any change takes palce
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_updatePage()
{
  if (window.getSelection)
  {
    CT_populate_comment_array(commentsDiv.innerHTML);
  }
  else if(document.selection)
  {
    CT_populate_comment_array(commentsDiv.innerText);
  }


  pageContentDiv.innerHTML = CT_getConvertedHTML();
  CT_attachToolTipEvents();
}


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_enable_commenting
//
//  DESCRIPTION:
//    Entry function, called the first time on page load.
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_enable_commenting()
{
  //find out if its ie6
  if(navigator && navigator.userAgent)
  {
    var agt = navigator.userAgent.toLowerCase();
    ISIE6 = (agt.indexOf("msie 6") != -1);
  }
  ISIE = agt.indexOf("msie") != -1;
  htmlContent = CT_removeNL(document.getElementById("CT_page_content_div").innerHTML);
  convertedHtmlContent = htmlContent;
  //replaceSpecialHTMLCharacters(htmlContent);
  CT_initialize(true);
  CT_updatePage();
  //if(CROSSPLATFORMCOMMENT)
  //  alert(CROSSPLATFORMWARNINGMESSAGE);
}

/*************************************** some helper methods ***********************************************/

/*function formatDate(d)
{
	d = d + serverTimeDiff;
	d = new Date(d);
	var today = new Date();
	if(today.getFullYear() == d.getFullYear() && today.getMonth() == d.getMonth())
	{
		if(today.getDate() == d.getDate())
		{
			var mins = Math.ceil((today.getTime() - d.getTime())/(1000*60));
			if(mins > 60)
			{
				var hours = Math.floor(mins/60);
				return hours + ' hours ' + (mins - hours * 60) + ' mins ago';
			}
			return mins + ' mins ago';
		}
		return today.getDate() - d.getDate() + ' days ago';
	}
	return d.toLocaleString();
}*/

function CT_Button_State(targetElement, buttonState)
{
	if (buttonState == 'down')
	{
		//targetElement.style.backgroundImage = 'url(file:///D|/contribute/depot/mainline/Dreamweaver/Targets/bin/Configuration/Annotation/ButtonPressed.png)'; 
		var path = 'url(' + commonPathResources + 'ButtonPressed.png)';
		targetElement.style.backgroundImage = path;
		targetElement.style.color = '#EFEFEF';
	}
	else if (buttonState == 'rollover' || buttonState == 'up')
	{
		var path = 'url(' + commonPathResources + 'ButtonRollOver.png)';
		targetElement.style.backgroundImage = path; 
		targetElement.style.color = '#EFEFEF';
    }
	else if (buttonState == 'out')
	{
		var path = 'url(' + commonPathResources + 'ButtonNormal.png)';
		targetElement.style.backgroundImage = path; 
		targetElement.style.color = '#D6D6D6';
	}
}

function CT_ComboBox_State(targetElement, comboState)
{
	if (comboState == 'down')
    {
		var path = 'url(' + commonPathResources + 'ComboPressed.png)';
	    targetElement.style.backgroundImage = path; 
        targetElement.style.color = '#EFEFEF';
	}
    else if (comboState == 'rollover' || comboState == 'up')
    {
		var path = 'url(' + commonPathResources + 'ComboRollOver.png)';
	    targetElement.style.backgroundImage = path; 
        targetElement.style.color = '#EFEFEF';
    }
    else if (comboState == 'out')
    {
		var path = 'url(' + commonPathResources + 'ComboNormal.png)';
        targetElement.style.backgroundImage = path; 
        targetElement.style.color = '#D6D6D6';
    }
}

function CT_Show_Element(elementID)
{
  targetElement = document.getElementById(elementID);
  targetElement.style.display = 'block';
}

function CT_Hide_Element(elementID)
{
  targetElement = document.getElementById(elementID);
  targetElement.style.display = 'none';
}

function CT_Set_Element_Text(elementID, text)
{
  targetElement = document.getElementById(elementID);
  targetElement.innerText = text;
}