window.onload=justloaded;

function cupgexc(index,setto)
{
  var rdsply=false;
  for (var i=0; i<algi[index].length; i++)
  {
    if (algi[index][i]<0) cbgrpSetAll(-algi[index][i],setto);
    else
    {
      var wrd=Math.floor(algi[index][i]/6);
      if (setto) cbstri[wrd] |= (1<<(algi[index][i]%6));
      else cbstri[wrd] &= ~(1<<(algi[index][i]%6));
    }
  }
  setDisplayFromCupboard();
  cupColor();
}


function openAllMenuForIng(index)
{
  for (var m=0;; m++)
    if (imenux[m]!=1) break;
    else if (cupmenu_exp[m]==1) closemenu(m);

  var mlist=[];
  var mli=0;
  var mi=-1;
  var ismenu=false;
  outerloop: for (var i=0; i<imenut.length; i++)
  {
    if (imenux[i]>7)
    {
      for (var ii=imenus[i]; ii<=imenue[i]; ii++)
      if (ingid[clst[ii]]==index){mi=i; break outerloop;}
    }
    if ((imenut[i]!=-1) && (index==ingid[imenut[i]])) {ismenu=true; mi=i; break outerloop;}
  }
  if (mi!=-1) {lastcindexm=mi; mi=getMasterMenu(mi);}
  while ((mi!=-1) && (cupmenu_exp[mi]==0)) {mlist[mli++]=mi; mi=getMasterMenu(mi);}// {mlist[mli++]=mi; mi=getMasterMenu(mi);}
  for (var i=mli-1; i>=0; i--) cupmenu(mlist[i]);

  if (cupfindm!=0)
  {
    if (!ismenu)
    {
      var wrd=Math.floor((index)/6);
      var setto=(cbstri[wrd]&(1<<(index%6)))==0;
      if ((cupfindm==1) && !setto) cbitem(index);
      if ((cupfindm==2) && setto) cbitem(index);
    }
    else
    {
      cbgrp(lastcindexm,cupfindm-1);
    }
  }

}

function getMasterMenu(index)
{
  for (var i=0; i<imenut.length; i++)
  if ((imenux[i]<=7) && (imenus[i]<=index) && (imenue[i]>=index)) return i;
  return -1;
}

function cupColor()
{
  if (!cupview) {document.getElementById("cupbfield").className='cuphide'; return;}
  for (var i=0; i<cbstrlen; i++)
    if (cbstri[i]!=cbstrisp[i])
    {
      document.getElementById("cupbfield").className='cupneedsave';
      document.getElementById("cubsave").disabled=false;
      document.getElementById("cubreset").disabled=false;
      return;
    }
  document.getElementById("cupbfield").className='cupnormal';
  document.getElementById("cubsave").disabled=true;
  document.getElementById("cubreset").disabled=true;
}

function cbgrp (index, forceto)
{
  var wrd=Math.floor((ingid[imenut[index]])/6);
  var setto=(cbstri[wrd]&(1<<(ingid[imenut[index]]%6)))==0;
  if (forceto==0) setto=false;
  if (forceto==1) setto=true;

  var tdiff=cbgrpSetAll(index,setto);
  if (imenux[index]>7)
  {
    var i=index+1;
    while ((i<imenux.length) && (imenux[i]==8)) {tdiff+=cbgrpSetAll(i,setto); i++;}
  }
  if (tdiff!=0)
    while ((index=getMasterMenu(index))>=0)
    {
      mentick[index]+=tdiff;
      mencross[index]-=tdiff;
      var newhtml="( ";
      if (mentick[index]>0)
      {
        newhtml+="<span class='cgreen'>" + mentick[index] + "</span>";
        if (mencross[index]>0) newhtml += " / ";
      }
      if (mencross[index]>0) newhtml+="<span class='cbrown'>" + mencross[index] + "</span>";
      document.getElementById("cmens"+index).innerHTML=newhtml + " )";
    }
  cupColor();
}

function cbgrpSetAll(index,setto)
{
  var tdiff=0;
  if (imenux[index]>7)
  {
      for (var i=imenus[index]; i<=imenue[index]; i++)
      {
        var td=document.getElementById("cbi"+ingid[clst[i]]);
        var wrd=Math.floor((ingid[clst[i]])/6);
        var needset= (cbstri[wrd]&(1<<(ingid[clst[i]]%6)))==0;
        if (setto & needset)
        {
          tdiff++;
          cbstri[wrd]+=1<<(ingid[clst[i]]%6);
          if (cupmenu_exp[index]==1)
          {
            td.innerHTML="&#x2713;";
            td.className="tick";
          }
        }
        else if ((!needset) & (!setto))
        {
          tdiff--;
          cbstri[wrd]-=1<<(ingid[clst[i]]%6);
          if (cupmenu_exp[index]==1)
          {
            td.innerHTML="x";
            td.className="cross";
          }
        }
      }
  }
  else for (var i=imenus[index]; i<=imenue[index]; i++) tdiff+=cbgrpSetAll(i,setto);
  
  if (imenut[index]!=-1)
  {
    var wrd=Math.floor((ingid[imenut[index]])/6);
    var td=document.getElementById("cbgrp"+index);
    var needset=(cbstri[wrd]&(1<<(ingid[imenut[index]]%6)))==0;

    if (setto & needset)
    {
      if (imenux[index]>7) tdiff++;
      cbstri[wrd]+=1<<(ingid[imenut[index]]%6);
      td.innerHTML="&#x2713;";
      td.className="tick";
    }
    else if ((!needset) & (!setto))
    {
      if (imenux[index]>7) tdiff--;
      cbstri[wrd]-=1<<(ingid[imenut[index]]%6);
      td.innerHTML="x";
      td.className="cross";
    }
  }
  if ((imenux[index]<=7) && (tdiff!=0))
  {
    mentick[index]+=tdiff;
    mencross[index]-=tdiff;
    var newhtml="( ";
    if (mentick[index]>0)
    {
      newhtml+="<span class='cgreen'>" + mentick[index] + "</span>";
      if (mencross[index]>0) newhtml += " / ";
    }
    if (mencross[index]>0) newhtml+="<span class='cbrown'>" + mencross[index] + "</span>";
    document.getElementById("cmens"+index).innerHTML=newhtml + " )";
  }
  return tdiff;
}

function cbitem (index)
{
  var tdiff=0;
  var td=document.getElementById("cbi"+index);
  var wrd=Math.floor((index)/6);
  if ((cbstri[wrd]&(1<<(index%6)))==0)
  {
    cbstri[wrd]+=1<<(index%6);
		td.innerHTML="&#x2713;";
    td.className="tick";
    tdiff=1;
  }
  else
  {
    cbstri[wrd]-=1<<(index%6);
    td.innerHTML="x";
    td.className="cross";
    tdiff=-1;
  }

  outerloop: for (var i=0; i<imenut.length; i++)
   if (imenux[i]>7)
     for (var ii=imenus[i]; ii<=imenue[i]; ii++)
       if (ingid[clst[ii]]==index) {index=i; break outerloop;}

    while ((index=getMasterMenu(index))>=0)
    {
      mentick[index]+=tdiff;
      mencross[index]-=tdiff;
      if (imenux[index]>7) continue;
      var newhtml="( ";
      if (mentick[index]>0)
      {
        newhtml+="<span class='cgreen'>" + mentick[index] + "</span>";
        if (mencross[index]>0) newhtml += " / ";
      }
      if (mencross[index]>0) newhtml+="<span class='cbrown'>" + mencross[index] + "</span>";
      document.getElementById("cmens"+index).innerHTML=newhtml + " )";
    }
  cupColor();
}

function cupmenu (index)
{
  if (cupmenu_exp[index]==0)
  {
    cupmenu_exp[index]=1;
    document.getElementById("cmenp"+index).innerHTML="-";
    for (var i=imenus[index]; i<=imenue[index]; i++)
    {
      if (imenux[i]>7)
      {
        cupmenu_exp[i]=1;
        var newhtml = "<table class='cupglist'>";
        var glen=imenue[i]-imenus[i]+1;
        var midp=Math.floor(glen/2);
        if ((glen%2)==1) midp++;
        glen=midp;
        midp+=imenus[i];
        for (var ii=imenus[i]; ii<midp; ii++)
        {
          var wrd=Math.floor((ingid[clst[ii]])/6);
          if ((cbstri[wrd]&(1<<(ingid[clst[ii]]%6)))!=0)
            newhtml +="<tr><td class='tick' id='cbi" + ingid[clst[ii]] + "'>&#x2713;</td>";
          else newhtml +="<tr><td class='cross' id='cbi" + ingid[clst[ii]] + "'>x</td>";
          newhtml +="<td class='ingred'><a id='cbing" + ingid[clst[ii]] + "' class='cbnorm' href='javascript:cbitem(" +
          ingid[clst[ii]] + ")'>" + getIngName(clst[ii]).replace(/'/g, "&#39;") + "</a>&nbsp;</td>";
          var otheri=ii+glen;
          if (otheri<=imenue[i])
          {
            wrd=Math.floor((ingid[clst[otheri]])/6);
            if ((cbstri[wrd]&(1<<(ingid[clst[otheri]]%6)))!=0)
              newhtml +="<td class='tick' id='cbi" + ingid[clst[otheri]] + "'>&#x2713;</td>";
            else newhtml +="<td class='cross' id='cbi" + ingid[clst[otheri]] + "'>x</td>";
            newhtml +="<td class='ingred'><a id='cbing" + ingid[clst[otheri]] + "' class='cbnorm' href='javascript:cbitem(" +
            ingid[clst[otheri]] + ")'>" + getIngName(clst[otheri]).replace(/'/g, "&#39;") + "</a>&nbsp;</td></tr>";
          }
          else newhtml +="<td></td></tr>";
        }
        newhtml +="</table>";
        document.getElementById("cbingl"+i).innerHTML=newhtml;
      }
      document.getElementById("cmen"+i).style.display="block";
    }
  }
  else closemenu(index);
}

function closemenu (index)
{
  if (cupmenu_exp[index]==1)
  {
    if (imenux[index]<=7)
    {
      for (var i=imenus[index]; i<=imenue[index]; i++)
      {
        document.getElementById("cmen"+i).style.display="none";
        if (cupmenu_exp[i]==1) closemenu(i);
      }
      document.getElementById("cmenp"+index).innerHTML="+";
    }
    else document.getElementById("cbingl"+index).innerHTML="";
    cupmenu_exp[index]=0;
  }
}

//all the rubbish about looking for & or &amp; is because firefox and internet explorer handle assigning window.location.href differently when there are &'s present 
function justloaded()
 {
	 for (var i=0; i<advert.length; i++) window.frames["advert" + i].location.replace(advert[i]);
	 loadWordData (aw); aw=null;
	 initIngredients (); ig=null;
   var trylogin=initFromCookie();
   var pa=window.location.href;

	 if ((pa!=null) && (pa.indexOf('&')<0))
	 { //look for pretty urls
	   var pg=1;
     var pgi=pa.indexOf("/page-");
     if (pgi>=0) pg=parseInt(pa.substring(pgi+6));
		 else pgi=pa.length;

     var ingexc="";
		 var diet=0;
     var dieti=pa.indexOf("/vegan/");
		 if (dieti>=0) {diet=2; dieti+=7;}
		 else if ((dieti=pa.indexOf("/vegetarian/"))>=0)
		 {diet=1; dieti+=12;}
		 else
		 {
       for (var xx=0; xx<algt.length; xx++)
			 {
				 var ingname=getIngName(algt[xx]);
				 var teststr="/"+ingname.substring(11)+"-free/";
		     if ((dieti=pa.indexOf(teststr))>=0)
		     {dieti+=teststr.length; ingexc="&exc="+ingname.replace(" ", "+"); break;}
       }
		 }

     var s1;
     if ((s1=pa.indexOf("recipe/"))>=0)
 	   {
			 var s2=s1+7;
			 if (dieti>=0) s2=dieti;
       pa=pa.substring(0,s1) + "?ttl=%2B" + pa.substring(s2,pgi).replace(/-/g, "+%2B") + ingexc + "&p=" + pg;
	   }
     else if ((s1=pa.indexOf("Recipes/"))>=0)
     {
  		 var tagi=-1;
			 var s2=s1+8;
			 if (dieti>=0) s2=dieti;
			 var tagstr=pa.substring(s2,pgi).replace(/-/g, " ");
			 for (var i=0; i<recipecathead.length; i++) if (tagstr==recipecathead[i]) {tagi=i; break;}
       if (tagi>0)
       pa=pa.substring(0,s1) + "?ttl=&g=" + recipecatid[tagi] + "&d=" + diet + ingexc + "&p=" + pg;
		 }
     else if ((s1=pa.indexOf("recipe-by-ingredient/"))>=0)
     {
  		 var tagi=-1;
			 var s2=s1+21;
			 if (dieti>=0) s2=dieti;
			 var inginc=pa.substring(s2,pgi).replace(/-/g, "+");
       pa=pa.substring(0,s1) + "?ttl=&inc=" + inginc + "&d=" + diet + ingexc + "&p=" + pg;
		 }
   }


   var i=pa.indexOf('?');
   if (i>=0)
   {
     if (pa.indexOf("&amp;")<0) window.location.href=pa.substring(0,i) + "#" + pa.substring(i+1).replace(/&/g, "&amp;");
     else window.location.href=pa.substring(0,i) + "#" + pa.substring(i+1);
     return;
   }

 
   newhtml="<p><span class='large'>Search  Recipes:</span> Search for keywords in the recipe title or ingredients that must be included in, or excluded from the " +
"ingredient list.</p><p><strong>Search Mode</strong> <a target='_top' href='/help/#mode'>(help?)</a>: &nbsp;&nbsp;&nbsp;&nbsp;<span id='smode'><span class='hlight'>Normal</span> / <a class='mchange' href='javascript:searchmode(1,true)'>By Ingredients At Hand</a></span></p>"+
"<table class='search'><tr><td colspan='2' class='srchtitle'>" + 
"<form name='titlef' onsubmit='return false' action='/'><strong>Title Keywords:</strong> <span id='titlehead'></span>&nbsp;<input name='ttl' type='text' size='40' value='' onChange='updateHashLocation(1,1)' onKeyDown='checkttlkey(event)' /></form></td></tr>" +
"<tr><td colspan='2'>&nbsp;</td></tr><tr><td colspan='2'><strong>Ingredients</strong>&nbsp;&nbsp;<span id='ingheader'></span></td></tr>" +
"<tr class='inglist'><td class='w250col'><span id='incheader'><strong>Must Include:</strong></span><br /><table><tr><td id='ingredients1'><table class='ingredbox'></table></td></tr></table>" +
"<form name='incf' onsubmit='return false' action='/'><input name='inc' type='text' autocomplete='off' size='20' onFocus='dropfocus(1)' onBlur='dropblur(1)' onKeyUp='dropkeyup(event,1)' onKeyDown='dropkeydown(event,1)' />" + 
"</form><table><tr><td id='ingdrop1'></td></tr></table></td><td class='w250col'><strong>Must Exclude:</strong><br />" +
"<table><tr><td id='ingredients2'><table class='ingredbox'></table></td></tr></table><form name='excf' onsubmit='return false' action='/'>" +
"<input name='exc' type='text' autocomplete='off' size='20' onFocus='dropfocus(2)' onBlur='dropblur(2)' onKeyUp='dropkeyup(event,2)' onKeyDown='dropkeydown(event,2)' />" +
"</form><table><tr><td id='ingdrop2'></td></table><table><tr><td id='allergens'></td></tr></table>";
newhtml+="</td></tr></table>" +
"<form name='emphf'><table id='emphasis' class='hide'><tr><td colspan='2' class='padtop'><input type='radio' name='e' value='0' onclick='updateHashLocation(1,0)' /><strong>Use most &#39;at hand&#39; items" +
"</strong> - may require many ingredients you have not listed.<br /><input type='radio' name='e' value='1' onclick='updateHashLocation(1,0)' /><strong>Balanced" +
  "</strong> - a good starting point.<br /><input type='radio' name='e' value='2' onclick='updateHashLocation(1,0)' /><strong>Use only &#39;at hand&#39; items</strong>" +
  " - you should not need any other ingredients, recipes will be simpler.<br /><br /></td></tr></table></form>"+
"<table class='search'><tr><td id='showsuggs'></td></tr></table>" +
"<table class='search'><tr><td colspan='2' class='padtop'><form name='dietf'><strong>Dietary Restrictions:</strong> " + 
"<input type='radio' name='d' value='0' onclick='updateHashLocation(1,0)'/>None &nbsp;&nbsp;<input type='radio' name='d' value='1' onclick='updateHashLocation(1,0)'/>Vegetarian &nbsp;&nbsp;<input type='radio' " +
" name='d' value='2' onclick='updateHashLocation(1,0)'/>Vegan&nbsp; <span id='mycupopt' class='hide'><input type='radio' name='d' value='3' onclick='updateHashLocation(1,0)'/>my&nbsp;Cupboard</span>";
newhtml += "</form></td></tr><tr></table><div class='logareal' id='cupboardarea'></div><table class='cupcont'><tr><td id='cupbfieldtd'><table class='cuphide' id='cupbfield'>" +
"</table></td></tr></table><br />" +
"</form><form name='catf'><table class='search'><tr><td class='w436'><strong>Search within:</strong> &nbsp;" +
"<select name='cat' onChange='updateHashLocation(1,0)'>";
  for (var i=0; i<recipecats.length; i++) newhtml += "<option>" + recipecats[i].replace(/ /g, "&nbsp;") + "</option>";
newhtml += "</select></td><td class='w200r'><input id='resetbut' type='button' value='Reset Search' class='resubsrch' onclick='resetpage()' disabled='disabled' /></td></tr></table>" +
"<br /></form>" +

"<br /><fieldset id='fresults' class='hide'><legend><strong><span id='fresultsl' class='cblack'>Search Results</span></strong></legend><br />" +
"<div id='results'></div></fieldset><table id='searchhelp' class='show'><tr><td id='searchhelptd'>" + searchHelp0 + "</td></tr></table><br /><br /><iframe id='resbuff' name='resbuff' onload='resultsLoaded()'></iframe>" +
"<iframe id='logbuff' name='logbuff' onload='loginfo()'></iframe>";
  
  document.getElementById("msp").innerHTML=newhtml;
  setUpCupboardDisplay();

  i=pa.indexOf('#');
  if (i>=0) pa=window.location.href.substring(i);
  else pa="";
  
  var pg=1;
  pa=pa.replace(/&amp;/g, "&"); 
  var x=pa.indexOf("&p=");
  if (x>=0)
  {
    x+=3;
    var x2=pa.indexOf("&",x); if (x2<0) x2=pa.length;
    pg=parseInt(pa.substring(x,x2));
  }
  setUpForHashLocation(pa);
  if (cuptype!=0) 
  {
    document.getElementById("mycupopt").className='show';
    document.dietf.d[3].checked=true;
  }
  else if (document.dietf.d[3].checked==true) document.dietf.d[0].checked=true;
  updateHashLocation(pg,0);

  if (trylogin)
  {
    logstate=4;
    window.frames["logbuff"].location.replace("login.php?&amp;m=2&amp;usn=" + logname + "&amp;pss=" + logpassw);
  }
}

function showcupboard()
{
  cupview=true;
  setUpCupboardDisplay();
}

function hidecupboard()
{
  cupview=false;
  setUpCupboardDisplay();
}

function loginc(orig)
{
 hidecupboard();
 savecancel();
 document.getElementById("cupboardarea").innerHTML=
   "<form name='logc'><table class='loginc'><tr><td class='w100'>&nbsp;Username</td><td><input name='usn' type='text' size='20' />&nbsp;</td></tr>" +
   "<tr><td class='w100'>&nbsp;Password</td><td><input name='pss' type='password' size='20' />&nbsp;</td></tr>" +
   "<tr><td class='w100'></td><td><input type='button' value='Login Account' onClick='javascript:logaccount()' />&nbsp;" +
   "<input type='button' value='Cancel' onClick='javascript:setUpCupboardDisplay()' /></td></tr><tr><td id='logfdbk' colspan='2'></td></tr></table></form>";
}

function myhtmlEncode (str)
{
  var retval = "";
  for (var i=0; i<str.length; i++)
  {
    var c = str.charAt(i);
    if ((c < '0') || (c > 'z') || ((c>'9') && (c<'A')) || ((c>'Z') && (c<'a')))
    c = "&#" + str.charCodeAt(i) + ";";
    retval+=c;
  }
  return retval;
}

function myhtmlDecode (str)
{
  var retval = "";
  for (var i=0; i<str.length; i++)
  {
    if (str.charAt(i)=='&')
    {
      i++;
      if ((i<str.length) && (str.charAt(i)=='#'))
      {
        i++;
        var y=i;
        while ((y<str.length) && (str.charAt(y)!=';')) y++;
        retval+=String.fromCharCode(parseInt(str.substring(i,y)));
        i=y;
      }
    }
  else retval+=str.charAt(i);
  }
  return retval;
}

function logaccount()
{
  lognamed=document.logc.usn.value.replace(/^\s+|\s+$/g,"");
  if (lognamed.length==0) {document.getElementById("logfdbk").innerHTML="&nbsp;<span class='errtxt'>Please enter a valid username<span>"; return;}
  logname=encodeURIComponent(lognamed).replace(/\'/g, "%27");
  lognamed=myhtmlEncode(lognamed);
  logpasswd=document.logc.pss.value.replace(/^\s+|\s+$/g,"");
  if (logpasswd.length==0) {document.getElementById("logfdbk").innerHTML="&nbsp;<span class='errtxt'>Please enter a valid password<span>"; return;}
  logpassw=encodeURIComponent(logpasswd).replace(/\'/g, "%27");
  logpasswd=myhtmlEncode(logpasswd);

  document.getElementById("logfdbk").innerHTML="&nbsp;Logging In...";
  logstate=2;
  window.frames["logbuff"].location.replace("login.php?&amp;m=2&amp;usn=" + logname + "&amp;pss=" + logpassw);
}

function setUpCupboardDisplay()
{
  if (!cupview)
  {
    if (cuptype==0)
    {
      document.getElementById("cupboardarea").innerHTML=
       "<table class='search'><tr><td class='w400'>Create new <a class='redul' href='javascript:showcupboard()'>Diet Profile/Store Cupboard</a></td><td class='w232r'><a class='redul' href='javascript:loginc(1)'>Login</a></td></tr></table>";
    }
    else
    {
      var newhtml="<table class='search'><tr><td class='w400'>Show my <a class='redul' href='javascript:showcupboard()'>Diet Profile/Store Cupboard</a></td><td class='w232r'>";
      if (cuptype==1) newhtml+="<a class='redul' href='javascript:loginc(1)'>Login</a></td></tr></table>";
      else newhtml+="<a href='javascript:logout()'>Log out (" + lognamed + ")</a></td></tr></table>";
      document.getElementById("cupboardarea").innerHTML=newhtml;
    }
    cupColor();
  }
  else
  {
    if ((cuptype==0) || (cuptype==1))
    {
      document.getElementById("cupboardarea").innerHTML=
       "<table class='search'><tr><td class='w400'>&nbsp;</td><td class='w232r'><a class='redul' href='javascript:loginc(1)'>Login</a></td></tr></table>";
    }
    else document.getElementById("cupboardarea").innerHTML=
       "<table class='search'><tr><td class='w400'>&nbsp;</td><td class='w232r'><a href='javascript:logout()'>Log out (" + lognamed + ")</a></td></tr></table>";

    if (!cupviewi)
    {
var newhtml="<table class='cuphide' id='cupbfield'><tr><td colspan='4' class='hidebs'><a class='hideb' href='javascript:hidecupboard()'>HIDE</a>&nbsp;</td></tr><tr><td colspan='4'><table class='topm10'><tr><td class='w110p55' id='cupfinding'><strong>Find&nbsp;Ingredient:</strong> </td><td class='w200' id='findertext'>" +
"<form name='cubf' onsubmit='return false' action='/'><input class='cupfind' name='find' type='text' autocomplete='off' size='20' onFocus='dropfocus(3)' onBlur='dropblur(3)' onKeyUp='dropkeyup(event,3)' onKeyDown='dropkeydown(event,3)' /></form>" +
"</td><td class='w150'>&nbsp;<a href='javascript:togglecup()'>mode</a>&nbsp;&nbsp;<a target='_top' href='/help/#cupboard'>(Help?)</a></td><td class='w112'></td></tr><tr><td></td><td><table><tr><td class='pl10' id='ingdrop3'></td></tr></table>" +
"</td><td></td><td></td></tr><tr><td colspan='4'><br /><div id='searchinfopane'><form name='cupboard' onSubmit='return false'><table><tr><td class='w636'>";

for (var i=0; i<imenuo.length; i++)
{
  cupmenu_exp[i]=0;
  if (imenux[imenuo[i]]>7)
  {
    newhtml += "<table id='cmen" + imenuo[i] + "' class='cuplist' >";
    if (imenut[imenuo[i]]==-1) {}
    else
      newhtml += "<tr><td class='tick' id='cbgrp" + imenuo[i] + "'>&#x2713;</td><td class='ingredb'><a id='cbing" + ingid[imenut[imenuo[i]]] + "' class='cbnorm' href='javascript:cbgrp(" + imenuo[i] + ",-1)'>" +
       getIngName(imenut[imenuo[i]]).replace(/'/g, "&#39;") + "</a>&nbsp;</td></tr>";
    newhtml +="<tr><td colspan='2'  id='cbingl" + imenuo[i] + "'></td></tr></table>";
  }
  else
  {
    newhtml += "<table id='cmen" + imenuo[i] + "' class='inglev" + imenux[imenuo[i]] +
      "'><td class='plusc'><a id='cmenp" + imenuo[i] + "'  href='javascript:cupmenu(" + imenuo[i] + ")'>+</a></td>" +
      "<td class='tick' id='cbgrp" + imenuo[i] + "'>&#x2713;</td><td class='ingredh'><a id='cbing" + ingid[imenut[imenuo[i]]] + "' class='cbuline' href='javascript:cbgrp(" +
      imenuo[i] + ",-1)'>" + getIngName(imenut[imenuo[i]]).replace(/'/g, "&#39;") + "</a> &nbsp; <span class='cnums' id='cmens" + imenuo[i] + "'></span></td></table>";
  }
}

newhtml += "<table class='cupallgn'><tr><td>exclude ingredients containing: ";
for (var xx=0; xx<algt.length; xx++)
  newhtml+="<span class='sameline'>&nbsp;<a class='blckbld' href='javascript:cupgexc(" + xx + ",false)'>"+getIngName(algt[xx]).replace(/'/g, "&#39;").substring(11) + "</a>&nbsp;</span> ";

newhtml += "</td></tr></table></td></tr></table></form><table class='browsettl'><tr><td id='saveopt'><table><tr><td><br /></td><td></td></tr><tr>" + saveCS() +
           "</tr></table></td></tr></table></div></td></tr></table></td></tr><tr><td colspan='4' class='hidebsright'>&nbsp;<a class='hideb' href='javascript:hidecupboard()'>HIDE</a></td></tr></table>";


      document.getElementById("cupbfieldtd").innerHTML=newhtml;
      cupviewi=true;
      setDisplayFromCupboard();
    }
    cupColor();
  }
}

function togglecup()
{
  cupfindm++;
  if (cupfindm>2) cupfindm=0;
  if (cupfindm==0) document.getElementById("cupfinding").innerHTML="<strong>Find&nbsp;Ingredient:</strong> ";
  else if (cupfindm==1) document.getElementById("cupfinding").innerHTML="<strong>Exclude&nbsp;Ingredient:</strong> ";
  else document.getElementById("cupfinding").innerHTML="<strong>Accept&nbsp;Ingredient:</strong> ";
}

function logout()
{
  logstate=0;
  logname="";
  lognamed="";
  logpasswd="";
  logpassw="";
  cuptype=0;
  cupview=false;
  setSessionCookie("loginfo","");
  setUpCupboardDisplay();
  document.getElementById("mycupopt").className='hide';
  if (document.dietf.d[3].checked==true)
  {
    document.dietf.d[0].checked=true;
    updateHashLocation(1,0);
  }
}

function setDisplayFromCupboard()
{
  var nt=[0,0,0];
  var nc=[0,0,0];
  var mp=[0,0,0];
  var lastmlevel=0;
  for (var indexo=0; indexo<imenuo.length; indexo++)
  {
    var index=imenuo[indexo];

    if (imenux[index]<=7)
    {
      for (var i=imenux[index]-1; i<mp.length; i++)
        if ((nt[i]>0)||(nc[i]>0))
          {
            mentick[mp[i]]=nt[i];
            mencross[mp[i]]=nc[i];
            var newhtml="( ";
            if (nt[i]>0)
            {
              newhtml+="<span class='cgreen'>" + nt[i] + "</span>";
              if (nc[i]>0) newhtml += " / ";
            }
            if (nc[i]>0) newhtml+="<span class='cbrown'>" + nc[i] + "</span>";
            document.getElementById("cmens"+mp[i]).innerHTML=newhtml + " )";
            nc[i]=0; nt[i]=0;
          }
      mp[imenux[index]-1]=index;
      lastmlevel=imenux[index]-1;
    }


    if (imenut[index]!=-1)
    {
      var td=document.getElementById("cbgrp"+index);
      var wrd=Math.floor((ingid[imenut[index]])/6);
      if ((cbstri[wrd]&(1<<(ingid[imenut[index]]%6)))!=0)
      {
        td.innerHTML="&#x2713;";
        td.className="tick";
        if (imenux[index]>7) for (var i=lastmlevel; i>=0; i--) nt[i]++;
      }
      else
      {
        td.innerHTML="x";
        td.className="cross";
        if (imenux[index]>7) for (var i=lastmlevel; i>=0; i--) nc[i]++;
      }
    }
    if (imenux[index]>7)
    {
      var ntt=0;
      var ncc=0;
      for (var i=imenus[index]; i<=imenue[index]; i++)
      {
        var td=document.getElementById("cbi"+ingid[clst[i]]);
        var wrd=Math.floor((ingid[clst[i]])/6);
        if ((cbstri[wrd]&(1<<(ingid[clst[i]]%6)))!=0)
        {
          if (cupmenu_exp[index]==1)
          {
            td.innerHTML="&#x2713;";
            td.className="tick";
          }
          ntt++;
        }
        else
        {
          if (cupmenu_exp[index]==1)
          {
            td.innerHTML="x";
            td.className="cross";
          }
          ncc++;
        }
      }
      for (var i=lastmlevel; i>=0; i--) {nc[i]+=ncc; nt[i]+=ntt;}
    }
  }
  for (var i=0; i<mp.length; i++)
    if ((nt[i]>0)||(nc[i]>0))
    {
      mentick[mp[i]]=nt[i];
      mencross[mp[i]]=nc[i];
      var newhtml="( ";
      if (nt[i]>0)
      {
        newhtml+="<span class='cgreen'>" + nt[i] + "</span>";
        if (nc[i]>0) newhtml += " / ";
      }
      if (nc[i]>0) newhtml+="<span class='cbrown'>" + nc[i] + "</span>";
      document.getElementById("cmens"+mp[i]).innerHTML=newhtml+" )";
    }
}

function setCheckBoxesFromSaved()
{
  for (var i=0; i<cbstrlen; i++)
    cbstri[i]=cbstrisp[i];
  setDisplayFromCupboard();
  cupColor();
}

function savecancel()
{
  if (!cupviewi) return;
  document.getElementById("saveopt").innerHTML="<table><tr><td><br /></td><td></td></tr><tr>" + saveCS() + "</tr></table>";
  cupColor();
}

function initFromCookie()
{
  cbstrlen=Math.floor((ingid[zp-1]-1)/6) + 1;
  for (var i=0; i<cbstrlen; i++)
    cbstri[i]=63;
  for (var i=0; i<cbstrlen; i++)
      cbstrisp[i]=cbstri[i];
  for (var i=0; i<imenut.length; i++) {mentick[i]=0; mencross[i]=0;}

  var cookval=getCookie("loginfo");
  if ((cookval!=null) && (cookval.length!=0))
  {
    var s1=cookval.indexOf(')');
    lognamed=cookval.substring(0,s1).replace(/\(/g, ";");
    logpasswd=cookval.substring(s1+1).replace(/\(/g, ";");
    logname= encodeURIComponent(myhtmlDecode(lognamed)).replace(/\'/g, "%27");
    logpassw= encodeURIComponent(myhtmlDecode(logpasswd)).replace(/\'/g, "%27");
    return true;
  }

  cookval=getCookie("cupboard");
  if ((cookval==null) || (cookval.length==0))
    cuptype=0;
  else
  {
    var s1=cookval.indexOf(',')+1;
    var ckgood=loadCupboard(cookval.substring(s1));

    if (ckgood) 
    {
      cuptype=1;
    }
    else
      for (var i=0; i<cbstrlen; i++)
        cbstri[i]=63; //fill cupboard if there is a cookie fault
    for (var i=0; i<cbstrlen; i++)
      cbstrisp[i]=cbstri[i];
  }
  return false;

}

function loadCupboard (cookval)
{
  for (var i=0; i<cookval.length; i++)
  {
    if (cookval.charAt(i)=='!') return (i==cbstri.length);
    if (i>=cbstri.length) return false;

    var ww=cookval.charCodeAt(i);
    if (ww>96) ww-=59;
    else if (ww>64) ww-=53;
    else if (ww>47) ww-=46;
    else ww-=40;
    if ((ww<0) || (ww>63)) return false;
//document.write(i + ":" + ww + " - ");
    cbstri[i]=ww;
  }
  return false;
}

function savecookie(clearpane)
{
  //save cookie
  var cupboardS=versionN + ",";
  for (var i=0; i<cbstri.length; i++) cupboardS += cbCoder[cbstri[i]];
  cupboardS +='!';
  setCookie("cupboard",cupboardS,3650);
  var cupbcook=getCookie("cupboard");
  if ((cupbcook==null) || (cupbcook.length==0))
  {
    cuptype=0;
    var newhtml="<table><tr><td><br /><p><span class='errtxt'>Sorry, but we failed to save your diet/cupboard to a cookie on your computer.</span></p><p>You may need to " +
        "enable cookies via your browsers privacy settings. Alternatively create an account to save your diet/cupboard.</p></td></tr>" +
        "<tr><td>" +
        "<input type='button' class='cubnormb' value='Save Local (cookie)' onClick='javascript:savecookie(true)' />" +
        "<input type='button' class='cubnormb' value='Create Account' onClick='javascript:createaccount(0)' />" +
        "<input type='button' class='cubnormb' value='Log In' onClick='javascript:loginc(2)' />" +
        "<input type='button' class='cubnormb' value='Cancel' onClick='javascript:savecancel()' />" +
        "</td></tr></table>";
    document.getElementById("saveopt").innerHTML=newhtml;
  }
  else 
  {
    cuptype=1;
    document.getElementById("mycupopt").className='show';
    document.dietf.d[3].checked=true;
  }
  for (var i=0; i<cbstrlen; i++)
    cbstrisp[i]=cbstri[i];
  savecancel();
  updateHashLocation(1,0);
}

function saveaccount()
{
  var cupboardS=versionN + ",";
  for (var i=0; i<cbstri.length; i++) cupboardS += cbCoder[cbstri[i]];
  cupboardS +='!';
  logstate=3;
  window.frames["logbuff"].location.replace("login.php?&amp;m=1&amp;k=" + cupboardS + "&amp;usn=" + logname + "&amp;pss=" + logpassw);
}

function createaccount(cstate)
{
    var newhtml="<table><tr><td><br /><br /><form name='createacc'><table class='browsettl'><tr><td class='w150'>Username (email?)</td><td class='w150'><input name='usn' type='text' size='25' /></td><td class='w300'></td></tr>" +
                "<tr><td class='w150'>Password</td><td><input name='pss' type='password' size='25' /></td><td></td></tr>" +
                "<tr><td class='w150'>Confirm Password&nbsp;&nbsp;</td><td><input name='psc' type='password' size='25' /></td><td></td></tr>" +
                "<tr><td class='w150'></td><td><input type='button' value='Create Account' onClick='javascript:subaccount()' />" +
                "<input type='button' value='Cancel' onClick='javascript:savecancel()' /></td><td></td></tr>" +
                "<tr><td colspan='3' id='accfdbk'><br />We recommend using your email address as your username, this will allow us to email you your password if you forget it. You can however, use what ever username you would like.</td></tr>";
    newhtml+= "</table></form></td></tr></table>";
    document.getElementById("saveopt").innerHTML=newhtml;
}
  
function subaccount()
{
  lognamed=document.createacc.usn.value.replace(/^\s+|\s+$/g,"");
  if (lognamed.length==0) {document.getElementById("accfdbk").innerHTML="<br /><span class='errtxt'>Please enter a valid username<span>"; return;}
  logname=encodeURIComponent(lognamed).replace(/\'/g, "%27");
  lognamed=myhtmlEncode(lognamed);
  logpasswd=document.createacc.pss.value.replace(/^\s+|\s+$/g,"");
  var psc=document.createacc.psc.value.replace(/^\s+|\s+$/g,"");
  if (logpasswd.length==0) {document.getElementById("accfdbk").innerHTML="<br /><span class='errtxt'>Please enter a valid password<span>"; return;}
  if (psc.length==0) {document.getElementById("accfdbk").innerHTML="<br /><span class='errtxt'>Please enter your password in the password confirm box<span>"; return;}
  logpassw=encodeURIComponent(logpasswd).replace(/\'/g, "%27");
  logpasswd=myhtmlEncode(logpasswd);
  psc=encodeURIComponent(psc).replace(/\'/g, "%27");
  if (logpassw!=psc)
  {
    document.getElementById("accfdbk").innerHTML="<br /><span class='errtxt'>Please re-enter your passwords, your password and password confirm entries did not match<span>";
    document.createacc.pss.value="";
    document.createacc.psc.value="";
    return;
  }
  var cupboardS=versionN + ",";
  for (var i=0; i<cbstri.length; i++) cupboardS += cbCoder[cbstri[i]];
  cupboardS +='!';
  document.getElementById("accfdbk").innerHTML="<br />Creating Account...";
  logstate=1;
  window.frames["logbuff"].location.replace("login.php?&amp;m=0&amp;k=" + cupboardS + "&amp;usn=" + logname + "&amp;pss=" + logpassw);
}

function loginfo()
{
  var intxt=window.frames["logbuff"].document.body.innerHTML;
  var i1=intxt.indexOf(':');
  var retcode=-1;
  if (i1>0) retcode= parseInt(intxt.substring(0,i1));
	else if (intxt.indexOf("//blank//")>=0) return;

  if (logstate==1)
  {
    if (retcode==0)
    {
      cuptype=2;
      document.getElementById("saveopt").innerHTML="<table><tr><td><br /></td><td></td></tr><tr>" + saveCS() + "</tr></table>";
      for (var i=0; i<cbstrlen; i++)
        cbstrisp[i]=cbstri[i];
      document.getElementById("mycupopt").className='show';
      document.dietf.d[3].checked=true;

      setSessionCookie("loginfo", lognamed.replace(/;/g, "(") + ")" + logpasswd.replace(/;/g, "("));
      setUpCupboardDisplay();
      updateHashLocation(1,0);
    }
    else if (retcode==10)
      document.getElementById("accfdbk").innerHTML="<br /><span class='errtxt'>Sorry, but our database is currently unavailable, please try again.<span>";
    else if (retcode==11)
      document.getElementById("accfdbk").innerHTML="<br /><span class='errtxt'>Sorry, but this username is already in use. If this is an account you set up before, please login instead.<span>";
    else
      document.getElementById("accfdbk").innerHTML="<br /><span class='errtxt'>Sorry, but we could not set up your account due to an unknown error. Please try again later.<span>";
  }
  else if (logstate==2)
  {
    if (retcode==0)
    {
      loadCupboard (intxt.substring(i1+1));

      var s1=intxt.indexOf(',')+1;
      var ckgood=loadCupboard(intxt.substring(s1));
      cuptype=2;
      for (var i=0; i<cbstrlen; i++)
        cbstrisp[i]=cbstri[i];
      setSessionCookie("loginfo", lognamed.replace(/;/g, "(") + ")" + logpasswd.replace(/;/g, "("));
      document.getElementById("cupboardarea").innerHTML="";
      if (cupviewi) setDisplayFromCupboard();
      //set up session and cupboard type
      setUpCupboardDisplay();
      savecancel();
      document.dietf.d[3].checked=true;
      document.getElementById("mycupopt").className='show';
      updateHashLocation(1,0);
    }
    else if (retcode==13)
      document.getElementById("logfdbk").innerHTML="&nbsp;<span class='errtxt'>Sorry, but we have no record of this username. Please try again.<span>";
    else if (retcode==12)
      document.getElementById("logfdbk").innerHTML="&nbsp;<span class='errtxt'>Sorry, but the password does not match our records for this username. Please try again.<span>";
    else
      document.getElementById("logfdbk").innerHTML="&nbsp;<span class='errtxt'>Sorry, but we could not retrieve your account information due to an unknown error. Please try again.<span>";
  }
  else if (logstate==3)
  {
    if (retcode==0)
    {
      document.getElementById("saveopt").innerHTML="<table><tr><td><br /></td><td></td></tr><tr>" + saveCS() + "</tr></table>";
      for (var i=0; i<cbstrlen; i++)
        cbstrisp[i]=cbstri[i];
    }
    else
      document.getElementById("saveopt").innerHTML="<table><tr><td><br /></td><td></td></tr><tr>" + saveCS() + "</tr><tr><td colpsan='2'><br />&nbsp;<span class='errtxt'>Sorry, but we can not save your diet/cupboard at this time. Please try again later.<span></td></tr></table>";
    updateHashLocation(1,0); //load new results even if couldn't save the cupboard
  }
  else if (logstate==4)
  {
    if (retcode==0)
    {
      loadCupboard (intxt.substring(i1+1));
      var s1=intxt.indexOf(',')+1;
      var ckgood=loadCupboard(intxt.substring(s1));
      cuptype=2;
      for (var i=0; i<cbstrlen; i++)
        cbstrisp[i]=cbstri[i];
      if (cupviewi) setDisplayFromCupboard();
      //set up session and cupboard type
      if (diet==0) document.dietf.d[3].checked=true; //only do this if diet is 0, since we might be browsing something
      setUpCupboardDisplay();
      savecancel();
      document.getElementById("mycupopt").className='show';
      updateHashLocation(1,0);
    }
  }
  cupColor();
}

function saveCupboard ()
{
  if (cuptype==0)
  {
    var newhtml="<table><tr><td><br /><p>We recommend you create an account to save your diet profile/store cupboard.</p><p>Alternatively you " +
        "can save the data locally on your computer (using a cookie). If you use the save local option " +
        "it is possible that you or a security program that runs on your computer might delete the cookie and loose " +
        "your diet/cupboard.</p><br></td></tr>" +
        "<tr><td>" +
        "<input type='button' class='cubnormb' value='Save Local (cookie)' onClick='javascript:savecookie(true)' />" +
        "<input type='button' class='cubnormb' value='Create Account' onClick='javascript:createaccount(0)' />" +
        "<input type='button' class='cubnormb' value='Log In' onClick='javascript:loginc(2)' />" +
        "<input type='button' class='cubnormb' value='Cancel' onClick='javascript:savecancel()' />" +
        "</td></tr></table>";


    document.getElementById("saveopt").innerHTML=newhtml;
  }
  else if (cuptype==1) savecookie();
  else if (cuptype==2) saveaccount();
}


function resultsLoaded()
{
  if (hideResults==true)
  {
    document.getElementById("searchhelp").className="show";
    document.getElementById("results").innerHTML="";
    document.getElementById("fresults").className="hide";
    document.getElementById("resetbut").disabled=true;
    suggstring=";";
    displaySuggs(-1,-1);
  }
  else
  {

    var temp=window.frames["resbuff"].document.body.innerHTML;
    var s1=0; var s2=0;
    var show=""; var pic=false;

    while (s1<temp.length)
    {
      s2=s1;
      s1=temp.indexOf("///qzq///",s1);
      if (s1<0) {show += temp.substring(s2); break;}
      show += temp.substring(s2,s1);
      if (temp.charAt(s1+9)=='s') pic=false;
			else pic=true;
      s1+=10;
      s2=temp.indexOf("///qzq///",s1);
      if (s2<0) {show += temp.substring(s1-10); break;}
      if (pic) 
			{
				var s3=temp.indexOf(":",s1);
        show += "<img class='rcppic' align='top' alt='recipe' width='" + temp.substring(s1,s3) + "' height='";
        s1=s3+1;
				s3=temp.indexOf(":",s1);
        show += temp.substring(s1,s3) + "' src='" + temp.substring(s3+1,s2) + "' />";
				//show += temp.substring(s1,s2);
			}
			else show += getIngsFromNums(temp.substring(s1,s2));
      s1=s2+10;
    }

    document.getElementById("results").innerHTML=show;


    document.getElementById("fresults").className="normal";
    document.getElementById("fresultsl").innerHTML="Search Results";
    document.getElementById("fresultsl").className="cblack";
    if (resultTitle!=null) document.getElementById("resheader").innerHTML="<span class='luline'>" + resultTitle + "Recipes</span>&#160; &#160; &#160; &#160;<br /><br />";

    var suggs=document.getElementById("suggs");
    if (suggs!=null) 
    {
      suggstring=suggs.innerHTML;
      displaySuggs(-1,-1);
    }
    if (skipid!=-1) {scrollToID("r"+ skipid,0); skipid=-1;}
    document.getElementById("searchhelp").className="hide";
    document.getElementById("resetbut").disabled=false;


		if (jumpOnLoad) 
		{
      var h=browserHeight();
			scrollToIDadv2("bottompage",-100);
		}
  }
}

function moveToExc (index, ingin)
{
  var temp=[];
  var ind=0;
  var tempah=[];
  for (var i=0; i<index; i++) {temp[ind]=include[i]; tempah[ind++]=includeah[i];}
  for (var i=index+1; i<include.length; i++) {temp[ind]=include[i]; tempah[ind++]=includeah[i];}
  include=temp; includeah=tempah;
  displayIncludeList(1);
  javascript:find(2,ingin);
}

function showResSub(idnum)
{
  document.getElementById("slaveresl" + idnum).innerHTML="&nbsp;";
  document.getElementById("slaveres" + idnum).className="show";
}

function getIngsFromNums (inString)
{
  var retval1="";
  var retval2="";
  var s1=0; var s2=0;

  while (s1<inString.length)
  {
    s2=inString.indexOf(":",s1);
    var ting=parseInt(inString.substring(s1,s2));
    if ((ting>=0) && (ting<ing.length))
    {
      
      var found=false;
      for (var i=0; i<include.length; i++) 
      {
        if (ingid[ting]==ingid[include[i]]) 
        {
          retval1+="<span class='rcpingslist'>";
          if (ting!=include[i]) retval1+=getIngName(ting)+"=";

          if (searchmod==0) retval1+="<a class='intonot' title='remove from must include list' href='javascript:";
          else if (includeah[i]) retval1+="<a class='intonoth' title='make this a normal at hand ingredient' href='javascript:";
					else retval1+="<a class='intonot' title='make this a must include ingredient' href='javascript:";

//          if ((searchmod!=0) && (includeah[i])) retval1+="<a class='intonoth' href='javascript:";
//          else retval1+="<a class='intonot' href='javascript:";

          if (searchmod==0) retval1+="removei(1," + i + ")' >";
          else retval1+="athandchange(" + i + ")' >";
          retval1+= getIngName(include[i]) + "</a><a class='excld' title='move to must exclude list' href='javascript:moveToExc(" +i + ","+ include[i] + ")' > (exc)</a>&nbsp;&nbsp;&nbsp;</span> ";
          found=true;
          break;
        }
      }
      
      if (!found)
			{
        retval2+="<span class='rcpingslist'><a class='incld'";
			  if (searchmod==0) retval2+=" title='add to must include list' ";
				else retval2+=" title='add to at hand list' ";
				retval2+="href='javascript:find(1," + ting + ")' >" + getIngName(ting) + "</a><a class='excld' title='add to must exclude list' href='javascript:find(2," + ting + ")' > (exc)</a>&nbsp;&nbsp;&nbsp;</span> ";
      }
    }
    s1=s2+1;
  }

  return retval1 + retval2 +"<br /><span class='small'>&nbsp;<br /></span>";
}

function displaySuggs (inmode,ml)
{
  if (inmode>=0) suggmode=inmode;
  if (ml==0) sugglarge=false;
  if (ml==1) sugglarge=true;
  if (suggstring.length<2) {document.getElementById("showsuggs").innerHTML=""; return;}
  var newhtml="";
  if ((searchmod!=0) && (suggmode==1))
  {
    newhtml+="<span class='suggestions'>must include:</span> &nbsp;";
    var resmi=false;
    for (var i=0; i<include.length; i++)
    {
      if (includeah[i])
        newhtml+="<span class='ingsugg'><a class='incld' href='javascript:athandchange(" + i + ")' >" + getIngName(include[i]).replace(/'/g, "&#39;") + "</a>&nbsp;&nbsp;&nbsp;</span> ";
    }
    newhtml+="<br /><br />";
  }


  if (searchmod==0) newhtml +="<span class='suggestions'>suggestions:</span> &nbsp;";
  else
  {
    if (suggmode==0) newhtml +="<span class='suggestions'>new ingredient suggestions (<a class='brwnbld' href='javascript:displaySuggs(1,-1";
    else newhtml +="<span class='suggestions'>include in recipe suggestions (<a class='brwnbld' href='javascript:displaySuggs(0,-1";
    newhtml += ")' >change mode</a>):</span> &nbsp;";
  }
  var i1=0; var i2=0;

  i1=suggstring.indexOf(';');
  if (i1<0) return;
  if ((searchmod==0) || (suggmode==0)) string=suggstring.substring(i1+1);
  else string=suggstring.substring(0,i1);

  i1=0;
  var count=0;
  while (i1<string.length)
  {
    i2=string.indexOf(' ',i1);
    if (i2>0)
    {
      var bid=parseInt(string.substring(i1,i2));
      if ((searchmod==0) || (suggmode==0))
      {
        for (var i=0; i<clst.length; i++)
        {
          if (ingid[clst[i]]==bid)
          {
            count++;
            if ((!sugglarge) && (count>12)) break;
            newhtml+="<span class='ingsugg'><a class='incld' href='javascript:find(1," + clst[i] + ")' >" + getIngName(clst[i]) + "</a><a class='excld' href='javascript:find(2," + clst[i] + ")' > (exc)</a>&nbsp;&nbsp;&nbsp;</span> ";
            break;
          }
        }
        if ((!sugglarge) && (count>12)) break;
      }
      else
      { //just check against the include list - all possible suggestions should be in there
         for (var i=0; i<include.length; i++) 
           if (bid==ingid[include[i]])
             if (!includeah[i])
               newhtml+="<span class='ingsugg'><a class='incld' href='javascript:athandchange(" + i + ")' >" + getIngName(include[i]).replace(/'/g, "&#39;") + "</a>&nbsp;&nbsp;&nbsp;</span> ";
      }

      i1=i2+1;
    }
    else break;
  }

  if (((searchmod==0) || (suggmode==0)) && (count>12))
  {
    if (!sugglarge) newhtml+="<a class='brwnbld' href='javascript:displaySuggs(-1,1)'>more...</a>";
    else newhtml+="<a class='brwnbld' href='javascript:displaySuggs(-1,0)'>less...</a>";
  }
  document.getElementById("showsuggs").innerHTML=newhtml;

}

function checklocation()
{
  var pa=window.location.href.replace(/&amp;/g, "&");
  var i=pa.indexOf('#');
  if (i>=0) pa=pa.substring(i);
  else pa="";
  
  if (thisPageLocation.replace(/&amp;/g, "&")!=pa) 
  {
    var pg=1;
    var x=pa.indexOf("&p=");
    if (x>=0)
    {
      x+=3;
      var x2=pa.indexOf("&",x); if (x2<0) x2=pa.length;
      pg=parseInt(pa.substring(x,x2));
    }
    setUpForHashLocation(pa);
    updateHashLocation(pg,0);
    scroll(0,0);
  }
  else locationtimer=window.setTimeout("checklocation();",100);
}

function resetpage()
{
  suggstring=";";
  displaySuggs(-1,1);
  var clrq="";
  if (searchmod==1) clrq+="&m=athand";
  var diet=0;
  for (var i=0; i<document.dietf.d.length; i++) if (document.dietf.d[i].checked==true) diet=i;
  clrq += "&d=" + diet;
  setUpForHashLocation(clrq);
  updateHashLocation(1,0);
}

function getIngName (ind)
{
  var retval=ing[ind][0];
  for (var i=1; i<ing[ind].length; i++) retval+=" " + ing[ind][i];
  retval=retval.replace("( ", "(").replace(" )", ")").replace(" / ", "/").replace(" - ","-");
  return retval;
}

function getIngNameN (ind)
{
  var retval=ing[ind][0];
  for (var i=1; i<ing[ind].length; i++) retval+=" " + ing[ind][i];
  retval=retval.replace("( ", "(").replace(" )", ")").replace(" / ", "/").replace(" - "," ").replace("'","%27");
  return retval;
}

function findIngredient(inum, iname)
{
  var ret=-1;
  for (var i=0; i<ingid.length; i++)
  {
    if (ingid[i]==inum)
    {
      if (getIngName(i)==iname) return i;
      else if (ret==-1) ret=i;
    }
  }
  return ret;
}

function findIngredientN(iname)
{
  var ret=-1;
	var retname;
  for (var i=0; i<ingid.length; i++)
  {
		if (iname.charAt(0)==ing[i][0].charAt(0))
      if ((retname=getIngNameN(i)).indexOf(iname)==0)
			{
				ret=i;
 				for (var ii=iname.length; ii<retname.length; ii++)
				{
				  var c=retname.charAt(ii);
					if ((c=='(') || (c=='/'))  break;
					if (c!=' ') {ret=-1; break;}
				}
				if (ret>=0) return ret;
			}
  }
  return ret;
}

function setUpForHashLocation(pa)
{
  if (locationtimer!=null) {window.clearTimeout(locationtimer); locationtimer=null;}
  
  include=[];
  includeah=[];
  exclude=[];
  thisPageLocation=pa;
  if (pa==null) pa=""; //just incase
  var i2;
  i=pa.indexOf("ttl=");
  if (i>=0) 
  {
    i2=pa.indexOf('&',i);
    if (i2<0) i2=pa.length;
    document.titlef.ttl.value=decodeURIComponent(pa.substring(i+4,i2).replace(/\+/g, ' '));
  }
  else document.titlef.ttl.value="";
  searchmod=0;
  i=pa.indexOf("&m=");
  if (i>=0) 
  {
    i+=3;
    i2=pa.indexOf('&',i);
    if (i2<0) i2=pa.length;
    if (pa.substring(i,i2)=="athand") searchmod=1;
  }

  i=pa.indexOf("&inc=");
  if (i>=0)
  {
    i+=5;
    i2=pa.indexOf('&',i);
    if (i2<0) i2=pa.length;

		while (i<i2)
		{
		  var i3=pa.indexOf(',',i);
			if (i3<0) i3=i2;
			if ((i3-i)>1)
			{
				var i4;
				var name=pa.substring(i,i3).replace(/\+/g, ' ');
        var index=findIngredientN(pa.substring(i,i3).replace(/\+/g, ' '));
        if (index>=0) {include[include.length]=index; includeah[includeah.length]=true;}
			}
      i=i3+1;			
		}
  }

  i=pa.indexOf("&exc=");
  if (i>=0)
  {
    i+=5;
    i2=pa.indexOf('&',i);
    if (i2<0) i2=pa.length;

		while (i<i2)
		{
		  var i3=pa.indexOf(',',i);
			if (i3<0) i3=i2;
			if ((i3-i)>1)
			{
				var i4;
				var name=pa.substring(i,i3).replace(/\+/g, ' ');
        var index=findIngredientN(pa.substring(i,i3).replace(/\+/g, ' '));
        if (index>=0) exclude[exclude.length]=index;
			}
      i=i3+1;
		}
  }


  i=pa.indexOf("&e=");
  if (i>=0)
  {
    i+=3;
    i2=pa.indexOf('&',i);
    if (i2<0) i2=pa.length;
    document.emphf.e[parseInt(pa.substring(i,i2))].checked=true;//parseInt(pa.substring(i,i2));
  }
  else document.emphf.e[1].checked=true;//parseInt(pa.substring(i,i2));
  i=pa.indexOf("&d=");
  if (i>=0) 
  {
    i+=3;
    i2=pa.indexOf('&',i);
    if (i2<0) i2=pa.length;
    document.dietf.d[parseInt(pa.substring(i,i2))].checked=true;//parseInt(pa.substring(i,i2));
  }
  else document.dietf.d[0].checked=true;//parseInt(pa.substring(i,i2));
  i=pa.indexOf("&g=");
  if (i>=0) 
  {
    i+=3;
    i2=pa.indexOf('&',i);
    if (i2<0) i2=pa.length;
    var category=0; //no cat
    if (i2>i) category=pa.substring(i,i2);
    var xx=0;
    var found=false;
    for (xx=0; xx<recipecatid.length; xx++)
      if (recipecatid[xx]==category) {found=true; break;}
    if (found) document.catf.cat.selectedIndex=xx;
    else document.catf.cat.selectedIndex=0;
  }
  else document.catf.cat.selectedIndex=0;
    
  i=pa.indexOf("&n");
  while (i>=0)
  {
    i+=2;
    i2=pa.indexOf('-',i); if (i2<0) i2=pa.length;
    var index=parseInt(pa.substring(i,i2));
    i=i2+1;
    i2=pa.indexOf("=on",i); if (i2<0) i2=pa.length;
    index=findIngredient(index,decodeURIComponent(pa.substring(i,i2)).toLowerCase().replace(/\+/g, ' '));
    if (index>=0) {include[include.length]=index; includeah[includeah.length]=true;}   
    i=pa.indexOf("&n",i2+3);
  }
  i=pa.indexOf("&o");
  while (i>=0)
  {
    i+=2;
    i2=pa.indexOf('-',i); if (i2<0) i2=pa.length;
    var index=parseInt(pa.substring(i,i2));
    i=i2+1;
    i2=pa.indexOf("=on",i); if (i2<0) i2=pa.length;
    index=findIngredient(index,decodeURIComponent(pa.substring(i,i2)).toLowerCase().replace(/\+/g, ' '));
    if (index>=0) {include[include.length]=index; includeah[includeah.length]=false;}   
    i=pa.indexOf("&o",i2+3);
  }
  i=pa.indexOf("&x");
  while (i>=0)
  {
    i+=2;
    i2=pa.indexOf('-',i); if (i2<0) i2=pa.length;
    var index=parseInt(pa.substring(i,i2));
    i=i2+1;
    i2=pa.indexOf("=on",i); if (i2<0) i2=pa.length;
    index=findIngredient(index,decodeURIComponent(pa.substring(i,i2)).toLowerCase().replace(/\+/g, ' '));
    if (index>=0) exclude[exclude.length]=index;    
    i=pa.indexOf("&x",i2+3);
  }

  searchmode(searchmod,false);
  displayIncludeList(1);
  displayIncludeList(2);
  locationtimer=window.setTimeout("checklocation();",100);
}

function updateHashLocation(pnum,istitle)
{
	jumpOnLoad=false;
  var nullsearch=true;
  //reset page address polling function
  window.clearTimeout(locationtimer);
  locationtimer=null;
  resultspage=pnum;
  //now build new #url
  //var ts=escape(document.titlef.ttl.value.replace(/ /g, "+").replace(/&/g, "%26"));

  var ts=encodeURIComponent(document.titlef.ttl.value).replace(/\'/g, "%27");
  if ((istitle==1) && (lastTitle==ts)) return;
  lastTitle=ts;
  thisPageLocation = "#ttl=" + ts;

  if (searchmod==0) thisPageLocation+="&amp;m=normal"
  else thisPageLocation+="&amp;m=athand" 
  for (var i=0; i<include.length; i++) 
  {  
    if ((searchmod==1) && (!includeah[i])) thisPageLocation += "&amp;o" + ingid[include[i]] + "-" + encodeURIComponent(getIngName(include[i])).replace(/\'/g, "%27") + "=on";
    else thisPageLocation += "&amp;n" + ingid[include[i]] + "-" + encodeURIComponent(getIngName(include[i])).replace(/\'/g, "%27") + "=on";
  }
  for (var i=0; i<exclude.length; i++) thisPageLocation += "&amp;x" + ingid[exclude[i]] + "-" + encodeURIComponent(getIngName(exclude[i])).replace(/\'/g, "%27") + "=on";
  if (searchmod==1)
  {
    var emph=1;
    for (var i=0; i<document.emphf.e.length; i++) if (document.emphf.e[i].checked==true) emph=i;
    thisPageLocation += "&amp;e=" + emph;
  }
  var diet=0;
  for (var i=0; i<document.dietf.d.length; i++) if (document.dietf.d[i].checked==true) diet=i;
  var rc=document.catf.cat.selectedIndex;
  thisPageLocation += "&amp;d=" + diet + "&amp;g=" + recipecatid[rc] + "&amp;p=" + resultspage;

  window.location.href= "/" + thisPageLocation;
  locationtimer=window.setTimeout("checklocation();",100); //start polling again

  if ((diet!=0) || (rc>0))
  {
    resultTitle="";
    if (diet==1) resultTitle += "Vegetarian "; 
    else if (diet==2) resultTitle += "Vegan "; 
    else if (diet==3) resultTitle += "my Cupboard ";
    if (rc>0) resultTitle += recipecathead[rc] + " ";
  }
  else resultTitle=null;

  var cupboardS="";
  if (cuptype==2) //logged in
  {
    cupboardS+="&amp;k=";
    for (var i=0; i<cbstri.length; i++) cupboardS += cbCoder[cbstri[i]];
  }
  if ((ts.length>0) || (include.length>0) || (exclude.length>0) || (diet!=0) || (rc!=0))
  {
    hideResults=false;
    document.getElementById("fresults").className="resultsload";
    document.getElementById("fresultsl").className="cred";
    document.getElementById("searchhelp").className="hide";
    document.getElementById("resetbut").disabled=false;
    if (exclude.length>40)
    {
      document.getElementById("fresultsl").innerHTML="Search Error";
      document.getElementById("results").innerHTML="There is a limit of 40 ingredients for the &#39;must exlude&#39; ingredient list, you have listed " + exclude.length + ". Please delete some ingredients and try again.<br /><br />Please note that you can exclude as many ingredients as you want by marking them with a red cross in your diet profile/store cupboard.<br /><br />" ;
    }
    else if (include.length>40)
    {
      document.getElementById("fresultsl").innerHTML="Search Error";
      if (searchmod==0)
        document.getElementById("results").innerHTML="There is a limit of 40 ingredients for the &#39;must inlude&#39; ingredient list, you have listed " + include.length + ". Please delete some ingredients and try again.<br /><br />" ;
      else
        document.getElementById("results").innerHTML="There is a limit of 40 ingredients for the &#39;I have at hand&#39; ingredient list, you have listed " + include.length + ". Please delete some ingredients and try again.<br /><br />" ;
    }
    else
    {
      document.getElementById("fresultsl").innerHTML="Searching";
      window.frames["resbuff"].location.replace("/?" + thisPageLocation.substring(1) + "&amp;jv=" + versionN + "&amp;ifrm=" + cupboardS);
    }
  } 
  else
  {
    hideResults=true;
    document.getElementById("searchhelp").className="show";
    document.getElementById("results").innerHTML="";
    document.getElementById("fresults").className="hide"; 
    document.getElementById("resetbut").disabled=true;
    suggstring=";";
    displaySuggs(-1,-1);
  }
}

function toPage (pnum, jump, id)
{
  skipid=-1;
  if (pnum>0) 
    updateHashLocation(pnum);
	jumpOnLoad=jump;
}

function scrollToID (id, offset)
{
  var top=0;
  var obj1=document.getElementById(id);
  var obj=document.getElementById(id);
  while (obj.offsetParent)
  {
    top+=obj.offsetTop;
    obj=obj.offsetParent;
  }
  scroll(0,(top+offset));
}

function scrollToIDadv (id, offset)
{
  var h=browserHeight();
  var top=0;
  var obj=document.getElementById(id);
  while (obj.offsetParent)
  {
    top+=obj.offsetTop;
    obj=obj.offsetParent;
  }
  if ((scrollY()+h-25)>top) return;
  scroll(0,(top-h+50+offset));
}

function scrollToIDadv2 (id, offset)
{
  var h=browserHeight();
  var top=0;
  var obj=document.getElementById(id);
  while (obj.offsetParent)
  {
    top+=obj.offsetTop;
    obj=obj.offsetParent;
  }
  scroll(0,(top-h+50+offset));
}


function checkttlkey (e)
{
  var key = (window.event) ? event.keyCode : e.keyCode;
  if (key==13) {resultspage=1; updateHashLocation(1,true);}
}

