// JavaScript Document

var UIPage = Class.create({
    initialize: function (cnf) {
        this.cnf = cnf;
        this.data = this.fetch(cnf.menu_url, function (json) {
            this.build_menu(json.menu, this.cnf.menu);
        }.bind(this));
        this._active_menus = [];
        this.layer = document.body.id = 'body';
        this.hint = new UIHint(this);
        Rounded("div#header_buttons","transparent","#F3F3F3");
        $('search').observe('click', function (e) {
            if (Event.element(e).value == 'поиск..') {
                Event.element(e).value = '';
            }
            e.stop();
        }.bindAsEventListener(this));
        $('search_btn').observe('click', function (e) {
            this.search();
            e.stop();
        }.bindAsEventListener(this));
        $('search').observe('keypress', function (e) {
            if (Event.KEY_RETURN == (e.charCode || e.keyCode)) {
                this.search();
                e.stop();
            }
            return true;
        }.bindAsEventListener(this));
        this.vs_center_viewport();
        this.post_init();
    },
    post_init: function () {
        return true;
    },
    search: function () {
        window.location = this.cnf.base + 'search?'+encodeURIComponent($('search').value);
    },
    build_menu: function (json, where) {
        json.each(function (elem, index) {
            $(where).appendChild(new Element('div', {'id':'menu_item_'+index}).addClassName('menu_item').update('<a href="'+this.cnf.base + elem.url+'">'+(elem.name || elem.url || index)+'</a>'));
            this.register_menu_item($('menu_item_'+index), elem, index);
        }.bind(this));
    },
    register_menu_item: function (where, elem, index) {
        where.observe('mouseover', function (e, index, elem) {
            this._over = index;
            if (index.toString().split('_').length == 1) {
                var fin = function (index, elem, e) {
                    if ('_over' in this && index === this._over) {
                        this.over(index, elem, e);
                    }
                }.bind(this, index, elem, e).delay(0.25);
            } else {
                this.over(index, elem, e);
            }
        }.bindAsEventListener(this, index, elem));
        where.observe('mouseout', function (e, index) {
            delete(this._over);
            this.hide_suspended_sub_menu(index, elem);
        }.bindAsEventListener(this, index, elem));
    },
    over: function (index, elem, e) {
        this.highlight(index);
        this.hide_previous_sub_menu(index, elem);
        this.show_sub_menu(index, elem, e);
    },
    highlight: function (index) {
        if (this._highlighted) {
            $('menu_item_'+this._highlighted).removeClassName((this._highlighted.toString().split('_').length > 1?'sub_':'')+'menu_item_selected');
            this._highlighted = null;
        }
        if (index) {
            $('menu_item_'+index).addClassName((index.toString().split('_').length > 1?'sub_':'')+'menu_item_selected');
            this._highlighted = index;
        }
    },
    show_sub_menu: function (index, elem, e) {
        this._out_of_menu = false;
        if (elem.children.length > 0) {
            if (!$('sub_menu_'+index)) {
                $(this.cnf.menu).appendChild(new Element('div', {'id':'sub_menu_'+index}).addClassName('sub_menu').hide());
                elem.children.each(function (parent_index, item, index) {
                    $('sub_menu_'+parent_index).appendChild(
                        Builder.node('div', {'id':'menu_item_'+parent_index+'_'+index, 'class':'sub_menu_item'}, [
                            new Element('span').update('<img src="/static/images/menu_'+(item.children.length > 0 ?'arrow':'dot')+'.png" alt="" width="13" height="10" class="pnged" />&nbsp;' + '<a href="'+this.cnf.base + item.url + '">'+item.name+'</a>')
                        ]));
                    this.register_menu_item($('menu_item_'+parent_index+'_'+index), item, parent_index+'_'+index);
                }.bind(this, index));
                if (Prototype.Browser.IE) {
                    $('sub_menu_'+index).childElements().each(function (width, e) {
                        e.setStyle({'width':width+'px'});
                    }.bind(this, $('sub_menu_'+index).getWidth()));
                }
            }
            this.positionate_sub_menu(index, elem, e);
            this._current_menu = elem;
            this._current_menu_index = index;
            this._active_menus.push(index);
        }
    },
    positionate_sub_menu: function (index, elem, e) {
        var coords = this.hint.get_coords(e, $('sub_menu_'+index), {'min_distance_y':5, 'min_distance_x':5});
        if ($('menu_item_'+index).hasClassName('sub_menu_item')) { //coords[1]-document.viewport.getScrollOffsets().top ; $('menu_item_'+index).up().cumulativeOffset()[0] +
            $('sub_menu_'+index).setStyle({'top':($('menu_item_'+index).cumulativeOffset()[1] - $(this.cnf.menu).cumulativeOffset()[1])+'px','left':($('menu_item_'+index).up().positionedOffset()[0] + $('menu_item_'+index).down().getWidth())+15+'px'}).show();
        } else {
            $('sub_menu_'+index).setStyle({'top':$('menu_item_'+index).up().getHeight()+10+'px','left':$('menu_item_'+index).positionedOffset()[0]+'px'}).show();
        }    //coords[1]-document.viewport.getScrollOffsets().top+ 'left':coords[0]+'px'
    },
    hide_sub_menu: function (index, elem) {
        if ($('sub_menu_'+index)) {
            $('sub_menu_'+index).hide();
        }
        this._active_menus = this._active_menus.without(index);
    },
    hide_previous_sub_menu: function (index, elem) {
        if (this._current_menu_index != null && this._current_menu_index.toString().split('_').length >= index.toString().split('_').length) {
            this.hide_sub_menu(this._current_menu_index, this._current_menu);
            this._active_menus.each(function (new_index, index) {
                if (new_index.toString().split('_').length <= index.toString().split('_').length) {
                    this.hide_sub_menu(index);
                }
            }.bind(this, index));
        }
    },
    hide_suspended_sub_menu: function (index, elem) {
        this._out_of_menu = true;
        this._menu_timer = function (self, index, elem) {
            if (self._out_of_menu == true) {
                self._active_menus.each(function (index) {
                    this.highlight();
                    this.hide_sub_menu(index);
                }.bind(self));
            }
        }.delay(5, this, index, elem);
    },
    go_to: function (url) {
        window.location = this.cnf.base + url;
    },
    fetch: function (url, callback, params) {
        this.req = new Ajax.Request(url + '?' + Math.random(), {
            method: 'post',
            parameters: (params?params.toQueryString():null),
            requestHeaders: {'Cache-Control':'no-cache'},
            onComplete: function (time, callback, req) {
                if (req.status == '200' && ((req.responseText.charAt(0) == "{") || (req.responseText.charAt(0) == "["))) {
                    callback(req.responseText.evalJSON() || {});
                }
            }.bind(this, (new Date()).getTime(), callback)
        });
    },
    vs_center_viewport: function () {
        var offsets = document.viewport.getScrollOffsets();
        window.scrollTo(1000, offsets[1]);
        offsets = document.viewport.getScrollOffsets();
        window.scrollTo(Math.round(offsets[0]/2), offsets[1]);
    }
});

var UIHint = Class.create({
    initialize: function(parent) {
        var div = Builder.node('div', {'id': 'hint'},[
            new Element('div').addClassName('hint_title'),
            new Element('div').addClassName('hint_value')
        ]);
        this.parent = parent;
        this.layer = div.id;
        $(parent.layer).appendChild(div);
        $(this.layer).hide();
        this.options = ({
            min_distance_x: 5,
            min_distance_y: 5,
            delta_x: 0,
            delta_y: 0,
            zindex: 230
        });
        this.event_mouse_move  = this.move.bindAsEventListener(this);
    },
    move: function (event) {
        //Event.stop(event);
        var coords = this.get_coords(event, this.layer, this.options);
        this.set_style(coords[0], coords[1]);
        return true;
    },
    get_coords: function (event, layer, options) {
      var mouse_x = Event.pointerX(event);
      var mouse_y = Event.pointerY(event);
      var dimensions = Element.getDimensions( layer );
      var element_width = dimensions.width;
      var element_height = dimensions.height;

      if ( (element_width + mouse_x) >= ( document.viewport.getWidth() - options.min_distance_x) ){ // too big for X
          mouse_x = mouse_x - element_width;
          mouse_x = mouse_x - options.min_distance_x;
      } else {
          mouse_x = mouse_x + options.min_distance_x;
      }
      if ( (element_height + mouse_y) >= ( document.viewport.getHeight() - options.min_distance_y) ){ // too big for Y
          mouse_y = mouse_y - element_height;
          mouse_y = mouse_y - options.min_distance_y;
      } else {
          mouse_y = mouse_y + options.min_distance_y;
      }
      return [mouse_x, mouse_y];
    },
    show: function (event, title, value) {
        //Event.stop(event);
        this.move(event);
        $(this.layer).firstChild.update(title);
        $(this.layer).lastChild.update(value);
        $(this.layer).show();
    },
    hide: function (event) {
        //if (event) {Event.stop(event);}
        $(this.layer).hide();
    },
    set_style: function(x, y) {
        Element.setStyle(this.layer,
            {
                'position':'absolute',
                'top':y + this.options.delta_y + "px",
                'left':x + this.options.delta_x + "px",
                'z-index':this.options.zindex
            }
        );
    }
});

// Cookie module
var Cookie = {
  set: function(name, value, daysToExpire) {
    var expire = '';
    if (daysToExpire != undefined) {
      var d = new Date();
      d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
      expire = '; expires=' + d.toGMTString();
    }
    return (document.cookie = escape(name) + '=' + escape(value || '') + expire);
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : null);
  },
  erase: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },
  accept: function() {
    if (typeof navigator.cookieEnabled  == 'boolean') {
      return navigator.cookieEnabled;
    }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === '1');
  }
};

