var SearchServerRel = "/../cgi-bin/search_images/search_draw.py/search";
var URLDir = window.location.href.substring(0, location.href.lastIndexOf('\/'))
var SearchServer = URLDir + SearchServerRel
var RunningSearches = null;
var SearchFailed = "Request Failed! Sorry please try again later..";

var SearchTable; //reference to search table
var SearchTableHeadRow;
var SearchTableFootRow;
var SearchTableBody;

var DispResultCols = 5;
var ImageNameDisplayLimit = 30;

function onLoad()
{
 drawer_setup();
}

function clearMsg()
{
  removeSearchTable();
}

function displayTextInSearchDiv( msg )
{
  clearMsg();
  
  var myDiv = MochiKit.DOM.getElement("SearchTableDiv");
  
  var SearchTable = MochiKit.DOM.SPAN( null )
  MochiKit.DOM.appendChildNodes( SearchTable, msg  );
  MochiKit.DOM.appendChildNodes( myDiv,SearchTable );
}

function WriteMsg( msg )
{
  var msgcell = document.getElementById( "messageCell" );
  
  statuscell.innerHTML = msg;
}

function ClearMsg()
{
  var msgcell = document.getElementById( "messageCell" );
  MochiKit.DOM.replaceChildNodes( msgcell );
}

function displaySearchingMsg()
{
  displayTextInSearchDiv( "Searching, this will take a few seconds....");
}

function setStatus( msg )
{
  displayTextInSearchDiv( msg );
}

function removeSearchTable()
{
  var myDiv = MochiKit.DOM.getElement("SearchTableDiv");
  MochiKit.DOM.replaceChildNodes( myDiv )
  SearchTable = null;
  SearchTableBody = null;
  SearchTableFootRow = null;
  SearchTableHeadRow = null;
}

//create a table for search results
function createSearchTable()
{

  removeSearchTable();
  
  var headrow = MochiKit.DOM.TR();
  
  //explorer can't manage colSpan here, sigh
  //so
  for( var i = 0; i < DispResultCols / 2 - 1; i++ )
  {
    var blankcell = MochiKit.DOM.TH( {'class': 'searchHead' } );
    MochiKit.DOM.appendChildNodes( headrow, blankcell );
  }
  var  headcell = MochiKit.DOM.TH( {'class': 'searchHead' } );
  MochiKit.DOM.appendChildNodes( headcell, "Search Results" )
  //explorer doesn't read style sheets correctly
  headcell.style.textAlign = "center";
  MochiKit.DOM.appendChildNodes( headrow, headcell );
  
  for( var i = 0; i < DispResultCols / 2 - 1; i++ )
  {
    var blankcell = MochiKit.DOM.TH( {'class': 'searchHead' } );
    MochiKit.DOM.appendChildNodes( headrow, blankcell );
  }
  
  headrow.style.textAlign = "center";
  
  SearchTableHeadRow = THEAD({'class': 'searchHead'} );
  MochiKit.DOM.appendChildNodes( SearchTableHeadRow, headrow );
 
  SearchTableBody = TBODY(null);

  var row_display = function (row, style) {
      return MochiKit.DOM.TR(null, map(partial(TD, style), row));
  };  
  SearchTableFootRow = TFOOT(null,
          row_display([""]));

  SearchTable = MochiKit.DOM.TABLE({'class': 'searchtable'},
      SearchTableHeadRow,
      SearchTableBody,
      SearchTableFootRow );

  var myDiv = MochiKit.DOM.getElement("SearchTableDiv");

  myDiv.appendChild( SearchTable );
}

function AddSearchRow( textArray )
{
  var row = MochiKit.DOM.TR( null );
  
  for( var x in textArray )
  {
    var child = textArray[ x ];
    AddSearchResult( child, row );
  }
  
  SearchTableBody.appendChild( row );
}

//display new search result
function AddSearchResult( resultXML, parentrow )
{
  var thumbfile = parseTag( "Thumb", resultXML );
  var urllink = parseTag( "Loc", resultXML );
  var imglink = "images/" + thumbfile;
  var img = MochiKit.DOM.IMG( {'src' : imglink } );
  var br = MochiKit.DOM.BR();

  var lastslash = urllink.lastIndexOf( "/" );
  var endText = urllink.length;
  
  if( endText - lastslash  > ImageNameDisplayLimit )
  {
    endText = lastslash + ImageNameDisplayLimit - 3;
  }
  
  var dispText = urllink.substring( lastslash + 1, endText );
  
  if( endText != urllink.length )
  {
    dispText = dispText + "...";
  }
  
  //replace any %20
  dispText = dispText.replace( /\%20/g, " " );
  
  var hreftext = "javascript:void( window.open('" + urllink + "'))";
  
  var href = MochiKit.DOM.A({'href' : hreftext }, [ img, br, dispText ] );
  
  var td = MochiKit.DOM.TD( {'class': 'result' }, href  );

  parentrow.appendChild( td );
}

function ShrinkDataArray()
{
  shrunkdata = new Array( PictureHeight * PictureWidth / 9);
  
  var index = 0;
  
  for( var y = 1; y < PictureHeight; y = y + 3 )
  {
    for( var x = 1; x < PictureWidth; x = x + 3 )
    {
      
      var avg_r = 0;
      var avg_g = 0;
      var avg_b = 0;
      
      for( var dx = -1; dx <= 1; dx++ )
      {
        for( var dy = -1; dy <= 1; dy++ )
        {
          var col = Color.fromHexString(  pixelData[ ( x + dx ) + ( y + dy ) * PictureWidth ] );
          avg_r += col.rgb.r;
          avg_g += col.rgb.g;
          avg_b += col.rgb.b;
        }
      }
      
      avg_r = avg_r / 9;
      avg_g = avg_g / 9;
      avg_b = avg_b / 9;
      
      shrunkdata[ index ] = Color.fromRGB( avg_r, avg_g, avg_b ).toHexString();
      index = index +1;
    }
  }
  
  return shrunkdata;
}

function GeneratePicString()
{
  var rtnVal = ""
  var row = 0;
  var column = 0;
  var curcol = DefaultPicBkgColour ;
  var startpt = 0;
  var col = DefaultPicBkgColour;
  
  var ShrunkHeight = PictureHeight / 3;
  var ShrunkWidth = PictureWidth / 3;
  shrunkdata = ShrinkDataArray();
  
  for( ; row < ShrunkHeight; row++ )
  {
    try
    {
    startpt = 0;
    var rowindex = row * ShrunkWidth;
    if( rowindex < shrunkdata.length )
    {
    var curcol = shrunkdata[ row * ShrunkWidth ];
    column = 0
    for( ; column < ShrunkWidth; column++ )
    {
      var index = column + row * ShrunkWidth;
      if( index < shrunkdata.length )
      {
        col = shrunkdata[ index ]
        try
        {
          //end of line
          if( col != curcol )
          {
            rtnVal = rtnVal + "" + (column - startpt) + "|" + curcol + ";";
            startpt = column;
            curcol = col;
          }
        }
        catch(e){ alert( "An exception occurred in the script1. Error name: " + e.name 
+ ". Error message: " + e.message); }
       }
      }
     }
    
    
    //end of the line
    rtnVal = rtnVal + "" + (ShrunkWidth - startpt ) + "|" + curcol;
    rtnVal = rtnVal + ":";

   }
   catch(e)
   {alert( "An exception occurred in the script2. Error name: " + e.name 
+ ". Error message: " + e.message);
   }
  }
  
  return rtnVal;
}

function AsyncFailed()
{
  RunningSearches = null;
  alert( "Failed to connect to server, please try again later..." );
}

//do a Ajax post as graph data may be rather large 10's kb
function makeRequest(url, parameters)
{
  var http_request = null;
  if (window.XMLHttpRequest) 
  { // Mozilla, Safari,...
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) 
         {
         	// set type accordingly to anticipated content type
            //http_request.overrideMimeType('text/xml');
            http_request.overrideMimeType('text/html');
         }
  } else if (window.ActiveXObject) { // IE
         try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
      }

  if( http_request != null )
  {
    try
    {
      http_request.onreadystatechange = PreProcessSearch;
      http_request.open('POST', url, true);
      http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      http_request.setRequestHeader("Content-length", parameters.length);
      http_request.setRequestHeader("Connection", "close");
      http_request.send(parameters);
  
      RunningSearches = http_request;
    }
    catch(e)
    {
      alert( "An exception occurred in the script3. Error name: " + e.name 
  + ". Error message: " + e.message + "\n If you are using IE try using Firefox it's more likely to work!");
      RunningSearches = null;
      removeSearchTable();
    }
  }
}

function PictureSearch()
{
  //check not running already!
  if( RunningSearches != null )
    return;
    
  try
  {
  var picstring = GeneratePicString();
  
  //display some indication we're searching
  
  var url = SearchServer;

  //compose params
  var params = { "userpic" : picstring }

  //make into strings
  var query = MochiKit.Base.queryString( params );
  
  //make a post request
  makeRequest( url, query );
  
  displaySearchingMsg();
  }
  catch(e)
  {
   alert( "An exception occurred in the script. Error name: " + e.name 
+ ". Error message: " + e.message + "\n If you are using IE try using Firefox it will work!");
   }
}

//extract a xml type tag content from a string
function parseTag( tag, text )
{
  var ret = ""
  var startTag = "<" + tag + ">";
  var endTag = "</" + tag + ">";

  var tagStart = text.indexOf( startTag  );
  var tagEnd = text.indexOf( endTag );

  if( tagStart != -1 && tagEnd != -1 )
  {
    ret = text.substring( tagStart + startTag.length, tagEnd );
  }

  return ret;
}

function DisplaySearchResults( resulttext )
{
  createSearchTable();
  
  var scratch = resulttext;
  
  var result = parseTag( "Result", scratch );
  var tagEnd = scratch.indexOf( result ) + result.length + 9;
  scratch = scratch.substring( tagEnd, scratch.length );
  
  var resultArray = new Array( DispResultCols );
  
  var colcount = 0;
  
  while( result.length != 0 )
  {
    resultArray[ colcount ] = result;
    colcount = colcount + 1;
    
    if( colcount == DispResultCols )
    {
      AddSearchRow( resultArray );
      colcount = 0;
      resultArray = new Array( DispResultCols );
    }
    
    result = parseTag( "Result", scratch );
    tagEnd = scratch.indexOf( result ) + result.length + 9;
    scratch = scratch.substring( tagEnd, scratch.length );
  }
  
  //account for any leftovers
  if( colcount != 0 )
  {
    AddSearchRow( resultArray );
  }
}

function PreProcessSearch()
{
  var http_request = RunningSearches;

  if( http_request != null && http_request.readyState == 4)
  {
    if (http_request.status == 200)
    {
      ProcessSearchResults( http_request.responseText );
    }
    else
    {
      AsyncFailed();
    }
    
    RunningSearches = null;
  }
}

function ProcessSearchResults( serverresponse )
{
  RunningSearches = null;

  var state = parseTag( "State", serverresponse );

  if( state == "OK" )
  {    
    DisplaySearchResults( serverresponse );
  }
  else
  {
    var msg = "Server timed out. It may be too busy please try again later.";
    setStatus( msg );
    alert( msg );
  }
}

