﻿var AssignmentChangeController = function()
{	
	var nextUrl;	
	var postBackScript;
	var pressedButton;
	var dialog;
	var wasChanged = false;	
	var isEnabled = false;
	var dialogContainerId = '';
	var cleanAssignmentsUrl = "SessionCleaner.asmx/ClearAssignments";								
		
	var callback = {
		//success: function() { alert('cleaned!'); },
		//failure: function() { alert('clean failed'); },
		cache: false
	};
	
	var cleanAssignments = function()
	{
		var request = YAHOO.util.Connect.asyncRequest('GET', cleanAssignmentsUrl, callback); 
	}
	
	var handleYes = function () 
	{
		wasChanged = false;			
		cleanAssignments();
        dialog.hide();
        
        handleYesAction();        
	};
	
	var handleYesAction = function()
	{
		if (nextUrl != null)
		{
			location.href = nextUrl;
		}
		else
		{
			if (postBackScript != null)
			{			
				evalPostBackScript();
			}
			
			if (pressedButton != null)
			{
				if (pressedButton.click != null)
				{
					pressedButton.click();
				}
			}
		}
	};
	
	var handleNo = function() 
	{
		dialog.hide();			
    };       
    
    var createDialog = function()
    {
		dialog = new YAHOO.widget.SimpleDialog("wasChangedDialog", 
             { width: "300px",
               fixedcenter: true,
               visible: false,
               draggable: false,
               modal: true,
               close: true,
               text: "Er du sikker på, du vil forlade denne opgave?",
               icon: YAHOO.widget.SimpleDialog.ICON_WARN,
               constraintoviewport: true
             } );
             
		var dialogButtons = [ 
			{ text:"Ja", handler:handleYes },
			{ text:"Nej", handler:handleNo } 
		];
    					
        dialog.cfg.queueProperty("buttons", dialogButtons);
        dialog.setHeader("Advarsel!");
        dialog.render(dialogContainerId);
        
        YAHOO.util.Event.addListener(window, 'unload', function()
		{		
			if (dialog != null)	
			{
				dialog.destroy();
			}
		});
    };
    
    var showDialog = function()
    {
		if (dialog == null)
		{
			createDialog();
		}
		return dialog.show();
    };
    
    var clearState = function()
    {
		nextUrl = null;		
		postBackScript = null;
		pressedButton = null;
    };
    
    var stopEvent = function(e) 
	{
		if (e != null)				
		{					
			if (e.preventDefault) 
			{ 
				e.preventDefault(); 
			}
			
			if (e.stopPropagation) 
			{ 
				e.stopPropagation(); 
			}
			
			if (e.cancelBubble) 
			{ 
				e.cancelBubble = true; 
			}	
			e.returnValue = false;
		}
	};
	
	var evalPostBackScript = function()
	{
		eval(postBackScript+";");			
	};
	
	var extractPostBackScript = function(button)
	{		
		var clickScript = button.attributes["onclick"].value;
									
		var endOfControllerCall = clickScript.indexOf(";");		
		var extractedScript = clickScript.substring(endOfControllerCall+1);			
		
		return extractedScript;
	}
    
    // return a public interface
    return {
		init: function(dlgContainerId, initialIsEnabled, initialCleanAssignmentsUrl)	
		{
			dialogContainerId = dlgContainerId;
			isEnabled = initialIsEnabled;
			cleanAssignmentsUrl = initialCleanAssignmentsUrl;
		},
    
		checkWasChanged: function(navUrl)
		{
			clearState();
			
			if (isEnabled)
			{ 
				if (wasChanged)
				{				
					nextUrl = navUrl;
					showDialog();			
					return false;
				}
				else
				{
					cleanAssignments
					location.href = navUrl;
				}
			}
			else
			{
				location.href = navUrl;
			}
		},
		
		checkWasChangedForCrossPostButton: function(button, e)
		{
			clearState();
			
			postBackScript = extractPostBackScript(button);
			
			if (isEnabled)
			{
				if(wasChanged)
				{	
					pressedButton = button;			
					stopEvent(e);				
					showDialog();				
					return false;
				}
				else
				{
					cleanAssignments();
					evalPostBackScript();
					return true;
				}
			}
			else
			{
				evalPostBackScript();
				return true;
			}							
		},
		
		setWasChanged: function(value)
		{
			wasChanged = value;
		},
		
		getWasChanged: function()
		{
			return wasChanged;
		},
		
		setEnabled: function(value)
		{
			isEnabled = value;
		},
		
		getEnabled: function()
		{
			return isEnabled;
		},
		
		notifyAboutChange: function()
		{
			wasChanged = true;
		}
    };
}();