var ddaccordion={
   contentclassname:{},
   expandone:function(headerclass, selected){
      this.toggleone(headerclass, selected, 'expand')
   },
   collapseone:function(headerclass, selected){
      this.toggleone(headerclass, selected, 'collapse')
   },
   expandall:function(headerclass){
      var $=jQuery
      var $headers=$('.'+headerclass)
      $('.'+this.contentclassname[headerclass]+':hidden').each(function(){
         $headers.eq(parseInt($(this).attr('contentindex'))).trigger('evt_accordion')
      })
   },
   collapseall:function(headerclass){
      var $=jQuery
      var $headers=$('.'+headerclass)
      $('.'+this.contentclassname[headerclass]+':visible').each(function(){
         $headers.eq(parseInt($(this).attr('contentindex'))).trigger('evt_accordion')
      })
   },
   toggleone:function(headerclass, selected, optstate){
      var $=jQuery
      var $targetHeader=$('.'+headerclass).eq(selected)
      var $subcontent=$('.'+this.contentclassname[headerclass]).eq(selected)
      if (typeof optstate=='undefined' || optstate=='expand' && $subcontent.is(':hidden') || optstate=='collapse' && $subcontent.is(':visible'))
         $targetHeader.trigger('evt_accordion')
   },
   expandit:function($targetHeader, $targetContent, config, useractivated, directclick){
      this.transformHeader($targetHeader, config, 'expand')
      $targetContent.slideDown(config.animatespeed, function(){
         config.onopenclose($targetHeader.get(0), parseInt($targetHeader.attr('headerindex')), $targetContent.css('display'), useractivated)
         if (config.postreveal=='gotourl' && directclick){
            var targetLink=($targetHeader.is('a'))? $targetHeader.get(0) : $targetHeader.find('a:eq(0)').get(0)
            if (targetLink)
               setTimeout(function(){location=targetLink.href}, 200)
         }
      })
   },
   collapseit:function($targetHeader, $targetContent, config, isuseractivated){
      this.transformHeader($targetHeader, config, 'collapse')
      $targetContent.slideUp(config.animatespeed, function(){config.onopenclose($targetHeader.get(0), parseInt($targetHeader.attr('headerindex')), $targetContent.css('display'), isuseractivated)})
   },
   transformHeader:function($targetHeader, config, state){
      $targetHeader.addClass((state=='expand')? config.cssclass.expand : config.cssclass.collapse)
      .removeClass((state=='expand')? config.cssclass.collapse : config.cssclass.expand)
      if (config.htmlsetting.location=='src'){
         $targetHeader=($targetHeader.is('img'))? $targetHeader : $targetHeader.find('img').eq(0)
         $targetHeader.attr('src', (state=='expand')? config.htmlsetting.expand : config.htmlsetting.collapse)
      }
      else if (config.htmlsetting.location=='prefix')
         $targetHeader.find('.accordprefix').html((state=='expand')? config.htmlsetting.expand : config.htmlsetting.collapse)
      else if (config.htmlsetting.location=='suffix')
         $targetHeader.find('.accordsuffix').html((state=='expand')? config.htmlsetting.expand : config.htmlsetting.collapse)
   },
   urlparamselect:function(headerclass){
      var result=window.location.search.match(new RegExp(headerclass+'=((\\d+)(,(\\d+))*)', 'i'))
      if (result!=null)
         result=RegExp.$1.split(',')
      return result
   },
   getCookie:function(Name){ 
      var re=new RegExp(Name+'=[^;]+', 'i')
      if (document.cookie.match(re))
         return document.cookie.match(re)[0].split('=')[1]
      return null
   },
   setCookie:function(name, value){
      document.cookie = name + '=' + value + '; path=/'
   },
   init:function(config){
   document.write('<style type="text/css">\n')
   document.write('.'+config.contentclass+'{display: none}\n')
   document.write('<\/style>')
   jQuery(document).ready(function($){
      ddaccordion.urlparamselect(config.headerclass)
      var persistedheaders=ddaccordion.getCookie(config.headerclass)
      ddaccordion.contentclassname[config.headerclass]=config.contentclass
      config.cssclass={collapse: config.toggleclass[0], expand: config.toggleclass[1]}
      config.revealtype=config.revealtype || 'click'
      config.revealtype=config.revealtype.replace(/mouseover/i, 'mouseenter')
      if (config.revealtype=='clickgo'){
         config.postreveal='gotourl'
         config.revealtype='click'
      }
      if (typeof config.togglehtml=='undefined')
         config.htmlsetting={location: 'none'}
      else
         config.htmlsetting={location: config.togglehtml[0], collapse: config.togglehtml[1], expand: config.togglehtml[2]}
      config.oninit=(typeof config.oninit=='undefined')? function(){} : config.oninit
      config.onopenclose=(typeof config.onopenclose=='undefined')? function(){} : config.onopenclose
      var lastexpanded={}
      var expandedindices=ddaccordion.urlparamselect(config.headerclass) || ((config.persiststate && persistedheaders!=null)? persistedheaders : config.defaultexpanded)
      if (typeof expandedindices=='string')
         expandedindices=expandedindices.replace(/c/ig, '').split(',')
      var $subcontents=$('.'+config['contentclass'])
      if (expandedindices.length==1 && expandedindices[0]=='-1')
         expandedindices=[]
      if (config['collapseprev'] && expandedindices.length>1)
         expandedindices=[expandedindices.pop()]
      if (config['onemustopen'] && expandedindices.length==0)
         expandedindices=[0]
      $('.'+config['headerclass']).each(function(index){
         if (/(prefix)|(suffix)/i.test(config.htmlsetting.location) && $(this).html()!=''){
            $('<span class="accordprefix"></span>').prependTo(this)
            $('<span class="accordsuffix"></span>').appendTo(this)
         }
         $(this).attr('headerindex', index+'h')
         $subcontents.eq(index).attr('contentindex', index+'c')
         var $subcontent=$subcontents.eq(index)
         var needle=(typeof expandedindices[0]=='number')? index : index+''
         if (jQuery.inArray(needle, expandedindices)!=-1){
            if (config.animatedefault==false)
               $subcontent.show()
            ddaccordion.expandit($(this), $subcontent, config, false)
            lastexpanded={$header:$(this), $content:$subcontent}
         }
         else{
            $subcontent.hide()
            config.onopenclose($(this).get(0), parseInt($(this).attr('headerindex')), $subcontent.css('display'), false)
            ddaccordion.transformHeader($(this), config, 'collapse')
         }
      })
      $('.'+config['headerclass']).bind('evt_accordion', function(e, isdirectclick){
            var $subcontent=$subcontents.eq(parseInt($(this).attr('headerindex')))
            if ($subcontent.css('display')=='none'){
               ddaccordion.expandit($(this), $subcontent, config, true, isdirectclick)
               if (config['collapseprev'] && lastexpanded.$header && $(this).get(0)!=lastexpanded.$header.get(0)){
                  ddaccordion.collapseit(lastexpanded.$header, lastexpanded.$content, config, true)
               }
               lastexpanded={$header:$(this), $content:$subcontent}
            }
            else if (!config['onemustopen'] || config['onemustopen'] && lastexpanded.$header && $(this).get(0)!=lastexpanded.$header.get(0)){
               ddaccordion.collapseit($(this), $subcontent, config, true)
            }
       })
      $('.'+config['headerclass']).bind(config.revealtype, function(){
         if (config.revealtype=='mouseenter'){
            clearTimeout(config.revealdelay)
            var headerindex=parseInt($(this).attr('headerindex'))
            config.revealdelay=setTimeout(function(){ddaccordion.expandone(config['headerclass'], headerindex)}, config.mouseoverdelay || 0)
         }
         else{
            $(this).trigger('evt_accordion', [true])
            return false
         }
      })
      $('.'+config['headerclass']).bind('mouseleave', function(){
         clearTimeout(config.revealdelay)
      })
      config.oninit($('.'+config['headerclass']).get(), expandedindices)
      $(window).bind('unload', function(){
         $('.'+config['headerclass']).unbind()
         var expandedindices=[]
         $('.'+config['contentclass']+':visible').each(function(index){
            expandedindices.push($(this).attr('contentindex'))
         })
         if (config.persiststate==true && $('.'+config['headerclass']).length>0){
            expandedindices=(expandedindices.length==0)? '-1c' : expandedindices
            ddaccordion.setCookie(config.headerclass, expandedindices)
         }
      })
   })
   }
}
