/*
Page Author				: Stefan Kruger
Page Created Date		: 16-Jul-2010
Page Modification Log	:
Person:							Date:		Description:
------------------------------------------------------------------------------------------------------
Stefan Kruger					16-Jul-2010	Created file

To Do:
------
*/

//////////////////////////////////////////////////////////////////////////////////////////////
//GENERAL FUNCTIONS
//////////////////////////////////////////////////////////////////////////////////////////////
function handleError(message) {
    alert("Error occured : " + message);
}

function handleException(ex, source, sourceSub) {
    alert("Exception occured : " + source + " - " + sourceSub + ".\n" + ex.message);
}

function parseJSON(JSON) {
    try {
        return eval("(" + JSON + ")");
    }
    catch (ex) {
        handleException(ex, "parseJSON", "Main");
    }
    return null;
}

var displayContent = function(data, loadIn, postLoad, extendedData) {
    try {
        document.getElementById(loadIn).innerHTML = data;
        try {
            eval(postLoad);
        }
        catch (ex) {
            handleException(ex, "loadContent", "Postload");
        }
    }
    catch (ex) {
        handleException(ex, "displayContent", "Main");
    }
}

//////////////////////////////////////////////////////////////////////////////////////////////
//FORM INPUT HANDLING
//////////////////////////////////////////////////////////////////////////////////////////////
/*
A generalised form submitting function that returns the contents of a form in URL querystring
jQuery serialize() method could be a replacement for this.
*/
function extractFormData(formToProcess) {
    var theform;
    if (formToProcess) {
        theform = document.getElementById(formToProcess);
    }
    else {
        theform = null;
    }

    var queryString = "";
    var addString = "";
    if (theform) {
        try {
            for (var i = 0; i < theform.elements.length; i++) {
                if (queryString == "") {
                    addString = "";
                }
                else {
                    addString = "&";
                }
                if (theform.elements[i].type == "radio") {
                    if (theform.elements[i].checked) {
                        addString += theform.elements[i].name + "=" + encodeURIComponent(theform.elements[i].value);
                    }
                }
                else {
                    if (theform.elements[i].type == "checkbox") {
                        if (theform.elements[i].checked) {
                            addString += theform.elements[i].name + "=" + 1;
                        }
                        else {
                            addString += theform.elements[i].name + "=" + 0;
                        }
                    }
                    else {
                        if (theform.elements[i].type == "select-multiple") {
                            for (j = 0; j < theform.elements[i].options.length; j++) {
                                if (theform.elements[i].options[j].selected) {
                                    if (addString != "" && addString != "&") {
                                        addString += "&";
                                    }
                                    addString += theform.elements[i].name + "=" + encodeURIComponent(theform.elements[i].options[j].value);
                                }
                            }
                        }
                        else {
                            //Meaning : Hidden, Text or Single-Select : All treated equally without discrimination... :-)
                            if (typeof (theform.elements[i].value) != 'undefined' && theform.elements[i].value != null) {
                                if (theform.elements[i].type != 'button') {
                                    //alert(theform.elements[i].type + ': ' + theform.elements[i].id + ': '  + theform.elements[i].value);
                                    addString += theform.elements[i].name + "=" + encodeURIComponent(theform.elements[i].value);
                                }
                            }
                        }
                    }
                }
                if (addString != "&") {
                    queryString += addString;
                }
            }
        }
        catch (ex) {
            handleError("Error occured processing input form '" + formToProcess + "'.\nSource: [fetchInputFormData].\nDetail: " + ex.message);
        }
    }
    else {
        //alert("Invalid input form specified.");
    }
    //alert(queryString);
    theform = null;
    return queryString;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//NAVIGATION & MENUS
//////////////////////////////////////////////////////////////////////////////////////////////
function initialiseAjax() {
    $(".ajax").click(function(event) {
        //alert(this.href);
        ajaxRequest(this.href, null, null, null, displayContent, "maincontent", null, null, false);
        event.preventDefault();
        return false;
    });
}

function initialiseHoverMenus() {
    $(".ajax").click(function(event) {
        this.blur();
        hideAllHoverMenus();
        event.preventDefault();
        return false;
    });

    $(".showhovermenu").mouseenter(function(event) {
        var hoverMenuObject = document.getElementById(this.id + "_hovermenu");
        if (hoverMenuObject) {
            clearTimeout(document.getElementById(this.id + "_hovermenu").hoverhidetimeout);
            showHoverMenu(document.getElementById(this.id + "_hovermenu"), this);
        }
        else {
            hideAllHoverMenus();
        }
        event.preventDefault();
        return false;
    });

    $(".showhovermenu").mouseleave(function(event) {
        var hoverMenuObject = document.getElementById(this.id + "_hovermenu");
        if (hoverMenuObject) {
            hideHoverMenu(hoverMenuObject);
        }
        event.preventDefault();
        return false;
    });

    $(".hovermenu").mouseenter(function(event) {
        clearTimeout(this.hoverhidetimeout);
        event.preventDefault();
        return false;
    });


    $(".hovermenu").mouseleave(function(event) {
        hideHoverMenu(this);
        event.preventDefault();
        return false;
    });
}

function toggleHoverMenu(menuObj, sourceObj) {
    var hidden = $(menuObj).hasClass("display_none");
    if (hidden) {
        showHoverMenu(menuObj, sourceObj);
    }
    else {
        hideHoverMenu(menuObj);
    }
}

function showHoverMenu(menuObj, sourceObj) {
    hideAllHoverMenus();
    var sourceOffset = $(sourceObj).offset();
    var sourceHeight = $(sourceObj).height();
    var sourceWidth = $(sourceObj).width();
    var menuWidth = $(menuObj).width();
    var topAdjustment = 0;
    var leftAdjustment = 0;

    var hoverright = $(sourceObj).hasClass("hover_right");
    var menuTop = sourceOffset.top + sourceHeight + topAdjustment;
    var menuLeft = null;
    if (hoverright) {
        menuLeft = sourceOffset.left + sourceWidth - menuWidth - leftAdjustment;
    }
    else {
        menuLeft = sourceOffset.left + leftAdjustment;
    }
    //alert("showing..." + menuObj.id + "\n sourcetop" + sourceOffset.top + "\n sourceleft" + sourceOffset.left + "\n sourceHeight" + sourceHeight + "\n\n menuTop" + menuTop + "\n menuLeft" + menuLeft);
    $(menuObj).css("top", menuTop);
    $(menuObj).css("left", menuLeft);
    $(menuObj).removeClass("display_none");
}

function hideHoverMenu(menuObj) {
    //alert("hiding...");
    menuObj.hoverhidetimeout = window.setTimeout(function() {
        $(menuObj).addClass("display_none");
    }, 450);
}

function hideAllHoverMenus() {
    //alert("hiding all...");
    $(".hovermenu").addClass("display_none");
}

