/////////////////////////////////////////////////////
///SHUFFLE APP
/////////////////////////////////////////////////////
var globalShuffleFilterObjectContainer = [];

function MoveListItems(lstAvailable, lstSelected, All){
	var LstLeft;
	var LstRight;
	var Removed = '';
	
	var LstLeft = document.getElementById(lstAvailable);
	var LstRight = document.getElementById(lstSelected);

	//var LstLeftOriginalArray = $(LstLeft).attr("originalArray").split("|");
	var LstLeftOriginalArray = [];
	var LstRightOriginalArray = [];
	/*if ($(LstRight).attr("originalArray")) {
	    LstRightOriginalArray = $(LstRight).attr("originalArray").split("|");
	}*/
	if (getShuffleFilterObject(lstAvailable)) {
	    //LstLeftOriginalArray = LstLeft.originalArray;
	    LstLeftOriginalArray = getShuffleFilterObject(lstAvailable);
	}
	else {
	    LstLeftOriginalArray = initShuffleFilterObject(lstAvailable);
	}
	if (getShuffleFilterObject(lstSelected)) {
	    //LstRightOriginalArray = LstRight.originalArray;
	    LstRightOriginalArray = getShuffleFilterObject(lstSelected);
	}
	else {
	    LstRightOriginalArray = initShuffleFilterObject(lstSelected);
	}
	//alert("LstLeftoriginalArray.length : " + LstLeftOriginalArray.length);
	//alert("LstRightOriginalArray.length : " + LstRightOriginalArray.length);
	for (var i=0; i<LstLeft.options.length; i++){
		if (LstLeft.options[i].value != 0){
			if (LstLeft.options[i].selected && All == false) {
			    LstRight.options[LstRight.options.length] = new Option(LstLeft.options[i].text, LstLeft.options[i].value, true);
			    LstRightOriginalArray.push(new Option(LstLeft.options[i].text, LstLeft.options[i].value, true));
				Removed = Removed + LstLeft.options[i].value + ',';
			}
			else if(All == true){
			    LstRight.options[LstRight.options.length] = new Option(LstLeft.options[i].text, LstLeft.options[i].value, true);
			    LstRightOriginalArray.push(new Option(LstLeft.options[i].text, LstLeft.options[i].value, true));
				Removed = Removed + LstLeft.options[i].value + ',';
			}
		}
	}
	if (Removed != ''){
	    RemoveFromList(LstLeft, Removed);
	    if (LstLeftOriginalArray) {
	        RemoveFromArray(LstLeftOriginalArray, Removed);
	    }
	}
	//Update the arrays
	/*$(LstLeft).attr("originalArray", LstLeftOriginalArray.join("|"));
	$(LstRight).attr("originalArray", LstRightOriginalArray.join("|"));*/
	//LstLeft.originalArray = LstLeftOriginalArray;
	//LstRight.originalArray = LstRightOriginalArray;
	setShuffleFilterObject(lstAvailable, LstLeftOriginalArray);
	setShuffleFilterObject(lstSelected, LstRightOriginalArray);
	/*sortOptions(LstLeft);
	sortOptions(LstRight);*/
}

function RemoveFromList (Lst, Items){
	var Removed = Items.split(',');
	for (var j = 0; j < Removed.length; j++) {
        for (var x = 0; x < Lst.options.length; x++) {
            if (/*Lst.options[x] != null && */Lst.options[x].value == Removed[j]) {
		        //Lst[x] = null;
                Lst.remove(x);
                break;
		    }
	    }
	}
}

function RemoveFromArray(Arr, Items) {
    var Removed = Items.split(',');
    for (var j = 0; j < Removed.length; j++) {
        for (var x = 0; x < Arr.length; x++) {
            if (/*Lst.options[x] != null && */Arr[x].value == Removed[j]) {
                //Lst[x] = null;
                //alert("removed : " + Arr[x].text);
                Arr.splice(x, 1);
                break;
            }
        }
    }
    //alert(Arr.length);
}

function clearGlobalShuffleObjectContainer() {
    //alert("cleared shuffle object");
    globalShuffleFilterObjectContainer = [];
}

function getShuffleFilterObject(id) {
    for (var i = 0; i < globalShuffleFilterObjectContainer.length; i++) {
        if (globalShuffleFilterObjectContainer[i].id == id) {
            //alert("found filter object for : " + id);
            return globalShuffleFilterObjectContainer[i].value;
        }
    }
    return null;
}

function setShuffleFilterObject(id,value) {
    for (var i = 0; i < globalShuffleFilterObjectContainer.length; i++) {
        if (globalShuffleFilterObjectContainer[i].id == id) {
            globalShuffleFilterObjectContainer[i].value = value;
            return globalShuffleFilterObjectContainer[i];
        }
    }
    globalShuffleFilterObjectContainer.push({ "id": id, "value": value })
    return value;
}

function initShuffleFilterObject(ListBox) {
    var originalFilterArray = new Array();
    var ObjList = document.getElementById(ListBox);
    for (var k = 0; k < ObjList.options.length; k++) {
        originalFilterArray.push(ObjList[k]);
    }
    return setShuffleFilterObject(ListBox, originalFilterArray);
}


function compareOptionText(a, b) {
    //Textual comparison
    return a.text != b.text ? a.text < b.text ? -1 : 1 : 0;
}

function sortOptions(list) {
    var items = list.options.length;
    //Create array and make copies of options in list
    var tmpArray = new Array(items);
    for (i = 0; i < items; i++) {
        tmpArray[i] = new Option(list.options[i].text, list.options[i].value);
    }
    //Sort options using given function
    tmpArray.sort(compareOptionText);
    //Make copies of sorted options back to list
    for (i = 0; i < items; i++) {
        list.options[i] = new Option(tmpArray[i].text, tmpArray[i].value);
    }
}

function SearchList(ObjInput, ListBox, e){
    if (isEnterKey(e) == true) {
        var ObjList = document.getElementById(ListBox);
        //Create temporary arrays containers
        var originalFilterArray = new Array();
        var newFilterArray = new Array();
        //If "originalArray" attribute is already set, fetch it
        if (getShuffleFilterObject(ListBox)) {
            originalFilterArray = getShuffleFilterObject(ListBox);
            //originalFilterArray = ObjList.originalArray;
            //originalFilterArray = $(ObjList).attr("originalArray").split("|");
            //alert("Using the existing original Array for this selectbox : " + ListBox);
        }
        //If "originalArray" attribute is NOT already set, set it to the current options list
        else {
            for (var k = 0; k < ObjList.options.length; k++) {
                originalFilterArray.push(ObjList[k]);
            }
            setShuffleFilterObject(ListBox, originalFilterArray);
            //ObjList.originalArray = originalFilterArray
            //$(ObjList).attr("originalArray",originalFilterArray.join("|"));
            //alert("Initialising original Array for this selectbox : " + ListBox);
        }
        //alert(ListBox + " originalFilterArray.length :" + originalFilterArray.length);
        //Clear all current options from target box
        var clearLength = ObjList.options.length;
        for (var k = 0; k < clearLength; k++) {
            ObjList.options[0] = null;
        }
        //If non-blank search - filter options
        if (ObjInput.value != "") {
            //alert(ListBox + " filtering...");
            //Get search value (forced uppercase)
            var searchText = ObjInput.value.toUpperCase();
            //Loop through options and add any regexp match that's found
            for (var k = 0; k < originalFilterArray.length; k++) {
                //Get search value (forced uppercase)
                var searchIn = null;
                var errorLog = "";
                try {
                    searchIn = originalFilterArray[k].text.toUpperCase();
                }
                catch (ex) {
                    errorLog += "|" + k;
                }
                if (errorLog.length > 0) {
                    alert("Error(s) occured during filter of " + ListBox + ":\n" + errorLog);
                }
                //Do RegExp matching, add if valid
                var patt = new RegExp(searchText);
                if (patt.test(searchIn)) {
                    ObjList.options.add(originalFilterArray[k]);
                }
            }
        }
        //If blank search - Restore all original options.
        else {
            //alert(ListBox + " restoring original state...");
            for (var m = 0; m < originalFilterArray.length; m++) {
                if (originalFilterArray[m]) {
                    ObjList.options.add(originalFilterArray[m]);
                }
            }
        }
	}
}

/*
function sortOptions(list) {
    var items = list.options.length;
    //Create array and make copies of options in list
    var tmpArray = new Array(items);
    for (i = 0; i < items; i++) {
        tmpArray[i] = new Option(list.options[i].text, list.options[i].value);
    }
    //Sort options using given function
    tmpArray.sort(compareOptionText);
    //Make copies of sorted options back to list
    for (i = 0; i < items; i++) {
        list.options[i] = new Option(tmpArray[i].text, tmpArray[i].value);
    }
}
*/
/*
function SearchList(ObjInput, ListBox, e){
    if (isEnterKey(e) == true) {
        var ObjList = document.getElementById(ListBox);
        //Create temporary arrays containers
        var originalFilterArray = new Array();
        var newFilterArray = new Array();
        //If "originalArray" attribute is already set, fetch it
        if (getShuffleFilterObject(ListBox)) {
            originalFilterArray = getShuffleFilterObject(ListBox);
            //originalFilterArray = ObjList.originalArray;
            //originalFilterArray = $(ObjList).attr("originalArray").split("|");
            //alert("Using the existing original Array for this selectbox : " + ListBox);
        }
        //If "originalArray" attribute is NOT already set, set it to the current options list
        else {
            for (var k = 0; k < ObjList.options.length; k++) {
                originalFilterArray.push(ObjList[k]);
            }
            setShuffleFilterObject(ListBox, originalFilterArray);
            //ObjList.originalArray = originalFilterArray
            //$(ObjList).attr("originalArray",originalFilterArray.join("|"));
            //alert("Initialising original Array for this selectbox : " + ListBox);
        }
        //alert(ListBox + " originalFilterArray.length :" + originalFilterArray.length);
        //Clear all current options from target box
        var clearLength = ObjList.options.length;
        for (var k = 0; k < clearLength; k++) {
            ObjList.options[0] = null;
        }
        //If non-blank search - filter options
        if (ObjInput.value != "") {
            //alert(ListBox + " filtering...");
            //Get search value (forced uppercase)
            var searchText = ObjInput.value.toUpperCase();
            //Loop through options and add any regexp match that's found
            for (var k = 0; k < originalFilterArray.length; k++) {
                //Get search value (forced uppercase)
                var searchIn = null;
                var errorLog = "";
                try {
                    searchIn = originalFilterArray[k].text.toUpperCase();
                }
                catch (ex) {
                    errorLog += "|" + k;
                }
                if (errorLog.length > 0) {
                    alert("Error(s) occured during filter of " + ListBox + ":\n" + errorLog);
                }
                //Do RegExp matching, add if valid
                var patt = new RegExp(searchText);
                if (patt.test(searchIn)) {
                    ObjList.options.add(originalFilterArray[k]);
                }
            }
        }
        //If blank search - Restore all original options.
        else {
            //alert(ListBox + " restoring original state...");
            for (var m = 0; m < originalFilterArray.length; m++) {
                if (originalFilterArray[m]) {
                    ObjList.options.add(originalFilterArray[m]);
                }
            }
        }
	}
}
*/
