/*---------------------------- Google maps code -----------------------------*/

var GLoaderLoaded = false;
var map;
var bounds;
var geocoder;
var addresses = new Array();
var current_biz;

function loadMaps() {
    GLoaderLoaded = true;
    google.load("maps", "2", {"callback" : displayMap});

}

function addBusiness(index)
{
    var address = addresses[index];
     if (GBrowserIsCompatible()) {
        var coords = address.split(",");
        var point = new GLatLng(coords[0], coords[1])
        if(point)
        {
            map.setCenter(point, 1);
            bounds.extend(point);
            var bizLocation = new GMarker(point);
            var directions = '<br/> <a href="http://maps.google.com/maps?saddr=&daddr=' + point.toUrlValue() + '" target ="_blank">Directions<\/a>';
            bizLocation.bindInfoWindow($('gmap_'+index).innerHTML+directions);
            map.addOverlay(bizLocation);
            map.setZoom(map.getBoundsZoomLevel(bounds));
            map.setCenter(bounds.getCenter());
            map.savePosition();
        }
      }
}

function displayMap()
{
     map = new GMap2(document.getElementById("dir_map"));
     map.setUIToDefault();
     geocoder = new GClientGeocoder();
     displayBusinesses();
}

function displayBusinesses()
{
    bounds = new GLatLngBounds();
    map.clearOverlays();
    for(var i=0;i<10;i++)
     {
       addBusiness(i);
     }
}

function moveTo(event)
{
    var pointnum = this.id.split('_')[1]
    if(pointnum != current_biz)
    {
        current_biz = pointnum;
         // position the map over the current point
         geocoder.getLatLng(addresses[pointnum], function(point){
            map.panTo(point);
            var directions = '<br/> <a href="http://maps.google.com/maps?saddr=&daddr=' + point.toUrlValue() + '" target ="_blank">Directions<\/a>';
            map.openInfoWindow(point, $('gmap_'+pointnum).innerHTML+directions);
          });

         // slide the map to align with the selected business
         var business = $('item_'+pointnum);
         var position = business.cumulativeOffset();
         var newY = position[1]-(business.getHeight()/2);
         // check for scrolling off the bottom of the page or scrolling above tags box
         var tags = $('tagData');
         var tagsBottom = tags.cumulativeOffset()[1]+tags.getHeight()-40;
         var mapHeightOffset = 100;
         var scroll = document.viewport.getScrollOffsets();
         if(newY+$('dir_map').getHeight()+mapHeightOffset > document.viewport.getHeight()+scroll[1])
         {
            newY = document.viewport.getHeight()+scroll[1]-($('dir_map').getHeight()+mapHeightOffset)-tagsBottom;
         }
         else if(newY < tagsBottom)
         {
            newY = 0;
         }
         else
         {
            newY = newY-tagsBottom;
         }
         new Effect.Move($('dir_map'), {  y: newY, mode: 'absolute'});
    }
}


/*---------------------------- Directory Search -----------------------------*/


var searchTimeoutID;

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function isLoading(status)
{
    if(status)
    {
        document.body.addClassName('waiting');
        $('directory_results').addClassName('loading');
    }else{
        document.body.removeClassName('waiting');
        $('directory_results').removeClassName('loading');
    }
}

function loadComplete()
{
    isLoading(false);
    activateMapLinks();
}

function searchLoad(q)
{
    isLoading(true);
    new Ajax.Updater('directory_results', '/directory', {
        parameters: {q: q, content: content} ,
        evalScripts: true,
        onComplete: loadComplete
    } )
    addReset('search');
}

function searchToggle()
{
    // check for search field already present
    if(!$('query'))
    {
        var currentquery = trim($('searchselect').innerHTML);
        $('searchselect').update('<input id="query" value="'+currentquery+'" ></input>');

        $('query').observe('blur', function(){
            searchToggle();
        });

        $('query').activate();

    }else{
       var currentquery = $('query').getValue();
       $('query').stopObserving('blur');
       if(currentquery.length > 0)
       {
            $('searchselect').update(currentquery);
       }else{
            $('clear_search').remove();
            clearSearch();

       }
       $('searchselect').observe('click', searchMonitor)
    }

}


function reload(category)
{
    isLoading(true);

    new Ajax.Updater('directory_results', '/directory', {
        parameters: {category_id: category, content: content} ,
            evalScripts: true,
            onComplete: loadComplete
        } )

    addReset('category');
}

function distload(distance)
{

    // check for a zipcode
    if($('zipfield'))
    {
        var zip = $('zipfield').getValue();
    }else{
        var zip = $('zipvalue').innerHTML;
    }

    if(isNaN(zip))
    {
        addReset('distance');
        zipMonitor();
    }else{
        zipError('');
        isLoading(true);

        new Ajax.Updater('directory_results', '/directory', {
            parameters: {distance: distance, zip: zip, content: content} ,
            evalScripts: true,
            onComplete: loadComplete
        } )

        addReset('distance');
        addReset('zip');
    }
}

function zipError(error)
{
    if($('ziperror'))
    {
        $('ziperror').update(error);
    }
}

function zipload(zip)
{
    // validate zipcode input
    if(isNaN(zip))
    {
        zipError('zipcodes must contain 5 digits only');
    }else{
        // clear any errors
         zipError('');

        // get the currently selected distance
        var distance = trim($('distvalue').innerHTML);
        distance = distance.substring(0, distance.indexOf(' '));

        if(isNaN(distance))
        {
            $('distvalue').innerHTML = '25 miles';
            addReset('distance');
            distance = 25;
        }

        isLoading(true);

        // load the search results
        new Ajax.Updater('directory_results', '/directory', {
            parameters: {zip: zip, distance: distance, content: content} ,
            evalScripts: true,
            onComplete: loadComplete
        } )

        addReset('zip');
    }
}

function zipToggle()
{
    // check for zipfield already present
    if(!$('zipfield'))
    {
        var currentzip = trim($('zipvalue').innerHTML);
        if(isNaN(currentzip))
        {
            currentzip = "";
        }

        $('zipselect').update('<input id="zipfield" value="'+currentzip+'" ></input><div id="ziperror"></div>');

      // set focus to the new zip input
        $('zipfield').activate();

      // disable observation while entering text
        $('zipselect').stopObserving('click');
    }else{
        var currentzip = trim($('zipfield').getValue());
        if(currentzip == "")
        {
            currentzip = "any zipcode";
        }
        $('zipselect').update(
            '<span id="zipvalue">'+currentzip+'</span>'
        );
        $('zipselect').observe('click', zipMonitor)
    }
}

function zipMonitor()
{
    zipToggle();

    // watch for 5 digit entry and autoload results
    $('zipfield').observe('keyup',
        function(event){
          var zipstring =  this.getValue();

          // watch for 'return' and toggle field back to initial display state
          if(event.keyCode == Event.KEY_RETURN)
          {

            zipToggle();
            $('zipselect').observe('click', zipMonitor);

          }else{

            if(zipstring.length == 5)
            {
              // submit search request
                zipload(zipstring);

          // prevent additional characters from being input
            }else if(zipstring.length > 5){
                zipstring = zipstring.substring(0,5);
                this.setValue(zipstring);
            }

          }
        }
      );

    $('zipfield').observe('blur', function(){
        zipToggle();
    });
}

function searchMonitor()
{
    searchToggle();

    // disable observation while entering text
    $('searchselect').stopObserving('click');

    $('query').observe('keyup',
        function(event)
        {
           var searchterms = escape(this.getValue());
           clearTimeout(searchTimeoutID);

           if(searchterms.length > 0)
           {
               if(event.keyCode == Event.KEY_RETURN)
               {
                 searchLoad(searchterms);
                 searchToggle();
               }else{
                   searchTimeoutID = setTimeout('submitSearch("'+searchterms+'")', 1000);
               }
           }
        }
    );

}

function submitSearch(searchterms)
{
    clearTimeout(searchTimeoutID);
    searchLoad(searchterms);
}

function clearCrit(event)
{
    Event.stop(event);

    var criteria = this.id.split("_")[1];

    // clearing distance or zip clears the other too
    if(criteria == 'zip' || criteria == 'distance')
    {
        $('clear_zip').remove();
        $('clear_distance').remove();
    }else{
        this.remove();
    }

    reset(criteria);

    isLoading(true);

    new Ajax.Updater('directory_results', '/clear_single', {
        parameters: { criteria: criteria },
        evalScripts: true,
        onComplete: loadComplete
    } )

}

function clearSearch()
{

    reset('search');

    isLoading(true);

    new Ajax.Updater('directory_results', '/clear_single', {
        parameters: { criteria: 'search' },
        evalScripts: true,
        onComplete: loadComplete
    } )
}

function reset(criteria)
{
    switch(criteria)
    {
        case 'category':
            $('categoryselect').update('Businesses');
            break;
        case 'search':
            $('searchselect').update('any terms');
            break;
        case 'distance':
            $('distanceselect').update('<span id="distvalue">any distance</span>');
            $('zipselect').update('<span id="zipvalue">any zipcode</span>');
            $('zipselect').observe('click', zipMonitor)
            break;
        case 'zip':
            $('distanceselect').update('<span id="distvalue">any distance</span>');
            $('zipselect').update('<span id="zipvalue">any zipcode</span>');
            $('zipselect').observe('click', zipMonitor)
            break;
    }
}

function addReset(field)
{
    if(!$('clear_'+field))
    {
        var reset = '<a id="clear_'+field+'" class="crit_cancel" href="#" ><img src="/images/icons/greyx.png" width="16px" height="16px" /></a>'
        $(field+'select').insert({ 'before': reset });
        $('clear_'+field).observe('click', clearCrit);
    }
}

function loadContent(event)
{
    Event.stop(event);
    var content = this.id.split('_')[0];

    isLoading(true);

    new Ajax.Updater('directory_results', '/'+content, {
        parameters: {content: content},
        evalScripts:true,
        onComplete: loadComplete
    } )
}

function activateTabs()
{
     $('businesses_tab').observe('click', loadContent);
     $('coupons_tab').observe('click', loadContent);
     $('events_tab').observe('click', loadContent);
     $('blogs_tab').observe('click', loadContent);
}

function activateMapLinks()
{
    $$('.master').invoke('observe','mouseover', moveTo);
}


document.observe('dom:loaded', function(){

    $('categoryselect').observe('click',
        function(){
            $('catoptions').toggle();
        }
    )

    $('distanceselect').observe('click',
        function(){
            $('distoptions').toggle();
            if($('zipfield'))
            {
                zipToggle();
            }
        }
    )

    $('searchselect').observe('click', searchMonitor)

    $('zipselect').observe('click', zipMonitor)

    $('catoptions').childElements().each(
        function(i)
        {
            i.observe('click', function()
            {
                var idElements = i.identify().split("_");
                reload(idElements[1]);
                $('catoptions').toggle();
                $('categoryselect').update(i.innerHTML);
            })
        }
    )

     $('distoptions').childElements().each(
        function(i)
        {
            i.observe('click', function()
            {
                var idElements = i.identify().split("_");
                distload(idElements[1]);
                $('distoptions').toggle();
                $('distanceselect').update('<span id="distvalue">'+i.innerHTML+'</span>');
            })
        }
    )

    if($('clear_category')){
        $('clear_category').observe('click', clearCrit);
    }

    if($('clear_search')){
        $('clear_search').observe('click', clearCrit);
    }

    if($('clear_distance')){
        $('clear_distance').observe('click', clearCrit);
    }

    if($('clear_zipcode')){
        $('clear_zipcode').observe('click', clearCrit);
    }

    activateMapLinks();

})
