VPG.search=
  function () {
    if (++VPG.search.searching>1) {
      VPG.search.pending=true;
      VPG.search.searching--;
      return;
    }

    var terms=new horus.hash;
    var search=horus.getselected(VPG.search.speciality);
    if (search>0) terms.speciality=search;
    search=horus.getselected(VPG.search.chapter);
    if (search>0) terms.chapter=search;
    search=horus.getselected(VPG.search.region);
    if (search>0) terms.region=search;
    search=VPG.search.search.value.trim();
    if (search.length>1 || !terms.isEmpty()) terms.search=search;

    if (terms.isEmpty()) {
      VPG.search.display({});
      return;
    }

    search=terms.toString();

    if (VPG.search.cache[search])
      VPG.search.display(VPG.search.cache[search]);
    else {
      VPG.search.key=search;
      VPG.search.busy.className='working';
      horus.ajax(VPG.search.action, 'find', terms, VPG.search.response);
    }
  };


VPG.search.sorter=
  function ( a, b ) {
    a=VPG.search.members[a];
    b=VPG.search.members[b];
    var result=0;

    switch (VPG.search.sort.by) {

    case 1:
      result=horus.compare(a.chapter, b.chapter);

    }

    if (!result)
      result=
	horus.compare(a.familyname, b.familyname) ||
	horus.compare(a.givenname, b.givenname) ||
	horus.compare(a.middlename, b.middlename);

    
    return result*VPG.search.sort.direction;
  };


VPG.search.sort=
  function ( newkey ) {
    if (newkey!=null)
      if (newkey==VPG.search.sort.by)
	VPG.search.sort.direction=-VPG.search.sort.direction;
      else {
	horus.setClass('sort'+VPG.search.sort.by, '');
	VPG.search.sort.by=newkey;
	VPG.search.sort.direction=-1;
      }

    var members=horus.keys(VPG.search.members).sort(VPG.search.sorter);

    for (var m=0; m<members.length; m++)
      VPG.search.result.appendChild(VPG.search.members[members[m]].node);

    horus.setClass
      ('sort'+VPG.search.sort.by,
       VPG.search.sort.direction==1 ? 'desc' : 'asc');

  };


VPG.search.display=
  function ( idlist ) {
    for (var id in VPG.search.members)
      horus.visible(VPG.search.members[id].node, idlist[id]);

    horus.visible(VPG.search.result, !horus.hash.empty(idlist));
    horus.matchHeight();
    VPG.search.searching--;

    if (VPG.search.pending) {
      VPG.search.pending=false;
      VPG.search();
    }
  }


VPG.search.link=
  function () {
    var search=
      VPG.search.keys[VPG.search.key]+
      (VPG.search.sort.direction<0 ? 'a' : 'd')+
      VPG.search.sort.by;

    horus.linkTo(this.href, { _key: search });
    return false;
  }


VPG.search.response=
  function ( response ) {
    if (response.ajaxStatus(true)) {
      var idlist={};
      var matches=response.selectNodes('horus/member');

      for (var m=0; m<matches.length; m++) {
	var match=matches[m];
        var id=response.getAttribute(match, 'id');
        idlist[id]=true;
        if (VPG.search.members[id]) continue;

        var member=
          { givenname: response.getAttribute(match, 'givenname'),
            middlename: response.getAttribute(match, 'middlename'),
            familyname: response.getAttribute(match, 'familyname'),
            chapter: VPG.chapters[response.getAttribute(match, 'chapter')] };

        var name=[];
        if (member.givenname!='') name.push(member.givenname);
        if (member.middlename!='') name.push(member.middlename);
        if (member.familyname!='') name.push(member.familyname);
        name=name.join(' ');

        member.node=horus.appendChild
          (VPG.search.result,
           [ 'div', 'member'+id,
             [ 'a',
               { classname: 'name',
		 href: VPG.search.detail+'?id='+id,
		 onclick: VPG.search.link }, name ],
             [ 'span', { classname: 'chapter' }, member.chapter || 'not in chapter' ] ]);

        for (var f in member)
	  if (f!='node' && member[f]) member[f]=member[f].toLowerCase();

        VPG.search.members[id]=member;
      }

      if (!horus.hash.empty(idlist))
	VPG.search.keys[VPG.search.key]=response.getAttribute('horus', 'search');

      VPG.search.cache[VPG.search.key]=idlist;
      VPG.search.sort();
      VPG.search.display(idlist);
      VPG.search.busy.className='';
    }
  };


VPG.search.reset=
  function () {
    VPG.search.search.value='';
    VPG.search.speciality.selectedIndex=0;
    VPG.search.chapter.selectedIndex=0;
    VPG.search.region.selectedIndex=0;
    VPG.search();
  };


VPG.search.init=
  function () {
    VPG.search.search=document.getElementById('searchfilter');
    VPG.search.speciality=document.getElementById('specialityfilter');
    VPG.search.chapter=document.getElementById('chapterfilter');
    VPG.search.region=document.getElementById('regionfilter');
    VPG.search.result=document.getElementById('searchresult');
    VPG.search.busy=document.getElementById('searchbusy');
    VPG.search.cache={};
    VPG.search.keys={};
    VPG.search.members={};
    VPG.search.searching=0;
    VPG.search.pending=false;
    VPG.search();
  };


horus.afterLoad(VPG.search.init);
