﻿// Global Constants -----------------------------------------------------------------------------------------------------------------

var processing_image = "/images/indicators/24-24/default.gif";
var failed_message = "Oops";
var failed_image = "/images/indicators/24-24/failure.gif";
var success_message = "Done!";
var success_image = "/images/indicators/24-24/success.gif";
var feedback_imageclass = "indicator";
var feedback_spanclass = "indicator";
var failed_spanclass = "indicator failed";
var textfieldclass = "short textfield";
var selectfieldclass = "short";
var processing_duration = 1000;
var complete_duration = 1500;
var error_duration = 2000;
var fade_duration = 0.4;
var appear_duration = 0.4;
var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

// Feedback processing -----------------------------------------------------------------------------------------------------------------
showFeedback = function(actionContainerID, message)
{
	//create div for feedback
	var divFeedback = document.createElement("div");
	divFeedback.id = "submitFeedback";
	divFeedback.className = "";
	divFeedback.style.display = "none"; //to be faded in by effect.Appear

	//create processor image
	var imgProc = document.createElement("img");
	imgProc.src = processing_image;
	imgProc.alt = "";
	imgProc.id = "processorImage";
	imgProc.className = feedback_imageclass;
	
	//create span for written feedback
	var spnText = document.createElement("span");
	spnText.id = "plain-text-message";
	spnText.innerHTML = message + "&#8230;";
	spnText.className = feedback_spanclass;
	
	//append created elements to dom
	divFeedback.appendChild(imgProc);
	divFeedback.appendChild(spnText);
	$(actionContainerID).appendChild(divFeedback);
	
	var childIndex = GetBrowserFirstChildNodeIndex();
	
	var buttons = $(actionContainerID).childNodes[childIndex].id;
	
	Effect.Fade(buttons,
	{
		duration: fade_duration,
		afterFinish:function()
		{
		    if (is_chrome)
		    {
		        $("submitFeedback").style.display = '';
		    }
		    else
		    {
		    Effect.Appear('submitFeedback',
			{
				duration: appear_duration
			});
		    }
		}
	});
}

setFeedbackComplete = function(message, controls)
{
    for (var i=0; i<controls.length; i++)
		setControlErrorMessage(controls[i].ControlID,'');
	
	if (is_chrome)
	{
	    $("processorImage").src = success_image;
        $("plain-text-message").innerHTML = message;
	}
	else
	{
	    Effect.Fade('submitFeedback',
	    {
		    duration: fade_duration,
		    afterFinish:function()
		    {
		        $("plain-text-message").innerHTML = message;
		        $("processorImage").src = success_image;
    	        
			    Effect.Appear('submitFeedback',
        	    {
				    duration: appear_duration
			    });
		    }
	    });
    }
}

setFeedbackFailed = function()
{
    
    if (is_chrome)
    {
        $("processorImage").src = failed_image;
        $("plain-text-message").innerHTML = failed_message;
        $("plain-text-message").className = failed_spanclass;
    }
    else
    {
        Effect.Fade('submitFeedback',
	    {
		    duration: fade_duration,
		    afterFinish:function()
		    {
		        $("processorImage").src = failed_image;
	            $("plain-text-message").innerHTML = failed_message;
	            $("plain-text-message").className = failed_spanclass;
			    Effect.Appear('submitFeedback',
			    {
				    duration: appear_duration
			    });
		    }
	    });
    }
    

}

//hide processor feedback and restore buttons, then remove the generated feedback div
restoreButtonsAndFeedback = function(actionContainerID)
{
	var childIndex = GetBrowserFirstChildNodeIndex();
	var buttons = $(actionContainerID).childNodes[childIndex].id;
	
	if (is_chrome)
	{
	    $("submitFeedback").style.display = 'none';
	    Effect.Appear(buttons, { duration: appear_duration });
	}
	else
	{
	
	    Effect.Fade('submitFeedback',
	    {
		    duration: fade_duration,
		    afterFinish:function()
		    {
			    Effect.Appear(buttons,
			    {
				    duration: appear_duration
			    });
    			
		    }
	    });
	    window.setTimeout(function()
	    {
		    removeFeedback(actionContainerID)
	    },1600);
    }
}

removeFeedback = function(actionContainerID)
{
	var divContainer = $(actionContainerID);
	var divFeedback = $("submitFeedback");
	divContainer.removeChild(divFeedback);
}

feedbackValid = function(actionContainerID, completemessage, controls)
{
	window.setTimeout(function(){setFeedbackComplete(completemessage, controls)}, processing_duration);
}

feedbackInvalid = function(actionContainerID)
{
	window.setTimeout(function(){setFeedbackFailed()}, processing_duration);			
	window.setTimeout(function(){restoreButtonsAndFeedback(actionContainerID);}, processing_duration + error_duration);
}

ProcessFeedback = function(showSuccess, result, actionContainerID, validCompleteMessage, successfulFunction)
{
    var res = false;
    var controls = result.controls;
	
	if(result.Valid)
	{
	    if (showSuccess)
	    {
	        feedbackValid(actionContainerID, validCompleteMessage, controls);
	        if (successfulFunction!="")
	        {
	            window.setTimeout(successfulFunction, processing_duration + complete_duration);
	            window.setTimeout("restoreButtonsAndFeedback('" + actionContainerID + "');", processing_duration + complete_duration + 1000);
	        }
	        else
		        window.setTimeout("restoreButtonsAndFeedback('" + actionContainerID + "');", processing_duration + complete_duration);
		}
	    else
	    {
	        for (var i=0; i<controls.length; i++)
		        setControlErrorMessage(controls[i].ControlID,'');
		        
	        eval(successfulFunction);
	    }
	        
		res = true;
	}
	else
	{
		switch (result.Message)
		{
			case "invalid": case "nomatch":
				feedbackInvalid(actionContainerID);
				window.setTimeout(function(){processValidationResponse(controls)},2001);
			    break;
			case "exists":
				alert("Email already exists");
			    break;
		}
	}
	return res;
}




//control processing ------------------------------------------------------------------------------------------------------------------

processValidationResponse = function(controls)
{
    var message = '';
    
	for (var i=0; i<controls.length; i++)
	{
	    message = '';
	    if (!controls[i].Valid)
	        message = controls[i].Message;
	        
		setControlErrorMessage(controls[i].ControlID, message);
	}
}

setControlErrorMessage = function(controlID, message)
{
	if(ensureErrorControlExists(controlID))
	{
	    var element_control = $(controlID);
	    
	    if (element_control == null)
	        alert(errControlID);
	    else
	    {
	        var classname = textfieldclass;
	     
	        if (element_control.tagName == "SELECT")
	            classname = selectfieldclass;
	        
	        var element_errControlID = $(controlID + "Err"); 
	        
	        if (message == '')
	        {
	            element_errControlID.innerHTML = '';
	            element_errControlID.style.display = "none";
            } 
            else
            {
                classname += " error";
                element_errControlID.innerHTML = message;
	            element_errControlID.style.display = "block";
            }
            
            element_control.className = classname;
	    }
    }
}

ensureErrorControlExists = function (controlID)
{

    var elCtl = $(controlID+ "Err");
    if (elCtl==null)
    {
        elParent = $(controlID).parentNode;
        if(elParent!=null) {
            var errSpan = document.createElement("span");
            errSpan.id = controlID + "Err";
            errSpan.className = "error";
            elParent.appendChild(errSpan);
            return true;
        } else 
            return false;
    } else 
        return true;
}

clearErrorMessages = function()
{
	var contSpans = document.getElementsByClassName("error");
	for (var i=0; i<contSpans.length; i++)
	    if (contSpans[i].tagName=="SPAN")
	    {
	        contSpans[i].style.display = "none";
	        contSpans[i].innerHTML = "";
	    }
	
	var contInputs = document.getElementsByClassName("error");
	for (var i=0; i<contInputs.length; i++)
	{
	    var classname = textfieldclass;
	    if (contInputs[i].tagName == "SELECT")
	        classname = selectfieldclass;
	    
	    contInputs[i].className = classname;
	}
}




//dropdown loading transisions ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

var image_loading_src = "/images/indicators/16-16/default.gif";
var image_loading_class = "indicator";
var image_loading_appear_time = 0.4;
var image_loading_fade_time = 0.3;
var dd_fade_time = 0.4;
var dd_fade_opacity = 0.25;
var dd_appear_time = 0.4;
var dd_finish_loading_timeout = 500;
var dd_redraw_timeout = 250;

redrawDropDownOptions = function (_dd_id, _options)
{
    var dd = $(_dd_id);
    dd.innerHTML = _options.replace("|", "\n");
}

ShowDropDownLoading = function (elementid)
{    
    div_element = $("div-" + elementid);
    element_loading_image_id = elementid + "-loading-image";
    
    //create image element
    if ($(element_loading_image_id)==null)
    {
        var imgLoading = document.createElement("img");
        imgLoading.src = image_loading_src;
        imgLoading.id = element_loading_image_id
        imgLoading.className = image_loading_class;
        imgLoading.alt = "";
        imgLoading.style.display = "none";
        
         //append created elements to loading message container
        div_element.appendChild(imgLoading);
    }

    Effect.Appear(element_loading_image_id, { duration: image_loading_appear_time, to: 1 });
    Effect.Fade(elementid, { duration: dd_fade_time, to: dd_fade_opacity });
}

FinishDropDownLoading = function (elementid) 
{
    div_element = $("div-" + elementid);
    element_loading_image_id = elementid + "-loading-image";
    element_loading_image = $(element_loading_image_id);

    Effect.Fade(element_loading_image_id, { duration: image_loading_fade_time, to: 0 });
//        afterFinish:function() 
//        { 
//            div_element.removeChild(element_loading_image);
//        } });
    Effect.Appear(elementid, { duration: dd_appear_time, from: dd_fade_opacity });
}

getDropDownValue = function (_dd_id)
{
    var value = $(_dd_id).value;
    if (value=="-1") value="";
    return value;
}
