/**
 * Provant JS
 * v2.4
 * 
 * contains all provant specific javascript functions
 *
 * @author BCZ
 * @dependencies Yahoo JS library (yahoo, dom, event, container)
 */

// declare PROVANT namespace
var PROVANT = window.PROVANT || {};

// init  - load when 'main' is detected
YAHOO.util.Event.addListener(window, 'load', initializer);

/**
 * Forms
 */
PROVANT.Forms = function() {
    
    return{
        // constants
        wrapperID : 'formHelpItem',
        containerID : "formHelpContainer",
        wrapper : null,
        container : null,
        
        /**
         * Toggles the help container
         */
        toggleHelp: function() {
            
            // sanity checks
            if(this.wrapper == null || this.container == null) return;
            
            // toggle
            if(YAHOO.util.Dom.hasClass(this.wrapper, 'open')){
                // close
                this.closeHelp();
            } else {
                // open
                this.openHelp();
            }

        },
        
        /**
         * Closes the help container
         */
        closeHelp: function() {
            // sanity checks
            if(YAHOO.util.Dom.hasClass(this.wrapper, 'closed')) return null;
        
            // close it
            YAHOO.util.Dom.replaceClass(this.wrapper, 'open', 'closed');
        },

        /**
         * Opens the help container
         */
        openHelp: function() {
            // sanity checks
            if(YAHOO.util.Dom.hasClass(this.wrapper, 'open')) return null;
            
            // open it
            YAHOO.util.Dom.replaceClass(this.wrapper, 'closed', 'open');
        },
        
        /**
         * Not pretty, but fast as hell - only needed when loading a page
         */
        initHelp: function() {
            YAHOO.util.Dom.replaceClass(YAHOO.util.Dom.get("formHelpItem"), 'open', 'closed');
        },
        
        /**
         * Hides form helper completely
         */
        hideHelp: function() {
            // only when I'm there
            var formHelpItem = YAHOO.util.Dom.get("formHelpItem");
            if(formHelpItem != null){
                YAHOO.util.Dom.setStyle(formHelpItem, 'display', 'none');
            }
        },
        
        /**
         * WebForms does not output inputs with an id but with a name, fixing this on CurrentPage
         */
        fixWebFormsOutput: function() {
            var validInputElements = YAHOO.util.Dom.getElementsBy(function(el) {
                    return (/CurrentPage/.test(el.getAttribute('name')));
                }, 'input', 'main');
            
            var currentValidElement;            
            for(var i=0; i < validInputElements.length; i++){
                currentValidElement = validInputElements[i];
                currentValidElement.id = currentValidElement.getAttribute('name');
            }
        },
        
        /**
         * Creates a tooltip for the question mark images located on every form 
         */ 
        createTooltipForFormHelpers: function(){
            // get all spans with a "tooltip" class
            var arrTooltipSpans = YAHOO.util.Dom.getElementsByClassName('tooltip', 'span', YAHOO.util.Dom.get('main'));
            if(arrTooltipSpans.lenght == 0) return; // nothing to see here
            
            // get all imgs embedded within arrTooltipSpans
            var arrTooltipImgs = new Array();
            var oElement;
            for(var i=0; i < arrTooltipSpans.length; i++){
                oElement = arrTooltipSpans[i];
                var arrReturnTheseTooltipImgs = oElement.getElementsByTagName("img");
                
                for(var j=0; j<arrReturnTheseTooltipImgs.length; j++){
                    oReturnThisImg = arrReturnTheseTooltipImgs[j];
                    if(oReturnThisImg.id==""){
                        // if the image doesn't have an id, give it one - name really doesn't matter
                        oReturnThisImg.id = 'ttimg-' + (i + j);
                    }
                    arrTooltipImgs.push(oReturnThisImg);
                }
            }
            PROVANT.Utils.Tooltip.createTooltipFor(arrTooltipImgs);
            
        },
        
        /**
         * Initialise PROVANT.Forms
         */
        init : function() {
            this.wrapper = YAHOO.util.Dom.get(this.wrapperID);
            this.container =  YAHOO.util.Dom.get(this.containerID);   
            //this.wrapper = YAHOO.util.Dom.inDocument(this.wrapperID);
            //this.container = YAHOO.util.Dom.inDocument(this.containerID);
            this.run();
        },

        /**
         * Do not use this directly, use init() instead    
         * - create tooltips for the form question marks
         * - toggles the help container (in essence: close it)
         */ 
        run : function() {
            //this.toggleHelp();
            this.createTooltipForFormHelpers();
        }
    
    };      

}();

/**
 * Keywords
 */
PROVANT.Keyword = function(){

    return {
        /**
         * creates tooltips for all the keyword spans
         */ 
        createTooltipForKeywords: function(){
            // get all spans with a "tooltip" class
            var arrTooltipSpans = YAHOO.util.Dom.getElementsByClassName('keyword', 'span', YAHOO.util.Dom.get('main'));
            PROVANT.Utils.Tooltip.createTooltipFor(arrTooltipSpans);    
        },
        /**
         * Initialise PROVANT.Keyword
         */
        init : function() {
            // set local object vars here
            this.run();
        },

        /**
         * Do not use this directly, use init() instead
         * - create tooltips for all the keyword spans
         */ 
        run : function() {
            this.createTooltipForKeywords();
        }
    };    
    
}();

/**
 * Utils
 */
PROVANT.Utils = function(){};

/*
 * Creates Yahoo tooltips with some custom behaviour
 * Usage: 
 * PROVANT.Utils.Tooltip.createTooltipFor(arrayOfObjects);
 * Custom behaviour:
 * 
 */
PROVANT.Utils.Tooltip = function() {

    // basic browser detection
    var ua = navigator.userAgent.toLowerCase();
    var isOpera = (ua.indexOf('opera') != -1);
	var isIE = (ua.indexOf('msie') != -1 && !isOpera); // not opera spoof
	var isSafari = (ua.indexOf("safari") != -1);
        
    return {
    
        /**
         * Creates tooltips for a given array of objects
         * This function uses the default Yahoo tooltip widget and inserts some custom behaviour
         * @param arrObjects the objects to attach a tooltip
         */
        createTooltipFor: function(arrObjects){
            
            if(arrObjects.lenght == 0) return;
            
            for(var i=0; i<arrObjects.length; i++){
            
                // instantiate tooltip
                var currentContextElement = arrObjects[i];
                if(currentContextElement.id == ""){
                    // sanity check
                    YAHOO.util.Dom.generateId(currentContextElement);
                }
                var currentContextElementID = currentContextElement.id;
                var newTooltipForObjectId = currentContextElementID + "-tooltip";
                var attributes = Array();
                
                attributes = { context:currentContextElement, showdelay: 0, hidedelay: 400, effect: [{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.45}], autodismissdelay:(5 * 60 * 100)};
                //~ attributes = { context:currentContextElement, showdelay: 0, hidedelay: 400, autodismissdelay:(5 * 60 * 100)};
                                
                var newTooltipForObject = new YAHOO.widget.Tooltip(newTooltipForObjectId, attributes); 
                
                // now that we have a tooltip, remove the "title" attribute
                currentContextElement.removeAttribute("title"); 
                
                // remove default Yahoo tooltip behaviour
                YAHOO.util.Event.removeListener(currentContextElement, "mouseover", newTooltipForObject.onContextMouseOver);
                YAHOO.util.Event.removeListener(currentContextElement, "mouseout", newTooltipForObject.onContextMouseOut);
                
                // insert custom Provant behaviour
                YAHOO.util.Event.addListener(currentContextElement, "click", this.onContextClick, newTooltipForObject);
                YAHOO.util.Event.addListener(document.body, "click", this.onPageClick, newTooltipForObject);
                YAHOO.util.Event.addListener(document, "keydown", this.onEscapeClick, newTooltipForObject);
            }    
        },
        

        /**
         * Hide the tooltip if a page click except on a tooltip is received
         * @param event event received
         * @param obj the tooltip object in question
         */
         onPageClick: function(event, obj){
         
            // determine if the cursor is *outside* the tooltip and *outside* the tooltip's context
            var currentTooltipObject = YAHOO.util.Dom.get(obj.id);
            var currentTooltipRegion = YAHOO.util.Region.getRegion(currentTooltipObject);
            
            var currentContext = YAHOO.util.Dom.get(obj.cfg.getProperty("context"));
            var currentContextRegion = YAHOO.util.Region.getRegion(currentContext);
            
            var hit = YAHOO.util.Event.getXY(event);
            var hitpoint = new YAHOO.util.Point(hit[0], hit[1]);            
            
            var isClickInsideOfTooltip = currentTooltipRegion.contains(hitpoint);
            var isClickInsideOfTooltipContext = currentContextRegion.contains(hitpoint);
            
            if(!isClickInsideOfTooltip && !isClickInsideOfTooltipContext){
                
                if (this.procId) {
                    clearTimeout(this.procId);
                }

                setTimeout(function() {
                    obj.hide();
                }, obj.cfg.getProperty("hidedelay"));
            }
        },
        
        /**
         * Hides the tooltip if ESC is pressed
         * @param event event received
         * @param obj the tooltip object in question
         */
        onEscapeClick: function(event, obj){
            
            // check if key pressed = ESC
            if(event.keyCode == 27){
                
                if (this.procId) {
                    clearTimeout(this.procId);
                }

                setTimeout(function() {
                    obj.hide();
                }, obj.cfg.getProperty("hidedelay"));   
            }            
        },

        /**
         * Show the tooltip if clicked
         * @param event event received
         * @param obj the tooltip object in question
         */
        onContextClick: function(event, obj){
            
            this.procId = obj.doShow(event);
        },
                
        /**
         * Initialise PROVANT.Utils
         */
        init: function() {
            this.run();
        },

        /**
         * Do not use this directly, use init() instead
         */ 
        run: function() {
            // nothing defined yet
        }
        
    };    
    
}();

function initializer() {
    PROVANT.Utils.Tooltip.init();
    PROVANT.Forms.init();
    PROVANT.Keyword.init();
}

/**
 * Close a form helper as soon as it's available in the DOM - needed for IE and Opera to behave
 */
YAHOO.util.Event.onAvailable('formHelpItem',PROVANT.Forms.initHelp);

/**
 * Hide form helper on the 'overview' page and 'thank you' page
 */
YAHOO.util.Event.onAvailable('OverviewPage',PROVANT.Forms.hideHelp);
YAHOO.util.Event.onAvailable('ThankYouPage',PROVANT.Forms.hideHelp);

/**
 * Fix webforms output if necessary
 */ 
YAHOO.util.Event.onAvailable('provant-form',PROVANT.Forms.fixWebFormsOutput);

/**
 * Opens form help container when closed, closes when open
 * @deprecated use PROVANT.Forms.toggleHelp(); instead
 */
function toggleHelp(){
    PROVANT.Forms.toggleHelp();        
}
