var ERROR_PREFIX = 'ERROR:';
var REDIRECT_PREFIX = 'REDIRECT:';
var ALERT_PREFIX = 'ALERT:';
var TEXT_ERROR_PREFIX = 'TEXT_ERROR:';

var SAVES_RPC_LOCKED = false;

var menuNode = null;
var menuNodeP = null;
var menuDelay;
var menuOrigMouseMove = null;


function releaseRpcLock() {
    SAVES_RPC_LOCKED = false;
}

function acquireRpcLock() {
    if (SAVES_RPC_LOCKED) {
        // never acquire a lock if it could possibly be locked already
        alert("An error occurred. Please try again.");
        return;
    }

    SAVES_RPC_LOCKED = true;
}

function savesTabEndRpc(req) {
    releaseRpcLock();
}

// Error handling
function rpcError(req, handlers) {
    try {
        if (req) {
            var r = req.responseText;
            if (ERROR_PREFIX == r.slice(0, ERROR_PREFIX.length)) {
                r = r.slice(ERROR_PREFIX.length);
                if (REDIRECT_PREFIX == r.slice(0, REDIRECT_PREFIX.length)) {
                    if (handlers && handlers[REDIRECT_PREFIX]) {
                        handlers[REDIRECT_PREFIX](r.slice(REDIRECT_PREFIX.length))
                    }
                    else {
                        alert('An unexpected error has occurred. Please refresh the page and try again shortly.');
                    }

                    return;
                }
                if (ALERT_PREFIX == r.slice(0, ALERT_PREFIX.length)) {
                    if (handlers && handlers[ALERT_PREFIX]) {
                        handlers[ALERT_PREFIX](r.slice(ALERT_PREFIX.length));
                    }
                    else {
                        alert(r.slice(ALERT_PREFIX.length));
                    }
                    return;
                }
                if (TEXT_ERROR_PREFIX == r.slice(0, TEXT_ERROR_PREFIX.length)) {
                    if (handlers && handlers[TEXT_ERROR_PREFIX]) {
                        handlers[TEXT_ERROR_PREFIX](r.slice(TEXT_ERROR_PREFIX.length));
                    }
                    else {
                        alert(r.slice(TEXT_ERROR_PREFIX.length));
                    }
                    return;
                }
            }
        }
    }
    catch(e) {
        // error in error handler - use unknown error page
    }
    //unknown error
    location.href = '/ErrorPage';
}

function findPos(obj)
{
    var curleft = curtop = 0;
    if (obj.offsetParent)
    {
        curleft = obj.offsetLeft
        curtop = obj.offsetTop
        while (obj = obj.offsetParent)
        {
            curleft += obj.offsetLeft
            curtop += obj.offsetTop
        }
    }

    return [curleft,curtop];
}

// func: getSize
//   Cross-browser function to get the size of an element.
function getSize(obj)
{
  obj = $(obj);
  var w = obj.clientWidth ? obj.clientWidth : obj.offsetWidth;
  var h = obj.clientHeight ? obj.clientHeight : obj.offsetHeight;
  return [w,h];
}

//func: getEventPosition
function getEventPosition(event)
{
  if (!event && window.event)
    event = window.event;
  var x = y = 0;
  if (event.clientX) {
    x = event.clientX;
    y = event.clientY;
  } else if (event.pageX) {
    x = event.pageX;
    y = event.pageY;
  }
  return [x,y];
}

// func: getEventRelativePosition
function getEventRelativePosition(event)
{
  var x = y = 0;
  if (event.offsetX) {
    x = event.offsetX;
    y = event.offsetY;
  } else if (event.layerX) {
    x = event.layerX;
    y = event.layerY;
  }
  return [x,y];
}

function itemRequest(elid, params) {
    var resFunc = function(req) {
        var node = document.getElementById(elid).innerHTML =
            req.responseText;
    }

    var errFunc = function(req) {
            rpcError(req);
    }

    var req = new HttpRpc('/SavesController', errFunc, resFunc);
    //alert(params.toString());
    req.sendRequest(params.toString());
}

function itemRequestEdit(elid, params) {
    var resFunc = function(req) {
        var obj = eval('(' + req.responseText + ')');
        if (obj['error']) {
            showItem('editTitleErrorMsg_' + obj['id']);
            $('editTitleErrorMsg_' + obj['id']).innerHTML = obj['error'] + '<br/>';
        } 
        else {
            var node = $(elid).innerHTML = obj['expanded'];
            $(elid).oldCollapsedHTML = obj['collapsed'];
        }
    }

    var errFunc = function(req) {
        rpcError(req);
    }

    var req = new HttpRpc('/SavesController', errFunc, resFunc);
    req.sendRequest(params.toString());
}

function itemRequestMap(elid, params) {
    var resFunc = function(req) {
        showMap(elid, req.responseText);
    }

    var errFunc = function(req) {
            rpcError(req);
    }

    var req = new HttpRpc('/SavesController', errFunc, resFunc);
    //alert(params.toString());
    req.sendRequest(params.toString());
}


function folderRequest(params, subFolder) {
    if (SAVES_RPC_LOCKED) { return }
    acquireRpcLock();

    try {
        var resFunc = function(req) {
    	 	document.location.href = req.responseText;
        }

        var errFunc = function(req) {
           var handler = function(msg) {
                if (msg == 'DUPFOLDER') {
                    if (subFolder) {
                        savesLhsError('A folder already exists with this name.');
                    }
                    else {
                        showItem('ADDFOLDER');
                        hideItem('addfolder_loading');
                        showItem('addfolder_dup');
                    }
                }
                else {
                    hideItem('ADDFOLDER');
                    alert(msg);
                }
            }
            
            var textHandler = function(msg) {
                alert(msg);
                if ($('lhsmenu')) {
                    savesHideLhsMenu();
                }
            }

            hideItem('ADDFOLDER');
            rpcError(req, { "ALERT:":handler, "TEXT_ERROR:":textHandler });
        }

        if (subFolder) {
            savesSetLhsMenu('lhsmenu_create_loading');
        }
        else {
            hideItem('addfolder_form');
            showItem('addfolder_loading');
        }

        var req = new HttpRpc('/SavesController', errFunc, resFunc, savesTabEndRpc);
        req.sendRequest(params.toString());
    }
    catch (e) {
        savesTabEndRpc();
        throw e;
    }
}

function itemRequestParse(fid, params, errorHandlerFunc) {
    if (SAVES_RPC_LOCKED) { return }
    acquireRpcLock();

    try {
        showItemWidgetMessage($('search_loading_div'));

        var resFunc = function(req) {
        var obj = eval('(' + req.responseText + ')');
        if (obj.errors && errorHandlerFunc != null) {
            hideItem('search_loading_div');
            errorHandlerFunc(obj.errors);
        } else {
            handleItemHtmlJSON(obj);
            adjustFolderCount(fid, 1);
        }
    }

    var errFunc = function(req) {
        var handler = function(msg) {
                hideItem('search_loading_div');
                if (msg == 'DUPITEM') {
                    $('search_error_div_msg').innerHTML = "Sorry, this item already exists in your " + document.getElementById("rhs_fname").innerHTML + " folder.";
                    showItemWidgetMessage($('search_error_div'));
                }
                else {
                    alert(msg);
                }
            }

        rpcError(req, { "ALERT:":handler });
    }

        var req = new HttpRpc('/SavesController', errFunc, resFunc, savesTabEndRpc);
        req.sendRequest(params.toString());
    }
    catch (e) {
        savesTabEndRpc();
        throw e;
    }
}

function createDiv(did, cls) {
    var node = document.createElement("div");
    if (did) {
        node.setAttribute("id", did);
        if (cls != 'NONE') {
            node.setAttribute("class", cls);
        }
    }

    return node;
}

function handleItemHtml(s, scrollTo) {
    var n = s.indexOf(':', 0);
    n = s.indexOf(':', n+1);
    n = s.indexOf(':', n+1);
    n = s.indexOf(':', n+1);

    var sf = s.slice(0,n);
    var sh = s.slice(n+1);
    //alert ('SF is ' + sf);
    //alert ('SH is ' + sh);
    var sa = sf.split(":", 4);
    var child = createDiv(sa[0], sa[3]);
    child.innerHTML = sh;

    var node = document.getElementById(sa[1]);
    if (sa[2] != 'NONE') {
        var anode = document.getElementById(sa[2]);
        node.insertBefore(child, anode);
    } else {
        node.appendChild(child);
    }

    if (scrollTo) {
        var nPos = document.getElementById(sa[0]).offsetTop;
	    window.scrollBy(0,nPos);
    }
}

function handleItemHtmlJSON(o) {

    var child = createDiv(o.divid, o.classname);
    child.innerHTML = o.html;
    if (o.collapsedhtml != 'NONE') {
        child.oldCollapsedHTML = o.collapsedhtml;
    }

    var node = document.getElementById(o.parentid);

    if (o.afterid != 'NONE') {
        var anode = document.getElementById(o.afterid);
        node.insertBefore(child, anode);
    } else {
        node.appendChild(child);
    }

    // pop up the confirmation box, hide the loading box
    hideItem('search_loading_div');
    document.getElementById("search_confirm_div_folder_name").innerHTML = document.getElementById("rhs_fname").innerHTML;
    var confirm = document.getElementById("search_confirm_div");
    showItemWidgetMessage(confirm, child, o.ispromo);
}

function showItemWidgetMessage(div, child, ispromo) {
    var createDivId = "CREATEITEM_" + $('rhs_tfid').innerHTML;
    if ($(createDivId).style.display == "none") {
        var parent = $("SavesLocW_searchresults").parentNode;
    } else {
        var parent = $(createDivId);
    }
    var pos = findPos(parent);
    if (child) {
        div.scrollTarget = child;
    }
    
    if(ispromo != null){
	 	if(ispromo == true){
	 	 	document.getElementById('orbitzConfirm1').style.display= 'block';
	 	 	document.getElementById('orbitzlinks').style.display= 'block';
	 	 }
	 	 else{
	 	 	document.getElementById('orbitzConfirm1').style.display= 'none';
	 	 }
    }
  
    div.style.top=pos[1] + (parent.offsetHeight - 75)/2;
    div.style.left=pos[0] + (parent.offsetWidth - 170)/2;
    div.style.display='block';
   

}

function saves_addFolder(parentid, nameid, subFolder) {
    var params = new  UrlParams();
    params.add('a', 'fcreate');
    var node = document.getElementById(parentid);
    if (node) {
      params.add('i', node.value);
    }
    else if (parentid) {
        params.add('i', parentid);
    }
    params.add('tt', document.getElementById(nameid).value);

    folderRequest(params, subFolder);
}

function expandItem(itemid, folderid, editMode) {

    var node = document.getElementById(getItemElementId(itemid,folderid));

    // Have we been expanded before?
    if (node.oldCollapsedHTML && !editMode) {
        reExpandItem(itemid, folderid);
        return;
    }

    node.oldCollapsedHTML = node.innerHTML;

    var params = new  UrlParams();
    params.add('a', 'info');
    params.add('l', itemid);
    params.add('i', folderid);
    params.add('ed', editMode ? true : false);

    itemRequest(getItemElementId(itemid,folderid), params);
}

function expandMap(itemid, folderid) {

    var node = document.getElementById(getItemElementId(itemid,folderid));

    // Have we been expanded before?
    if (node.oldCollapsedHTML) {
        reExpandItem(itemid, folderid);
        return;
    }

    node.oldCollapsedHTML = node.innerHTML;

    var params = new  UrlParams();
    params.add('a', 'info');
    params.add('l', itemid);
    params.add('i', folderid);
    itemRequestMap(getItemElementId(itemid,folderid), params);
}


function expandFolder(folderid) {

    var params = new  UrlParams();
    params.add('a', 'lf');
    params.add('i', folderid);
    itemRequest(getMainFolderId(folderid), params);

    SAVES_RHS_SUBFOLDERS.push(folderid);
}


function saveNotes(itemid, folderid, notes) {

    var params = new  UrlParams();
    params.add('a', 'save');
    params.add('l', itemid);
    params.add('n', document.getElementById(notes).value);
    itemRequest(getItemElementId(itemid,folderid), params);
}

function saveMapNotes(itemid, folderid, notes) {

    var params = new  UrlParams();
    params.add('a', 'save');
    params.add('l', itemid);
    params.add('n', document.getElementById(notes).value);
    itemRequestMap(getItemElementId(itemid,folderid), params);
}

function saveFolderNotes(fid, notes) {
    var params = new  UrlParams();
    params.add('a', 'save');
    params.add('i', fid);
    params.add('n', document.getElementById(notes).value);
    itemRequest('FNOTES' + fid, params);
}

function saves_addItem(geoID, detailID, locationTypeName, fid) {
    var params = new  UrlParams();
    params.add('a', 'create');
    params.add('i', fid);
    params.add('e', detailID);
    params.add('t', 5);

    itemRequestParse(fid, params);
}

function deleteRequest(fid, params) {
    if (SAVES_RPC_LOCKED) { return }
    acquireRpcLock();

    try {
        var resFunc = function(req) {

            savesHideRhsMenu();

            var results = eval('(' + req.responseText + ')');
            
            if (results['deletes'] && results['deletes'] != '') {
	            var elements = results['deletes'].split(":");
	            for (var i = 0; i < elements.length; i++) {
    	            var elem = document.getElementById(elements[i]);
        	        if (elem) {
            	        elem.parentNode.removeChild(elem);
                	}
	            }
	            
	           if (results['delcount'] && results['delcount'] > 0) {
                   adjustFolderCount(fid, -1 * results['delcount']);
               }
	        }
        }

        var errFunc = function(req) {
            rpcError(req);
        }

        savesSetRhsMenu('rhsmenu_delete_loading');
        var req = new HttpRpc('/SavesController', errFunc, resFunc, savesTabEndRpc);
        req.sendRequest(params.toString());
    }
    catch (e) {
        savesTabEndRpc();
        throw e;
    }
}

function saves_clearAddCreateItemFields() {
    $('CIT_'+tfid).value = '';
    $('CIU_'+tfid).value = '';
    $('CIN_'+tfid).value = '';
    $('CIFT_'+tfid).value = 'Flight';
    $('SavesLocW_query').value = '';
    // clear error messgaes
    hideItem('createTitleErrorMsg');
}

function saves_deleteItem(itemid, folderid) {
    var params = new  UrlParams();
    params.add('a', 'delete');
    params.add('i', folderid);
    params.add('e', itemid);

    deleteRequest(folderid, params);
}

function savesDeleteSelectedItem() {
    saves_deleteItem(SAVES_RHS_ARGS.itemid, SAVES_RHS_ARGS.folderid);
}

function saves_closeFreeForm(div) {
    var confirm = document.getElementById("search_confirm_div");
    if (confirm && confirm.style.display == 'block') {
        return;
    }

    hideItem(div);
}

function saves_closeEditFreeForm(id) {
    showItem('expandedItem_' + id);
    hideItem('editCustomItem_' + id);
}

function saves_addFreeform(fid, tid, uid, nid, ftid) {
    var confirm = document.getElementById("search_confirm_div");
    if (confirm && confirm.style.display == 'block') {
        return;
    }

    var params = new  UrlParams();
    params.add('a', 'create');
    params.add('i', fid);
    params.add('e', 1);
    params.add('t', 100);

    var node = document.getElementById(tid);
    if (node) {
        params.add('tt', node.value);
    }

	node = document.getElementById(uid);
    if (node) {
        params.add('u', node.value);
    }

    node = document.getElementById(nid);
    if (node) {
        params.add('n', node.value);
    }

    node = document.getElementById(ftid);
    if (node) {
        params.add('ft', node.value);
    }

    var errorHandler = function(errorObj) {
        if (errorObj['title']) {
            showItem('createTitleErrorMsg');
            $('createTitleErrorMsg').innerHTML = errorObj['title'] + '<br/>';
        }
    }
    itemRequestParse(fid, params, errorHandler);

    //hideItem('CREATEITEM_' + fid);
}

function saves_editFreeForm(id, tid, uid, nid, ftid) {
        var params = new  UrlParams();
    params.add('a', 'editFreeForm');
    params.add('e', id);

    var node = document.getElementById(tid);
    if (node) {
        params.add('tt', node.value);
    }

	node = document.getElementById(uid);
    if (node) {
        params.add('u', node.value);
    }

    node = document.getElementById(nid);
    if (node) {
        params.add('n', node.value);
    }

    node = document.getElementById(ftid);
    if (node) {
        params.add('ft', node.value);
    }

    var errorHandler = function(errorObj) {
        if (errorObj['title']) {
            showItem('editTitleErrorMsg');
            $('editTitleErrorMsg').innerHTML = errorObj['title'] + '<br/>';
        }
    }
    
    itemRequestEdit(getItemElementId(id, $('rhs_tfid').innerHTML), params);
}

function showItem(id) {
    document.getElementById(id).style.display = "block";
}
function hideItem(id) {
    document.getElementById(id).style.display = "none";
}
function swapItem(id1, id2) {
	hideItem(id2);
	showItem(id1);
}

function collapseItem(itemid, folderid, url, title) {
     var node = document.getElementById(getItemElementId(itemid,folderid));
     node.oldHTML = node.innerHTML;

     if (node.oldCollapsedHTML) {
         node.innerHTML = node.oldCollapsedHTML;
     } else {
         var par = node.parentNode;
         if (par) {
             if (par.oldCollapsedHTML) {
                node.oldCollapsedHTML = par.oldCollapsedHTML;
             } else {
                par = par.parentNode;
                if (par && par.oldCollapsedHTML) {
                   node.oldCollapsedHTML = par.oldCollapsedHTML;
                }
             }
         }

         if (node.oldCollapsedHTML) {
             node.innerHTML = node.oldCollapsedHTML;
         }
     }
}

function collapseFolder(folderid) {
     var title = document.getElementById("selectedFolderName" + folderid).innerHTML;
     var node = document.getElementById(getMainFolderId(folderid));
     node.oldHTML = node.innerHTML;
     var s =
        "<div class=\"selectedFolder folderFormatting\">" +
        "<a href=\"#\" onclick=\"reExpandFolder(folderid); return false\">" +
        "+</a>&#160;&#160;<span id=\"selectedFolderName" + folderid + "\">" + title + "</div>";
     node.innerHTML = s;

     for (var i in SAVES_RHS_SUBFOLDERS) {
        if (SAVES_RHS_SUBFOLDERS[i] == folderid) {
            SAVES_RHS_SUBFOLDERS.splice(i, 1);
            return;
        }
     }
}

function reExpandItem(itemid, folderid) {
     var node = document.getElementById(getItemElementId(itemid,folderid));
     node.innerHTML = node.oldHTML;
}

function reExpandFolder(folderid) {
     var name = document.getElementById("selectedFolderName" + folderid).innerHTML;
     var node = document.getElementById(getMainFolderId(folderid));
     node.innerHTML = node.oldHTML;
     document.getElementById("selectedFolderName" + folderid).innerHTML = name;
}

function editNotes (id1, id2, textId, notesId) {
    if (!id1 || !id2)
    {
      return;
    }

    document.getElementById(id1).style.display = "block"; // display the edit box
    document.getElementById(id2).style.display = "none"; // hide the data display boxes
}

function showMap(itemid, s) {

    var mapid = 'MAP_' + itemid;

    var n = s.indexOf(':', 0);
    n = s.indexOf(':', n+1);
    n = s.indexOf(':', n+1);
    n = s.indexOf(':', n+1);
    n = s.indexOf(':', n+1);

    var sf = s.slice(0,n);
    var sh = s.slice(n+1);
    var sa = sf.split(":", 6);

    var outer = createDiv('OMAP' + itemid);
    outer.style.marginLeft = 20;
    var child = createDiv(mapid, 'mapDiv');
    // For IE, set the size explicitly
    child.style.width = 430;
    child.style.height = 300;
    var node = document.getElementById(itemid);
    node.innerHTML = sh;

    outer.appendChild(child)
    node.appendChild(outer);

    var map = new SavesMap(child, parseFloat(sa[1]), parseFloat(sa[2]), parseInt(sa[0]), parseFloat(sa[3]), parseFloat(sa[4]));
    map.showMap();
}

function showGMap(node, lat, lng, zoom, dlat, dlng) {
   var map = new GMap2(node);
    map.addControl(new GSmallMapControl());
    map.setCenter(new GLatLng(lat, lng), zoom);
    if (dlat && dlng) {
    	map.addOverlay(new GMarker(new GLatLng(dlat, dlng)));
    }
}

// Maps printing
function SavesMap(node, lat, lng, zoom, dlat, dlng)
{
  this.node = node;
  this.lat = lat;
  this.lng = lng;
  this.zoom = zoom;
  this.dlat = dlat;
  this.dlng = dlng;
}

function SavesMapDeferred(nodeid, lat, lng, zoom, dlat, dlng)
{
  this.nodeid = nodeid;
  this.lat = lat;
  this.lng = lng;
  this.zoom = zoom;
  this.dlat = dlat;
  this.dlng = dlng;
}

SavesMap.prototype.showMap = function () {
   showGMap(this.node, this.lat, this.lng, this.zoom, this.dlat, this.dlng);
}

SavesMapDeferred.prototype.showMap = function () {
   var node = document.getElementById(this.nodeid);
   if (typeof node != 'undefined') {
       showGMap(node, this.lat, this.lng, this.zoom, this.dlat, this.dlng);
   }
}

function addMap(nodeid, lat, lng, zoom, dlat, dlng) {
    if (typeof g_printMaps == 'undefined') {
        g_printMaps = new Array();
    }
    g_printMaps[g_printMaps.length] = new SavesMapDeferred(nodeid, lat, lng, zoom, dlat, dlng);
}

function showAllMaps() {
    if (typeof g_printMaps != 'undefined') {
        for (i=0; i<g_printMaps.length; i++) {
            g_printMaps[i].showMap();
        }
    }
}

function scrollToItem(itemid, folderid) {
	var pos = findPos($(getItemElementId(itemid, folderid)));
    window.scrollTo(0, pos[1]);    
}

function getItemElementId(itemid, folderid) {
    return 'I' + itemid + '_F' + folderid;
}

function getCategoryElementId(cat, geo, folderid) {
    return 'C' + geo + '_' + cat + '_F' + folderid;
}

function getGeoElementId(geo, folderid) {
    return 'GEO' + geo + '_F' + folderid;
}

function getTopFolderId(folderid) {
    return 'TOPFOLDER_F' + folderid;
}

function getMainFolderId(folderid) {
    return 'MAINFOLDER_F' + folderid;
}

function getRhsMenuId(itemid) {
    return 'I' + itemid + '_menu';
}

function getLhsMenuId(folderid) {
    return 'F' + folderid + '_menu';
}

function openPrintWin(win, fid) {
  var c = win.open(
      '/SavesController?a=print&i=' + fid, 
      'printsaves',
      'toolbar=0,resizable=1,menubar=0,location=0,status=0,scrollbars=3,width=700,height=600');
  c.opener = win;
}

function openInParentOrSelf(url) {
  if (window.opener) {
      window.opener.location=url;
   } else {
      document.location=url;
   }
}

function savesSetExpanded(item) {
    setCookie('TAExpandedSaves', item, 1);
}

///////////////////////////////////////
// LHS Menus
///////////////////////////////////////
var SAVES_MOUSE_OVER_LHS_MENU = false;
var SAVES_LHS_ARGS = {};

var SAVES_LHS_SELECTED = null;
var SAVES_LHS_SUB_SELECTED = null;

function handleLhsMouseClick(event)
{
    if (SAVES_RPC_LOCKED) { return }

   if (document.getElementById('lhsmenu').style.display == 'block' && !SAVES_MOUSE_OVER_LHS_MENU) {
       savesHideLhsMenu();
       return false;
   }

   return true;
}

function savesSetLhsMenu(menuId)
{
    var menu = document.getElementById('lhsmenu');

    for (var i = 0; i < menu.childNodes.length; i++) {
        if (menu.childNodes[i].tagName == 'DIV') {
            menu.childNodes[i].style.display = 'none';
        }
    }

    showItem('lhsmenu');
    showItem(menuId);
}

function savesOpenLhsMenu(folderid, subf)
{
    if (SAVES_RPC_LOCKED) { return }

    SAVES_LHS_ARGS = {
        "folderid":folderid, "foldername":document.getElementById("lhsFolderName" + folderid).innerHTML
    };

    var menu = document.getElementById('lhsmenu');
    menu.style.display = 'block';

    for (var i = 0; i < menu.childNodes.length; i++) {
        if (menu.childNodes[i].style) {
            menu.childNodes[i].style.display = 'none';
        }
    }

    if (subf && (subf > 0)) {
        hideItem('lhsmenu_subf_cr');
    } else {
        showItem('lhsmenu_subf_cr');
    }
    savesSetLhsMenu('lhsmenu_options');


    menu.parentNode.removeChild(menu);

    var div = getLhsMenuId(folderid);
    document.getElementById(div).appendChild(menu);

    SAVES_ORIG_MOUSEDOWN = document.mousedown;
	document.onmousedown = handleLhsMouseClick;
}

function savesLhsMoveMenu()
{
    savesSetLhsMenu('lhsmenu_move');

    showItem("lhs_move_folders");
    document.getElementById("lhs_move_folders").innerHTML = renderTree(SAVES_WIDGET_TREE, false, 'savesWidgetFolderMove', SAVES_LHS_ARGS.folderid);
}

function savesWidgetFolderMove(folderName, folderId)
{
    if (SAVES_RPC_LOCKED) { return }
    acquireRpcLock();

    try {
        var params = new UrlParams();

        params.add('a', 'fmove');
        params.add('i', SAVES_LHS_ARGS.folderid);
        params.add('ni', folderId);

        var resFunc = function(req) {
            savesHideLhsMenu();

            // The folder we are on should still be selected.
            if (SAVES_LHS_SUB_SELECTED == SAVES_LHS_ARGS.folderid) {
                SAVES_LHS_SELECTED = folderId;
            }

            SAVES_WIDGET_TREE = eval('(' + req.responseText + ')');
            renderLhsTree();
        }

        var errFunc = function(req) {
            var handler = function(msg) {
                savesLhsError("Sorry, this move is not allowed.");
            }
            rpcError(req, { "ALERT:":handler });
        }

        savesSetLhsMenu('lhsmenu_move_loading');
        var req = new HttpRpc('/SavesController', errFunc, resFunc, savesTabEndRpc);
        req.sendRequest(params.toString());
    }
    catch (e) {
        savesTabEndRpc();
        throw e;
    }
}

function savesLhsRenameMenu()
{
    document.getElementById("new_folder_name").value = SAVES_LHS_ARGS.foldername;
    savesSetLhsMenu('lhsmenu_rename');
    $('new_folder_name').focus();
}

function savesLhsDeleteMenu()
{
    savesSetLhsMenu('lhsmenu_delete');
    document.getElementById('deleteFolderName').innerHTML = SAVES_LHS_ARGS.foldername;
}

function savesLhsSubfolderMenu()
{
    savesSetLhsMenu('lhsmenu_subfolder');
    $('new_subfolder_name').focus();
}

function savesLhsCreateSubfolder(nameBox)
{
    saves_addFolder(SAVES_LHS_ARGS.folderid, nameBox, true);
}

function savesLhsError(msg)
{
    savesSetLhsMenu('lhsmenu_error');
    document.getElementById("savesLhsErrorMsg").innerHTML = msg;
}

function savesHideLhsMenu()
{
    if (!SAVES_ORIG_MOUSEDOWN) {
        SAVES_ORIG_MOUSEDOWN = null;
    }

    document.onmousedown = SAVES_ORIG_MOUSEDOWN;
    hideItem('lhsmenu');
    var menu = document.getElementById('lhsmenu');
    menu.parentNode.removeChild(menu);
    document.body.appendChild(menu);
}

function savesLhsRename(nameDiv) {
    var name = document.getElementById(nameDiv).value;

    var params = new UrlParams();

    params.add('a', 'rename');
    params.add('fn', name);
    params.add('i', SAVES_LHS_ARGS.folderid);
    renameRequest(params, SAVES_LHS_ARGS.folderid, name);
}

function renameRequest(params, folderId, folderName) {
    if (SAVES_RPC_LOCKED) { return }
    acquireRpcLock();

    try {
        var resFunc = function(req) {
            savesHideLhsMenu();

            SAVES_WIDGET_TREE = eval('(' + req.responseText + ')');
            renderLhsTree();

            var f = document.getElementById('selectedFolderName' + folderId);
            if (f) {
                f.innerHTML = escapeFolderTitle(folderName);
            }
        }

        var errFunc = function(req) {
            
            var handler = function(msg) {
                    if (msg == 'DUPFOLDER') {
                        savesLhsError("There is already a folder named \"" + escapeFolderTitle(folderName) + "\"");
                    }
                    else {
                        alert(msg);
                        savesHideLhsMenu();
                    }
                }
            
            rpcError(req, { "ALERT:":handler, "TEXT_ERROR:":handler });
        }

        savesSetLhsMenu('lhsmenu_rename_loading');
        var req = new HttpRpc('/SavesController', errFunc, resFunc, savesTabEndRpc);
        req.sendRequest(params.toString());
    }
    catch (e) {
        savesTabEndRpc();
        throw e;
    }
}

///////////////////////////////////////
// RHS Menus
///////////////////////////////////////
var SAVES_RHS_MENU_LOC = null;
var SAVES_RHS_ARGS = {};
var SAVES_MOUSE_OVER_RHS_MENU = false;
var SAVES_RHS_SUBFOLDERS = new Array();
var SAVES_RHS_HOVER = null;

function savesSetRhsHover(id) {
    SAVES_RHS_HOVER = id;
}

function savesShowRhsHover(menuId)
{
    if (document.getElementById('rhsmenu').style.display != 'block') {
        savesSetRhsHover(menuId);
        showItem(menuId);
    }
}

function hideRhsHover() {
    if (SAVES_RHS_HOVER && document.getElementById(SAVES_RHS_HOVER) &&
        document.getElementById('rhsmenu').style.display != 'block') {

        hideItem(SAVES_RHS_HOVER);
    }
}

function savesSetRhsMenu(menuId)
{
    var menu = document.getElementById('rhsmenu');

    for (var i = 0; i < menu.childNodes.length; i++) {
        if (menu.childNodes[i].tagName == 'DIV') {
            menu.childNodes[i].style.display = 'none';
        }
    }

    showItem('rhsmenu');
    showItem(menuId);
}

function savesHideRhsMenu()
{
    if (!SAVES_ORIG_MOUSEDOWN) {
        SAVES_ORIG_MOUSEDOWN = null;
    }

    document.onmousedown = SAVES_ORIG_MOUSEDOWN;

    hideItem('rhsmenu');
    var menu = document.getElementById('rhsmenu');
    menu.parentNode.removeChild(menu);
    document.body.appendChild(menu);
}

function savesOpenRhsMenu(itemid, itemname, folderid, showModify)
{
    if (SAVES_RPC_LOCKED) { return }

    SAVES_RHS_ARGS = {
        "itemid":itemid, "itemname":itemname, "folderid":folderid,
        "foldername":document.getElementById('rhs_fname').innerHTML
    };

    var menu = document.getElementById('rhsmenu');
    menu.style.display = 'block';

    for (var i = 0; i < menu.childNodes.length; i++) {
        if (menu.childNodes[i].style) {
            menu.childNodes[i].style.display = 'none';
        }
    }

    $('rhsModifyLink').style.display = showModify ? "block" : "none";

    savesSetRhsMenu('rhsmenu_options');

    menu.parentNode.removeChild(menu);

    SAVES_RHS_MENU_LOC = getRhsMenuId(itemid);
    document.getElementById(SAVES_RHS_MENU_LOC).appendChild(menu);

    SAVES_ORIG_MOUSEDOWN = document.mousedown;
	document.onmousedown = handleRhsMouseClick;
}

function savesRhsModify()
{
    savesHideRhsMenu();
    hideItem('CREATEITEM_' + SAVES_RHS_ARGS.folderid);
    hideItem('search_confirm_div');
    if ($('expandedItem_' + SAVES_RHS_ARGS.itemid) == null) {
        expandItem(SAVES_RHS_ARGS.itemid, SAVES_RHS_ARGS.folderid, true);
    }
    else {
        hideItem('expandedItem_' + SAVES_RHS_ARGS.itemid);
        showItem('editCustomItem_' + SAVES_RHS_ARGS.itemid);
        hideItem('editTitleErrorMsg_' + SAVES_RHS_ARGS.itemid);
    }
}

function savesSetDate(folderid, date, type)
{
    params = new UrlParams();
    params.add('a', 'fdate');
    params.add('i', folderid);
    params.add('dt', type);
    params.add('dv', date.getTime());

    var s = savesFormatDate(date);

    var resFunc = function(req) {
        if (type == 1 || type == 3) {
            document.getElementById('startdate').innerHTML = s;
            document.getElementById('startdatems').value = date.getTime();
        }

        if (type == 2 || type == 3) {
            document.getElementById('enddate').innerHTML = s;
            document.getElementById('enddatems').value = date.getTime();
        }
    }

    var errFunc = function(req) {
        rpcError(req);
    }

    var req = new HttpRpc('/SavesController', errFunc, resFunc);
    req.sendRequest(params.toString());
}

function savesFormatDate(date) {
    if (jsGlobalDayOffset > 0) {
        return date.getDate() + ' ' + jsGlobalMonths[date.getMonth()] + ', ' + date.getFullYear();    
    } else {
        return jsGlobalMonths[date.getMonth()] + ' ' + date.getDate() + ', ' + date.getFullYear();
    }
}


function handleRhsMouseClick(event)
{
    if (SAVES_RPC_LOCKED) { return }

   if (document.getElementById('rhsmenu').style.display == 'block' && !SAVES_MOUSE_OVER_RHS_MENU) {
       savesHideRhsMenu();
       return false;
   }

   return true;
}

function savesRhsDeleteConfirm()
{
    if (SAVES_RPC_LOCKED) { return }
    acquireRpcLock();

    try {
        params = new UrlParams();
        params.add('a', 'deleteprompt');
        params.add('e', SAVES_RHS_ARGS.itemid);
        params.add('i', SAVES_RHS_ARGS.folderid);
        params.add('fn', SAVES_RHS_ARGS.foldername);

        var resFunc = function(req) {
            document.getElementById('rhsmenu_delete_confirmation_msg').innerHTML = req.responseText;
        }

        var errFunc = function(req) {
            rpcError(req);
        }

        var req = new HttpRpc('/SavesController', errFunc, resFunc, savesTabEndRpc);
        req.sendRequest(params.toString());
        

        hideItem('rhsmenu');

        document.getElementById('rhsmenu_delete_confirmation_msg').innerHTML = "Preparing to delete...";
        savesSetRhsMenu('rhsmenu_delete_confirmation');
    }
    catch (e) {
        savesTabEndRpc();
        throw e;
    }
}

function savesRhsCopyMenu()
{
    if (SAVES_WIDGET_TREE.children.length > 0) {
        savesSetRhsMenu('rhsmenu_copy_item');
    }
    else {
        savesSetRhsMenu('rhsmenu_copy_new_folder');
    }

    showItem("rhs_copy_folders");
    document.getElementById("rhs_copy_folders").innerHTML = renderTree(SAVES_WIDGET_TREE, "savesSetRhsMenu(\"rhsmenu_copy_new_folder\")", 'savesWidgetItemCopy', SAVES_RHS_ARGS.folderid);
    return false;
}

function savesRhsMoveMenu()
{
    if (SAVES_WIDGET_TREE.children.length > 0) {
        savesSetRhsMenu('rhsmenu_move_item');
    }
    else {
        savesSetRhsMenu("rhsmenu_move_new_folder");
    }

    showItem("rhs_move_folders");
    document.getElementById("rhs_move_folders").innerHTML = renderTree(SAVES_WIDGET_TREE, "savesSetRhsMenu(\"rhsmenu_move_new_folder\")", 'savesWidgetItemMove', SAVES_RHS_ARGS.folderid);
    return false;
}

function savesWidgetItemMove(folderName, folderId, parentId, newFolderBox)
{
    var newFolderName = newFolderBox ? $(newFolderBox).value : null;
    savesWidgetItemEdit('move', folderName, folderId, parentId, newFolderName);
}

function savesWidgetItemCopy(folderName, folderId, parentId, newFolderBox)
{
    var newFolderName = newFolderBox ? $(newFolderBox).value : null;
    savesWidgetItemEdit('copy', folderName, folderId, parentId, newFolderName);
}

function savesWidgetItemEdit(action, folderName, folderId, parentId, newFolderName)
{
    if (SAVES_RPC_LOCKED) { return }
    acquireRpcLock();

    try {
        var inline = false;
        for (var i in SAVES_RHS_SUBFOLDERS) {
            if (SAVES_RHS_SUBFOLDERS[i] == folderId) {
                inline = true;
                break;
            }
        }

        params = new UrlParams();
        params.add('a', action);
        params.add('e', SAVES_RHS_ARGS.itemid);
        params.add('i', SAVES_RHS_ARGS.folderid);
        params.add('gi', inline);
        
        var rhsfolder = SAVES_RHS_ARGS.folderid;
        
        if (folderId) {
            params.add('ni', folderId);
        }
        else {
            params.add('fn', newFolderName);
        }

        var resFunc = function(req) {
            savesHideRhsMenu();

            var results = eval('(' + req.responseText + ')');
            
            if (results['deletes'] && results['deletes'] != '') {
                var elements = results['deletes'].split(":");
                for (var i = 0; i < elements.length; i++) {
                    var elem = document.getElementById(elements[i]);
                    if (elem) {
                        elem.parentNode.removeChild(elem);
                    }
                }
                
               if (results['delcount'] && results['delcount'] > 0) {
                   adjustFolderCount(rhsfolder, -1 * results['delcount']);
               }
            }
            
            if (results['tree'] && results['tree'] != null) {
                SAVES_WIDGET_TREE = results['tree'];
                renderLhsTree();   
            }
            else if (folderId && results['inscount'] && (results['inscount'] != null)) {
                adjustFolderCount(folderId, results['inscount']);
            }
            
        }

        var errFunc = function(req) {
            var handler = function(msg) {

                    if (msg == 'DUPITEM') {
                        document.getElementById('rhsmenu_dup_name').innerHTML = "This item";
                        document.getElementById('rhsmenu_dup_folder').innerHTML = escapeFolderTitle(folderName);
                        if (action == 'copy') {
                            $('rhsmenu_selectanother').onclick = savesRhsCopyMenu;
                        }
                        else if (action == 'move') {
                            $('rhsmenu_selectanother').onclick = savesRhsMoveMenu;
                        }

                        savesSetRhsMenu('rhsmenu_dup');
                    }
                    else {
                        alert(msg);
                        savesHideRhsMenu();
                    }
                }

            rpcError(req, { "ALERT:":handler, "TEXT_ERROR:":handler });
        }

        if (action == 'copy') {
            savesSetRhsMenu('rhsmenu_copy_loading');
        }
        else if (action == 'move') {
            savesSetRhsMenu('rhsmenu_move_loading');
        }

        var req = new HttpRpc('/SavesController', errFunc, resFunc, savesTabEndRpc);
        req.sendRequest(params.toString());
    }
    catch (e) {
        savesTabEndRpc();
        throw e;
    }
}

function savesDeletePhoto(id, photoId) {
    params = new UrlParams();
    params.add('a', 'pdelete');
    params.add('e', id);
    params.add('d', photoId);

    var resFunc = function(req) {
        var table = $('photoTable_' + id);
        var cell = document.getElementById('photo' + photoId).parentNode;
        var row = cell.parentNode;
        var startIndex = cell.cellIndex;
        var prevRow = null;
        
        for (var r = row.rowIndex; r < table.rows.length; r++) {
            row = table.rows[r];
            for (var i = startIndex; i < row.cells.length; i++) {
                if (i == 0 && prevRow != null) {
                    prevRow.cells[prevRow.cells.length - 1].innerHTML = row.cells[i].innerHTML;
                }
                
                if (i == row.cells.length - 1) {
                    row.cells[i].innerHTML = "";
                }
                else if (row.cells[i].innerHTML != "") {
                    var nextCell = row.cells[i + 1];
                    row.cells[i].innerHTML = nextCell.innerHTML;
                }        
            }
            
            startIndex = 0;
            prevRow = row;
        }
        

        // If there is only one photo left, hide the delete button
        var button = document.getElementById('deletePhotoButton' + req.responseText);
        if (button) {
            button.style.display = 'none';
        }
    }

    var errFunc = function(req) {
        rpcError(req);
    }

    var req = new HttpRpc('/SavesController', errFunc, resFunc);
    req.sendRequest(params.toString());
}

///////////////////////////////////////
// The saves folder widget
///////////////////////////////////////

// Constant chunks of html to add dynamically
var savesWidgetStart = "<div>";
var savesWidgetEnd = "</div>";

// Global state variables
var SAVES_WIDGET_ARGS = {};
var SAVES_SELECTED_FOLDER = null;
var SAVES_ORIG_MOUSEDOWN = null;
var SAVES_MOUSE_OVER_WIDGET = false;
var SAVES_WIDGET_TREE = {};
var SAVES_RECENT_SAVES = {};
var SAVES_RECENT_SAVES_MAX_SIZE = 5;

function fetchSavesWidgetData(resFunc) {
    if (resFunc == null) {
      var resFunc = function(req) {
           updateSavesWidgetTree(eval('(' + req.responseText + ')'));
      }
    }

    var errFunc = function(req) {
        // TODO
    }

    var params = new UrlParams();
    params.add('a', 'jsondata');
    var req = new HttpRpc('/SavesController', errFunc, resFunc);
    req.sendRequest(params.toString());
}



function updateSavesWidgetTree(jsonData) {
    var obj = jsonData;

    SAVES_WIDGET_TREE = obj["tree"];
    SAVES_RECENT_SAVES = obj["lastfive"];
}

function savesWidgetStartRpc() {
    if (SAVES_RPC_LOCKED) {
        // Double-check
        alert('An error has occurred. Please try again.');
    }

    acquireRpcLock();
    hideItem('save_this_div_folders');
    hideItem('save_this_div_new_folder');
    hideItem('save_this_div_title');
	showItem('save_this_div_loading');
}

function savesWidgetEndRpc(req) {
    releaseRpcLock();
}
    function savesWidgetCreate(folderName, folderId, parentId)
    {
        if (SAVES_RPC_LOCKED) { return }
        savesWidgetStartRpc();

        try {
            var newFolder = (folderId == null);

            var params = new  UrlParams();
            params.add('a', newFolder ? 'ifcreate' : 'create');

            params.add('io', 'true');

            if (newFolder) {
                params.add('fn', folderName);
            }
            else {
                params.add('i', folderId);
            }

            for (prop in SAVES_WIDGET_ARGS) {
                params.add(prop, SAVES_WIDGET_ARGS[prop]);
            }
            var resFunc = function(req) {

    	        // Build the message
    	        document.getElementById('save_this_div_confirmation_name').innerHTML = "The item ";
                document.getElementById('save_this_div_confirmation_folder').innerHTML = escapeFolderTitle(folderName) + ' ';
                // Build the link to my trips on the member profile page
    	        var cr = eval('(' + req.responseText + ')');
    	       var newItem;
                if (newFolder) {
                    newItem = cr.items[0].id;
                    folderId = cr.folder[0].id;
                    var newFolderObj = { folderid : folderId, name : cr.folder[0].name};
                    if (SAVES_WIDGET_TREE.children == null) {
                        SAVES_WIDGET_TREE.children = [];
                    }
                    var nitems = cr.items.length;
                   
                   //if item at top of array is a "clone", then delete it, otherwise
	       	    	//it will be hidden away by the sort and show up as duplicate
                    if(SAVES_WIDGET_TREE.children[0] && SAVES_WIDGET_TREE.children[0].clone){
                        SAVES_WIDGET_TREE.children.shift();
                    }

                    SAVES_WIDGET_TREE.children.push(newFolderObj);
                    SAVES_WIDGET_TREE.children.sort(function(a,b) {
                        var an = a.name;
                        var bn = b.name;
                        if(an == bn) {return 0}
                        if (an > bn) {return 1}
                        if (an < bn) {return -1}
                    });
                }
                else {
                    newItem = cr.items[0].id;
                }
                var bPromo = false;
                for (var i=0; i<nitems; i++) {
                	if(cr.items[i].ispromo == true){
                		document.getElementById('orbitzConfirm').style.display= "block";
                    	bPromo = true;
   	   			    	break;
                 	}
                }
                if(bPromo == false)
                {
                	document.getElementById('orbitzConfirm').style.display= "none";
                }

                var p = new UrlParams();
                p.add('c', 'v');
                p.add('i', folderId);
                p.add('l', newItem);
                if (parentId) {
                    p.add('k', parentId);
                }

                // Adjust recent saves
                var nitems = cr.items.length;
                for (var i=0; i<nitems; i++) {
                    SAVES_RECENT_SAVES.unshift(cr.items[i]);
                }

                while (SAVES_RECENT_SAVES.length > SAVES_RECENT_SAVES_MAX_SIZE) {
                    SAVES_RECENT_SAVES.pop();
                }

                try {
                    document.getElementById("show_last_saves_anchor").className = 'signinlink myTripsUnviewed';
                } catch (err) { // best effort only: not every page has this
                }

                var url = "/MemberProfile?" + p.toString();
                var parwin = window.opener;
                
                if ((SV_IS_POPUP == 0) || typeof parwin == 'undefined') {
    	            document.getElementById('save_this_div_confirmation_link').href = url;
    	        } else {
    	            document.getElementById('save_this_div_confirmation_link').href = '#';
    	            document.getElementById('save_this_div_confirmation_link').onclick = function () {
    	                parwin.location = url;
    	                window.close();
    	            };
    	        }

                // Swap in the confirmation
                hideItem('save_this_div_folders');
                hideItem('save_this_div_new_folder');
                hideItem('save_this_div_loading');
                hideItem('save_this_div_title');
    	        showItem('save_this_div_confirmation');
    	        
    	        // Hide the confirmation shortly
              timeout = 2000;
              for (var i=0; i<cr.items.length; i++) {
                if(cr.items[i].ispromo == true){
                  timeout = 10000;
                  break;
                }
              }
    	        setTimeout(autoCloseSaveConfirmation, timeout);
            }

            var errFunc = function(req) {
                var handler = function(msg) {
                    if (msg == 'DUPITEM') {
                        document.getElementById('save_this_div_dup_name').innerHTML = "This item ";
                        document.getElementById('save_this_div_dup_folder').innerHTML = escapeFolderTitle(folderName) + ' ';
                        hideItem('save_this_div_folders');
                        hideItem('save_this_div_loading');
                        hideItem('save_this_div_folder_error');
    	                showItem('save_this_div_dup');
                    }
                    else if (msg == 'DUPFOLDER') {
                        hideItem('save_this_div_folders');
                        hideItem('save_this_div_loading');
    	                showItem('save_this_div_folder_error');
                    }
                    else {
                        alert(msg);
                        hideItem('save_this_div_loading');
                        if (newFolder) {
                            toggleCreateFolder(true);
                        }
                    }
                }

                rpcError(req, { "ALERT:":handler, "TEXT_ERROR:":handler });
            }

            var req = new HttpRpc('/SavesController', errFunc, resFunc, savesWidgetEndRpc);
            req.sendRequest(params.toString());
        }
        catch (e) {
            alert(e);
            savesWidgetEndRpc();
            throw e;
        }
    }

    function handleSavesPostLoginPopup() {
        var sLocation = parent.location.toString();
        var nHashLoc = sLocation.lastIndexOf('#');
        if (nHashLoc > -1) {
            var saveId = sLocation.substring(nHashLoc + 1, sLocation.length);
            if (saveId.indexOf('save') == 0) {
                var anchor = $(saveId.substring(4, saveId.length));
                if (anchor != null) {
                    var pos = findPos(anchor);
                    var nPos = pos[1];
                    window.scrollBy(0, nPos - 100);
                    anchor.onclick();
                }
            }
        }
    }

    var MOUSE_OVER_CONFIRMATION = false;

    function trackMouseConfirmation(e) {
        var pos = getEventPosition(e);
        MOUSE_OVER_CONFIRMATION = isIn(pos, 'save_this_div_confirmation');
    }

    function autoCloseSaveConfirmation() {
        if ($('save_this_div_confirmation').style.display == 'block') {
            // Reschedule if the mouse cursor is over the box
            if (MOUSE_OVER_CONFIRMATION) {
                setTimeout(autoCloseSaveConfirmation, 500);
            }
            else {
                hideItem('save_this_div');
            }
        }
    }

    function travelTree(node, func, parent) {
        func(node, parent);
        if (node.children != null) {
            for(childIdx in node.children) {
                travelTree(node.children[childIdx], func, node);
            }
        }
    }

    function deepCopy(obj, func, accum) {
        if (accum == null) { accum = {idGen:1}; }
        if(obj.copyId) {
            return accum[obj.copyId];
        }
        obj.copyId = accum.idGen++;
        var ret = {};
        if (obj.constructor) {
            ret = obj.constructor();
        }
        accum[obj.copyId] = ret;
        for (var i in obj) {
            var iVal = obj[i];
            if (typeof(iVal) == 'object') {
                var iCopy = accum[iVal.copyId];
                if (iCopy == null) {
                    iCopy = deepCopy(iVal, func, accum);
                }
                ret[i] = iCopy;
            } else {
                ret[i] = iVal;
            }
            //ret[i] = typeof(obj[i]) == 'object' ? deepCopy(obj[i]) : obj[i];
        }
        if (func != null) {
            func(ret);
        }
        delete obj.copyId;
        delete ret.copyId;
        return ret;
    }
    
    function showDeletePhoto(anchor, toOpen)
    {
        var pos = findPos($(anchor));
        var box = document.getElementById(toOpen);
		box.style.display = 'block';
		box.style.position = 'absolute';
		box.style.top = pos[1] + 13;
		box.style.left = pos[0];
    }
    
	function showSavesWidget(anchor, entityType, entityId, options, xOff, yOff, fromLander)
	{
	   if (SAVES_RPC_LOCKED) { return }

	   SAVES_WIDGET_ARGS = options == null ? {} : options;
	   SAVES_WIDGET_ARGS["t"] = entityType;
	   SAVES_WIDGET_ARGS["e"] = entityId;

	    SAVES_ORIG_MOUSEDOWN = document.mousedown;
	    document.onmousedown = handleWidgetMouseClick;

		var pos = findPos(anchor);

        if (SAVES_RECENT_SAVES != null && SAVES_RECENT_SAVES[0]) {
           var mruFolderId = SAVES_RECENT_SAVES[0].folderid;
           var mruFolder = null;
           travelTree(SAVES_WIDGET_TREE, function(node, parent) {
                    if (parent != null) { node.parent = parent; }
                    if (node.folderid == mruFolderId) {
                        mruFolder = node;
                     }
           });
           if (mruFolder != null) {
               // find the parent
               var toClone = mruFolder;
               while (toClone.parent.folderid != 1) {
                    toClone = toClone.parent;
               }
               var folderClone = deepCopy(toClone, function(obj) {
                    obj.clone = true;
                    if (obj.folderid == mruFolder.folderid) { obj.recent = true; }
               });
               //var folderClone = {};
               //for (var i in mruFolder) { folderClone[i] = mruFolder[i]; }
               //folderClone.recent = true;
               if (SAVES_WIDGET_TREE.children == null) {
                    SAVES_WIDGET_TREE.children = [];
               }
               if (SAVES_WIDGET_TREE.children[0] && SAVES_WIDGET_TREE.children[0].clone) {
                   // already have a recent one, replace it
                   SAVES_WIDGET_TREE.children[0] = folderClone;
               } else {
                   SAVES_WIDGET_TREE.children.unshift(folderClone);
               }
           }
        }

		$("save_this_div_folders").innerHTML = renderTree(SAVES_WIDGET_TREE, 'toggleCreateFolder(true);', 'savesWidgetCreate');

		var box = $('save_this_div');
		box.style.display = 'block';
		box.style.position = 'absolute';
		box.style.top = ((typeof yOff != 'undefined') ? pos[1] + yOff : pos[1] + 20) + "px";
		box.style.left = ((typeof xOff != 'undefined') ? pos[0] + xOff : pos[0]) + "px";

    if (xOff) {
      var point = $('savePoint');
      point.style.left = (39-xOff) + "px";
    }

		showItem('save_this_div_folders');
		showItem('save_this_div_title');
		hideItem('save_this_div_new_folder');
		hideItem('save_this_div_confirmation');
		hideItem('save_this_div_dup');
		hideItem('save_this_div_folder_error');

        if (!SAVES_WIDGET_TREE.children || !SAVES_WIDGET_TREE.children[0]) {
            // popup new new folder dialog if there are no folders
            toggleCreateFolder(true);
            
            // in promo mode, submit right away
            if ((typeof fromLander != 'undefined') && (fromLander)) {
                $('savesNewFolderForm').onsubmit();
            }
        }
	}

	function hideSavesWidget()
	{
	   if (SAVES_RPC_LOCKED) { return }
	   
	   if (!SAVES_ORIG_MOUSEDOWN) {
          SAVES_ORIG_MOUSEDOWN = null;
       }
       
	   document.onmousedown = SAVES_ORIG_MOUSEDOWN;
	   hideItem('save_this_div');
	}

	function savesSetMouseOver(val)
	{
	   SAVES_MOUSE_OVER_WIDGET = val;
	}

	function handleWidgetMouseClick(event)
	{
	   if (document.getElementById('save_this_div').style.display == 'block' && !SAVES_MOUSE_OVER_WIDGET) {
	       hideSavesWidget();
	       return false;
	   }

	   return true;
	}

	function toggleCreateFolder(show)
	{
	   if (show) { 
           if(SAVES_WIDGET_TREE.children == null || !SAVES_WIDGET_TREE.children[0]) {
               // if no folders in the tree show suggested one
               document.getElementById('savesWidgetNewFolder').value = SV_DEFAULT_FOLDER_NAME;
           }
	       hideItem('save_this_div_folders');
	       showItem('save_this_div_new_folder');
	       
	       if (!isFF || isMinFF1_5) {
    	       $('savesWidgetNewFolder').focus();
    	   }
	   }
	   else {
           if (SAVES_WIDGET_TREE.children == null || !SAVES_WIDGET_TREE.children[0]) {
               // if no folders in the tree just close it
               hideItem('save_this_div');
           } else {
	           showItem('save_this_div_folders');
	           hideItem('save_this_div_new_folder');
           }
	   }

	   showItem('save_this_div_title');
	}

    function showSubFolder(subFolderId, showSub)
    {
        if (SAVES_SELECTED_FOLDER) {
            hideItem(SAVES_SELECTED_FOLDER);
            SAVES_SELECTED_FOLDER = null;
        }

        if (showSub) {
            showItem(subFolderId);
            SAVES_SELECTED_FOLDER = subFolderId;
        }
    }
    
    function hideSubFolder(currentFolder)
    {
        if (SAVES_SELECTED_FOLDER && currentFolder != SAVES_SELECTED_FOLDER) {
            hideItem(SAVES_SELECTED_FOLDER);
            SAVES_SELECTED_FOLDER = null;
        }
    }

    function renderTree(root, createFolderAction, action, currentFolder)
	{
		var html = savesWidgetStart;

		if (root.children) {
            html += '<div>'
			for (var  i = 0; i < root.children.length; i++) {
				child = root.children[i];
                if (i == 0 || child.folderid != root.children[0].folderid) {
                    // don't show recent folder in regular list
    				html += getSavesWidgetFolder(child, action, currentFolder);
                }
			}
            html += '</div>';
		}

		if (createFolderAction) {
		    html += getWidgetCreateMenuItem(createFolderAction);
		}

		return html + savesWidgetEnd;
	}

	function renderLastSaves(list)
	{
	    var html = "";
	    if (list.length > 0) {
		    for (var i=0; i < list.length; i++) {
		        var item = list[i];
		        if (i == 0) {
		            html += '<div class="topFolder"><div class="saveSectionTitle">Recently Saved Items</div>';
		        }
	            html += '<div class="flyoutContentsWide"><ul class="arrows">';
	            html += '<li><a href="'+item.url+'">'+item.title + '</a></li>';
	            html += '</ul></div>';
	   	        if (i == 0) {
	         		html += '</div>';
	            }
	        }
	    } else {
	        html += '<div class="topFolder" style="margin:5px 0;"><em>You have no recently saved items.</em></div>';
	    }
             
        html +='<div class="flyoutContentsWide">' +
               '<div class="topFolder"><a href="/MemberProfile-cv-p209" onclick="goToSavesTab(this); return true"><strong>Go to My Trips &#187;</strong></a></div>' +
               '</div>';

        return html;
	}

var showLastSavesRD = function(node)
{
  return renderLastSaves(SAVES_RECENT_SAVES);
}

function showLastSaves()
{
  if (menuNode != $('mytrips_div')) {
    $('mytrips_div_contents').innerHTML = renderLastSaves(SAVES_RECENT_SAVES);
    hide(menuNode, menuNodeP);
    menuDelay  = setTimeout(function(){showMenu('mytrips_div');},250);
  }
}

function goToSavesTab(link) {
        var url = "/MemberProfile?c=v&p=209";
        try {
            if (SAVES_RECENT_SAVES && SAVES_RECENT_SAVES[0]) {
                var mruFolderId = SAVES_RECENT_SAVES[0].folderid;
                var mruFolder = null;
                travelTree(SAVES_WIDGET_TREE, function(node, parent) {
                        if (parent != null) { node.parent = parent; }
                        if (node.folderid == mruFolderId) {
                            mruFolder = node;
                         }
                     });
                if (mruFolder) {
                    url += "&i=" + mruFolder.folderid;
                    
                    if (mruFolder.parent && mruFolder.parent.folderid != 1) {
                        url += "&k=" + mruFolder.parent.folderid;
                    }
                }
            }
        }
        catch (ignore) {
            // Ignore any errors... worst case scenario is that these links don't take you to the tab
        }
        
        link.href = url;
}

function showMyTA()
{
  if (menuNode != $('myta_div')) {
    hide(menuNode, menuNodeP);
    menuDelay  = setTimeout(function(){showMenu('myta_div');},250);
  }
}

function showRegisterMenu()
{
  if (menuNode != $('register_div')) {
    hide(menuNode, menuNodeP);
    menuDelay  = setTimeout(function(){showMenu('register_div');},250);
  }
}

// func: hideSlideIfNotIn
//   Hide a target sliding element but only if not currently animating.
//
// Parameters:
//   e - triggering event (e.g. onmouseout)
//   animating - true if currently animating/sliding
//   tgt - target animating element
function hideSlideIfNotIn(e, animating, tgt)
{
  // dont hide if currently animating - let it finish
  if (animating)
    return;
  var pos = getEventPosition(e);
  var inside = false;
  for (var i = 2; !inside && i < arguments.length; i++) {
    inside = isIn(pos, arguments[i]);
  }
  if (!inside) {hide(tgt);}
}


function savesInlineLoginOnClickHandler(loggedInFn, loginFn, clickedElement)
{
	// disable any dhtml popup that might get in our way
	var dhtmlPopup = $('DHTMLPOPUP');
	if (dhtmlPopup != null)
	{
		dhtmlPopup.remove();
	}
	
    var loginFrame = $('loginframe');
    if (typeof(gUserLoggedIn) != 'undefined' && gUserLoggedIn) {
        if (loginFrame != null) {
      	     // need to bump it back down or else it intercepts clicks to the saves folder popup
             loginFrame.style.zIndex = 0;
        }
        loggedInFn();
    } else {
        loginFn();
        if (loginFrame != null) {
        	loginFrame.style.zIndex = 1000;
        }
        // set a global to be used by loginSuccess()
        SAVES_LI_ELEMENT = clickedElement;
    }
}

//
// Email a friend
//

function savesShowEmailFriend(dom)
{
    // Reset the state
    hideItem('emailConfirmationDiv');
    showItem('emailFormDiv');
    hideItem('emailErrorTo');
    hideItem('emailErrorFrom');
    hideItem('emailErrorGeneral');
    document.getElementById("emailTo").value = '';
    document.getElementById("emailName").value = '';
    document.getElementById("emailMsg").value = 'I wanted to share this trip I created on TripAdvisor' + dom + '.';

    var div = document.getElementById("savesEmailFriend");
    
    div.style.zIndex=1000; // pop it above maps
    div.style.left = emailFriendLeft();
    div.style.top = emailFriendTop();
    div.style.display = 'inline';
    
    $('emailFormDiv').style.cursor = "default";
}

function savesHideEmailFriend()
{
    hideItem("savesEmailFriend");
    $('savesEmailFriend').style.zIndex=0;
}

function emailFriendLeft() {
    var width = window.innerWidth ? window.innerWidth : document.body.offsetWidth;
    return (Math.max(5, (width / 2 - 175)) + 'px');
}

function emailFriendTop() {
    var top = window.innerHeight ? window.innerHeight : document.body.offsetHeight;
    var calc = Math.max(5, top / 2 + document.body.scrollTop - 200);
    return (calc + 'px');
}

function savesSendEmail(folderId)
{
    try {
        if (SAVES_RPC_LOCKED) { return }
        acquireRpcLock();
    
        $('emailFormDiv').style.cursor = "wait";
        params = new UrlParams();
        params.add('a', 'email');
        params.add('i', folderId);
        params.add('fn',  document.getElementById('rhs_fname').innerHTML);
    
        var form = document.getElementById("emailForm");
        for (var i = 0; i < form.elements.length; i++) {
            var element = form.elements[i];
            params.add(element.name, element.value);
        }
    
        var resFunc = function(req) {
            $('emailFormDiv').style.cursor = "default";
           
            if (req.responseText == null || req.responseText == '') {
                hideItem('emailFormDiv');
                showItem('emailConfirmationDiv');
            }
            else {
                errors = eval('(' + req.responseText + ')');
                if (errors['to']) {
                    showItem('emailErrorTo');
                    document.getElementById('emailErrorTo').innerHTML = errors['to'];
                } else {
                    hideItem('emailErrorTo');
                }
    
                if (errors['from']) {
                    showItem('emailErrorFrom');
                    document.getElementById('emailErrorFrom').innerHTML = errors['from'];
                } else {
                    hideItem('emailErrorFrom');
                }
                if (errors['msg']) {
                    showItem('emailErrorMsg');
                    document.getElementById('emailErrorMsg').innerHTML = errors['msg'];
                } else {
                    hideItem('emailErrorMsg');
                }
                if (errors['general']) {
                    showItem('emailErrorGeneral');
                    document.getElementById('emailErrorGeneral').innerHTML = errors['general'];
                } else {
                    hideItem('emailErrorGeneral');
                }
            }
        }
    
        var errFunc = function(req) {
            $('emailFormDiv').style.cursor = "default";
            rpcError(req);
        }
    
        var req = new HttpRpc('/SavesController', errFunc, resFunc, savesTabEndRpc);
        req.sendRequest(params.toString());
    }
    catch (e) {
        savesTabEndRpc();
        throw e;
    }
}

function adjustFolderCount(folderid, delta) {
    var found = null;
    if (SAVES_WIDGET_TREE.children != null) {
        for (var i=0; i<SAVES_WIDGET_TREE.children.length; i++) {
           var node = SAVES_WIDGET_TREE.children[i];
           if (node.folderid == folderid) {
               found = node;
               break
           } else if (node.children != null) {
               for (var k=0; k<node.children.length; k++) {
                   var n2 = node.children[k];
                   if (n2.folderid == folderid) {
                       found = n2;
                       break;
                   }
               }
           }
       }
    }

    if (found != null) {
        found.itemcount += delta;
        try  {
            $('FCNT' + folderid).innerHTML = '&#160;(' + found.itemcount + ')';
        } catch (e) {
            // Do nothing
        }              
    }
}

function escapeFolderTitle(title)
{
    title = title.replace(/&/g, '&amp;');
	title = title.replace(/\"/g, '&quot;');
    title = title.replace(/</g, '&lt;');
	title = title.replace(/>/g, '&gt;');
	return title;
}

function escapeJsVar(s) {
    s = s.replace(/\'/g, '\\\'');
    s = s.replace(/\n/g, '\\\n');
    s = s.replace(/\t/g, '\\\t');
    s = s.replace(/\r/g, '\\\r');
    return s;
}

function getSavesWidgetFolder(folder, action, currentFolder)
{
  var subFolderId = "subFolder" + folder.folderid;
  var isRecentFolder = folder.recent == true;
  var hadRecentFolder = isRecentFolder;
  var showSub = false;
  if (folder.children) {
    showSub = true;
  }

  var current = (folder.folderid == currentFolder);
  var onmouseover = "showSubFolder(\"" + subFolderId + "\", " + showSub + ")";

  var folderStyle = isRecentFolder ? "recentFolder" : "saveFolder";
  var linkStyle = folderStyle + 'Link';
  if (current) {
    folderStyle += " gray";
  }
        
  var oc = action + "('" + escapeJsVar(escapeFolderTitle(folder.name)) + "', " + folder.folderid + ");return false;";  
  var anchorContents = "<img src='"+openFolder+"' height='14' width='25' alt='FolderName'/>" + escapeFolderTitle(folder.name);
  if (isRecentFolder && folder.parent != null && folder.parent.folderid != 1) {
    // indent subfolders, and pass parent
    anchorContents = '<div class="subFolderIndent">' + anchorContents + '</div>';
    oc = action + "('" + escapeJsVar(escapeFolderTitle(folder.name)) + "', " + folder.folderid + "," + folder.parent.folderid + ");return false;";                    
  }

  var anchorTag = (current ? "" : "<a rel='nofollow' href='#' style='color:#000;' onclick=\"" + oc + "\">") + anchorContents + (current ? "": "</a>");
  
  var divMouseover = "";
  if (folder.parent != null && folder.parent.folderid != 1) {
  	divMouseover = "";
  }
  
  var html = "<div class='topFolder'><div "+ divMouseover + " class='nowrap " + folderStyle + "'>" + anchorTag + "</div>";

  if (folder.children && folder.children.length > 0) {
    html += "<div class='openSubFolder' onmouseover='" + onmouseover + "'><a rel='nofollow' href='#' style='color: #000;' onclick='return false'>v</a></div>";
  }
  html += "</div>";

  if (folder.children && folder.children.length > 0) {
    var showSubFolder = folder.clone && !folder.recent;
    html += "<div id='" + subFolderId + "'" + (!showSubFolder ? " style='display:none'" : "") + ">";

    for (var  i = 0; i < folder.children.length; i++) {
      child = folder.children[i];
      current = (child.folderid == currentFolder);
      var extraStyle = '';
      if (current) {
        extraStyle = ' gray';
      }

      oc = action + "('" + escapeJsVar(escapeFolderTitle(child.name)) + "', " + child.folderid + ", " + folder.folderid + ");return false;";
      var subStyle = child.recent ? "recentFolder" : "saveFolder";
      if (child.recent) {
        hadRecentFolder = true;
      }
      html += "<div class='nowrap " + subStyle + "'>";
      if (!current) {
        html += "<a rel='nofollow' href='#' style='color:#000;' onclick=\"" + oc + "\">";
      }
      html += "<div class='subFolderIndent" + extraStyle + "'>" +
        "<img src='"+save+"' height='14' width='25' alt='FolderName'/>" +
        escapeFolderTitle(child.name) + "</div>" + (current ? "" : "</a>") + "</div>";
    }

    html += "</div>";
  }
  if (hadRecentFolder) {
    html = '<div class="">' + html + "</div>";
  }
  return html;
}


function getWidgetCreateMenuItem(action)
{
        return "<div class='createFolder'>" +
    		"<a rel='nofollow' href='#' style='color:#000;' onclick='" + action + ";return false;'><img src='"+add+"' height='14' width='25' alt='New Folder'/>Create trip folder</a>" +
    		"</div>";
}

