// settings main object ( Private methods )	
///////////////////////////////////////////////////////////////////////////
var contestSettings = (function(){
	
	var defaultUrl;
	var userid;
	var userGrade;
	var subscribeUrl;
	var unsubscribeUrl;
	var uploadAreaUrl;
	var entryListUrl;
	var loaderGif;
	var deleteEntryUrl;
	var ajaxErrorMsg;
	
	return function( options ){

		this.getDefaultUrl = function(){
			return defaultUrl;	
		};
		
		this.getUserid = function(){
			return userid;	
		};

		this.getUserGrade = function(){
			return userGrade;	
		};
		
		this.getSubscribeUrl = function(){
			return subscribeUrl;			
		};
		
		this.getUnsubscribeUrl = function(){
			return unsubscribeUrl;			
		};

		this.getUploadAreaUrl = function(){
			return uploadAreaUrl;			
		};

		this.getEntryListUrl = function(){
			return entryListUrl;			
		};

		this.getLoaderGif = function(){
			return loaderGif;			
		};

		this.getDeleteEntryUrl = function(){
			return deleteEntryUrl;			
		};		
		
		this.getAjaxErrorMsg = function(){
			return ajaxErrorMsg;			
		};

							
		defaultUrl = options.defaultUrl;
		userid = options.userid;
		userGrade = options.userGrade;
		subscribeUrl = options.subscribeUrl;
		unsubscribeUrl = options.unsubscribeUrl;
		uploadAreaUrl = options.uploadAreaUrl;
		entryListUrl = options.entryListUrl;
		loaderGif = options.loaderGif;
		deleteEntryUrl = options.deleteEntryUrl;
		ajaxErrorMsg = options.ajaxErrorMsg;
	};

})();


// contest main object ( first to be loaded )	
///////////////////////////////////////////////////////////////////////////
var contestManager = function(){};

//load the left menu with teh contests situation for the user logged
contestManager.prototype = {
	
	init : function(options){
			contestManager.settings =  new contestSettings(options);
			contestManager.prototype.setUp();
	},

	setUp : function() {
			
			contestManager.helper.blockUI();
			
			var url = contestManager.settings.getDefaultUrl() + '?uuserId=' + contestManager.settings.getUserid();
			contestManager.helper.ajaxCall( url , 'html' , contestManager.handlers.leftLoadHandler , contestManager.handlers.ajaxErrorHanlder );
	
			},

	// Subscribe to the passed contest
	subscribe: function( contestId , msg ){
	
			
			var box = new contestManager.helper.confirmBox( msg , function(){
			
				var url = contestManager.settings.getSubscribeUrl() + '?uuserId=' + contestManager.settings.getUserid() + '&contestId=' + contestId;
				contestManager.helper.ajaxCall( url , 'json' , contestManager.handlers.subscribeHandler , contestManager.handlers.ajaxErrorHanlder );				
			
			})
			
			box.show();
			
	},
	
	// UnSubscribe to the passed contest
	unsubscribe : function ( contestUserId , msg ){
		
			var box = new contestManager.helper.confirmBox( msg , function(){
				
				var url = contestManager.settings.getUnsubscribeUrl() + '?contestUserId=' + contestUserId;
				contestManager.helper.ajaxCall( url , 'json' , contestManager.handlers.unsubscribeHandler , contestManager.handlers.ajaxErrorHanlder );
			
			})
			
			box.show();
				
		},

	// Load the upload area
	loadUploadArea : function ( contestId , cleanMsg){
			
			var cleanMsg = cleanMsg || false;
			
			// save reference to the contestId
			contestManager.settings.contestid = contestId;
			
			// block the UI
			contestManager.helper.blockUI();
	
			var url = contestManager.settings.getUploadAreaUrl() + '?uuserId=' + contestManager.settings.getUserid() + '&contestId=' + contestManager.settings.contestid + '&userGrade=' + contestManager.settings.getUserGrade();
			contestManager.helper.ajaxCall( url , 'html' , contestManager.handlers.uploadAreaHandler , contestManager.handlers.ajaxErrorHanlder );
		
			if (cleanMsg == true) {
				// clean the message box
				contestManager.helper.cleanMsgBox();
			}
		},
	
	loadEntries : function (){
			
			// ui block is made over cause loadEntries is always a callback of others events
			
			var url = contestManager.settings.getEntryListUrl() + '?contestUserId=' + contestManager.settings.contestUserId + '&contestId=' + contestManager.settings.contestid;
			contestManager.helper.ajaxCall( url , 'html' , contestManager.handlers.loadEntriesHandler , contestManager.handlers.ajaxErrorHanlder );
		
	},
	
	deleteEntry : function( msg , assetid ){
		
		var box = new contestManager.helper.confirmBox( msg , function(){
		
			var url = contestManager.settings.getDeleteEntryUrl() + '?assetid=' + assetid + '&contestUserId=' + contestManager.settings.contestUserId + '&contestId=' + contestManager.settings.contestid;
			contestManager.helper.ajaxCall( url , 'json' , contestManager.handlers.deleteEntryHandler , contestManager.handlers.ajaxErrorHanlder );

		})		
		
		box.show();
	},
	
	editEntry : function( assetid , elem ){

		// get the form inside the div to show
		var editForm = $(elem).children();

		// validate it
		var options = {
			dataType:'json',
			cache: false,
			success: contestManager.handlers.editEntryhandler,
			error: contestManager.handlers.ajaxErrorHanlder							
 		}
						  												 
		$(editForm).validate({
			submitHandler: function(form) {
					$(form).ajaxSubmit(options);
			}
		});

		var blockBox = new contestManager.helper.blockUI( elem );
		
	},
	
	showClassWorkAges : function(el,index){
		
		var val = $(el).val();
		var elToHide = $('.oldestStudent_' + index);
		
		if(val == 0){
			elToHide.slideUp();
			elToHide.find('.maxAgeForClassWork').removeClass('required');		
		}else{
			elToHide.slideDown();
			elToHide.find('.maxAgeForClassWork').addClass('required');					
		}
		
		var f = $('.uploadForm_' + index);
		
		$(f).validate({
			errorLabelContainer: $(f).prev(),
			wrapper: 'p',
			submitHandler: function(form) {
					//block the ui
					contestManager.helper.blockUI();
					$(form).ajaxSubmit(options);
			}
		});

	}
		
};

	
// contest handler class	
///////////////////////////////////////////////////////////////////////////
contestManager.handlers = {};	

contestManager.handlers.subscribeHandler = function(responseText, textStatus){
		if(responseText[0].STATUS){
			// refresh the left region
			contestManager.prototype.setUp();
			// show the success message
			contestManager.helper.writeInMsgBox(responseText[0].TEXT);
			//unblock the UI
			contestManager.helper.unblockUI();

		}else{

			// show the error message
			contestManager.helper.writeInMsgBox(responseText[0].TEXT);

		}
	}

contestManager.handlers.unsubscribeHandler = function ( responseText, textStatus ){
		if(responseText[0].STATUS){
			// refresh the left region
			contestManager.prototype.setUp();
			// clean the center region
			$('#dashBoardRight').empty();
			//show teh success message
			contestManager.helper.writeInMsgBox(responseText[0].TEXT);
			//unblock the UI
			contestManager.helper.unblockUI();
		}else{
			//show the message
			contestManager.helper.writeInMsgBox(responseText[0].TEXT);
			//unblock the UI
			contestManager.helper.unblockUI();
		}

	}

contestManager.handlers.leftLoadHandler = function (responseText, textStatus){	
		
		// show the ajax result in the left region	
		$('#dashBoardLeft').html(responseText);
		
		// attach events to injected html
		$('.manageContest').click(function(){
			contestId = $(this).attr("rel");
			contestManager.prototype.loadUploadArea( contestId , true );	
		});
		
		// subscribe
		$('.subscribe').click(function(){				
			var contestId = $(this).attr('rel');
			var msg = $(this).attr('title');
			contestManager.prototype.subscribe( contestId , msg );			
		});
		
		// unsubscribe
		$('.unsubscribe').click(function(){
			contestUserId = $(this).attr('rel');
			var msg = "Are you sure do you want to unsubscribe ? All the info and files will be permanently delated.";
			contestManager.prototype.unsubscribe( contestUserId , msg );
					
		});
		
		contestManager.helper.unblockUI();

	}

contestManager.handlers.uploadAreaHandler = function(responseText, textStatus){
		
		$('#dashBoardRight').html(responseText);
		
		//set the tabs behaviour
		$('#tabs  ul').tabs();

		// get the number of forms to validate
		var formsToValidate =  $('.uploadForm');
		
		for( var i=0 ; i < formsToValidate.length ; ++i){

			var f = formsToValidate[i];
			var target = $("#ajaxContent");
			
			var options = {
				dataType:'json',
				cache: false,
				// upload success handling
				success: function(responseText, statusText){
					if (responseText[0].STATUS) {
						//reload uplaod area
						contestManager.prototype.loadUploadArea(contestManager.settings.contestid , false);
						//unblock the UI
						contestManager.helper.unblockUI();
						// write out the result
						contestManager.helper.writeInMsgBox(responseText[0].TEXT);

					}else{
						// write out the result
						contestManager.helper.writeInMsgBox(responseText[0].TEXT);
						//unblock the UI
						contestManager.helper.unblockUI();
					}	
				},
				error: contestManager.handlers.ajaxErrorHanlder							
	 		}; 
				  												 
			$(f).validate({
				errorLabelContainer: $(f).prev(),
				wrapper: 'p',
				submitHandler: function(form) {
						//block the ui
						contestManager.helper.blockUI();
						$(form).ajaxSubmit(options);
				}
			});
		
		}//end loop	

	
	// get parameters from the page load
	contestManager.prototype.loadEntries();
	
	
}

contestManager.handlers.loadEntriesHandler = function (responseText, textStatus){			
		$('#entries').html(responseText);
		
		// attach delete entry event
		$('.deleteEntry').click(function(){
			var assetid = $(this).attr('rel');
			var msg = $(this).attr('title');
			contestManager.prototype.deleteEntry( msg , assetid );
		});
		
		$('.editEntry').click(function(){
			var assetid = $(this).attr('rel');
			var divId = '_' + assetid + 'entryFormDiv';
			var elem = $('#' + divId );
			contestManager.prototype.editEntry( assetid , elem );
		});
		
		// attach th event to the X for unblock
		$('.closeForm').click(function(ev){
			ev.preventDefault();
			contestManager.helper.unblockUI();
		});
			
		//unblock the UI
		contestManager.helper.unblockUI();

	}

contestManager.handlers.deleteEntryHandler = function(responseText, textStatus){							
			if(responseText[0].STATUS){
				//reload upload area ( also relaod entry list )
				contestManager.prototype.loadUploadArea( contestManager.settings.contestid );
				// write out the message
				contestManager.helper.writeInMsgBox(responseText[0].TEXT);
				//unblock the UI
				contestManager.helper.unblockUI();
			
			}else{
				// write out the message
				contestManager.helper.writeInMsgBox(responseText[0].TEXT);
				//unblock the UI
				contestManager.helper.unblockUI();
			}
	
	}

contestManager.handlers.editEntryhandler = function(responseText, textStatus){
			if(responseText[0].STATUS){
				//reload the entries list to update the local data
				contestManager.prototype.loadEntries();
				// write out the message
				contestManager.helper.writeInMsgBox(responseText[0].TEXT);
				//unblock the UI
				contestManager.helper.unblockUI();
			
			}else{
				// write out the message
				contestManager.helper.writeInMsgBox(responseText[0].TEXT);
				//unblock the UI
				contestManager.helper.unblockUI();
			}
	
}

contestManager.handlers.ajaxErrorHanlder = function(){
		//unblock teh UI area
		$('#contestUi').unblock();
		//place the default error message in the messages box		
		$('#mainMessage').html(contestManager.settings.getAjaxErrorMsg());

	}

	

// contest helper class	
///////////////////////////////////////////////////////////////////////////
contestManager.helper = {};

contestManager.helper.ajaxCall = function( url , dataType , success , error){
	$.ajax({
		url : url ,
		dataType : dataType,
		cache : false,
		success : success,
		error : error							
		});
	}

contestManager.helper.confirmBox = function( msg , fn ){
		
		var text = msg ;
		var fn = fn ;
		
		// reset the text of the box
		$('#textBox').text( text );
		
		//remove previous events and attach new evs to both teh buttons
		$('#yesBtn').unbind();
		$('#noBtn').unbind();
		
		$('#yesBtn').click(function(){		
			contestManager.helper.unblockUI();
			eval(fn());
		});
				
		$('#noBtn').click(function(){
			$('#contestUi').unblock();
		});
		
	
		this.show = function(){

			contestManager.helper.blockUI($('#blockBox'));

		};
		
	}
	
contestManager.helper.blockUI  = function( msg ){
	
	this.msg = msg || contestManager.settings.getLoaderGif();
	
	$('#contestUi').block({
		message : this.msg,
		overlayCSS: {
			backgroundColor: '#FFFFFF'
		},
		css :{ 
			width : '80%',
			border : 0
		}
    });

	}

contestManager.helper.unblockUI  = function(){
	$('#contestUi').unblock();
	
	}

contestManager.helper.cleanMsgBox = function(){
	$('#mainMessage').empty();	
	}

contestManager.helper.writeInMsgBox = function (text){	
	$('#mainMessage').html(text);	
	}



	

	





