
function ListPicker(benchmarkID, benchmarkTypeID){
    var availableQuestions = new Array();
    var selectedQuestions = new Array();
    var categoryHeaders = new Array();
    var itemIDPrefix = "qa";
    var chosenItems = {
        "selectedQuestions" : new Array(), 
        "availableQuestions": new Array()
    };
    var questionsURL = "/includes/modules/tools/controllers/getQuestionsJson.php";

    function init(){
        $.ajax({
            url: questionsURL,
            type: "POST",
            data: "benchID=" + benchmarkID + "&benchmarkType=" + benchmarkTypeID,
            success: function(resp) {
                handle_results(resp);
            },
            error: function(resp) {
                alert('Request failed');
            }
        });
		
        var anchor = $("<button type='button'></button>");
        anchor.click(function(){
            add_selected_questions();
        });
        anchor.html(" Add Selected > ");
        $("#addSelectedQuestions").append(anchor);
		
        var anchor = $("<button type='button'></button>");
        anchor.click(function(){
            add_all_questions();
        });
        anchor.html(" Add All >> ");
        $("#addSelectedQuestions").append(anchor);
		
        var anchor = $("<button type='button'></button>");
        anchor.click(function(){
            remove_selected_questions();
        });
        anchor.html("< Remove Selected ");
        $("#removeSelectedQuestions").append(anchor);
		
        var anchor = $("<button type='button'></button>");
        anchor.click(function(){
            remove_all_questions();
        });
        anchor.html(" << Remove All ");
        $("#removeSelectedQuestions").append(anchor);
		
        var anchor = $("<button type='submit' id='questionPickerContinue'></button>");
        anchor.html(" Continue ");
        $("#removeSelectedQuestions").append(anchor);
    }
	
    function add_all_questions(){
        for(var i = 0; i < availableQuestions.length; i++){
            var item = availableQuestions[i];
            // add to selected questions
            selectedQuestions.push(item);
			
        // remove from available questions
        //availableQuestions = remove_item_from_list(availableQuestions, item);
        }
		
        availableQuestions = new Array();
        chosenItems["selectedQuestions"] = new Array();
        chosenItems["availableQuestions"] = new Array();
        write_lists();
    }
	
    function add_selected_questions(){
        for(var i = 0; i < chosenItems["availableQuestions"].length; i++){
            var item = chosenItems["availableQuestions"][i];
            //alert(item.number);
            // add to selected questions
            selectedQuestions.push(item);
			
            // remove from available questions
            availableQuestions = remove_item_from_list(availableQuestions, item);
        }
		
        chosenItems["selectedQuestions"] = new Array();
        chosenItems["availableQuestions"] = new Array();
        write_lists();
    }
	
    function click_item(listID, itemObj){
        var pos = find_item_in_list(itemObj, chosenItems[listID]);
        //alert(pos);
        // if item is already in the list, remove it
        if(pos > -1){
            chosenItems[listID] = remove_item_from_list(chosenItems[listID], itemObj);
            // unhighlight
            $("#" + itemIDPrefix + itemObj.number).removeClass();
        }else{	// if it is not in the list, add it
            //alert("hi");
            chosenItems[listID].push(itemObj);
            // highlight
            $("#" + itemIDPrefix + itemObj.number).addClass("highlighted");
        }
    }
    function click_category(listID,itemObj, checked){
        var pos = find_item_in_list(itemObj, chosenItems[listID]);
        //alert(pos);
        // if item is already in the list, remove it
        if(pos > -1 && !checked){
            chosenItems[listID] = remove_item_from_list(chosenItems[listID], itemObj);
            // unhighlight
            $("#" + itemIDPrefix + itemObj.number).removeClass();
        }else{	// if it is not in the list, add it
            //alert("hi");
            chosenItems[listID].push(itemObj);
            // highlight
            $("#" + itemIDPrefix + itemObj.number).addClass("highlighted");
        }
    }
	
    function find_item_in_list(item, list){
        for(var i = 0; i < list.length; i++){
            if(item.number == list[i].number){
                return i;
            }
        }
		
        return -1;
    }
	
    // after getting an ajax response, handle the response, "response" must be a json object
    function handle_results(response){
        // show the results div
        // create a json object with the response text
        var jsonObj = jQuery.parseJSON(response);
        //say_hi();
        selectedQuestions = jsonObj.selectedQuestions;
        availableQuestions = jsonObj.availableQuestions;
        categoryHeaders = jsonObj.categories;
		
        write_lists();
    }
	
    function move_selected_item(item, direction){
        var newList = new Array();
        //alert(direction + ", item=" + item.number);
        for(var i = 0; i < selectedQuestions.length; i++){
            if(selectedQuestions[i].number == item.number){
            // do nothing
            }
            else if(direction == "up" && i + 1 < selectedQuestions.length && selectedQuestions[i + 1].number == item.number){
                newList.push(item);
                newList.push(selectedQuestions[i]);
            }
            else if(direction == "down" && i - 1 >= 0 && selectedQuestions[i - 1].number == item.number){
                newList.push(selectedQuestions[i]);
                newList.push(item);
            }
            else{
                newList.push(selectedQuestions[i]);
            }
        }
        selectedQuestions = newList;
		
        write_list_selected();
    }
	
    function remove_all_questions(){
        for(var i = 0; i < selectedQuestions.length; i++){
            var item = selectedQuestions[i];
            // add to available questions
            availableQuestions.push(item);
        }
		
        selectedQuestions = new Array();
        chosenItems["selectedQuestions"] = new Array();
        chosenItems["availableQuestions"] = new Array();
        write_lists();
    }
	
    function remove_item_from_list(list, itemObj){
        var newList = new Array();
        for(var i = 0; i < list.length; i++){
            if(list[i].number != itemObj.number){
                newList.push(list[i]);
            }
        }
		
        return newList;
    }
	
    function remove_selected_questions(){
        for(var i = 0; i < chosenItems["selectedQuestions"].length; i++){
            var item = chosenItems["selectedQuestions"][i];
            // add to available questions
            availableQuestions.push(item);
			
            // remove from available questions
            selectedQuestions = remove_item_from_list(selectedQuestions, item);
        }
		
        chosenItems["selectedQuestions"] = new Array();
        chosenItems["availableQuestions"] = new Array();
        write_lists();
    }
    function list_questions(questions, listID, sortable){
        // var listID = "selectedQuestions";
        var list = questions;          		
        $("#" + listID).html(" ");
        var questionNumbers = new Array();
        var category_headers = new Array();
     if(listID == "selectedQuestions"){
            var count = 0;
            for(var j = 0; j < list.length; j++){
                if(jQuery.inArray(list[j].category, category_headers) == -1){
                    category_headers[count] = list[j].category;
                    count++;
                }
            }
         
     }else{
         category_headers = categoryHeaders;
     }
        
    //  console.log(category_headers);
        if(category_headers.length > 0){
            $("#" + listID).append("<ul class='categories'></ul>");
            
            for(var i = 0; i < category_headers.length; i++){
                var categoryPrinted = false;
                if(list.length > 0){ 		
                   
                    for(var j = 0; j < list.length; j++){
                        /** PRint the Category Headers **/
                        if(category_headers[i] == list[j].category){
                            if(categoryPrinted == false){
                                categoryPrinted = true;
                                var liHeader = $("<li id='category-" + i +"' class='header'></li>");
                                liHeader.html(category_headers[i]);
                                var checkAll = $("<input type='checkbox' cat_id='" + i + "' name='checkAll-" + category_headers[i] + "' />");
                                var ulQuestion = $("<ul class='" + listID + "' id='question-list-" + i + "'></ul>");
                                checkAll.click(                                  
                                    function(){
                                        /** Select All questions that aren't selected **/
                                        
                                        var checked = $(this).attr("checked");
                                        //Need to loop through each and select it
                                            
                                        $("#" + listID).find("ul." + listID + "#question-list-" + $(this).attr('cat_id')  + " li").each(function(){
                                                
                                            var link = $(this).find("a");
                                            if(checked){
                                                //If it is checked - and not yet selected
                                                if(!$(link).hasClass("highlighted") )
                                                    $(link).trigger("click");
                                            //    click_category(listID,list[j],true);
                                            }else{
                                                $(link).trigger("click");
                                            }
                                       
                                        });                                                                
                                    }
                                    );
                                
                                liHeader.append(checkAll);
                                
                                
                                //liHeader.append(content)
                                $("#"+listID).find("ul.categories").append(liHeader);
                                
                                $("#"+listID).find("li#category-" + i).append(ulQuestion);
                            //$("#" + listID).append("<ul></ul>");
                            }
                            questionNumbers.push(list[j].number);	
                            var li = $("<li  qid='" + list[j].number + "'></li>");
						
                            var anchor = $("<a id='" + itemIDPrefix + list[j].number + "' href='javascript:void(0);'></a>");
                            anchor.click(
                                function(){
                                    var item = list[j];
                                    return function(){
                                        click_item(listID,item);
                                    }
                                }()
                                );
						
                            anchor.html(list[j].text);
                           
                            $("#" + listID).find("ul." + listID + "#question-list-" + i).append(li);
                            li.append(anchor);
                        }
                    }
           
                }
            }
          
            if(listID=="selectedQuestions"){
                var value = questionNumbers.length > 0 ? questionNumbers.join(",") : "0";
                $("#userSelectedQuestions").val(value);
            }
        }
        if(sortable)
            $("#selectedQuestions ul").sortable();
         if(list.length == 0){
            $("#" + listID).html("<li>There are no questions</li>");
         }
    }
    /** This will be displayed selected questions by category **/
    /** This is still not wroking at the moment **/
    function write_questions_selected(){
        var listID = "selectedQuestions";
        var list = selectedQuestions;
            		
        $("#" + listID).html(" ");
        var questionNumbers = new Array();
        if(categoryHeaders.length > 0){
            $("#" + listID).append("<ul class='categories'></ul>")
            for(var i = 0; i < categoryHeaders.length; i++){
                var categoryPrinted = false;
                if(list.length > 0){ 		
                   
                    for(var j = 0; j < list.length; j++){
                      
                        if(categoryHeaders[i] == list[j].category){
                            if(categoryPrinted == false){
                                categoryPrinted = true;
                                var liHeader = $("<li id='category-" + i +"' class='header'></li>");
                                liHeader.html(categoryHeaders[i]);
                                $("#"+listID).find("ul.categories").append(liHeader);
                                var ulQuestion = $("<ul class='sel-questions' id='question-list-" + i + "'></ul>");
                                $("li#category-" + i).append(ulQuestion);
                            //$("#" + listID).append("<ul></ul>");
                            }
                            questionNumbers.push(list[j].number);	
                            var li = $("<li qid='" + list[j].number + "'></li>");
						
                            var anchor = $("<a id='" + itemIDPrefix + list[j].number + "' href='javascript:void(0);'></a>");
                            anchor.click(
                                function(){
                                    var item = list[j];
                                    return function(){
                                        click_item(listID,item);
                                    }
                                }()
                                );
						
                            anchor.html(list[j].text);
                           
                            $("ul#question-list-" + i).append(li);
                            li.append(anchor);
                        }
                    }
           
                }
            }
          
           
            var value = questionNumbers.length > 0 ? questionNumbers.join(",") : "0";
            $("#userSelectedQuestions").val(value);
        }
        $("#selectedQuestions ul").sortable();
    /** $("ul.sel-questions").sortable({
            placeholder: "ui-state-highlight"
        });**/
    //$("#" + listID).html($("#"+ listID).html() + " </li> ");
    }
    function write_avaliable_questions(){
        var listID = "availableQuestions";
        var list = availableQuestions;
		
        $("#" + listID).html(" ");
        if(categoryHeaders.length > 0){
            $("#" + listID).append("<ul class='categories'></ul>")
            for(var i = 0; i < categoryHeaders.length; i++){
                var categoryPrinted = false;
                if(list.length > 0){ 		
                   
                    for(var j = 0; j < list.length; j++){
                      
                        if(categoryHeaders[i] == list[j].category){
                            if(categoryPrinted == false){
                                categoryPrinted = true;
                                var liHeader = $("<li id='avaliable-category-" + i +"' class='header'></li>");
                                liHeader.html(categoryHeaders[i] + " Select <input type='checkbox' name='checkAll' /> ");
                                $("#" + listID).find("ul.categories").append(liHeader);
                                var ulQuestion = $("<ul class='questions' id='avaliable-question-list-" + i + "'></ul>");
                                $("li#avaliable-category-" + i).append(ulQuestion);
                            //$("#" + listID).append("<ul></ul>");
                            }
                            // questionNumbers.push(list[j].number);	
                            var li = $("<li qid='" + list[j].number + "'></li>");
						
                            var anchor = $("<a id='" + itemIDPrefix + list[j].number + "' href='javascript:void(0);'></a>");
                            anchor.click(
                                function(){
                                    var item = list[j];
                                    return function(){
                                        click_item(listID,item);
                                    }
                                }()
                                );
						
                            anchor.html(list[j].text);
                           
                            $("ul#avaliable-question-list-" + i).append(li);
                            li.append(anchor);
                        }
                    }
           
                }
            }
          
           
        /**  var value = questionNumbers.length > 0 ? questionNumbers.join(",") : "0";
            $("#userSelectedQuestions").val(value); **/
        }
        
        
    }
    /** OLD VERSION **/
    function write_list_available(){
        var listID = "availableQuestions";
        var list = availableQuestions;
		
        $("#" + listID).html(" ");
		
        if(categoryHeaders.length > 0){
            for(var i = 0; i < categoryHeaders.length; i++){
                var categoryPrinted = false;
				
                for(var j = 0; j < list.length; j++){
                    if(categoryHeaders[i] == list[j].category){
                        if(categoryPrinted == false){
                            categoryPrinted = true;
                            var liHeader = $("<li class='header'></li>");
                            liHeader.html(categoryHeaders[i]);
                            $("#" + listID).append(liHeader);
                            
                        }
						
                        var li = $("<li></li>");
						
                        var anchor = $("<a id='" + itemIDPrefix + list[j].number + "' href='javascript:void(0);'></a>");
                        anchor.click(
                            function(){
                                var item = list[j];
                                return function(){
                                    click_item(listID,item);
                                }
                            }()
                            );
						
                        anchor.html(list[j].text);
                        li.append(anchor);
                        $("#" + listID).append(li);
                    }
                }
            }
        }
        else{
            for(var j = 0; j < list.length; j++){
                var li = $("<li></li>");
				
                var anchor = $("<a id='" + itemIDPrefix + list[j].number + "' href='javascript:void(0);'></a>");
                anchor.click(
                    function(){
                        var item = list[j];
                        return function(){
                            click_item(listID,item);
                        }
                    }()
                    );
				
                anchor.html(list[j].text);
                li.append(anchor);
                $("#" + listID).adopt(li);
            }
        }
		
        if(list.length == 0){
            $("#" + listID).html("<li>There are no available questions</li>");
        }
    }
    function write_list_selected(){
        var listID = "selectedQuestions";
        var list = selectedQuestions;
		
        if(list.length > 0){
            $("#" + listID).html(" ");
            var questionNumbers = new Array();
			
            for(var i = 0; i < list.length; i++){
                var li = $("<li></li>");
				
                // add the arrows
				
                questionNumbers.push(list[i].number);
                // only show down arrow if not the last item in list
                if(i + 1 < list.length){
                    var downA = $("<a href='javascript:void(0);' class='imageAnchor'></a>");//new
					
                    downA.click(
                        function(){
                            var item = list[i];
                            return function(){
                                move_selected_item(item, "down");
                            }
                        }()
                        );
					
                    var downImg = $("<img src='/includes/modules/base/images/admin/icons-16/arrowDown.gif' />");
                    downA.append(downImg);
                    li.append(downA);
                }
                else{
                    var spacerImage = $("<img src='/includes/files/base/images/blank.gif' style='width: 16px,height:16px' />");
                    var spacerImageLink = $("<a class='imageAnchor'></a>");
                    spacerImageLink.append(spacerImage);
                    li.append(spacerImageLink);
                }
				
                // only show up  if not the first item in list
                if(i > 0){
                    var upA = $("<a href='javascript:void(0);' class='imageAnchor'></a>");
                    upA.click(
                        function(){
                            var item = list[i];
                            return function(){
                                move_selected_item(item, "up");
                            }
                        }()
                        );
					
                    var upImg = $("<img src='/includes/modules/base/images/admin/icons-16/arrowUp.gif' />");
                    upA.append(upImg);
                    li.append(upA);
                }else{
                    var spacerImage = $("<img src='/includes/files/base/images/blank.gif' style='width: 16px,height:16px' />");
                    var spacerImageLink = $("<a class='imageAnchor'></a>");
                    spacerImageLink.append(spacerImage);
                    li.append(spacerImageLink);
                }
				
				
                var anchor = $("<a id='" + itemIDPrefix + list[i].number + "' href='javascript:void(0);'></a>");
                anchor.click(
                    function(){
                        var item = list[i];
                        return function(){
                            click_item(listID,item);
                        }
                    }()
                    );
				
                anchor.html(list[i].text);
                li.append(anchor);
                $("#" + listID).append(li);
            }
			
            var value = questionNumbers.length > 0 ? questionNumbers.join(",") : "0";
            $("#userSelectedQuestions").val(value);
        }
        else{
            $("#" + listID).html("<li>There are no selected questions</li>");
        }
    }
    
	

    /** Creates the Lists **/
    function write_lists(){
        //var listID = "selectedQuestions";
        //var list = selectedQuestions;
        list_questions(selectedQuestions, "selectedQuestions", true);
        list_questions(availableQuestions, "availableQuestions", false);
    //write_list_selected();
    //  write_questions_selected()
        
    // write_list_available();
    // write_avaliable_questions();
    }
	
    init();
}
