/********************************************************************************************************
**	CF Site Manager
********************************************************************************************************
**	Copyright: © 2007 Wave Works Design, LLC -  http://www.WaveWorksDesign.com
**	Author: Jason Tully (JTully@WaveWorksDesign.com)
**	License: SEE LICENSE.txt For Details
**------------------------------------------------------------------------------------------------------
**	PageName: CommonJSLib.js
**	Type: JavaScript
**	Directory Level: /Scripts/
**	Purpose: 	This is file holds common javascript functions used throughout the CMS.
**------------------------------------------------------------------------------------------------------
**	Change Date:		Reason:					Version State	
**	11/27/06				Created						.5 Alpha
*******************************************************************************************************/

/***************************************************************************************
* Class: JSLib 
* Desc: Contains a library of functions used throughout the CMS and store system
* Usage: JSLib.functionName
****************************************************************************************/
var JSLib = {
	
	/***************************************************************************************
	* Function: JSLib.GetWindowSize()
	* Desc: Gets the width of a window. This function does NOT get the screen width!
	* Usage: JSLib.GetWindowSize().height, JSLib.GetWindowSize().width
	****************************************************************************************/
	GetWindowSize: function() {
		var WinSize = new Object();
		WinSize.width = ''
		WinSize.height = ''
		
		if (window.innerWidth) {
			WinSize.width = window.innerWidth
			WinSize.height = window.innerHeight
			return WinSize;
		} 
		else if (document.body.clientWidth) {
			WinSize.width = document.body.clientWidth
			WinSize.height = document.body.clientHeight
			return WinSize
		} 
		else {
			return 100;
		}
	},//JSLib.GetWindowSize
	
	/***************************************************************************************
	* Function: JSLib.SetScreenSize()
	* Desc: Gets the width and hight of the screen, and returns a new value. Used for popup windows.
	* Usage: JSLib.GetWindowSize().height, JSLib.GetWindowSize().width
	****************************************************************************************/
	SetScreenSize: function() {
		
		var ScreenSize = new Object();
		ScreenSize.width = ''
		ScreenSize.height = ''
	
		switch(screen.width)
			{ 
				case 800: 
					ScreenSize.width 	= 600
					ScreenSize.height 	= 400;
				break;
		
				case 1024: 
					ScreenSize.width 	= 800;
					ScreenSize.height 	= 600;
				break;
	
				case 1280: 
					ScreenSize.width 	= 800;
					ScreenSize.height 	= 600;
				break;
				
				case 1152: 
					ScreenSize.width 	= 1024;
					ScreenSize.height 	= 768;
				break;
	
				case 1440: 
					ScreenSize.width 	= 600;
					ScreenSize.height 	= 480;
				break;
				
				case 1600: 
					ScreenSize.width 	= 1400;
					ScreenSize.height 	= 800;
				break;
				
				default:
					ScreenSize.width 	= screen.width;
					ScreenSize.height 	= screen.height;
		
			}//END SWITCH
		
			return ScreenSize;
	
	},//JSLib.GetWindowSize

	/***************************************************************************************
	* Function: JSLib.CreateDHTMLModalWin()
	* Desc: Opens an DHTML window as an IFRAME
	* Usage: JSLib.CreateDHTMLModalWin('FileManager','File Manager', '/Admin/FileManager/FileManager.cfm?Dir=' + LoadDir + '&DspFiles=False&CallerField=ServerFile&CallerWindow=' + this.GetWindowName(),'965px','545px');
	****************************************************************************************/
	CreateDHTMLModalWin: function(ID,title, url,width,height,resize,scrolling,center) {
		
		//SET DEFAULT ARGUMENTS
		var resize 		= typeof(resize) != 'undefined' ? resize : 1;
		var scrolling 	= typeof(width) != 'undefined' ? scrolling : 1;
		var center 		= typeof(center) != 'undefined' ? center : 1;
		var setScreen = false;
		
		//Is width/height set?
		if(typeof(width) == 'undefined' || typeof(height) == 'undefined') {
			var setScreen = true;
		}
		//If yes, make sure it's not greater than what the users screen is
		else if(width == '' || height == '') {
			var setScreen = true;
		}
		
		else {
			if(width > screen.width || height > screen.height) {
				var setScreen = true;	
			}
				
		}
	
		//Set Width/Height if it's not yet set.
		if(setScreen) {
			var width 	= this.SetScreenSize().width;
			var height 	= this.SetScreenSize().height;
			
		}//end If
		var ArgString = 'width=' + width + 'px, height=' + height + 'px, resize=' + resize + ', scrolling=' + scrolling + ',center=' + center;
		DHTMLModalWin = dhtmlmodal.open(ID, 'iframe', url, title, ArgString);
	},//CreateDHTMLModalWin
	
	
	/***************************************************************************************
	* Function: JSLib.CreateDHTMLModalDiv()
	* Desc: Opens an DHTML window as an DIV
	* Usage: JSLib.CreateDHTMLModalDiv('MyWindow','External Window', '/CFDOCS/Legis/SomeFile.cfm','965px','545px');
	****************************************************************************************/
	CreateDHTMLModalDiv: function(ID,title, divname ,width,height,resize,scrolling,center) {
		
		//SET DEFAULT ARGUMENTS
		var resize 		= typeof(resize) != 'undefined' ? resize : 1;
		var scrolling 	= typeof(width) != 'undefined' ? scrolling : 1;
		var center 		= typeof(center) != 'undefined' ? center : 1;
		var setScreen = false;
		
		//Is width/height set?
		if(typeof(width) == 'undefined' || typeof(height) == 'undefined') {
			var setScreen = true;
		}
		//If yes, make sure it's not greater than what the users screen is
		else if(width == '' || height == '') {
			var setScreen = true;
		}
		
		else {
			if(width > screen.width || height > screen.height) {
				var setScreen = true;	
			}
				
		}
	
		//Set Width/Height if it's not yet set.
		if(setScreen) {
			var width 	= this.SetScreenSize().width;
			var height 	= this.SetScreenSize().height;
			
		}//end If
		var ArgString = 'width=' + width + 'px, height=' + height + 'px, resize=' + resize + ', scrolling=' + scrolling + ',center=' + center;
		DHTMLModalDiv = dhtmlmodal.open(ID, 'div', divname, title, ArgString);
	},//CreateDHTMLModalDiv


/***************************************************************************************
	* Function: PopWindow()
	* Desc: Executes a popup window based on screen resolution. 
	* Usage: onclick="JSLib.PopWindow('/index.cfm?Print=1',1)"
	* Args: printwindow - 1 = display menu bar, 0 = do not display menu bar
	****************************************************************************************/
	PopWindow: function(url,printwindow) {
		
		//SET DEFAULT ARGUMENT	
		printwindow = typeof(printwindow) != 'undefined' ? printwindow : 0;
		
		//CHECK ARGUMENT FOR PRINT WINDOW
		if(printwindow == 0) {
			var ShowMenuBar = 0;
		}
		
		else if(printwindow == 1) {
			var ShowMenuBar = 1;
		}
			
		//COMMON VALUES
		var name		="NewWindow";
		var menubar		= ShowMenuBar;
		var location 	= 0;
		var scrollbars 	= 0;
		var directories	= 0;
		var toolbar 	= 0;
		var resizable 	= 1;
		var status 		= 0;
	
		//Get and resize screen width and hight
		var width 	= this.SetScreenSize().width;
		var height 	= this.SetScreenSize().height;
		
			
			//Apply Settings
			var left 		= LeftPosition=(screen.width)?(screen.width-width)/2:100;
			var top 		= (screen.height)?(screen.height-height)/2:100;
			var	settings	='width='+width+',height='+height+',top='+top+',left='+left+',scrollbars='+scrollbars+',location='+location+',directories='+directories+',status='+status+',menubar='+menubar+',toolbar='+toolbar+',resizable='+resizable;
		
			//Execute Window
			window.open(url, name, settings); 
		return false
	}, //JSLib.PopWindow()

	/***************************************************************************************
	* Function: JSLib.CreateDHTMLModalWin()
	* Desc: Opens an DHTML window as an IFRAME
	* Usage: JSLib.CreateDHTMLModalWin('FileManager','File Manager', '/Admin/FileManager/FileManager.cfm?Dir=' + LoadDir + '&DspFiles=False&CallerField=ServerFile&CallerWindow=' + this.GetWindowName(),'965px','545px');
	****************************************************************************************/
	CloseDHTMLModalWin: function() {
		DHTMLModalWin.hide()
	}, //CloseDHTMLModalWin
	
	/***************************************************************************************
	* Function: JSLib.LoadingButton()
	* Desc: Disables a button to prevent double clicking
	* Usage: onclick="JSLib.LoadingButton(this, 'Saving Data...');
	****************************************************************************************/
	LoadingButton: function(elem, Text) {
		Text = typeof(Text) != 'undefined' ? Text : "Please Wait...";
		elem.value = Text;
		elem.disabled = "disabled";
		$('TinyLoader').style.visibility = 'visible';
	},// LoadingButton
	
	/***************************************************************************************
	* Function: JSLib.DHTMLModalDiv()
	* Desc: Closes the window opened by JSLib.CreateDHTMLModalDiv()
	* Usage: JSLib.DHTMLModalDiv()
	****************************************************************************************/
	CloseDHTMLModalDiv: function() {
		//$('interVeil').style.display="none";
		DHTMLModalDiv.hide()
	}, //DHTMLModalDiv

	/***************************************************************************************
	* Function: CheckAll
	* Desc: Selects an entire group of checkboxes.
	* Usage: onClick="JSLib.CheckAll($('PIDs'));"
	****************************************************************************************/
	CheckAll: function(field){
		for (i = 0; i < field.length; i++)
			field[i].checked = true ;
	},//CheckAll()
	
	/***************************************************************************************
	* Function: UnCheckAll
	* Desc: Deselects an entire group of checkboxes.
	* Usage: onClick="JSLib.UnCheckAll($('PIDs'));"
	****************************************************************************************/
	UnCheckAll: function(field){
		for (i = 0; i < field.length; i++)
		field[i].checked = false ;
	},//JSLib.UnCheckAll()
	

	/***************************************************************************************
	* Function: ChangeCase
	* Desc: Changes form field string to sentence case.
	* Usage: onblur="JSLib.ChangeCase(this)
	****************************************************************************************/
	ChangeCase: function(frmObj) {
		var index;
		var tmpStr;
		var tmpChar;
		var preString;
		var postString;
		var strlen;
		tmpStr = frmObj.value.toLowerCase();
		strLen = tmpStr.length;
		if (strLen > 0)  {
			for (index = 0; index < strLen; index++)  {
				if (index == 0)  {
					tmpChar = tmpStr.substring(0,1).toUpperCase();
					postString = tmpStr.substring(1,strLen);
					tmpStr = tmpChar + postString;
					}
				else {
					tmpChar = tmpStr.substring(index, index+1);
					tmpChar2 = tmpStr.substring(index-1, index+1);
					if ((tmpChar == " " || tmpChar2 == "Mc" || tmpChar2 == "P." || tmpChar2 == "PO") && index < (strLen-1))  {
						tmpChar = tmpStr.substring(index+1, index+2).toUpperCase();
						preString = tmpStr.substring(0, index+1);
						postString = tmpStr.substring(index+2,strLen);
						tmpStr = preString + tmpChar + postString;
								}
						}
					}		
			}
		frmObj.value = tmpStr;
	},//JSLib.ChangeCase(frmObj)

	/***************************************************************************************
	* Function: JumpMenu
	* Desc: Relocates to the value in the "value" of the option
	* Usage: onClick=JSLib.umpMenu(this.value);
	****************************************************************************************/
	JumpMenu: function(targ,selObj,restore){ //v3.0
	  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
	  if (restore) selObj.selectedIndex=0;
	}, //JSLib.JumpMenu()
	
	/***************************************************************************************
	* Function: SelectOptionInList
	* Desc: Given a select list and an ID search the list for the option with the matching ID and select it.
	* Usage: JSLib.SelectOptionInList($('CategoryName'),'Computers');
	****************************************************************************************/
	SelectOptionInList: function(SelectListElem, theValue ){
		try
		{
			var intIndex = 0;
			  // Loop through all the options
			  for( intIndex = 0; intIndex < SelectListElem.options.length; intIndex++ )
			  {
					// Is this the ID we are looking for?
					if( SelectListElem.options[intIndex].value == theValue )
					{
						  // Select it
						  SelectListElem.selectedIndex = intIndex;
						  // Yes, so stop searching
						  break;
					}
			  }
		}
		catch( expError )
		{
			  alert( "SelectOptionInList( ).\n" +
						  "Error:" + expError.number + ", " + expError.description );
		}
	}, //SelectOptionInList

	
	/***************************************************************************************
	* Function: GetFileExtension()
	* Desc: Gets a file extention of a string passed, or of a form element.
	* Usage: 
	****************************************************************************************/
	GetFileExtension: function (ElementID) {
		//If a ELEMENT wasn't passed, but a name was instead?
		if($(ElementID) == null) {
			var fileinput = ElementID;	
			var filename = fileinput; 
		}
		else {
			var fileinput = $(ElementID); 
			var filename = fileinput.value; 
		}
		if(!fileinput ) return ""; 
		if( filename.length == 0 ) return ""; 
		var dot = filename.lastIndexOf("."); 
		if( dot == -1 ) return ""; 
		var extension = filename.substr(dot + 1,filename.length); 
		extentsion = extension.toLowerCase();
		//alert("Value from GetFileExtension(): " + extension);
		return extension; 
	},//GetFileExtension
	
	/***************************************************************************************
	* Function: CheckFileExt()
	* Desc: Checks if the file extention passed, matches any of the allowed or disallowed passed.
	* Usage: 
	****************************************************************************************/
	CheckFileExt: function(ElementID, AllowedExt, DisallowedExt) { 
	 var Extension = this.GetFileExtension(ElementID); 
	
	 var AllowedArray = AllowedExt.split(",");
	 var DisallowedArray = DisallowedExt.split(",");
	
	 //Is Extension found in Allowed List?	
	 var FoundAllowed = false;
	 for(var i=0; i<AllowedArray.length; i++){
		  //do something by accessing valueArray[i];
		  if(AllowedArray[i] == Extension) {
		   FoundAllowed = true;
		   }
		}
		
	 //Is Extension found in DisAllowed List?	
	 var FoundDisAllowed = false;
	 for(var i=0; i<DisallowedArray.length; i++){
		  //do something by accessing valueArray[i];
		  if(DisallowedArray[i].toLowerCase() == Extension.toLowerCase()) {
		   FoundDisAllowed = true;
		   }
		}
	 
	 if(FoundAllowed == true && FoundDisAllowed == false) 
	  //alert("Extension OK!"); 
	  return true;
	 else 
	  //alert("Extensions is NOT OK"); 
	  return false
	}, //GetFileExtension
	
	/***************************************************************************************
	* Function: CheckFileName()
	* Desc: Checks if a file name compatable with the web/filesystem
	* Usage: 
	****************************************************************************************/
	CheckFileName: function(ElementID){
	
		var x = $(ElementID).value;
		var isBad = false;
		  //alert(x)
		  if(x.search(/\*/g) !== -1){ isBad = true; } 	  // check *
		  if(x.search(/\[/g) !== -1){ isBad = true; }     // check [
		  if(x.search(/\]/g) !== -1){ isBad = true; }     // check ]
		  if(x.search(/\</g) !== -1){ isBad = true; }     // check <
		  if(x.search(/\>/g) !== -1){ isBad = true; }     // check >
		  if(x.search(/\=/g) !== -1){ isBad = true; }     // check =
		  if(x.search(/\+/g) !== -1){ isBad = true; }     // check +
		  if(x.search(/\'/g) !== -1){ isBad = true; }     // check '
		  if(x.search(/\"/g) !== -1){ isBad = true; }     // check "
		  if(x.search(/\\/g) !== -1){ isBad = true; }     // check \
		  if(x.search(/\//g) !== -1){ isBad = true; }     // check /
		  if(x.search(/\,/g) !== -1){ isBad = true; }     // check ,
		  if(x.search(/\:/g) !== -1){ isBad = true; }     // check :
		  if(x.search(/\;/g) !== -1){ isBad = true; }     // check ;
		  if(x.search(/\|/g) !== -1){ isBad = true; }     // check |
		  if(x.search(/ /g)  !== -1) {isBad = true; }    // check spaces
		
		return isBad;
	
	}, //CheckFileName()
	
	/***************************************************************************************
	* Function: FixFileName()
	* Desc: Fixes a file name by removing invalid chars to make it compat. with the filesystem/web.
	* Usage: JSLib.FixFileName(this);
	****************************************************************************************/
	FixFileName: function(ElementID){
	
		var x = $(ElementID).value;
		  //alert(x)
		  x = x.replace(/\*/g, "");      // delete *
		  x = x.replace(/\[/g, "");      // delete [
		  x = x.replace(/\]/g, "");      // delete ]
		  x = x.replace(/\</g, "");      // delete <
		  x = x.replace(/\>/g, "");      // delete >
		  x = x.replace(/\=/g, "");      // delete =
		  x = x.replace(/\+/g, "");      // delete +
		  x = x.replace(/\'/g, "");      // delete '
		  x = x.replace(/\"/g, "");      // delete "
		  x = x.replace(/\\/g, "");      // delete \
		  x = x.replace(/\//g, "");      // delete /
		  x = x.replace(/\,/g, "");      // delete ,
		  x = x.replace(/\:/g, "");      // delete :
		  x = x.replace(/\;/g, "");      // delete ;
		  x = x.replace(/\|/g, "_");     // delete |
		  x = x.replace(/ /g, "_");     // delete spaces
		
		$(ElementID).value = x;
		return x;
	}//FixFileName
	
}//JSLib

/*********************************************************
* SelectBoxLib Class. Functions for form select boxes.
* Source: http://www.mattkruse.com/javascript/selectbox/source.html
**********************************************************/
var SelectBoxLib = {
	
	/***************************************************************************************
	* Function: findValueInSelectBox
	* Desc: checks if the value passed is contained in the select box.
	* Usage: 
	****************************************************************************************/
	findValueInSelectBox: function(ElementID, Value) {
		var i;
		for(var i=$(ElementID).options.length-1; i>=0;i--)
		{
		var thisValue = $(ElementID).options[i].value;
			if(Value == thisValue){
				return true
				break;
			}
		}//for
		
		return false;

	},//findValueInSelectBox

	/***************************************************************************************
	* Function: addOption(select_object,display_text,value,selected)
	* Desc: Adds a new option to a select box.
	* Usage: 
	****************************************************************************************/
	addOption: function(obj,text,value,selected) {
		if (obj!=null && obj.options!=null) {
			obj.options[obj.options.length] = new Option(text, value, false, selected);
			}
	},//addOption	
	
	/***************************************************************************************
	* Function: moveOptionUp(select_object)
	* Desc: Move selected option in a select list up one
	* Usage: 
	****************************************************************************************/
	moveOptionUp: function(obj) {
		if (!this.hasOptions(obj)) { return; }
		for (i=0; i<obj.options.length; i++) {
			if (obj.options[i].selected) {
				if (i != 0 && !obj.options[i-1].selected) {
					this.swapOptions(obj,i,i-1);
					obj.options[i-1].selected = true;
					}
				}
			}
		},//moveOptionUp
	
	/***************************************************************************************
	* Function: moveOptionDown(select_object)
	* Desc: Move selected option in a select list down one
	* Usage: 
	****************************************************************************************/
	moveOptionDown: function(obj) {
		if (!this.hasOptions(obj)) { return; }
		for (i=obj.options.length-1; i>=0; i--) {
			if (obj.options[i].selected) {
				if (i != (obj.options.length-1) && ! obj.options[i+1].selected) {
					this.swapOptions(obj,i,i+1);
					obj.options[i+1].selected = true;
					}
				}
			}
		},//moveOptionDown	
		
	/***************************************************************************************
	* Function: swapOptions(select_object,option1,option2)
	* Desc: wap positions of two options in a select list
	* Usage: 
	****************************************************************************************/
	swapOptions: function(obj,i,j) {
		var o = obj.options;
		var i_selected = o[i].selected;
		var j_selected = o[j].selected;
		var temp = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
		var temp2= new Option(o[j].text, o[j].value, o[j].defaultSelected, o[j].selected);
		o[i] = temp2;
		o[j] = temp;
		o[i].selected = j_selected;
		o[j].selected = i_selected;
	},//swapOptions
	
	/***************************************************************************************
	* Function: hasOptions(obj)
	* Desc: Utility function to determine if a select object has an options array
	* Usage: 
	****************************************************************************************/
	hasOptions: function(obj) {
		if (obj!=null && obj.options!=null) { return true; }
		return false;
	},//hasOptions
	
	/***************************************************************************************
	* Function: sortSelect(select_object)
	* Desc: Pass this function a SELECT object and the options will be sorted by their text (display) values
	* Usage: 
	****************************************************************************************/
	sortSelect: function(obj) {
		var o = new Array();
		if (!this.hasOptions(obj)) { return; }
		for (var i=0; i<obj.options.length; i++) {
			o[o.length] = new Option( obj.options[i].text, obj.options[i].value, obj.options[i].defaultSelected, obj.options[i].selected) ;
			}
		if (o.length==0) { return; }
		o = o.sort( 
			function(a,b) { 
				if ((a.text+"") < (b.text+"")) { return -1; }
				if ((a.text+"") > (b.text+"")) { return 1; }
				return 0;
				} 
			);
	
		for (var i=0; i<o.length; i++) {
			obj.options[i] = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
			}
	},//sortSelect
	
	/***************************************************************************************
	* Function: selectAllOptions(select_object)
	* Desc: 	  This function takes a select box and selects all options (in a 
	*			  multiple select object). This is used when passing values between
	*			  two select boxes. Select all options in the right box before 
	*			  submitting the form so the values will be sent to the server.
	*
	* Usage: 
	****************************************************************************************/
	selectAllOptions: function(obj) {
		if (!this.hasOptions(obj)) { return; }
		//If its not a multiple selections, make it so.
		obj.writeAttribute("multiple","multiple");
		for (var i=0; i<obj.options.length; i++) {
			obj.options[i].selected = true;
			}
		},//selectAllOptions	
		
	/***************************************************************************************
	* Function: moveSelectedOptions(select_object,select_object[,autosort(true/false)[,regex]])
	* Desc:
		 moveSelectedOptions(select_object,select_object[,autosort(true/false)[,regex]])
		  This function moves options between select boxes. Works best with
		  multi-select boxes to create the common Windows control effect.
		  Passes all selected values from the first object to the second
		  object and re-sorts each box.
		  If a third argument of 'false' is passed, then the lists are not
		  sorted after the move.
		  If a fourth string argument is passed, this will function as a
		  Regular Expression to match against the TEXT or the options. If 
		  the text of an option matches the pattern, it will NOT be moved.
		  It will be treated as an unmoveable option.
		  You can also put this into the <SELECT> object as follows:
			onDblClick="moveSelectedOptions(this,this.form.target)
		  This way, when the user double-clicks on a value in one box, it
		  will be transferred to the other (in browsers that support the 
		  onDblClick() event handler).
	* Usage: 
	****************************************************************************************/
	moveSelectedOptions: function(from,to) {

		// Unselect matching options, if required
		if (arguments.length>3) {
			var regex = arguments[3];
			if (regex != "") {
				this.unSelectMatchingOptions(from,regex);
				}
			}
		// Move them over
		if (!this.hasOptions(from)) { return; }
		for (var i=0; i<from.options.length; i++) {
			var o = from.options[i];
			if (o.selected) {
				if (!hasOptions(to)) { var index = 0; } else { var index=to.options.length; }
				to.options[index] = new Option( o.text, o.value, false, false);
				}
			}
		// Delete them from original
		for (var i=(from.options.length-1); i>=0; i--) {
			var o = from.options[i];
			if (o.selected) {
				from.options[i] = null;
				}
			}
		if ((arguments.length<3) || (arguments[2]==true)) {
			sortSelect(from);
			sortSelect(to);
			}
		from.selectedIndex = -1;
		to.selectedIndex = -1;
	},//moveSelectedOptions

	/***************************************************************************************
	* Function: copySelectedOptions(select_object,select_object[,autosort(true/false)])
	* Desc: This function copies options between select boxes instead of   moving items. Duplicates in the target list are not allowed.
	* Usage: 
	****************************************************************************************/
	copySelectedOptions: function(from,to) {
		var options = new Object();
		if (this.hasOptions(to)) {
			for (var i=0; i<to.options.length; i++) {
				options[to.options[i].value] = to.options[i].text;
				}
			}
		if (!this.hasOptions(from)) { return; }
		for (var i=0; i<from.options.length; i++) {
			var o = from.options[i];
			if (o.selected) {
				if (options[o.value] == null || options[o.value] == "undefined" || options[o.value]!=o.text) {
					if (!this.hasOptions(to)) { var index = 0; } else { var index=to.options.length; }
					to.options[index] = new Option( o.text, o.value, false, false);
					}
				}
			}
		if ((arguments.length<3) || (arguments[2]==true)) {
			this.sortSelect(to);
			}
		from.selectedIndex = -1;
		to.selectedIndex = -1;
	},//copySelectedOptions
	
	/***************************************************************************************
	* Function: moveAllOptions(select_object,select_object[,autosort(true/false)[,regex]])
	* Desc:  Move all options from one select box to another.
	* Usage: 
	****************************************************************************************/
	moveAllOptions: function(from,to) {
		selectAllOptions(from);
		if (arguments.length==2) {
			moveSelectedOptions(from,to);
			}
		else if (arguments.length==3) {
			moveSelectedOptions(from,to,arguments[2]);
			}
		else if (arguments.length==4) {
			moveSelectedOptions(from,to,arguments[2],arguments[3]);
			}
	},//moveAllOptions
	
	/***************************************************************************************
	* Function: copyAllOptions(select_object,select_object[,autosort(true/false)])
	* Desc: Copy all options from one select box to another, instead of removing items. Duplicates in the target list are not allowed.
	* Usage: 
	****************************************************************************************/
	copyAllOptions: function(from,to) {
		selectAllOptions(from);
		if (arguments.length==2) {
			this.copySelectedOptions(from,to);
			}
		else if (arguments.length==3) {
			this.copySelectedOptions(from,to,arguments[2]);
			}
	},//copyAllOptions	

	
	/***************************************************************************************
	* Function: swapOptions(select_object,option1,option2)
	* Desc: Swap positions of two options in a select list
	* Usage: 
	****************************************************************************************/
	swapOptions: function(obj,i,j) {
		var o = obj.options;
		var i_selected = o[i].selected;
		var j_selected = o[j].selected;
		var temp = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
		var temp2= new Option(o[j].text, o[j].value, o[j].defaultSelected, o[j].selected);
		o[i] = temp2;
		o[j] = temp;
		o[i].selected = j_selected;
		o[j].selected = i_selected;
	},//swapOptions

	/***************************************************************************************
	* Function: removeSelectedOptions(select_object)
	* Desc: Remove all selected options from a list
	* Usage: 
	****************************************************************************************/
	removeSelectedOptions: function(from) { 
		if (!this.hasOptions(from)) { return; }
		if (from.type=="select-one") {
			from.options[from.selectedIndex] = null;
			}
		else {
			for (var i=(from.options.length-1); i>=0; i--) { 
				var o=from.options[i]; 
				if (o.selected) { 
					from.options[i] = null; 
					} 
				}
			}
		from.selectedIndex = -1; 
	},//removeSelectedOptions 
	
	/***************************************************************************************
	* Function:removeAllOptions(select_object) 
	* Desc: Remove all options from a list
	* Usage: 
	****************************************************************************************/
	removeAllOptions: function(from) { 
		if (!this.hasOptions(from)) { return; }
		for (var i=(from.options.length-1); i>=0; i--) { 
			from.options[i] = null; 
			} 
		from.selectedIndex = -1; 
	}, //removeAllOptions
	
	/***************************************************************************************
	* Function:selectMatchingOptions(select_object,regex)
	* Desc: This function selects all options that match the regular expression passed in. Currently-selected options will not be changed.
	* Usage:   
	****************************************************************************************/
	selectMatchingOptions: function(obj,regex) {
		this.selectUnselectMatchingOptions(obj,regex,"select",false);
	},//selectMatchingOptions
	
	/***************************************************************************************
	* Function:selectOnlyMatchingOptions(select_object,regex)
	* Desc: This function selects all options that match the regular expression passed in. Selected options that don't match will be un-selected.
	* Usage: 
	****************************************************************************************/
	selectOnlyMatchingOptions: function(obj,regex) {
		this.selectUnselectMatchingOptions(obj,regex,"select",true);
	},//selectOnlyMatchingOptions
	
	/***************************************************************************************
	* Function:unSelectMatchingOptions(select_object,regex)
	* Desc: This function Unselects all options that match the regular expression passed in. 
	* Usage: 
	****************************************************************************************/
	unSelectMatchingOptions: function(obj,regex) {
		this.selectUnselectMatchingOptions(obj,regex,"unselect",false);
	},//unSelectMatchingOptions
	
	/***************************************************************************************
	* Function:selectUnselectMatchingOptions(select_object,regex,select/unselect,true/false)
	* Desc: This is a general function used by the select functions below, to avoid code duplication
	* Usage: 
	****************************************************************************************/
	selectUnselectMatchingOptions: function(obj,regex,which,only) {
		if (window.RegExp) {
			if (which == "select") {
				var selected1=true;
				var selected2=false;
				}
			else if (which == "unselect") {
				var selected1=false;
				var selected2=true;
				}
			else {
				return;
				}
			var re = new RegExp(regex);
			if (!this.hasOptions(obj)) { return; }
			for (var i=0; i<obj.options.length; i++) {
				if (re.test(obj.options[i].text)) {
					obj.options[i].selected = selected1;
					}
				else {
					if (only == true) {
						obj.options[i].selected = selected2;
						}
					}
				}
			}
	},//selectUnselectMatchingOptions
	
	/***************************************************************************************
	* Function:getOptionByIndex()
	* Desc: gets the value and name of the index passed.
	* Usage: 
	****************************************************************************************/
	getOptionLabelByIndex: function(obj, index) {
		return obj.options[index].innerHTML;
	},//getOptionByIndex
	
	/***************************************************************************************
	* Function:changeOptionLabelByIndex()
	* Desc: changes the label of the index passed.
	****************************************************************************************/
	changeOptionLabelByIndex: function(obj, newlabel, index) {
		obj.options[index].innerHTML = newlabel;
	}//changeOptionByIndex
		
}//SelectBox Class



/*********************************************************
* Loaders Class. Functions for displaying Ajax Loaders
**********************************************************/
var Loaders = {
	LoaderType : null,
	LoaderCurrentContentID : null,
	CurrentLoaderUsed: null,
	
	init : function() {	
		
		var HTML_Loader1 = '<div id="Overlay" style="display:none"></div>';
			HTML_Loader1 += '<div id="AjaxLoader1_Wrapper" style="display:none;z-index:5000;">';
			HTML_Loader1 += '  <div id="AjaxLoader1_Container" >';
			HTML_Loader1 += '     <div id="AjaxLoader1_Message">Saving Data. Please wait ... </div>';
			HTML_Loader1 += '     <div align="center" style="padding-top:20px;"><img src="/Layouts/Admin_Default/Images/AjaxLoaders/Bar01-2.gif" width="136" height="10" alt="Loading..." /></div>';
			HTML_Loader1 += '  </div>'
			HTML_Loader1 += '</div>';
		
		var body = document.getElementsByTagName("body").item(0);
		new Insertion.Bottom(body, HTML_Loader1);
	},
	
	/* ===================================================================================
			LOADER TYPES
	=====================================================================================*/
	Loader1 : function(content,showOverlay){
		this.useOverlay = (showOverlay == null) ? false : showOverlay;
		this.CurrentLoaderUsed = "AjaxLoader1_Wrapper";
		var TheMessage = (content == null) ? "Saving Data..Please Wait" : content;
		$('AjaxLoader1_Message').innerHTML = TheMessage;
		this.showLoader('AjaxLoader1_Wrapper'); 
		return false;
	},
	
	/* ==============================END LOADER TYPES====================================*/
	
	showLoader : function(BoxID) {
		if(this.useOverlay) {
			new Effect.Appear('Overlay', { duration: 0.2, from: 0.0, to: 0.8 });		
		}
		this.center(BoxID);
		return false;
	},
	
	
	//Used by ajax post hook only!
	hideLoader : function(){
		if(this.useOverlay) {
			new Effect.Fade('Overlay', { duration: 0.4});
		}
			new Effect.Fade(this.CurrentLoaderUsed, { duration: 0.4});

	},
	
	setLoaderDimensions : function(width, height) {
		var windowSize = this.getPageDimensions();
		if(width) {
			if(width < windowSize[0]) {
				$(ContainerName).style.width = width + 'px';
			} else {
				$(ContainerName).style.width = (windowSize[0] - 50) + 'px';
			}
		}
		if(height) {
			if(height < windowSize[1]) {
				$(ContainerName).style.height = height + 'px';
			} else {
				$(ContainerName).style.height = (windowSize[1] - 50) + 'px';
			}
		}
	},


	
	// taken from Loader js, modified argument return order
	getPageDimensions : function(){
		var xScroll, yScroll;
	
		if (window.innerHeight && window.scrollMaxY) {	
			xScroll = document.body.scrollWidth;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}
		
		var windowWidth, windowHeight;
		if (self.innerHeight) {	// all except Explorer
			windowWidth = self.innerWidth;
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}	
		
		// for small pages with total height less then height of the viewport
		if(yScroll < windowHeight){
			pageHeight = windowHeight;
		} else { 
			pageHeight = yScroll;
		}
	
		// for small pages with total width less then width of the viewport
		if(xScroll < windowWidth){	
			pageWidth = windowWidth;
		} else {
			pageWidth = xScroll;
		}
		arrayPageSize = new Array(windowWidth,windowHeight,pageWidth,pageHeight) 
		return arrayPageSize;
	},
	
	center : function(element){
		try{
			element = document.getElementById(element);
		}catch(e){
			return;
		}
		var windowSize = this.getPageDimensions();
		var window_width  = windowSize[0];
		var window_height = windowSize[1];
		if(this.useOverlay) {
			$('Overlay').style.height = windowSize[3] + 'px';
		}
		element.style.position = 'absolute';
		element.style.zIndex   = 99;
	
		var scrollY = 0;
	
		if ( document.documentElement && document.documentElement.scrollTop ){
			scrollY = document.documentElement.scrollTop;
		}else if ( document.body && document.body.scrollTop ){
			scrollY = document.body.scrollTop;
		}else if ( window.pageYOffset ){
			scrollY = window.pageYOffset;
		}else if ( window.scrollY ){
			scrollY = window.scrollY;
		}
	
		var elementDimensions = Element.getDimensions(element);
		var setX = ( window_width  - elementDimensions.width  ) / 2;
		var setY = ( window_height - elementDimensions.height ) / 2 + scrollY;
	
		setX = ( setX < 0 ) ? 0 : setX;
		setY = ( setY < 0 ) ? 0 : setY;
	
		element.style.left = setX + "px";
		element.style.top  = setY + "px";
		//Element.show(element);
		new Effect.Appear(element, { duration: 0.4});
		}
						
}//End Loaders Class

var DHTMLWin = {
	
	/*******************************************************
	* Function: GetWindowName
	* Desc: Gets the name of the window
	*******************************************************/
	GetWindowName:function() {
		var thisWindowName = window.name ;
		var thisWindowName = thisWindowName.substr(thisWindowName.lastIndexOf("-") + 1,thisWindowName.length);
		return thisWindowName;
	},
	
	/*******************************************************
	* Function: CloseWin
	* Desc: Closes the DHTML Model window that is open
	*******************************************************/
	CloseWin:function() {
		var thisWindowObject = window.parent.$(this.GetWindowName());
		window.parent.dhtmlmodal.close(thisWindowObject);
	}//CLoseWin
	
}

