$ = function(element) {
    if (arguments.length > 1) {
        for (var i = 0, elements = [], length = arguments.length; i < length; i++)
            elements.push($(arguments[i]));
        return elements;
    } else {
        return document.getElementById(element);
    }
}

$new = function(params,parent) {
    var tag = params['tag'] || 'div';
    var newEl = document.createElement(tag);
    for (var paramName in params) {
        if ((paramName != 'tag') && (paramName != 'text') && (!paramName.match(/^on\w+/))) { newEl[paramName] = params[paramName]; }
        if (paramName.match(/^on(\w+)/)) {
            var eventName = RegExp.$1;
            $attachEvent(newEl, eventName, params[paramName]);
        }
    }
    if (params['text'] != null) { newEl.appendChild($text(params['text'])); }
    if (parent!=null) { parent.appendChild(newEl); }
    return newEl;
}

$text = function(string) {
    return document.createTextNode(string);
}

$clearDOM = function(el) {
    while (el.childNodes.length>0) { el.removeChild(el.firstChild); }
}

$addClass = function(node, className) {
    $removeClass(node, className);
    node.className += ' '+className;
}

$removeClass = function(node, className) {
    var classes = node.className.split(' ');
    for (var i=0; i<classes.length; i++) {
        if (classes[i] == className) {
            classes.splice(i, 1);
        }
    }
    node.className = classes.join(' ');
}

$style = function(node, args) {
    for (var arg in args) {
        if ((arg == 'left') || (arg == 'top') || (arg == 'width') || (arg == 'height') || (arg == 'right') || (arg == 'bottom')) args[arg] += 'px';
        node.style[arg] = args[arg];
    }
}

$point = function(x, y) { this.x = x; this.y = y; }
$position = function(node, toNode) {
    var el = node;
    var x = 0; var y = 0;
    while ((el)&&(el!=toNode)) {
        if (el.offsetLeft) { x += el.offsetLeft; }
        if (el.offsetTop) { y += el.offsetTop; }
        el = el.offsetParent;
    }
    return new $point(x, y);
}
$attachEvent = function(object, event, method, methodId) {
    if (!methodId) { methodId = ''; }
    object['event_'+event+methodId] = function(event) { method.apply(object, [event]); };
    if (typeof(object['addEventListener']) == 'function') { 
        object.addEventListener(event, object['event_'+event+methodId], false);
    } else {
        object.attachEvent('on'+event, object['event_'+event+methodId]);
    }
}

$detachEvent = function(object, event, methodId) {
    if (!methodId) { methodId = ''; }
    if (typeof(object['removeEventListener']) == 'function') {
        object.removeEventListener(event, object['event_'+event+methodId], false);
    } else {
        object.detachEvent('on'+event, object['event_'+event+methodId]);
    }
}

/* ------ ecNextSibling ----------- */
var ecTimerDelay = 1;
var ecAlpha = 0.3;
ecSibling = function(el) 
{
//     alert(el);
    var element = el;
    while ((element = element.parentNode) && (!element.className.match(/simple\-ec/)));
    if (element) {
        element.dropDownPosition = element.clientHeight;
        if (element.ecState) {
            element.dropDownEndPosition = element.closedHeight;
            element.ecState = false;
        } else {
            if (!element.closedHeight) {
                element.style.overflow = 'hidden';
                $addClass(element, 'ec-active');
                element.closedHeight = element.dropDownPosition;
            }
            $style(element, { height: element.dropDownPosition } );
            element.ecState = true;
            element.dropDownEndPosition = element.scrollHeight;
        }
        element.dropDownTimer = window.setInterval(function() { ecAnimation(element); }, ecTimerDelay);
    }
}

ecAnimation = function(el) {
    el.dropDownPosition = el.dropDownPosition - (el.dropDownPosition - el.dropDownEndPosition) * ecAlpha;
    var rounded = Math.floor(el.dropDownPosition);
    el.style.height = rounded+'px';
    if (rounded == el.dropDownEndPosition) {
        window.clearInterval(el.dropDownTimer);
    }
}

$clear = function(el) {
el.innerHTML = "";
}

CScrollBar = function(canvas, controlObject) {
    this.canvas = canvas;
    this.controlObject = controlObject;
    this.wSize = 16;
    this.nactive = true;
}

CScrollBar.prototype = {
    draw: function() {
        var self  = this;
        this.controlObject.style.overflow = 'hidden';
        if (!this.DOMobject) {
            this.DOMobject = $new( { className: 'scroll-bar' }, this.canvas );
            this.DOMobject.style.display = 'none';
            this.DOMbtnU = $new( { className: 'button-up', onmousedown: function(e) { self.btnDownEvent(e, -10); } }, this.DOMobject );
            this.DOMbtnD = $new( { className: 'button-down', onmousedown: function(e) { self.btnDownEvent(e, 10); } }, this.DOMobject );
            $style(this.DOMbtnU, { width: this.wSize - 2, height: this.wSize - 2});
            $style(this.DOMbtnD, { width: this.wSize - 2, height: this.wSize - 2});
            this.DOMsliderOuter = $new( { className: 'slider-out' }, this.DOMobject );
            $style(this.DOMsliderOuter, { top: this.wSize });
            this.DOMslider = $new( { className: 'slider', onmousedown: function(e) { self.sliderDownEvent(e); } }, this.DOMsliderOuter );
            $style(this.DOMslider, { width: this.wSize - 2 });
        }
        if (this.controlObject.clientHeight < this.controlObject.scrollHeight) {
            if (this.nactive) {
                $attachEvent(this.controlObject, 'DOMMouseScroll', function(e) { self.mouseWheelEvent(e) }, 'mouse_wheel_scroll');
                this.controlObject.onmousewheel = function(e) { self.mouseWheelEvent(e) };
            }
            this.nactive = false;
            this.DOMobject.style.display = 'block';
            this.adjustScroller();
        } else {
            this.deactivate();
        }
    },
    deactivate: function() {
        if (!this.nactive) {
            $detachEvent(this.controlObject, 'DOMMouseScroll', 'mouse_wheel_scroll');
            this.controlObject.onmousewheel = null;
        }
        this.nactive = true;
        this.DOMobject.style.display = 'none';
//         this.DOMobject.style.display = 'block';
    },
    adjustScroller: function() {
        var objPos = $position(this.controlObject, this.canvas);
        $style(this.DOMobject,
               { width: this.wSize,
                 top: objPos.y, 
                 height: this.controlObject.clientHeight });
        this.DOMobject.style.right = '1%';
        this.flowSize = this.DOMobject.clientHeight - 2 * this.wSize;
        if ((JS.IE) && (!JS.IE_OLD)) {
            this.controlObject.scrollTop = this.controlObject.scrollHeight;
            this.controlObject.scrollTop = 0;
        }
        this.scaleK = (this.flowSize / this.controlObject.scrollHeight);
        $style(this.DOMsliderOuter, { height: this.flowSize });
        $style(this.DOMslider, 
               { top: Math.floor(this.controlObject.scrollTop * this.scaleK),
                 height: Math.floor(this.controlObject.clientHeight*this.scaleK)
               });
    },
    sliderDownEvent: function(e) {
        var self = this;
        var event = e || window.event;
        this.offY = this.DOMslider.offsetTop - event.clientY;
        this.eventTarget = 'slider';
        $attachEvent(document.documentElement, 'mousemove', function(e) { self.mouseMoveEvent(e); }, 'window_scroller_mousemove');
        $attachEvent(document.documentElement, 'mouseup', function(e) { self.mouseUpEvent(e); }, 'window_scroller_mouseup');
        $stopEvent(event);
        $preventDefault(event);
    },
    btnDownEvent: function(e, direction) {
        var self = this;
        var event = e || window.event;
        this.eventTarget = 'btn';
        $attachEvent(document.documentElement, 'mouseup', function(e) { self.mouseUpEvent(e); }, 'window_scroller_mouseup');
        this.scrollTimer = window.setInterval(function() { self.scrollBy(direction); }, 10);
        $stopEvent(event);
        $preventDefault(event);
    },
    mouseMoveEvent: function(e) {
        var self = this;
        var event = e || window.event;
        this.scrollTo(Math.round((this.offY + event.clientY)/this.scaleK));
        $stopEvent(event);
        $preventDefault(event);
    },
    mouseUpEvent: function(e) {
        var self = this;
        var event = e || window.event;
        if (this.eventTarget == 'slider') $detachEvent(document.documentElement, 'mousemove', 'window_scroller_mousemove');
        if (this.eventTarget == 'btn') window.clearInterval(this.scrollTimer);
        $detachEvent(document.documentElement, 'mouseup', 'window_scroller_mouseup');
    },
    mouseWheelEvent: function(e) {
        var event = e || window.event;
        var delta = -event.wheelDelta || event.detail || 0;
        delta /= Math.abs(delta);
        this.scrollBy(30*delta);
    },
    scrollBy: function(delta) {
        this.controlObject.scrollTop += delta;
        this.DOMslider.style.top = Math.round(this.controlObject.scrollTop * this.scaleK) + 'px';
    },
    scrollTo: function(pos) {
        this.controlObject.scrollTop = pos;
        this.DOMslider.style.top = Math.round(this.controlObject.scrollTop * this.scaleK) + 'px';
    }
}

$stopEvent = function(event) {
   event.cancelBubble = true;
}

$preventDefault = function(event) {
   if (event.preventDefault) {
      event.preventDefault();
   } else {
      event.returnValue = false;
   }
}


// ----------- Menu ---------------
function setupMenuItems(menuId, subMenuId) {
   var menu = $(menuId);
   var subMenu = $(subMenuId);
   if ((menu) && (subMenu)) {
      var items = menu.getElementsByTagName('li');
      var activeItem = null;
      for (var i=0; i<items.length; i++)
         if (items[i].className == 'activ') {
            activeItem = items[i];
            break;
         }
      if (activeItem) {
         subMenu.style.marginLeft = activeItem.offsetLeft+'px';
      }
   }
   
   
}