/*###################################
#           Form Editing            #
###################################*/
/* Moves Option from Source to Dest */
function moveSelectOption(id, source, dest) {
	var form = document.getElementById(id);

	var selectedItem = form.elements[source].selectedIndex;
	var selectedText = form.elements[source].options[selectedItem].text;
	var selectedValue = form.elements[source].options[selectedItem].value;
	var availableLength = form.elements[dest].options.length;
	var isNew = true;
	
	//Find Match in Dest
	if (availableLength != 0) {
		for (i = 0; i < availableLength; i++) {
			var t = form.elements[dest].options[i].text;
			var v = form.elements[dest].options[i].value;
			if (t == selectedText && v == selectedValue) {
				isNew = false;
				break;
			}
		}
	}
	if (isNew) {
		//Add to Dest
		newoption = new Option(selectedText, selectedValue, false, false);
		form.elements[dest].options[availableLength] = newoption;
	
		//Remove from Source
		form.elements[source].options[selectedItem] = null;
	}
	sortOptions(form.elements[source]);
	sortOptions(form.elements[dest]);
}

/* Highlight All */
function allSelect(id, source){
	var list =  document.getElementById(id).elements[source];
	document.getElementById(id).elements[source].multiple = true;
	for ( i=0; i < list.options.length; i++) { list.options[i].selected = true; }
}


/*###################################
#       Window/Object Data          #
###################################*/
function getScrollXY() {
	var scrOfX = 0, scrOfY = 0;
	if ( typeof( window.pageYOffset ) == 'number' ) {
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	return [ scrOfX, scrOfY ];
}

function getPos (obj) {
	var output = new Object();
	var mytop=0, myleft=0;
	while( obj) {
		mytop+= obj.offsetTop;
		myleft+= obj.offsetLeft;
		obj= obj.offsetParent;
	}
	output.left = myleft;
	output.top = mytop;
	return output;
}



//Example: getHighlightedTextarea("file_display")
function getHighlightedTextarea (id) {
	//IE >:(
	if( -1 != navigator.userAgent.indexOf ("MSIE") ) {
		alert("This function doesn't work in Internet Explorer.");
	}

	//Mozilla
	if( -1 != navigator.userAgent.indexOf ("Mozilla") ) {
		var textarea = document.getElementById(id);
		var len = textarea.value.length;
		var start = textarea.selectionStart;
		var end = textarea.selectionEnd;
		var sel = textarea.value.substring(start, end);
		textarea.focus();
		//alert(start + " " + end);
		return [start, end]
	}

}
//Example: setHighlightedTextarea("file_display", 14 , 476)
function setHighlightedTextarea (id , start, end) {
	//IE >:(
	if( -1 != navigator.userAgent.indexOf ("MSIE") ) {
		alert("This function doesn't work in Internet Explorer.");
	}

	//Mozilla
	if( -1 != navigator.userAgent.indexOf ("Mozilla") ) {
		var textarea = document.getElementById(id);
		textarea.focus();
		textarea.selectionStart = start;
		textarea.selectionEnd =  end;
	}
}

//Might be too specialized for 'helpers.js'?
function bookmarkHighlightedTextareaRange (id , newId) {
	var textRange = getHighlightedTextarea(id);
	document.getElementById(newId).value += '(TEXT:' + textRange[0] + '-' + textRange[1] + ')';
	document.getElementById(newId).focus();
}

/*###################################
           Array Functions
###################################*/
function compareOptionText(a,b) {
	/*
	return	>0 if a>b
			 0 if a=b
    		<0 if a<b
	*/
	// textual comparison
	return a.text!=b.text ? a.text<b.text ? -1 : 1 : 0;
	// numerical comparison
	//  return a.text - b.text;

}

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);
}

/*###################################
           Text Functions
###################################*/
function createQTlinks(input){
	var string = 'This is (RANGE:1-300) the test (FRAME:244) string that will be changed. Like (FRAME:4) and (RANGE:14-67)';
	var obj = 'document.file_img';
	
	var frameJS = '<a href=\"javascript:linkFrameText(' + obj + ',\'$1\');\">FRAME:$1</a>';
	var rangeJS = '<a href=\"javascript:linkRangeText(' + obj + ',\'$1\', \'$2\');\">RANGE:$1-$2</a>';

	var convertedString = string.replace(/\(FRAME:([0-9]+)\)/g,frameJS);
	var convertedString = convertedString.replace(/\(RANGE:([0-9]+)-([0-9]+)\)/g,rangeJS);
	return convertedString;
}



/*###################################
           Math Functions
###################################*/
//Generic Animation Step Value Generator By www.hesido.com
function easeInOut(minValue,maxValue,totalSteps,actualStep,powr) {
	var delta = maxValue - minValue;
	var stepp = minValue+(Math.pow(((1 / totalSteps)*actualStep),powr)*delta);
	return Math.ceil(stepp)
}

/*###################################
                CSS
###################################*/
function hasClass(ele,cls) {
	return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
function addClass(ele,cls) {
	if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}
function removeClass(ele,cls) {
	if (hasClass(ele,cls)) {
		var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
		ele.className=ele.className.replace(reg,' ');
	}
}


