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.langHome.minErrorPopupTitle,  AppData.langHome.minErrorPopupMessage, AppData.accountCurrency + minInvestment.val(), false);
                }else{
                    /* max value test */
                    if (parseFloat(amount.val()) > parseFloat(maxInvestment.val())){
                        Position.showPopup(optionsBuilderBox, AppData.langHome.maxErrorPopupTitle,  AppData.langHome.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.langHome.chooseExpireTimePopupTitle,  AppData.langHome.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 now = General.dateTime.valueOf() - AppData.timeZoneOffset;

		// recalculate end time to display in alert
		var ruleEndTimeReal = ruleEndTime + AppData.timeZoneOffset;
		var ruleEndTimeDate = new Date(ruleEndTimeReal);
		var ruleEndTimeHour2 = ruleEndTimeDate.getHours();
		if (ruleEndTimeHour2 < 10) ruleEndTimeHour2 = '0' + ruleEndTimeHour2;
		var ruleEndTimeMinutes2 = ruleEndTimeDate.getMinutes();
		if (ruleEndTimeMinutes2 < 10) ruleEndTimeMinutes2 = '0' + ruleEndTimeMinutes2;


                /* validate expire time */
 	 	 /* check if customer choosen expire time is between mix option time and max option time */
 	 	  //if (customerTime >= now + parseFloat(minOptionTime.val()*60*1000) && (customerTime <= ruleEndTime) || (hours == '00' && minutes == '00')){
		  if (customerTime >= now + General.browserOffset + AppData.timeZoneOffset + parseFloat(minOptionTime.val()*60*1000) && (customerTime <= ruleEndTime + AppData.timeZoneOffset + General.browserOffset)){

                    /* 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: '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;

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


		// set the minimum time of the alert to the first possible time
		if (minMinutes != '00' && !(minMinutes % 5 == 0)) {
			var minMinutesOld = new Number(minMinutes);
			var minMinutesNew = new Number(0);
			minMinutesNew = minMinutesOld + (5 - (minMinutesOld % 5));
			if (minMinutesNew < 10) minMinutesNew = '0' + minMinutesNew;
			else if (minMinutesNew == 60) {
				minMinutesNew = '00';
				var minHoursThis = new Number(minHours);
				minHoursThis++;
				minHours = minHoursThis;
				if (minHoursThis < 10) minHours = '0' + minHoursThis;
				else if (minHoursThis == 24) minHours = '00';
			}
			minMinutes = minMinutesNew;
		}

if(minHours > ruleEndTimeHour2 || (minHours == ruleEndTimeHour2 && minMinutes > ruleEndTimeMinutes2)) {
	Position.showPopup(optionsBuilderBox, AppData.langOptionBuilder.wrongExpireTimePopupTitle,  AppData.langOptionBuilder.tooLateToSetAnOption, '', false);
} else {
	Position.showPopup(optionsBuilderBox, AppData.langOptionBuilder.wrongExpireTimePopupTitle,  AppData.langOptionBuilder.wrongExpireTimePopupMessage + ' ' +  minHours + ':' + minMinutes + ' and ' + ruleEndTimeHour2 + ':' + ruleEndTimeMinutes2 , '', false);

}
//Position.showPopup(optionsBuilderBox, AppData.langOptionBuilder.wrongExpireTimePopupTitle,  AppData.langOptionBuilder.wrongExpireTimePopupMessage + ' ' +  minHours + ':' + minMinutes + ' and ' + ruleEndTimeHour + ':' + ruleEndTimeMinutes , '', 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');


        /* get number of current custom options on the page */
        var numberOfCustomOptions = $('ul#optionsList li.customOption').length;

       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');
 	   }
        /* if this is the first custom option - add customOptionFirst class */
        if (!numberOfCustomOptions)
            customOption.addClass('customOptionFirst');

        /* 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(hours + ':' + minutes);*/

                    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 + '_' + 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 valign="middle">').addClass('arrow').attr('src','appProxy/site/home/optionsBuilder/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');
               optionBuilderBox.find('div.investmentInputWrapper input').val(0);
                OptionsBuilder.onAmountChange();

            /* switch between profit and loss values */
            var saveProfitElement = profitElement.html();
            
            profitElement.html(lossElement.html());
            lossElement.html(saveProfitElement);
        }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){

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

		 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(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 valign="middle">').addClass('arrow').attr('src','appProxy/site/home/optionsBuilder/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();
}); 
