var SiteController = Class.create({
  initialize : function(config) {
    this.config = config || {};

    var self = this;

    //if(!this.config.baseURL || !this.config.siteURL || !this.config.category)
    if(!this.config.baseURL || !this.config.category)
      throw new Error('Cannot initialize SiteController.');

    if(config.filters && config.filters.url)
      this.initFilters();

    if(config.search && config.search.url)
      this.initSearch();

    if(config.results && config.results.url && config.results.options) {
      this.initSortList();
      this.initScreensList();
      this.initSizeList();
      this.initNavigation();
      this.initResultBrowser();
    }

    this.initMostViewed();

    if(config.hasShadowbox)
      this.initShadowbox();

    if(config.preview)
      this.initPreview();

    if(config.videoPlayer)
      this.initVideoPlayer();
    
    if(config.layers)
      this.initLayers();
  },

  initFilters : function() {
    this.fs = $A();

    var list = $('filter-list');
    if(list == null)
      return;

    var filters = $('filter-list').select('.menu-item');
    for(var i = 0; i < filters.length; i++) {
      var list = new SelectableList(filters[i].select('.top')[0], {
        className : 'checkbox',
        classNameSelected : 'checkbox-checked',
        allowMultipleSelection : true
      });

      var checkbox = new CheckBox(filters[i].select('.bottom')[0].select('.checkbox')[0]);

      //set onChange handler and bind checkbox object to its scope
      list.onChange = function(object) {
        if(object.getSelectedElements().length == object.length)
          this.checkbox.setChecked(true);
        else
          this.checkbox.setChecked(false);
      }.bind({
        checkbox : checkbox
      });

      //set onChange handler and bind list object to its scope
      checkbox.onChange = function(object) {
        if(object.isChecked())
          this.list.selectAll();
        else
          this.list.clearSelection();
      }.bind({
        list : list
      });

      this.fs.push(list);

      var button = filters[i].select('.bottom')[0].select('.button')[0];
      button.observe('click', function(event) {
        window.location.href = this.getBrowseURL();
      }.bind(this));
    }
  },

  getBrowseURL : function() {
    //var url = this.config.siteURL + this.config.filters.controller + this.config.category;
    var url = this.config.filters.url + '/' + this.config.category;

    for(var i = 0; i < this.fs.length; i++) {
      var values = this.fs[i].getSelectedValues();
      for(var j = 0; j < values.length; j++) {
        url += '/' + values[j];
      }
    }

    return url;
  },

  initSearch : function() {
    if($('search-field') && $('search-field-button'))
      this.initSearchField();

    if($('search-list') && $('search-list-button'))
      this.initSearchList();
  },

  initSearchField : function() {
    //init search field
    this.searchField = $('search-field');
    this.searchField.defaultValue = $F(this.searchField);

    this.searchField.observe('focus', function(event) {
      if($F(this.searchField) == this.searchField.defaultValue)
        this.searchField.clear();
    }.bind(this));

    this.searchField.observe('blur', function(event) {
      if($F(this.searchField).strip().empty())
        this.searchField.value = this.searchField.defaultValue;
    }.bind(this));

    this.searchField.observe('keyup', function(event) {
      var key = event.keycode || event.which;
      if(key == Event.KEY_RETURN)
        this.startSearchFieldSearch();
    }.bind(this));

    //init search field suggestion
    //new Ajax.Autocompleter('search-field', 'search-field-suggestion', this.config.siteURL + this.config.keywords.controller, {
    new Ajax.Autocompleter('search-field', 'search-field-suggestion', this.config.keywords.url, {
      tokens : [' ']
    });

    //init search field button
    this.searchFieldButton = $('search-field-button');

    this.searchFieldButton.observe('click', function(event) {
      if($F(this.searchField) != this.searchField.defaultValue)
        this.startSearchFieldSearch();
    }.bind(this));
  },

  startSearchFieldSearch : function() {
      var keywords = this.fetchKeywords(this.searchField);
      if(keywords.length == 0)
        return;

      var url = this.getSearchURL(keywords);
      if(url == false)
        return;

      window.location.href = url;
  },

  fetchKeywords : function(field) {
    var value = $F(field).strip();
    if(value.empty())
      return $A([]);

    return $A(value.split(' '));
  },

  getSearchURL : function(keywords) {
    if(keywords.length == 0)
      return false;

    //var url = this.config.siteURL + this.config.search.controller + this.config.category;
    var url = this.config.search.url + '/' + this.config.category;
    for(var i = 0; i < keywords.length; i++) {
      url += '/' + keywords[i];
    }

    return url;
  },

  initSearchList : function() {
    //init search list
    this.searchList = new SelectableList($('search-list'), {
      className : 'checkbox',
      classNameSelected : 'checkbox-checked',
      allowMultipleSelection : true
    });

    //init search list button
    this.searchListButton = $('search-list-button');
    this.searchListButton.observe('click', function(event) {
      this.startSearchListSearch();
    }.bind(this));
  },

  startSearchListSearch : function() {
    var url = this.getSearchURL(this.searchList.getSelectedValues());
    if(url == false)
      return;

    window.location.href = url;
  },

  initSortList : function() {
    this.sortList = new DropDownList($('drop-down-list-sort'), {
      onChange : function(object) {
        this.browser.setSorting(object.getValue());
      }.bind(this)
    });
  },

  initScreensList : function() {
    this.screensList = new DropDownList($('drop-down-list-screens'), {
      onChange : function(object) {
        this.browser.setResultsPerPage(object.getValue());
      }.bind(this)
    });
  },

  initSizeList : function() {
    this.sizeList = new SelectableList($('size-list'), {
      onChange : function(object) {
        this.browser.setThumbnailSize(object.getSelectedValues());
      }.bind(this),
      classNameSelected : 'list-item-active'
    });
  },

  initNavigation : function() {
    $('link-previous').observe('click', function(event) {
      this.browser.previousPage();
    }.bind(this));

    $('link-next').observe('click', function(event) {
      this.browser.nextPage();
    }.bind(this));
  },

  initResultBrowser : function() {
    var options = {
      onStartBrowse : function() {
        $('content').update('<div class="content-default-container"><img style="vertical-align: middle; margin-right: 10px;" src="' + this.config.baseURL + '/images/preloader.gif" /><b>Loading... Please Wait.</b></div>');
      }.bind(this),
      onBrowseComplete : function() {
        var from = this.browser.info.resultsPerPage * (this.browser.info.currentPage - 1) + 1;
        $('results-from').update(from);

        var to = this.browser.info.resultsPerPage * (this.browser.info.currentPage - 1) + this.browser.info.resultsPerPage;
        if(to > this.browser.info.totalResults)
          to = this.browser.info.totalResults;
        $('results-to').update(to);

        $('results-total').update(this.browser.info.totalResults);

        $('content').update(this.browser.content);
      }.bind(this)
    };

    for(key in this.config.results.options) {
      options[key] = this.config.results.options[key];
    }

    this.browser = new ResultBrowser(
      this.config.results.url,
      this.config.category,
      this.sortList.getValue(),
      this.screensList.getValue(),
      this.sizeList.getSelectedValues(),
      options
    );
  },

  initMostViewed : function() {
    $('a-left').observe('click', function(event) {
      $('li-left').addClassName('active');
      $('li-middle').removeClassName('active');
      $('li-right').removeClassName('active');

      $('li-middle').setStyle({ backgroundPosition : '0 -25px'});

      $('most-viewed-week').setStyle({ display : 'block'});
      $('most-viewed-month').setStyle({ display : 'none'});
      $('most-viewed-ever').setStyle({ display : 'none'});
    });

    $('a-middle').observe('click', function(event) {
      $('li-left').removeClassName('active');
      $('li-middle').addClassName('active');
      $('li-right').removeClassName('active');

      $('li-middle').setStyle({ backgroundPosition : '0 0'});

      $('most-viewed-week').setStyle({ display : 'none'});
      $('most-viewed-month').setStyle({ display : 'block'});
      $('most-viewed-ever').setStyle({ display : 'none'});
    });

    $('a-right').observe('click', function(event) {
      $('li-left').removeClassName('active');
      $('li-middle').removeClassName('active');
      $('li-right').addClassName('active');

      $('li-middle').setStyle({ backgroundPosition : '0 -50px'});

      $('most-viewed-week').setStyle({ display : 'none'});
      $('most-viewed-month').setStyle({ display : 'none'});
      $('most-viewed-ever').setStyle({ display : 'block'});
    });
  },

  initShadowbox : function() {
    var options = {
      players : ['img', 'html'],
      animSequence : 'wh',
      handleOversize : 'drag',
      continuous : true,
      overlayOpacity : 0.9
    };
    Shadowbox.init(options);
  },

  initPreview : function() {
    new Ajax.Request(this.config.preview.url, {
      method : 'get',
      onSuccess : function(transport) {
        $('preview-right').update(transport.responseText);
        this.initAgreementForm();
      }.bind(this)
    });
  },

  initAgreementForm : function() {
    $('agreement-form-submit').observe('click', function(event) {
      Form.request('agreement-form', {
        onSuccess : function(transport) {
          $('preview-right').update(transport.responseText);
          this.initAgreementForm();
        }.bind(this)
      });
    }.bind(this));
  },

  initVideoPlayer : function() {
    var flashvars = {
      file : this.config.videoPlayer.file,
      title: this.config.videoPlayer.title,
      company: this.config.videoPlayer.company
    };

    var params = {
      allowfullscreen : true,
      base : this.config.baseURL,
      menu : false,
      wmode : 'opaque'
    };

    var attributes = {
      onfocus : 'blur();'
    };

    swfobject.embedSWF(this.config.baseURL + 'flash/videoplayer.swf', 'videoplayer', '720', '400', '9.0.115.0', this.config.baseURL + 'scripts/swfobject/expressInstall.swf', flashvars, params, attributes);
  },
  
  initLayers : function() {
    for(var i = 0; i < this.config.layers.length; i++) {
      var layer = new Layer(this.config.layers[i].controller);
      $(this.config.layers[i].link).observe('click', function(event) {
        this.layer.load();
      }.bind({
        layer : layer
      }));
    }
  }
});
