/**
 * Provant JS
 * v3.0
 * 
 * contains all provant specific javascript functions
 *
 * @author BCZ
 * @author RDH (Newsletter forms)
 * @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');
			
			return true;
        },

        /**
         * 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');
			
			return true;
        },
        
        /**
         * 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');
            }
		
		},

        /**
         * Adding anysurfer recommendations for everything inside a provant-form div
         */
		enhanceForAnysurfer: function() {
			
			// fetch all labels inside a form
			var provantForm = YAHOO.util.Dom.get("provant-form");

			if(provantForm !== null){
				var labels = provantForm.getElementsByTagName("label");
				
				// find the corresponding inputs
				var currentLabel;   
				var correspondingInput;
				
				for(var i=0; i < labels.length; i++){
					currentLabel = labels[i];				
					correspondingInput = YAHOO.util.Dom.get(currentLabel.getAttributeNode("for").nodeValue);
					if(correspondingInput !== null) {
						correspondingInput.title = currentLabel.firstChild.nodeValue;
					} 
				}
			}
			
		},
		
        /**
         * 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), width: 400};
                //~ 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);
YAHOO.util.Event.onAvailable('provant-form',PROVANT.Forms.enhanceForAnysurfer);

/**
 * Opens form help container when closed, closes when open
 * @deprecated use PROVANT.Forms.toggleHelp(); instead
 */
function toggleHelp(){
    PROVANT.Forms.toggleHelp();        
}


/*
 * Validates textboxes of forms. If no input is given, an error is raised
 * (also Special features like check on drop down menu and cursor ready for
 * input in the empty textbox are foreseen)
 */
function validate(form, bMailSubscription)
{	if(bMailSubscription) {
		if(!(CheckMandatoryField(form.firstname))) return false;
		if(!(CheckMandatoryField(form.lastname))) return false;
		if(!(CheckMandatoryField(form.street))) return false;
		if(!(CheckMandatoryField(form.nr))) return false;
		if(!(CheckMandatoryField(form.postalcode))) return false;
		if(!(CheckMandatoryField(form.city))) return false;
		if(!(CheckMandatoryField(form.email))) return false;
	} else {
		if(!(CheckMandatoryField(form.email))) return false;
	}
	return submit(form);
}

function CheckMandatoryField(field)
{	if(field.id == "email") 
	{	if(field.value.length !== 0 && field.value.indexOf('@') > 0) 
		{	DisplayNone(field);
			return true;
		}
		else 
		{	DisplayInline(field);
			return false;
		}
	}
	else if(field.value.length !== 0) 
	{	DisplayNone(field);
		return true;
	}
	else 
	{ 	DisplayInline(field);
		return false;
	}
}

function submit(form)
{
	form.submitButton.disabled = true;
	return true;
}

/*
 * With DisplayInline() the error gets printed on screen
 * The cursor will get ready in the empty textbox.
 */
function DisplayInline(field)
{	var name;
	var objCursor;
	var objDisplay;
	name = field.id;
	objCursor = document.getElementById(name);
	objDisplay = document.getElementById(name+"err");
	objCursor.focus();
	objDisplay.style.display="inline";
}

/*
* With DisplayNone() no error will be printed on screen or a previous error
* will be deleted from screen.
*/
function DisplayNone(field)
{	var name;
	var obj;
	name = field.id;
	obj = document.getElementById(name+"err");
	obj.style.display="none";
}


/*
* Sportwijzer
*============
*
* enableField() will enable or disable partical fields (i.e. Sportwijzer) based on the input
* of another field.
*
* Author: RDS
*
*/

function enableField(field)
{	
	if (field.selectedIndex === 0)
	{
		document.getElementById("labelgemeente").style.color="black";
		document.getElementById("gemeente").disabled=false;
		document.getElementById("buttongemeente").disabled=false;		
		document.getElementById("labelorganisatie").style.color="black";
		document.getElementById("organisatie").disabled=false;
		document.getElementById("buttonorganisatie").disabled=false;
		document.getElementById("labeldoelgroep").style.color="black";
		document.getElementById("doelgroep").disabled=false;
		document.getElementById("buttondoelgroep").disabled=false;
		document.getElementById("labelsporttak").style.color="black";
		document.getElementById("sporttak").disabled=false;
		document.getElementById("buttonsporttak").disabled=false;
	}
	else
	{
		if(field.id == "gemeente")
		{
			document.getElementById("labelgemeente").style.color="black";
			document.getElementById("gemeente").disabled=false;
			document.getElementById("buttongemeente").disabled=false;
		}
		else
		{	
			document.getElementById("labelgemeente").style.color="gray";
			document.getElementById("gemeente").disabled=true;
			document.getElementById("buttongemeente").disabled=true;
		}
		if(field.id == "organisatie")
		{
			document.getElementById("labelorganisatie").style.color="black";
			document.getElementById("organisatie").disabled=false;
			document.getElementById("buttonorganisatie").disabled=false;
		}
		else
		{	
			document.getElementById("labelorganisatie").style.color="gray";
			document.getElementById("organisatie").disabled=true;
			document.getElementById("buttonorganisatie").disabled=true;
		}
		if(field.id == "doelgroep")
		{
			document.getElementById("labeldoelgroep").style.color="black";
			document.getElementById("doelgroep").disabled=false;
			document.getElementById("buttondoelgroep").disabled=false;
		}
		else
		{	
			document.getElementById("labeldoelgroep").style.color="gray";
			document.getElementById("doelgroep").disabled=true;
			document.getElementById("buttondoelgroep").disabled=true;
		}
		if(field.id == "sporttak")
		{
			document.getElementById("labelsporttak").style.color="black";
			document.getElementById("sporttak").disabled=false;
			document.getElementById("buttonsporttak").disabled=false;
		}
		else
		{	
			document.getElementById("labelsporttak").style.color="gray";
			document.getElementById("sporttak").disabled=true;
			document.getElementById("buttonsporttak").disabled=true;
		}
	}
	document.getElementById("gemeenteerr").style.display="none";
	document.getElementById("organisatieerr").style.display="none";
	document.getElementById("doelgroeperr").style.display="none";
	document.getElementById("sporttakerr").style.display="none";
}


/*
* Sportwijzer
*============
*
* checkChoice() will validate the textboxes (drop-down menus i.e. Sportwijzer). If no input or the wrong
* input is given, an error wil raise.
*
* Author: RDS
*
*/

function checkChoice(field)
{	
	if (field.selectedIndex === 0)
	{	
		DisplayInline(field);
		return false;
	}			
	else 
	{	
		DisplayNone(field);
		return true;
	}
}


/*
* ProKmo Opleidingen
*===================
*
* disableTextBoxesProKmo() will enable or disable partical fields based on the input
* of other fields.
*
* Author: RDS
*
*/

function disableTextBoxesProKmo(field)
{	
	if(field.id == "begindatumdag" || field.id == "begindatummaand" || field.id == "begindatumjaar" || field.id == "einddatumdag" || field.id == "einddatummaand" || field.id == "einddatumjaar")
	{
		if (document.getElementById("begindatumdag").value === "" && document.getElementById("begindatummaand").value === "" && document.getElementById("begindatumjaar").value === "" && document.getElementById("einddatumdag").value === "" && document.getElementById("einddatummaand").value === "" && document.getElementById("einddatumjaar").value === "")
		{
			document.getElementById("labelformzoek").style.color="#1E7494";
			document.getElementById("labelzoekveld").style.color="black";
			document.getElementById("zoekveld").disabled=false;
			document.getElementById("zoekbuttonzoek").disabled=false;
		}
		else
		{
			document.getElementById("labelformzoek").style.color="gray";
			document.getElementById("labelzoekveld").style.color="gray";
			document.getElementById("zoekveld").disabled=true;
			document.getElementById("zoekbuttonzoek").disabled=true;
		}
	}
	if(field.id == "zoekveld")
	{
		if (document.getElementById("zoekveld").value === "")
		{
			document.getElementById("labelformdatum").style.color="#1E7494";
			document.getElementById("labelbegindatum").style.color="black";
			document.getElementById("labelformdatumdagen").style.color="black";
			document.getElementById("labelformdatummaanden").style.color="black";
			document.getElementById("labelformdatumjaren").style.color="black";
			document.getElementById("labeleinddatum").style.color="black";
			document.getElementById("begindatumdag").disabled=false;
			document.getElementById("begindatummaand").disabled=false;
			document.getElementById("begindatumjaar").disabled=false;
			document.getElementById("einddatumdag").disabled=false;
			document.getElementById("einddatummaand").disabled=false;
			document.getElementById("einddatumjaar").disabled=false;
			document.getElementById("zoekbuttondatum").disabled=false;
		}
		else
		{
			document.getElementById("labelformdatum").style.color="gray";
			document.getElementById("labelbegindatum").style.color="gray";
			document.getElementById("labeleinddatum").style.color="gray";
			document.getElementById("begindatumdag").disabled=true;
			document.getElementById("begindatummaand").disabled=true;
			document.getElementById("begindatumjaar").disabled=true;
			document.getElementById("einddatumdag").disabled=true;
			document.getElementById("einddatummaand").disabled=true;
			document.getElementById("einddatumjaar").disabled=true;
			document.getElementById("zoekbuttondatum").disabled=true;
		}
	}
	document.getElementById("zoekvelderr").style.display="none";
	document.getElementById("einddatumdagerr").style.display="none";
}


/*
* ProKmo Opleidingen
*===================
*
* checkTextBox() will validate the textbox If no input
* is given, an error wil raise.
*
* Author: RDS
*
*/

function checkTextBox(field)
{
	if(field.id == "einddatumdag")
	{
		if (document.getElementById("begindatumdag").value === "" || document.getElementById("begindatummaand").value === "" || document.getElementById("begindatumjaar").value === "" || field.value === "" || document.getElementById("einddatummaand").value === "" || document.getElementById("einddatumjaar").value === "")
		{
			DisplayInline(field);
			return false;
		}
		else
		{
			DisplayNone(field);
			return true;
		}
	}
	if (field.id == "zoekveld")
	{
		if (field.value === "")
		{	
		DisplayInline(field);
		return false;
		}
		else 
		{	
			DisplayNone(field);
			return true;
		}
	}
}
function open_arcims4_gisloket(url) {
        windowprops = "top=0,left=0,menubar=0,toolbar=0,status=1,scrollbar=1,resizable=yes,width=" + (screen.width - 12) + ",height=" + (screen.height-92);
        window.open(url, 'Geoloketten', windowprops);
}
function open_arcims9_gisloket(nr, loketid, serverid) {
        url = "http://" + serverid +"/Geoloketten/geoloket.jsp?geoloketid=" + loketid;
        height = screen.height-100;
        openwin = window.open(url,'Geoloketten','top=0,left=0,location=no,status=yes,toolbar=no,menubar=no, scrollbar=yes, resizable=no ,width='+screen.width+' ,height='+height );
}

function openwindow_gis(lokettype,loketid,hostname)
{
if(lokettype == 3)
{
    url = "http://"+hostname+"/lightviewer/lightviewer.jsp?geoloketid="+loketid;
    height = screen.height-100;
    openwin = window.open(url,'Lightviewer','location=no,status=yes,toolbar=no,menubar=no, scrollbar=yes,width=500 ,height=500' );
    openwin.moveTo(0,0);
}
if(lokettype == 1)
{
    url = "http://"+hostname+"/Geoloketten/geoloket.jsp?geoloketid="+loketid;
    height = screen.height-100;
    openwin = window.open(url,'Geoloketten','location=no,status=yes,toolbar=no,menubar=no, scrollbar=yes, resizable=no ,width='+screen.width+' ,height='+height );
    openwin.moveTo(0,0);
    //parent.opener = top;
    //parent.close();
}
}

