contents = document.getElementById("contents");

function filterChildInit()
{
  // this "Child" is a WorkerPool object and runs in a separate thread from the UI
  // need to make the db connection from this thread, since global objects are not shared
  db = google.gears.factory.create('beta.database', '1.0');
  db.open('diggoraclev1');
  gearsWorkerPool.onmessage = filterChildHandler;
}

function filterChildHandler(msg, sender)
{
  var q, exists, a, search = "", strFilter = "", strContent = "", sortLimit = "", itemTemplate = "";

  // "@@" = ghetto-splitting
  a = msg.split("@@");
  search = a[0].split("/@").join("@");
  strFilter = a[1].split("/@").join("@");
  sortLimit = a[2];
  itemTemplate = a[3].split("/@").join("@");
  // if there is a search query, we'll use an additional step, utilizing the fts2 table
  if (search.length > 0)
  {
    mytable = "results";
  } else
  {
    mytable = "storydata";
  }
  q = "SELECT t1.*, t2.*, t3.*, t4.username AS submitter_name " +
    "FROM diggs AS t1 " +
    "LEFT JOIN " + mytable + " AS t2 ON t1.storyid = t2.id " +
    "LEFT JOIN users AS t3 ON t1.userid = t3.id " +
    "LEFT JOIN users AS t4 ON t2.submitter = t4.id " +
    strFilter + " " + 
    "GROUP BY t2.id";
  countobj = sqlToObj(q);
  if (countobj.length == 0)
  {
    results = 0;
  } else
  if (countobj.length == 1)
  {
    if (countobj[0].id == undefined && countobj[0].error == true)
    {
      // super annoying
      // i'm doing the query again
      // this catches it when it errors
      // was occurring 100% when: filter without query, then filter with query
      countobj = sqlToObj(q);
      if (countobj.length == 0)
      {
        results = 0;
      } else
      if (countobj.length == 1)
      {
        if (countobj[0].id == undefined)
        {
          results = countobj[0].error;
        } else
        {
          results = 1;
        }
      } else
      {
        results = countobj.length;
      }
    } else
    {
      results = 1;
    }
  } else
  {
    results = countobj.length;
  }

  q = "SELECT t1.*, t2.*, t3.*, t4.username AS submitter_name " +
    "FROM diggs AS t1 " +
    "LEFT JOIN " + mytable + " AS t2 ON t1.storyid = t2.id " +
    "LEFT JOIN users AS t3 ON t1.userid = t3.id " +
    "LEFT JOIN users AS t4 ON t2.submitter = t4.id " +
    strFilter + " " + 
    "GROUP BY t2.id " + sortLimit;
  obj = sqlToObj(q);
  if (obj.length == 0 || !obj[0].hasOwnProperty("id"))
  {
    results = 0;
    obj = [];
  } else
  {
    if (results == 0 && obj.length > 0)
    {
      results = obj.length;
    }
  }
  for (var i=0;i<obj.length;i++)
  {
    var thisItem = "";
    // remove comment start/end from template. they're there so the browser keeps its greedy hands off the incomplete elements
    thisItem = itemTemplate.replace("<!--", "").replace("-->", "");
    for (var j in obj[i])
    {
      if (j=="container" || j=="topic")
      {
        thisItem = thisItem.split("[["+j+"_friendly]]").join(topicIdToFriendly(obj[i][j]));
        obj[i][j] = topicIdToName(obj[i][j]);
      }
      if (j=="submit_date")
      {
        obj[i][j] = formatDate(obj[i][j]);
      }
      thisItem = thisItem.split("[["+j+"]]").join(obj[i][j]);
    }
    strContent += thisItem + "<br />";
  }
  objlength = obj.length;
  gearsWorkerPool.sendMessage("results|"+results+" "+objlength+" "+strContent, sender);
}

// 
var displayParams = {
  user: "me",
  sort: "diggdate",
  order: "desc",
  offset: 0,
  count: 10,
  search: "",
  queryFilter: [["t2.title", "<>", ""], ["submit_date", ">", 0]]
};

// adds to or subtracts from offset parameter
function changePage(dir)
{
  if (dir==0)
  {
    displayParams.offset = 0;
  } else
  if (dir==-1)
  {
    displayParams.offset -= displayParams.count;
  } else
  if (dir==1)
  {
    displayParams.offset += displayParams.count;
  }
  startSearch();
  return false;
}

// checks to see if filter is already specified in array
// if not, pushes it to the end
function checkAddFilter (arrFilter)
{
  found = false;
  for (i=0;i<displayParams.queryFilter.length;i++)
  {
    if (displayParams.queryFilter[i][0] == arrFilter[0])
    {
      displayParams.queryFilter[i] = arrFilter;
      found = true;
    }
  }
  if (!found)
  {
    displayParams.queryFilter.push(arrFilter);
  }
}

// pulls value from the radio button filters that don't exist yet
// ;-)
function getCheckedValue(radioObj)
{
  if(!radioObj)
    return "";
  var radioLength = radioObj.length;
  if(radioLength == undefined)
    if(radioObj.checked)
      return radioObj.value;
    else
    return "";
  for(var i = 0; i < radioLength; i++)
  {
    if(radioObj[i].checked) {
      return radioObj[i].value;
    }
  }
  return "";
}

function updateParams()
{
  document.getElementById("contents").innerHTML = "";
  document.getElementById("prevPage").style.display = "none";
  document.getElementById("nextPage").style.display = "none";
  document.getElementById("resultSummary").innerHTML = "I'm in ur diggz, searchin ur historiez";
  document.getElementById("currentPage").innerHTML = "";

  // search query
  var searchQuery = document.getElementById("searchQuery").value.replace("'", "\'");
  displayParams.search = searchQuery;

  // sort by, sort order
  var dS = document.getElementById("dropSort");
  var SO = dS.options[dS.selectedIndex].value.split(":");
  displayParams.sort = SO[0];
  displayParams.order = SO[1];

  // reset offset
  displayParams.offset = 0;

  // time requirements
  var dT = document.getElementById("dropTime");
  var strTime = dT.options[dT.selectedIndex].value;
  var timeFilter = ["submit_date", ">", 0];
  myDate = new Date();
  ep = myDate.getTime()/1000;
  oneDay = 86400;
  if (strTime == "month")
  {
    timeFilter[2] = ep - oneDay*30;
  } else
  if (strTime == "week")
  {
    timeFilter[2] = ep - oneDay*7;
  } else
  if (strTime == "48hours")
  {
    timeFilter[2] = ep - oneDay*2;
  } else
  if (strTime == "24hours")
  {
    timeFilter[2] = ep - oneDay;
  }
  checkAddFilter(timeFilter);

  // user(s)
  //var userFilter = getCheckedValue(document.forms['filterForm'].elements['meOrFriends']) == "me" ? ["t3.id", "=", currentUserId] : ["t3.id", "<>", "null"];
  userFilter = ["t3.id", "=", currentUserId];
  checkAddFilter(userFilter);

  // topics
  containerExclusions = [];
  topicExclusions = [];
  var i=0;
  while (c = document.getElementById("chkContainer"+i))
  {
    if (c.checked != true)
    {
      containerExclusions.push(document.getElementById("divID"+i).innerHTML);
    } else
    {
      var j=0;
      while (t = document.getElementById("chkContainer"+i+"Topic"+j))
      {
        if (!t.checked)
        {
          topicExclusions.push(document.getElementById("divID"+i+"Topic"+j).innerHTML);
        }
        j++;
      }
    }
    i++;
  }
  if (containerExclusions.length == 0)
  {
    containerExclusions.push("-1");
  }
  if (topicExclusions.length == 0)
  {
    topicExclusions.push("-1");
  }

  checkAddFilter(["container", "NOT IN", "("+containerExclusions.join(", ")+")"]);
  checkAddFilter(["topic", "NOT IN", "("+topicExclusions.join(", ")+")"]);

  return startSearch();
}

// retries a few times because sometimes the fts2 table is flaky
// don't have to retry on non-query-based actions
function startSearch(retry)
{
  if (retry>0)
  {
    if (retry >= 3)
    {
      return false;
    }
    retry++;
  } else
  {
    retry = 1;
  }
  var resultSummary, q, countobj, results = 0, obj, i, j, strResults;
  var sort = displayParams.sort, order = displayParams.order, offset = displayParams.offset, count = displayParams.count, search = displayParams.search, strFilter;
  document.getElementById("contents").innerHTML = "";
  var strFilter = "";
  for (i in displayParams.queryFilter)
  {
    if (i == 0)
    {
      strFilter = "WHERE ";
    } else
    {
      strFilter += "AND ";
    }
    var thisFilter = displayParams.queryFilter[i];
    strFilter += thisFilter[0] + " " + thisFilter[1] + " ";
    if (typeof(thisFilter[2]) == "string" && thisFilter[0] != "container" && thisFilter[0] != "topic")
    {
      strFilter += "'" + thisFilter[2] + "' ";
    } else
    {
      strFilter += thisFilter[2] + " ";
    }
  }
  search = search.replace("'", "");

  sortLimit = "ORDER BY " + sort + " " + order + " " + "LIMIT " + offset + ", " + count;

  db.execute("DROP TABLE IF EXISTS 'results'");
  if (search.length > 0)
  {
    q = "CREATE TABLE 'results' AS SELECT storydata.* FROM storydata JOIN storytext ON storydata.id = storytext.rowid WHERE storytext MATCH '" + search + "'";
    tmp = sqlToObj(q);
    if (tmp.length > 0)
    {
      startSearch(retry++);
      return false;
    }
  }
  
  /// send "search@@strFilter@@sortLimit";
  /// expect return "obj.length contents.innerHTML";
  workerPool.sendMessage(search.split("@").join("/@")+"@@"+strFilter.split("@").join("/@")+"@@"+sortLimit+"@@"+itemTemplate.innerHTML.split("@").join("/@"), filterChildId);
  
  return false;
}

// this does the actual updating of the HTML elements
function displayResults(resultsText)
{
  arrResults = resultsText.split(" ");
  strContents = resultsText.substring(arrResults[0].length + arrResults[1].length + 2);
  results = parseInt(arrResults[0], 10);
  objlength = parseInt(arrResults[1], 10);
  strResults = results + " results. ";
  if (objlength > 0)
  {
    strResults += "Now viewing " + (displayParams.offset+1) + "-" + (displayParams.offset+objlength);
    document.getElementById("currentPage").innerHTML = "Page "+(displayParams.offset/displayParams.count+1);
  } else
  {
    document.getElementById("currentPage").innerHTML = "";
  }
  document.getElementById("resultSummary").innerHTML = strResults;
  document.getElementById("prevPage").style.display = displayParams.offset > 0 ? "" : "none";
  document.getElementById("nextPage").style.display = results > displayParams.offset+objlength ? "" : "none";
  document.getElementById("contents").innerHTML = strContents;
}
