// 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 global_id = 100;
var scharMap = null;
var propFile;
var comment_string;
var filteredCmts = new Array(); 
var comment_string_xml = null;
var selectedCmtGrp='Public';
var isViewedByAuthor;
//var totalTextLen;
var newOredit = null;
var showNew = true;
var prepareCommentBoxActive = false;
var MOUSEDOWN = false;
var ALLOWPREPARECOMMENTBOX = true;
var ORIGPOS;
var MOUSEONTEXTAREA = false;
var rollover = "rollover";
var down = "down";
var up = "up";
var out = "out";
var CT_comboDropdown_100 = "CT_comboDropdown_100";
var CT_comboText_100  = "CT_comboText_100";
var CT_commentPanelFooter_New = "CT_commentPanelFooter_New";
var CT_commentPanelHeaderCurrent = "CT_commentPanelHeaderCurrent";
var CT_commentPanelHeaderOther = "CT_commentPanelHeaderOther";
var CT_commentPanelFooter_Add = "CT_commentPanelFooter_Add";
var CT_commentContent = "CT_commentContent";
var CT_commentTextEntry = "CT_commentTextEntry";
var CT_commentPanelFooter_Edit = "CT_commentPanelFooter_Edit";
var Public;
var Private;
var MOUSEOVERDROPDOWN;
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_saveComment() 
//
//  DESCRIPTION:
//    Saves the comment text and all its properties by adding informatino to the comments string
//  
//  ARGUMENTS:
//    
//  RETURNS:
//    void 
//----------------------------------------------------------------------------------------------------
function CT_saveComment() 
{
  var nl = '\r';
  var tab = '\t';
//  var htmlTooltip = new Array();
  var commentType = cmtType.innerHTML;
  var regcmtType = new RegExp(tooltipDiv.getAttribute('PrivateString'),'i');
  var matCmtType = commentType.match(regcmtType);
  if(matCmtType == null)
    commentType = tooltipDiv.getAttribute('PublicString');
  else
    commentType = tooltipDiv.getAttribute('PrivateString');
  //var commentType = 'private';
  //convert numbers to strings here
  selTextLoc += '';
  selTextLen += '';
  selTextInstance += '';
  var comment_string;
  
  if(ISIE)
  {
    var selTextLocIE = selTextLoc;
    var selTextLenIE = selTextLen;
    var selTextLocSafari = -1;
    var selTextLenSafari = -1;
  }
  else
  {
    var selTextLocIE = -1;
    var selTextLenIE = -1;
    var selTextLocSafari = selTextLoc;
    var selTextLenSafari = selTextLen;
  }
  comment_string = nl + '<ct_comment>' + nl + tab + '<ct_id>' +global_id+ '</ct_id>';
  comment_string+= nl + tab + '<ct_seltextloc_ie>' + selTextLocIE + '</ct_seltextloc_ie>';
  comment_string+= nl + tab + '<ct_seltextlen_ie>' + selTextLenIE + '</ct_seltextlen_ie>';
  comment_string+= nl + tab + '<ct_seltextloc_safari>' + selTextLocSafari + '</ct_seltextloc_safari>';
  comment_string+= nl + tab + '<ct_seltextlen_safari>' + selTextLenSafari + '</ct_seltextlen_safari>';
  comment_string+= nl + tab + '<ct_gcomment>' + gComment + '</ct_gcomment>';
  comment_string+= nl + tab + '<ct_givenby>' + givenBy + '</ct_givenby>';
  comment_string+= nl + tab + '<ct_username>' + CURRENTUSERNAME + '</ct_username>';
  comment_string+= nl + tab + '<ct_ctype>' + commentType + '</ct_ctype>'+ nl + '</ct_comment>'; 
	
  global_id++;

  //htmlTooltip.push(comment_string);
  if (window.getSelection)
  {
    var old_innerhtml = commentsDiv.innerHTML;
    commentsDiv.innerHTML = old_innerhtml + comment_string;
  }
  else if(document.selection)
  {
    var old_innerhtml = commentsDiv.innerText;
    commentsDiv.innerText = old_innerhtml + comment_string;
  }
  CT_refreshPage(comment_string);
}

//----------------------------------------------------------------------------------------------------
//  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_editComment() 
//
//  DESCRIPTION:
//    Updating text of the given comment.
//  
//  ARGUMENTS:
//     comment ID   
//  RETURNS:
//    void 
//----------------------------------------------------------------------------------------------------
function CT_editComment(eCommentID) 
{
  var old_innerhtml;
  if (window.getSelection)
  {
    old_innerhtml = commentsDiv.innerHTML;
  }
  else if(document.selection)
  {
    old_innerhtml = commentsDiv.innerText;
  }
  newcmttype = (document.getElementById('CT_comboText_100')).innerHTML;
  var regcmtType = new RegExp(tooltipDiv.getAttribute('PrivateString'),'i');
  var matCmtType = newcmttype.match(regcmtType);
  if(matCmtType == null)
    newcmttype = tooltipDiv.getAttribute('PublicString');
  else
    newcmttype = tooltipDiv.getAttribute('PrivateString');
  var commentInfo = CT_getCommentById(eCommentID);
  var cmt = commentInfo[0];
  //doing this so that the same comment present at different places doesn't get replaced
  //var reg = new RegExp(cmt.id + '(.|\n)*<ct_givenBy>', 'i' );
  var reg = new RegExp('((?!<ct_comment>).|\n)*<ct_id>' + deleteCommentID + '((?!<ct_comment>).|\n)*', 'i'); 
  var match = old_innerhtml.match(reg);
  var oldString = match[0];
  var newString;
  
  var lowercase = (oldString.indexOf('<ct_gcomment>')== -1)?-1:oldString.indexOf('<ct_gcomment>');
  if (lowercase != -1)		
    newString = oldString.replace('<ct_gcomment>'+cmt.ctext+'</ct_gcomment>','<ct_gcomment>'+gComment+'</ct_gcomment>');
  else
    newString = oldString.replace('<GCOMMENT>'+cmt.ctext+'</GCOMMENT>','<GCOMMENT>'+gComment+'</GCOMMENT>');
  if(cmt.ctype != newcmttype)
  {
    regComment = new RegExp('<ct_ctype>' + cmt.ctype + '((?!<ct_comment>).|\n)*', 'i'); 
    match = newString.match(regComment);
    oldCommentString = match[0];
    newCommentString = oldCommentString.replace(cmt.ctype,newcmttype);
    newString = newString.replace(oldCommentString,newCommentString);
  }
  old_innerhtml = old_innerhtml.replace(oldString ,newString);
  if (window.getSelection)
  {
    commentsDiv.innerHTML = old_innerhtml;
  }
  else if(document.selection)
  {
    commentsDiv.innerText = old_innerhtml;
  }
  cmt.ctext = gComment;
  cmt.ctype = newcmttype;
  //CT_setCommentById(eCommentID);
  CT_attachToolTipEvents();
}


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_removeComment() 
//
//  DESCRIPTION:
//    To delete a comment
//  
//  ARGUMENTS:
//     void   
//  RETURNS:
//     void 
//----------------------------------------------------------------------------------------------------
function CT_removeComment()
{
  var old_innerhtml;
  if (window.getSelection)
  {
    old_innerhtml = commentsDiv.innerHTML;
  }
  else if(document.selection)
  {
    old_innerhtml = commentsDiv.innerText;
  }
	
  var reg = new RegExp('((?!<ct_comment>).|\n)*<ct_id>' + deleteCommentID + '((?!<ct_comment>).|\n)*', 'i'); 
  var match = old_innerhtml.match(reg);
  var string2Delete = '<' + match[0];
  old_innerhtml = old_innerhtml.replace(string2Delete,'');
  cmts.length = 0;

  if (window.getSelection)
  {
    commentsDiv.innerHTML = old_innerhtml;
  }
  else if(document.selection)
  {
    commentsDiv.innerText = old_innerhtml;
  }
  CT_updatePage();
  CT_forceHideTooltip();
}


//function CT_appendComment(aCommentID) 
//{
//}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_edit_save() 
//
//  DESCRIPTION:
//    Called to set the flag. Called when user clicks ok after editing a comment
//  
//  ARGUMENTS:
//     void   
//  RETURNS:
//     void 
//----------------------------------------------------------------------------------------------------
function CT_edit_save()
{
  isEditComment = true;
  CT_save();
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_save() 
//
//  DESCRIPTION:
//    Called as user clicks OK. 
//  
//  ARGUMENTS:
//     void   
//  RETURNS:
//     void 
//----------------------------------------------------------------------------------------------------
function CT_save()
{	
  gComment = document.getElementById('CT_commentTextEntryArea').value;
  if(gComment == null || CT_trim(gComment).length == 0)
  {
    //alert('Please enter your comment');
    alert(tooltipDiv.getAttribute('EmptyString'));
    document.getElementById('CT_commentTextEntryArea').focus();
    return;
  }
  if(CT_trim(gComment).length > 1024)
  {
    //alert('You can comment only upto 1024 characters');
    alert(tooltipDiv.getAttribute('LimitString'));
    document.getElementById('CT_commentTextEntryArea').focus();
    return;
  }
  if(isEditComment == true) 
  {	
    isEditComment = false;
    CT_editComment(editCommentID);		
  }
  //else if(isAppendComment == true) 
  //{	
  //  isAppendComment = false;
  //  CT_appendComment(appendCommentID);
  //}
  else
  {		
    CT_saveComment();
  }
  prepareCommentBoxActive = false;
  CT_forceHideTooltip();
}


//----------------------------------------------------------------------------------------------------
//  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_encodeSelectedText 
//
//  DESCRIPTION:
//    This functions encodes the text coming from range object
//    Allowing the text to be matched with already encoded HTML     
//
//  ARGUMENTS:
//     toEncode : String to process.
//  RETURNS:
//     toEncode : Encoded String
//----------------------------------------------------------------------------------------------------
function CT_encodeSelectedText(toEncode)
{
  var reg, match;
  //always do this first, as encoding of others would introduce '&'
  reg = new RegExp('&', 'ig');
  match = htmlContent.match(reg);
  if(match)
  toEncode = toEncode.replace(reg, "&amp;");

  reg = new RegExp('<', 'ig'); 
  match = htmlContent.match(reg);
  if(match)
  toEncode = toEncode.replace(reg, "&lt;");
  //Safari doesn't encode '>'. 
  //Its fine to do this because searching logic only looks for the '<'.
  if (document.selection)
  {
    reg = new RegExp('>', 'ig');
    match = htmlContent.match(reg);
    if(match)
    toEncode = toEncode.replace(reg, "&gt;");
  }
  return toEncode;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_searchIgnoringHTMLTags 
//
//  DESCRIPTION:
//    Main brain of the Annotation.
//    Returns the array :
//    1st parameter : Instance of the selected text
//    2nd parameter : Number of characters that come before the selected text
//
//  ARGUMENTS:
//     toEncode : String to process.
//  RETURNS:
//     toEncode : Encoded String
//----------------------------------------------------------------------------------------------------
function CT_searchIgnoringHTMLTags(n)
{
  var i = 0, k = 0, pos = 0, finding = false, count = 0;
  selText = CT_removeMultipleSpace(selText);
  selText = CT_encodeSelectedText(selText);
  var len = selText.length;
  var htmlLen = htmlContent.length;

  htmlLen = convertedHtmlContent.length;
  var spaceFound = false;
  while(i < htmlLen)
  {	

    ch = convertedHtmlContent.charAt(i);
    // ignore html tags
    if(ch == '<' && htmlContent.charAt(i) == '<')
    {
      while(i < htmlLen && htmlContent.charAt(i) != '>')
        i++;
	  i++;
	  continue;			
    }
		
    // compress multiple spaces to single space
    while(i < htmlLen-1)
	{
      var flag = false;
      while(i < htmlLen-1 && ch == ' ')
      {
        ch = convertedHtmlContent.charAt(++i);
        flag = true;
      }
      while(i < htmlLen && convertedHtmlContent.substr(i,5) == '&nbsp')
      {
        flag = true;
        i+=5;
        if(convertedHtmlContent.charAt(i) == ';')
	      i++;
      }
      ch = convertedHtmlContent.charAt(i);			
      if(ch != ' ')
      {
        if(flag)
          spaceFound = true;								
        break;
      }
    }
    if(ch == '<'  && htmlContent.charAt(i) == '<')
      continue;	
    //avoiding all new lines and form feed which is creating problem for MAc
    if(ch == '\n' || ch == '\r' || ch == '\f')
    {
      i++;
      continue;
    }

    if( ch == selText.charAt(k) &&  (!spaceFound || !finding)  )
    {
      k++;
      if(!finding)
      {
        finding = true;
        pos = i;
      }
      if(k == len)
      {					
        count++;
        if(count == n)
        {
          if(htmlContent.charAt(i) == '&')
          {
            i++;
            while(i < htmlLen - 1 && convertedHtmlContent.charAt(i) == ' ' && htmlContent.charAt(i)!= ' ')
              i++;
            i--;
          }
          if(len == 1)
            return [1,i];
          return [i-pos + 1, pos];		
      }	
      else
      {
        k = 0;
        finding = false;
      }
    }
      if(ch == ' ')
      {
        i++;
        while(i < htmlLen && convertedHtmlContent.charAt(i) == ' ')
          i++;
        continue;
      }
      spaceFound = false;
    }
    else if( (ch != selText.charAt(k) || spaceFound) && finding) 
    {
      if(selText.charAt(k) == '#')
      {
        k++;
        continue;
      }
      if(ch == '#')
      {
        i++;
        continue;
      }
      if(spaceFound && selText.charAt(k) == ' ')
      {					
        k++;
        spaceFound = false;
        continue;
      }
      finding = false;
      k = 0;
      i = pos; //not pos+1 as there is i++ down below
      spaceFound = false;
    }							
    i++;				
  }
  return null;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_searchText 
//
//  DESCRIPTION:
//    Passes on call to CT_searchIgnoringHTMLTags
//    Returns the array :
//    1st parameter : Instance of the selected text
//    2nd parameter : Number of characters that come before the selected text
//
//  ARGUMENTS:
//     n : Instance of the Selected text.
//  RETURNS:
//     Array with instance of text and the no of characters before it
//----------------------------------------------------------------------------------------------------
function CT_searchText(n)
{
  var f1 = CT_searchIgnoringHTMLTags(n);
  return f1;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_findSpan 
//
//  DESCRIPTION:
//    Tests of there are any already existing comments in the 
//    highlighted text.
//
//  ARGUMENTS:
//     DOM sub tree, of the selected HTML.
//  RETURNS:
//     Boolean: true if selected doesn't already have any comments,
//     false otherwise
//----------------------------------------------------------------------------------------------------
function CT_findSpan(node)
{
  if(node == null)
    return false;

  if(node.nodeName == 'SPAN' || node.nodeName == 'span')
  {
    var atrs = node.attributes;
    for(var i = 0; i < atrs.length; i++)
    {
      if(atrs[i].name != 'id' && atrs[i].name != 'ID')
        continue;
      var reg = new RegExp('cmtspan', 'i'); 
      var mt = atrs[i].value.match(reg);
      if(mt != null)
        return true;
    }
  } 
  node = node.firstChild;
  for(;node != null; node = node.nextSibling)
  {
    if(CT_findSpan(node))
    return true;
  }
  return false;
}



//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_getSelText 
//
//  DESCRIPTION:
//    Gets the selected text from the range object.
//    Calculates the instance of selected text
//
//  ARGUMENTS:
//     void.
//  RETURNS:
//      Array with instance of text and the no of characters before it
//----------------------------------------------------------------------------------------------------
function CT_getSelText()
{

  var txt = ''; 
  var i = 0;
  var returnText = null;
  if (window.getSelection)
  {	
    txt = window.getSelection();				

    var selRange = CT_getRangeObject(txt);
    var docFrag = selRange.cloneContents();
    if(CT_findSpan(docFrag))
    {
      CT_collapseSelection();
      return null;
    }

    var rng = selRange.cloneRange();				
    rng.setStartBefore(document.getElementById("CT_page_content_div"));														
    var p = CT_removeNL(rng.toString());
    selText = CT_removeNL(CT_trim(selRange.toString()));
    p = CT_removeMultipleSpace(p);
    selText = CT_removeMultipleSpace(selText);
    var arr = p.split(selText);		
    selTextInstance = arr.length - 1;
    if(selTextInstance == 0)
    selTextInstance = 1;
    returnText = CT_searchText(selTextInstance);

    //rng.collapse(false);
    //rng.setEndBefore(document.getElementById("CT_page_content_div"));
    //returning length : position from the first letter to the last of document
    //var f1 = [ selRange.toString().length , totalTextLen - rng.toString().length - selRange.toString().length];
    //return f1;
  }
  else if (document.selection)
  {
    var selRange = document.selection.createRange();		
    var selHTML = selRange.htmlText;
    selText = CT_removeNL(CT_trim(selRange.text));			

    //To prevent blank click
    if(selText.length == 0)
      return null;		

    //To prevent overlap
    var reg = new RegExp('(<span)((?!span>).|\n)*id=cmtspan((?!>).|\n)*', 'i'); 
    var mt = selHTML.match(reg);
    if(mt != null)
    {
      CT_collapseSelection();
      return null;
    }

    var rng = document.body.createTextRange();
    rng.setEndPoint("EndToStart", selRange);
    //rng.findText(uniqueText,0,4);
    //rng.moveStart("character", uniqueText.length);
    //rng.setEndPoint("EndToEnd", selRange);
    p = CT_removeNL(rng.text);
    p = CT_removeMultipleSpace(p);
    selText = CT_removeMultipleSpace(selText);
    var arr = p.split(selText);
    selTextInstance = arr.length;
    if(selTextInstance == 0)
      selTextInstance = 1;	
    returnText = CT_searchText(selTextInstance);
  }
  return returnText;
}	


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_getRangeObject 
//
//  DESCRIPTION:
//    Gets range object from Selection object for Non-IE browser
//
//  ARGUMENTS:
//     Selection Object
//  RETURNS:
//      Range object representing highlighted text.
//----------------------------------------------------------------------------------------------------
function CT_getRangeObject(selectionObject)
{
  if(selectionObject.getRangeAt) //mozila
  {
    return selectionObject.getRangeAt(0);
  }
  else //safari
  {
    var range = document.createRange();
    range.setStart(selectionObject.anchorNode,selectionObject.anchorOffset);
    range.setEnd(selectionObject.focusNode, selectionObject.focusOffset);
    return range;
  }
}

//----------------------------------------------------------------------------------------------------
//  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(prepareCommentBoxActive)
    return;

  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)
{
  var otherPlatform = false;
  if(cmts == null && otherPlatformCmts == null)
    return null;
  for(var i = 0; i < cmts.length; i++)
  {
    if(cmts[i].id == cmtId)
      return [cmts[i], otherPlatform];
  }
 otherPlatform = true;
 for(var j = 0; j < otherPlatformCmts.length; j++)
  {
    if(otherPlatformCmts[j].id == cmtId)
      return [otherPlatformCmts[j],otherPlatform];
  }

}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_correctPositionTooltipOnClickingEdit
//
//  DESCRIPTION:
//   Pass call to function to correct toolt ip position.
//   Attach event to the textarea, allowing context menu
//
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_correctPositionTooltipOnClickingEdit()
{
  CT_correctPositionTooltip(ORIGPOS);
  var textArea = document.getElementById('CT_commentTextEntry');
  textArea.onmouseover = CT_mouseOverTextArea;
  textArea.onmouseout = CT_mouseOutOfTextArea;	
}

//----------------------------------------------------------------------------------------------------
//  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 cmtIdArr = inputObj.cmtId.split('#&');
  var otherUserHtmlTooltip = new Array();
  showNew = true;
  var showPrivateAbove = false;
  var initialDataInComment;
  otherUserHtmlTooltip.push('<div id="CT_commentPanelHeaderOther" >');
  var alter = 0;
  var htmlForTwoOtherUsers, htmlForThreeOtherUsers;
  newOredit = "new";
  var otherPlatformComment = false;
  for(var j = 0; j < cmtIdArr.length; j++)
  {
    var commentInfo = CT_getCommentById(cmtIdArr[j]);
    var cmt = commentInfo[0];
    otherPlatformComment = commentInfo[1];
    if(cmt.givenBy != givenBy)
	    continue;
    showNew = false;
    editCommentID = cmt.id;
    deleteCommentID = cmt.id;

    if(cmt.ctype == tooltipDiv.getAttribute('PrivateString'))
	    showPrivateAbove = true;

    htmlTooltip.push('<div class="CT_commentPanelHeader"  id="CT_commentPanelHeaderCurrentActive"');
    if( !otherPlatformComment)
      htmlTooltip.push(' onclick="CT_Show_Edit_Element()" ');
    htmlTooltip.push('>' + cmt.userName + '</div><div class="CT_commentContent" id="CT_commentContent" style="display:block;">');
    newOredit = "edit";
    initialDataInComment = cmt.ctext;
    //if(cmt.givenBy == givenBy)
    //{
    //   htmlTooltip.push(cmt.svr);
    //}
    //else
    //    htmlTooltip.push(cmt.svr);
    //htmlTooltip.push('<B>');
    //htmlTooltip.push('&nbsp;&nbsp;&nbsp;' + cmt.givenBy + '&nbsp;&nbsp;</B>');	
    //htmlTooltip.push(formatDate(cmt.time));
    //htmlTooltip.push('</font></div><span style="width:20px;color:#000000;">');
    htmlTooltip.push(cmt.ctext);
    htmlTooltip.push('</div>');
  }
  if(!showNew)
    alter= alter+1;
  var otherUserCount = 0;
  for(var j = 0; j < cmtIdArr.length; j++)
  {
    var commentInfo = CT_getCommentById(cmtIdArr[j]);
    var cmt = commentInfo[0];
    otherPlatformComment = commentInfo[1];
    if(cmt.givenBy == givenBy)
      continue;
    //adding scroll bar 
    if(otherUserCount == 2)
      htmlForTwoOtherUsers = otherUserHtmlTooltip.join("") + '</div>'; 
    if(otherUserCount == 3)
      htmlForThreeOtherUsers = otherUserHtmlTooltip.join("") + '</div>'; 
    otherUserCount++;

    if(alter%2 == 0)
    {
      otherUserHtmlTooltip.push('<div class="CT_commentPanelHeader"');
      if(!otherPlatformComment)
        otherUserHtmlTooltip.push(' onclick="CT_Show_New_Element()"');
      otherUserHtmlTooltip.push(' id="CT_commentPanelHeaderOther' + cmt.id + '">' + cmt.userName +'</div>');
      otherUserHtmlTooltip.push('<div class="CT_commentContent" id="CT_commentContent">');
    }
    else
    {	
      otherUserHtmlTooltip.push('<div class="CT_commentPanelSecondaryHeader"');
      if(!otherPlatformComment)
        otherUserHtmlTooltip.push(' onclick="CT_Show_New_Element()"');
      otherUserHtmlTooltip.push(' id="CT_commentPanelHeaderOther' + cmt.id + '">' + cmt.userName +'</div>');				
      otherUserHtmlTooltip.push('<div class="CT_commentSecondaryContent" id="CT_commentContent">');
    }
    otherUserHtmlTooltip.push(cmt.ctext);
    otherUserHtmlTooltip.push('</div>');
    alter = alter+1;		
  }
  otherUserHtmlTooltip.push('</div>');
  if(otherUserCount > 2 && !showNew)
  {
    tooltipInnerDiv.style.width = 234 + 'px';
    tooltipInnerDiv.innerHTML = htmlTooltip.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';		
  }
  if(showNew)
    initialDataInComment = "";
	
  htmlTooltip.push('<div class="CT_commentPanelHeader"  onclick="" id="CT_commentPanelHeaderCurrent" style="position:relative; display:none;">' + CURRENTUSERNAME + '</div>');
  htmlTooltip.push('<div id="CT_commentTextEntry" style="display:none;"><textarea class="CT_commentTextEntry" name="CT_commentTextEntryArea" id="CT_commentTextEntryArea">' + initialDataInComment + '</textarea></div>');

  htmlTooltip.push('<div class="CT_commentPanelFooter" id="CT_commentPanelFooter_Add" style="position:relative; display:none;">');
  htmlTooltip.push('<div class="CT_comboBox" id="CT_comboBox_100" onmouseOver="CT_ComboBox_State(this,rollover);" onmousedown="CT_ComboBox_State(this,down);CT_Show_Element(CT_comboDropdown_100);" onmouseup="CT_ComboBox_State(this,up);" onmouseout="CT_ComboBox_State(this,out);">')
		
  if(showPrivateAbove)
    htmlTooltip.push('<span id="CT_comboText_100">&nbsp;&nbsp;' + tooltipDiv.getAttribute('PrivateString') + '</span>');
  else
    htmlTooltip.push('<span id="CT_comboText_100">&nbsp;&nbsp;' + tooltipDiv.getAttribute('PublicString') + '</span>');

  htmlTooltip.push('<div class="CT_comboDropdown" id="CT_comboDropdown_100">');
  htmlTooltip.push('<div class="CT_comboDropdownTopItem" id="CT_comboItem_100_1" onclick="CT_Hide_Element(CT_comboDropdown_100);CT_Set_Element_Text(CT_comboText_100,Public);">&nbsp;&nbsp;' + tooltipDiv.getAttribute('PublicString') + '</div>');		
  htmlTooltip.push('<div class="CT_comboDropdownBottomItem" id="CT_comboItem_100_2" onclick="CT_Hide_Element(CT_comboDropdown_100);CT_Set_Element_Text(CT_comboText_100,Private);">&nbsp;&nbsp;' + tooltipDiv.getAttribute('PrivateString') + '</div>');

  htmlTooltip.push('</div></div>');
  htmlTooltip.push('<div class="CT_buttonGroup">');
  htmlTooltip.push('<div class="CT_pushButton" id="CT_OkButton" style="left:0px" onmouseover="CT_Button_State(this, rollover);" onmousedown="CT_Button_State(this, down);" onmouseup="CT_Button_State(this, up);" onmouseout="CT_Button_State(this, out);">' + tooltipDiv.getAttribute('OKString') + '</div>' +
  '<div class="CT_pushButton" id="CT_cancelButton" style="left:70px" onmouseover="CT_Button_State(this, rollover);" onmousedown="CT_Button_State(this, down);" onmouseup="CT_Button_State(this, up);" onmouseout="CT_Button_State(this, out);">' + tooltipDiv.getAttribute('CancelString') + '</div>');
  htmlTooltip.push('</div></div>');

  otherUserHtmlTooltip.push('<div class="CT_commentPanelFooter" style="position:relative; display:none;" id="CT_commentPanelFooter_New">');
  otherUserHtmlTooltip.push('<div class="CT_buttonGroup" style="left: 160px;" id="CT_buttonGroup_100_New">');
  otherUserHtmlTooltip.push('<div class="CT_pushButton" style="left: 0px;" onmouseover="CT_Button_State(this,rollover);" onmousedown="CT_Button_State(this,down);" onmouseup="CT_Button_State(this,up);" onmouseout="CT_Button_State(this,out);" onclick="CT_blockMouseOutOfToolTipevent();CT_Hide_Element(CT_commentPanelFooter_New);CT_Show_Element(CT_commentPanelHeaderCurrent); CT_Hide_Element(CT_commentPanelHeaderOther);CT_Show_Element(CT_commentPanelFooter_Add); CT_Hide_Element(CT_commentContent);CT_Show_Element(CT_commentTextEntry);CT_correctPositionTooltipOnClickingEdit()">' + tooltipDiv.getAttribute('NewString') + '</div>');
  otherUserHtmlTooltip.push('</div></div>');
			
  htmlTooltip.push('<div class="CT_commentPanelFooter" style="position:relative; display:none;" id="CT_commentPanelFooter_Edit">');
  htmlTooltip.push('<div class="CT_buttonGroup" id="CT_buttonGroup_Edit"> <div class="CT_pushButton" style="left:0px" onmouseover="CT_Button_State(this, rollover);" onmousedown="CT_Button_State(this, down);" onmouseup="CT_Button_State(this, up);" onmouseout="CT_Button_State(this, out);" onclick="CT_blockMouseOutOfToolTipevent();CT_Hide_Element(CT_commentPanelFooter_Edit); CT_Show_Element(CT_commentPanelHeaderCurrent);CT_Hide_Element(CT_commentPanelHeaderOther);CT_Hide_Element(\'CT_commentPanelHeaderCurrentActive\');CT_Show_Element(CT_commentPanelFooter_Add); CT_Hide_Element(CT_commentContent); CT_Show_Element(CT_commentTextEntry);CT_correctPositionTooltipOnClickingEdit()">' + tooltipDiv.getAttribute('EditCommentString') + '</div>');
  htmlTooltip.push('<div class="CT_pushButton" id="CT_pushButtonDelete" style="left:70px" onmouseover="CT_Button_State(this, rollover);" onmousedown="CT_Button_State(this, down);" onmouseup="CT_Button_State(this, up);" onmouseout="CT_Button_State(this, out);">' + tooltipDiv.getAttribute('DeleteString') + '</div>');
  htmlTooltip.push('</div></div>');

  tooltipInnerDiv.innerHTML = htmlTooltip.join("") + otherUserHtmlTooltip.join("");	

  var saveBtn = document.getElementById('CT_OkButton');
  var cancelBtn = document.getElementById('CT_cancelButton');
  var delBtn = document.getElementById('CT_pushButtonDelete');
	
  //saveBtn.attachEvent('onclick', CT_edit_save);
  //cancelBtn.attachEvent('onclick', CT_forceHideTooltip);
	
  if(showNew)
  {
    var commentInfo = CT_getCommentById(cmtIdArr[0]); 
    var cmt = commentInfo[0];
    cmtType = document.getElementById('CT_comboText_100');
    selTextLoc = cmt.loc;
    selTextLen = cmt.selTextLen;
    saveBtn.onclick = CT_save;
  }
  else
    saveBtn.onclick = CT_edit_save;
  
  cancelBtn.onclick = CT_onCancelButton;	
  delBtn.onclick = CT_removeComment;
}


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_stripToolbar
//
//  DESCRIPTION:
//   Disables the tool bar shown in multi user mode.
//   Allowing us to show the whole comment.
//
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_stripToolbar()
{
  pos = [tooltipDiv.offsetLeft, tooltipDiv.offsetTop];
  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'); 
    }
  }
  CT_correctPositionTooltip(pos);
}

//----------------------------------------------------------------------------------------------------
//  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)
{
  CT_stripToolbar();
  mouseOnTooltip=true;
  var inputObj;
  if(window.event)
  {
    inputObj=window.event.srcElement;
  }
  else
  {
    inputObj=evt.target;
  }
  var htmlTooltip = new Array();
  if(inputObj.cmtId != undefined || inputObj.cmtId != null) 
  {			
    if(MOUSEDOWN)
      ALLOWPREPARECOMMENTBOX = false;
    var pos = CT_positionTooltip(evt);		
    ORIGPOS = pos;
    CT_showTooltipCmt(inputObj);
    prepareCommentBoxActive = false;
    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);		
  } 
  else
  {	
    CT_prepareCommentBox(tooltipInnerDiv);
    CT_showCommentBox("",evt);
    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';
    document.getElementById('CT_commentTextEntryArea').focus();
    var textArea = document.getElementById('CT_commentTextEntryDiv');
    textArea.onmouseover = CT_mouseOverTextArea;
    textArea.onmouseout = CT_mouseOutOfTextArea;
  }
  var dropDown = document.getElementById('CT_comboBox_100');
  dropDown.onmouseover = CT_overDropDown;
  dropDown.onmouseout = CT_outOfDropDown;
}


/***********Function set to control the display and hiding of Dropdown in pop up box******************/

function CT_overDropDown()
{
  MOUSEOVERDROPDOWN = true;
}

function CT_outOfDropDown()
{
  MOUSEOVERDROPDOWN = false;
  setTimeout(CT_actualHideDropdown,1000);
  
}

function CT_actualHideDropdown()
{
   if(!MOUSEOVERDROPDOWN)
     CT_Hide_Element(CT_comboDropdown_100);
}

/*****************************************************************************************************/

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_mouseOverTextArea
//
//  DESCRIPTION:
//  Called to set the flag that mouse is over the editable region in the pop-up
//
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_mouseOverTextArea()
{
  MOUSEONTEXTAREA = true;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_mouseOutOfTextArea
//
//  DESCRIPTION:
//  Called to set the flag that mouse is out of the editable region in the pop-up
//
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_mouseOutOfTextArea()
{
  MOUSEONTEXTAREA = false;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_getActiveText
//
//  DESCRIPTION:
//  Called as soon as user highlights a text.
//
//  ARGUMENTS:
//     Object representing the event.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_getActiveText(event)
{
  MOUSEDOWN = false;
  if(!ALLOWPREPARECOMMENTBOX)
  {
    CT_collapseSelection();
    ALLOWPREPARECOMMENTBOX = true;
    return;	
  }
  var evt;
  if(window.event)
  {
    evt = window.event;
  }
  else
  {
    evt= event;
  }
  var selection = CT_getSelText();
  if(selection == null)
  {
    CT_hideTooltip();
    //hideCommentBox();
    return;
  }
  var curX = evt.clientX +  document.body.scrollLeft;
  var curY = evt.clientY +  document.body.scrollTop;
  if(selection == null)
  {
    var tx = x.style.left.toString();
    var ty = x.style.top.toString();
    var tempX = parseInt(tx.substr(0,tx.length - 2));
    var tempY = parseInt(ty.substr(0,ty.length - 2));

    if(curX < tempX || curX > (tempX + x.offsetWidth) || curY < tempY || curY > (tempY + x.offsetHeight))
    CT_hideTooltip(); //hideCommentBox();		
    return;
  }
  selTextLen = selection[0];
  selTextLoc = selection[1];
  CT_showTooltip(evt);
  //CT_showCommentBox("",evt);
  return;	
}

//----------------------------------------------------------------------------------------------------
//  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;

  if(window.getSelection)
  {
    tempX = evt.clientX + window.pageXOffset;
    tempY = evt.clientY + window.pageYOffset - 50;
    if((tempY + 205) > ( window.innerHeight +  window.pageYOffset ) )
      tempY =  window.innerHeight +  window.pageYOffset - 205;
    if(tempY < 0)
      tempY = 5;
    if((tempX + 255) > ( window.innerWidth +  window.pageXOffset ) )
      tempX =  window.innerWidth +  window.pageXOffset - 260;
  }
  else if(document.selection)
  {
    tempX = evt.clientX + document.documentElement.scrollLeft;
    tempY = evt.clientY + document.documentElement.scrollTop - 50;
    if((tempY + 210) > (document.documentElement.clientHeight + document.documentElement.scrollTop) )
      tempY = document.documentElement.clientHeight - 210 + document.documentElement.scrollTop;
    if(tempY < 0)
      tempY = 0;
    if((tempX + 250) > (document.documentElement.clientWidth + document.documentElement.scrollLeft) )
      tempX = document.documentElement.clientWidth - 250 + document.documentElement.scrollLeft;
  }
  x.style.left =  tempX + 'px';
  x.style.top = tempY + 'px';
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_prepareCommentBox
//
//  DESCRIPTION:
//     Called to draw the new comment pop-up.
//
//  ARGUMENTS:
//     Div tag to which HTML needs to be added
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_prepareCommentBox(sDiv)
{
  prepareCommentBoxActive = true;
  var check_div = document.getElementById(sDiv);
  var buf = new Array();
  buf.push('<div class="CT_commentPanelHeader" id="CT_commentPanelHeader_100">');
  buf.push(tooltipDiv.getAttribute('AddString') + '</div>');

  buf.push('<div id="CT_commentTextEntryDiv"><textarea class="CT_commentTextEntry" name="CT_commentTextEntryArea" id="CT_commentTextEntryArea"></textarea></div>');
  buf.push('<div class="CT_commentPanelFooter" id="CT_commentPanelFooter_Add" style="position:relative">');
  buf.push('<div class="CT_comboBox" id="CT_comboBox_100" onmouseOver="CT_ComboBox_State(this, rollover);" onmousedown="CT_ComboBox_State(this,down);CT_Show_Element(CT_comboDropdown_100);" onmouseup="CT_ComboBox_State(this,up);" onmouseout="CT_ComboBox_State(this,out);"><span id="CT_comboText_100">&nbsp;&nbsp;' + tooltipDiv.getAttribute('PublicString') + '</span>');
  buf.push('<div class="CT_comboDropdown" id="CT_comboDropdown_100"><div class="CT_comboDropdownTopItem" id="CT_comboItem_100_1" onclick="CT_Hide_Element(CT_comboDropdown_100);CT_Set_Element_Text(CT_comboText_100,Public);">&nbsp;&nbsp;' + tooltipDiv.getAttribute('PublicString') + '</div>');
  buf.push('<div class="CT_comboDropdownBottomItem" id="CT_comboItem_100_2" onclick="CT_Hide_Element(CT_comboDropdown_100);CT_Set_Element_Text(CT_comboText_100,Private);">&nbsp;&nbsp;' + tooltipDiv.getAttribute('PrivateString') + '</div>');
  buf.push('</div></div>');
  buf.push('<div class="CT_buttonGroup">');
  buf.push('<div class="CT_pushButton" id="CT_OkButton" style="left:0px" onmouseover="CT_Button_State(this, rollover);" onmousedown="CT_Button_State(this, down);" onmouseup="CT_Button_State(this, up);" onmouseout="CT_Button_State(this, out);">' + tooltipDiv.getAttribute('OKString') + '</div>' +
  '<div class="CT_pushButton" id="CT_cancelButton" style="left:70px" onmouseover="CT_Button_State(this, rollover);" onmousedown="CT_Button_State(this, down);" onmouseup="CT_Button_State(this, up);" onmouseout="CT_Button_State(this, out);">' + tooltipDiv.getAttribute('CancelString') + '</div>');
  buf.push('</div></div>');
  sDiv.innerHTML = buf.join("");

  var saveBtn = document.getElementById('CT_OkButton');
  var textDiv = document.getElementById('textDiv');
  var cancelBtn = document.getElementById('CT_cancelButton');
  cmtType = document.getElementById('CT_comboText_100');

  //saveBtn.attachEvent('onclick',CT_save);
  //cancelBtn.attachEvent('onclick', CT_onCancelButton);

  saveBtn.onclick = CT_save;
  cancelBtn.onclick = CT_onCancelButton;
  //will add extra details such as comment type, group etc. once the saving is complete
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_disablePrepareCommentBox
//
//  DESCRIPTION:
//     Sets the flag to let us know that no new comment box should pop-up.
//     Necessary when user hovers over the comment already existing
//
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_disablePrepareCommentBox()
{
  MOUSEDOWN = true;
  ALLOWPREPARECOMMENTBOX = false;
}

//----------------------------------------------------------------------------------------------------
//  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()
{		
  MOUSEDOWN = true;
  if(selTextLoc != 0)
  {
    var selection = CT_getSelText();
    if(selection == null)
    {
      CT_hideTooltip();
    }
  } 
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_collapseSelection
//
//  DESCRIPTION:
//     Non- highlighting selection, if any.
//
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_collapseSelection()
{
  if(document.selection && document.selection.empty)
  {
    try
    {
      var selection = document.selection.createRange();
    if(selection.text.length != 0 )
        document.selection.empty();		
    }
    catch(ex)
    {
      //some error silently fail
    }
  }
  else if(window.getSelection)
  {
    var selection = window.getSelection();
    if(selection && selection != "")
      selection.collapse();
  }
}

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

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_blockMouseOutOfToolTipevent
//
//  DESCRIPTION:
//     Called when text area is drawn (in already existing comment).
//     Blocks hiding of tooltip as mouse moves out of it.
//
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_blockMouseOutOfToolTipevent()
{
  prepareCommentBoxActive = true;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_onCancelButton
//
//  DESCRIPTION:
//     
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_onCancelButton()
{
  prepareCommentBoxActive = false;
  CT_forceHideTooltip();
}

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

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_onContextMenu
//
//  DESCRIPTION:
//     To disable the right click menu.
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_onContextMenu()
{
  if(MOUSEONTEXTAREA)
    return true
  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;
  tooltipDiv.onmouseover = CT_mouseOverToolTip;
  tooltipDiv.onmouseout = CT_mouseOutOfToolTip;
  tooltipDiv.onmouseup = CT_mouseUpToolTip;
  document.oncontextmenu = CT_onContextMenu;
  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_mouseUpToolTip
//
//  DESCRIPTION:
//     For additonaal check, called when mouse is relaesed over tool tip.
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_mouseUpToolTip()
{
  if(!ALLOWPREPARECOMMENTBOX)
    ALLOWPREPARECOMMENTBOX = true;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_initialize_comment_id
//
//  DESCRIPTION:
//     Sets the ID that can be used by new comment.
//     finds the highest ID and sets the next one to one higher than that
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_initialize_comment_id()
{
  var existing_comments;
  if (window.getSelection)
  {
    existing_comments = commentsDiv.innerHTML;
  }
  else if(document.selection)
  {
    existing_comments = commentsDiv.innerText;
  }	

  var index; 
  //var count = 0;
  var largestIndex = 99;
  for(var i = 0;i < existing_comments.length; )
  {
    var cmt_id = 0;
    var id_start_index = (existing_comments.indexOf('<CT_ID>',i)== -1)?-1:existing_comments.indexOf('<CT_ID>',i)+7;
    if (id_start_index != -1)		
    {
      id_start_index = (existing_comments.indexOf('<CT_ID>',i)== -1)?-1:existing_comments.indexOf('<CT_ID>',i)+7;
      i = id_start_index;
      id_end_index = existing_comments.indexOf('</CT_ID>',i);
      cmt_id = parseInt(existing_comments.substring(id_start_index,id_end_index));
    }
    id_start_index = (existing_comments.indexOf('<ct_id>',i)== -1)?-1:existing_comments.indexOf('<ct_id>',i)+7;
    if (id_start_index != -1)		
    {
      id_start_index = (existing_comments.indexOf('<ct_id>',i)== -1)?-1:existing_comments.indexOf('<ct_id>',i)+7;
      i = id_start_index;
      id_end_index = existing_comments.indexOf('</ct_id>',i);
      cmt_id = parseInt(existing_comments.substring(id_start_index,id_end_index));	
    }
    if(id_start_index == -1)
      break;
    if(cmt_id > largestIndex)
      largestIndex = cmt_id;

  }
  global_id = largestIndex+1;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_initialize
//
//  DESCRIPTION:
//     Called to take in all the informatino about the users
//  ARGUMENTS:
//     Legacy dummy variable.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_initialize(val)
{
  //processedCmts = new Array();
  pageContentDiv = document.getElementById('CT_page_content_div');
  globalElem = document.getElementById('CT_page_content_div');
  tooltipDiv = document.getElementById('CT_commentPanelContainer');
  //initializing strings .. had to be done for japanese
  Public = tooltipDiv.getAttribute('PublicString');
  Private = tooltipDiv.getAttribute('PrivateString');	
  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_initialize_comment_id();
  CT_attachBodyEvents();
}


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_attachToolTipEvents
//
//  DESCRIPTION:
//     Attach events to hte tooltip
//  ARGUMENTS:
//     Legacy dummy variable.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_attachToolTipEvents()
{
	
  if(filteredCmts == null && otherPlatformComments == 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;	
      cmtSpan.onmousedown = CT_disablePrepareCommentBox;
    }
	
	
  }
 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;	
                 otherSpan.onmousedown = CT_disablePrepareCommentBox;
		}
        
  }
  
  
}





/********************** 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,cmt_loc,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()
{
  //after every add of a comment, control comes here to add everything in the div content to the cmts array afresh. lets see if this works. 
  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_updatePage
//
//  DESCRIPTION:
//     called when specific change takes place in the comments (comment edit)
//  ARGUMENTS:
//     New comment (XML represntation in the ann format) .
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_refreshPage(added_comment)
{
  CT_populate_comment_array(added_comment);
  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.innerHTML = '&nbsp;&nbsp;' + text;
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_Show_New_Element
//
//  DESCRIPTION:
//    Called when the New button is clicked on the pop up.
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_Show_New_Element()
{
  if(showNew)
  {
    CT_Show_Element('CT_commentPanelFooter_New');
    pos = [tooltipDiv.offsetLeft, tooltipDiv.offsetTop];
    CT_stripToolbar();
    CT_correctPositionTooltip(pos);
  }
}

//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_Show_Edit_Element
//
//  DESCRIPTION:
//    Called when the Edit button is clicked on the pop up.
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_Show_Edit_Element()
{
  CT_Show_Element('CT_commentPanelFooter_Edit');
  pos = [tooltipDiv.offsetLeft, tooltipDiv.offsetTop];
  CT_stripToolbar();
  CT_correctPositionTooltip(pos);
}


//----------------------------------------------------------------------------------------------------
//  FUNCTION:
//   CT_SwitchMode
//
//  DESCRIPTION:
//    Decides on new or edit comment based in the current user comments.
//  ARGUMENTS:
//     Void.
//  RETURNS:
//     Void.
//----------------------------------------------------------------------------------------------------
function CT_SwitchMode()
{
  if(newOredit != null)
  {
    if(newOredit=='new')
     CT_Show_Element('CT_commentPanelFooter_New');
    else if(newOredit=='edit')
      CT_Show_Element('CT_commentPanelFooter_Edit');
  }
}