/*
------------------------------------
             ThermWet
     http://www.thermwet.cz
------------------------------------
      (c)2009 Jakub Karlec
  e-mail: jakub.karlec@weblogic.cz
------------------------------------
   	      JavaScript
       created: 05/03/09
       updated: 25/07/09
------------------------------------
*/

/**
 * This class defines basic page effects etc.
 */
var GlobalBehaviour = new Class({
  
  expandableLinks: '',
  
  initialize: function(expandableLinks){
    this.menuRoundedCorners();
    this.expandableSearchBox();
    this.expandableLinks = expandableLinks;
    if(this.expandableLinks){
      this.expandLinks();
    }
    this.initializeAntispam();
    this.equalColumnHeights();
  },
  
  /**
   * Create rounded corners on menu by adding absolutely positioned
   * span elements with css asigned background
   */
  menuRoundedCorners: function(){
    var leftBracket = new Element('span',{
      'class': 'leftBracket'
    });
    var rightBracket = new Element('span',{
      'class': 'rightBracket'
    });
    $('menu').adopt(leftBracket,rightBracket);
  },

  /**
   * Create rounded corners on menu by adding absolutely positioned
   * span elements with css asigned background
   */
  expandableSearchBox: function(){
    if($('searchResults') && $('search').value.length > 0){
      $('searchResults').set('html','<img src="images/ico-loader.gif" alt="Načítám ..." />');
    }
    else if($('searchResults')){
      $('searchResults').set('html','');
    }
    //hide searchbox inputs
    if($('search').value.length < 1){
      $('searchBox').addClass('js');
    }

    $('searchBox').addEvents({
      'mouseenter': function(){
        this.removeClass('js');
      },
      'mouseleave': function(){
        if($('search').value.length < 1){
          this.addClass('js');
        }
      }
    });
  },

  /**
   * Create separator between main content and side content columns
   * by equaling column heights
   */
  equalColumnHeights: function(){
    var sideContent = $('sideContent');
    var mainContent = $('content');
    if(mainContent.getSize().y > sideContent.getSize().y){
      sideContent.setStyle('height', (mainContent.getSize().y - mainContent.getStyle('padding-bottom').toInt()));
    }
  },
  
  /**
   * Expands links in specified boxes into clickable boxes
   */
  expandLinks: function(expandableLinks){
    $$('.expandableLink').each(function(item){
      item.addEvents({
        'mouseenter': function(){
          this.addClass('expandableLinkOver');
        },
        'mouseleave': function(){
          this.removeClass('expandableLinkOver');
        },
        'click': function(){
          location.href = this.getElement('a').href;
        }
      });
    });
  },

  /**
   * Prefil anti-spam field with required value
   */
  initializeAntispam: function(){
    if($('cislovka')){
      $('cislovka').value = '5';
      $('cislovka').getParent().addClass('noDisplay');
    }
  }
  
});

/**
 * This class turns static page elements into tabs
 */
var TabSwitcher = new Class({
  
  Implements: Options,
  options: {
    autoswitch: 10000
  },
  
  switchTimer: null,
  
  initialize: function(options){
    this.setOptions(options);
    this.createNavigation();
    if(this.options.autoswitch > 0){
      this.switchTimer = this.switchClaim.periodical(this.options.autoswitch);
    }
    this.attachSwitcher();    
  },
  
  /**
   * Create tabs navigation
   */
  createNavigation: function(){
    var fxduration = 1000;
    var olNavi = new Element('ol');
    var claimBar = $('claimBar');

    var claims = [];
    
    var liNavi = new Element('li');
    
    liNavi.addEvents(
          {
              'click': function(){
                $$('#claimBar li').each(function(item){
                  item.removeClass('selected');
                });
                this.addClass('selected');
                
                $$('#claimBar img').each(function(item){
                  item.set('tween', { duration: fxduration }).fade(0);
                  //item.set('class', 'hiddenClaim');
                  if(item.get('src') == 'images/claim-'+this.get('text')+'.jpg'){
                    item.set('tween', { duration: fxduration }).fade(1);
                    //item.removeClass('hiddenClaim');
                  }
                },this);
                
                $clear(this.retrieve('switcher'));
              },
              'mouseenter': function(){
                this.addClass('pointed');
              },
              'mouseleave': function(){
                this.removeClass('pointed');
              }
          }
        );
    
    claims.include($$('#claimBar img'));
    claims.include(new Element('img',{
      'src': 'images/claim-2.jpg',
      'alt': ''
    }));
    claims.include(new Element('img',{
      'src': 'images/claim-3.jpg',
      'alt': ''
    }));
    claims.include(new Element('img',{
      'src': 'images/claim-4.jpg',
      'alt': ''
    }));
    claims.include(new Element('img',{
      'src': 'images/claim-5.jpg',
      'alt': ''
    }));
    //console.log(claims);
    
    claims.each(function(item, index){
      if(index === 0){
        olNavi.adopt(liNavi.clone().set({'class': 'selected', 'html': index + 1}).cloneEvents(liNavi));
        claimBar.adopt(item);
      }
      else{
        olNavi.adopt(liNavi.clone().set('html', index + 1).cloneEvents(liNavi));
        claimBar.adopt(item.set('tween', { duration: 1 }).fade(0));
      }
    });
    
    claimBar.adopt(olNavi);    
  },
  
  /**
   * Switch claim to the next (following) claim
   */
  switchClaim: function(){
    var fxduration = 1000;
    
    var currentClaim = $$('#claimBar li.selected');
    currentClaim.removeClass('selected');
    $('claimBar').getElement('img[src=images/claim-'+currentClaim.get('text')+'.jpg]').set('tween', { duration: fxduration }).fade(0);
    if(currentClaim.get('text') < 5){
      currentClaim.getNext().addClass('selected');
      $('claimBar').getElement('img[src=images/claim-'+currentClaim.getNext().get('text')+'.jpg]').set('tween', { duration: fxduration }).fade(1);
    }
    else{
      $('claimBar').getElement('li').addClass('selected');
      $('claimBar').getElement('img[src=images/claim-1.jpg]').set('tween', { duration: fxduration }).fade(1);
    }
    //console.log(el.get('text'));
  },
  
  /**
   * Attach switcher object to tabs
   */
  attachSwitcher: function(){
    $$('#claimBar li').each(function(item){
                  item.store('switcher', this.switchTimer);
                }, this);
  }
  
});


/**
 * This calculates ThermWet savings etc.
 */
var ThermwetSavingsCalculator = new Class({

  Implements: Options,
  options: {
    //plocha_domu: 0, //Obytná plocha domu *
    //ztrata_domu: 0, //Tepelná ztráta domu na m2 *
    //naklady_rocni: 0, //Cena za roční vytápění objektu *
    cena_prumerna_energie: 2046, //Průměrná cena za MWh el.energie s DPH #
    ztrata_vetrani: 0.5, //Ztráty větráním
    ucinnost: 0.82, //Maximální účinnost rekupátorů ThermWet #
    delay: 3000
    //ztrata_vetrani_abs: 0.5, //Ztráty větráním v kW/m2 #
    //ztrata_vetrani: 0, //Ztráty větráním
    //ztrata_celkova: 0, //Celková tepelná ztráta domu
    //ztrata_celkova_vetrani: 0, //Celková tepelná ztráta větráním
    //naklady_predpokladane: 0, //Předpokládané roční náklady na vytápění
    //naklady_vetrani: 0, //Finanční ztráta větráním
    //uspora_tepelna: 0, //Tepelná úspora rekuperace
    //uspora_financni: 0, //Finanční úspora rekuperace
    //formElement: ''
    //images
  },

  switchTimer: null,

  initialize: function(el, options){
    this.setOptions(options);
    this.error = new Hash();
    this.formElement = el;
    this.winScroller = new Fx.Scroll(window);
    this.switchFields();
    this.images = [];

    this.images[0] = new Asset.image('images/ico-calculator-small.png', {'class': 'loader', 'alt': ''});
    this.images[1] = new Asset.image('images/ico-loader.gif', {'alt': 'Načítám ...'});

    $(this.formElement).addEvent('submit', function(event){
      event.preventDefault();
      this.runCalculation();
    }.bind(this));
    $$('input[name=calculation_type]').addEvent('click', function(){
      this.switchFields();
    }.bind(this));
  },

  /**
   * Decide which calculation to use
   */
  calculate: function(){
    if($('calculation_type_1').checked){
      return this.calculatePrice();
    }
    else{
      return this.calculateCosts();
    }
  },

  /**
   * Calculate costs from costs per year
   */
  calculateCosts: function(){
    return Math.round(this.naklady_rocni * this.options.ztrata_vetrani * this.options.ucinnost);
  },

  /**
   * Calculate costs from place dimensions and ventilation loses
   */
  calculatePrice: function(){
    this.ztrata_vetrani_abs = this.ztrata_domu * this.options.ztrata_vetrani;
    this.ztrata_celkova = this.ztrata_domu * this.plocha_domu / 1000;
    this.ztrata_celkova_vetrani = this.options.ztrata_vetrani * this.ztrata_celkova;
    this.naklady_predpokladane = this.options.cena_prumerna_energie * this.ztrata_celkova;
    this.naklady_vetrani = this.options.cena_prumerna_energie * this.ztrata_celkova_vetrani;
    this.uspora_tepelna = this.ztrata_celkova_vetrani / this.options.ucinnost;

    this.uspora_financni = this.naklady_vetrani * this.options.ucinnost;

    return Math.round(this.uspora_financni);
  },

  /**
   * Validate form
   */
  validate: function(){
    this.error.empty();
    if($('calculation_type_1').checked){
      if(this.isInteger($('plocha')) && $('plocha').get('value').toInt() > 0){
        this.plocha_domu = $('plocha').get('value').toInt();
      }
      else{
        this.error.set('plocha', 'Pole Obytná polocha domu musí být kladné celé číslo.');
      }
      if(this.isInteger($('ztrata')) && $('ztrata').get('value').toInt() > 0){
        this.ztrata_domu = $('ztrata').get('value').toInt();
      }
      else{
        this.error.set('ztrata', 'Pole Tepelná ztráta domu musí být kladné celé číslo.');
      }
    }
    else{
      if(this.isInteger($('cena')) && $('cena').get('value').toInt() > 0){
        this.naklady_rocni = $('cena').get('value').toInt();
      }
      else{
        this.error.set('cena', 'Pole Cena za roční vytápění objektu musí být kladné celé číslo.');
      }
    }
  },

  /**
   * Run calculation
   */
  runCalculation: function(){
    var errorMsg = '';

    this.validate();
    $(this.formElement).getElements('input').removeClass('errorValue');
    //console.log(this.error);
    if(this.error.getLength() > 0){
      this.error.each(function(item, index){
        $(index).addClass('errorValue');
        errorMsg += item+'\n';
      });
      alert(errorMsg);
      //console.log('error');
    }
    else{
      if(this.resultsBox){
//        this.winScroller.toElement('calculatorResult').chain(
//          function(){
//            this.myVerticalSlide.slideOut().chain(
//              function(){
//                this.resultsBox.getElement('p span').set('html', this.calculate()+',- Kč');
//                this.myVerticalSlide.slideIn()
//              }.bind(this)
//            )
//          }.bind(this));
        this.winScroller.toElement('calculatorResult').chain(
          function(){
            (function(){this.resultsBox.getElement('p span').set('html', this.calculate()+',- Kč');}.bind(this)).delay(500);
          }.bind(this)
        );

      }
      else{
        this.resultsBox = new Element('div',{
          'id': 'calculatorResult',
          'class': 'calculatorResult calculatorLoading calculatorResultAdv',
          'html': '<div></div>'
        });
        
        this.resultsBox.getElement('div').setStyle('height','230px').adopt(this.images[0],new Element('br'),this.images[1]);
        this.resultsBox.inject(this.formElement, 'before');

        this.myVerticalSlide = new Fx.Slide(this.resultsBox);

        this.myVerticalSlide.hide();
        this.myVerticalSlide.slideIn().chain(function(){
          this.winScroller.toElement('calculatorResult');
        }.bind(this));

        (function(){
          this.resultsBox.removeClass('calculatorLoading');
          this.resultsBox.getElements('img').destroy();
          this.resultsBox.getElement('div').set('html',
              '<p>'+
                'Pořízením rekuperátorů ThermWet můžete ročně ušetřit až <span>'+this.calculate()+',- Kč</span> na výdajích za vytápění!<br />'+
                'Začněte šetřit již dnes!'+
              '</p>'+
              '<ul>'+
                '<li><a href="poptavkovy-formular" class="readMore">Mám zájem o cenovou kalkulaci</a></li>'+
                '<li><a href="kontakty" class="readMore">Mám zájem o další informace</a></li>'+
              '</ul>'
          );
        }.bind(this)).delay(this.options.delay);
      }
      
    }
  },

  /**
   * Switch fields acording to selected calculation tye
   */
  switchFields: function(){
    if($('calculation_type_1').checked){
      $('cena').getParent().addClass('noDisplay');
      $('plocha').getParent().removeClass('noDisplay');
      $('ztrata').getParent().removeClass('noDisplay');
    }
    else{
      $('plocha').getParent().addClass('noDisplay');
      $('ztrata').getParent().addClass('noDisplay');
      $('cena').getParent().removeClass('noDisplay');
    }
  },

  /**
   * form validation functions
   */
  isEmpty: function(element){
    return ((element.get('value') === null) || (element.get('value').length === 0));
  },
  isInteger: function(element){
    return (/^-?[1-9]\d*$/).test(element.get('value'));
  }

});

/* ONLOAD EVENT TRIGER */
window.addEvent('domready', function() {

  /* INIT CALLS */
  new GlobalBehaviour('expandableLink');

  if($('claimBar')){
    new TabSwitcher();
  }

  if($('calcForm')){
    savingsCalc = new ThermwetSavingsCalculator('calcForm');
  }
  
});

/* GOOGLE SEARCH */
google.load("search", "1");

var webSearch;

function addPaginationLinks() {
  // The cursor object has all things to do with pagination
  var cursor = webSearch.cursor;
  var curPage = cursor.currentPageIndex; // check what page the app is on
  var pagesDiv = new Element('ol', {'class': 'paging'});

  cursor.pages.each(function(item, index){
    if (curPage == index) { // if we are on the curPage, then don't make a link
      var label = new Element('em',{'text':' ' + item.label + ' '});
      pagesDiv.adopt(new Element('li').adopt(label));
    } else {
      // If we aren't on the current page, then we want a link to this page.
      // So we create a link that calls the gotoPage() method on the searcher.
      var link = new Element('a',{'href':'javascript:webSearch.gotoPage('+index+');',
        'text':item.label
      });
      link.setStyle('margin-right', '2px');
      pagesDiv.adopt(new Element('li').adopt(link));
    }
  });

  var contentDiv = $('searchResults');
  contentDiv.adopt(pagesDiv);
}

function searchComplete() {
	// Grab our content div, clear it.
	var contentDiv = $('searchResults');

	if (contentDiv) {
		var resultList = new Element('dl');

		// Check that we got results
		if (webSearch.results && webSearch.results.length > 0) {
			// Loop through our results, printing them to the page.
			webSearch.results.each(function(item, index){
				// For each result write it's title and image to the screen
				var result = item;
				var resultContainer = new Element('dt');

				var title = new Element('a',{'text': result.titleNoFormatting, 'href': result.unescapedUrl});
				var content = new Element('dd',{'html': result.content+'<br /><span>'+result.url+'</span>'});
      
				resultContainer.adopt(title);
				resultList.adopt(resultContainer);
				resultList.adopt(content);
			});
			contentDiv.adopt(resultList);

			// Now add the paging links so the user can see more results.
			addPaginationLinks(webSearch);
		} else {
			contentDiv.set('text', 'Na dotaz "'+$('search').value+'" nebylo nic nalezeno.');
		}
	}
}

function OnLoad() {
  webSearch = new google.search.WebSearch();
  webSearch.setResultSetSize(google.search.Search.LARGE_RESULTSET);
  webSearch.setSiteRestriction('thermwet.cz');
  webSearch.setSearchCompleteCallback(this, searchComplete, null);
  webSearch.execute($('search').value);
}

google.setOnLoadCallback(OnLoad);
