//if (top.location != self.location) top.location = self.location;

var addGizmoMenuScroll;
var addGizmoMenu;
var gizmoOverLayWinEvents;
var menuCSSClass;
var gHider = null;

function ShowOverlayWindow(owID) {
	var win = window[owID];		
	if (win) {		
		win.position();
		win.show();
	}
}
function ShowAddGizmoMenu(agmID, lnk) {
	var win = window[agmID];		
	if (win) {
		//reset indicators- gets rid of wait, check, issue
		$$('.addClassIndicator').each( function(i) { i.set('class', 'addClassIndicator'); });
		
		if (gHider) gHider.setStyle('visibility', 'hidden');
		
		var gID = GetFragmentID(lnk.href);
		win.gID = gID;
		var offset = {x: 13, y: -10};
		var edge = 'upperRight';
		var position = 'upperRight';
		if (menuCSSClass == 'onListing') {		
			var offset = {x:15, y: -6};
		}		
		win.position({
			relativeTo: lnk,
			offset: offset,
			edge: edge,			
			position: position
		});
		win.show();
		
		var aCoords = addGizmoMenu.getCoordinates();		
		//if (aCoords.bottom > window.getSize().y) addGizmoMenuScroll.toElement(addGizmoMenu);
	}
}

function ShowToolTipMenu(ttID, lnk) {
	var id = ttID + $random(9999999);
	var tt = document.id(ttID);
	if(!$defined(window[id])) {		
		window[id] = CreateToolTipMenu(tt);		
	}	
	var win = window[id];
	if(win) {
		win.position({
			relativeTo: lnk,
			offset: {x: 13, y: -10},
			edge: 'bottom'
		});
		lnk.blur();
		win.show();
		if(tt.getPosition().y < window.getScroll().y) {
			var myFx = new Fx.Scroll(window, { offset: { y:-10 }}).toElement(win);
		}
	}
}

function GetHashVar(url, v) {
	return url.toURI().getData(v, 'fragment');
}
function GetFragmentID(url) {
	return url.toURI().getData('id', 'fragment');
}
function GetOverLayFragmentID(url) {
	return url.toURI().getData('ow', 'fragment');
}
function GetDropDownMenuFragmentID(url) {
	return url.toURI().getData('dm', 'fragment');
}
function CreateOverLayWin(windowEL) {
    windowEL.setStyle('display', 'block');
	var hideOnClick = windowEL.hasClass('DHC');
	var win = new StickyWin.Modal({
		content: windowEL,
		css: '',
		closeClassName: 'close',
		relativeTo: document.body,	 
		fadeDuration: 0,
		draggable: true,
		dragHandleSelector: '.dragHandle',
		showNow: false,
		closeOnEsc: true,
		//offset: {y:-50},
		modalOptions: {
			modalStyle: {
			  'background-color':'#000',
			  'opacity':.6
			},
			hideOnClick: !hideOnClick
		}
	});
	return win;
}
function CreateAddGizmoMenu(menuEL) {
    menuEL.setStyle('display', 'block');	
	var win = new StickyWin({
		content: menuEL,
		closeClassName: 'close',
		fadeDuration: 0,
		showNow: false,
		closeOnClickOut: true,
		closeOnEsc: true
	});
	return win;
}
function CreateToolTipMenu(menuEL) {
    menuEL.setStyle('display', 'block');	
	var win = new StickyWin({
		content: menuEL,
		closeClassName: 'close',
		fadeDuration: 0,
		showNow: false,
		closeOnClickOut: true,
		closeOnEsc: true
	});
	return win;
}
window.addEvent('domready', function() {
	/*var anchorScroll = new Fx.SmoothScroll({
		offset: { x: 0, y: -330 },
		wheelStops: false
	});*/
	addGizmoMenuScroll = new Fx.Scroll(window, {
		offset: { x: 0, y: 20 },
		wheelStops: false
	});

	var siteSearchForm = document.id('siteSearchForm');
	if (siteSearchForm) {		
		var query = document.id('uncompiledQuery');
		if(query) {
			siteSearchForm.addEvent('submit', function(e) {
				if (query.value == query.defaultValue) {
					e.stop();
					query.defaultValue = query.value = 'What do you wish to find?';
				}
			});
			var srch = document.id('search');
			if (Browser.Engine.trident && document.documentMode == 7) srch.setStyle('padding-top', 1);
			if (Browser.Engine.webkit) srch.setStyle('padding', 3);
			if(query.value != query.defaultValue) query.removeClass('defaultValue');
			var siteSearch = document.id('siteSearch');
			query.addEvent('focus', function(e) {
				if(this.value == this.defaultValue) {
					this.value = '';
					this.removeClass('defaultValue');
					siteSearch.addClass('on');
				}
			});
			query.addEvent('blur', function(e) {
				if(this.value == '') {
					this.value = this.defaultValue;
					this.addClass('defaultValue');
					siteSearch.removeClass('on');
				}
			});
		}
	}
	
	
	var login = document.id('actLogin');
	if (login) {
		//happens on login form page
		//if (self.opener && opener.location.href.indexOf('/index.cfm') >= 0) document.location.href = '/index.cfm?method=cUser.dspLogoutWarningPopup&inpopup=1';
		//focus username for login form
		login.el_username.focus();
	}
	$$('.trunc').each( function(desc) {
		desc.addEvent('click', function(e) {
			//e.stop();
			var descClass = 'trunc';
			isTruncated = this.hasClass(descClass);
			this.title = isTruncated ? 'Close' : 'Show All';	
			this.className = isTruncated ? 'full' : descClass;		
		});
	});
	$$('.flashMsg').each( function(fM) {
		(function() {
			fM.nix();
			//fM.setStyle('display', 'none');
		}).delay(11000);
	});
	
	
	gHold = document.id('gizmoHolder');
	if (gHold) {
		gizmoOverLayWinEvents = {
			'display': function(){ gHold.addClass('hide'); },
			'close': function(){ gHold.removeClass('hide');	}
		};
	}
	$$('.ow-sml, .ow-med, .ow-lrg').each( function(ow) {									   
		window[ow.id] = CreateOverLayWin(ow);		
		window[ow.id].addEvent('display', function() {
			var firstInput = this.win.getElements('form input[type=text], form input[type=radio], form input[type=checkbox], form textarea, form select')[0];
			if (firstInput) firstInput.focus();
		});
		if (gizmoOverLayWinEvents) 	window[ow.id].addEvents(gizmoOverLayWinEvents);
		if (ow.hasClass('showOnLoad')) window[ow.id].show();
	});
	
	addGizmoMenu = document.id('addGizmoToClass');	
	if (addGizmoMenu) {
		var uM = location.href.toURI().getData('method').toLowerCase();
		menuCSSClass = uM.contains('dspview') || uM.contains('dspdetail') ? 'onPage' : 'onListing';
		addGizmoMenu.set('class', menuCSSClass);
		window[addGizmoMenu.id] = CreateAddGizmoMenu(addGizmoMenu);
		if (gizmoOverLayWinEvents) 	window[addGizmoMenu.id].addEvents(gizmoOverLayWinEvents);
	}
	
	
	var rQueue = new Request.Queue();
	document.body.addEvent('click:relay(a)', function(e){
		var owID = GetOverLayFragmentID(this.href);
	   	if(owID) {
			if (this.href.split('#')[0] == location.href.split('#')[0]) {
				e.stop();
				ShowOverlayWindow(owID);
			}
	   	}
		var agmID = GetDropDownMenuFragmentID(this.href);
	   	if(agmID) {	
			e.stop();
			ShowAddGizmoMenu(agmID, this);			
	   	}
		var ttID = GetHashVar(this.href, 'tt');
		if(ttID) {	
			e.stop();
			ShowToolTipMenu(ttID, this);			
	   	}
		var agtcID = this.href.toURI().getData('agtc', 'fragment');		
		if (agtcID) {
			e.stop();
			var goID = this.href.toURI().getData('go', 'fragment');
			var isAddGo = (goID && goID == 1);
			var gID = window.addGizmoToClass.gID;
			var classesArray = agtcID.split(',');
			classesArray.each(function(c) {
				var indicatorEL = document.id('inCID-' + c);	
				indicatorEL.swapClass('iCheck', 'iWait');
			});
			
			var addGizmoToClassRequest = new Request({
				url: 'index.cfm',
				onSuccess: function(r) {
					if(r==1){
						classesArray.each(function(c) {
							var indicatorEL = document.id('inCID-' + c);	
							indicatorEL.swapClass('iWait', 'iCheck');
						});
						if (isAddGo) document.location = 'index.cfm?method=cUserSecure.dspClass&ClassID=' + agtcID;
					}
				}
			});
			rQueue.addRequest('elAddToClass', addGizmoToClassRequest);
			addGizmoToClassRequest.send('method=cResourceSecure.actAddResourceToClass_ajax&resourceID=' + gID + '&classID=' + agtcID);
		}
		
	});
	//activate overlay on page load
	ShowOverlayWindow(GetOverLayFragmentID(location.href));
});

var SHWave = new Class({

	Implements: [Options],

	options: {
		id: null,
		height: 1,
		width: 1,
		pluginspage: 'http://www.adobe.com/shockwave/download/',
		codeBaseVersion: '8,5,1,0',
		container: null,
		properties: {},
		params: {
			playerVersion: 11,
			swinstalltype: 'full',
			swremote: 'swSaveEnabled=\'false\' swVolume=\'true\' swRestart=\'true\' swPausePlay=\'true\' swFastForward=\'true\' swContextMenu=\'true\'',
			bgcolor: '#ffffff'
		}
	},

	toElement: function(){
		return this.object;
	},

	initialize: function(path, options){
		this.instance = 'SHWave_' + $time();

		this.setOptions(options);
		options = this.options;
		var id = this.id = options.id || this.instance;
		var container = document.id(options.container);

		var params = options.params;
		var properties = $extend({height: options.height, width: options.width}, options.properties);

		var self = this;

		params.src = path;
		
		var build = '<object id="' + id + '" classid="clsid:166B1BCA-3F9C-11CF-8075-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=' + options.codeBaseVersion + '"';
		var embed = '<embed id="' + id + '" type="application/x-director"' ;
		for (var property in properties) {
			build += ' ' + property + '="' + properties[property] + '"';
			embed += ' ' + property + '="' + properties[property] + '"';
		}
		build += '>';		
		for (var param in params){
			if (params[param]) { 
				build += '<param name="' + param + '" value="' + params[param] + '" />';
				embed += ' ' + param + '="' + params[param] + '"';
			}
		}
		embed += ' pluginspage="' + options.pluginspage +'">';
		build += embed + '</object>';
		this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
	},

	replaces: function(element){
		element = document.id(element, true);
		element.parentNode.replaceChild(this.toElement(), element);
		return this;
	},

	inject: function(element){
		document.id(element, true).appendChild(this.toElement());
		return this;
	}
});

//Sample method calls

//name- [string] name of the form field (required)
//trigger- the name of that field that causes the error message to hide (optional)
//vT- [string] validation type (required)
//vV- [mixed] validation value (optional)
//msg- [string] field error message (optional)

//ValidateForm('addProject', [ {name:'title', vT:'r', msg:'Please enter a title.'}, {name:'nickname', vT:'min', vV:'5', msg:'Please enter a title.'} ] );

function ValidateFormWithSSRules(formName, rules) {
	var ssVal = eval(rules);
	if (ssVal) {	
		var csRules = [];
		ssVal.each(function(v) {
			v.RULES.each(function(r) {
				var vType = '';
				var vValue = '';
				if (r.TYPE) {
					if (r.TYPE == 'required') vType = 'r';
					if (r.TYPE == 'email') vType = r.TYPE;
					if (r.TYPE.contains('len:')) {
						vType = 'max';
						vValue = r.TYPE.split(':')[1].toInt();
					} 
				}
				if (vType != '') {
					var csRule = {
						name: v.FIELDNAME,
						vT: vType,
						msg: r.MSG
					};
					if (vType == 'max') csRule.vV = vValue;					
					csRules.push(csRule);
				}
			});
		});
		ValidateForm(formName, csRules);
	}
}



function ValidateForm(formName, validationFields) {
	var targetForm = document.id(formName);
	if (!$chk(targetForm)) return;
	var targetFormButtons = targetForm.getElements('input[type=submit], input[type=image]');
	SetSubmitWaiter(targetFormButtons, false);
	targetForm.addEvent('submit', function(e) {
		e.stop();
		var fieldErrors = [];
		var lastFieldName = '';
		for (var i = 0; i < validationFields.length; i++) {
			var validateField = validationFields[i];
			var fieldName = validateField.name;
			//check that we only add unique fields
			if (fieldName != lastFieldName) {
				var field = document.id(this[fieldName]);					
				if (field) {
					var fieldValue = ($type(field) == 'collection') ? $$('#'+formName+' input[name=' + fieldName + ']:checked').get('value') : field.value.trim();
					if ( (field.type == 'checkbox') && (!field.checked) ) fieldValue = '';
					
					//special exception for file fields
					if (field.type == 'file') validateField.vT = 'rAny';
					
					var isValid = true;
					var isAjaxValidator = false;
					var defaultErrorMessage = 'please check this field';
					var extraMessage = '';
					switch(validateField.vT) {
						case 'r': //required value									
							isValid = (fieldValue != '');								
							defaultErrorMessage = fieldName + ' is required';
							if (isValid) {
								var filter = /<+|>+|\/+/;
								isValid = !filter.test(fieldValue);
								extraMessage = 'Invalid characters found.  Characters &gt;, &lt;, and / not allowed.';
							}
							break;
						case 'rAny': //required value, any chars allowed								
							isValid = (fieldValue != '');								
							defaultErrorMessage = fieldName + ' is required';
							break;
						case 'sc': //filter special characters
							var filter = /<+|>+|\/+/;
							isValid = !filter.test(fieldValue);
							defaultErrorMessage = 'Invalid characters found.  Characters &gt;, &lt;, and / not allowed.';
							break;
						case 'min': //minumum length
							var minLength = validateField.vV;
							if (minLength && (minLength == parseFloat(minLength))) {
								isValid = (fieldValue.length >= minLength);
								defaultErrorMessage = fieldName + ' must be at least ' + minLength + ' characters long.';
							}
							break;
						case 'max': //maximum length								
							var maxLength = validateField.vV;
							if (maxLength && (maxLength == parseFloat(maxLength))) {
								isValid = (fieldValue.length <= maxLength);
								defaultErrorMessage = fieldName + ' cannot be over ' + maxLength + ' characters long.';
							}
							break;
						case 'same': //same value as another field								
							var compareField = document.id(this[validateField.vV]);
							if (compareField) {
								isValid = field.get('value') == compareField.get('value');
								defaultErrorMessage = fieldName + ' does not match ' + validateField.vV + ' field.';
							}
							break;
						case 'email': //email format
							var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
							isValid = filter.test(fieldValue);	
							defaultErrorMessage = 'Email address is an invalid format.';								
							break;
						case 'begins': //value begins with: letter, number
							var beginValue = validateField.vV == 'letter' ? 'a-zA-Z' : '0-9';
							//var filter  = /^[a-zA-Z]+$/;
							var filter = new RegExp('^['+ beginValue +']+$')
							isValid = filter.test(fieldValue);	
							defaultErrorMessage = fieldName + ' must begin with a ' + validateField.vV + '.';								
							break;
						case 'uE': //username already exists in system
							isAjaxValidator = true;
							if (!fieldErrors.length) {
								SetSubmitWaiter(targetFormButtons, true);
								var ajax = new Request({
									url: '/index.cfm',
									method: 'get',
									onSuccess: (function(r) {
										if (r == 1) {			
											this.submit();
											return;
										}else{
											SetSubmitWaiter(targetFormButtons, false);
											fieldErrors.push({name:fieldName, msg:errorMessage, trigger:validateField.trigger});
											ShowFormErrors(fieldErrors);
										}
									}).bind(this)
								});
								ajax.send('method=cPromo.actAJAXSchoolDistrict&a=ut&id=' + fieldValue);
							}
							break;
					}
					var errorMessage = (validateField.msg) ? validateField.msg : defaultErrorMessage;
					if (extraMessage != '') errorMessage = extraMessage;
					if (!isValid) {								
						fieldErrors.push({name:fieldName, msg:errorMessage, trigger:validateField.trigger});  
						lastFieldName = fieldName;
					}
				}
			}
		} 
		if (fieldErrors.length) {
			ShowFormErrors(fieldErrors);
		}else{
			if (!isAjaxValidator) {
				SetSubmitWaiter(targetFormButtons, true);
				this.submit();
			}
		}       
	});
}

function SetSubmitWaiter(formButtons, wait) {
	formButtons.each(function(btn) {
		if (wait) {
			btn.disabled = true;	
			if (btn.hasClass('waiter')) btn.addClass('wait');
		}else{
			btn.disabled = false;
			btn.removeClass('wait');
		}		
	});	
}

//Error styles: above, over
function ShowFormErrors(errors) {
	var alertErrorsMessage = 'Please fix the following issues:\n\n';
    var showErrorAlert = false;
	for (var i = 0; i < errors.length; i++) {
    	var error = errors[i];
        var fieldName = error.name;
        var fieldErrorMessage = error.msg;        
        var errorMsgTarget = document.id('f-' + fieldName);
        if(errorMsgTarget) {
            var fieldErrorMessageID = 'fe-' + fieldName;
            if(!document.id(fieldErrorMessageID)) {
				//create the error message element
                var errorMsgElement = new Element('div', {'id':fieldErrorMessageID, 'class':'fieldError'});
				errorMsgElement.setStyle('display', 'none');
                errorMsgElement.inject(errorMsgTarget, 'top');
				var triggerField = $chk(error.trigger) ? error.trigger : error.name;
                document.id(triggerField).addEvent('focus', (function() {
					var hideR = new Fx.Reveal(document.id('fe-' + this.name));
					hideR.dissolve();
                }).bind(error));
            }
			document.id(fieldErrorMessageID).set('html', fieldErrorMessage);
			var showR = new Fx.Reveal(document.id(fieldErrorMessageID));
			showR.reveal();		
        }else{
			alertErrorsMessage += (i+1) + '. ' + fieldErrorMessage + '\n';
        	showErrorAlert = true;
        }
    }
    if (showErrorAlert && alertErrorsMessage.length) alert(alertErrorsMessage);
}
var popWin = null;
var popWinLocation = null;
function OW(a, dim) {
	if(popWin && !popWin.closed) {
		popWin.focus();
		if (popWinLocation != a.href) {
			popWin.location = a.href;
			popWinLocation = a.href;
		}
	}else{
		var w = $chk(dim) && $chk(dim.w) ? dim.w : 600;
		var h = $chk(dim) && $chk(dim.h) ? dim.h : 600;
		popWin = window.open(a.href, a.target, 'scrollbars=yes,status=no,resizable=yes,width='+w+',height='+h+',');
		popWin.focus();
		
		//popWin.moveTo(100, 100);
		popWinLocation = a.href;
		//if (! (window.focus && window.opener)) return true;
		//window.opener.focus();
		//window.close();
	}
	
	return false;
}
function printPage(){
	if (window.print) {
		window.print();  
	}else{
		var WebBrowser = '<OBJECT ID="WebBrowser1" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>';
		document.body.insertAdjacentHTML('beforeEnd', WebBrowser);
		WebBrowser1.ExecWB(6, 2);//Use a 1 vs. a 2 for a prompting dialog box    WebBrowser1.outerHTML = "";  
	}
}

var TextAreaCounter = new Class({

	Implements: [Options],
	
	options:{
		selector:'textarea',
		maxChar:500
	},
	initialize: function(options){
		this.setOptions(options);
		this.tbCounters =[];
		if($(this.options.selector)){
			this.options.selector = $(this.options.selector);
		}
		this.textareas=$$(this.options.selector);
		this.textareas.each(this.buildCounter,this);
		
		this.textareas.each(function(el,i){
			var value = el.get('value');
			this.previousLength = value.length;
			if(this.options.maxChar){
				if(this.previousLength > this.options.maxChar){
					value = value.substring(0, this.options.maxChar);
					this.previousLength = value.length;
					el.set('value', value);
				}
				var count = this.options.maxChar - this.previousLength;
				if(!count){
					var ct = '<span class="maxReached">No characters left</span>';
				}else if(count == 1){
					var ct = '1 character left';
				}else{
					var ct = count + ' characters left';
				}
				this.tbCounters[i].set('html','Max (' + this.options.maxChar + '): <em>' + ct + '</em>');
			}
		},this);
	
	},
	
	buildCounter: function(textbox,i){				
		textbox.addEvents({
			'keydown':this.onKeyPress.bindWithEvent(this, i),
			'keyup':this.onKeyPress.bindWithEvent(this,i),
			'focus':this.startObserver.bind(this,i),
			'blur':this.stopObserver.bind(this)
		});
		
		if(this.options.maxChar){
			this.tbCounters[i]=new Element('div',{'class':'textAreaCounter'}).inject(textbox,'after');
			this.update = this.updateCounter;
		}else{
			this.update = this.updateNoCounter;
		}
	},
	
	onKeyPress: function(event, i) {
		if(!event.shift && !event.control && !event.alt && !event.meta){
			this.update(i);
		}
		this.startObserver(i);
	},
	
	startObserver:function(i){
		$clear(this.observer);
		this.observer = this.observe.periodical(500,this,i);
	},
	
	stopObserver:function(){
		$clear(this.observer);
	},
	
	observe:function(i){
		if(this.textareas[i].get('value').length != this.previousLength){
			this.previousLength = this.textareas[i].get('value').length;
			this.update(i);
		}
	},

	updateCounter: function(i) {
		var value = this.textareas[i].get('value');
		if(value.length > this.options.maxChar){
			value =  value.substring(0, this.options.maxChar);
			this.textareas[i].set('value',value);
		}
		this.previousLength = value.length;
		var count = this.options.maxChar - this.previousLength;
		if (count == 0) {
			var ct = '<span class="maxReached">No characters left</span>';
		}else if (count == 1){
			var ct = '1 character left';
		}else{
			var ct = count + ' characters left';
		}
		this.tbCounters[i].set('html','Max (' + this.options.maxChar + '): <em>' + ct + '</em>');
	},
	
	updateNoCounter:function(i){
		var value = this.textareas[i].get('value');
		this.previousLength = value.length;
	}
	
});
/*
<!--
function targetopener(mylink, closeme, closeonly)
{
if (! (window.focus && window.opener))return true;
window.opener.focus();
if (! closeonly)window.opener.location.href=mylink.href;
if (closeme)window.close();
return false;
}
//-->
*/
