Element.VisibilityMethods = {
  isVisible: function(element) {
    return $(element).style.visibility != 'hidden';
  },
  hideVisibility: function(element) {
    $(element).style.visibility = 'hidden';
  },
  showVisibility: function(element) {
    $(element).style.visibility = 'visible';
  },
  toggleVisibility: function(element) {
    $(element).isVisible() ? $(element).hideVisibility() : $(element).showVisibility();
  }
};
Element.addMethods(Element.VisibilityMethods);

function isOdd(num) {
  return !!(num % 2);
};

function isEven(num) {
  return !isOdd(num);
};

var NewsHighlight = Class.create();
NewsHighlight.prototype = {
  initialize: function(id, widgetName, frequency) {
    this.executor = setInterval("NewsHighlight.cycle(" + widgetName + ")", frequency * 1000);
    this.id = id;
    this.articleIndex = 0;
  },

  select: function(index) {
    clearInterval(this.executor);
    this.showArticle(index);
    return false;
  },

  showArticle: function(index) {
    $(this.id + "-category-" + index).className = 'news_highlight_on';
    $(this.id + "-article-" + index).show();
    if (index == 0) {
      $("widget-tabbers").className = 'left_tab_selected';
      $(this.id + "-article-" + 1).hide();
      $(this.id + "-category-" + 1).className = 'news_highlight_off';
      $(this.id + "-article-" + 2).hide();
      $(this.id + "-category-" + 2).className = 'news_highlight_off';
    } else if (index == 1) {
      $("widget-tabbers").className = 'middle_tab_selected';
      $(this.id + "-article-" + 0).hide();
      $(this.id + "-category-" + 0).className = 'news_highlight_off';
      $(this.id + "-article-" + 2).hide();
      $(this.id + "-category-" + 2).className = 'news_highlight_off';
    } else if (index == 2) {
      $("widget-tabbers").className = 'right_tab_selected';
      $(this.id + "-article-" + 0).hide();
      $(this.id + "-category-" + 0).className = 'news_highlight_off';
      $(this.id + "-article-" + 1).hide();
      $(this.id + "-category-" + 1).className = 'news_highlight_off';
    } else {
      alert("Index " + index + " is not supported.");
    }
  }
};

Object.extend(NewsHighlight, {
  cycle: function(widget) {
    if ((widget.articleIndex += 1) > 2)
      widget.articleIndex = 0;
    widget.showArticle(widget.articleIndex);
  }
});

var Article = Class.create();
Article.prototype = {
  initialize: function(id, original, target, summary) {
    this.id           = id;
    this.original_div = $(original);
    this.target_div   = $(target);
    this.summary_div  = $(summary);
    this.paragraphs   = this.original_div.childNodes;
    this.max_height   = 205 - this.summary_div.getHeight();
  },

  truncate: function(more_link) {
    var content = this.paragraphs[0].childNodes[0].data;
    var words = content.split(' ');
    
    var moreLink = document.createTextNode(more_link);
    var moreWord = document.createTextNode('...  More ');

    for (var k = 0; k < words.length; k++) {
      var word = words[k];
      var newTextNode = document.createTextNode(word + " ");
      this.target_div.appendChild(newTextNode);
      
      this.target_div.appendChild(moreWord);
      
      if (this.target_div.getHeight() > this.max_height) {
        this.target_div.removeChild(this.target_div.lastChild);
        
        this.target_div.removeChild(this.target_div.lastChild);
        this.target_div.appendChild(moreWord);
        while (this.target_div.getHeight() > this.max_height) {
          this.target_div.removeChild(this.target_div.lastChild);
          this.target_div.removeChild(this.target_div.lastChild);
          this.target_div.removeChild(this.target_div.lastChild);
          this.target_div.appendChild(moreWord);
        }
        this.target_div.removeChild(this.target_div.lastChild);
        this.target_div.appendChild(moreLink);
        return this.target_div.innerHTML.unescapeHTML();
      } else {
        this.target_div.removeChild(this.target_div.lastChild);
      }
    }
    this.target_div.appendChild(moreLink);
    return this.target_div.innerHTML.unescapeHTML();
  }
};

/*--------------------------------------------------------*/
/* RATING                                                 */
/*--------------------------------------------------------*/

var Rating = {};
Object.extend(Rating, {
  timeout: null,
  over: function(num) {
    clearTimeout(this.timeout);
    for (var i = num; i < 5; i++) {
      Element.removeClassName('rater_' + i, "over");
    }
    for (var i = 0; i < num ; i++) {
      Element.addClassName('rater_' + i, "over");
    }
    Element.addClassName('rater_' + num, "over");
  },
  click: function(num, url) {
    new Ajax.Request(
      url, {
        asynchronous:true,
        parameters:'rating=' + encodeURIComponent(num)
      }
    );
    for (var i = 0; i <= num ; i++) {
      Element.addClassName('rater_' + i, "selected");
    }
    for (var i = num+1; i < 5; i++) {
      Element.removeClassName('rater_' + i, "selected");
    }
  },
  widgetOut: function() {
    clearTimeout(this.timeout);
    this.timeout = setTimeout(function() {
      for (var i = 0; i < 5; i++) {
        Element.removeClassName('rater_' + i, "over");
      }
    }, 1);
  }
});


/*--------------------------------------------------------*/
/* COMMENTS                                               */
/*--------------------------------------------------------*/

var CommentForm = Class.create();
CommentForm.prototype = {
  initialize: function(element, counter_element) {
    this.element          = $(element);
    this.counter_element  = $(counter_element || element +'_count');
    Event.observe(this.element,'keyup',this.watchMessage.bindAsEventListener(this));
  },
  watchMessage: function(event) {
    element = this.element;
    if(element.value.length > 400) {
      element.value = element.value.truncate(400,'');
    }
    this.counter_element.update(400 - element.value.length);
  }
};

var BlogTable = {
  stylize: function() {
    $$('#post_body table').each(function(table) {
      var rows = table.getElementsBySelector("tr");
      for(var i=0; i < rows.size(); i++) {
        var tr = rows[i];
        if(i == 0) {
          tr.addClassName('blog_thead');
        } else if(i % 2 == 0) {
          tr.addClassName('blog_even');
        } else {
          tr.addClassName('blog_odd');
        }
      }
    });
  }
};

// Extend element functions to set their "disabled" state
Element.PagerEnabling = {
  isEnabled: function(element) {
    return !$(element).hasClassName('disabled');
  },
  disablePager: function(element) {
    $(element).addClassName('disabled');
  },
  enablePager: function(element) {
    $(element).removeClassName('disabled');
  }
};
Element.addMethods(Element.PagerEnabling);


var PhotosetSlider = Class.create();
PhotosetSlider.prototype = {
  initialize: function() {
    this.sliderList     = $('slider_list');
    this.slideUpLink    = $('slide_up');
    this.slideDownLink  = $('slide_down');

    this.sliderCount    = this.sliderList.getElementsByTagName("ul").length;
    this.currentIndex   = 0;
    this.setLinks();
  },
  slideUp: function() {
    if(this.canSlideUp()) {
      new Effect.Move(this.sliderList, { x: 330, y: 0, duration: 0.4 });
      this.currentIndex--;
    }
    this.setLinks();
  },
  slideDown: function() {
    if(this.canSlideDown()) {
      new Effect.Move(this.sliderList, { x: -330, y: 0, duration: 0.4 });
      this.currentIndex++;
    }
    this.setLinks();
  },
  setLinks: function() {
    if(this.sliderCount <= 1) {
      this.slideDownLink.disablePager();
      this.slideUpLink.disablePager();
    } else {
      if(this.canSlideUp()) {
        this.slideUpLink.enablePager();
      } else {
        this.slideUpLink.disablePager();
      }

      if(this.canSlideDown()) {
        this.slideDownLink.enablePager();
      } else {
        this.slideDownLink.disablePager();
      }
    }
  },
  canSlideDown: function() {
    return this.sliderCount > (this.currentIndex + 1) ? true : false;
  },
  canSlideUp: function() {
    return this.currentIndex > 0 ? true : false;
  }
};

var PhotosetGallery = {
  loadPhoto: function(photopageUrl, image, title, caption, issue) {
    $('photo_link').href = photopageUrl;
    $('photo_image').src = image;
    $('photo_title').update(title);
    $('photo_caption').update(caption);
  }
};
