/**
 * jquery.listfolder.js
 *
 * Release 0.0.1 (Feb 23, 2011)
 * Release 0.0.2 (Feb 23, 2011) change option setting for class name.
 * Release 0.0.3 (Feb 25, 2011) add initOpen option.
 * Release 0.0.4 (Apr 05, 2011) add openMark and closeMark option.
 *
 * Copyright (c) 2004-2011 Yujiro Araki
 */

(function($){
    jQuery.fn.listfolder = function(options) {

        var defaults = {
            sidebarClass: 'sidetitle',
            time: 0,
            initOpen: [],
            openMark: '▼',
            closeMark: '▲'
        };
        var setting = jQuery.extend(defaults, options);

        jQuery('.'+setting.sidebarClass).next().css('display','none');
        jQuery('.'+setting.sidebarClass).each(function(){
            var onoff = readCookieByValue(this.id);
            if (onoff == 'on') {
                jQuery(this).next().css('display','block');
            }
            if (!onoff) {
                for (i=0; i<setting.initOpen.length; i++) {
                    if (setting.initOpen[i] == this.id) {
                        jQuery(this).next().css('display','block');
                    }
                }
            }

            if(jQuery(this).hasClass('mark')){
                if(jQuery(this).next().css('display') == 'block') {
                    jQuery(this).html(setting.closeMark);
                } else {
                    jQuery(this).html(setting.openMark);
                }
            }

        });
        jQuery('.'+setting.sidebarClass).hover(function(){
            jQuery(this).css("cursor","pointer"); 
        },function(){
            jQuery(this).css("cursor","default"); 
        });
        jQuery('.'+setting.sidebarClass).click(function(){
            var id = this.id;
            jQuery(this).next().slideToggle(setting.time,function(){
                var state = jQuery(this).is(":hidden");
                createCookieByValue(id, state);
                if(jQuery(this).prev().hasClass('mark')){
                    if(state){
                        jQuery(this).prev().html(setting.openMark);
                    } else {
                        jQuery(this).prev().html(setting.closeMark);
                    }
                }
            });
        });

        return this;
    };

    createCookieByValue = function (name, onoff) {
        var days = 0;
        if (days) {
            var date = new Date();
            date.setTime(date.getTime()+(days*24*60*60*1000));
            var expires = "; expires="+date.toGMTString();
        } else {
            expires = "";
        }

        // Once delete a name from cookie.
        var newOnData = deleteValue(name, 'sidebarMenuOn=');
        var newOffData = deleteValue(name, 'sidebarMenuOff=');

        // Set up a name as new data.
        if (onoff == false) {
            if (newOnData != '') {
                newOnData += '|' + name;
            } else {
                newOnData = name;
            }
        } else {
            if (newOffData != '') {
                newOffData += '|' + name;
            } else {
                newOffData = name;
            }
        }

        // Save cookie.
        document.cookie = "sidebarMenuOn=" + newOnData + expires + "; path=/";
        document.cookie = "sidebarMenuOff=" + newOffData + expires + "; path=/";
    }

    deleteValue = function (name, nameEQ) {
        var ca = document.cookie.split(';');
        var newData = new Array();

        // Repeat by cookie
        for(var i = 0, len = ca.length; i < len; i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') {
                c = c.substring(1,c.length);
            }
            if (c.indexOf(nameEQ) == 0) {

                // Delete the corresponding name.
                var data = c.substring(nameEQ.length,c.length);
                var list = data.split('|');
                for(var x = 0; x < list.length; x++) {
                    if (list[x] != name) {
    
                        // corresponds to Mac+IE
                        newData[newData.length] = list[x];
                    }
                }
                return newData.join('|');
            }
        }

        // Return empty when cookie does not exist.
        return '';
    }

    readCookieByValue = function (name) {

        // Search a menu.
        // Return empty if there is nothing to both.
        if (hasName(name, 'sidebarMenuOn=')) {
            return 'on';
        }
        if (hasName(name, 'sidebarMenuOff=')) {
            return 'off';
        }
        return null;
    }

    hasName = function (name, nameEQ) {
        var ca = document.cookie.split(';');
        for(var i = 0, len = ca.length; i < len; i++) {
            var c = ca[i];
            while (c.charAt(0)==' ') {
                c = c.substring(1,c.length);
            }
            if (c.indexOf(nameEQ) == 0) {
                var data = c.substring(nameEQ.length,c.length);
                var list = data.split('|');
                for(var x = 0, len2 = list.length; x < len2; x++) {
                    if (list[x] == name) {
                        return true;
                    }
                }
                return false;
            }
        }
    }

})(jQuery)

