var OptionsBuilder = {

	init: function(){

        /* initiate select boxes */
        PlatformNav.container.find('select#optionsBuilderSelect').selectbox(
        {
            inputClass: 'selectboxType',
            containerClass: 'selectbox-wrapperType',
            scrollBar: true,
            chainTitle: false,
            onChange: OptionsBuilder.onAssetChange
        });

        PlatformNav.container.find('select[name="riskSelect"]').selectbox(
        {
            inputClass: 'selectboxType',
            containerClass: 'selectbox-wrapperType',
            scrollBar: true,
            chainTitle: false,
            onChange: OptionsBuilder.onRiskChange
        });
        PlatformNav.container.find('#optionsBuilder div.expireyTime div.input > select').selectbox(
        {
            inputClass: 'selectboxSml',
            containerClass: 'selectboxSml-wrapperType',
            scrollBar: true,
            chainTitle: false,
            onChange: OptionsBuilder.onExpireTimeChange
        });
        /* end select boxes initiation */

        /* events in options builder box */
        var optionsBuilderBox = $('div#optionsBuilderBox');

        optionsBuilderBox.find('li.actionButton input.putLong').unbind('click').bind('click',{type:'Put'},OptionsBuilder.switchCallPut);
        optionsBuilderBox.find('li.actionButton input.callLong').unbind('click').bind('click',{type:'Call'},OptionsBuilder.switchCallPut);

        optionsBuilderBox.find('input.positionBtn').unbind('click').bind('click',{},OptionsBuilder.createOption);

        /* end events in options builder box */

        $.each(optionsBuilderBox.find('div#TimeHour_container ul li'),function(index,elem){
            if (index==11)
                return;
            var val = $(this).text();
            if (parseInt(val) < 10)
                $(this).text('0' + val);
        });
        $.each(optionsBuilderBox.find('div#TimeMinute_container ul li'),function(index,elem){
            if (index==11)
                return;
            var val = $(this).text();
            if (parseInt(val) < 10)
                $(this).text('0' + val);
        });

        /* if there are assets in option builder then open first asset found */
        $('div#optionsBuilderSelect_container ul li:not(.title):first').click();

        /* event for amount change - calculate payout */
        optionsBuilderBox.find('div.investment input[name="investment"]').unbind('keyup').bind('keyup',{}, OptionsBuilder.onAmountChange);
        optionsBuilderBox.find('div.investment input[name="investment"]').bind('click', function() {
            $(this).val('');
            OptionsBuilder.onAmountChange();
        });
	},

    /* create new option and position by customer`s choice */
    createOption: function(event){
        var optionsBuilderBox = $('div#optionsBuilderBox');
        var assetForm         = $('div.putCallFolder form');
        var amount            = $('div#optionsBuilderBox div.investment input[name="investment"]');
        var position          = optionsBuilderBox.find('input[name="currentPosition"]').val();
        var minInvestment     = assetForm.find('input[name="minInvestment"]');
        var maxInvestment     = assetForm.find('input[name="maxInvestment"]');
        var minOptionTime     = assetForm.find('input[name="minOptionTime"]');
        var maxOptionTime     = assetForm.find('input[name="maxOptionTime"]');
        var ruleEndTime       = assetForm.find('input[name="ruleEndTime"]');
        var expireTime        = assetForm.find('td.date');
        var validAmount       = false;


        if (!$.trim(amount.val()).length) /* required test */
            Position.showPopup(optionsBuilderBox, AppData.langHome.requiredErrorPopupTitle,  AppData.langHome.requiredErrorPopupMessage, '', false);
        else if (!/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(amount.val())){ /* number test */
                Position.showPopup(optionsBuilderBox, AppData.langHome.numberErrorPopupTitle,  AppData.langHome.numberErrorPopupMessage, '', false);
                return false;
        }else{
                /* the amount is number */
                /* min value test */
                if (parseFloat(amount.val()) < parseFloat(minInvestment.val())){
                    Position.showPopup(optionsBuilderBox, AppData.langOptionBuilder.minErrorPopupTitle,  AppData.langOptionBuilder.minErrorPopupMessage, AppData.accountCurrency + minInvestment.val(), false);
                }else{
                    /* max value test */
                    if (parseFloat(amount.val()) > parseFloat(maxInvestment.val())){
                        Position.showPopup(optionsBuilderBox, AppData.langOptionBuilder.maxErrorPopupTitle,  AppData.langOptionBuilder.maxErrorPopupMessage, AppData.accountCurrency + maxInvestment.val(), false);
                    }else{
                        /* the amount value passed all the test */
                        validAmount = true;
                    }
                }
        }

        if (validAmount){
            /* check if the expire time selected */
            if ($.trim(expireTime.html()) == AppData.langHome.chooseExpireTime){
                Position.showPopup(optionsBuilderBox, AppData.langOptionBuilder.chooseExpireTimePopupTitle,  AppData.langOptionBuilder.chooseExpireTimePopupMessage, '', false);
                return false;
            }else{
                /* time from the expire select boxes */
                var hours   = optionsBuilderBox.find('div#TimeHour_container   ul li.selected').html();
                var minutes = optionsBuilderBox.find('div#TimeMinute_container ul li.selected').html();

                var customerTime = Date.UTC(General.dateTime.getFullYear(),General.dateTime.getMonth(),General.dateTime.getDate(),hours,minutes,'00');
                //var ruleEndTimeUTC = Date.UTC(General.dateTime.getFullYear(),General.dateTime.getMonth(),General.dateTime.getDate(),hours,minutes,'00');
                var ruleEndTimeHourSplitted = ruleEndTime.val().split(' ');
                var meridian = ruleEndTimeHourSplitted[0];
                var ruleEndTimeHourMinutes = ruleEndTimeHourSplitted[1];
                var ruleEndTimeHour    = ruleEndTimeHourSplitted[1].split(':')[0];
                var ruleEndTimeMinutes = ruleEndTimeHourSplitted[1].split(':')[1];
                
                var ruleEndTime24H = ruleEndTimeHour % 12 + (meridian === "AM"? 0 : 12);
                ruleEndTimeHour = ruleEndTime24H < 10 ? "0" + ruleEndTime24H : ruleEndTime24H;

                var ruleEndTime  = Date.UTC(General.dateTime.getFullYear(),General.dateTime.getMonth(),General.dateTime.getDate(),ruleEndTimeHour,ruleEndTimeMinutes,'00');
                
                /* if the rule end time is 00:00 - this is the next day 00:00*/
                if (ruleEndTimeHour == '00' && ruleEndTimeMinutes == '00'){
                    ruleEndTime = ruleEndTime + 86400000; /* add one day */
                }

                var ruleEndTimeInCustomerOffset = new Date(ruleEndTime + AppData.timeZoneOffset);
                
                var ruleEndTimeInCustomerOffsetHours = ruleEndTimeInCustomerOffset.getHours();
                if (ruleEndTimeInCustomerOffsetHours < 10){
                    ruleEndTimeInCustomerOffsetHours = '0' + ruleEndTimeInCustomerOffsetHours;
                }

                var ruleEndTimeInCustomerOffsetMinutes = ruleEndTimeInCustomerOffset.getMinutes();
                if (ruleEndTimeInCustomerOffsetMinutes < 10){
                    ruleEndTimeInCustomerOffsetMinutes = '0' + ruleEndTimeInCustomerOffsetMinutes;
                }

                var now = General.dateTime.valueOf() - AppData.timeZoneOffset;

                /* the maximum time that the customer can choose for his new option */
                var maximumTimeForOption = now + parseFloat(maxOptionTime.val()*60*1000);
                var maxTime = false;
                var decision = false; /* keeps the earliest max time for option (max position time from the rule or the end time of the rule) */
                if (maximumTimeForOption <= ruleEndTime){
                    maxTime = maximumTimeForOption;
                    decision = 'max';
                }else{
                    maxTime = ruleEndTime;
                    decision = 'rule';
                }
                
                /* validate expire time */
                /* if the time is 00:00 make the positions on the second day */
                /* check if customer choosen expire time is between mix option time and max option time */
                //var temp = true;
                if (customerTime >= now + parseFloat(minOptionTime.val()*60*1000) && (customerTime <= maxTime) || (hours == '00' && minutes == '00')){

                    /* the form is validated  - register new option*/
                    var assetId         = $('div#optionsBuilderSelect_container ul li.selected').attr('id').split('_').splice(2,1)[0];
                    var selectedRisk    = $('div#riskSelect_container li.selected');
                    var ruleId = selectedRisk.attr('id').split('_')[4];
                    var optionRegistered = false; /* if true - the option is written  to DB */
                    var optionId         = false; /* keep the option ID that inserted to DB */

                    var customerTimeGMT = Date.UTC(General.dateTime.getFullYear(),General.dateTime.getMonth(),General.dateTime.getDate(),hours,minutes,'00');

                    $.ajax({
                        type: "POST",
                        url: 'rpcProxy/newOption',
                        data: 'amount=' + amount.val() + '&assetId=' + assetId + '&ruleId=' + ruleId + '&expireHours=' + hours + '&expireMinutes=' + minutes + '&expireTime=' + (customerTimeGMT - General.serverOffset),
                        async: false,
                        dataType: 'json',
					error : function() {
                        General.dialog(AppData.langHome.error, AppData.langHome.error);
					},
					success: function(result){
						if (typeof result == 'object') {
                            /* new option saved to the database */
                            optionRegistered = true;
                            optionId = result.optionId;
						} else {
							switch(result){
								case 'notLoggedIn':
                                        //Position.showPopup(optionsBuilderBox, AppData.langHome.notLoggedInErrorPopupTitle,  AppData.langHome.notLoggedInErrorPopupMessage, '', false);
                                        optionsBuilderBox.find('div.popup')
														 .removeClass('hidden')
														 .find('div.popupTitle span')
														 .text(AppData.langHome.loginPopupTitle)
														 .end()
														 .end()
														 .find('div#notLoggedIn')
														 .removeClass('hidden');
                                        break;
								case 'invalidPositionRate':
										Position.showPopup(optionsBuilderBox, AppData.langHome.invalidPositionRate,  AppData.langHome.positionRateIsInvalid, '', false);
										break;
								case 'suspended':
                                        Position.showPopup(optionsBuilderBox, AppData.langHome.optionSuspendedPopupTitle,  AppData.langHome.optionSuspendedPopupMessage, '', false);
                                        break;
							}
						}
				   }
				});

                /* if option is written to the DB - write the position */
                if (optionRegistered){

                    var formParams = 'amount=' + amount.val() + '&assetId=' + assetId + '&optionId=' + optionId + '&position=' + position + '&customOption=true';

                    var optionObject   = new Object();
                        optionObject.name  = 'optionId';
                        optionObject.value = optionId;
                    var amountObject   = new Object();
                        amountObject.name  = 'amount';
                        amountObject.value = amount.val();
                    var positionObject = new Object();
                        positionObject.name  = 'position';
                        positionObject.value = position;
                    var formObject = new Object();
                        formObject.name = 'formId';
                        formObject.value = 0;
                    var optionBuilderObject = new Object();
                        optionBuilderObject.name = 'optionBuilder';
                        optionBuilderObject.value = true;


                        var params = new Object();
                        params[0] = optionObject;
                        params[1] = amountObject;
                        params[2] = positionObject
                        params[3] = formObject;
                        params[4] = optionBuilderObject;
                        

                    $.ajax({
                        type: "POST",
                        url: 'rpcProxy/newPosition',
                        data: formParams,
                        async: false,
                        dataType: 'json',
                        error : function() {
                            General.dialog(AppData.langHome.error, AppData.langHome.error);
                        },
                        success: function(result){

                            if (typeof result == 'object') {

                                //OptionsBuilder.addOption(optionId,true);

                                /* add position to my open positions */
                                Position.addPosition(params, result,null,'open',true);

                            } else {
                                switch(result){
                                    case 'notLoggedIn':
                                                Position.showPopup(optionsBuilderBox, AppData.langHome.notLoggedInErrorPopupTitle,  AppData.langHome.notLoggedInErrorPopupMessage, '', false);
                                                break;
                                    case 'optionIsClosed':
                                                Position.showPopup(optionsBuilderBox, AppData.langHome.optionIsClosedErrorPopupTitle,  AppData.langHome.optionIsClosedErrorPopupMessage, '', false);
                                                break;
                                    case 'insufficientFunds':
                                                Position.showPopup(optionsBuilderBox, AppData.langHome.insufficientFundsErrorPopupTitle,  AppData.langHome.insufficientFundsIsErrorPopupMessage, '', true);
                                                break;
                                    case 'invalidPositionRate':
                                                Position.showPopup(optionsBuilderBox, AppData.langHome.invalidPositionRate,  AppData.langHome.positionRateIsInvalid, '', false);
                                                break;
                                    case 'suspended':
                                                Position.showPopup(optionsBuilderBox, AppData.langHome.optionSuspendedPopupTitle,  AppData.langHome.optionSuspendedPopupMessage, '', false);
                                                break;
                                    case 'riskSuspentionActivated':
                                                Position.showPopup(optionsBuilderBox, AppData.langHome.riskSuspentionPopupTitle,  AppData.langHome.riskSuspentionPopupMessage, '', false);
                                                break;
                                    case 'invalidAsset':
                                                Position.showPopup(optionsBuilderBox, AppData.langHome.invalidAssetPopupTitle,  AppData.langHome.invalidAssetPopupMessage, '', false);
                                                break;
                                }
                            }
                        }

                    });
                }
                    return false;
                }
                else{
                    minOptionTime = parseFloat(minOptionTime.val()*60*1000);
                    maxOptionTime = parseFloat(maxOptionTime.val()*60*1000);

                    var minTime = new Date(now + minOptionTime + AppData.timeZoneOffset);
                    maxTime = new Date(now + maxOptionTime + AppData.timeZoneOffset);

                    var minHours   = minTime.getHours();
                    var minMinutes = minTime.getMinutes() + 1;

                    if (minMinutes == 60){
                        minMinutes = 0;
                        minHours = minHours + 1;
                    }

                    if (minHours < 10)
                        minHours   = '0' + minHours;
                    if (minMinutes < 10)
                        minMinutes = '0' + minMinutes;

                    var maxHours   = maxTime.getHours();
                    var maxMinutes = maxTime.getMinutes() + 1;

                    if (maxMinutes == 60){
                        maxMinutes = 0;
                        maxHours = maxHours + 1;
                    }

                    if (maxHours < 10)
                        maxHours   = '0' + maxHours;
                    if (maxMinutes < 10)
                        maxMinutes = '0' + maxMinutes;


                    if (decision == 'rule')
                        Position.showPopup(optionsBuilderBox, AppData.langOptionBuilder.wrongExpireTimePopupTitle,  AppData.langOptionBuilder.wrongExpireTimePopupMessage + ' ' +  minHours + ':' + minMinutes + ' and ' + ruleEndTimeInCustomerOffsetHours + ':' + ruleEndTimeInCustomerOffsetMinutes , '', false);
                    else
                        Position.showPopup(optionsBuilderBox, AppData.langOptionBuilder.wrongExpireTimePopupTitle,  AppData.langOptionBuilder.wrongExpireTimePopupMessage + ' ' +  minHours + ':' + minMinutes + ' and ' + maxHours + ':' + maxMinutes , '', false);
                    return false;
                }


                return false;
            }
        }else{
            /* not valid amount */
            return false;
        }
    },

    /**
     * Get options end date and place it on the option box
     */
    getOptionsEndDate: function(){
        var idsArray = new Array();
        /* get ids of the current open custom options */
        $('ul#optionsList').children('li.customOption').find('div.putCallFolder input[name="optionId"]').each(function(index){
            idsArray.push($(this).val());
        });


        $.ajax({
					type: "POST",
					url: AppData.url + AppData.pageId + '/getOptionEndDate',
					data: {optionIds: JSON.stringify(idsArray)},
					async: true,
					dataType: 'json',
					error : function() {
						if (typeof console !== 'undefined') console.log('error');
					},
					success: function(optionProps){
                        if (optionProps){
                            $.each(optionProps,function(index,element){
                                var optionEndDate = new Date(element.endDate /*+ AppData.timeZoneOffset*/);
                                //optionEndDate = Date.UTC(optionEndDate.getFullYear(),optionEndDate.getMonth(),optionEndDate.getDate(),optionEndDate.getHours(),optionEndDate.getMinutes(),'00');
                                //optionEndDate = new Date(optionEndDate);
                                var hours   = optionEndDate.getHours();
                                var minutes = optionEndDate.getMinutes();

                                if (hours<10){
                                    hours = '0' + hours;
                                }
                                if (minutes<10){
                                    minutes = '0' + minutes;
                                }

                                $('ul#optionsList li#customOption_' + element.id + ' div.expireTime').html(element.endDateFormattedHour + ':' + element.endDateFormattedMinute);
                                $('ul#optionsList li#customOption_' + element.id + ' input[name="endDate"]').val(element.endDate);
                            });
                        }
                    }
                });
    },


    onMinuteEnd: function(event){
        var customOptions = $('ul#optionsList li.customOption');
        
        /* check the expire times of the custom options
        * if the custom option expired - remove it from the page
        */
        if (customOptions.length){
                customOptions.each(function(index){
                     var optionEndDate = $(this).find('input[name="endDate"]').val();
                     if (optionEndDate-30 < (General.dateTime.getTime() - AppData.timeZoneOffset)){
                        /* if this is the first option being removed */
                        if ($(this).hasClass('firstCustomOption'))
                            $(this).next().removeClass('secondCustomOption').addClass('firstCustomOption');
                        $(this).remove();
                }
                });
        }
    },


    /**
     *
     * Add Custom Option to the page with the optionId that was received
     *
     */
    addOption: function(optionId){
        /* graph serial id */
        var graphSerialId = $('ul#optionsList > li.customOption').length + 1;

        try{
            var customOption   = $('li#customOptionTemplate').clone();
            var form           = customOption.find('form.positionForm');
            var approvalFolder = customOption.find('div.approvalFolder');

            customOption.attr('id','customOption_' + optionId);
            customOption.removeClass('hidden');

            /* if this is the first custom option created */
            if(graphSerialId == 1){
                customOption.addClass('customOption').addClass('firstCustomOption').addClass('loading');
            }else{
                customOption.addClass('customOption').addClass('secondCustomOption').addClass('loading');
            }

            
        /* count number of regular and custom options */
        var boxNumber = $('ul#optionsList > li').length + 1;

        $.get('rpcProxy/getOptionInfo/' + optionId,
               {},
               function(data){
                    var endDate = new Date(data.endDate);

                    var hours   = endDate.getHours();
                    var minutes = endDate.getMinutes();
                    var year    = endDate.getFullYear().toString();
                    year = year.substr(2, 2);
                    var month   = endDate.getMonth()+1;
                    var day     = endDate.getDate();

                    if (hours<10)   hours   = '0' + hours;
                    if (minutes<10) minutes = '0' + minutes;
                    if (month<10)   month   = '0' + month;
                    if (day<10)     day     = '0' + day;

                    customOption.find('div.assetName  div.name').html(data.assetName);
                    customOption.find('div.optionMain span#upDownAssetName').html(data.assetName);
                    customOption.find('div.expireTimeContainer div.expireTime').html(data.endDateHours + ':' + data.endDateMinutes);

                    customOption.find('ul.actions input.callLong').attr('id','Call_position_' + boxNumber).unbind('click').bind('click',{position:'Call'},Position.showCallPut);
                    customOption.find('ul.actions input.putLong').attr('id','Put_position_' + boxNumber).unbind('click').bind('click',{position:'Put'},Position.showCallPut);
                    customOption.find('ul.actions li.currentPosition div.long').attr('id','feed_asset_' + boxNumber);
                    customOption.find('strong.payout').html(data.profit + '%');

                    /* each graph in custom option should have an id that looks like assetGraph_*assetId*_*serialnum* */
                    customOption.find('div.graphContainer').attr('id','graphContainer_' + data.assetId + '_' + graphSerialId);
                    form.attr('id','positionForm_' + boxNumber);
                    form.find('input.closeCallPutFolder').attr('id','close_position_' + boxNumber);
                    form.find('div.putCallTop td.date').html('<strong>' + day + '.' + month + '.' + year + '</strong>' + '<strong> ' + data.endDateHours + ':' + data.endDateMinutes   + '</strong>')
                    form.find('div.putCallTop input[name="rate"]').addClass('assetId_' + data.assetId);
                    form.find('input[name="optionId"]').val(optionId);
                    form.find('input[name="assetId"]').val(data.assetId).addClass('asset_' + boxNumber);
                    form.find('input[name="profit"]').val(data.profit);
                    form.find('input[name="loss"]').val(data.loss);
                    form.find('input[name="endDate"]').val(data.endDate);

                    /* change id for approval form elements */
                    approvalFolder.find('input#closeApproval_').attr('id','closeApproval_' + boxNumber);
                    approvalFolder.find('td#approvalExpirationDate_').attr('id','approvalExpirationDate_' + boxNumber);
                    approvalFolder.find('td#approvalAssetName_').attr('id','approvalAssetName_' + boxNumber);
                    approvalFolder.find('td#approvalRate_').attr('id','approvalRate_' + boxNumber);
                    approvalFolder.find('td#approvalInvestment_').attr('id','approvalInvestment_' + boxNumber);
                    approvalFolder.find('div#approvalCountdown_').attr('id','approvalCountdown_' + boxNumber);
                    approvalFolder.find('input#approve_').attr('id','approve_' + boxNumber);
                    approvalFolder.find('input#cancel_').attr('id','cancel_' + boxNumber);
                    approvalFolder.find('input#approvalPositionId_').attr('id','approvalPositionId_' + boxNumber);


                    //$('ul#optionsList').append(customOption);

                    /* if there is already at least one custom option*/
                    if ($('ul#optionsList li.firstCustomOption').length){

                        //var numberOfCustomOptions = $('ul#optionsList li.firstCustomOption').length + 1;

                        /* insert this option before the first custom option */
                        customOption.insertBefore($('ul#optionsList li.firstCustomOption'));
                        
                        /* swith the feed_asset_id between boxes */
                        //var firstOptionFeedAssetId = customOption.find('ul.actions li.currentPosition div.long').attr('id');
                        //var secondOptionFeedAssetId = customOption.next().find('ul.actions li.currentPosition div.long').attr('id');

                        /* set the feed_asset_id of the second option to the first option */
                        //$('ul#optionsList li.customOption:first').find('ul.actions li.currentPosition div.long').attr('id',secondOptionFeedAssetId);

                        /* set the feed_asset_id of the first option to the second option */
                        //$('ul#optionsList li.customOption:first').next().find('ul.actions li.currentPosition div.long').attr('id',firstOptionFeedAssetId);


                    }else{
                        /* there is no custom options yet */
                        customOption.insertAfter($('ul#optionsList > li:not(.customOption):last'));
                    }

                    /* set first class to first element and second for other elements */
                    var customOptions = $('ul#optionsList > li.customOption');
                    customOptions.removeClass('secondCustomOption').removeClass('firstCustomOption');
                    customOptions.addClass('secondCustomOption');
                    customOptions.filter(':first').addClass('firstCustomOption').removeClass('secondCustomOption');
                    $('ul#optionsList li.customOption div.assetChart').remove();

                    /* clear the amount box and close the make position div */
                    $('div#optionsBuilderBox div.investmentInputWrapper input').val('');
                    $('div#optionsBuilderBox div.putCallFolder').addClass('hidden');
                    $('div#optionsBuilderBox div.profitMessage').show();
                    OptionsBuilder.onAmountChange();

                    /* init the position forms array */
                    Position.init();

                    /* the new option was inserted to the start of the list and therefore the feed_asset_ numbers are wrong
                     * we will do a bubble sort in order to fix the order of the boxes
                     * the wrong order of the boxes causes to wrong rate to appear in the box
                     */
                    var x, y, holder;
                    var customOptionsArr = $('ul#optionsList li.customOption');
                    for(x = 0; x < customOptionsArr.length; x++) {
                        for(y = 0; y < (customOptionsArr.length-1); y++) {
                            if($(customOptionsArr[y]).find('ul.actions li.currentPosition div.long').attr('id').split('_')[2] > $(customOptionsArr[y+1]).find('ul.actions li.currentPosition div.long').attr('id').split('_')[2]) {
                            holder = $(customOptionsArr[y+1]).find('ul.actions li.currentPosition div.long').attr('id');
                            $(customOptionsArr[y+1]).find('ul.actions li.currentPosition div.long').attr('id',$(customOptionsArr[y]).find('ul.actions li.currentPosition div.long').attr('id'));
                            $(customOptionsArr[y]).find('ul.actions li.currentPosition div.long').attr('id',holder);
                        }
                    }
                  }


                    Graphs.init();

                    /* after graphs finished to init - show the custom option boxes */
                    Home.completeLoadingBoxList();
               },
               'json');
        }catch(e){
            console.log(e);
        }

    },

    /**
     *
     * This function is called when the call/put is clicked
     *
     */
    switchCallPut: function(event){
        var type = event.data.type; /* call or put clicked */
        var optionBuilderBox = $('div#optionsBuilderBox');
        var assetForm        = optionBuilderBox.find('div.putCallFolder');
        var prevPosition     = assetForm.find('input[name="currentPosition"]').val();

        /* if payout message visible - hide it */
        optionBuilderBox.find('div.profitMessage').hide();
	
	

        var arrowImg = $('<img>').addClass('arrow').attr('src','appProxy/site/home/optionArr' + type + '.jpg').attr('alt','direction');

        /* remove current image if found and insert new image */
        assetForm.find('div.assetRate').find('img').remove().end().append(arrowImg);
        
        /* change apply button */
        assetForm.find('input.positionBtn').removeClass('positionBtnPut')
                                           .removeClass('positionBtnCall')
                                           .addClass('positionBtn' + type);

        assetForm.find('input[name="currentPosition"]').val(type);

        /* if the customer changed from call to put or vice versa */
        if (prevPosition != type && prevPosition != ''){
            var profitElement = assetForm.find('td.rateDirection');
            var lossElement   = assetForm.find('span.otherRateDirection');

            /* switch between profit and loss values */
            var saveProfitElement = profitElement.html();

            profitElement.html(lossElement.html());
            lossElement.html(saveProfitElement);

		optionBuilderBox.find('div.investmentInputWrapper input').val(0);
		OptionsBuilder.onAmountChange();
        }else{
            OptionsBuilder.onAmountChange();
	    
        }

        /* if this is the first time customer clicked on call or put then enable form */
        if (assetForm.hasClass('hidden'))
            assetForm.removeClass('hidden');

        //do tracking only if user has logged in
		if (AppData.isLoggedIn){
			//get assetId from the clicked button
            var assetId  = $(this).parents('div#optionsBuilderBox').find('div#optionsBuilderSelect_container ul li.selected').attr('id').split('_')[2];
            var optionId = $(this).parents('div#optionsBuilderBox').find('div.putCallFolder').find('input[name="optionId"]').val();

            

			$.post(AppData.url + AppData.pageId + '/selectedPositionTrack',
			{assetId:assetId,direction:type,optionId:optionId},
			{},
			'json');
		}

    },

    /* This event occurs when the user change asset in the asset select box in the options builder */
    onAssetChange: function(event){
        if (!$('div#optionsBuilderSelect_container ul li.selected').length) return;

        var assetId = $('div#optionsBuilderSelect_container ul li.selected').attr('id').split('_').splice(2,1)[0];

        $.post(AppData.url + AppData.pageId + '/loadProfitControlRisk',
               {assetId: assetId},
		       function(data){
                    if ($.isEmptyObject(data)){
                      /* if no rules for this option - remove the asset from the select box */
                      $('div#optionsBuilderSelect_container ul li.selected').addClass('hidden');
                      /* select first rule */
                      $('div#optionsBuilderSelect_container ul li:not([class*="hidden"])').filter(':not(.title):first').click();
                    }

                    /* go through the rules and insert profit/loss combinations to the select */
                    var options    = new Array();
                    var riskSelectElem = $('select[name="riskSelect"]')
                    /* remove old options */
                    riskSelectElem.find('option').remove();
                    $.each(data,function(index,rule){

                        rule.loss = parseInt(100 - parseInt(rule.loss));

                        var option = $('<option></option>').val(rule.profit + '_' + rule.loss + '_' + rule.id)
                                                           .text(rule.profit + '% / ' + rule.loss + '%');
                        riskSelectElem.append(option);
                    });

                    /* remove current select with old values */
                    $('div#riskSelect_container').remove();
                    $('input#riskSelect_input').remove();

                    /* init selectbox with the new profit/loss combinations */
                    PlatformNav.container.find('select[name="riskSelect"]').selectbox(
                    {
                        inputClass: 'selectboxType',
                        containerClass: 'selectbox-wrapperType',
                        scrollBar: true,
                        chainTitle: false,
                        onChange: OptionsBuilder.onRiskChange
                    });

                    $('div#optionsBuilderBox div.assetGraph').attr('id','assetGraph_' + assetId);
                    $('div#optionsBuilderBox div.putCallFolder input[name="optionId"]').val('-' + assetId);
                    Graphs.notifyAssetChange($('div#optionsBuilderBox div.graphContainer'));
                    OptionsBuilder.onRiskChange();
                    OptionsBuilder.onAmountChange();

               },
               'json');

          var optionBuilderBox = $('div#optionsBuilderBox');
          var assetForm        = optionBuilderBox.find('div.putCallFolder');
          var selectedAsset    = optionBuilderBox.find('div#optionsBuilderSelect_container ul li.selected');

          /* update asset name */
          assetForm.find('div.assetName').text(selectedAsset.text());

          /* get current rate for selected asset */
          $.post(AppData.url + AppData.pageId + '/loadAssetCurrentRate',
                  {assetId:assetId},
                  function(data){
                    /* if rate is up */
                    if (data.color == 1){
                        assetForm.find('div.assetRate').html(data.rate).css('color','#024301');
                        /* update asset id for live feed */
                        optionBuilderBox.find('li.currentPosition div').attr('id','feed_asset_0').html(data.rate).css('color','#024301');
                    }
                    else if (data.color == 0){
                        assetForm.find('div.assetRate').html(data.rate).css('color','#C30700');
                        /* update asset id for live feed */
                        optionBuilderBox.find('li.currentPosition div').attr('id','feed_asset_0').html(data.rate).css('color','#C30700');
                    }



                    $('<div/>').attr('id', 'assetChart_0').addClass('assetChart').appendTo(optionBuilderBox.find('div.assetGraph')[0]);


                  },
                  'json');

    },

	/**
	 * Load the asset graph for the custom option
	 */
	loadGraph : function () {
		//Init graph
		Graphs.graphs['assetChart_0'] = {
					series : {},
					options : {},
					currRate: null,
					itemName: null,
					container:  $('div#assetChart_0').parent()[0],
					plot : null
				};

		//Load data into it
		Graphs.loadChartData('assetChart_0', true);
	},

    /* this event occurs when the customers changes the profit/loss combination */
    onRiskChange: function(event){
        /* change the display of the selected profit/loss combination */
        var selectedLi    = $('div#riskSelect_container li.selected');
        var box           = $('div#optionsBuilderBox');
        var assetForm     = box.find('div.putCallFolder');

        var profitLossCombination = selectedLi.attr('id').split('_');
        var profit = profitLossCombination[2];
        var loss   = profitLossCombination[3];
        var ruleId = profitLossCombination[4];

        $('input#riskSelect_input').val(''); /* clear the current selection */
        $('div.riskSelectOverlay').html(
                                         '<div class="profitTxt">' + profit + '%' + '</div>' +
                                         '<div class="lossTxt">' + loss + '%' + '</div>'
                                       );


        $.post(AppData.url + AppData.pageId + '/getRule',
               {ruleId: ruleId},
		       function(rule){
                    var ruleProps = rule[0];
                    assetForm.find('input[name="minInvestment"]').val(ruleProps.minInvestment);
                    assetForm.find('input[name="maxInvestment"]').val(ruleProps.maxInvestment);
                    assetForm.find('input[name="minOptionTime"]').val(ruleProps.minOptionTime);
                    assetForm.find('input[name="maxOptionTime"]').val(ruleProps.maxOptionTime);
                    assetForm.find('input[name="ruleEndTime"]').val(ruleProps.endTime);
                    OptionsBuilder.onAmountChange();
               },
               'json');

        assetForm.find('input[name="profit"]').val(profit);
        assetForm.find('input[name="loss"]').val(loss);
        box.find('div.payoutPercentage').html(profit + '%');
        box.find('div.insuranceMessage').html(loss + '% ' + AppData.langOptionBuilder.insuranceRate);
    },

    /* this event occurs when the customers changes the expire time */
    onExpireTimeChange: function(event){
        var assetForm     = $('div#optionsBuilderBox div.putCallFolder');

        var hours = $('div#optionsBuilderBox div#TimeHour_container ul li.selected').html();
        var minutes = $('div#optionsBuilderBox div#TimeMinute_container ul li.selected').html();

        if (hours != null && hours!= 'Hour' && minutes != null && minutes!= 'Minute'){

            var day   = General.dateTime.getDate();
            var month = General.dateTime.getMonth()+1;
            var year  = General.dateTime.getFullYear();
            if (day < 10) day = '0' + day;
            if (month < 10) month = '0' + month;

            assetForm.find('table td.date').html(day + '.' + month + '.' + year + '&nbsp;&nbsp;<strong>' +  hours + ':' + minutes + '</strong>');
        }
    },

    /* this function is called from graphs.js when item update occurs */
    onItemUpdate: function(item, itemUpdate, itemName) {
         try{
            if (AppData.isLoggedIn){
                var pricingRate = itemUpdate.getNewValue('pricingRate');
                var rate        = itemUpdate.getNewValue('rate');
            }else{
                var pricingRate = itemUpdate.getNewValue('pricingRate');
                var rate        = itemUpdate.getNewValue('rate');
                var tailDigits = pricingRate.indexOf('.');
                tailDigits = pricingRate.toString().length-tailDigits-1;
                var signs = new Array('-','+');
                var randomSign  = signs[Math.round(Math.random())];    /* get random sign */
                var randomShift = 0.0002+(Math.random()*(0.0004-0.0002)); /* get random number between 0.2 and 0.7 */
                eval('pricingRate=parseFloat(pricingRate' + randomSign + 'pricingRate*' + randomShift + ').toFixed(' + tailDigits + ')');
                eval('rate=parseFloat(rate' + randomSign + 'rate*' + randomShift + ').toFixed(' + tailDigits + ')');
            }
        }catch(ex){
            console.log(ex);
        }


         var color = parseInt(itemUpdate.getNewValue('color'));
         var lastUpdated = itemUpdate.getNewValue('lastUpdated');

         var optionBuilderBox = $('div#optionsBuilderBox');
         var assetForm        = optionBuilderBox.find('div.putCallFolder');

         var graphObject = Graphs.graphs['assetChart_0'];

         /* check if this is the item that we need to update
          * assetChart_0  is the id of the graph object
          * */
         if (itemName == graphObject.itemName){
			if (color){
			 assetForm.find('div.assetRate').html(pricingRate).css('color','#024301');
			 /* update asset id for live feed */
			 optionBuilderBox.find('li.currentPosition div').html(pricingRate).css('color','#024301');
			}else{
			  assetForm.find('div.assetRate').html(pricingRate).css('color','#C30700');
			  /* update asset id for live feed */
			  optionBuilderBox.find('li.currentPosition div').html(pricingRate).css('color','#C30700');
			}

			/* add row image to the rate */
			var currentPositionType = assetForm.find('input[name="currentPosition"]').val();
			if (currentPositionType != ''){
				var arrowImg = $('<img>').addClass('arrow').attr('src','appProxy/site/home/optionArr' + currentPositionType + '.jpg').attr('alt','direction');
				/* remove current image if found and insert new image */
				assetForm.find('div.assetRate').find('img').remove().end().append(arrowImg);
			}

         }

    },

    /*
     * When the amount is changed, this function is called to re-calculate the profits and loses.
     */
	onAmountChange : function(event) {

        var optionsBuilderBox = $('div#optionsBuilderBox');
        var assetForm = optionsBuilderBox.find('div.putCallFolder');

		var amount = parseInt(optionsBuilderBox.find('div.investment input[name="investment"]').val());
		var profit = parseInt(assetForm.find('input[name="profit"]').val());
		var loss   = parseInt(assetForm.find('input[name="loss"]').val());

		var profitElement = assetForm.find('td.profitSum span');
		var lossElement   = assetForm.find('span.otherProfitSum');

        var currentPosition = assetForm.find('input[name="currentPosition"]').val();

		if (amount > 0) {
			if (currentPosition == 'Call') {
				var payoutAbove = ((100 + profit) * amount)/100;
				var payoutBelow = ((loss) * amount)/100;
			} else { //Put
				var payoutBelow = ((loss) * amount)/100; //This should be above
				var payoutAbove = ((100 + profit) * amount)/100; //This should be Below
			}
		} else { //no valid amount
			var payoutAbove = '0'; //reset both fields to zero
			var payoutBelow = '0';
		}

		profitElement.html(payoutAbove);
		lossElement.html(payoutBelow);
	}

}

$(document).ready(function() {
	OptionsBuilder.init();
});
