/**
 * This file is a library containing general javascript utility functions.
 * @param elementId
 */
 
//Set up default settings for jQuery User Interface objects
jQuery.datepicker.setDefaults({ dateFormat: 'yy-mm-dd',
                                showOn: "both",
                                buttonImage: "/images/Calendar.png",
                                buttonImageOnly: true});

//Function hides element with specified id.
function hideElement(elementId)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		element.style.display = "none";
	}
}

//Function makes element with specified id visible.
function showElement(elementId)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		element.style.display = "block";
	}
}

//Function hides element if it is shown and shows element if it is hidden.
function alternateHideShow(elementId)
{
    var element = document.getElementById(elementId);
    
    if (element != null)
    {
        var elementDisplay = element.style.display;
        if (elementDisplay != "none")
        {
            element.style.display = "none";       
        }
        else
        {
            element.style.display = "block";
        }
    }
}

//This function resets an element to its defaultValue.
function resetToDefaultValue(elementId)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		(element.value = element.defaultValue);
	}
	return;
}

//This function resets an element to its defaultValue.
function resetToDefaultChecked(elementId)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		(element.checked = element.defaultChecked);
	}
	return;
}


//Checks to see if text is valid.
function checkValidText(text)
{
	if ((text != null) && (text != ""))
	{
		return true;
	}
	else
	{
		return false;
	}
}

//Checks to see if selection is valid.
function checkValidSelection(selection)
{
	if ((selection != null) && (-1 != (+selection)))
	{
		return true;
	}
	else
	{
		return false;
	}
}

//Checks to see if date is valid.
function checkValidDate(date)
{
	var pat = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2}");
	if ((date != null) && (date.match(pat)))
	{
		return true;
	}
	else
	{
		return false;
	}
}

function checkValidFloat(floatNumber)
{
   if (floatNumber.length <= 0) return false;
   //if (floatNumber == "") return false;
   
   var parsedFloat = parseFloat(floatNumber);
   
   //if (parsedFloat != NaN)
   if (!isNaN(floatNumber))
   {
       return true;
   }
   else
   {
       return false;
   }
}

//Function gets the value of an element.
function getElementValue(elementId)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		return element.value;
	}
	return null;
}

//Function gets element.
function getElement(elementId)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		return element;
	}
	return null;
}

//Function sets the value of an element.
function setElementValue(elementId, assignValue)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		element.value = assignValue;
	}
	return;
}

function getElementInnerHTML(elementId)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		return element.innerHTML
	}
	else return null;
}

//Function sets the inner html of an element
function setElementInnerHTML(elementId, assignText)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		element.innerHTML = assignText;
	}
	return;
}

//This function sets the value of a checkbox.
function setChecked(elementId, checked)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		element.checked = checked;
	}
	return;
}

//Get the value of a checked element
function getChecked(elementId)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		return element.checked;
	}
}

//Disable an element
function disableElement(elementId)
{
	var element = document.getElementById(elementId);
	
	if (element != null)
	{
		element.disabled = true;
	}
}

function enableElement(elementId)
{
    var element = document.getElementById(elementId);
    
    if (element != null)
    {
        element.disabled = false;
    }
}


function getBodyElement()
{
	var bodyElements = document.getElementsByTagName("body");
	var mainBodyElement = bodyElements[0];
	
	return mainBodyElement;
}

//This name refers to a basic window manager object created for managing multiple website application windows.
windowManager = null;

//This function opens the jQuery dialog object and shows the url retrieved by AJAX.
function openDialogAndShowUrl(dialogObject, dialogLoadDiv, url)
{
        
    openDialog = function()
                    {
                        dialogObject.dialog('open'); }
    
    jQuery(dialogLoadDiv).load(url, openDialog);
}

//This function removes a jQuery popup from the dom.
function removePopupDialog(name)
{
    jQuery("#"+name).dialog('destroy');
    var bodyElement = getBodyElement();
    bodyElement.removeChild(getElement(name));
}

//This function creates an jQuery popup dialog. Still to add functionality that closes all windows on a tab change.
function createPopupDialog(title, name, url, height, width)
{
    //Handle unspecified paramaters.
    if (height == null) height = 650;
    if (width == null) width = 850;
    
    //Allow only one instance of a window with a specific name. Return without doing anything if element with the same id is already found.
    var existingDialog = jQuery("#"+name);
    
    if (jQuery("#"+name).is(':data(dialog)'))
    {
        if (jQuery("#"+name).dialog('isOpen')) return;
        else 
        {
            removePopupDialog(name);
        }
    }


    //Add the division element to the body.
	var dialogDiv = document.createElement("div");
	
	dialogDiv.setAttribute("id", name);
	
	dialogDiv.setAttribute("title", title);
	
	var bodyElement = getBodyElement();
	
	bodyElement.appendChild(dialogDiv);
	
	
	//Create Div to be populated inside dialog box and add to the the dialog division.
	var dialogLoadDiv = document.createElement("div");
	
	dialogLoadDiv.setAttribute("id", name+"Load");
	
	dialogDiv.appendChild(dialogLoadDiv);
	
    var dialogObject = jQuery(dialogDiv).dialog({
				        autoOpen: false,
				        minHeight: height,
				        minWidth: width,
				        modal: true,
				        close: function(event, ui) { removePopupDialog(name); }
				        });
    
	openDialogAndShowUrl(dialogObject, dialogLoadDiv, url);
	return;
}

//Gets the key from a selected option in a select html element.
function getSelectOptionKey(htmlSelectElement)
{
    if (htmlSelectElement != null)
    {
        var optionSelectedNum = htmlSelectElement.selectedIndex;
        var optionSelected = htmlSelectElement.options[optionSelectedNum];
        
        var optionKey = optionSelected.value;
        return optionKey;
    }
    else return null;
}

//Method setting action of URLBuilder
function URLBuilder_setAction(action)
{
    this.URLString = action + ".action";
}

//Method adding parameter to URLString
function URLBuilder_addParameter(parameterName, parameterValue)
{
    if ((parameterValue == null) || (parameterValue == "")) return;
    if (this.numberOfParameters == 0) this.URLString = this.URLString + "?";
    else this.URLString = this.URLString + "&";
    
    this.URLString = this.URLString + parameterName + "=" + parameterValue;
    
    this.numberOfParameters++;
}

//This method adds a parameter object to the url builder.
function URLBuilder_addParameterObject(parameter)
{
    if ((parameter != null) && (typeof parameter == "object") && (parameter instanceof Parameter) && (parameter.parameterValue != ""))
    {
        this.addParameter(parameter.parameterName, parameter.parameterValue);
    }
}

function URLBuilder_addParameterList(parameterList)
{
    for (i = 0; i<parameterList.length; i++)
    {
        this.addParameterObject(parameterList[i]);
    }
}

//The URL Builder class enables one to efficiently build a url with parameters. I found nothing else on the net that has the same functionality.
function URLBuilder()
{
    //First define the properties.
    this.URLString = "";
    
    this.numberOfParameters = 0;
    
    //Assign methods.
    this.setAction = URLBuilder_setAction;
    this.addParameter = URLBuilder_addParameter;
    this.addParameterObject = URLBuilder_addParameterObject;
    this.addParameterList = URLBuilder_addParameterList;
}

//The object provides form related functionality. It depends on the jQuery framework.
function Form(formSelector)
{
    //Set default values.
    this.formElement = null;

    if (formSelector != null)
    {
    	var selectorSearchResult = jQuery(formSelector);
    	if (selectorSearchResult.length>0) this.formElement = selectorSearchResult[0];
	}
    
    this.parameterList = new Array();
    
    this.numberOfParameters = 0;
    
    this.allRequiredFieldsValid = false;
    
    //Assign methods.
    this.addParameter = FormReader_addParameter;
    this.addFormParameters = FormReader_addFormParameters;
    this.getFormParameter = FormReader_getFormParameter;
    this.getFormParametersJs = FormReader_getFormParametersJs;
    this.loadResult = Form_loadResult;
    this.submitAjax = Form_submitAjax;
}

function Form_loadResult(actionName, selectorText)
{
	//Always assume the form's result is submitted via post.
	if ((actionName != null) && (selectorText != null))
	{
	    this.addFormParameters();
	    
	    if (this.allRequiredFieldsValid)
	    {
	        var aUrl = new URLBuilder();
	        aUrl.setAction(actionName);
	        
	        jQuery.ajaxSetup({
	           global: false,
	           type: "POST",
	           async: false
	        });
	        jQuery(selectorText).load(aUrl.URLString, this.getFormParametersJs());
	    }
	}
}

function Form_submitAjax(actionName, callBackFunctions)
{
	this.addFormParameters();
	
	if (callBackFunctions['additionalValidation'] != null)
	{
		var additionalValidation = callBackFunctions['additionalValidation'];
		additionalValidation(this);
	}
	
	if (this.allRequiredFieldsValid)
	{
		var aUrl = new URLBuilder();
	    aUrl.setAction(actionName);
	    
	    if (callBackFunctions['beforeSend'] != null)
	    {
	    	var beforeSend = callBackFunctions.beforeSend;
	    	beforeSend();
	    }
	    
	    var success = null;
	    if (callBackFunctions['success'])
	    {
	    	success = callBackFunctions['success'];
	    }
	    
	    var ajaxParameters = { type: "POST",
	            				url: aUrl.URLString,
	            				data: this.getFormParametersJs() }
	    if (success != null) ajaxParameters['success'] = success;
	    
	    
	    jQuery.ajax(ajaxParameters);
	}
}


//Add parameter to form reader.
function FormReader_addParameter(parameter)
{
    if ((parameter != null) && (typeof parameter == "object") && (parameter instanceof Parameter) && (parameter.parameterValue != null))
    {
	    this.parameterList[this.numberOfParameters] = parameter;
	    this.numberOfParameters++;
	}
	
}

//This object allows one to read form element and stores the values in an appropriate database.
function FormReader()
{
    //Set default values.
    this.formElement = null;
    
    this.parameterList = new Array();
    
    this.numberOfParameters = 0;
    
    this.allRequiredFieldsValid = false;
    
    //Assign methods.
    this.addParameter = FormReader_addParameter;
    this.addFormParameters = FormReader_addFormParameters;
    this.getFormParameter = FormReader_getFormParameter;
    this.getFormParametersJs = FormReader_getFormParametersJs;
}

//Adds the parameters in a form to the form reader object.
function FormReader_addFormParameters()
{
    var allRequiredFieldsValid = true;
    
    if (this.formElement != null)
    {
	    for (var i=0; i < this.formElement.elements.length; i++)
	    {
	        var formField = this.formElement.elements[i];
	        
	        //Check if formField contains content that must be submitted. No buttons must be included.
	        var parameterName = formField.getAttribute("name");
	        
	        var parameterValue = null;
	        if (formField.type == "checkbox")
	        {
	        	parameterValue = getChecked(formField.id);
	        }
	        else if (formField.type == "select-one")
	        {
	            parameterValue = jQuery(formField).val();
	        }
	        else
	        {
	        	parameterValue = formField.value;
	        }
	        
	        var parameterContentType = formField.getAttribute("content");
	        
	        //Check if content of parameter is valid.
	        var valid = true;
	        if (parameterContentType == "text")
	        {
	            valid = checkValidText(parameterValue);
	        }
	        else if (parameterContentType == "currency")
	        {
	            valid = checkValidFloat(parameterValue);
	        }
	        else if (parameterContentType == "select")
	        {
	            valid = checkValidSelection(getSelectOptionKey(formField));
	        }
	        else if (parameterContentType == "date")
	        {
	            valid = checkValidDate(parameterValue);
	        }
	        else if (parameterContentType == "naturalNumber")
	        {
	            valid = (+parameterValue > 0);
	        }
	        
	        var parameterErrorDiv = formField.getAttribute("error");
	        jQuery(this.formElement).find("#"+parameterErrorDiv).hide();
	        
	        if (valid) this.addParameter(new Parameter(parameterName, parameterValue));
	        else
	        {
	            //Get error message division
	            var parameterRequired = formField.getAttribute("requiredField");
	            if (parameterRequired == "true")
	            {
	                allRequiredFieldsValid = false;
	            }
	            jQuery(this.formElement).find("#"+parameterErrorDiv).show();
	        }
	    }
	    this.allRequiredFieldsValid = allRequiredFieldsValid;
    }
}

//This method returns the form parameter when the name of the object is supplied.
function FormReader_getFormParameter(name)
{
	for (var i=0; i < this.parameterList.length; i++)
	{
		var parameter = this.parameterList[i];
		
		//if the name matches the parameter name return the parameter.
		if (parameter.parameterName == name) return parameter;
	}
	return null; //if no matches are found return nothing.
}

function FormReader_getFormParametersJs()
{
	var formData = new Object();
	for (var i=0; i<this.parameterList.length; i++)
	{
		var parameter = this.parameterList[i];
		formData[parameter.parameterName] = parameter.parameterValue;
	}
	return formData;
}

//This object stores a form entry.
function Parameter(parameterName, parameterValue)
{
    //Set default values.
    if (parameterName == null) parameterName = "";
    if (parameterValue == null) parameterValue = "";
    
    //Define the properties.
    this.parameterName = parameterName;
    this.parameterValue = parameterValue;
    
    //Assign methods.
}

//This function tests if a valid wizard selection has been made by checking radio boxes and a drop down selection.
function testValidWizardSelection(blankRadioId, templateRadioId, templateDropDownId)
{
	if (
			(getChecked(blankRadioId)) ||
			( (getChecked(templateRadioId)) && (checkValidSelection(getSelectOptionKey(getElement(templateDropDownId)))) )
	   )
	{
		return true;
	}
	else
	{
		return false;
	}
}

/* Adds separators for number strings (useful for formatting currency strings). */
function addSeparators(nStr, separatorStr)
{
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + separatorStr + '$2');
    }
    return x1 + x2;
}

function makeVisibleWhenInside(makeVisibleSelect, whenInsideSelect)
{
    jQuery(whenInsideSelect).mouseenter(
    function()
    {
        jQuery(makeVisibleSelect).show();
    });
    jQuery(whenInsideSelect).mouseleave(
    function()
    {
        jQuery(makeVisibleSelect).hide();
    });
}

/* The widget object abstracts the implementation of widgets on the admin side.*/
function Widget()
{
	this;
}

/* The OpenCloseWidget opens and closes a view. */
OpenCloseWidget.prototype.superclass = Widget;
function OpenCloseWidget(openCloseBoxSelector, openCloseImageSelector)
{
	this.superclass();
	
	this.openCloseBox = jQuery(openCloseBoxSelector);
	this.openCloseImage = jQuery(openCloseImageSelector)[0];
	this.open = function(){
		jQuery(this.openCloseBox).show();
		this.openCloseImage.src = this.upImage;
	}
	this.close = function(){
		jQuery(this.openCloseBox.hide());
		this.openCloseImage.src = this.downImage;
	}
	this.clean = function(){
		this.openCloseBox.innerHTML = "";
	}
	this.upImage = "../images/up.jpg";
	this.downImage = "../images/down.jpg";
}
