var oui = {
    init : function() {
        
        $('.oui-search').focus(oui.search.focus).blur(oui.search.blur);
        $('.oui-menu > li').mouseenter(oui.menu.mouseenter).mouseleave(oui.menu.mouseleave);
        oui.list.init();
    },
    list : {
        init : function() {
            $('ul.oui-list').each(oui.list.initItems);
            var onInit = null;
            var selected = null;
            $('ul.oui-list').each(
                function() {
                    onInit = $(this).attr('orp:oninit');
                    if (onInit) {
                        selected = $('li.oui-selected', this);
                        if (!selected.length) {
                            selected = null;
                        }
                        eval(onInit + ".call(this,selected)");
                    }
                }
                );
        },
        initItems : function() {
            $('li.oui-item', this).click(oui.list.click);
        },
        click : function() {
            if ($(this).hasClass('oui-selected')) return;
            $('li.oui-item', $(this).parent()).removeClass('oui-selected');
            $(this).addClass('oui-selected');
            var onChange = $(this).parent().attr('orp:onchange');
            if (onChange) {
                eval(onChange + '.call(this,' + $(this).attr('orp:lid') + ')');
            }
        },
        deleteItem : function(id, lid) {
            var toDelete = null;
            $('#' + id + ' > li').each(function() {
                if ($(this).attr('orp:lid') == lid) toDelete = $(this);
            });
            if (toDelete == null) {
                console.error('Item ' + lid + ' not found');
                return;
            }
            var toSelect = null;
            if (toDelete.hasClass('oui-selected')) {
                toSelect = toDelete.prev();
                if (toSelect.length == 0) toSelect = toDelete.next();
                if (toSelect.length == 0) toSelect = null;
            }
            toDelete.remove();
            if (toSelect) oui.list.click.call(toSelect);
        }    
    },
    button : function(args) {
        if (!args.className) {
            args.className = 'oui-button';
        } else {
            args.className = 'oui-button ' + args.className;
        }
        if (!args.href) args.href = 'javascript:;';
        var but = $('<a href="' + args.href + '" class="' + args.className + '">' + args.text + '</a>');
        if (args.onclick) but.click(args.onclick);
        return but;
    },
    search : {
        blur : function() {
            if ($(this).val().length == 0) {
                $(this).val($(this).attr('orp:hint')).addClass('oui-hint');
            }
        },
        focus : function() {
            if ($(this).hasClass('oui-hint')) {
                $(this).val('').removeClass('oui-hint');
            }
        }
    },
    menu : {
        mouseenter : function() {
            $('ul.oui-submenu', this).show();
        },
        mouseleave : function() {
            $('ul.oui-submenu', this).hide();
        }
    },
    error : function(msg, title) {
        if (!title) title = 'Error';
        var panel = new oui.Popup();
        panel.html('<h3>' + title + '</h3><div class="orp-error"><p>' + msg + '</p></div>');
    }
}
oui.Confirm = function(iargs) {
    var args = iargs;
    var me = this;
    if (!args.title) args.title = 'Please confirm';
    if (!args.okText) args.okText = 'OK';
    if (!args.cancelText) args.cancelText = 'Cancel';
    this.args = args;
    oui.confirmPopup = new oui.Popup();
    var panel = oui.confirmPopup;
    panel.append('<div class="oui-header"><h3>' + args.title + '</h3></div>');
    var inner = $('<div class="oui-inner"><p>' + args.text + '</p></div>');
    var okBut = oui.button({
        text:args.okText, 
        onclick:okClick
    });
    var cancelBut = oui.button({
        text:args.cancelText, 
        onclick:cancelClick
    });
    var butBarInner = $('<div class="oui-inner"></div>');
    butBarInner.append(okBut).append(cancelBut);
    var butBar = $('<div class="oui-button-bar"></div>');
    butBar.append(butBarInner);
    inner.append(butBar);
    panel.append(inner);
    panel.append('<div class="oui-chin"></div>');
    
    function okClick() {
        panel.close();
        args.okCallback(me);
    }
    function cancelClick() {
        panel.close();
        if (args.cancelCallback) args.cancelCallback(me);
    }
}
oui.Popup = function(iargs) {
    if (!iargs) iargs = {};
    var me = this;
    var args = iargs;
    var zIndex = orp_MaxIndex(popupList) + 10;
    var noShade = (iargs.shade === false);
    if (popupList.length == 0) {
        $('.orp-player object').hide();
    }
    popupList.push(me);
    var level = popupList.length;
    if (!args.className) args.className = 'oui oui-popup';
    var shade = null;
    if (!noShade) {
        shade = $('<div></div>');
        shade.css({
            position:'fixed',
            width:'100%',
            height:'100%',
            opacity:0.5,
            filter:'alpha(opacity=50)',
            left:0,
            top:0,
            'background-color':'#000',
            'z-index':zIndex
        });
        shade.click(close);
    }
    var contentPanel = $('<div class="oui-inner"></div>');
    var panel = $('<div class="' + args.className + '"></div>');
    panel.append(contentPanel);
    
    if (args.id) panel.attr('id', params.id);
    panel.css({
        position:'absolute',
        'z-index':zIndex + 5
    });
    if (args.html) contentPanel.html(args.html);
    $(window).resize(resized);
    if (args.cross !== false) {
        cross = $('<div class="oui-close-icon">Close</div>');
        panel.append(cross);
        cross.click(close);
    }
    if (shade != null) $('body').append(shade);
    $('body').append(panel);
    resized();
    this.resized = resized;
    this.close = close;
    this.load = load;
    this.empty = empty;
    this.append = append;
    this.html = html;
    this.zIndex = zIndex;
    this.panel = panel;
    this.cross = cross;
    this.prepend = prepend;
    this.css = panel.css;
    this.outerHeight = panel.outerHeight;
    this.outerWidth = panel.outerWidth;

    function resized() {
        var ww = $(window).width();
        var wh = $(window).height();
        var pw = panel.outerWidth();
        var ph = panel.outerHeight();
        var left = (ww - pw)/2;
        var top = (wh - ph)/2;
        if (left < 20) left = 20;
        if (top < 20) top = 20;
        top = 30 + level * 20;
        top = top + $(window).scrollTop();
        panel.css({
            left:left,
            top:top
        });
    }
    function load(url, callback) {
        args.onComplete = callback;
        contentPanel.load(url, loadHandler);
    }
    function loadHandler(response, status, request) {
        if (status == "success") {
            $('.orp-focus', panel).focus();
            if ($('ul.orp-tabs', panel).length > 0) {
                new orp_Tabs(this);
            }
            resized();
            if (args.onComplete) {
                args.onComplete.call(this, true, response);
            }
        } else {
            close();
            error(response);
            if (args.onError) args.onError.call(this, false);
        }
    }
    function close() {
        $(window).unbind('resize', resized);
        popupList.remove(me);
        if (popupList.length == 0) {
            $('.orp-player object').show();
        }
        panel.remove();
        if (shade) shade.remove();
        if (args.onClosed) {
            var callback = args.onClosed;
            args.onClosed = null;
            callback.call(this);
        }
    }
    function html(code) {
        contentPanel.html(code);
        resized();
    }
    function append(nodes) {
        contentPanel.append(nodes);
        resized();
    }
    function prepend(nodes) {
        contentPanel.prepend(nodes);
        resized();
    }
    function css(params) {
        contentPanel.css(params);
    }
    function empty() {
        contentPanel.empty();
    }
}
oui.Waiter = function(iurl, iargs) {
    var args = iargs;
    var url = iurl;
    if (!args) args = {};
    if (!args.msg) args.msg = '';
    if (!args.title) args.title = 'Please wait';
    if (args.data) {
        url = buildUrl(url, args.data);
    }
    var panel = new oui.Popup();
    panel.html('<div class="oui-header"><h3>' 
        + args.title 
        + '</h3></div><div class="oui-inner"><div class="orp-waiting">Processing</div></div><div class="oui-chin"></div>');
    var e = $('<div style="display:none"></div>');
    if (args.append !== false) {
        $('body').append(e);
    }
    e.load(url, loadHandler);
    
    function loadHandler(response, status) {
        if (status != 'success') {
            dispose();
            if (!args.onError) {
                oui.error(response); // neat error required here
            } else {
                args.onError.call(this, response, args.onCompleteData);
            }
        } else {
            if (args.onComplete) args.onComplete.call(this, response, args.onCompleteData);
            if (args.showComplete) {
                panel.html('<div class="oui-header"><h3>Action Complete</h3></div>');
                var inner = $('<div class="oui-inner"><div class="orp-good">' 
                    + response 
                    + '</div></div>');
                var okBut = oui.button({
                    text:'OK', 
                    onclick:panel.close
                });
                var butBarInner = $('<div class="oui-inner"></div>');
                butBarInner.append(okBut);
                var butBar = $('<div class="oui-button-bar"></div>');
                butBar.append(butBarInner);
                inner.append(butBar);
                panel.append(inner);
                panel.append('<div class="oui-chin"></div>');
            } else {
                dispose();
            }
        }
    }
    
    function dispose() {
        if (args.append !== false) {
            e.remove();
        }
        panel.close();
    }
}
oui.calendar = {
    popup : function(e) {
        new PopupCalendar({
            e:e
        });
    }
}
$(document).ready(oui.init);
