<!--

 /******************************************************
  * Commonly needed functions and utilities
  ******************************************************/


    var Common = new Object();


    // Browser detection
    Common.isIE = document.all ? true : false;
    
    
   /**
    * Enable element dragging
    * @param object params dragging properties
    */
    Common.enableDrag = function(params)
    {
        var onOver;
        
        var callback = function(event)
        {
            // Create clone
            var clone = params.element.cloneNode(true);
            clone.style.width      = clone.offsetWidth + 'px';
            clone.style.height     = clone.offsetHeight + 'px';
            clone.style.position   = 'absolute';
            clone.style.visibility = 'hidden';
            Common.setAlpha(clone, 70);
            params.element.parentNode.appendChild(clone);

            var dragMove = function(event)
            {
                // Move clone with mouse
                clone.style.left       = (event.pageX + 10) + 'px';
                clone.style.top        = (event.pageY + 10) + 'px';
                clone.style.visibility = 'visible';
                
                var target = event.target;
                
                while (!target.getAttribute('dragClassOverLeft') && target.parentNode)
                    target = target.parentNode;
                    
                if (target == params.element)
                    return;
                    
                // Deselect old
                if (onOver)
                {
                    onOver.className = onOver.className.
                        split(' ' + onOver.getAttribute('dragClassOverLeft')).join('').
                        split(' ' + onOver.getAttribute('dragClassOverRight')).join('');
                }
                onOver = null;

                if (!target.getAttribute('dragClassOverLeft'))
                    return;

                onOver = target;
                
                // Select new
                var middle = Common.getTotalOffsetLeft(onOver) + onOver.offsetWidth / 2;
                onOver.className += ' ' + onOver.getAttribute('dragClassOver' + (event.pageX > middle ? 'Right' : 'Left'));

            };

            var dragEnd = function()
            {
                if (onOver)
                {
                    var before = (onOver.className.indexOf(onOver.getAttribute('dragClassOverRight')) == -1);

                    if (before)
                        onOver.parentNode.insertBefore(params.element, onOver);

                    else if (onOver.nextSibling)
                        onOver.parentNode.insertBefore(params.element, onOver.nextSibling);

                    else
                        OnOver.parentNode.appendChild(params.element);
                        
                    onOver.className = onOver.className.
                        split(' ' + onOver.getAttribute('dragClassOverLeft')).join('').
                        split(' ' + onOver.getAttribute('dragClassOverRight')).join('');
                }
                
                // Destroy clone
                clone.parentNode.removeChild(clone);

                if (onOver)
                    params.onUpdateOrder();

                // Remove event listeners
                document.removeEventListener('mousemove', dragMove, true);
                document.removeEventListener('mouseup', dragEnd, true);
            };
            
            // Assign event listeners
            document.addEventListener('mousemove', dragMove, true);
            document.addEventListener('mouseup', dragEnd, true);

            event.preventDefault();
        };
        params.element.addEventListener('mousedown', callback, true);
    };


   /**
    * Get browser height
    * @return int browser height
    */
    Common.getBrowserHeight = function()
    {
        if (self.innerHeight)
            return parseInt(self.innerHeight);

        if (document.documentElement && document.documentElement.clientHeight)
            return parseInt(document.documentElement.clientHeight);

        if (document.body)
            return parseInt(document.body.clientHeight);

        return parseInt(screen.height);
    };


   /**
    * Get browser width
    * @return int browser width
    */
    Common.getBrowserWidth = function()
    {
        if (self.innerWidth)
            return parseInt(self.innerWidth);

        if (document.documentElement && document.documentElement.clientWidth)
            return parseInt(document.documentElement.clientWidth);

        if (document.body)
            return parseInt(document.body.clientWidth);

        return parseInt(screen.width);
    };
    
    
   /**
    * Get given number as float value with minimum amount of decimals
    * @param mixed value original float or integer value
    * @param int amount minimum amount of decimals
    * @return string value with minimum amount of decimals
    */
    Common.getFloatString = function(value, amount)
    {
        value = new String(value);
        value = value.split('.');
        
        if (value.length < 2)
            value.push('');
            
        while (value[1].length < amount)
            value[1] += '0';

        return value[0] + '.' + value[1];
    };


   /**
    * Get variable as a string that can be evaluated
    * @param mixed param to alter into a string
    * @return string given variable as a string
    */
    Common.getAsString = function(param)
    {
        // Create recursive handler
        var encoder = function(param)
        {
            // Get type
            var type = typeof param;

            // String
            if (type == 'string')
                return "'" + param.split("'").join("\\'") + "'";

            // Number
            if (type == 'number')
                return param;

            // Array
            if (type == 'object' && param.constructor == Array)
            {
                var item = new Array();

                for (var i = 0; i < param.length; ++i)
                    item.push(encoder(param[i]));

                return '[' + item.join(', ') + ']';
            }

            // Object
            if (type == 'object')
            {
                var item = new Array();

                for (var i in param)
                    item.push("'" + i + "':" + encoder(param[i]));

                return '{' + item.join(', ') + '}';
            }

            // Undentified (function etc.)
            return 'null';
        };

        return encoder(param);
    };


   /**
    * Get total offset from left for specified element
    * @param object element tag object
    * @return int number of pixels from left
    */
    Common.getTotalOffsetLeft = function(element)
    {
        var result = 0;

        if (element.offsetParent)
        {
            result = element.offsetLeft;

            while (element = element.offsetParent)
                result += element.offsetLeft;
        }

        return result;
    };


   /**
    * Get total offset from top for specified element
    * @param object element tag object
    * @return int number of pixels from top
    */
    Common.getTotalOffsetTop = function(element)
    {
        var result = 0;
        
        if (element.offsetParent)
        {
            result = element.offsetTop;

            while (element = element.offsetParent)
                result += element.offsetTop;
        }

        return result;
    };
    
    
   /**
    * Get quote from string
    * @param string source original string to quote
    * @param int length quote length
    * @param string postfix optional postfix string, '...' by default
    * @return string quoted string
    */
    Common.getQuote = function(source, length, postfix)
    {
        if (source.length <= length)
            return source;

        var result = source.substring(0, length - 3);

        while (result.substring(result.length - 2) == ' ')
            result = result.substring(0, result.length - 2);

        return result + '...';
    };


   /**
    * Open popup
    * @param string url target URL
    * @param int width window width
    * @param int height window height
    * @return bool false
    */
    Common.openPopUp = function(url, width, height)
    {
        var name = 'popup' + url.length;
        var popup = window.open(url, name, 'resizable=1,scrollbars=1,width=' + width + ',height=' + height + ',left=150,top=150');
        popup.focus();

        return false;
    };
    
    
   /**
    * Remove HTML from given string
    * @param string source original string
    * @return string string stripped from tags
    */
    Common.removeHtml = function(source)
    {
        var result = '';
        
        for (var i = 0; i < source.length; ++i)
        {
            if (source.charAt(i) != '<')
            {
                result += source.charAt(i);
                continue;
            }
            
            while (source.charAt(i) != '>' && i < source.length)
                ++i;
        }
        
        return result;
    };
    

   /**
    * Set alpha level for given element
    * @param object element reference to node element
    * @param int alpha alpha percentage
    */
    Common.setAlpha = function(element, alpha)
    {
        element.style.filter       = 'alpha(opacity:' + alpha + ')';
        element.style.KHTMLOpacity = alpha / 100;
        element.style.MozOpacity   = alpha / 100;
        element.style.opacity      = alpha / 100;
    };
    
    
   /**
    * Trigger given function on specified event
    * @param string event even type
    * @param handler function to trigger
    */
    Common.triggerOnEvent = function(event, handler)
    {
        var targets = new Array(document);
        
        // Create callback function
        var callback = function()
        {
            // Call custom function
            handler(this);
            
            // Remove assigned event listeners
            for (var i = 0; i < targets.length; ++i)
                targets[i].removeEventListener(event, callback, false);
        };
        
        // Collect document objects from inner documents
        var collect = function(parent)
        {
            var items = targets[parent].getElementsByTagName('IFRAME');
            
            for (var i = 0; i < items.length; ++i)
            {
                targets.push(items[i].contentWindow.document);
                collect(targets.length - 1);
            }
        };
        collect(0);

        // Assign event listeners to targets
        for (var i = 0; i < targets.length; ++i)
            targets[i].addEventListener(event, callback, false);
    };
    
    
   /**
    * Tween given element with requested animation type
    * @param object element reference to node element
    * @param string animation type of animation
    * @param float duration time for animation in seconds
    * @param int from start animation from this value
    * @param int to end animation to this value
    */
    Common.Tween = function(element, animation, duration, from, to)
    {
        var handlers = new Object();
        var percent = from;

        // Turn seconds into milliseconds
        duration = duration * 1000;
        
        // Calculate number of steps needed
        var steps = duration / (to - from);
        var offset = 100 / steps;
        var interval = Math.floor(duration / steps);

        // Animation handler for fading ing
        handlers.fadeIn = function()
        {
            percent += offset;
            Common.setAlpha(element, percent);
        };
        
        // General animation handler
        var handler = function()
        {
            handlers[animation]();

            if (percent >= to)
                window.clearInterval(timer);
        };
        var timer = window.setInterval(handler, interval);
        handler();
    };
    

// -->

