/**
 * coolMultiple jQuery plugin
 *
 * Transforms a select or a list of checkboxes into a nicer control.
 * 
 * Usage: 
 * $('#my_multiple_select').coolMultiple();
 * $('#my_checkbox_list_wrapper').coolMultiple({mode:'checkboxes'});
 * 
 * If you choose checkboxes, you need to run coolMultiple() on a div that's wrapping the checkboxes.
 * Also, each checkbox and it's text must be wrapped by a tag (e.g. <label><input .../> Label text</label>)
 * This is usually the way to do it anyways :)
 * 
 * Also needs some basic CSS or else it won't look like much. Check archive for a sample.
 * 
 * Tested with jQuery 1.3.2, 1.4.2
 * 
 * @todo auto-detect mode
 * @version 1.0
 * @author vlad fratila, vlad.fratila@gmail.com
 * 
 */

(function($){

    var methods = {
        'init': function(options){
            var d = new Date();
            
            this.settings = {
                delText : 'sterge',
                mode: 'select',
                _id : 'coolmulti_'+(d.getTime())
            };
            if(options) {
                this.settings = $.extend(this.settings, options);
            }
            
            var selectobj = this;
            selectobj.hide();
            
            selectobj.wrapper = selectobj.parent().append('<div id="'+selectobj.settings._id+'" class="coolmulti clearfix"></div>').find('div#'+selectobj.settings._id);
            selectobj.div = selectobj.wrapper.append('<div id="'+selectobj.settings._id+'_scrollbox" class="coolmulti-scrollbox"></div>').find('div#'+selectobj.settings._id+'_scrollbox');
            var coolmultiValues = $('<div id="'+selectobj.settings._id+'_values" class="coolmulti-values"></div>');
            coolmultiValues.append("<div class='coolmulti-values-inner'></div>");
	    selectobj.values = selectobj.wrapper.append(coolmultiValues).find('div#'+selectobj.settings._id+'_values div');
            if(typeof(this.settings.infotext) != 'undefined') selectobj.values.append('<div class="coolmulti-infotext">'+this.settings.infotext+'</div>');
            
            if(this.settings.mode == 'select'){
                this.coolMultiple('init_select');
            }
            else if(this.settings.mode == 'checkboxes'){
                this.coolMultiple('init_checkboxes');
            }
            
        },
        
        'init_select' : function(){
            var selectobj = this;
            
	    var treeFrame = selectobj.div.append("<ul id='example' class='filetree'></ul>").find("ul.filetree");
            
	    $.each(selectobj.settings.data, function(name, value) {
		var treeRoot = $("<li></li>");
		treeRoot.append("<span class='folder'>"+value.group_name+"</span>");
		var treeListBlock = $("<ul></ul>");
		var nakop = "";
		$.each(value.rows, function(value, name) {
			nakop += '<li><span class="file"><p id="'+selectobj.settings._id+'_o_'+value+'">'+name+'</p></span></li>';
		});
		treeListBlock.append(nakop);
		treeRoot.append(treeListBlock);
		treeFrame.append(treeRoot);
	    });

	    var sourceList = selectobj.div.find('p');
            sourceList.click(function(){
		var row = $(this);
                selectobj.coolMultiple('selectHandler', row);
            });

	    //if there are some init rows from saved form - then restore this rows
            if (selectobj.settings.initRows.fields) selectobj.coolMultiple('restore_saved_form', selectobj.settings.initRows, sourceList);
        },
	'selectHandler' : function(row, year, sort) {
		var selectobj = this;
                if(!row.hasClass('coolmulti-selected'))
                {
                    selectobj.coolMultiple('select', row, year, sort);
                }
                else
                {
		    var fin_regex = /p\d{5}/;
                    var value = row.attr('id').replace(selectobj.settings._id+'_o_', '');
		    if(fin_regex.test(value)) selectobj.coolMultiple('select', row, year, sort);
                }
	},
        'restore_saved_form' : function(rows, sourceList){
		var selectobj = this;
		var sortField = rows.sort.split(",")[0].split(":");
		$.each(rows.fields.split(","), function(index, value) {
			if (sortField[0] == value) var sort = sortField[1];
			if (/\d{4}/.test(value)) {
				var field = value.split(/_/)[0];	
				var year = value.split(/_/)[1];	
			} else {
				var field = value;
			}
			var row = sourceList.parent().find('[id$="'+field+'"]');
                	selectobj.coolMultiple('selectHandler', row, year, sort);
		});
	},
        
	//DEPRECATED
        'init_checkboxes' : function(){
            var selectobj = this;
            
            selectobj.find('input[type="checkbox"]').each(function(){
                selectobj.div.append('<p id="'+selectobj.settings._id+'_o_'+$(this).val()+'">'+$(this).parent().text()+'</p>');
                if($(this).attr('checked')){
                    selectobj.coolMultiple('select', $(this).val());
                }
            });
            
            selectobj.div.find('p').click(function(){
                var value = $(this).attr('id').replace(selectobj.settings._id+'_o_', '');
                if(!$(this).hasClass('coolmulti-selected'))
                {
                    selectobj.coolMultiple('select', value);
                }
                else
                {
                    selectobj.coolMultiple('deselect', value);
                }
            });
        },
        
        'select' : function(o, year, sort){
            var selectobj = this;

	    var fieldName = o.attr("id").match(/_o_(.*)/)[1];
            if(selectedFieldsCounter.addToList(fieldName,selectobj.settings.type)) {
                return false;
            }
            $('p#'+selectobj.settings._id+'_o_'+fieldName).addClass('coolmulti-selected');
            var newDate = new Date();
//----------
            var fin_regex = /p\d{5}/;
            if(fin_regex.test(fieldName)) {
		yearsContainer1 = '<td class="years_container">'+selectobj.settings.years.gen(fieldName,year)+'</td>'; 
	    } else {
		yearsContainer1 = '<td class="years_container"></td>'; 
	    }
            var trNested1 = '<tr>'+yearsContainer1;
	    trNested1 += '<td class="sort_container"><a class="sort_field" href="#"><img src="/img/unsorted_grey.png" class=""></a></td>';
            trNested1 += '<td class="text_container">'+o.text()+'</td>';
            trNested1 += '<td class="del_container"><a class="coolmulti-del" href="#"><img class="fin_list_del_img" src="/img/ico/delete_icon_small_cross.png"></a></td>';
            trNested1 += '</tr>';
            var tableNested1 = '<table class="nested_table" name="'+fieldName+'">'+trNested1+'</table>';
            var appendSelected1 = '<p class="'+selectobj.settings._id+'_'+newDate.getTime()+'_os_'+fieldName+'">'+tableNested1+'</p>'; 
            var appendSelected = $(appendSelected1); 

	    function clearSortSelectors(appendSelected) {
		   appendSelected.parent().find("a.sort_field img").attr("src","/img/unsorted_grey.png").attr("class","");
		   appendSelected.parent().find("p").css('background','');
	    };

	    function toggleSort(link,sort,appendSelected) {
		clearSortSelectors(appendSelected);
		if (sort == "desc") {
		    link.find("img").attr("src","/img/sort_descending.png").attr("class","desc");
		    appendSelected.css('background','#dfedfa');
		} else if (sort == "asc") {
		    link.find("img").attr("src","/img/sort_ascending.png").attr("class","asc").attr('disabled','disabled');
		    appendSelected.css('background','#dfedfa');
		} else {
		    link.find("img").attr("src","/img/unsorted_grey.png").attr("class","");
		    appendSelected.css('background','');
		}
		return false;
	    };

            selectobj.values.append(appendSelected);
	    sortButton = appendSelected.find("a.sort_field");
	    sortButton.click(function() {
		var oldSort = $(this).find("img").attr("class");
		if (oldSort == "") newSort = "desc";
		if (oldSort == "desc") newSort = "asc";
		if (oldSort == "asc") newSort = "";
		return toggleSort($(this),newSort,appendSelected);
	    });

	    if ( (sort) && (sort !="") ) toggleSort(sortButton,sort,appendSelected);

            appendSelected.find('a.coolmulti-del').click(function(){
                selectobj.coolMultiple('deselect', appendSelected);
                return false;
            });
            selectobj.values.find('.coolmulti-infotext').hide();
        },
        
        'deselect' : function(o){
            var selectobj = this;
            
            if(selectobj.settings.mode == 'select'){
                var tag = 'option';
            }
            else if(selectobj.settings.mode == 'checkboxes'){
                var tag = 'input';
            }
	    var fieldName = o.attr("class").match(/_os_(.*)/)[1];
            
            var option = selectobj.find(tag+'[value="'+fieldName+'"]');
            
            selectedFieldsCounter.removeFromList(fieldName,selectobj.settings.type);
            if ($('p[class$="_os_'+fieldName+'"]').length == 1) $('p#'+selectobj.settings._id+'_o_'+fieldName).removeClass('coolmulti-selected');
            o.remove();
        }
    };

$.fn.coolMultiple = function(method){
    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      if(console.log) console.log( 'Method ' +  method + ' does not exist on jQuery.coolMultiple' );
    }
    
    return this;
    
};
})(jQuery);

