var iCur = 0;
var iRes = 0;
var iFailure = 0;
var iNights = 0;
var catbLoadSkip = false;
var liveRequests = new Array();

liveSearch = 
{

	init: function()
	{
  		this.requestURL = '/services/LiveSearchJson.aspx';
        this.domReady();
	},
	
    domReady: function()
	{
		window.addEvent('domready', function() {
		    $E('#ddlSort select').disabled = true;
		    $E('#ddlSort select').selectedIndex = 0;
		    var views = $ES('.ratingVersion');
		    if (views)
		    {
	            $ES('.ratingVersion').addEvent('click', function()
	            {
	                catbLoadSkip = true;       
	                for (var i = 0; i < liveRequests.length; i++)
	                {
	                    liveRequests[i].cancel();
	                }
	            });
		     }
            liveSearch.configureInputs();
		    liveSearch.loadLiveRequest();

        });
	},
	
	loadLiveRequest: function()
	{
		if(window.cat_b_ids)
		{
			this.checkFeeds(window.cat_b_ids);	
		} else {
            $E('#filterLoader').setStyle('visibility', 'hidden');
			$E('#ddlSort select').disabled = false;
            var sort = $E('#ddlSort');
            liveSearch.sorting(sort);	
		}
	},
	
	configureInputs: function()
	{
		this.page_Date   = $('ctl00_cphMaincontent_dpArrivalDate_DateTextBox').value;
		this.page_Nights = $('ctl00_cphMaincontent_cboLengthOfStay').value;
		this.page_Curr   = $('ctl00_cphMaincontent_currencyIso').value;
	},
	
	checkFeeds: function(inJson)
	{
	    var feedChain = new Chain();

	    for (var index in inJson)
	    {
	        var fnc = liveSearch.feedChain(inJson[index]);
	        feedChain.chain(fnc);    
	    }
	    
	    var feedChainRunner = function()
	    {
	        if (feedChain.chains.length > 0) { feedChain.callChain(); }
	        if (feedChain.chains.length == 0) { feedChain = $clear(timer); }
	    };
	    var timer = feedChainRunner.periodical(50);
	},
	
	feedChain: function(feed)
	{
	    return function() { liveSearch.createRequest(feed); };
	},
	
	createRequest: function(inFeed)
	{
	    var countryId = $('PageCountryID').value;
        var regionId = $('PageRegionID').value;
        var locationId = $('PageLocationID').value;
        var minPrice = $('ctl00_cphMaincontent_minPrice').value;
        var maxPrice = $('ctl00_cphMaincontent_maxPrice').value;
	    var uri = '?a=' + this.page_Date;
		uri += '&n=' + this.page_Nights;
		uri += '&cr=' + this.page_Curr;
		uri += '&c=' + countryId;
		uri += '&r=' + regionId;
		uri += '&l=' + locationId;
		if (minPrice) { uri += '&mn=' + minPrice; }
		if (maxPrice) { uri += '&mx=' + maxPrice; }
		uri += '&d=' + inFeed.feed_id;
		
		iNights = this.page_Nights;
		
		var request = '';
	
	    var i = 0;
	    for (var apId in inFeed.ap_list)
		{
		    i = i + 1;
			request += inFeed.ap_list[apId] + '|';
			
			if (i % 300 == 0)
			{
			    liveSearch.asyncRequest(uri, request);
			    request = '';
		}	
		}
		
		if (request != '')
		{
		    liveSearch.asyncRequest(uri, request);
		}
   
	},
	
	asyncRequest: function(url, data)
	{
	    if (!catbLoadSkip) 
	    {
            iCur += 1;
	        var doRequest = new Json.Remote(liveSearch.requestURL + url, 
                { 
                    async: true,
	                method: 'get', 
                    onSuccess: liveSearch.feedSuccess, 
                    onFailure: liveSearch.feedFailure 
                }).send(data); 
            liveRequests.unshift(doRequest);
	    }
	},
	
	weekendOffset: function()
	{
	    var offset = 0;
	    var tds = $('catbresults').getElements('.headerRow');

        for (var i = 1; i < tds.length; i++)
        {
            if (tds[i].getProperty('class').contains('weekend')) 
            {
                if (i + 1 < tds.length && tds[i + 1].getProperty('class').contains('weekend'))
                {
                    offset++;
                }
                break;
            } else {
                offset++;
            }
        }

	    return offset;
	},
	
	renderRow: function(item, i)
	{
        var tbody = $('catbresults').getElement('tbody');
        var nights = iNights;
        var wendOffset = liveSearch.weekendOffset(); //days till first weekend day
        var webId = $('PageWebID').value;
        var countryId = $('PageCountryID').value;
        var regionId = $('PageRegionID').value;
        var locationId = $('PageLocationID').value;
        var currencyId = $('ctl00_cphMaincontent_ddlCurrency').value;
        var arrivalDate = $('ctl00_cphMaincontent_arrivalDate').value;
        var error = false; 
        var rate = '';

        var newTR = new Element('tr');         
        var nameTD = liveSearch.createNameTD(item, countryId, regionId, locationId, arrivalDate, currencyId, nights, webId);
        var viewTD = liveSearch.createViewTD(item, countryId, regionId, locationId, arrivalDate, currencyId, nights, webId);

        newTR.adopt(nameTD);
        newTR.adopt(viewTD);

        Garbage.elements.remove(nameTD);          
        Garbage.elements.remove(viewTD);

        var wendCounter = wendOffset;
        
        for (i = 0; i < 14; i++)
        {
            var wend = false;

            if (wendCounter <= 1)
            {
                wend = true;
                if (wendCounter == 0)
                { 
                    wendCounter = 6;
                } else {
                    wendCounter--;
                }
            } else {
                wendCounter--;
            }

            if (i < nights)
            {
                rate = item.rate; 
            }
            else
            {
                rate = '';
            }
            
            var rateTD = liveSearch.createPriceTD(rate, wend);
            newTR.adopt(rateTD); 
            Garbage.elements.remove(rateTD);
        }

        tbody.adopt(newTR);
        Garbage.elements.remove(newTR);
    },
	
	feedFailure: function(request)
	{
	    if (catbLoadSkip) return;
	    
	    iFailure += 1;
        liveSearch.finishedLoading();
	},
	
	feedSuccess: function(json)
	{
	    if (catbLoadSkip) return;
	    
        var results = eval(json);

        if (results.length <= 0 || (results.length > 0 && results[0].error))
        {
            iFailure += 1;
            liveSearch.finishedLoading();
        }
        else
        {
          var count = results.length;
          error = false;
          var myChain = new Chain();
          
          results.each(function(item, i)
          {
            if (i == 0)
            {
                liveSearch.renderRow(item, i);
            } else { 
                myChain.chain(function(){
                    if (catbLoadSkip) return;
                    liveSearch.renderRow(item, i);
                    if (i == count - 1)
                    {
                         liveSearch.finishedLoading();
                    }
                });
            }
          });
          
          if (count > 1)
          {
              var runChain = function() { 
                for (var i = 0; i < 3; i++)
                {
                    if (catbLoadSkip) { runChain = $clear(timer); return; } 
                    if (myChain.chains.length > 0) { myChain.callChain(); }
                }
			    if (myChain.chains.length == 0) { runChain = $clear(timer); } 
		      }
    				
              var timer = runChain.periodical(100);
          }
          else
          {
            liveSearch.finishedLoading();
          }
          
          $('catbresults').getElement('thead').setStyle('display', '');
          $('catbresults').getElement('tbody').setStyle('display', '');

        }

	},	
	
	sorting: function(sort)
	{
	    sort.getElement('select').addEvent('change', function(sort) {
            if ($E('#ddlSort select').value != '')
            {
                $ES('.searchResultsTable').each(function (item, i)
                {
                    var rows = new Array;
                    var tbody = item.getElement('tbody');
                    
                    //hide
                    tbody.setStyle('display', 'none');
                    
                    //move
                    var trs = tbody.getElements('tr');
                    
                    var rowBreak;
                    
                    while(trs.length > 0)
                    {
                        //headerRow place-name
                        var row = { row: trs.shift().remove() };
                        
                        if (row.row.getElement('td').getProperty('class').contains('headerRow place-name'))
                        {
                            rowBreak = row.row;    
                        } else {
                            rows.unshift(row);
                        }
                    }
                    
                    //sort
                    if ($E('#ddlSort select').value == 'name')
                    {
                        rows.sort(liveSearch.compareByName.bind(this));
                    } else if ($E('#ddlSort select').value == 'rating') {
                        rows.sort(liveSearch.compareByRating.bind(this));
                    }               
                    
                    var rCount = 0;
                    //add
                    while (rows.length > 0)
                    {
                        if (rCount !== 0 && rCount % 10 === 0)
                        {
                            if (rowBreak != null)
                            {
                                rowBreak.clone().injectInside(tbody);
                            }
                        }
                        
                        var row = rows.shift();
                        row.row.injectInside(tbody);
                        rCount++;
                    }
                    this.rows = false;              
                    
                    //show
                    tbody.setStyle('display', '');
                });
            }
        });                      
	},
	
	finishedLoading: function()
	{
	    if (catbLoadSkip) return;
	    iRes += 1;
               
        if(iRes == iCur)
        {
            var el = document.getElementById('UpdateArea1');
            el.style.display = 'none';

            var sort = $E('#ddlSort');
            liveSearch.sorting(sort);
            
            $E('#ddlSort select').disabled = false;
            $E('#filterLoader').setStyle('visibility', 'hidden');
            
            var tables = $$('.searchResultsTable');
            
            if (iFailure == iCur && tables && tables.length <= 1)
            {
                $E('#catbresults').setStyle('display', 'none');
                var noAvail = new Element('div', { 'class':'no-availability' });
                noAvail.setHTML('Sorry, we have no rooms available for your selection. Please choose another location or change your dates of stay.');
                $E('#bodyArea .singleColTable').adopt(noAvail);
            }
        }
	},
	
	compareByName: function(r1, r2)
	{
        r1.compare_name = r1.row.getElement('.apName').getText();
        r2.compare_name = r2.row.getElement('.apName').getText();
        
        if ( r1.compare_name > r2.compare_name ) { return  1 }
        if ( r1.compare_name < r2.compare_name ) { return -1 }
        
        return 0;   
	},
	
	compareByRating: function(r1, r2)
	{
	    var rate1 = r1.row.getElement('.apSortRating');
	    var rate2 = r2.row.getElement('.apSortRating');
        var result = 0;
	    
	    if (rate1)
	    {
	        r1.compare_value = rate1.getText();    
	    }
	    
        if (rate2)
        {   
            r2.compare_value = rate2.getText();
        }
        
        if (rate1 && rate2)
        {
            if (r1.compare_value < r2.compare_value)
            {
                result = 1;
            }
            
            if (r1.compare_value > r2.compare_value)
            {
                result = -1;
            }
        } else {

            //which one(s) isnt defined?
            if (rate1)
            {
                result = -1;
            } else if (rate2) {
                result = 1;
            } else {
                result = 0;
            }
            
        }
               
        if (result == 0)
        {
            result = liveSearch.compareByName(r1,r2);
        }
        
        return result;
	},
	
	createViewTD: function createViewTD(item, countryId, regionId, locationId, arrivalDate, curId, nights, webId)
	{
        var bookRatingTD = new Element('td', {
            'class': 'dataRow bookingAndRating'
        });
        
        var span = new Element('span');
        
        var aaa = new Element('a', { 
            'class':'mini-blue-button ratingVersion',
            'href': liveSearch.createLink(item, countryId, regionId, locationId, arrivalDate, curId, nights, webId)
        });
        
        aaa.setHTML('View');
        
        aaa.addEvent('click', function()
	    {
            catbLoadSkip = true;       
            for (var i = 0; i < liveRequests.length; i++)
            {
                liveRequests[i].cancel();
            }
	    });
	    
        span.adopt(aaa);
                     
        var img;
        if (item.image_string != '')
        {
            var newRatingSortSpan = new Element('span', {
                'class': 'apSortRating'
            });
            newRatingSortSpan.setHTML(item.sortable_rating);
            
            img = new Element('img', {
                'alt':item.rating,
                'src':item.image_string,
                'class':'apRating'
            });
            span.adopt(img);
            span.adopt(newRatingSortSpan);
            
            Garbage.elements.remove(newRatingSortSpan);
            Garbage.elements.remove(img);
        }
        
        bookRatingTD.adopt(span);

        Garbage.elements.remove(aaa);          
        Garbage.elements.remove(span); 
               
        return bookRatingTD;
	},
		
    createNameTD: function createNameTD(item, countryId, regionId, locationId, arrivalDate, curId, nights, webId)
    {
        
      var newTD = new Element('td', {
	    'class': 'dataRow dr-place-name'
      });
      
      var newA = new Element('a', {
	    'class': 'apLink dr-place-name',
	    'href': liveSearch.createLink(item, countryId, regionId, locationId, arrivalDate, curId, nights, webId) 
      });
      
      var newNameSpan = new Element('span', {
	    'class': 'apName'
      });

      newNameSpan.setHTML(item.name);
      
      var newLocationSpan = new Element('span', {
	    'class': 'apLocation'
      });

      newLocationSpan.setHTML(item.location);
      
      newA.adopt(newNameSpan);
      newTD.adopt(newA);
      newTD.adopt(newLocationSpan);

      Garbage.elements.remove(newNameSpan);          
      Garbage.elements.remove(newA);
      Garbage.elements.remove(newLocationSpan); 
         
      return newTD;
    },

    createPriceTD: function(rate, wend)
    {
	    var style;
    	
	    if (wend)
	    {
		    style = 'dataRow w-end';
	    }
	    else
	    {
		    style = 'dataRow';
	    }
    	
	    var newTD = new Element('td', { 'class':style });
    	
	    if (rate.length	> 0)
	    {
		    newTD.setHTML(rate);
	    }
	    else
	    {
		    var newEm = new Element('em');
		    newEm.setHTML('Quote');
		    newTD.adopt(newEm);
		    Garbage.elements.remove(newEm);
	    }
    	
	    return newTD;
    },
    
    createLink: function(item, countryId, regionId, locationId, arrivalDate, curId, nights, webId)
    {
        return '/AccommodationProviderDetails.aspx?cID=' + countryId + '&rID=' + regionId + '&lId=' + locationId + '&apID=' + item.id + '&WebID=' + webId + '&Duration=' + nights + '&sDate=' + arrivalDate + '&curID=' + curId;
    }

}

liveSearch.init();
