/* -- start search -- */
var serviceUrl = "/SearchService.asmx/"
var proxy = new ServiceProxy(serviceUrl);

var currentQuery = '';
var currentQueryH = '';
var lockCount = 0;
var re = null;
var tStart = false;
var IsFirstRun = true;
var SCANTIMEOUT = 200;
var counter=0;
var $in = null;
var $maincontainer = null;

jQuery.fn.log = function(msg) {
    if (window.console) { console.log("%s: %o", msg, this); }
    return this;
};


function RunQuery() {
    if (lockCount <= 0) {
        $in.oneTime(SCANTIMEOUT, 'dataTimer', GetDataSets);
    }
    else
        counter++;
}
function CheckQuery() {
  if (counter>0)
      $in.oneTime(SCANTIMEOUT, 'dataTimer', GetDataSets);
}
function GetLink(url) {
    var selector = window.SELECT_FUNCTION || '';
    if (selector && selector.length > 0) {
        return "javascript:" + selector + "('" + url + "')";
    }
    return url;
}

function GetHitRegexp(d) {
    if (d == null || d.length <= 1) return d;
    var parts = d.split(' ');
    var ret = '';
    for (var i = 0; i < parts.length; i++) {
        if (parts[i] == null || parts[i] == '' || (parts[i].lenth == 1 && parts[i] == ' ')) continue;
        ret += parts[i] + '|';
    }
    if (ret.length > 0)
        ret = ret.substr(0, ret.length - 1);
    else 
        ret = d;    
    return ret;
}
function OnPageError(error) {
    lockCount--;
    RunQuery();
}



function GetSearchHtml(holder, template, d) {

    if (d == null) d = [];
    var $div = $('#' + holder);
    var data = { table: d, query: currentQuery };
    var culture = window.SEARCH_TEMPLATE_CULTURE || 'en-us';    
    if (!$div.hasTemplate()) {
        $div.setTemplateURL('/templates/' + culture + '/' + template + '.htm', null, { filter_data: false });
    }
    $div.processTemplate(data);
}

function hit(data) {
    if (data == null || data.length == 0) return data;
    var c = currentQueryH;
    try { re = new RegExp('(' + GetHitRegexp(c) + ')', 'ig') } catch (e) { re = null; }
    if (re != null) {
        if (re.test(data)) {
            data = data.replace(re, '<span class="found">$1</span>');
        }
        else {
            while (c.length > 3) {
                c = c.substr(0, c.length - 1);
                try { re = new RegExp('(' + GetHitRegexp(c) + ')', 'ig') } catch (e) { re = null; }
                if (re != null) {
                    if (re.test(data)) {
                        data = data.replace(re, '<span class="found">$1</span>');
                        break;
                    }
                }
            }
            currentQueryH = currentQuery;
            try { re = new RegExp('(' + GetHitRegexp(currentQueryH) + ')', 'ig') } catch (e) { re = null; }
        }
    }
    return data;
}

function GetDataSets() {
 var q = $('#qs').val();
 if (q == '' && !IsFirstRun) StopSearch(false);
 if (q==currentQuery.toLowerCase()) return;
 if (lockCount > 0) return;
  
 counter=0; 
 $.fn.log("Query: "+ q);

 currentQuery = q.toLowerCase();
 currentQueryH = currentQuery;



 if ($maincontainer.hasClass("hide")) {
     $maincontainer.removeClass("hide");
     jQuery('div.example').hide();
     if (!$maincontainer.hasClass("noBottom") && $('div.tagBlockContainer').length > 0) {
         $maincontainer.addClass("noBottom");
     }
 }

 var data = null;
 var templates = ['objects', 'catalogue', 'comments', 'events', 'eventsections'];
 for (var i = 1; i <= 5; i++) {
     var $div = $('#sid'+i.toString());
     if ($div.hasClass("hide"))
         $div.removeClass("hide");
     if ($div.hasClass("dark"))
         $div.removeClass("dark");
     if (IsFirstRun) {
         GetSearchHtml("sid" + i.toString(),templates[i-1] , null);
     }
 }
 if (IsFirstRun) IsFirstRun = false;
 lockCount++;
 proxy.invoke("SearchCategories", { query: q },
  function(result) {
      lockCount--;
      GetSearchHtml('sid2', 'catalogue', result);
  },
  OnPageError);  
 lockCount++;
 proxy.invoke("SearchBill", { query: q }, 
  function(result) {
 lockCount--;
 GetSearchHtml('sid5', 'eventsections', result); 
  },
  OnPageError);
  
 lockCount++;
 proxy.invoke("SearchObjects", { query: q },
  function(result) {
      lockCount--;
      GetSearchHtml('sid1', 'objects', result);
  },
  OnPageError);

 lockCount++;
 proxy.invoke("SearchEvents", { query: q }, 
  function(result) {
 lockCount--;
 GetSearchHtml('sid4', 'events', result);  
  },
  OnPageError);

 lockCount++;
 proxy.invoke("SearchComments", { query: q }, 
  function(result) {
 lockCount--;
 GetSearchHtml('sid3', 'comments', result);  
  },
  OnPageError);
}

function StopSearch(clear) {
    var destroy = clear || false;
    if (!$maincontainer.hasClass("hide"))
        $maincontainer.addClass("hide");
    $in.stopTime('dataTimer', GetDataSets);
    $in.stopTime(800, 'auto', CheckQuery);
    currentQuery = '';
    jQuery('div.example').show();
    IsFirstRun = true;
    counter = 0;
    if (destroy) {
        $in.unbind();
        $maincontainer.unbind();
        $in = null;
        $maincontainer = null;
    }
}


function InitSearch() {

    if ($in != null && $in.length > 0) return;
    $in = $("#qs");
    if ($in.length == 0) return;

    $maincontainer = $("div.block.searchResults");

    if ($in.val() == '') {
        $in.val($in.attr('title'));
    }

    $in.focus(function() {
        if ($in.val() == $in.attr('title'))
            $in.val('');
            
        $in.oneTime(SCANTIMEOUT, 'dataTimer', GetDataSets);
        $in.everyTime(800, 'auto', CheckQuery);
    }).blur(function() {
        $in.stopTime('dataTimer', GetDataSets);
        $in.stopTime(800, 'auto', CheckQuery);

        if ($in.val() == '') {
            $in.val($in.attr('title'));
        }
        
    })
    .keypress(function(e) { RunQuery(); })
    .keydown(function(e) { RunQuery(); });

    $("#btnS").click(function(e) { GetDataSets();});
    /* -- end search -- */
}
InitSearch();
