/**
 * Folder.
 * @author CNPP
 * @requires jquery.easing.js, jquery.cookie.js
 * @version 1.0.0	initial version			
 */
jQuery.fn.folder = function(op) {	
	// defaults
	var defaults =  {
			selectorFolder:"#folder",
			selectorToggler:"#folder_toggler",
			selectorCount:"#folder_count",
			selectorContent:"#folder_content",
			selectorAdd:".folder_add",
			selectorRemoveAll:"#folder_remove-all",
			selectorRemove:".folder_remove",
			classRemove:"folder_remove",
			classTogglerExpanded:"expanded",
			classTogglerCollapsed:"collapsed",
			classHidden:"hidden",
			classDownload:"icon pdf",
			downloadBase:"/download/rezept.php",
			downloadParam:"pdf",
			padding:10,
			timeAnimateDown:1000,
			timeAnimateUp:390,
			easingAnimateDown:"easeOutCubic",
			easingAnimateUp:"easeOutSine"
	};
	jQuery.extend(defaults, op);
	
		
	// references
	var elFolder = jQuery(defaults.selectorFolder);
	var elCount = jQuery(defaults.selectorCount);
	var elToggler = jQuery(defaults.selectorToggler);
	var elContent = jQuery(defaults.selectorContent);
	var elRemoveAll = jQuery(defaults.selectorRemoveAll);
	
	// params
	var dnlPath = jQuery(elContent).attr("rel") + defaults.downloadBase;
	var dnlParam = "?" + defaults.downloadParam + "=";
	var dnlClass = defaults.classDownload;
	var folderList = jQuery.cookie('folder');
	var folderItems = new Array();
	if (folderList != null) {
		var flist = folderList.split(";");
		folderItems = flist.splice(0, flist.length-1);	
	}
	var folderExpanded = true;
	var folderExpandedValue = jQuery.cookie('folder_expanded');
	if (folderExpandedValue != null) {
		if (folderExpandedValue != "expanded") {
			folderExpanded = false;
		}
		expandHideItems();
	}
	
	// init
	jQuery(elFolder).css({"display":"block"});
	update();
	
	
	// events
	jQuery(defaults.selectorAdd).bind("click",addItem);
	jQuery(defaults.selectorRemove).bind("click",removeItem);
	jQuery(elToggler).bind("click",toggleItems);
	jQuery(elRemoveAll).bind("click",removeAllItems);
	
	/**
	* Checks for items.
	*/
	function hasItems() {
		var has = false;
		if (folderItems.length > 0) {
			has = true;	
		}	
		return has;
	}
	
	/**
	* Updates the folder.
	*/
	function update(animate) {
		
		// items
		jQuery(elContent).children().remove();
		for (var i = 0; i < folderItems.length; i++) {
			var me = "<tr><td><a href='"+dnlPath+dnlParam+folderItems[i]+"' title='Download "+folderItems[i]+"' class='"+dnlClass+"'>"+folderItems[i]+"</a></td><td><a href='#' class='"+defaults.classRemove+"' title='Rezept entfernen' rel='"+folderItems[i]+"'><!-- remove --></a></td></tr>"	;
			jQuery(elContent).append(me);
		}
		jQuery(defaults.selectorRemove).bind("click",removeItem);
		
		// count
		jQuery(elCount).html(folderItems.length);
		
		// update
		showHideFolder(animate);
		persist();
	}
	
	/*
	* Toggles the items.
	*/
	function toggleItems() {
		folderExpanded = ! folderExpanded;
		var v = "expanded";
		if (! folderExpanded) {
			v = "hidden";	
		}
		jQuery.cookie("folder_expanded",v,{path: '/'});
		expandHideItems();
		return false;
	}
	function expandHideItems() {
		if (folderExpanded) {
			jQuery(elContent).show();
			jQuery(elToggler).removeClass(defaults.classTogglerCollapsed);
			jQuery(elToggler).addClass(defaults.classTogglerExpanded);
		}
		else {
			jQuery(elContent).hide();	
			jQuery(elToggler).addClass(defaults.classTogglerCollapsed);
			jQuery(elToggler).removeClass(defaults.classTogglerExpanded);
		}	
	}
	
	/**
	* Shows / hides the folder.
	*/
	function showHideFolder(animate) {
		var tf = 0;
		if (animate) {
			tf = 1;	
		}
		if (hasItems()) {
			jQuery(elFolder).slideDown({duration:defaults.timeAnimateDown*tf, easing:defaults.easingAnimateDown});
		}
		else {
			jQuery(elFolder).slideUp({duration:defaults.timeAnimateUp*tf, easing:defaults.easingAnimateUp});
		}
	}
	
	/*
	* Add item to folder.
	*/
	function addItem() {
		
		// item
		var item = jQuery(this).attr("rel");
		if (folderItems.indexOf(item) < 0) {
			// add
			folderItems.push(item);
			// update
			var animate = false;
			if (folderItems.length == 1) {
				animate = true;
			}
			update(animate);
		}
		return false;
	}
	
	/*
	* Remove item from folder.
	*/
	function removeItem() {
		
		// item
		var item = jQuery(this).attr("rel");
		if (folderItems.indexOf(item) >= 0) {
			// remove
			folderItems.remove(item);
			// update
			var animate = false;
			if (folderItems.length == 0) {
				animate = true;
			}
			update(animate);
		}
		return false;
	}
	/*
	* Remove all item from folder.
	*/
	function removeAllItems() {
		// reset
		folderItems = new Array();
		// update
		var animate = true;
		update(animate);
		return false;
	}
	
	/*
	* Persists to a cookie.
	*/
	function persist() {
		var fl = "";
		for (var i = 0; i < folderItems.length; i++) {
			fl += folderItems[i] + ";"	
		}
		jQuery.cookie("folder",fl,{path:'/',expires:30});
	}
	
	/*
	* Extend array.
	*/
	Array.prototype.remove=function(s){
		var i = this.indexOf(s);
		if(i != -1) this.splice(i, 1);
	}
	if(!Array.indexOf) {
		Array.prototype.indexOf = function(el) {
    		for(var i = 0; i < this.length; i++) if(el == this[i]) return i;
			return -1;
		}
	}
	
		  
    // return
    return this;
};