/**
  Copyright (c) 1999-2007 New Fire
 */


/**
  URL query field names and their values
 */
var _ACTION          = "_AC";
var _ATTRNAME        = "_AN";
var _ATTRINDEX       = "_AI";
var _BATCHSIZE       = "_BS";
var _CONDITION       = "_CO";
var _COUNT           = "_CN";
var _CRITERION       = "_CR";
var _DEFAULT         = "_D";  // postfix to default value attrName
var _KLASSNAME       = "_KN";
var _FRAME           = "_FM";
var _FROM_LIST       = "_FL";
var _FUNCTION        = "_FC";
var _FOCUS           = "_FO";
var _HEADING         = "_HD";
var _INDEX           = "_IX";
var _INTERVAL        = "_IV";
var _LIST            = "_L";  // postfix
var _LOCALE          = "_LC";
var _MKeys           = "_MKeys";  // generic mkeys attribute name
var _NAME            = "_NM";
var _NEXTPAGE        = "_NP";
var _OID             = "_ID"; 
var _ONERROR         = "_OE"; 
var _OP              = "_OP";
var _OPT             = "_";   // postfix
var _ORDERBY         = "_OB";
var _ORDERIN         = "_OI";
var _PATTRNAME       = "_PA";
var _PICK_LIST       = "_PL";
var _PICK_STRING     = "_PS";
var _PKLASSNAME      = "_PK";
var _POID            = "_PI";
var _PROPERTIES      = "_PP";
var _RETURN          = "_RT";
var _SCRIPT          = "_SC";
var _SELECTED        = "_SL";
var _SEARCHSTRING    = "_SS";
var _SOURCE          = "_SO";
var _STACK           = "_SK";
var _STACKER         = "_SR"; // stack separator
var _STARTINDEX      = "_SI";
var _STATE           = "_SA";
var _TAB             = "_TB";
var _TIMESTAMP       = "_TS";
var _TITLE           = "_T"; // postfix
var _TYPE            = "_TP";
var _VALUE           = "_VL";
var _WHERE           = "_WR";
var _XATTRIBUTE      = "_XA";
var _EXCLUSIVE       = "_XC";
var _XAXIS           = "_XX";
var _XLABEL          = "_XL";
var _YAXIS           = "_YX";
var _YATTRIBUTE      = "_YA";
var _YLABEL          = "_YL";

// _OP field values 
var OP_ACTION                     = "AC";
var OP_ACTION_OPEN                = "AO";
var OP_CALENDAR                   = "CD";
var OP_CALL                       = "CL";
var OP_CANCEL                     = "CC";
var OP_CHART_NEW                  = "CN";
var OP_CHART_VIEW                 = "CV";
var OP_CONDITION                  = "CO";
var OP_COND_AND                   = "CA";
var OP_COND_MODIFY                = "CM";
var OP_COND_OR                    = "CR";
var OP_CONFIG                     = "CF";
var OP_CONFIG_SAVE                = "CS";
var OP_DATABASE_CHECK             = "DC";
var OP_DATE_FORMAT                = "DF";
var OP_DELETE                     = "DL";
var OP_FILE_PROP                  = "FP";
var OP_FILE_BYTES                 = "FB";
var OP_FILE_LINES                 = "FL";
var OP_FILE_OPEN                  = "FO";
var OP_FILE_SHOW_BYTES            = "FY";
var OP_FILE_SHOW_LINES            = "FI";
var OP_FILE_SIZE                  = "FZ";
var OP_FORM_CANCEL                = "FQ";
var OP_FORM_CLEAR                 = "FR";
var OP_FORM_MODIFY                = "FM";
var OP_FORM_NEW                   = "FN";
var OP_FORM_POST                  = "FT";
var OP_FORM_POST_CHECK            = "FK";
var OP_FORM_POST_RELOAD           = "FX";
var OP_FORM_RELOAD                = "FA";
var OP_FORM_SEARCH                = "FH";
var OP_FORM_SEARCH_TITLE          = "FJ";
var OP_FORM_SAVE                  = "FS";
var OP_FORM_SAVE_RELOAD           = "FC";
var OP_FORM_VIEW                  = "FV";
var OP_FORM_VIEW_SEARCH           = "FW";
var OP_GO_BACK                    = "GB";
var OP_HISTORY                    = "HS";
var OP_KEYS_MODIFY                = "KM";
var OP_KEYS_SAVE                  = "KS";
var OP_LICENSE                    = "LI";
var OP_LIST_UP                    = "LU";
var OP_LIST_DELETE                = "LL";
var OP_LIST_DOWN                  = "LD";
var OP_LIST_REMOVE                = "LR";
var OP_LIST_POST_REMOVE           = "LS";
var OP_LOGON                      = "LG";
var OP_LOGON_PANEL                = "LP";
var OP_LOAD_KLASSES               = "LK";
var OP_LOAD_SEARCHABLE_ATTRIBUTES = "LA";
var OP_LOGOFF                     = "LO";
var OP_MIGRATE                    = "MG";
var OP_MONITOR                    = "MT";
var OP_NO_OP                      = "NO";
var OP_OPEN_FILE                  = "OF";
var OP_OPEN_DOC_FILE              = "OD";
var OP_PASSWORD                   = "PW";
var OP_PASSWORD_PANEL             = "PP";
var OP_PICKER                     = "PR";
var OP_PICKER_OPEN                = "PO";
var OP_PICK_SEARCH                = "PS";
var OP_PRINT                      = "PN";  // deprecated as of 2.2.0.23, use html/formsprint.jsp
var OP_PROFILE                    = "PF";
var OP_REPLICATE                  = "RP";
var OP_REPORT                     = "RT";
var OP_SEARCH                     = "SR";
var OP_SEARCH_FORM                = "SF";
var OP_SEARCH_TITLE               = "ST";
var OP_STATE                      = "SA";
var OP_TABLE                      = "TB";
var OP_TABLE_PRINT                = "TT";
var OP_TREE                       = "TR";
var OP_TREE_FORM                  = "TF";
var OP_TREE_MOVE                  = "TM";
var OP_TREE_PICKER                = "TP";
var OP_TREE_SHARE                 = "TS";
var OP_TREE_VIEW                  = "TV";
var OP_USER                       = "UR";
var OP_UPDATE                     = "UD";
var OP_VIEW_HISTORY               = "VH";
var OP_VIEW_SEARCH                = "VS";

// _ORDERIN field values 
var ORDER_IN_ASCENDING            = "0";
var ORDER_IN_DESCENDING           = "1";

// _OPT is used as the postfix of attrname
// _OPT is used for attribute search options or interval
// _OPT field values
var OPT_CONTAINS              = 1;
var OPT_EQUAL                 = 2;
var OPT_NOT_EQUAL             = 3;
var OPT_DOES_NOT_CONTAIN      = 4;
var OPT_DISCRETE              = 6;
var OPT_ENDS_WITH             = 7;
var OPT_EXACT_MATCH           = 8;
var OPT_GREATER_THAN          = 9;
var OPT_GREATER_THAN_OR_EQUAL = 10;
var OPT_IS_NULL               = 12;
var OPT_LESS_THAN             = 13;
var OPT_LESS_THAN_OR_EQUAL    = 14;
var OPT_SHOW                  = 0;
var OPT_STARTS_WITH           = 18;
var OPT_DEFAULT               = 26;  // default value is in _<attrName>

var OPT_YEAR                  = 80;
var OPT_MONTH                 = 81;
var OPT_DAY                   = 82;
var OPT_HOUR                  = 83;
var OPT_MINUTE                = 84;
var OPT_SECOND                = 85;
var OPT_MILLISECOND           = 86;

var OPT_1                     = -1;
var OPT_10                    = -2;
var OPT_100                   = -3;
var OPT_1000                  = -4;
var OPT_10000                 = -5;
var OPT_100000                = -6;
var OPT_1000000               = -7;

// _FUNCTION field values
var COUNT                = "0";

// _NEXTPAGE field values
//var NEXTPAGE_RELOAD = "RL";
//

// PICKER TYPE
var MULTIPLE = "MULTIPLE";

// TABLE TYPE
var TYPE_VIEW  = 0;
var TYPE_MODIFY = 1;
var TYPE_TITLE = 2;

// FORM TYPES

var TYPE_NORMAL = "N";
var TYPE_XFORM = "X";
var TYPE_TXFORM = "TX";

var FORM_VIEW = 0;
var FORM_SEARCH = 1;
var FORM_NEW = 2;
var FORM_MODIFY = 3;
var FORM_VIEW_SEARCH = 4;  // for read only
var FORM_SEARCH_TITLE = 7; // show titles and hyperlink
var FORM_DEFAULT = 8;      // For default values 

//
/////////////////////////////////////////

var CONTEXT = "/newfire";
var URI = CONTEXT+"/sl";

var DIALOG_WIDTH = "700";
var DIALOG_HEIGHT = "500";

var SUBMIT_DIALOG = "SubmitDialog";
var CONDITION_DIALOG = "ConditionDialog";

// do not want to declare here, because by enclosing this file
// will errase preset values if any
//var cmLastQuery = "";
//var cmStack = "";

// The default locale values 
cmConfirmDelete = "Are you sure you want to delete this item?";
cmConfirmRemove = "Are you sure you want to remove this item?";
cmCannotCopy = "You cannot copy this item.";

cmLog_Off = 'Log Off';
cmProfile = 'Profile';
cmHistory = 'History';
cmWhite_Board = 'White Board';
cmHelp = 'Help';

/**
  After logged on, refresh user info on titleBar.
 */
function cmLoggedOn(username, useroid, usertitle)
{
  // 4.3: do not find opener any more, if opener is closed, there
  //   will be permission denied error, needs to catch error.

  if (self.top && self.top.username)
  {
    self.top.username = username;
    self.top.useroid = useroid;
    self.top.usertitle = usertitle;

    // <span> is used here for NS4
    if (self.top.TitleBar)
    {
      self.top.TitleBar.cmLoggedOnMenu(username, usertitle);
    }
  } 
  cmFireEvent("sessionEvent", top, useroid, username, usertitle);
}

function cmLoggedOnMenu(username, usertitle)
{
      // if cmLog_Off starts with a space, append it to username.
      var logOffUser = cmLog_Off+' '+usertitle;
      if (cmLog_Off.indexOf(" ") == 0)
      {
        logOffUser = usertitle+cmLog_Off;
      }

      cmShow('logOff', 
         '<a href="javascript:logOff()">'
        +' '+logOffUser
        +'</a> | '
        +'<a href="javascript:profile()">'
        +cmProfile+' '
        +'</a> | '
        +'<a href="javascript:hist()">'
        +cmHistory+' '
        +'</a> | '
        +'<a href="javascript:help()">'
        +cmHelp+'&nbsp;'
        +'</a>'
        );
}

/**
  After logged off, refresh user info on titleBar.
 */
function cmLoggedOff()
{
  if (self.top && self.top.username)
  {
    self.top.username = "null";

    if (self.top.TitleBar)
    if (self.top.TitleBar.cmShow)
    {
      self.top.TitleBar.cmLoggedOffMenu();
    }
  }

  cmFireEvent("sessionEvent", top);
}

/**
  @param handler The event handling function.
  4.6.7: added parameters so sessionEvent() can pass username, etc
 */
function cmFireEvent(handler, win, arg1, arg2, arg3)
{
  try
  {
    if (win[handler])
    {
      win[handler](arg1, arg2, arg3);
    }
  }
  catch (e)
  {
    // Googe ad frame throws exception on "win[handler]" on FireFox, not IE
  }

  for (var i=0; win.frames && i<win.frames.length; i++)
  {
    cmFireEvent(handler, win.frames[i], arg1, arg2, arg3);
  }
}

function cmLoggedOffMenu()
{
      cmShow('logOff', 
        '<span class=menuitem>'
        +'<a href="javascript:help()">'
        +' '+cmHelp+'&nbsp;'
        +'</a>'
        +'</span>'
        );
}

/**
 * Log Off from server.
 */
function cmLogOff()
{
  document.location =
    URI+'?_OP=LO'
    +'&'+cmGetStamp();
}

/**
 * Traverse down from win (window) of each frame,
 * returns the "name" frame if any
 */
function cmGetFrame(win, name)
{
  if (!win.frames)
  {
  }
  else
  if (win.frames[name])
  {
    return win.frames[name];
  }
  else
  {
    for (var i=0; i<win.frames.length; i++)
    {
      var frame = cmGetFrame(win.frames[i], name);
      if (frame)
      {
        return frame;
      }
    }
  }
}

function cmToBlankPage()
{
  document.location.replace(CONTEXT+"/html/blank.html");
}

/**
 * replace the current url/location with url
 */
function cmReplaceUrl(url)
{
  url = cmStampUrl(url);

  // 4.6: do not use frame if there is a parent
  if (self != parent)
  {
    url = cmAddKeyValue(url, _FRAME, "none");
  }

  document.location.replace(url);
}

function cmGetStamp()
{
  return (new Date()).getTime();
}

function cmTimestamp()
{
  return _TIMESTAMP+"=" + (new Date()).getTime();
}

function cmStampUrl(url)
{
  return url + "&"+_TIMESTAMP+"=" + (new Date()).getTime();
}

/**
 * Back to the last page 
 * If there is nothing to go back, blank(close) this page(window)
 * @param pages The number of pages to go back, 1 or 2. Default is 1. 
 */
function cmGoBack(pages)
{
  if (self.name == SUBMIT_DIALOG)
  {
    self.close();
  }
  else
  if (cmLastQuery == null || cmLastQuery.length == 0)
  {
    // show blank page
    cmToBlankPage();
  }
  else
  {
    // back one page:
    var url = cmStack;
    url = cmPopStack(url);

    // back two pages:
    if (pages && pages == 2)
    {
      url = cmPopStack(url);
    }

    if (url)
    {
      url = cmStackToQuery(url);

      // go back to the last 1 or 2 page
      // case 1: http request, e.g. /newfire/html..., or http://...
      // case 2: servlet request, e.g. _OP=...

      // case 1:
      if (cmLastQuery.indexOf("/") == 0 || cmLastQuery.indexOf("http:") == 0)
      {
        //document.location.replace(url);
        cmReplaceUrl(url);
      }
      else
      {
        url = URI+"?"+url;
        cmReplaceUrl(url);
      }
    }
    else
    {
      cmToBlankPage();
    }
  }
}

/**
 * Dismiss the page.
 * 
 * if this window has an opener, close this window
 */
function cmDismiss()
{
  if (window.opener  && self.name == SUBMIT_DIALOG)
  {
    window.opener.cmGoBack();
  }
  else
  {
    //cmGoBack();
    cmToBlankPage();
  }
}

/**
 * @param url url location
 * @param title title of the window 
 * @param width width of the window
 * @param height height of the window
 */
function cmGetDialog(url, title, width, height) 
{
  if (!width) width = DIALOG_WIDTH;
  if (!height) height = DIALOG_HEIGHT;

  var dialog = window.open(url, title, 
    'left='+cmTileX()+',top='+cmTileY()
    +',width='+width+',height='+height
    +',resizable=yes,scrollbars=yes,status=0,menubar=yes');
  // Put url in window.open to suppress security warning when using SSL
  //dialog.location = url;
  dialog.focus();
  return dialog;
}

function cmOpenDialog(url, title) 
{
  cmGetDialog(url, title);
}

function cmOpenHelp(url)
{
  cmGetDialog(url, "Help");
}

function cmOpenDoc(oid)
{
  cmOpenFile("Doc", oid);
}

function cmOpenFile(klassName, oid, attrName)
{
  var url =
    URI+'?'
    +_OP+'='+OP_OPEN_FILE
    +'&'+_LOCALE+'='+cmLocale
    +'&'+_KLASSNAME+'='+klassName
    +'&'+_OID+'='+oid
    +'&'+_ATTRNAME+'='+attrName
    ;
  cmOpenDialog(url, klassName+oid+attrName);
}

/**
 * All form submission is Multipart POST for now.
 * Because currently, GET has data size limit using JSDK 1.2
 */
function cmSubmit(form)
{
  form.encoding = 'multipart/form-data';
  form.enctype = 'multipart/form-data'; // For Netscape 6
  form.method = 'POST';
  form.action =URI+'?'+_OP+'='+form.elements[_OP].value;
  form.submit();
}

function cmSubmitDialog(form, dialog, width, height)
{
  form.encoding = 'multipart/form-data';
  form.enctype = 'multipart/form-data'; // For Netscape 6
  form.method ='POST';
  form.action =URI+'?'+_OP+'='+form._OP.value;
  //cmGetDialog(CONTEXT+"/html/submitdialog.html", dialog, width, height);

  if (!width) width = DIALOG_WIDTH;
  if (!height) height = DIALOG_HEIGHT;

  //var dialog = window.open("", dialog, 'width='+width+',height='+height
  // Replaced empty url, so that when using SSL, it will not go outside the secured zone in order to suppress security warning.

  var dialog = window.open(CONTEXT+"/html/waitdialog.html", dialog, 
    'left='+cmTileX()+',top='+cmTileY()
    +',width='+width+',height='+height
    +',resizable=yes,scrollbars=yes,status=0,menubar=yes');

  //IE5: if dialog(same name) already opened, opener is not reset to
  // this window.  NS4/6 do not requires to reset dialog.opener

  dialog.opener = window;
  dialog.location = CONTEXT+"/html/submitdialog.html";
  dialog.focus();
}

/**
  Add/Replace key-value pair in the upper stack <stack1>

  @param stack Stack-string like: "<stack1>_SR<stack-string>"

  @param key C of "C=z"
  @param value z of "C=z"
  @return return "A=x&B=y&C=z"
 */
function cmAddKey(stack, key, value)
{
  // check _STACKER, split into stack1 and stack2
  i = stack.indexOf(_STACKER);   
  var stack2 = "";
  if (i > 0)
  {
    stack2 = stack.substring(i);	// _SK.....
    stack = stack.substring(0, i);
  }
  return cmAddKeyValue(stack, key, value)+stack2;
}

/**
  Add/Replace key-value pair in the query

  @param query of the form <uri>?<key-value pairs>
  @param key C of "C=z"
  @param value z of "C=z"
  @return return "A=x&B=y&C=z"
 */
function cmAddKeyValue(query, key, value)
{
  // find 
  // "key=..." 
  // "...&key=..."
  // "...?key=..."
  // and remove this key if any

  // check "key=..."
  var i = query.indexOf(key+"=");
  if (i == 0)
  {
    var j = query.indexOf("&", i+1);
    if (j > i)
    {
      query = query.substring(j+1);  // +1 to omit leading "&"
    }
    else
    {
      query = "";
    }
  }

  // check "...&key=..."
  i = query.indexOf("&"+key+"=");
  if (i >= 0)
  {
    var j = query.indexOf("&", i+1);
    if (j > i)
    {
      query = query.substring(0, i) + query.substring(j);
    }
    else
    {
      query = query.substring(0, i);
    }
  }

  // then check "...?key=..."
  i = query.indexOf("?"+key+"=");
  if (i >= 0)
  {
    var j = query.indexOf("&", i+1);
    if (j > i)
    {
      query = query.substring(0, i+1) + query.substring(j);
    }
    else
    {
      query = query.substring(0, i+1);
    }
  }

  // insert "key=value"
  return query+"&"+key+"="+value;
}

/**
  Get the value of key from query string.
 */
function cmGetParam(key)
{
  var query = window.location.search;
  var index = query.indexOf(key+'=');

  if (index < 0)
  {
    return null;
  }
  else
  {
    var i = index+(key.length)+1;

    var j = query.indexOf("&", i);
    if (j < 0)
    {
      return query.substring(i);
    }
    else
    {
      return query.substring(i, j);
    }
  }
}

/**
  Push url to stack.
  @param stack A stack: <stack>
  @return the stack: <url>_STACKER<stack>
 */
function cmPushStack(url, stack)
{
  return url+_STACKER+stack;
}

/**
  @param stack A stack: <s1>_STACKER<s2>
  @return the rest of the stack after popping: <s2>; or null
 */
function cmPopStack(stack)
{
  var index = stack.indexOf(_STACKER);
  if (index < 0)
  {
    return null;
  }
  else
  {
    return stack.substring(index + _STACKER.length);
  }
}

/**
 * @param stack A stack: <q1>_STACKER<q2>
 * @return Returns a query string after popping from the stack:
 *     <q1>&_STACK={<q2>}
 * @note:
 *   {} encoded
 *   <> string
 */
function cmStackToQuery(stack)
{
  index = stack.indexOf(_STACKER);
  if (index < 0)
  {
    return stack;
  }
  else
  {
    var q1 = stack.substring(0, index);
    var q2 = stack.substring(index + _STACKER.length);
    return q1 + "&" + _STACK + "=" + escape(q2);
  }
}

function cmIsIE()
{
  if (document.all) // IE 4+
  {
    return true;
  }
  else
  {
    return false;
  }
}

function cmIsNS4()
{
  if (document.layers) // NS 4
  {
    return true;
  }
  else
  {
    return false;
  }
}

function cmIsNS6()
{
  if (document.getElementById) // NS 6
  {
    return true;
  }
  else
  {
    return false;
  }
}

/**
 * You must have the following HTML structure in order to use cmShow()
 *
 * <!-- IE 5, NS 6 -->
 * <span id="idname"></span>
 * <!-- NS 4 -->
 * <ilayer id="idname">
 *   <layer id="idname" width="200"></layer>
 * </ilayer>
 *
 * @param text: the text you want to show
 */
function cmShow(id, text)
{
  if (cmIsNS4()) // NS 4
  {
    if (document.layers[id].document.layers[id])
    {
      document.layers[id].document.layers[id].document.write(text);
      document.layers[id].document.layers[id].document.close();
    }
  }
  else 
  //if (cmIsIE()) // IE 4+
  //if (cmIsNS6()) // NS 6
  {
    if (document.getElementById(id))
    {
      document.getElementById(id).innerHTML=text;
    }
  }
}

/**
 * Tokenize the given string s by delimiter d
 * @return Returns array of tokens
 */
function cmTokenize(s, d)
{
  var tokens = new Array();

  // get klassName
  if (!s || !d)
  {
    return tokens;
  }

  var i = 0;
  var i1 = 0;
  var i2 = s.indexOf(d);
  while (i2 > 0)
  {
    tokens[i++] = s.substring(i1, i2);  
    i1 = i2+1;
    i2 = s.indexOf(d, i1);
  }

  // get the last token
  if (i1 < s.length)
  {
    tokens[i++] = s.substring(i1);  
  }

  return tokens;
}

/*
 * This will log off currenct session, if any.
 * @param type "S" for keeping current session and switch user, 
 *   otherwise log off current session if any and relog on.
 * @param klass (optional) Use this klass for for new user registration, if any.
 */
function cmLogonPanel(type, klass, heading) 
{
  var url = 
    URI+"?"
    +_OP+"="+OP_LOGON_PANEL
    +"&"+_LOCALE+"="+cmLocale
    +"&"+_STACK+"="+escape(cmStack)
    ;

  if (type) 
  {
    url += "&"+_TYPE+"="+type
  }
  if (klass) 
  {
    url += "&"+_KLASSNAME+"="+klass
  }
  if (heading)
  {
    url += "&"+_HEADING+"="+heading
  }

  cmReplaceUrl(url);
}

/**
 * Redirect to the queryString, keep current stack to come back.
 */
function cmRedirect(queryString) 
{
  var url = 
    URI+"?"
    +"&"+queryString
    +"&"+_STACK+"="+escape(cmStack)
    ;
  cmReplaceUrl(url);
}

/*
 * Set the name with value in user's profile and then run the script, if any
 * @param source Javascript source to include, if any
 */
function cmSetProfile(name, value, script, source)
{
  document.location=
    URI+'?'
    +_OP+'='+OP_PROFILE
    +'&'+_NAME+'='+name
    +'&'+_VALUE+'='+value
    +'&'+_SCRIPT+'='+script
    +'&'+_SOURCE+'='+source
    +'&'+cmGetStamp();
}

/**
  Capture mouse position
 */
var cmMouseX;
var cmMouseY;

function cmListenOnMouseUp()
{
  if (!cmIsIE())
  {
    document.captureEvents(Event.MOUSEUP);
  }
  document.onmouseup = cmMouseXY;
}

function cmMouseXY(e) 
{
  if (cmIsIE()) 
  { // grab the x-y pos.s if browser is IE
    cmMouseX = event.clientX + self.screenLeft;
    cmMouseY = event.clientY + self.screenTop;
  }
  else 
  {  // grab the x-y pos.s if browser is NS
    cmMouseX = e.screenX;
    cmMouseY = e.screenY;
  }  
  return true;
}

/**
  4.5: Tile to left
 */
function cmTileX()
{
  if (cmIsIE()) 
  { 
    return top.screenLeft -25;
  }
  else 
  { 
    return top.screenX -25;
  }  
}

function cmTileY()
{
  if (cmIsIE()) 
  { 
    return top.screenTop -25;
  }
  else 
  { 
    return top.screenY +25;
  }  
}

function cmSetCookie(key, value)
{
  document.cookie = key+"="+value;
}

function cmClearCookie(key)
{
  document.cookie = key+"=";
}

function cmGetCookie(key)
{
  var cookie  = document.cookie;
  var i = cookie.indexOf(key+"=");
  if (i >= 0)
  { 
    var j = cookie.indexOf(";", i+1);
    if (j > 0)
    {
      return cookie.substring(i+key.length+1, j);
    }
  }
  return null;
}
