text: # -*- coding: utf-8 -*-
  #
  # CTK: Cherokee Toolkit
  #
  # Authors:
  #      Alvaro Lopez Ortega <alvaro@alobbs.com>
  #
  # Copyright (C) 2010-2011 Alvaro Lopez Ortega
  #
  # This program is free software; you can redistribute it and/or
  # modify it under the terms of version 2 of the GNU General Public
  # License as published by the Free Software Foundation.
  #
  # This program is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
  # along with this program; if not, write to the Free Software
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  # 02110-1301, USA.
  #
  
  from Box import Box
  from Widget import Widget
  from RawHTML import RawHTML
  
  class Collapsible (Box):
      """
      Widget to show content in an area that can be collapsed and
      expanded on-click.
  
         Arguments:
             titles: Tuple containing two strings to use as
                 titles. Those are shown when the collpasible is
                 minimized and maximized respectively.
  
             collapsed: Boolean to indicate initial state. Defaults to
                 True.
  
         Examples:
            container  = CTK.Collapsible (('Show', 'Hide'))
            container += CTK.RawHTML ('<p>This text can be hidden, or not.</p>')
      """
      def __init__ (self, (titles), collapsed=True):
          Box.__init__ (self, {'class': 'collapsible'})
  
          self.collapsed = collapsed
          if collapsed:
              self.content = Box ({'class': 'collapsible-content', 'style': 'display:none;'})
          else:
              self.content = Box ({'class': 'collapsible-content'})
  
          assert len(titles) == 2
          self.title_show = Box ({'class': 'collapsible-title'}, titles[0])
          self.title_hide = Box ({'class': 'collapsible-title'}, titles[1])
  
          self.title_show.bind ('click', self.__JS_show())
          self.title_hide.bind ('click', self.__JS_hide())
  
          # Build up
          Box.__iadd__ (self, self.title_show)
          Box.__iadd__ (self, self.title_hide)
          Box.__iadd__ (self, self.content)
  
      def __iadd__ (self, content):
          self.content += content
          return self
  
      def __JS_show (self):
          return self.content.JS_to_show(100) + self.title_hide.JS_to_show() + self.title_show.JS_to_hide()
  
      def __JS_hide (self):
          return self.content.JS_to_hide() + self.title_hide.JS_to_hide() + self.title_show.JS_to_show()
  
      def Render (self):
          render = Box.Render (self)
  
          if self.collapsed:
              render.js += self.__JS_hide()
          else:
              render.js += self.__JS_show()
  
          return render
  
  class CollapsibleEasy (Collapsible):
      """
      Widget to show content in an area that can be collapsed and
      expanded on-click. It works just like the Collapsible, but
      prepends up/down arrows to the titles to indicate collapse/expand.
  
         Arguments:
             titles: Tuple containing two strings to use as
                 titles. Those are shown when the collpasible is
                 minimized and maximized respectively.
  
             collapsed: Boolean to indicate initial state. Defaults to
                 True.
  
         Examples:
            container  = CTK.CollapsibleEasy (('Show', 'Hide'))
            container += CTK.RawHTML ('<p>This text can be hidden, or not.</p>')
      """
      def __init__ (self, (titles), collapsed=True):
          assert len(titles) == 2
          assert type(titles[0]) == str
          assert type(titles[1]) == str
  
          if collapsed:
              c0 = "▼ "
              c1 = "▲ "
          else:
              c0 = "▲ "
              c1 = "▼ "
  
          show = RawHTML(c0 + titles[0])
          hide = RawHTML(c1 + titles[1])
          Collapsible.__init__ (self, (show, hide), collapsed)
  