/*
 * DC jQuery Vertical Accordion Menu - jQuery vertical accordion menu plugin
 * Copyright (c) 2011 Design Chemical
 *
 * Dual licensed under the MIT and GPL licenses:
 * 	http://www.opensource.org/licenses/mit-license.php
 * 	http://www.gnu.org/licenses/gpl.html
 *
 */

(function($){

	$.fn.dcAccordion = function(options) {

		//set default options
		var defaults = {
			classParent	 : 'dcjq-parent',
			classActive	 : 'active',
			classArrow	 : 'dcjq-icon',
			classCount	 : 'dcjq-count',
			classExpand	 : 'dcjq-current-parent',
			eventType	 : 'click',
			hoverDelay	 : 300,
			menuClose     : true,
			autoClose    : true,
			autoExpand	 : false,
			speed        : 'slow',
			saveState	 : true,
			disableLink	 : true,
			showCount : false,
			cookie	: 'dcjq-accordion',
   cat_id: '',
   target_container: '',
   target_container2: '',
   acordion_container: '',
   category_description: ''
		};

		//call in the default otions
		var options = $.extend(defaults, options);

		var $dcAccordionObj = this;

		return $dcAccordionObj.each(function(options){

			setUpAccordion();
			if(defaults.saveState == true){
				checkCookie(defaults.cookie, $dcAccordionObj);
			}
			resetAccordion();

			if(defaults.eventType == 'hover'){

				var config = {
					sensitivity: 2, // number = sensitivity threshold (must be 1 or higher)
					interval: defaults.hoverDelay, // number = milliseconds for onMouseOver polling interval
					over: linkOver, // function = onMouseOver callback (REQUIRED)
					timeout: defaults.hoverDelay, // number = milliseconds delay before onMouseOut
					out: linkOut // function = onMouseOut callback (REQUIRED)
				};

				$('li a',$dcAccordionObj).hoverIntent(config);
				var configMenu = {
					sensitivity: 2, // number = sensitivity threshold (must be 1 or higher)
					interval: 1000, // number = milliseconds for onMouseOver polling interval
					over: menuOver, // function = onMouseOver callback (REQUIRED)
					timeout: 1000, // number = milliseconds delay before onMouseOut
					out: menuOut // function = onMouseOut callback (REQUIRED)
				};

				$($dcAccordionObj).hoverIntent(configMenu);

				// Disable parent links
				if(defaults.disableLink == true){

					$('li a',$dcAccordionObj).click(function(e){
						if($(this).siblings('ul').length >0){
							e.preventDefault();
						}
					});
				}

			} else {

				$('li a',$dcAccordionObj).click(function(e){

					$activeLi = $(this).parent('li');
					$parentsLi = $activeLi.parents('li');
					$parentsUl = $activeLi.parents('ul');

					// Prevent browsing to link if has child links
					if(defaults.disableLink == true){
						if($(this).siblings('ul').length >0){
							e.preventDefault();
						}
					}

					// Auto close sibling menus
					if(defaults.autoClose == true){
						autoCloseAccordion($parentsLi, $parentsUl);
					}

     var prev_height = $(defaults.acordion_container).children().height();

					if ($('> ul',$activeLi).is(':visible')){
       
      $('ul',$activeLi).slideUp(defaults.speed,function(){

       var new_height = $(defaults.acordion_container).children().height();

       var target_height = $(defaults.target_container).height() - 40; /*40 40 is the navigation + shadows height*/
       var diff = target_height - $(defaults.category_description).height();

       if($(defaults.acordion_container).children().height() >= diff){
          var factor = Math.abs(prev_height - new_height);
          addHeight(factor);
        }
        
      });
      
      $('a',$activeLi).removeClass(defaults.classActive);
					} else {

						$(this).siblings('ul').slideToggle(defaults.speed, function(){

       var new_height = $(defaults.acordion_container).children().height();

       var target_height = $(defaults.target_container).height() - 40; /*40 40 is the navigation + shadows height*/
       var diff = target_height - $(defaults.category_description).height();

       if($(defaults.acordion_container).children().height() >= diff){
          var factor = Math.abs(prev_height - new_height);
          addHeight(factor);
       }

      });

						$('> a',$activeLi).addClass(defaults.classActive);
					}    

					// Write cookie if save state is on
					if(defaults.saveState == true){
						createCookie(defaults.cookie, $dcAccordionObj);
					}
				});
			}

			// Set up accordion
			function setUpAccordion(){

				$arrow = '<span class="'+defaults.classArrow+'"></span>';
				$('> ul',$dcAccordionObj).show();
				$('li',$dcAccordionObj).each(function(){
					var classParentLi = defaults.classParent+'-li';
					if($('> ul',this).length > 0){
						$(this).addClass(classParentLi);
						$('> a',this).addClass(defaults.classParent).append($arrow);
						if(defaults.showCount == true){
							var parentLink = $('li:not(.'+defaults.classParent+') > a',this);
							var countParent = parseInt($(parentLink).length);
							getCount = countParent;
							$('> a',this).append(' <span class="'+defaults.classCount+'">('+getCount+')</span>');
						}
					}
				});
				$('> ul',$dcAccordionObj).hide();
			}

   // Reload accordion based on current catid
   reload_from_page();
		});

  function reload_from_page(){

    cat_id_str = '#cat_'+defaults.cat_id;
    $activeLi = $(cat_id_str);
    $parentsLi = $activeLi.parents('li');
    $parentsUl = $activeLi.parents('ul');

    // Auto close sibling menus
    if(defaults.autoClose == true){
        autoCloseAccordion($parentsLi, $parentsUl);
    }

    var prev_height = $(defaults.acordion_container).children().height();
    var target_height = $(defaults.target_container).height() - 40; /*40 40 is the navigation + shadows height*/
    var diff = target_height - $(defaults.category_description).height();

    if($(defaults.acordion_container).children().height() >= diff){
      var factor = Math.abs(prev_height - diff) + 50;
      addHeight(factor);
    }



    if ($('> ul',$activeLi).is(':visible')){
        //Do nothing since is active
    } else {        
        $('> a',$activeLi).addClass(defaults.classActive);
    }

    $('> a',$activeLi).siblings('ul').slideDown(defaults.speed, function(){
       var new_height = $(defaults.acordion_container).children().height();

       var target_height = $(defaults.target_container).height() - 40; /*40 40 is the navigation + shadows height*/
       var diff = target_height - $(defaults.category_description).height();

       if($(defaults.acordion_container).children().height() >= diff){
          var factor = Math.abs(prev_height - new_height);
          addHeight(factor);
        }

    });

    // Write cookie if save state is on
    if(defaults.saveState == true){
        createCookie(defaults.cookie, $dcAccordionObj);
    }

  }

  function addHeight(val){
    var target_height = $(defaults.target_container).height();
    $(defaults.target_container).height(target_height + val);
    $(defaults.target_container2).height($(defaults.target_container).height());
  }

		function linkOver(){

			$activeLi = $(this).parent('li');
			$parentsLi = $activeLi.parents('li');
			$parentsUl = $activeLi.parents('ul');

			// Auto close sibling menus
			if(defaults.autoClose == true){
				autoCloseAccordion($parentsLi, $parentsUl);

			}

			if ($('> ul',$activeLi).is(':visible')){
				$('ul',$activeLi).slideUp(defaults.speed);
				$('a',$activeLi).removeClass(defaults.classActive);
			} else {
				$(this).siblings('ul').slideToggle(defaults.speed);
				$('> a',$activeLi).addClass(defaults.classActive);
			}

			// Write cookie if save state is on
			if(defaults.saveState == true){
				createCookie(defaults.cookie, $dcAccordionObj);
			}
		}

		function linkOut(){
		}

		function menuOver(){
		}

		function menuOut(){

			if(defaults.menuClose == true){
				$('ul',$dcAccordionObj).slideUp(defaults.speed);
				// Reset active links
				$('a',$dcAccordionObj).removeClass(defaults.classActive);
				createCookie(defaults.cookie, $dcAccordionObj);
			}
		}

		// Auto-Close Open Menu Items
		function autoCloseAccordion($parentsLi, $parentsUl){
			$('ul',$dcAccordionObj).not($parentsUl).slideUp(defaults.speed);
			// Reset active links
			$('a',$dcAccordionObj).removeClass(defaults.classActive);
			$('> a',$parentsLi).addClass(defaults.classActive);
		}

		// Retrieve cookie value and set active items
		function checkCookie(cookieId, obj){
			var cookieVal = $.cookie(cookieId);
			if(cookieVal != null){
				// create array from cookie string
				var activeArray = cookieVal.split(',');
				$.each(activeArray, function(index,value){
					var $cookieLi = $('li:eq('+value+')',obj);
					$('> a',$cookieLi).addClass(defaults.classActive);
					var $parentsLi = $cookieLi.parents('li');
					$('> a',$parentsLi).addClass(defaults.classActive);
				});
			}
			if(defaults.autoExpand == true){
				$('li.'+defaults.classExpand+' > a').addClass(defaults.classActive);
			}
		}

		// Reset accordion using active links
		function resetAccordion(){
			$('ul',$dcAccordionObj).hide();
			$allActiveLi = $('a.'+defaults.classActive,$dcAccordionObj);
			$allActiveLi.siblings('ul').show();
		}

		// Write cookie
		function createCookie(cookieId, obj){
			var activeIndex = [];
			// Create array of active items index value
			$('li a.'+defaults.classActive,obj).each(function(i){
				var $arrayItem = $(this).parent('li');
				var itemIndex = $('li',obj).index($arrayItem);
					activeIndex.push(itemIndex);
				});
			// Store in cookie
			$.cookie(cookieId, activeIndex, {path: '/'});
		}
	};
})(jQuery);
