var $j = jQuery.noConflict();

UserbarLogic = function(params) {
   // steps vars
   var wrapper, checkVersionBox, step1Box, step2Box, step3Box, loginBox, currentStep;
   var smsCodeBox, smsPriceBox, smsNumberBox, ggAccountPriceBox;
   var smsDataContainer, accountDataContainer;
   
   // forms vars
   var ggNumberInput, ggNumberSelect, ggNumberRadio1, ggNumberRadio2, friendGgNumberInput;
   var paymentTypeRadioCollection;
   var ggNumberInputError, ggNumberSelectError, friendGgNumberInputError;   
   var selectedGgNumber, recipientGgNumber, period, buyForFriendButton;   
   
   // links
   var ggAccountLink;
   
   // config vars
   var addon = params.addon;
   var payment = {};
   var preview = params.preview;
   var getPaymentDataUrl   = params.getPaymentDataUrl;
   
   var loader;
   var gg;
   
   if (!addon.id || !addon.type || !getPaymentDataUrl) {
        throw "UserbarLogic constructor invalid parameters!";	        
   }  
   
   var init = function() {
        wrapper  = $j('#userbar');
        step1Box = $j('#userbar > #userbar-step-1');    
        step2Box = $j('#userbar > #userbar-step-2');    
        step3Box = $j('#userbar > #userbar-step-3');
        loginBox = $j('#userbar-loginform');
        checkVersionBox = $j('#userbar > #check-version');
        
        // form fields
        ggNumberInput  = $j('#userbar #gg-number-input');
        friendGgNumberInput  = $j('#check-version #friend-gg-number-input');
        ggNumberSelect = $j('#userbar #gg-number-select');
        ggNumberRadio1 = $j('#userbar #gg-number-radio-1');
        ggNumberRadio2 = $j('#userbar #gg-number-radio-2');
        paymentTypeRadioCollection = $j('#userbar .payment-type-radio');
        
        // form errors
        ggNumberInputError  = $j('#userbar #gg-number-input-error');
        friendGgNumberInputError  = $j('#check-version #friend-gg-number-input-error');
        ggNumberSelectError = $j('#userbar #gg-number-select-error');
        paymentTypeRadioError = $j('#userbar #payment-type-radio-error');
        
        recipientGgNumber = $j('#userbar #recipient-gg-number');
        period = $j('#userbar #period');
        smsCodeBox = $j('#userbar #sms-code');
        smsPriceBox = $j('#userbar #sms-price');
        smsNumberBox = $j('#userbar #sms-number');
        ggAccountPriceBox = $j('#userbar #gg-account-price');
        buyForFriendButton = $j('#check-version #buy-for-friend');
        smsDataContainer = $j('#sms-data-container');
        accountDataContainer = $j('#account-data-container'); 
        
        ggAccountLink = $j('#userbar #pay-with-gg-account');
        
        currentStep = step1Box;
            
        loadConfigData();
        loadPlugins();        
        addEventListeners();
        // GA tracker
        trackGAStep1();

        if (!isNewGaduGadu()) {
            showGaduGaduOldVersionInfo();                        
        }
    };
    
    var isNewGaduGadu = function() {
        
        // our plugin supports only ie and FF > 2.0
        // see http://webdevel.blogspot.com/2008/07/overview-of-jquerybrowser.html
        if ($j.browser.msie || ($j.browser.mozilla && parseFloat($j.browser.version) >= 1.9)) {
            gg = new GaduGadu();
            
            //return gg.isNewGaduGaduInstalled();
            return true;
        } else {
            return true;
        }
    };
    
    var showGaduGaduOldVersionInfo = function() {
        checkVersionBox.show();
        step1Box.css('display', 'none');
    };
    
    var loadConfigData = function() {
        $j('#userbar .custom-background').css({'backgroundImage': 'url("'+ preview.background +'")'});        
        $j('#userbar .custom-description').text(preview.description);                
    };
    
    var addEventListeners = function() {
        handleNavigationEvents();
        
        // check version step
        handleGotoStep1LinkEvents();
        handleCheckAgainButtonEvents();
        handleBuyForFriendButtonEvents();
        
        // step 1
        handleGgNumberInputEvents();
        handleGgNumberSelectEvents();
        handleGgNumberRadioEvents();
        handleLoginLinkEvents();
        
        // step 2
        handleCloseButtonEvents();
        handlePaymentButtonEvents();
        
        // payment actions
        handleGgAccountPaymentEvents();
    };
    
    var handleNavigationEvents = function() {
        wrapper.
            find('.close, .cancel').click(function() {
                closeWindow();
            }).
            end().
            find('.next').click(function() {
                loadNextStep();
            }).
            end().
            find('.back').click(function() {
                showPrevStep();
            }).
            end().
            find('.next_pr').click(function() {              
              $j.ajax({
                type:  'GET',
                url:   $j('#promo_url', wrapper).val() + '/gg_number/' + String(ggNumberSelect.val()),
                cache: false,
                dataType: 'txt',
                success: function(response) {
                  closeWindow();                  
                  location.reload();
                },
                error: function() {
                  
                }
            });              
          });                                           
    };
    
    var handleGotoStep1LinkEvents = function() {
        checkVersionBox.find('#goto-step1').click(function() {
            checkVersionBox.hide();
            step1Box.show();
        });
    };
    
    var handleCheckAgainButtonEvents = function() {
        checkVersionBox.find('#check-again').click(function() {
            if (isNewGaduGadu()) {
                checkVersionBox.hide();
                step1Box.show();
            }
            
            return false;
        });
    };
    
    var handleBuyForFriendButtonEvents = function() {
        buyForFriendButton.click(function() {
            if (validateFriendGgNumberInput()) {
                selectedGgNumber = friendGgNumberInput.val();
                recipientGgNumber.text(selectedGgNumber);
                
                checkVersionBox.hide();
                step1Box.show();
                showNextStep();
                trackGAStep2();
            }
            
            return false;
        });
    };
    
    var handleGgNumberInputEvents = function() {
        var defaultText = parseInt(ggNumberInput.val()) ? '' : ggNumberInput.val();
        var friendDefaultText = parseInt(friendGgNumberInput.val()) ? '' : friendGgNumberInput.val();
        
        ggNumberInput.
            focus(function() {
                if (!parseInt($j(this).val())) {
                    $j(this).val('');
                }
                
                ggNumberRadio1.attr('checked', 'checked');
                ggNumberRadio2.removeAttr('checked');
            }).
            blur(function() {
                if ($j(this).val() == '') {
                    $j(this).val(defaultText);
                }
            }).
            keyup(function() {
                validateGgNumberInput();      
            });      
            
        friendGgNumberInput.
            focus(function() {
                if (!parseInt($j(this).val())) {
                    $j(this).val('');
                }
            }).
            blur(function() {
                if ($j(this).val() == '') {
                    $j(this).val(friendDefaultText);
                }
            }).
            keyup(function() {
                validateFriendGgNumberInput();
            });                               
    };
    
    var handleGgNumberSelectEvents = function() {
        step1Box.find('#gg-number-select_container > ul > li')
            .click(function() {
                validateGgNumberSelect();
                
                ggNumberRadio1.removeAttr('checked');    
                ggNumberRadio2.attr('checked', 'checked');         
            });
    };
    
    var handleGgNumberRadioEvents = function() {
        ggNumberRadio1.change(function() {
            hideGgNumberSelectError();
        });
        
        ggNumberRadio2.change(function() {
            hideGgNumberInputError();
        });
    };
    
    var handleLoginLinkEvents = function() {
        step1Box.find('#login').click(function() {
            wrapper.hide().parents().css({height: 'auto'});
            loginBox.show();
            
            return false;
        });
    };
    
    var handleCloseButtonEvents = function() {
        step3Box.find('#finish-trans').click(function() {
            closeWindow();                        
        });        
    };
    
    var handlePaymentButtonEvents = function() {
        step2Box.find('.payment p').click(function() {
            $j(this).siblings('input:radio').attr('checked', 'checked');
        });
    };
    
    var handleGgAccountPaymentEvents = function() {
        ggAccountLink.click(function() {
            window.location = $j(this).attr('href') + '?addonId='+ addon.id +'&addonType='+ addon.type +'&paymentId='+ payment.id +'&ownerId=' + selectedGgNumber;
            
            return false;
        });
    };
    
    var loadNextStep = function() {
        switch (currentStep.attr('id')) {
            case step1Box.attr('id'):
                if (validateStep1()) {
                    saveSelectedGgNumber();
                    showNextStep();
                    trackGAStep2();                    
                }
                break;
                
            case step2Box.attr('id'):
                if (validateStep2()) {
                    saveSelectedPaymentType();
                    loadAvaliablePaymentTypes(function() {
                        showNextStep();
                        trackGAStep3();
                    });
                }                    
                break;
                
            default:
                showNextStep();
        }
    };
    
    var saveSelectedGgNumber = function() {
        if (ggNumberRadio1.attr('checked')) {
            selectedGgNumber = ggNumberInput.val();
        }
        
        if (ggNumberRadio2.attr('checked')) {
            selectedGgNumber = getGgNumberFromSelect();    
        }
        
        recipientGgNumber.text(selectedGgNumber);                 
    };
    
    var saveSelectedPaymentType = function() {
        var pay = getSelectedPaymentType();
        
        payment.id = pay.val();
        payment.duration = pay.parent().find('input:hidden.duration:first').val();
        
        period.text(payment.duration);        
    };
    
    var getGgNumberFromSelect = function() {
        var selectedId = step1Box.find('#gg-number-select_container > ul > li.selected').attr('id');
        var pos = selectedId.search(/[0-9]+$/);
        var gg = null;
        
        if (pos > -1) {
            gg = selectedId.substr(pos);
        }
        
        return gg;    
    };
    
    var getSelectedPaymentType = function() {
        var selected = null;
        
        paymentTypeRadioCollection.each(function() {
            if ($j(this).attr('checked')) {
                selected = $j(this);                
            }
        });
        
        return selected;
    };
    
    var loadAvaliablePaymentTypes = function(callback) {
        showLoader();
        
        $j.ajax({
            type:  'POST',
            url:   getPaymentDataUrl,
            cache: false,   
            data:  'addonId=' + addon.id + '&addonType=' + addon.type + '&paymentId=' + payment.id + '&paymentDuration=' + payment.duration + '&ownerId=' + selectedGgNumber,
            dataType: 'json',
            success: function(response) {
                hideLoader();   
                
                if(!response.smsCode || !response.smsCode || !response.smsNumber){
                    smsDataContainer.remove();    
                }             
                else{
                    smsCodeBox.text(response.smsCode);                
                    smsPriceBox.text(response.smsPrice);                
                    smsNumberBox.text(response.smsNumber);
                }

                if(!response.ggAccountPrice){
                    accountDataContainer.remove();   
                } 
                else{
                    ggAccountPriceBox.text(response.ggAccountPrice);  
                }           
                              
                                
                callback();
            },
            error: function() {
            }
        });
    };
    
    /**************** 
        Validation
    *****************/
    
    var validateGgNumber = function(gg) {
        return (gg.search(/[^0-9]+/i) >= 0 || gg.length == 0);
    };
    
    var validateGgNumberInput = function() {
        if (!ggNumberRadio1.attr('checked')) {
            return true;
        }
        
        if (validateGgNumber(ggNumberInput.val())) {
            showGgNumberInputError();          
            return false;
        } else {
            hideGgNumberInputError();          
            return true;                        
        }
    };
    
    var validateFriendGgNumberInput = function() {
        if (validateGgNumber(friendGgNumberInput.val())) {
            friendGgNumberInputError.show();                      
            return false;
        } else {
            friendGgNumberInputError.hide();                      
            return true;                        
        }
    };
    
    var validateGgNumberSelect = function() {
        if (!ggNumberRadio2.attr('checked')) {
            return true;
        }
        
        var gg = getGgNumberFromSelect();
                
        if (gg == null) {
            showGgNumberSelectError();
            return false;
        } else {
            hideGgNumberSelectError();
            return true;
        }        
    };
    
    var validateStep1 = function() {
        if (ggNumberRadio1.attr('checked')) {
            return validateGgNumberInput();
        }
        
        if (ggNumberRadio2.attr('checked')) {
            return validateGgNumberSelect();
        }                
    }; 
    
    var validateStep2 = function() {
        if (getSelectedPaymentType()) {
            paymentTypeRadioError.hide();
            return true;                
        } else {
            paymentTypeRadioError.show();
            return false;                  
        }        
    };  
    
    /************** 
        UI events
    ***************/
    
    var closeWindow = function() {
        myLightWindow.deactivate();        
    };
    
    var showNextStep = function() {
        currentStep = currentStep.hide().next('.userbar-step').show();
        loadPlugins();    
    };
    
    var showPrevStep = function(navLink) {
        currentStep = currentStep.hide().prev('.userbar-step').show();
    };
    
    var showGgNumberInputError = function() {
        ggNumberInput.parent().addClass('error');
        ggNumberInputError.show();
    };
    
    var hideGgNumberInputError = function() {
        ggNumberInput.parent().removeClass('error');
        ggNumberInputError.hide();
    };
    
    var showGgNumberSelectError = function() {
        ggNumberSelect.parent().addClass('error');
        ggNumberSelectError.show();
    };     
    
    var hideGgNumberSelectError = function() {
        ggNumberSelect.parent().removeClass('error');
        ggNumberSelectError.hide();
    };
    
    var showLoader = function() {
        loader = $j('<div></div>').attr({id: 'loader'}).appendTo(wrapper);
    };
    
    var hideLoader = function() {
        loader.remove();
    };
    
    /*************
        Plugins
    **************/
    
    var loadPlugins = function() {
        wrapper.find('select').each(function() {
            $j(this).selectbox().remove();
            $j('.selectbox-wrapper').css('display', 'none');
        });
    };
    
    var trackGAStep1 = function() {
        pageTracker._trackPageview("/Zakupy_G1_krok1.html");
    }
    
    var trackGAStep2 = function() {
        pageTracker._trackPageview("/Zakupy_G1_krok2.html");
    }
    
    var trackGAStep3 = function() {
        pageTracker._trackPageview("/Zakupy_G1_krok3.html");
    }
        
    init(); 
};
