/*
 * CUSTOM CHANGES: added selection limit and notification of limit
 * AG
 * 
 * 
  fcbkListSelection 1.10
  - Jquery version required: 1.2.x
  
  Changelog:
  - 1.1: added preselected items  
  - 1.0: project started
*/

/* Coded by: emposha <admin@emposha.com> */
/* Copyright: Emposha.com <http://www.emposha.com/> - Distributed under MIT - Keep this message! */
/*
* elem - ul element id or object
* width - width of ul
* height - height of each element
* row - number of items in row 
*/
jQuery.fcbkListSelection = function(elem, width, height, row, limit) {
    
    //get content of tabs
    var getContent = function (elem,tab) {
        switch(tab) {
            case "all":                
               elem.children("li").show();    
               // CUSTOM AG:
               // added function to use box filtering
               //filterFriends();
               clearAuto();
                break;
            
            case "selected":
                elem.children("li:not([addedid])").hide();
                elem.children("li[addedid]").show();
                break;
            
            case "unselected":
                elem.children("li[addedid]").hide();
                elem.children("li:not([addedid])").show();
                break;
        }
    }
    
    var hiddenCheck = function (obj) {        
        switch(curTab()) {
            case "all":                
                elem.children("li").show();  
                
                // CUSTOM AG
                //filterFriends();
                clearAuto();
                break;
            
            case "selected":
                elem.children("li:not([addedid])").hide();
                elem.children("li[addedid]").show();
                break;
            
            case "unselected":
                elem.children("li[addedid]").hide();
                elem.children("li:not([addedid])").show();
                break;
        }
    }    
    
    //add to selected items function
    var addToSelected = function (obj) {
        if (obj.hasClass("itemselected")) {            
            $("#view_selected_count").text(parseInt($("#view_selected_count").text(),10) - 1);            
            obj.parents("li").removeAttr("addedid");
            removeValue(obj);
        } else {

            $("#view_selected_count").text(parseInt($("#view_selected_count").text(),10) + 1);
            obj.parents("li").attr("addedid","tester");
            addValue(obj);   

        }
       // CUSTOM
       // AG remove hidden check so it doesn't refresh to show all when using 
        // autocomplete
       //hiddenCheck(obj);
    }
    
    //bind onmouseover && click event on item
    var bindEventsOnItems = function (elem) {            
      $.each(elem.children("li").children(".fcbklist_item"),function (i, obj) {
            obj = $(obj);
            if (obj.children("input[checked]").length != 0) {
            	
            	
            	
            	// CUSTOM CHANGES
            	// AG
            	// don't try to add/remove if it was not selected and we are at limit
            	var currentSelected = parseInt($("#view_selected_count").text(),10);
            	if (obj.hasClass("itemselected") == true || currentSelected < limit)
            	{
                    addToSelected(obj);                            
                    obj.toggleClass("itemselected");
                    obj.parents("li").toggleClass("liselected");     
            	}

            	// END CUSTOM CHANGES
            }   
            obj.click(function() {
            	
            	// CUSTOM CHANGES
            	// AG
            	// don't try to add/remove if it was not selected and we are at limit
            	
            	var currentSelected = parseInt($("#view_selected_count").text(),10);
            	

            	
            	if (obj.hasClass("itemselected") == true || currentSelected < limit)
            	{
                    addToSelected(obj);                            
                    obj.toggleClass("itemselected");
                    obj.parents("li").toggleClass("liselected");     
            	}
            	
            	// recount after add
            	currentSelected = parseInt($("#view_selected_count").text(),10);
            	
            	if (currentSelected == limit)
            	{
            		$("#view_limit").show();
            	}
            	else
            	{
            		$("#view_limit").hide();
            	}
            	
            	// END CUSTOM CHANGES
            	
            });
            obj.mouseover(function() {            
                obj.addClass("itemover");           
            });
            obj.mouseout(function() {            
                $(".itemover").removeClass("itemover");           
            });
        });
    }
    
    //bind onclick event on filters
    var bindEventsOnTabs = function(elem) {            
        $.each($("#selections li"), function(i, obj) {
            obj = $(obj);       
            obj.click(function() {
                $(".view_on").removeClass("view_on");
                obj.addClass("view_on");            
                getContent(elem,obj.attr("id").replace("view_",""));           
            });
        });
    }
    
    //create control tabs
    var createTabs = function(elem,width) {
        var html = '<div id="filters" style="width:'+(parseInt(width,10)+2)+'px;">'+
                   '<ul class="selections" id="selections"><li id="view_all" class="view_on">'+
                   '<a onclick="return false;" href="#">View All</a></li><li id="view_selected" class="">'+
                   '<a onclick="return false;" href="#">Selected (<strong id="view_selected_count">0</strong>)</a></li>'+
                   '<li id="view_unselected" class=""><a onclick="return false;" href="#">Unselected</a></li>'+
                   
                   // CUSTOM
                   // AG
                   // list item to say when at limit
                   '<li id="view_limit" style="display:none;"><b>Limit reached</b></li>' +
                   '</ul>' +
                   // END CUSTOM CHANGES
                   
                   
                   '<div class="clearer"></div></div>';
        elem.before(html);
    }
    
    //wrap elements with div
    var wrapElements = function(elem,width,height,row) {
        elem.children("li").wrapInner('<div class="fcbklist_item"></div>');
        $(".fcbklist_item").css("height",height+"px");
        var newwidth = Math.ceil((parseInt(width,10))/parseInt(row,10)) - 11;
        $(".fcbklist_item").css("width",newwidth+"px");
    }
    
    var addValue = function(obj,value) {
        //create input
        var inputid = elem.attr('id') + "_values";
        if ($("#"+inputid).length == 0) { 
    	    var input = document.createElement('input');      
            $(input).attr({'type': 'hidden', 'name': inputid, 'id': inputid, 'value': ""});
            elem.after(input);
        } else {
            var input = $("#"+inputid);
        }        
        var randid = "rand_" + randomId();                
        if (!value) {
            value = obj.find("[type=hidden]").val();
            obj.find("[type=hidden]").attr("randid",randid);
        }
        var jsdata = new data(randid,value);       
        var stored = jsToString(jsdata,$(input).val());
        $(input).val(stored);        
        return input;
    }
    
    var jsToString = function (jsdata,json) {
        var string = "{";
        $.each(jsdata,function(i,item) {
            if (i) {
                string += "\""+i+"\":\""+item+"\",";
            }
        });
        try {
            eval("json = "+json+";");
            $.each(json,function(i,item) {
                if (i && item) {
                    string += "\""+i+"\":\""+item+"\",";
                }
            });
        } catch (e) {
            //console.log(e);
        }
        //remove last ,
        string = string.substr(0,(string.length-1));
        string += "}"        
        return string;
    }
    
    var data = function(id,value) {
        try {
            eval("this."+id+" = value;");        
        } catch (e) {
            //console.log(e);
        }
    }
    
    var removeValue = function(obj) {
        var randid = obj.find("[type=hidden]").attr("randid");
        var inputid = elem.attr('id') + "_values";
        if ($("#"+inputid).length != 0) {
            try {
                eval("json = "+$("#"+inputid).val()+";");
                var string = "{";
                $.each(json,function(i,item) {
                    //console.log(i,randid);
                    if (i && item && i != randid) {
                        string += "\""+i+"\":\""+item+"\",";
                    }
                });
                 //remove last ,
                if (string.length > 2) {
                    string = string.substr(0,(string.length-1));
                    string += "}"
                } else {
                    string = "";
                }
                $("#"+inputid).val(string);
            } catch (e) {
                //console.log(e);
            }
        }
    }
    
    var randomId = function () {
        var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
	    var string_length = 32;
	    var randomstring = '';
	    for (var i=0; i<string_length; i++) {
		    var rnum = Math.floor(Math.random() * chars.length);
		    randomstring += chars.substring(rnum,rnum+1);
	    }
        return randomstring;
    }
    
    var curTab = function() {
        return $(".view_on").attr("id").replace("view_","");
    }
    //main
    if (typeof(elem) != 'object') elem = $(elem);
    elem.css("width",width+"px");
    
    createTabs(elem,width);
    wrapElements(elem,width,height,row);
    
    bindEventsOnTabs(elem);
    bindEventsOnItems(elem);
}