var PageOverlay,TradingOverlay,PortfolioOverlay
j$(function($){
  PageOverlay = {
        setup : function(node,opts){
            node = $(node);
            node.bind('open.overlay',this._open);
            node.bind('close.overlay',this._close);
            node.bind('refresh.overlay',this._refresh);
            node.data('overlay',this);
            this.node = node;
            this.page_refresh = false;
        },
        trigger : function(event,arguments){
            PageOverlay.node.trigger(event,arguments);
        },
        _close : function(e,extras){
            var extras = extras || {}
            var self = $(this);
            self.unbind('ajaxStart').unbind('ajaxStop');
            $(document).unbind('keydown.overlay');
            
            var selfid = $(this).attr('id')
            if (extras.refresh || PageOverlay.page_refresh){
                //console.log('REFRESH')
                //location = "";  // reload the page
                location = location.protocol + '//'+location.host + location.pathname
                $(this).hide();
            } else {
                $(this).fadeOut()//effect('puff');
            }

        },
        _open : function(e,opts){
            var self = PageOverlay;
            self.node.bind({
                ajaxStart : function(){$(this).addClass('loading')},
                ajaxStop : function() {j$('#PageOverlay').removeClass('loading')}
            });
            $(document).bind('keydown.overlay',function(e){
                if (e.keyCode && e.keyCode === $.ui.keyCode.ESCAPE){
                    PageOverlay.node.trigger('close.overlay');
                }
            });
            self.opts = opts;
            var node = $(this);
            self._load(opts);

            //$('#PageOverlay_content').load(opts.url,opts.params,opts.callback);
            if (node.has(':hidden')) {
                node.css('top',$(document).scrollTop()+20)
                node.show(); 
                $('#PageOverlay .ol-bg').css({'opacity':0.65}) 
            } else {
                
            }
            return
        },
        
        _refresh : function(e,extras){
            var self = PageOverlay;
            if (extras){
                var opts = $.extend({},self.opts);
                opts.params = $.extend({},self.opts.params,extras);
            } else {
                var opts = self.opts;
            }
            self._load(opts);
        },
        _load : function(opts,reload){
            $.ajax({ 
                url : opts.url,
                type : 'POST',
                data : opts.params,
                dataType : 'html',
                success : opts.callback,
                error : function(xhr, status, error){

                    $('#PageOverlay_content').html(xhr.responseText)
                },
                sysmsg_ignore : true,
                reload : reload || false
            });
            
        }
    }
    PageOverlay.setup('#PageOverlay')
    
    TradingOverlay = {
        url : '/dynamic/tradingoverlay/',
        order_url : '/dynamic/place_order/',
        loaded : false,
        selected: null,
        orders : null,
        
        open : function(aid){
            this.node = $('#TradingOverlay');
            this.aid =aid;
            if (!this.node.length){
                this.node = $('<div id="TradingOverlay" ></div>').appendTo($('#PageOverlay_content').empty());
            }
            this.node.html(translations.tol_loading);
            var params = {currency:WFData.currency,market: WFData.market,locale:WFData.locale,aid:aid}
            var opts = {url:this.url,params:params,callback:this.loadComplete};
            //$(document).bind('load_complete.overlay',TradingOverlay.loadComplete);
            PageOverlay.trigger('open.overlay',opts);
            PageOverlay.node.bind('close.overlay',this.close);
            
        },
        close : function(){
            TradingOverlay.selected = null;
            TradingOverlay.loaded = false;
        },
        select : function(order){
            // sell or buy
            var firstselect = (!this.selected) ? true : false;
            $('.orderbtn a').blur()
            var order = order || this.selected;
            var other = ( order == 'sell' ) ? 'buy' : 'sell';
            $('#tol_ordertype_btns').removeClass(other).addClass(order);
            $('#field_order_type').val(order)
            $('#tol_orderlist').removeClass(other).addClass(order);
            $('#tol_orderpane').slideDown();
            $('#btn_order span').text(translations[order].text);
            $('#my_order_label').text(translations[order].myorder); 
            
            $('#tol_portfolio .tol-orders').children('.'+other).hide().end().children('.'+order).show();
            $('#tol_info').addClass('hidden');
            this.selected = order;
            this.remove_quickorder().overcommit_test(true);
            if (firstselect){
                var dir = (order == 'sell') ? 'ask' : 'bid';
                $('#tol_order_spread a[rel=best-'+order+'-offer]').click();
            } else {
                this.reset_form_values();                    
            }
            return this
        },
        loadComplete : function(data,state,xhr){
            var self = TradingOverlay
            self.node.html(data);
            if (!self.loaded) {
                TradingOverlay.loaded = true;
            } else {
            };
            if (TradingOverlay.selected){TradingOverlay.select()}
            else { $('#tol_orderpane').hide();};
            
            // json = $.parseJSON(xhr.getResponseHeader('X-JSON'));
            json = $.getJSONHeader(xhr)
            self.node.data('orders',json.orders || {} );
            self.settings = json.settings || {};
            self.json = json;
            self.node.trigger('loaded.tradingoverlay');
            // $('#PageOverlay_content:hidden').slideDown();
            
        },
        set_quickorder : function(offertype,ele){
            var ele = $(ele);
            var selecteds = ele.prevAll().andSelf();
            
            if (selecteds.filter('.own-order,.part-own-order').effect('pulsate').length){
                return;
            }
            
            selecteds.addClass('selected');
            ele.nextAll().removeClass('selected');

            var amount = 0;
            var total = 0;
            var price = 0;
            var offers = $(this.node.data('orders')[offertype]).slice(0,ele.index()+1).each(function(i,v){
                price = v.price;
                amount += v.amount;
            })
            
            $('#field_price').setnumber(price).effect('highlight');
            $('#field_amount').setnumber(amount).effect('highlight');
            $('#field_total').setnumber(price*amount);
            this.set_expire_now();
            
            var btn = ele.parent('ul').next('div.quickorder');
            var os = ele.offset();
            os.left += ele.width();
            btn.show().offset(os);

            $('#btn_order').hide();
            $('#tol_my_order_form').one('click',function(){TradingOverlay.remove_quickorder()});
            return this;
        },
        remove_quickorder : function(){
            // cleanup quickorders
            $('#btn_order').show();
            $('#tol_orderlist .content li').removeClass('selected');
            $('#tol_orderlist div.quickorder').hide();
            return this;
        },
        set_expire_never : function(){
            $('#tol_date_btn').datepicker('hide').val(translations.expires.never);
            $('#field_expires').val('never');
            return this;
        },
        set_expire_now : function(){
          $('#tol_date_btn').datepicker('hide').val(translations.expires.now);
          $('#field_expires').val('now');
          return this;
        },
        show_info : function(id){
            $('#tol_info').removeClass('hidden').children(':not(.hidden)').not('#'+id).addClass('hidden');
            $('#'+id).toggleClass('hidden');
            return this;
        },
        place_order : function(){
            var self = this
            var amount = $('#field_amount').getnumber();
            if (typeof(amount) != 'number' || amount <= 0 ) {
                self.show_info('form_error');
                return;
            }
            var price = $('#field_price').getnumber();
            if (typeof(price) != 'number' || price <= 0){
                self.show_info('form_error');
            }
            var params = {
                order : '',
                aid : this.aid,
                amount : $('#field_amount').val(),
                price : $('#field_price').val(),
                order_type : $('#field_order_type').val(),
                expires : $('#field_expires').val(),
                expires_time : $('#field_expires_time_set').val(),
                onsplit : $('#field_onsplit').val(),
                currency : WFData.currency,
                market : WFData.market,
                locale:WFData.locale
            }
            self.keep_form_vals = true;
            $.ajax({
                url: this.order_url,
                data:params,
                type:'POST',
                success: self.transaction_response
                });
            var context = $.extend({},params,{ 
                order : translations[params.order_type].text
                })
            
            $('#tol_header,#tol_ordertype_btns,#tol_orderpane,#tol_order_spread').hide();
            $('#tol_transaction').template_render(context).removeClass('hidden');
        },
        transaction_response : function(data,status,xhr){
            var request = $('#tol_transaction .request').removeClass('loading')
            json = $.getJSONHeader(xhr)
            if (json.transaction_summary){
                request.addClass(json.transaction_summary);
            }
            $('#tol_transaction').append(data);
        },
        overcommit_test : function(reset){
            var self = TradingOverlay;
            var containerq = '#tol_portfolio';
            if (reset) {
                $(containerq +' .ocinfo').removeClass('ocinfo');
            }
            if (self.selected == 'sell' && self.json.portfolio.free_shares < $('#field_amount').getnumber() ){
                $(containerq +' .tol-shares:not(.ocinfo)').addClass('ocinfo');
            } else if (self.selected == 'buy' && self.json.portfolio.free_cash < $('#field_total').getnumber() ){
                $(containerq +' .tol-cash:not(.ocinfo)').addClass('ocinfo');
            } else {
                $(containerq +' .ocinfo').removeClass('ocinfo');
                $('#ocshare:not(.hidden),#occash:not(.hidden)').addClass('hidden');
            }
            return self;
        },
        reset_form_values : function(){
            $.NumberInput.inputs.not(':disabled').setnumber();
            return this;
        }
    };
    
    
    // move to document
    $('#market_table tr .prognosis').live('click',function(e){e.preventDefault();TradingOverlay.open($(this).attr('rel'));});


    // Datepicker Override
    $.datepicker._moved_generateHTML = $.datepicker._generateHTML;
    $.datepicker._generateHTML = function(inst){
      var html =  $('<div/>').html(this._moved_generateHTML(inst));
      var classnames = 'ui-state-default ui-priority-primary ui-corner-all';
      var buttons = '<button class="ui-datepicker-never '+classnames+'" onclick="TradingOverlay.set_expire_never();" type="button">'+translations.expires.never+'</button>';
      buttons +=    '<button class="ui-datepicker-now '+classnames+'" onclick="TradingOverlay.set_expire_now();"type="button">'+translations.expires.now+'</button>';
      var btns = html.find("div.ui-datepicker-buttonpane").html(buttons);
      return html.html();
    };
    
    
    // ToDo: copyied to main.js should be removed from here if main.js is included everywhere
    $.fn.template_render = function(context){
        var pattern = /#{(\w+)}/g
        var replacement = function(match,scope){return context[scope] || '';};
        this.each(function(i,v){ $(this).html($(this).html().replace(pattern,replacement));});
        return this;
    };
    PortfolioOverlay = {
        data_url : '/dynamic/portfolio',
        
        open : function(view){
            var self = this;
            this.node = $('#PortfolioOverlay');
             if (!this.node.length){
                 this.node = $('<div id="PortfolioOverlay" ></div>').appendTo($('#PageOverlay_content').empty());
             }
             this.node.html('<span class="loadingmsg" >' + translations.tol_loading + '</span>').undelegate();
             var params = {view:view,currency:WFData.currency,market: WFData.market,locale:WFData.locale}
             var opts = {url:this.data_url,params:params,callback:this.loadComplete};
             $(document).bind('load_complete.overlay',PortfolioOverlay.loadComplete);
             PageOverlay.trigger('open.overlay',opts);
             PageOverlay.node.bind('close.overlay',this.close);
        },
        loadComplete : function(data,state,xhr){
            var self = PortfolioOverlay;
            self.node.html(data);
        },
        transaction_response : function(data,state,xhr){
        },
        close : function(){
            
        },
        action: function(opts){
            $.ajax($.extend({},this.ajax_opts,opts));
            
        },
        ajax_opts : {
            type: 'POST',
            url : '/dynamic/change_order/',
            sysmsg_ignore : true,
            success : function(data,state,xhr){
                var json = $.getJSONHeader(xhr);
                if(json.sysmsgs){
                    var block = $('<div class="msg" >');
                    var close = $('<a href="#" class="ui-icon ui-icon-close"  />');
                    var base = $('#PortfolioOverlaySysmsg');
                    $(json.sysmsgs).each(function(i,v){
                      block.clone().html(v.text).append(close.clone().click(function(e){
                        e.preventDefault();
                        $(this).parent().remove();
                      }))
                      .addClass(v.type).appendTo(base);
                    });
                    
                }
                if (data == 'OK' ){PageOverlay.trigger('refresh.overlay');}
            },
            error : function(xhr,text,err){
                PageOverlay.page_refresh = true;
                PageOverlay.trigger('close.overlay');
            }
            
        }
    }
});


