
var searchpage=true;
var timer_autoenter=null;
var suggestions=new Array();
var selectedsuggestion=-1;
var enteredsuggestion="";
var keywordsshowing=false;
var currentthumb=null;
var reqresultscache=new Array();

function initsearchstuff() {
   if (addeventthandlers_search()) {
      createkeywordsarray();
      disableautocomplete();
      addspinner();
      keywordbutton();
      createkeywordp();
      addmessagep();
   }
}

function addeventthandlers_search() {
   if (document.addEventListener) {
      document.getElementById("userinput").addEventListener('keyup',suggestakeyword,false);
      document.addEventListener('keydown',grabkeys,false);
      document.addEventListener('click',destroylist,false);
      document.getElementById("form_search").addEventListener('submit',formsubmitted,false);
      document.getElementById("bigphoto").addEventListener("load",function () { showspinner(false) },false)
      return true;
   }
   return false;
}

function disableautocomplete() {
   document.getElementById("userinput").setAttribute("autocomplete","off");
}

function addspinner() {
   var i=document.createElement("img");
   i.setAttribute("src","images/wait.gif");
   i.setAttribute("style","position:fixed;top:0;right:0;z-index:10;visibility:hidden");
   i.setAttribute("id","spinner");
   document.getElementsByTagName("body")[0].appendChild(i);
}

function showspinner(s) {
   var ss=document.getElementById("spinner");
   if (s) ss.style.visibility="visible";
   else ss.style.visibility="hidden";
}


function addmessagep() {
   var g=document.getElementById("gallery");
   var p=document.createElement("div");
   p.setAttribute("id","messages");
   document.getElementsByTagName("body")[0].insertBefore(p,g);
}

function grabkeys(e) {
//down 40 / up 38 / enter 13
   var kc=e.keyCode;
   switch (kc) {
      case 38 : selectsuggestion(-1);break;
      case 40 : selectsuggestion(1);break;
     // case 13 : destroylist();break;
      default : //nowt
   }
}

function suggestakeyword(e) {
   var kc=e.keyCode;
   if (kc!=38 && kc!=40) {
//       if (kc==13) destroylist();
      clearTimeout(timer_autoenter);
      var entered=document.getElementById("userinput").value.toLowerCase();
      enteredsuggestion=entered;
      var list=document.getElementById("searchlist");
      destroylist();
      if (entered!="") {
         suggestions.length=0;
         for (var i=0;i<keywordsarray.length;i++) {
            var k=keywordsarray[i];
            if (k.substring(0,entered.length)==entered)    suggestions[suggestions.length]=k;
         }
         if (suggestions.length>0) {
            for (var i=0;i<suggestions.length;i++) {
               var sug=suggestions[i]
               var kwtext=document.createTextNode(sug);
               var nht=(reqresultscache[sug]) ? '['+reqresultscache[sug].responseXML.getElementsByTagName("image").length+']' : "\u00a0"
               var htext=document.createTextNode(nht);
               var kws=document.createElement("span");
               kws.setAttribute("class","kw");
               var hs=document.createElement("span");
               hs.setAttribute("class","hitno");
	       var newli=document.createElement("li");
               newli.className=(i==suggestions.length-1) ? "suggestion last" : "suggestion";
               newli.title="search on keyword '"+sug+"'";
               newli.setAttribute("id","sugli"+i);
               newli.addEventListener('click',formsubmitted,false);
               newli.addEventListener('mouseover',function() {    selectsuggestion(parseInt(this.id.substring(this.id.length-1,this.id.length),10)-selectedsuggestion); },false);
	       kws.appendChild(kwtext);
               hs.appendChild(htext);
               newli.appendChild(kws);
               newli.appendChild(hs);
	       list.appendChild(newli);
            }
            if (suggestions.length==1) {   
               timer_autoenter=setTimeout("autoenter('"+suggestions[0]+"')",500);
               destroylist();
            }
         } else {
            var litext=document.createTextNode("No matches");
            var newli=document.createElement("li");
            newli.className="suggestion last"
	    newli.appendChild(litext);
	    list.appendChild(newli);
         }
      }
   }
}



function destroylist() {
   var limit=1; // leave li containing input
   var list=document.getElementById("searchlist");
   var listitems=list.getElementsByTagName("li"); 
   while (listitems.length>limit) {
      list.removeChild(listitems[listitems.length-1]);
   }
   selectedsuggestion=-1;
   // can't just remove children of ul as some browsers regard the input as a child of the ul and some don't.
}

function hlsuggestion(o,d) {
   var oi=parseInt(o,10);
   var di=parseInt(d,10);
   var foo=oi+di;
   document.getElementById("sugli"+o).style.backgroundColor="silver";
   if (foo>-1 && foo<suggestions.length) document.getElementById("sugli"+foo).style.backgroundColor="white";
}

function autoenter(s,es) {
   var f=document.getElementById("userinput");
   var cs=(es) ? es : f.value;
   var hl=s.length-cs.length;
   f.value=s;
   try {
      f.setSelectionRange(s.length-hl,s.length);
   } catch(e) {
       //nothing. either it's supported or it's not.
   }
}

function selectsuggestion(dir) {
   var ss=selectedsuggestion;
   ss+=dir;
   if (ss<-1) ss=-1;
   if (ss==suggestions.length) ss=suggestions.length-1;
   if (ss>-1) {
      hlsuggestion(ss,0-dir);
      autoenter(suggestions[ss],enteredsuggestion);
   } else if (ss==-1) {
      destroylist();
     document.getElementById("userinput").value=enteredsuggestion;
   }
   selectedsuggestion=ss;
}

function createkeywordsarray() {
   keywordsarray=keywords.split(',');
   keywordsarray.length--;
   for (var i=0;i<keywordsarray.length;i++) keywordsarray[i]=keywordsarray[i].toLowerCase();
}

function keywordbutton() {
   var but=document.createElement("input");
   but.setAttribute("type","button");
   but.setAttribute("value","Show Keywords");
   but.setAttribute("id","showhidekw");
   but.addEventListener("click",showhidekeywords,false);
   document.getElementById("buttons").appendChild(but);
}


function showhidekeywords() {
   if (keywordsshowing) {
      var bt=" Show";
      var d="none";
      keywordsshowing=false;
   } else {
      var bt=" Hide";
      var d="block";
      keywordsshowing=true;
   }
   document.getElementById("showhidekw").setAttribute("value",bt+" Keywords");
   document.getElementById("keywords").style.display=d;
}

function createkeywordp() {
   var w="";
   for (var i=0;i<keywordsarray.length;i++) {
      w+=keywordsarray[i]+" : ";
   }
   var p=document.createElement("p");
   var s=document.createTextNode(w);
   p.setAttribute("id","keywords");
   p.setAttribute("style","display:none");
   p.appendChild(s);
   document.getElementById("form_search").appendChild(p);
}

function hidebigphoto() {
   document.getElementById("bigphoto").style.display="none";
}

function showgallery() {
   document.getElementById("gallery").style.display="block";
}

function hidegallery() {
   document.getElementById("gallery").style.display="none";
}

function showcontrols() {
   document.getElementById("controls").style.display="block";
}

function hidecontrols() {
   document.getElementById("controls").style.display="none";
}

function showsscontrols() {
   document.getElementById("slideshowcontrols").style.display="block";
}

function hidesscontrols() {
   document.getElementById("slideshowcontrols").style.display="none";
}

function showxofy() {
   document.getElementById("xofy").style.display="inline";
}

function hidexofy() {
   document.getElementById("xofy").style.display="none";
}

function changexofy() {
   document.getElementById("xofy").innerHTML=(currentimage+1)+" of "+noimages
}

function formsubmitted(e) {
   e.preventDefault();
   destroylist();
   hidecontrols();
   hidesscontrols();
   hidebigphoto();
   hidexofy();
   showmessage("Retrieving images matching keyword "+document.getElementById("userinput").value.toLowerCase());
   showspinner(true);
   fetchxmlfromserver(document.getElementById("userinput").value);
}

var isIE = false;
var req;

var urlprepend="";
//var urlprepend="http://localhost.localdomain/~mike/megaflex/xml/links_"
// var urlprepend="http://megaflexdestiny.net/xml/links_"



function fetchxmlfromserver(kw) {
    // branch for native XMLHttpRequest object
   var url=urlprepend+"findimages.php?keyword="+kw;
   var newreq=false;
   if (window.XMLHttpRequest) {
      if (reqresultscache[kw]) {
         req=reqresultscache[kw]; // retrieve it from cache
         processreqchange(); //kick it
      } else {
         req=new XMLHttpRequest();
         newreq=true;
      }
      if (newreq) {
         req.onreadystatechange=processreqchange;
         req.open("GET",url,true);
         req.send(null);
      }
    // branch for IE/Windows ActiveX version
   } else if (window.ActiveXObject) {
      isIE=true;
      req=new ActiveXObject("Microsoft.XMLHTTP");
      if (req) {
         req.onreadystatechange=processReqChange;
         req.open("GET", url, true);
         req.send();
      }
   }
}

function processreqchange() {
//debug("rS"+req.readyState);
   if (req.readyState==4) {
      if (req.status==200) {
         var kw=getnamespacetext("","keyword",req.responseXML,0);
         noimages=req.responseXML.getElementsByTagName("image").length
         if (!reqresultscache[kw]) reqresultscache[kw]=req; // cache it
         showmessage("Showing "+noimages+" images matching keyword "+kw);
         showgallery();
         destroythumbs();
         showthumbs();
         showspinner(false);
      } else {
         alert("There was a problem retrieving the XML data:\n" +
                req.statusText);
      }
   }
}

function destroythumbs() {
   var thumbdiv=document.getElementById("thumbs");
   while (thumbdiv.childNodes[0]) {
      thumbdiv.removeChild(thumbdiv.childNodes[0]);
   }
}

function showthumbs() {
   var thumbdiv=document.getElementById("thumbs");
   var items=req.responseXML.getElementsByTagName("image");
   var dir="images/photographs/lomo/";
   for (var i=0; i<items.length; i++) {
      var fn=getnamespacetext("","filename",items[i],0);
      var thumb=document.createElement('img');
      var a=document.createElement('a');
      a.setAttribute("href","#");
      a.setAttribute("title","view larger image");
      a.addEventListener("click",function() { showbigphoto(this.childNodes[0]) },false);
      thumb.setAttribute("src",dir+"thumbs/"+fn);
      thumb.setAttribute("class","thumb");
      thumb.setAttribute("id","thumb"+i);
      a.appendChild(thumb);
      thumbdiv.appendChild(a);
   }
}

function appendthumb(select,value,content) {
    var image;
    image=document.createElement("img");
    img.src=value;
    opt.appendChild(content);
    select.appendChild(opt);
}


function getnamespacetext(prefix, local, parentElem, index) {
   var result="";
   if (prefix && isIE) {
      result=parentElem.getElementsByTagName(prefix + ":" + local)[index];
   } else {
       result=parentElem.getElementsByTagName(local)[index];
   }
   if (result) {
      if (result.childNodes.length > 1) {
         return result.childNodes[1].nodeValue;
      } else {
         return result.firstChild.nodeValue;
      }
   } else {
      return "n/a";
   }
}

function showmessage(state) {
   var msg=document.getElementById("messages");
   if (state) {
      showmessage(false);
      var t=document.createTextNode(state);
      msg.appendChild(t);
   } else {
      while (msg.childNodes[0]) {
         msg.removeChild(msg.childNodes[0]);
      }
   }
}

function debug(s) {
   document.getElementById("debug").innerHTML+=s+"<br />";
}


