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,
			hoverClass:'selectHover'
        });

        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('.approvalApprove').bind('click',Position.onApproveClick); //on approve approval folder
		 optionsBuilderBox.find('.closeApprovalFolder, .approvalCancel').bind('click', Position.onApproveCancel);

        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();
        });

$('.expireRow .date').html(AppData.langHome.chooseExpireTime);
	},

    /* 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('.expireRow .date');
        var validAmount       = false;


        if (!$.trim(amount.val()).length) /* required test */
            General.generalErrorDialog(AppData.langHome.requiredErrorPopupTitle,  AppData.langHome.requiredErrorPopupMessage, '', false);
        else if (!/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(amount.val())){ /* number test */
                General.generalErrorDialog(AppData.langHome.numberErrorPopupTitle,  AppData.langHome.numberErrorPopupMessage, '', false);
                return false;
        }else{
                /* the amount is number */
                /* min value test */
                if (parseFloat(amount.val()) < parseFloat(minInvestment.val())){
                    General.generalErrorDialog(AppData.langOptionBuilder.minErrorPopupTitle,  AppData.langOptionBuilder.minErrorPopupMessage, AppData.accountCurrency + minInvestment.val(), false);
                }else{
                    /* max value test */
                    if (parseFloat(amount.val()) > parseFloat(maxInvestment.val())){
                        General.generalErrorDialog(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){
                General.generalErrorDialog(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');

                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+General.browserOffset+AppData.timeZoneOffset+parseFloat(minOptionTime.val()*60*1000)&&(customerTime<=maxTime+General.browserOffset+AppData.timeZoneOffset)){
                    /* 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);
                           General.loginDialog();
                                        break;
								case 'invalidPositionRate':
										General.generalErrorDialog(AppData.langHome.invalidPositionRate,  AppData.langHome.positionRateIsInvalid, '', false);
										break;
								case 'suspended':
                                        General.generalErrorDialog(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':
                                                General.generalErrorDialog(AppData.langHome.notLoggedInErrorPopupTitle,  AppData.langHome.notLoggedInErrorPopupMessage, '', false);
                                                break;
                                    case 'optionIsClosed':
                                                General.generalErrorDialog(AppData.langHome.optionIsClosedErrorPopupTitle,  AppData.langHome.optionIsClosedErrorPopupMessage, '', false);
                                                break;
                                    case 'insufficientFunds':
                                                General.generalErrorDialog(AppData.langHome.insufficientFundsErrorPopupTitle,  AppData.langHome.insufficientFundsIsErrorPopupMessage, '', true);
                                                break;
                                    case 'invalidPositionRate':
                                                General.generalErrorDialog(AppData.langHome.invalidPositionRate,  AppData.langHome.positionRateIsInvalid, '', false);
                                                break;
                                    case 'suspended':
                                                General.generalErrorDialog(AppData.langHome.optionSuspendedPopupTitle,  AppData.langHome.optionSuspendedPopupMessage, '', false);
                                                break;
                                    case 'riskSuspentionActivated':
                                                General.generalErrorDialog(AppData.langHome.riskSuspentionPopupTitle,  AppData.langHome.riskSuspentionPopupMessage, '', false);
                                                break;
                                    case 'invalidAsset':
                                                General.generalErrorDialog(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);
                    var 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;

                    General.generalErrorDialog(AppData.langOptionBuilder.wrongExpireTimePopupTitle,  AppData.langOptionBuilder.wrongExpireTimePopupMessage + ' ' +  minHours + ':' + minMinutes + ' and ' + ruleEndTimeHour + ':' + ruleEndTimeMinutes , '', false);
                    return false;
                }


                return false;
            }
        }else{
            /* not valid amount */
            return false;
        }
    },

    /* add option box to the page */
    addOption: function(optionId){
        /* graph serial id */
        var graphSerialId = $('ul#optionsList > li.customOption').not('#customOptionTemplate').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').not('.binaryBottomBorder').not('#customOptionTemplate').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.positionTitle  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 );
                    form.attr('id','positionForm_' + boxNumber);
                    form.find('input.closeCallPutFolder').attr('id','close_position_' + boxNumber);
                    form.find('.title .date').html(day + '.' + month + '.' + year +' '+ data.endDateHours + ':' + data.endDateMinutes);
                    form.find('.raterow .value input.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*/
                    customOption.attr('style','').addClass('singleProOption').find('ul.actions li').removeClass('hidden').attr('style','');

                    customOption.insertBefore($('ul#optionsList > li: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();

                    var curRate0 = form.find('#positionForm_' + boxNumber + ' input.rate').val();
                    var curRate1 = form.find('#positionForm_' + boxNumber + ' input.rate').text();
                    var curRate2 = form.find('#positionForm_' + boxNumber + ' input.rate').html();
                    console.log(curRate0, curRate1, curRate2)
                    //customOption.find('ul.actions li.currentPosition div.long#feed_asset_' + boxNumber).html(curRate);
               },
               'json');
        }catch(e){
            console.log(e);
        }

    },

    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();

        var arrowImg = $('<img>').addClass('arrow').attr('src','appProxy/site/homePro/optionArr' + type + '.png').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('.profitSum, .assetRate').css("color",(type=='Put')?'#75AFC4':'#75AFC4');

        assetForm.find('input[name="currentPosition"]').val(type);

        /* if the customer changed from call to put or vice versa */
        if (prevPosition != type){
            var profitElement = assetForm.find('td.rateDirection');
            var lossElement   = assetForm.find('span.otherRateDirection');

            /* switch between profit and loss values */
            var saveProfitElement = profitElement.html();
            if(type == 'Call'){
                profitElement.html(AppData.langHome.aboveRate);
                lossElement.html(AppData.langHome.belowRate);
            }
            else{
                profitElement.html(AppData.langHome.belowRate);
                lossElement.html(AppData.langHome.aboveRate);
            }
        }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');

if (!assetForm.is(":visible"))
     assetForm.show();
 
    },

    /* 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){

                    /* 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','#07A003');
                        /* update asset id for live feed */
                        optionBuilderBox.find('li.currentPosition div').attr('id','feed_asset_0').html(data.rate).css('color','#2A5392');
                    }
                    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','#2A5392');
                    }



                    $('<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 optionsBuilderBox = $('div#optionsBuilderBox');
        var assetForm = optionsBuilderBox.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);
               },
               'json');

        assetForm.find('input[name="profit"]').val(profit);
        assetForm.find('input[name="loss"]').val(loss);
          optionsBuilderBox.find('div.payoutPercentage').html(profit + '%');
        optionsBuilderBox.find('div.insuranceMessage').html(loss + '% ' + AppData.langHome.insuranceRate);
        optionsBuilderBox.find('strong.payout').html(profit + '%');
        optionsBuilderBox.find('strong.insurance').html(loss + '%');


		var amount = parseInt(optionsBuilderBox.find('div.investment input[name="investment"]').val());
		var currentPosition = assetForm.find('input[name="currentPosition"]').val();

		if (amount > 0) {
			if (currentPosition == 'Call') {
				var payoutAbove = ((100 + parseInt(profit)) * amount)/100;
				var payoutBelow = ((parseInt(loss)) * amount)/100;
			}
			else { //Put
				var payoutBelow = ((parseInt(loss)) * amount)/100; //This should be above
				var payoutAbove = ((100 + parseInt(profit)) * amount)/100; //This should be Below
			}
		}
		else { //no valid amount
			var payoutAbove = '0'; //reset both fields to zero
			var payoutBelow = '0';
		}

		var profitElement = assetForm.find('td.profitSum span');
		var lossElement   = assetForm.find('span.otherProfitSum');

		profitElement.html(payoutAbove);
		lossElement.html(payoutBelow);
    },

    /* 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('.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) {

		 var pricingRate = itemUpdate.getNewValue('pricingRate');
         var rate        = itemUpdate.getNewValue('rate');
         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(rate).css('color','#2a5392');
			 /* update asset id for live feed */
			 optionBuilderBox.find('li.currentPosition div').html(rate).css('color','#2a5392');
			}else{
			  assetForm.find('div.assetRate').html(rate).css('color','#c31919');
			  /* update asset id for live feed */
			  optionBuilderBox.find('li.currentPosition div').html(rate).css('color','#c31919');
			}

			/* 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/homePro/optionArr' + currentPositionType + '.png').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();
});
