/**********************************************
 LMCore.js
 Basic ActiveCampus JavaScript functions including
    imageswapper, popup, external site frame, and quicklinks
 Author:  M. Dempster 3/2/01
 Copyright:  LiquidMatrix Corp.
**********************************************/

/**********************************************
 Browser control variables  
 These variables determine which browser is being used
**********************************************/ 
var isNav = (document.layers) ? true:false				//Layers compliant browser (Netscape 4.x)
var isIE = (document.all) ? true:false				//IE4/5 compliant browser 
var isDOM = (document.getElementById) ? true:false	   	//DOM Compliant browser (NS6, Opera 5)
var isOther = (!isNav&&!isDOM&&!isIE) ? true:false				//Other browser (NS3, Lynx)

/**********************************************
 Global Variables  
 Variables used in ALL pages, or by multiple JS functions
**********************************************/ 
var preloadFlag = false 								//Determines if images for swapping in page are loaded

/**********************************************
 newImage(stringexp)    
 arg:  
 	use:  Required
	Datatype:  String
	A valid string expression (An image filename, with path)
 Return:  JS image object
 Description:  Creates an image object containing the file found at arg
**********************************************/ 
function newImage(arg) {
	if (document.images) {
		rslt = new Image();
		rslt.src = arg;
		return rslt;
	}
}

/**********************************************
 changeImages([stringexp, (obj2|str2)])    
 Return:  Nothing
 Description:   Replaces image found at reference stringexp with specified image obj2 or str2.  Image may
 				may be pulled from an Image Object (eg: Imageobj.src) or a string (eg: "/images/x.gif").
 Tips:  You may use any number of argument pairs to swap multiple images at the same time.  Arguments MUST be 
  		paired;  args not paired will result in an error.
**********************************************/ 
function changeImages() {
  	if (document.images && (preloadFlag == true)) {
		for (var i=0; i<changeImages.arguments.length; i+=2) {
			document[changeImages.arguments[i]].src = changeImages.arguments[i+1];
		}
	}
}

/**********************************************
 jumpto(formobj, stringexp)
 form:  
 	use:  Required
	Datatype:  JS Form Obj
	A valid reference to a form object on the page.
 name:  
 	use:  Required
	Datatype:  String
	A valid reference to a select control.    
 Return:  Nothing
 Description:   Takes the value of the selected item in selector name, and forwards browser to that value.  
 				During the forward process, it resets the selector to default (index=0)
 Tips:  Normally, form is passed this.form, which is a generic reference to the form enclosing name
**********************************************/ 
function jumpto(form, name) {
	var myindex= eval('form.'+ name + '.selectedIndex');			//Gets index of user selection in Stringexp
    var myval=eval('form.' + name + '.options[myindex].value');		//Gets value at myindex
    eval('form.'+ name + '.selectedIndex = 0');						//Resets selected index to 0 (default)
	if (myval != "") {
        
	     location.href=myval;									//If value is local, send this window to new page.
       
    }
}


/**********************************************
 popup(stringexp, stringexp, integer, integer, stringexp, stringexp, )
 Note:  All vars are type STring and are required
 URL:  Valid URL of a webpage (determines page to be shown in new window)
 Name: String (determines name of new window)
 wwidth: Integer (determines width of new window)
 wheight: Integer (determined height of new window)
 wresize: 0 or 1 (determines if window can be resized or not)
 wscrolls:  yes or no (determines if scrollbars will be created on window)
 Return:  Nothing
 Description:   Pops open new window with parameters specified above.
**********************************************/ 
function popup(url, name, wwidth, wheight, wresize, wscrolls){
    eval("window.open('" + url + "','" + name + "','toolbar=no,menubar=no,address=no,status=no,dependent=no,resizable=" + wresize + ",scrollbars=" + wscrolls + ",height=" + wheight + ",width=" + wwidth + "')");
}


/**********************************************
 external(stringexp)
 url:  
 	use:  Required
	Datatype: String
	A valid reference to a web site address   
 Return:  Nothing
 Description:   Takes the value of URL, and creates a new window containing the External site frame, which displays the address specified
**********************************************/ 
function external(url){
    eval("window.open('/external.asp?URL=" + escape(url) + "','ACEXT','toolbar=yes,menubar=yes,address=yes,status=yes,dependent=no,resizable=1,height=540,width=760')");
}


/**********************************************
 autojump(formobj,formobj,stringexp,integer)
 formname:    
 	use:  Required
	Datatype: JS Form Object
	A valid reference to a form  
 thisfield:    
 	use:  Required
	Datatype: JS Form Control object
	A valid reference to a form control contained within formname
 fieldname:    
 	use:  Required
	Datatype: String
	A valid reference to a name of form control within formname  
 maxlen:    
 	use:  Required
	Datatype: Integer    
 Return:  Nothing
 Description:   On keypress in thisfield, tests to see if the length of the data entered is longer than maxlen.
 				If so, switch focus to fieldname.
 Tips:  Normally, formname and thisfield are passed "this.form" and "this" respectively, referencing the currently selected control and form.
**********************************************/ 
function autojump(formname, thisfield, fieldname, maxlen) {
	maxlen = (isNav) ? maxlen - 1:maxlen						//If NS4.0, length needs to be truncated by 1
	if (thisfield.value.length >= maxlen) {						//On keypress, if value is longer than maxlen
		formname.elements[fieldname].focus();					//Focus on fieldname
	}
}

// This script is (c) copyright 2006 Jim Tucek under the
// GNU General Public License (http://www.gnu.org/licenses/gpl.html)
// For more information, visit www.jracademy.com/~jtucek/email/ 
// Leave the above comments alone!

var decryption_cache = new Array();

function decrypt_string(crypted_string,n,decryption_key,just_email_address) {
	var cache_index = "'"+crypted_string+","+just_email_address+"'";

	if(decryption_cache[cache_index])					// If this string has already been decrypted, just
		return decryption_cache[cache_index];				// return the cached version.

	if(addresses[crypted_string])						// Is crypted_string an index into the addresses array
		var crypted_string = addresses[crypted_string];			// or an actual string of numbers?

	if(!crypted_string.length)						// Make sure the string is actually a string
		return "Error, not a valid index.";

	if(n == 0 || decryption_key == 0) {					// If the decryption key and n are not passed to the
		var numbers = crypted_string.split(' ');			// function, assume they are stored as the first two
		n = numbers[0];	decryption_key = numbers[1];			// numbers in crypted string.
		numbers[0] = ""; numbers[1] = "";				// Remove them from the crypted string and continue
		crypted_string = numbers.join(" ").substr(2);
	}

	var decrypted_string = '';
	var crypted_characters = crypted_string.split(' ');

	for(var i in crypted_characters) {
		var current_character = crypted_characters[i];
		var decrypted_character = exponentialModulo(current_character,n,decryption_key);
		if(just_email_address && i < 7)				// Skip 'mailto:' part
			continue;
		if(just_email_address && decrypted_character == 63)	// Stop at '?subject=....'
			break;
		decrypted_string += String.fromCharCode(decrypted_character);
	}
	
	decryption_cache[cache_index] = decrypted_string;			// Cache this string for any future calls

	return decrypted_string;
}

function decrypt_and_email(crypted_string,n,decryption_key) {
	if(!n || !decryption_key) { n = 0; decryption_key = 0; }
	if(!crypted_string) crypted_string = 0;

	var decrypted_string = decrypt_string(crypted_string,n,decryption_key,false);
	parent.location = decrypted_string;
}

function decrypt_and_echo(crypted_string,n,decryption_key) {
	if(!n || !decryption_key) { n = 0; decryption_key = 0; }
	if(!crypted_string) crypted_string = 0;

	var decrypted_string = decrypt_string(crypted_string,n,decryption_key,true);
	document.write(decrypted_string);
	return true;
}

// Finds base^exponent % y for large values of (base^exponent)
function exponentialModulo(base,exponent,y) {
	if (y % 2 == 0) {
		answer = 1;
		for(var i = 1; i <= y/2; i++) {
			temp = (base*base) % exponent;
			answer = (temp*answer) % exponent;
		}
	} else {
		answer = base;
		for(var i = 1; i <= y/2; i++) {
			temp = (base*base) % exponent;
			answer = (temp*answer) % exponent;
		}
	}
	return answer;
}
// -->