// hold the F1 Name space
var F1CMS = Class.create({
	initialize: function(mainbody, sidebar){
	  this.mainBody = mainbody;
	  this.sideBar = sidebar;
	},
	addObject: function(objname,myclass) {
		if (arguments.length==1) {
			eval('this.' + objname + '= new ' + objname + '()');
		}
		else {
			eval('this.' + objname + '= new ' + myclass + '()');
		}
		eval('this.'+objname+'.app= this') ;
	},
	Data: {}
}) ;


F1 = new F1CMS('bodyContents','coolmenu');

F1UI=Class.create({
	ShowDelay: function(target) {
		if (arguments.length==1) {
			$(target).update('<p align="center"><img border="0" src="images/ajax-loading.gif"></p>');
		}
		else {
			$(F1.mainBody).update('<p align="center"><img border="0" src="images/ajax-loading.gif"></p>');
		}
	},
	UpdateContent: function(tcDocument,tcDate) {
		// Hide Modalbox if present. Testing for it's presence can generate 
		// errors. 
		try {
			Modalbox.hide();
		}
		catch(error) { 
			// ingore any errors 
		}
	
		this.ShowDelay();
		new Ajax.Updater(F1.mainBody,'showcontent.afp?doc=' + escape(tcDocument));
		window.location.hash = tcDocument;
		this.GetSideBar(tcDocument);
		document.F1CMSContentId=tcDocument;
		document.title="F1 Technologies Customer Service Center";
//		getContentMenu(tcDocument);
	},
	GetSideBar: function(tcDocument){
		new Ajax.Updater(F1.sideBar,'getsidebar.afp?doc=' + escape(tcDocument));
	},
	Calendar: function(startdate){
		this.ShowDelay();
		new Ajax.Request("updatecalendar.afp?startdate=" + startdate, { 
			method:'get',
			onSuccess: function(transport) {
				var Calendar = $("calDiv");
				if (isNull(Calendar)) {
	  				var Calendar = document.createElement("div");
	  				$("bodyContents").update(Calendar);
	  			}
	  			Calendar.update(transport.responseText);
			},
			onFailure: function() { 
				alert('Error contacting server. Please try the link again...');
			} 
		})
	}
});

F1.addObject('UI','F1UI');

F1Security=Class.create({
	Login: function() {
		$("loginerror").update('');
		var loginform = $('LoginForm');
		loginform.Security=this;
		loginform.app=this.app;
		loginform.request({ 
			method: 'post',
			onSuccess: function(transport) {
				var loginResult = transport.responseText.evalJSON();
				if (loginResult.Rows[0].errormessage!='') {
					loginform.Security.Logout(true);
					$("loginerror").update('<p class="formerror">'+loginResult.Rows[0].errormessage + '</p>');
					$('txtUserName').focus();
				}
				else {
					loginform.app.Cookies.set('username',loginResult.Rows[0].username,1);
					loginform.app.Cookies.set('userid',loginResult.Rows[0].userid,1);
					loginform.Security.UserGreeting();
					if (loginResult.Rows[0].admin) {
						loginform.Security.app.UI.UpdateContent('admin');
					}
					else {
						loginform.Security.app.UI.UpdateContent('registrations');
					}
				}
			},
			onFailure: function() {
				alert('Login failed to contact the server. Please try again...') 
		} 
		});
	},
	Logout: function(logout) {
		if (arguments.length==0) {
			var logout=confirm("Log out?");
		}
		if (logout){
			this.app.Cookies.remove('username');
			this.app.Cookies.remove('userid');
			if (arguments.length==0) {
				this.app.UI.UpdateContent('home');
			}
			this.UserGreeting();
		}
	},
	SendReminder: function(control) {
		if (typeof control=='object') {
			control.disable();
		}
		this.app.UI.ShowDelay("reminderresult");
		var emailAddress = $F('txtEmail');
		var results = $("reminderresult");
	
		if (F1.Validate.Validate(emailAddress,'Email','reminderresult')) {
			var results = $("reminderresult");
			results.update('');
			new Ajax.Request("callfunction.afp?SendReminder", { 
				method:'post', parameters: $('ReminderForm').serialize(),
				onSuccess: function(transport) {
					results.update(transport.responseText);
				},
				onFailure: function() {
					alert('Failed to contact the server. Please try again...') ;
				} 
			});
		}
		if (typeof control=='object') {
			control.enable();
		}
	},
	UserGreeting: function() {
		var userName = this.getUserName();
		var userGreeting = '<p class="UserGreeting"> Welcome ';
		if (! isNull(userName)) {
			userGreeting += userName + ' ' + 
			'<a href="javascript:F1.UI.UpdateContent(\'profile\')">Your Profile</a> ' +
			'<a href="javascript:F1.Security.Logout()">(Logout)</a>'
		}
		else {
			userGreeting += 'Guest <a href="javascript:F1.UI.UpdateContent(\'Login\')">(Login)</a>'
		}
		userGreeting +='</p>'
		$('usergreeting').update(userGreeting);
	},
	getUserName: function() { 
		return this.app.Cookies.get('username'); 
	},
	getUserId: function() { 
		return this.app.Cookies.get('userid'); 
	}
})

F1.addObject('Security','F1Security');



//F1.Data = {} ;

F1Validate=Class.create({
	ErrorMessage: '',
	Validate: function(ControlOrValue, options, errordisplay) {
  		var valid = true;
  		var validators = options.split(',');
  		for (var i=0;i<=validators.length-1;i++) {
  			var fnName = 'this.'+validators[i]
 			if (typeof eval(fnName) == 'function') {
 				var testValue = (typeof ControlOrValue=='object')?ControlOrValue.value:ControlOrValue;
 				valid = eval(fnName+'(testValue)');
 				if (valid==false) {
 					this.ShowError(errordisplay);
 					if (typeof ControlOrValue == 'object') {
 						ControlOrValue.focus();
 						break;
 					}
 				}
 				else {
 					this.ClearError(errordisplay);
 				}
 			}
  		}
  		return valid;
	},
	ShowError: function(errordisplay) {
		if (typeof errordisplay=='string') {
			$(errordisplay).update('<p class="formerror">'+this.ErrorMessage+'</p>');
		}
		else {
			alert(this.ErrorMessage);
		}
	},
	ClearError: function(errordisplay) {
		if (typeof errordisplay=='string') {
			$(errordisplay).update('');
		}
	},
	Email: function(testValue) {
		var valid = true
		if (testValue=='') {
			this.ErrorMessage = 'Email address cannot be empty.';
			valid=false;
		}
		else {	
			var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			if (!filter.test(testValue)) {
				this.ErrorMessage = testValue + ' is not a valid email address.';
				valid=  false;
			}
		}
		return valid
	}
})

F1.addObject('Validate','F1Validate')



//F1Cookies = Class.create( {
F1Cookies = Class.create( {
	set: function(name,value,expiresDays,path) {
		var cookie=name + "=" + value;
		if (expiresDays) {
			var now = new Date();
			now.setTime(now.getTime()+(expiresDays*24*60*60*1000));
			cookie+="; expires="+now.toGMTString();
		}
		if (path) {
			cookie+="; path="+path;
		}
		else {
			cookie+="; path=/";
		}
		document.cookie = cookie;
	},
	get: function(name) {
		var cookieVal=null
		name += "=";
		var cookies = document.cookie.split(';');
		for(var i=0;i < cookies.length;i++) {
			var cookie = cookies[i];
			while (cookie.charAt(0)==' ') {
				cookie = cookie.substring(1,cookie.length);
			}
			if (cookie.indexOf(name) == 0) {
				cookieVal = cookie.substring(name.length,cookie.length);
			}
		}
		return cookieVal;
	},
	remove: function (name) {
		this.set(name,"",-1);
	}
})

F1.addObject('Cookies','F1Cookies');

F1Form = Class.create( {
	initialize: function(frmHandler) {
		if (frmHandler){
			this.frmHandler = frmHandler;
		}
	},
	save: function(formName) {
		myForm=$(formName);
		myForm.request({ 
			method: 'post',
			onSuccess: function(transport) {
				var Result = transport.responseText.evalJSON();
				if (Result.Rows[0].errormessage!='') {
					var cError = Result.Rows[0].errormessage ;
					alert(cError);
				}
				else {
					alert('Saved');
				}
						},
			onFailure: function() {
				alert('Login failed to contact the server. Please try again...') 
			} 
		});
	},
	bind: function(pk) {},
	render: function() {}
})

F1.addObject('FormHandler','F1Form');

F1.Google = {}

F1.Google.Search = function(tcTarget) {
	searchControl.draw($(tcTarget));
	searchControl.execute($f('txtSearch'));
}


//function getContentMenu(tcDocument)
//{
//	new Ajax.Request("getContentMenu.afp?doc=" + escape(tcDocument), 
//		{ 
//			method:'get',
//			onSuccess: function(transport)
//			{
//				var BodyMenu= $("BodyMenu");
//				/*BodyMenu.innerHTML=transport.responseText;*/
//				BodyMenu.innerHTML=[<b>Fo shizzle my nizzle</b>];
//			},
//			onFailure: function()
//			{ 
//				alert('Error contacting server. Please try the link again...');
//			} 
//		});
//}




function isNull(tvVar) {
    return typeof tvVar == 'object' && !tvVar;
}




function ShowPopup(oCaller,tcDocument)
{
	var oPopup = $('Popup')
	var pos = getXY(oCaller);
	oPopup.style.display="block";
	oPopup.style.left = pos[0];
    oPopup.style.top = pos[1]+20;
   
    new Ajax.Updater("Popup","showcontent.afp?doc=" + escape(tcDocument) + "&img=off");
}


function HidePopup(oCaller)
{
	var oPopup = $('Popup')
	oPopup.hide();
}

function getXY(oObject){
	var nX = 0;
	var nY = 0;
	if (oObject.offsetParent) {
		do {
			nX += oObject.offsetLeft;
			nY += oObject.offsetTop;
		} while (oObject= oObject.offsetParent);
	}
	return [nX,nY];
}

function editContent(tcDocument)
{
	window.location="edittopic.afp?doc="+ escape(document.F1CMSContentId);
}

function deleteContent(tcDocument)
{
	if (confirm('Delete topic?'))
	{
		window.location="deletetopic.afp?doc="+ escape(document.F1CMSContentId);
	}
}


function addContent(tcDocument)
{
	window.location="edittopic.afp" ;
}

function editContentX(tcDocument) 
{
	new Ajax.Request("editcontent.afp?doc=" + escape(document.F1CMSContentId), 
	{ 
		method:'get',
		onSuccess: function(transport)
		{
			$("bodyContents").update(transport.responseText);
			tinyMCE.init({
				mode : "textareas",
				theme : "advanced", 
				content_css : "css/F1cms.css",
				theme_advanced_toolbar_location : "top",
				table_inline_editing : true
			});
		},
			onFailure: function(){ alert('Please try the link again...') } 
		});
}


// Need to make this a direct subclass of the PeriodicalExecuter rather than
// attaching an instance of it. It's too awkward this way. 
F1.RotatingBanners = Class.create(PeriodicalExecuter,{
  initialize: function(target, frequency, newWindow) {
  	this.getImages();
    this.callback = this.rotateBanner;
    this.target=target;
    this.frequency = frequency;
    this.currentlyExecuting = false;
    this.bannerImages = '';
    this.registerCallback();
    this.newWindow=(arguments.length==3)?newWindow:false;
  },
  imageCount: 0,
  nextImage: Math.floor(Math.random()*11),

  rotateBanner: function() {
	if (this.imageCount>0) {
  		if (this.nextImage>this.imageCount-1){
  			this.nextImage=0;
  		}   		
    	$(this.target).update(this.getHTML(this.nextImage));
  		this.nextImage++; 
  	}
  },
  
  getImages: function() {
  	new Ajax.Request("callfunction.afp?f=getBannerImages",
	{ 
		method:'get',
		onSuccess: function(transport){
		  if (transport.responseText.isJSON()) {
		    // trailing spaces, carriage returns, and backslashes within the fields
		    // can cause evalJSON to fail. 			
		    var bannerImages = transport.responseText.evalJSON();
		    rotatingBanners.bannerImages = bannerImages.Rows;
			rotatingBanners.imageCount = rotatingBanners.bannerImages.length;
		  }
		},
		  onFailure: function(){ alert('Banner images failed to load...') } 
		});
  	},
  
  getHTML: function (imageNo) {
   	if (this.bannerImages[imageNo].nheight==0) {
   		var HeightStr = '';
   	}
   	else {
   		// need to read height value from JSON
   		var HeightStr = 'height="' + this.bannerImages[imageNo].nheight + '"';
   	}
 	var HTML = '<img border="0" ' + HeightStr + ' src="' + this.bannerImages[imageNo].cimage + '">';
 	if (this.bannerImages[imageNo].ctarget!='') {
 		if (this.newWindow) {
	 		HTML = '<a target="_blank" ' + 'href="' + this.bannerImages[imageNo].ctarget + '">' + HTML + '</a>';
 		}
 		else {
	 		HTML = '<a href="' + this.bannerImages[imageNo].ctarget + '">' + HTML + '</a>';
 		}
 		
 	}
 	return HTML ;
 }
})

