/** Cookie functions **/
function cookieSet(name, value) {  
	var argv = cookieSet.arguments;  
	var argc = cookieSet.arguments.length;  
	var expires = (argc > 2) ? argv[2] : null;  
	var secure = (argc > 5) ? argv[5] : false;  
	document.cookie = name + "=" + escape (value) + 
		((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
		((secure == true) ? "; secure" : "") +
		"; path=/";
}

function cookieGetVal(offset) {  
	var endstr = document.cookie.indexOf (";", offset);  
	if (endstr == -1)    
		endstr = document.cookie.length;  
		return unescape(document.cookie.substring(offset, endstr));
}

function cookieGet(name) {  
	var arg = name + "=";  
	var alen = arg.length;  
	var clen = document.cookie.length;  
	var i = 0;  
	while (i < clen) {    
		var j = i + alen;    
		if (document.cookie.substring(i, j) == arg)      
			return cookieGetVal(j);    
		i = document.cookie.indexOf(" ", i) + 1;    
		if (i == 0) break;   
	}  
	return null;
}

/** Array functions **/
function isArray(x) {
	// Check if x is an array
    if (x instanceof Array) {
    	return true;
    }
    else if (typeof x == "object") {
    	return true;
    }
    else {
    	return false;
    }
}

function arrayDiff(arrayOrig, arrayChanged) {
	// Init new array for holding the difference between the two arrays
	var arrayDelta = new Array();
	var arrayTmp;
	
	// If the changed array is either not an array, return empty array
	if ( (!(isArray(arrayChanged))) || (arrayLen(arrayChanged) == 0) ) {
		return arrayDelta;
	}
	
	// If the orig array is empty, just return the changed array
	//  (no point in computing the diff)
	if (!(isArray(arrayOrig))) {
		return arrayChanged;
	}
	
	// Run through each element in the array
	for (x in arrayChanged) {
		//document.write("Element: " + x + "<br/>");
		if (_endOfArray(arrayChanged,x)) {
			break;
		}
		if (arrayChanged[x] != arrayOrig[x]) {
			if (isArray(arrayChanged[x])) {
			//document.write("recurs A<br/>");
				arrayDelta[x] = arrayDiff(arrayOrig[x],arrayChanged[x]);
				if (arrayLen(arrayDelta[x]) == 0) {
					//document.write("recurs B" + x + " " + arrayDelta[x] + "<br/>");
					delete arrayDelta[x];
				} 
			}
			else if (_endOfArray(arrayOrig,x)) {
				//do nothing
			}
			else {
				arrayDelta[x] = arrayChanged[x];
			}
		} 
	}
	//document.write("return<br/>");
	return arrayDelta;
}

function arrayJoinRecursive(arrayOrig,arrayDelta) {
	var arrayJoin = arrayClone(arrayOrig);
	for (x in arrayDelta) {
		if (isArray(arrayDelta[x])) {
			if (arrayOrig[x] == null) {
				arrayJoin[x] = arrayDelta[x];
			}
			else {
				arrayJoin[x] = arrayJoinRecursive(arrayOrig[x],arrayDelta[x]);
			}
		}
		else {
			arrayJoin[x] = arrayDelta[x];
		}
	}
	return arrayJoin;
}

function _endOfArray(myArray,currentIndex) {
	//if (myArray[currentIndex] == myArray['each']) {
	if (typeof myArray[currentIndex] == "function") {
		return true;
	}
	else {
		return false;
	}
}

function arrayLen(myArray) {
	var len = 0;
	for (x in myArray) {
		if (_endOfArray(myArray,x)) {
			break;
		} 
		len++;
	}
	return len;
}

function arrayToJson(myArray) {
	// Init JSON string variable
	var jsonString = "{";
	var elementCount = 0;
	var arraySize = arrayLen(myArray);
	
	// Run through each element in the array
	for (x in myArray) {
		// If we reached end of array, exit
		if (_endOfArray(myArray,x)) {
			break;
		}
		
		// Increase element count
		elementCount++;
		
		// Add the key to the string
		jsonString += '"' + x + '"' + ':';
		
		// Handle array value
		if (isArray(myArray[x])) {
			jsonString += arrayToJson(myArray[x]);
		}
		// Handle string
		else if (typeof myArray[x] == "string") {
			jsonString += '"' + myArray[x] + '"';
		}
		// Handle everything else
		else {
			jsonString += myArray[x];
		}
		
		// If this is not the last key, add a comma
		if (elementCount<arraySize) {
			jsonString += ",";
		}
	}
	
	// Close array with }
	jsonString += "}";
	
	return jsonString;
}

function arrayClone(myArray) {
	// Init JSON string variable
	var arrayCopy = new Array();
	
	// Run through each element in the array
	for (x in myArray) {
		// If we reached end of array, exit
		if (_endOfArray(myArray,x)) {
			break;
		}
		
		// Handle array value
		if (isArray(myArray[x])) {
			arrayCopy[x] = arrayClone(myArray[x]);
		}
		// Handle everything else
		else {
			arrayCopy[x] = myArray[x];
		}
	}
	
	return arrayCopy;
}


/** Misc functions **/
function randomInteger(maxValue) {
	if (segmentCount == 0) {
		return null;
	}
	else {
		return Math.floor(Math.random()*(maxValue+1));
	}
}

function timeTimedCode(codeString,delaySeconds) {	
	window.setTimeout("codeString",String(delaySeconds*1000));
}

/** Functions for testing **/
// If local cookie etc.