var showElement = function(el) {
  if(el != null && el != undefined)
  {
    if (YAHOO.util.Dom.hasClass(el, 'vfhidden'))
    {
      YAHOO.util.Dom.removeClass(el,'vfhidden');
    }

    if (!YAHOO.util.Dom.hasClass(el, 'vfvisible'))
    {
      YAHOO.util.Dom.addClass(el,'vfvisible');
    }
  }
}

var hideElement = function(el) {
  if(el != null && el != undefined)
  {
    if (YAHOO.util.Dom.hasClass(el, 'vfvisible'))
    {
      YAHOO.util.Dom.removeClass(el,'vfvisible');
    }

    if (!YAHOO.util.Dom.hasClass(el, 'vfhidden'))
    {
      YAHOO.util.Dom.addClass(el,'vfhidden');
    }
  }
}


function replace(string, text, by)
{
  // Replaces text with by in string
  var strLength = string.length, txtLength = text.length;
  if ((strLength == 0) || (txtLength == 0)) return string;

  var i = string.indexOf(text);
  if ((!i) && (text != string.substring(0, txtLength))) return string;
  if (i == -1) return string;

  var newstr = string.substring(0, i) + by;

  if (i + txtLength < strLength)
    newstr += replace(string.substring(i + txtLength, strLength), text, by);

  return newstr;
}

// find the Left and Top of the Element
function cumulativeOffset(element)
{
  var valueT = 0, valueL = 0;
  do {
    valueT += element.offsetTop || 0;
    valueL += element.offsetLeft || 0;
    element = element.offsetParent;
  }
  while (element);
  return ({left:valueL, top:valueT});
}

function extractPostionValue(positionString)
{
  return(positionString.substring(0, positionString.indexOf("px")));
}

function isJsonResponseEmpty (response)
{
  if (!response) return false;
  if (response.responseText == "") return true;
  return false;
}

function getJsonObject (response)
{
  var jsonResponse = null;
  try
  {
    jsonResponse = "(" + response.responseText + ")";
    return eval(jsonResponse);
  }
  catch (e)
  {
    // this might happen during cases like 500 error, when eval method throws exception for invalid JSON response.
    alert("Unable to process your request, please try again.");
    return null;
  }
}

function getJsonObjectNoAlert (response)
{
  var jsonResponse = null;
  try
  {
    jsonResponse = "(" + response.responseText + ")";
    return eval(jsonResponse);
  }
  catch (e)
  {
    return null;
  }
}

function toggleVisibility (id)
{
  var el = YAHOO.util.Dom.get(id);
  if(el != null && el != undefined)
  {
    if (YAHOO.util.Dom.hasClass(el, 'vfhidden'))
    {
      YAHOO.util.Dom.removeClass(el,'vfhidden');
      YAHOO.util.Dom.addClass(el,'vfvisible');
      return;
    }
    else if (YAHOO.util.Dom.hasClass(el, 'vfvisible'))
    {
      YAHOO.util.Dom.removeClass(el,'vfvisible');
      YAHOO.util.Dom.addClass(el,'vfhidden');
      return;
    }

    YAHOO.util.Dom.addClass(el,'vfvisible');
  }
}

function closeOverlay()
{
  StaticOverlay.hideSelects('visible');
  document.getElementById('overlay').style.display = 'none';
  document.getElementById('window').style.display = 'none';
  document.getElementById('window').innerHTML = '';
  WindowModal.closeCalendar();
}

function walkParentElements ( obj, pClassName )
{
  if ( obj )
  {
    if ( obj.className != pClassName || !obj.className )
    {
      return walkParentElements(obj.parentNode,pClassName );
    }
  }
  return obj;
}

function walkParentElements( obj, pName, pType )
{
  if ( obj )
  {
    if ( pType == 'class' )
    {
      if ( obj.className != pName || !obj.className )
      {
        return this.walkParentElements(obj.parentNode,pName,pType );
      }
    }
    if ( pType == 'tag' )
    {
      if ( obj.tagName != pName || !obj.tagName )
      {
        return this.walkParentElements(obj.parentNode,pName,pType );
      }
    }
  }
  return obj;
}

function isCustomerLoggedIn()
{
  return csi;
}

function vfAsyncRequest(method, uri, callback)
{
  uri = appendRandomNumber(uri);
  uri = appendAsyncRequest(uri)
  var yahooConnection = YAHOO.util.Connect;

  // Event handler for Ajax requests
  var handleEvents =
  {
    // Invoked when Ajax request is complete, refer YUI API for details
    complete:function(eventType, args)
    {
      var responseText = args[0].conn.responseText;

      // Getting JSON details through indexOf and substring to improve performance
      // using eval twice for all responses will slowdown the response

      // Starting of sessionTimeout string is 2 points away from index of '{'
      var indexOfSessionTimeout = responseText.indexOf('{')+2;
      var sessionTimeout = "sessionTimeOut";
      // Check if sessionTimeout text exists in the response
      if(responseText.substring(indexOfSessionTimeout,(indexOfSessionTimeout+sessionTimeout.length)) == sessionTimeout)
      {
        alert("Your session has expired. Please log in again.");

        // get index of end brance to get the forward
        var indexOfEndBrace = responseText.indexOf('}');
        // get the text between sessionTimeout: and end brace
        var forward = responseText.substring(indexOfSessionTimeout+sessionTimeout.length+3,indexOfEndBrace-1);
        if(forward == null || forward == '') forward = "vincellar3";
        document.location.href="/do/security/login?forward="+forward;
      }
    }
	};

  // Subscribe to complete event
  yahooConnection.completeEvent.subscribe(handleEvents.complete, handleEvents);
  return yahooConnection.asyncRequest(method, uri, callback);
}

function appendAsyncRequest(uri)
{
  uri += "&asyncRequest=true";
  return uri;
}

function appendRandomNumber(uri)
{
  var number = Math.floor(Math.random() * 100000);
  if (uri.indexOf("?") > 0)
  {
    uri += "&random=" + number;
  }
  else
  {
    uri += "?random=" + number;
  }
  return uri;
}

function setGlobalMessageNode(message)
{
  var node = document.getElementById("global-messages");
  node.style.display = "block";
  while (node.hasChildNodes())
  {
    node.removeChild(node.firstChild);
  }
  node.appendChild(message)
}


// Object that provides generic dimming behavior
DynamicDimLayer = function ()
{
  this.topAdjust= 0;
  this.leftAdjust = 0;
  this.widthAdjust = 0;
  this.zIndex = null;
  this.disableScrollTop=false;
  this.hideSelects=false;

  this.dimMessageObj = new YAHOO.widget.Overlay ( "dimMessageContainer", { visible:false,width:"240px",zindex:930 } );
  this.dimMessageObj.render();
};

DynamicDimLayer.prototype =
{
  showPageDimEffect: function(message)
  {
    StaticOverlay.showPageDim();

    this.showMessage(message);
  },

  disableDimMessage: function()
  {
    this.dimMessageObj = null;
  },

  showMessage: function (message)
  {
    if (!this.dimMessageObj) return;

    // See if the user has scrolled, we
    // add this top layer.top.
    var scrollTop = YAHOO.util.Dom.getDocumentScrollTop();
    var scrollLeft = YAHOO.util.Dom.getDocumentScrollLeft();

    var width = Math.max(document.body.clientWidth, document.documentElement.clientWidth);

    this.dimMessageObj.moveTo((width/2)+scrollLeft-150,320+scrollTop);

    var dimMessageContent = YAHOO.util.Dom.get("dimMessageContent");

    var dimMessageContainer = YAHOO.util.Dom.get("dimMessageContainer");
    if (dimMessageContainer)
    {
      dimMessageContainer.innerHTML = dimMessageContent.innerHTML;
    }

    var dimMessage = YAHOO.util.Dom.get("dimMessage");
    if (!dimMessage) return;

    if (!message)
    {
      message = "Loading";
    }
    dimMessage.innerHTML = message+"...";

    shadow_configure("dimId");

    this.dimMessageObj.show();
  },

  hideMessage: function()
  {
    if (this.dimMessageObj) this.dimMessageObj.hide();
  },

  clearPageDimEffect: function()
  {
    this.hideMessage();
    StaticOverlay.hidePageDim();
  },

  /*
   * Shows transparent layer to apply a dim effect.
   * Element passed in is the area that needs to be dimmed, a table for example.
   */
  showDimEffect: function ( area )
  {
    var region 	= YAHOO.util.Dom.getRegion(area);
    if (!region)
    {
      var offset = cumulativeOffset(area);
      var t = offset.top;
      var r = offset.left + area.offsetWidth;
      var b = offset.top + area.offsetHeight;
      var l = offset.left;
      region = new YAHOO.util.Region(t, r, b, l);
    }
    var width 	= region.right - region.left;
    var height 	= region.bottom - region.top;

    // See if the user has scrolled, we
    // add this top layer.top. In IE we don't do this
    var scrollTop = YAHOO.util.Dom.getDocumentScrollTop();
    if (isIE)
    {
      scrollTop =0;
    }

    // Allow user to disable scroll top, this is useful
    // if user wants to dim fixed area regardless of an browser scrolling
    if (this.disableScrollTop)
    {
      scrollTop =0;
    }

    var body = document.getElementsByTagName('body')[0];
    if ( body )
    {
      var layer = document.createElement('div');
      layer.className 	= 'dim-layer';
      layer.style.width 	= (width+this.widthAdjust)+'px';
      var heightInt = (height-40)+this.topAdjust;
      if (heightInt > 0)
      {
        layer.style.height 	= heightInt+'px';
      }
      layer.style.top		= ((region.top+36+scrollTop)-this.topAdjust)+'px';
      layer.style.left	= (region.left-this.leftAdjust)+'px';
      if (this.zIndex)
      {
        layer.style.zIndex = this.zIndex;
      }

      // Show spinner image
      var pSpinner = document.createElement("p");
      var imgSpinner = document.createElement("img");
      var imgSrc = document.createAttribute("src");
      imgSrc.nodeValue = "/images/ajax-loading-spinner-big.gif";

      imgSpinner.setAttributeNode(imgSrc);

      pSpinner.appendChild(imgSpinner);
      layer.appendChild(pSpinner);

      body.appendChild(layer);
    }
  },


  // Clear the dim effect. Assumes it was set by calling the "showDimEffect" method
  clearDimEffect: function ()
  {
    var dimLayer = YAHOO.util.Dom.getElementsByClassName ( 'dim-layer', 'div' );
    if ( dimLayer && dimLayer[0] )
    {
      dimLayer[0].parentNode.removeChild ( dimLayer[0] );
    }
  },

  setOpacity : function(opacity)
  {
    var overlay = document.getElementById('overlay');
    if (isIE)
    {
      overlay.style.filter = "alpha(opacity=" + opacity*100 + ")"; // IE
    }
    else
    {
      overlay.style.opacity = opacity;
    }
  }
};

/**
  Generic page control handler.

  param: targContainerId - optional this will default to "tableContainer"
  param reqPostfix - optional, allows callers to append something to the GET request. This is useful
                     when there are multiple pagination on the same page and the Action needs to distinguish
                     between them.
  param pageCtrlId - optional, This is useful when there are multiple pagination on the same page and the js needs to
                     distinguish which pagecontrol need to be updated.
*/
PageControlHandler = function (targetComponent, targetAction, targetApplication, targContainerId, reqPostfix, pageCtrlId) {

  //AJAX call will go to '/do/{targetApplication}/{targetAction}
  //targetApplication defaults to "vincellar"

  this.action = targetAction;
  this.dimmer = new DynamicDimLayer();
  this.target = targetComponent;
  this.targetContainerId = "";
  this.requestPostfix = "";
  this.pageControlId = "";

  this.targetContainerId = (targContainerId == undefined) ? "tableContainer" : targContainerId;
  if (reqPostfix) this.requestPostfix = reqPostfix;
  if(pageCtrlId) this.pageControlId = pageCtrlId;
  this.application = (targetApplication == undefined) ? "vincellar" : targetApplication;
};

PageControlHandler.prototype = {

  bindOnClickForElement: function (element)
  {
    YAHOO.util.Event.purgeElement(element, false, "click");
    YAHOO.util.Event.addListener(element, "click", this.startRequest, this, true);
  },

  bindOnChangeForElement: function (element)
  {
    YAHOO.util.Event.addListener(element, "change", this.startRequest, this, true);
  },

  // pagerElements are a bunch of divs that contain the pager html
  bindElements: function (pagerElements)
  {
    for ( var i = 0; i < pagerElements.length; i++ )
		{
      var sels = pagerElements[i].getElementsByTagName('select');
      for ( var j = 0; j < sels.length; j++ )
      {
        if (sels[j].name == 'currentPageNumber')
        {
          this.bindOnChangeForElement(sels[j]);
        }
        else if (sels[j].name == 'resultsPerPage')
        {
          this.bindOnChangeForElement(sels[j]);
        }
      }

      var anchors = pagerElements[i].getElementsByTagName('a');
      for ( var j = 0; j < anchors.length; j++ )
      {
        if (!YAHOO.util.Dom.hasClass(anchors[j],"off"))
        {
          this.bindOnClickForElement(anchors[j]);
        }
      }
    }
  },

  handleSuccess:function(response)
  {
    var jsonObject=getJsonObject(response);
    if (!jsonObject) return;

    if (this.hideSelects)
    {
        StaticOverlay.hideSelects('visible');
    }

    if (this.target.dimmer)
    {
      this.target.dimmer.clearPageDimEffect();
    }
    else
    {
      this.dimmer.clearPageDimEffect();
    }

    /** Assumes that this pagination success function will not return any validation errors from server
     *  and if any error displayed before calling pagination then clear that.
     **/
    var errorMessage = YAHOO.util.Dom.get("errors");
    if (errorMessage) errorMessage.innerHTML = '';

    var cellarContainer = YAHOO.util.Dom.get(this.targetContainerId);
    cellarContainer.innerHTML = jsonObject.content;

    /**
     * Get pagecontroltop id. If the page contains more then one pagination we distinguish between them using pagecontrol id.
     * If its normal page use default id as a pagecontrol id.
     */
    var pageControlTopElementId = (this.pageControlId)? this.pageControlId+"pageControlTop" : "pageControlTop";
    var pageControlTop = YAHOO.util.Dom.get(pageControlTopElementId);
    if (pageControlTop) pageControlTop.innerHTML = jsonObject.pageControl;

    /**
     * Get pagecontrolbottom id. If the page contains more then one pagination we distinguish between them using pagecontrol id.
     * If its normal page use default id as a pagecontrol id.
     */
    var pageControlBottomElementId = (this.pageControlId)? this.pageControlId+"pageControlBottom" : "pageControlBottom";
    var pageControlBottom = YAHOO.util.Dom.get(pageControlBottomElementId);
    if (pageControlBottom) pageControlBottom.innerHTML = jsonObject.pageControl;

    var nowDisplayingDiv = YAHOO.util.Dom.get("nowDisplaying");
    if (nowDisplayingDiv) nowDisplayingDiv.innerHTML = jsonObject.nowDisplayingDiv;

    var nowDisplayingBottomDiv = YAHOO.util.Dom.get("nowDisplayingBottom");
    if (nowDisplayingBottomDiv) nowDisplayingBottomDiv.innerHTML = jsonObject.nowDisplayingDiv;

    // Reinitiliaze global object
    if (this.target.initNavigator) this.target.initNavigator();

    return false;
  },

  handleFailure:function(response)
  {
    this.dimmer.clearPageDimEffect();
    alert("The action failed.  Please reload the page to continue.");
  },

  startRequest:function(evt)
  {
    evt = evt ? evt : window.event;

    var srcEl = evt.target ? evt.target : evt.srcElement;
    var command = "";
    if (YAHOO.util.Dom.hasClass(srcEl, "next-btn"))
    {
      command = "viewState.pageInfo.direction=next";
    }
    else if (YAHOO.util.Dom.hasClass(srcEl, "prev-btn"))
    {
      command = "viewState.pageInfo.direction=previous";
    }
    else if (YAHOO.util.Dom.hasClass(srcEl, "first-btn"))
    {
      command = "viewState.pageInfo.currentPageNumber=1"
    }
    else if (YAHOO.util.Dom.hasClass(srcEl, "last-btn"))
    {
      command = "viewState.pageInfo.currentPageNumber=" + srcEl.id;
    }
    else if(YAHOO.util.Dom.hasClass(srcEl, "currentPage"))
    {
       command = "viewState.pageInfo.currentPageNumber=" + srcEl.innerHTML;
    }
    else if (srcEl.name == "currentPageNumber")
    {
      command = "viewState.pageInfo.currentPageNumber="+srcEl.value;
    }
    else if (srcEl.name == "resultsPerPage")
    {
      command = "viewState.pageInfo.resultsPerPage="+srcEl.value;
      command += "&viewState.pageInfo.currentPageNumber=1";

      if (isCustomerLoggedIn())
      {
        var customer = document.getElementById("customer");
        command += "&viewState.pageInfo.customerId=" + customer.value;
      }
    }

    //To Remove Score tip
    if(this.target.score && this.target.score.review)
    {
      close_score_hint();
    }
    
    if (this.hideSelects)
    {
        StaticOverlay.hideSelects('hidden');
    }
    if (this.target.dimmer)
    {
      this.target.dimmer.showPageDimEffect();
    }
    else
    {
      this.dimmer.showPageDimEffect();
    }

    var callback = {success:this.handleSuccess,failure:this.handleFailure, scope:this};
    vfAsyncRequest("GET", "/do/" + this.application + "/" + this.action + "?doAction=asyncPage&" + command+"&"+this.requestPostfix, callback);
  }
};

/**
  Generic sort handler.

  param: targContainerId - optional this will default to "tableContainer"
  param reqPostfix - optional, allows callers to append something to the GET request. This is useful
                     when there are multiple sorters on the same page and the Action needs to distinguish
                     between them.
  param pageCtrlId - optional, This is useful when there are multiple sorters on the same page and the js needs to
                     distinguish which pagecontrol need to be updated.
*/
SortHandler = function (targetComponent, targetAction, targContainerId, reqPostfix,targetApplication, pageCtrlId) {
  this.action = targetAction;
  this.dimmer = new DynamicDimLayer();
  this.target = targetComponent;
  this.targetContainerId = "";
  this.requestPostfix = "";
  this.application = "";
  this.pageControlId = "";

  this.targetContainerId = (targContainerId == undefined) ? "tableContainer" : targContainerId;
  if (reqPostfix) this.requestPostfix = reqPostfix;
  if(pageCtrlId) this.pageControlId = pageCtrlId;
  this.application = (targetApplication == undefined) ? "vincellar" : targetApplication;
};

SortHandler.prototype = {

  setApplication: function (application)
  {
    this.application = application;
  },

  initSort: function(tableEl, sortHandler, canChangeTextcolor)
  {
    if (canChangeTextcolor == undefined) canChangeTextcolor = true;
    csi = false;
    var tableElement = YAHOO.util.Dom.get(tableEl);

    if (tableElement)
    {
      var tr = tableElement.getElementsByTagName('tr')[0];

      //Set hover and wire up sort on table headers
      var th = tr.getElementsByTagName('th');
      sortHandler.bindElements(th);
      if (canChangeTextcolor)
      {
        for (var i = 0; i < th.length; i++)
        {
          if (th[i].firstChild && th[i].firstChild.tagName == 'A')
          {
            th[i].firstChild.style.color = "#FFFFFF";
          }
        }
      }
    }
  },

  bindElements: function (th)
  {
    for ( var k = 0; k < th.length; k++ )
    {
      if ( th[k].firstChild && th[k].firstChild.tagName == 'A' )
      {
        th[k].onclick = function()
				{
					return false;
				}

        th[k].onmouseover = function()
				{
					if ( ! YAHOO.util.Dom.hasClass( this, 'selected' ) )
						this.className = 'hover';
				}

				th[k].onmouseout = function()
				{
					if ( ! YAHOO.util.Dom.hasClass( this, 'selected' ) )
						this.className = '';
				}

        if( YAHOO.util.Dom.hasClass( th[k], 'selected' ))
				{
          this.setPointerPosition(th[k]);
				}

        for (var m =0; m < th[k].childNodes.length; m++)
        {
          if (th[k].childNodes[m].tagName == "A")
          {
            // Bind the element to the sort handler
            this.bindOnClickForElement(th[k].childNodes[m]);
          }
        }
      }
    }
  },

  bindOnClickForElement: function (element)
  {
    YAHOO.util.Event.purgeElement(element, false, "click");
    YAHOO.util.Event.addListener(element, "click", this.startRequest, this, true);
  },

  handleSuccess: function (response)
  {
    var jsonObject=getJsonObject(response);
    if (!jsonObject) return;

    if (this.target.dimmer)
    {
      this.target.dimmer.clearPageDimEffect();
    }
    else
    {
      this.dimmer.clearPageDimEffect();
    }

    /** Assumes that this sorting success function will not return any validation errors from server
     *  and if any error displayed before calling sorting then clear that.
     **/
    var errorMessage = YAHOO.util.Dom.get("errors");
    if (errorMessage) errorMessage.innerHTML = '';

    var cellarContainer = YAHOO.util.Dom.get(this.targetContainerId);
    cellarContainer.innerHTML = jsonObject.content;

    /**
     * Get pagecontroltop id. If the page contains more then one sorters we distinguish between them using pagecontrol id.
     * If its normal page use default id as a pagecontrol id.
     */
    var pageControlTopElementId = (this.pageControlId)? this.pageControlId+"pageControlTop" : "pageControlTop";
    var pageControlTop = YAHOO.util.Dom.get(pageControlTopElementId);
    if (pageControlTop) pageControlTop.innerHTML = jsonObject.pageControl;

    /**
     * Get pagecontrolbottom id. If the page contains more then one sorters we distinguish between them using pagecontrol id.
     * If its a normal page use default id as a pagecontrol id.
     */
    var pageControlBottomElementId = (this.pageControlId)? this.pageControlId+"pageControlBottom" : "pageControlBottom";
    var pageControlBottom = YAHOO.util.Dom.get(pageControlBottomElementId);
    if (pageControlBottom) pageControlBottom.innerHTML = jsonObject.pageControl;

    var nowDisplayingDiv = YAHOO.util.Dom.get("nowDisplaying");
    if (nowDisplayingDiv) nowDisplayingDiv.innerHTML = jsonObject.nowDisplayingDiv;

    // Reinitiliaze target object
    if (this.target.initNavigator) this.target.initNavigator();

    return false;
  },

  handleFailure: function(response)
  {
    this.dimmer.clearPageDimEffect();
    if (this.hideSelects)
    {
        StaticOverlay.hideSelects('hidden');
    }
    alert("sort failure");
  },

  startRequest: function ( evt )
  {
    evt = evt ? evt : window.event;
    var srcEl = evt.target ? evt.target : evt.srcElement;

    var srcA = false;
    if( srcEl.tagName == 'A' ) srcA = srcEl;
    var desc = false;
    if( srcA )
      if(YAHOO.util.Dom.hasClass( srcA, 'selected' ) && ! YAHOO.util.Dom.hasClass( srcA, 'desc' ))
      {
        desc = true;
      }
    while ( srcEl.tagName != 'TH' ) srcEl = srcEl.parentNode;
    var th = srcEl.parentNode.getElementsByTagName('th');
    for ( var k = 0; k < th.length; k++ )
    {
      th[k].className = '';
      var a = th[k].getElementsByTagName('a');
      for ( var i = 0; i < a.length; i++ )
      {
        a[i].className = '';
      }
    }

    var propertyName = encodeURIComponent(srcA.name);

    this.dimmer.showPageDimEffect();
    if (this.hideSelects)
    {
        StaticOverlay.hideSelects('hidden');
    }
    //To Remove Score tip
    if(this.target.score && this.target.score.review)
    {
      close_score_hint();
    }
    // Make AJAX call
    var sortCallback = {success:this.handleSuccess,failure:this.handleFailure,scope:this};

    var sortRequest = vfAsyncRequest("GET", "/do/"+this.application+"/"+this.action+"?doAction=asyncSort&viewState.sortInfo.property="+propertyName+"&"+this.requestPostfix, sortCallback);

    return false;
  },

  /*
	* Set the arrow over element if it is the currently sorted anchor
	*/
	setPointerPosition: function(th)
	{
		var a_selected = YAHOO.util.Dom.getElementsByClassName('selected', 'a', th);
    //alert(a_selected.length);
		if(a_selected.length > 0)
		{
			var a_region = YAHOO.util.Dom.getRegion(a_selected[0]);
			var th_x = YAHOO.util.Dom.getX( th );

			var valign = 'top';
			if(YAHOO.util.Dom.hasClass( a_selected[0], 'desc' ))
			{
				valign = 'bottom';
				YAHOO.util.Dom.addClass(th, 'desc' );
			}
			else
			{
				valign = 'top';
			}
      YAHOO.util.Dom.setStyle(th, 'backgroundPosition', parseInt( a_region.left - th_x - 4 + (a_region.right - a_region.left) / 2) + 'px ' + valign );
		}
	}
};
  // From legacy js codebase, displays Vinfolio's Terms popup
function showTerms(anchor, target)
{
  url = "/jsp/company/terms.jsp";
  if(anchor!=undefined) { url = url + "#" + anchor; }
  var tgt = "popup";
  if (target) tgt = target;
  legacyOpenPopup(url, 850, 710, tgt, true);
}

function legacyOpenPopup(url, width, height, name, scrollable) {
  var winWidth = width;
  var winHeight = height;
  // popup in screen center
  var winScreenX = (screen.availWidth - winWidth)/2;
  var winScreenY = (screen.availHeight - winHeight)/2;
  var canScroll  = ( scrollable ? "yes" : "no" );
  popup = window.open(url, name, 'scrollbars=' + canScroll + ',location=NO,resizable=YES,status=YES,width=' + winWidth +
                                   ',height=' + winHeight + ',screenX=' + winScreenX +
                                   ',screenY=' + winScreenY + ',left=' + winScreenX + ',top=' + winScreenY);
  popup.focus();
  return popup;
}

function logAnalytics(urlToTrack)
{
  if (typeof(urchinTracker) == "function")
  {
    urchinTracker(urlToTrack);
  }
}

// A helper method for displaying errors or messages in overlays (popups)
// within a "messageDiv" element. This returns the messageDiv of the overlay,
// so as not to conflict with any messageDiv on the parent page.
function getChildMessageDiv(overlayContainerDiv)
{
  var messageDiv;

  for(var i = 0; i < overlayContainerDiv.childNodes.length; i++)
  {
    if(overlayContainerDiv.childNodes[i].id == 'messageDiv')
    {
      messageDiv = overlayContainerDiv.childNodes[i];
      break;
    }
  }
  return messageDiv;
}
