/*
    Disclaimer

    While we make every effort to ensure that this code is fit for its intended purpose, we
    make no guarantees as to its functionality. CoreTrek AS will accept no
    responsibility for the loss of data or any other damage or financial loss caused by use
    of this code.


    Copyright

    This programming code is copyright of CoreTrek AS. Permission to run this code is given to
    approved users of CoreTrek's publishing system CorePublish.

    This source code may not be copied, modified or otherwise repurposed for use by a third
    party without the written permission of CoreTrek AS.

    Contact webmaster@coretrek.com for information.
*/

/*
 * Get the absolute position of a given element
 *
 * This function is used by Appbase Javascript utils.
 * Do not change!
 */
function getAbsolutePos(el){
    for (var lx=0,ly=0;el!=null;
    lx+=el.offsetLeft,ly+=el.offsetTop,el=el.offsetParent);
    return {x:lx,y:ly}
}



function test(bool) {
	test = bool;
}
var test = false;


/*
 * Set the layer with the given id to
 * display:block.
 *
 * This function is used by Appbase Javascript utils.
 * Do not change!
 */
function displayLayer(layerId,menuId) {
	if(typeof $(layerId) != "undefined") {
		openHovermenuItem(layerId,menuId);
	}
}

/*
 * Set the layer with a given id to
 * display:inline, position:absolute
 *
 * This function is used by Appbase Javascript utils.
 * Do not change!
 */
function hoverLayer(layerId) {
    if(typeof $(layerId) != "undefined") {
        $(layerId).style.display = 'inline';
        $(layerId).style.position = 'absolute';
    }
}

/*
 * Set a layer to display:none
 *
 * This function is used by Appbase Javascript utils.
 * Do not change!
 */
function hideLayer(layerId) {
    if(typeof $(layerId) != "undefined") {
        $(layerId).style.display = 'none';
    }
}

/**
 * 1: closing
 * 2: closed
 * 3: opening
 * 4: open
 */
var hoverMenuItems = new Array();
var hoverMenuItemsHeights = new Array();
var activeMenuItem = false;

var registerHoverMenuAsClosed = function(objectId) {
	$(objectId).style.display = 'none';
	$(objectId).style.height = 'auto';
	hoverMenuItems[objectId] = 2;
}

var registerHovermenuItemAsOpen = function(objectId) {
	if($(objectId).style.display == 'none' && objectId == activeMenuItem) {
		$(objectId).style.display = 'block';
		$(objectId).style.height = 'auto';
		$(objectId).style.height = hoverMenuItemsHeights[objectId] + 'px';
	}
	hoverMenuItems[objectId] = 4;
}
var registerHovermenuAsClosing = function(objectId) {
	hoverMenuItems[objectId] = 1;
}

var registerHovermenuAsOpening = function(objectId) {
	hoverMenuItems[objectId] = 3;
}

function closeHovermenuItem(objectId) {
	var objectId = objectId;
	var round = 0;
	function closeHoverItemInternal() {
		if(!(objectId in hoverMenuItems) || hoverMenuItems[objectId] < 3 || round >= 5) {
			return true;
		}
		if(hoverMenuItems[objectId] == 3) {
			round++;
			setTimeout(closeHoverItemInternal,100);		
		}
		hoverMenuItems[objectId] = 1;
		var elementUtil = new ElementUtil();
		elementUtil.changeElementStyleValue(objectId,'height',0,20,$(objectId).style.height.replace('px',''),0,false,20,'','px',registerHovermenuAsClosing, registerHoverMenuAsClosed);
	} 
	closeHoverItemInternal();
}

function openHovermenuItem(objectId,menuId) {
	var objectId = objectId;
	var menuId = menuId;
	var round = 0;
	function openHoverItemInternal() {		
		if(!(objectId in hoverMenuItems)) {
			hoverMenuItems[objectId] = 2;
		}
		if($(objectId).style.display == 'none' && hoverMenuItems[objectId] == 4) {
			registerHoverMenuAsClosed(objectId);
		}		
		if(hoverMenuItems[objectId] > 2 || round >= 5) {
			return true;
		}
		if(hoverMenuItems[objectId] == 1) {
			round++;
			setTimeout(openHoverItemInternal,100);		
		}		
		hoverMenuItems[objectId] = 3;		
		if(menuId !== false) {
			var elementUtil = new ElementUtil();					
			if (navigator.appVersion.indexOf("MSIE 6") != -1) {
				elementUtil.moveElementBasedOnPosElement(objectId,menuId,false,0);	
			} else {
				elementUtil.moveElementBasedOnPosElement(objectId,menuId,false,-8);
			}
		}
		$(objectId).style.display = 'block';
		if(!(objectId in hoverMenuItemsHeights)) {
			hoverMenuItemsHeights[objectId] = $(objectId).offsetHeight;
			//$('debuginfo').innerHTML = $('debuginfo').innerHTML + hoverMenuItemsHeights[objectId] + 'px <br />';
		}
		elementUtil.changeElementStyleValue(objectId,'height',0,20,0,hoverMenuItemsHeights[objectId],false,20,'','px',registerHovermenuAsOpening,registerHovermenuItemAsOpen);	
	}
	openHoverItemInternal();
}



/*
 * Delegate function used by the hovermenu to hide
 * all hovering layers.
 *
 * This function is used by Appbase Javascript utils.
 * Do not change!
 */
var handleHoverMenu = function(tileId,menuItemId,mainmenuItemId) {
    hovermenus = $('hovermenu-' + tileId).getElementsByClassName('hovermenuitem');        
    var elementUtil = new ElementUtil();
    activeMenuItem = menuItemId;
    for(i=0;i<hovermenus.length;i++) {       
		if(hovermenus[i].id == menuItemId) {
			openHovermenuItem(menuItemId,mainmenuItemId);
		} else {
			closeHovermenuItem(hovermenus[i].id);	
		}
    }
}

/*
 * Function to get the mouse position from event
 *
 * This function is used by Appbase Javascript utils.
 * Do not change!
 */
function getMousePosition(event) {
    var pos;

    if (!event) var event = window.event;
	if (event.pageX || event.pageY) 	{
		posx = event.pageX;
		posy = event.pageY;
	}
    else if (event.clientX || event.clientY) 	{
		posx = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		posy = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}
	
	return {x:posx,y:posy};
}

/*
 * Display a hovering popup layer.
 *
 * This function is used by Appbase Javascript utils.
 * Do not change!
 *
 * Layer will be absolute positioned and positioned
 * according to options. Default is to display the
 * popup with a small right offset to the mouse pointer.
 *
 * Options has to be of type Object, and the following
 * assosiated attributes can be used to configure popup:
 *   - x, override the x offset
 *   - y, override the y offset
 *   - fixedPosition, layer will be positioned at the fixed x/y position
 */
function popupLayerEvent(event, layerId, options) {
    if($(layerId) != null) {
        pos = getMousePosition(event);
        
        if(typeof options == "undefined") {
            var options = new Object();
        }
        var offsetY = 18;
        var offsetX = 14;
        
        if(typeof options['x'] != "undefined") {
            offsetX = options['x'];
        }
        
        if(typeof options['y'] != "undefined") {
            offsetY = options['y'];
        }
        
        var element = $(layerId);
        
        element.style.display = 'block';
        element.style.position = 'absolute';
                
        if(typeof options['fixedPosition'] == "undefined" || options['fixedPosition'] == false) {
           	element.style.left = pos['x'] + offsetX + 'px';
            element.style.top = pos['y'] + offsetY + 'px';
        }
    }
}
/**
 * Class ElementUtil
 * 
 * @author Martin Roessland, 2006-11-06
 */
function ElementUtil() {
    //Adding object function
    this.setElementVisible = setElementVisible;
    this.moveElementBasedOnPosElement = moveElementBasedOnPosElement;
    this.changeElementStyleValue = changeElementStyleValue;
    this.changeElementStyleTextValue = changeElementStyleTextValue;

    /**
     * Function that sets an element visible
     * 
     * @param boolean bool //true equals display
     */
    function setElementVisible(objectID,bool) {
        try {
            document.getElementById(objectID).style.visibility = (bool?'visible':'hidden');
        } catch (e) {}
    }
    /**
     * Function that moves an element based on another element
     * 
     * @param objectID //object to move
     * @param posObjectID //object to use for positioning
     * @param posTopExtra //Additional top
     * @param posLeftExtra //Additional left
     */
    function moveElementBasedOnPosElement(objectID,posObjectID,posTopExtra,posLeftExtra) {
        try {
            pos = getAbsolutePos(document.getElementById(posObjectID));
            if(posTopExtra !== false) {
            	document.getElementById(objectID).style.top = (pos.y + posTopExtra)+'px';
            }
            if(posLeftExtra !== false) {
            	document.getElementById(objectID).style.left = (pos.x + posLeftExtra)+'px';
            }
        } catch (e) {}
        //Function that returns absolut position of the given element
        function getAbsolutePos(el){
                for (var lx=0,ly=0;el!=null;
                        lx+=el.offsetLeft,ly+=el.offsetTop,el=el.offsetParent);
                return {x:lx,y:ly}
        }
    }
    /**
     * Function that changes a css text value of an element
     *
     * @param objectID //id of object to slide
     * @param styleAttribute //style attribute to change (pixel change)
     * @param delay //millisecond between every value change
     * @param value //text value
     */
    function changeElementStyleTextValue(objectID,styleAttribute,startDelay,value) {
    	var _ce_objID = objectID;
        var _ce_sa = styleAttribute;
        var _ce_v = value
        var _ce_sd = startDelay;
        
        function doChangeElementStyleValue() {
        	try {
        		document.getElementById(_ce_objID).style[_ce_sa] = _ce_v;                
            } catch (e) {
                return false;
            }
        }
        setTimeout(doChangeElementStyleValue,_ce_sd);
    }
    
    /**
     * Function that changes a css value of an element
     * 
     * @param objectID //id of object to slide
     * @param styleAttribute //style attribute to change (pixel change)
     * @param delay //millisecond between every value change
     * @param valueFrom //negative and positive integer
     * @param valueTo //negative and positive integer
     * @param valueMiddle //middle value in case we are zooming out in back again. If you do not want to use this, set it to boolean false
     * @param valueChangeGap //negative and positive integer of how much the value are going to change at time
     * @param valueStaticStart //static value that comes before the generated value (ex: alpha(opacity=, <blanc>)
     * @param valueStaticEnd //static value that comes after the generated value (ex: px, %, <blanc>)
     * @param endFunction //Function that is runned when this function is finnished
     */
    function changeElementStyleValue(objectID,styleAttribute,startDelay,loopDelay,valueFrom,valueTo,valueMiddle,valueChangeGap,valueStaticStart,valueStaticEnd,roundFunction,endFunction) {
        var _ce_objID = objectID;
        var _ce_sa = styleAttribute;
        var _ce_sd = startDelay;
        var _ce_ld = loopDelay;
        var _ce_vf = valueFrom;
        var _ce_vt = valueTo;
        var _ce_vt_tmp = valueTo;
        var _ce_vm = valueMiddle;
        var _ce_vcg = valueChangeGap;
        var _ce_vss = valueStaticStart;
        var _ce_vse = valueStaticEnd;
        /**
         * Recursive function that do the value change
         * 
         * @return Boolean true on successfull change or false if an exception appears
         */
        function doChangeElementStyleValue() {
        	try {      
				/**
				 * round function
				 */
        		try { roundFunction(objectID); } catch(e) {}
        		
        		//$('debuginfo').innerHTML = $('debuginfo').innerHTML + roundFunction + ' <br />';
        		       		
                /**
                 * In case middle value is not false we first have
                 * to walk to the middle value and then futher to
                 * the "to"-value.
                 */
                if(_ce_vm !== false) {
                    _ce_vt = _ce_vm;
                }
                /**
                 * In case we are going to handle the opacity
                 * attribute we have to do special handling to support both
                 * firefox and ie
                 */
                if(_ce_sa == 'opacity') {
                    //microsoft browsers
                    if(navigator.appName.indexOf("Microsoft")!=-1) {
                        document.getElementById(_ce_objID).filters.alpha.opacity=((Math.round((_ce_vf*10)))/10);
                    //the other browsers
                    } else {
                        document.getElementById(_ce_objID).style.opacity=((Math.round(((_ce_vf/100)*10)))/10);
                        document.getElementById(_ce_objID).style.MozOpacity=((Math.round(((_ce_vf/100)*10)))/10);
                    }
                //else handle it normaly
                } else {
                    document.getElementById(_ce_objID).style[_ce_sa] = _ce_vss+((Math.round((_ce_vf*10)))/10)+_ce_vse;
                }
                //If "from" value is less than "to" value
                if(_ce_vf < _ce_vt) {
                    _ce_vf = _ce_vf + _ce_vcg > _ce_vt ? _ce_vt : _ce_vf + _ce_vcg;
                //If "from" value is greater than "to" value
                } else if(_ce_vf > _ce_vt) {
                    _ce_vf = _ce_vf - _ce_vcg < _ce_vt ? _ce_vt : _ce_vf - _ce_vcg;
                //If middle value is set and reached we set the final to value
                } else if(_ce_vm !== false) {
                    _ce_vm = false;
                    _ce_vt = _ce_vt_tmp;
                //Else we jump out of this endless recursion
                } else {
                	try { endFunction(objectID); } catch(e) {}
                    return true;
                }
                //In case we have come so far, we run this function over again
                setTimeout(doChangeElementStyleValue,_ce_ld);
            } catch (e) {
            	try { endFunction(objectID); } catch(e) {}
                return false;
            }
        }
        //Run the recursive function
        setTimeout(doChangeElementStyleValue,_ce_sd);

    }
}     