var Position = {
	
	positionForms : null,
	
	lastPositions : null,
	
	countdownObj : null,
	
	init : function() {
		
		Position.countdownObj = new Array(); 
		
		//Events
		$('.callLong').bind('click',{position: 'Call'}, Position.showCallPut); //on "Call" click
		$('.putLong').bind('click',{position: 'Put'}, Position.showCallPut); //on "Put" click
		$('.closeCallPutFolder').bind('click',Position.hideCallPut); //on close
		$('.approvalApprove').bind('click',Position.onApproveClick); //on approve approval folder
		$('.closeApprovalFolder,.approvalCancel').bind('click', Position.onApproveCancel);
		
		
		//Set the positionForms array
		Position.positionForms = new Array();
		Position.lastPositions = new Array();
		$('.positionForm').each(function(i) {
			var formId = i+1;

            if ($(this).attr('id').indexOf('positionForm_') == 0){
                formId = $(this).attr('id').split('_')[1];
            }

			Position.positionForms[formId] = $(this);
			Position.lastPositions[formId] = 'Call'; //default
			
			//When the amount changes on each form
			$(this).find('input[name="amount"]').bind('keyup',{id : formId}, Position.onAmountChange);
			$(this).find('input[name="amount"]').bind('click', function() {
				$(this).val('');
			});
			
			Position.validateForm(formId);
		});

        /* insert option builder form to positionForms */
        Position.positionForms[0] = $('.positionFormOptionsBuilder');
		
		//events
		$('input.popupClose').bind('click', {}, Position.closePopup);
		
			//login fields
		General.container.find('div.popup input[name="email"]').focus(General.onFocusEmail).blur(General.onBlurEmail);
		General.container.find('div.popup input[name="passwordFake"]').bind('focus', {container: 'div.popup '}, General.onFocusPassword);
		General.container.find('div.popup input[name="password"]').bind('blur', {container: 'div.popup '}, General.onBlurPassword);

	},
	
	/**
		Show the Call/Put form
	**/
	showCallPut : function(e) {
        
		var newPosition = e.data.position; //set the new position (call or put)
		
		var formId = Position.getElementFormId($(this), newPosition + '_position_');

		if (newPosition == 'Call'){
           // console.log($(this));

			$(this).attr('class', '').addClass('callLongSelected');//css('background-image', "url(appProxy/site/home/selectedOption/callBtn.png)");
        }
		else
			$(this).attr('class', '').addClass('putLongSelected');//css('background-image', "url(appProxy/site/home/selectedOption/putBtn.png)");
		
		if (Position.lastPositions[formId] != newPosition) { //position has changed!
			Position.switchCallPut(formId, newPosition); //switch the form (from call to put of vise versa)
		}
		
		Position.positionForms[formId].parent().show('slow');

		Position.lastPositions[formId] = newPosition; //update the lastPositions property

		//do tracking only if user has logged in
		if (AppData.isLoggedIn){
			//get assetId from the clicked button
			var assetId = $(this).parent().parent().parent().parent().parent().find('div.positionTitle').find('select[id*="type"] option:selected').val();
			var optionId = Position.positionForms[formId].find('input[name="optionId"]').val();

			$.post(AppData.url + AppData.pageId + '/selectedPositionTrack',
			{assetId:assetId,direction:e.data.position,optionId:optionId},
			{},
			'json');
		}
	},
	
	/** 
		Switch the form (from Call to Put and vise versa)
	**/
	switchCallPut : function(formId, newPosition) {
        
		Position.positionForms[formId].find('input.closeCallPutFolder').removeClass('closeFolder' + Position.lastPositions[formId]); //Close folder button (X)
		Position.positionForms[formId].find('input.closeCallPutFolder', Position.positionForm).addClass('closeFolder' + newPosition); 
		
		Position.positionForms[formId].find('img.arrow').attr('src', 'appProxy/site/home/optionArr' + newPosition + '.jpg'); //arrow direction (up or down)
		Position.positionForms[formId].find('td.investment input').val(0);
		//switch lower and higher rate text (Above Rate and Below Rate)
		if (newPosition == 'Call') { 
			Position.positionForms[formId].find('td.rateDirection').text(AppData.langHome.aboveRate);
			Position.positionForms[formId].find('span.otherRateDirection').text(AppData.langHome.belowRate); 
			//change the call btn (to "clicked")
			$('#Call_position_' + formId).attr('class', '').addClass('callLongSelected');//css('background-image', "url(appProxy/site/home/selectedOption/callBtn.png)");
			//change the put btn (to unclicked)
			$('#Put_position_' + formId).attr('class', '').addClass('putLong');//css('background-image', "url(appProxy/site/home/longTermOption/putBtn.png)");
		} else {
			Position.positionForms[formId].find('td.rateDirection').text(AppData.langHome.belowRate);
			Position.positionForms[formId].find('span.otherRateDirection').text(AppData.langHome.aboveRate);
			//change the call btn (to unclicked)
			$('#Call_position_' + formId).attr('class', '').addClass('callLong');//css('background-image', "url(appProxy/site/home/longTermOption/callBtn.png)");
			//change the put btn (to clicked)
			$('#Put_position_' + formId).attr('class', '').addClass('putLongSelected');//css('background-image', "url(appProxy/site/home/selectedOption/putBtn.png)");
		}
		
		Position.positionForms[formId].find('input[name="position"]').val(newPosition); //'position' hidden input
		
		Position.positionForms[formId].find('input.positionBtn').removeClass('positionBtn' + Position.lastPositions[formId]); //"Apply" submit button
		Position.positionForms[formId].find('input.positionBtn').addClass('positionBtn' + newPosition);
		
		Position.onAmountChange(formId);
	},
	
	/**
		Close the form
	**/
	hideCallPut : function(formId) {
		if (typeof formId == 'object')
			var formId = Position.getElementFormId($(this), 'close_position_');
			
		Position.positionForms[formId].parent().hide('slow');

		Position.positionForms[formId].find('input[name="amount"]').val(0); //reset the amount
		
		//Change the call/put buttons to unclicked

		$('#Call_position_' + formId).attr('class', '').addClass('callLong');//css('background-image', "url(appProxy/site/home/longTermOption/callBtn.png)");
		$('#Put_position_' + formId).attr('class', '').addClass('putLong');//css('background-image', "url(appProxy/site/home/longTermOption/putBtn.png)");

	},
	
	/**
		open approval box
		f- callback function
	**/
	
	showApproval: function(formId, positionsProps, optionProps, f){
		if (typeof formId == 'object')
			var formId = Position.getElementFormId($(this), 'close_position_');

        //option end date
		var optionEndDate = new Date(parseInt(optionProps.endDate) + AppData.timeZoneOffset);
        var optionEndHour = optionEndDate.getHours();
        var optionEndMinute = optionEndDate.getMinutes();
        if(optionEndHour < 10 ) optionEndHour = '0' + optionEndHour;
        if(optionEndMinute < 10) optionEndMinute = '0' + optionEndMinute;
		
        //fill the approval container with data
        if (typeof(Position.positionForms[formId]) == 'undefined'){
            /* option builder */
            var approvalContainer = $('div#optionsBuilderBox div.approvalFolder');
           
        }else{
            /* option */
            var approvalContainer = Position.positionForms[formId].parent().next();
        }

        if ($('div#optionsBuilderBox div.putCallFolder').is(':visible')){
            $('div#optionsBuilderBox div.putCallFolder').addClass('hidden');
        }

		approvalContainer.find('td#approvalAssetName_' + formId).text(optionProps.assetName)
						 .end()
						 .find('td#approvalRate_' + formId).text(positionsProps.positionRate)
						 .end()
						 .find('td#approvalInvestment_' + formId).text(AppData.accountCurrency + positionsProps.investment)
						 .end()
						 .find('td#approvalExpirationDate_' + formId).text(optionEndHour + ':' + optionEndMinute)
						 .end()
						 .find('input#approvalPositionId_' + formId).val(positionsProps.positionId);
						 
		//show approval container
		approvalContainer.removeClass('hidden');
		//start contdown
		Position.countdownObj[positionsProps.positionId] = new Countdown();
		Position.countdownObj[positionsProps.positionId].init(3, 'approvalCountdown_' + formId, f);
		
		///Countdown.init(10, 'approvalCountdown_' + formId, f);
	},
	
	
	hideApproval: function(formId){
		if (typeof formId == 'object')
			var formId = Position.getElementFormId($(this), 'close_position_');
			
		var approvalContainer = Position.positionForms[formId].parent().next();
		approvalContainer.addClass('hidden')
						 .find('input#approvalPositionId_' + formId).val('');
	},
	
	onApproveClick: function(e){
		var button = $(e.target);
		var formId = button.attr('id').split('_')[1];
		var approvalContainer = Position.positionForms[formId].parent().next();
		var positionId = approvalContainer.find('input#approvalPositionId_' + formId).val();
		
		Position.countdownObj[positionId].updateTimeLeft(1)
		
		
		Position.hideApproval(formId);
	},
	
	onApproveCancel: function(e){
		
		
		var button = $(e.target);
		var formId = button.attr('id').split('_')[1];
		var approvalContainer = Position.positionForms[formId].parent().next();
		var positionId = approvalContainer.find('input#approvalPositionId_' + formId).val();
		
		//cancel add position callback
		Position.countdownObj[positionId].updateOnTimeLeftCallback(null);
		Position.countdownObj[positionId].updateTimeLeft(1);
		
		//cancel position
		//must be a synchronic call
		$.ajax({
			   type: 'POST',
			   url: 'rpcProxy/changePositionStatus/canceled/' + positionId + '/' + true,
			   async: false,
			   success: function(){
			    	Position.hideApproval(formId);
			   }
			 });
		
		
			 /* $.post('rpcProxy/changePositionStatus/canceled/' + positionId + '/' + true, {}, function(){
               Position.hideApproval(formId);
          });
		*/
	},
	//Called from home.js on asset change
	onAssetChange : function(element, assetId, optionElement) {
		
		var formId = Position.getElementFormId(element, 'type');
		
		
		Position.positionForms[formId].find('input[name="rate"]').removeClass(); //remove the old class
		
		Position.positionForms[formId].find('input[name="rate"]').addClass("rate assetId_" + assetId); //update the asset for the current form
		Position.positionForms[formId].find('input[name="assetId"]').val(assetId);
		Position.onOptionChange(optionElement);
	},
	
	//called from home.js on option change
	onOptionChange : function(element) {
		//console.log('in on optionchange');
		var formId = Position.getElementFormId(element, 'expireTime');
		
		//Wait for currSelectedOptions to be ready, then update the position form.
		var runtime = 0;
		var optcheck = setInterval(function checkOptions() {
			runtime += 100; //update runtime (in ms)
			//console.log('checking');
			if (Home.currSelectedOptions.length >=2) {
			
				//console.log('ready');
				//console.log(Home.currSelectedOptions);
				//Itterate through all the currently selected options, to find the wanted option, which is the one that was clicked
				//var optionParams = new Array();
				$.each(Home.currSelectedOptions, function(i, optionParams) { 
					
					if (Position.getElementFormId(optionParams.inputElem, 'expireTime') == formId) {//found! 
						Position.positionForms[formId].find('input[name="optionId"]').val(optionParams.id);
						Position.positionForms[formId].find('input[name="profit"]').val(optionParams.profit);
						Position.positionForms[formId].find('input[name="loss"]').val(optionParams.loss);

						var endTime = new Date(optionParams.endDate);
						Position.positionForms[formId].find('td.date').html(date('d.m.y', endTime) + ' <strong>' + date('H:i', endTime) + '</strong>');
					}
				});
				
				Position.onAmountChange(formId);
				clearInterval(optcheck);
			} else {
				if (runtime > 10000) {//more than 10 seconds, stop
					//console.log('Unable to update option!');
					Position.hideCallPut(formId);
					clearInterval(optcheck);
				}
			}
			
		},100);
	},

	onOptionEnd : function (optionId) {
		//Get option open positions for this option, and remove them from display as they already ended.
		/*console.log('on option end')
		console.log(optionId)
	    console.log("caller is " + arguments.callee.caller.toString());*/
		$('.optionPosition' + optionId).each(function(i) {
			if($(this).next().size() && $(this).next().attr('id').indexOf('openPositionGraphContainer') != -1)
				$(this).next().remove();//remove graph container
				
		});
		
		//console.log($('.optionPosition' + optionId).size());
		//console.log(optionId)
		$('.optionPosition' + optionId).remove();//remove all positions
	},
	
	/**
		When the amount is changed, this function is called to re-calculate the profits and loses. 
	**/
	onAmountChange : function(formId) {
		
		if (typeof formId == 'object')
			var formId = formId.data.id;
		
		var amount = parseInt(Position.positionForms[formId].find('input[name="amount"]').val());
		var profit = parseInt(Position.positionForms[formId].find('input[name="profit"]').val());
		var loss = parseInt(Position.positionForms[formId].find('input[name="loss"]').val());
		
		var position = Position.positionForms[formId].find('input[name="position"]').val();
		
		var profitElement = Position.positionForms[formId].find('td.profitSum span');
		var lossElement = Position.positionForms[formId].find('span.otherProfitSum');

		
		
		if (amount > 0) {
			if (position == 'Call') {
				var payoutAbove = ((100 + profit) * amount)/100;
				var payoutBelow = ((100-loss) * amount)/100;
			} else { //Put
				var payoutBelow = ((100 - 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);


	},
	
	//called from graphs.js when a rate updates
	onRateChange : function(container, rate) {
		container.val(rate);
	},


	//called from validateForm function when the apply button is pressed
	setPositionClick: function(type,formParams){
		var params = new Array();
		$.each(formParams, function(i, obj) {
			params[obj.name] = obj.value;
		});

			$.post(AppData.url + AppData.pageId + '/selectedPositionTrack',
			{assetId:params['assetId'],direction:type},
			{},
			'json');
		},



	validateForm : function(formId) {
		var boxList = $('form#positionForm_' + formId).parent().parent().parent();

        //console.log(formId);
        
       
        /* set the min/max amount that we can bid on position */
        var minimumAmount = 25;
        var maximumAmount = 3000;

        /* check if this is custom option */
        if (boxList.hasClass('customOption')) {
           $.ajax({
					type: "POST",
					url: 'rpcProxy/getMinMaxAmountValues',
					data: 'optionId=' + Position.positionForms[formId].find('input[name="optionId"]').val(),
					async: false,
					dataType: 'json',
					error : function() {
						alert('Unknown Error');
					},
					success: function(data){
                        if (data){
                            minimumAmount = data.min;
                            maximumAmount = data.max;
                        }
                    }
                });

        }

		Position.positionForms[formId].validate({
			rules: {
				amount: {
					required: true,
					number: true,
					min:minimumAmount,
					max:maximumAmount
				}
			},
			messages: {
				amount: {
					required: 'required',
					min: 'min',
					max: 'max',
					number: 'number'
				}
			},
			onfocusout: false,
			onkeyup: false,
			errorPlacement: function(error, element) {
				var errorType = error.text();
				switch(errorType){
					case 'required':Position.showPopup(boxList, AppData.langHome.requiredErrorPopupTitle,  AppData.langHome.requiredErrorPopupMessage, '', false);
									break
					case 'min':Position.showPopup(boxList, AppData.langHome.minErrorPopupTitle,  AppData.langHome.minErrorPopupMessage, AppData.accountCurrency + minimumAmount, false);
									break;
					case 'max':Position.showPopup(boxList, AppData.langHome.maxErrorPopupTitle,  AppData.langHome.maxErrorPopupMessage, AppData.accountCurrency + maximumAmount, false);
									break;
					case 'number':Position.showPopup(boxList, AppData.langHome.numberErrorPopupTitle,  AppData.langHome.numberErrorPopupMessage, '', false);
									break;
				}
				
			},
			submitHandler: function() { //submit the form when everything is valid
				var formParams = Position.positionForms[formId].serializeArray();
				$.ajax({
					type: "POST",
					url: 'rpcProxy/newPosition',
					data: formParams,
					async: false,
					dataType: 'json',
					error : function() {
						alert('Unknown Error');
					},
					success: function(result){
							/*** This code propuse to fix the bug
								when position made on asset that deffers from
								asset that listed in 'select'
							**/ 
							var assetInFormId  = boxList.find('input[name="assetId"]').val();
                            /* check if the selectbox exists because in custom options the selectbox is not exists */
                            if (boxList.find('div.selectbox-wrapperType').length){
                                var assetInSelectId = boxList.find('div.selectbox-wrapperType ul li.selected').attr('id').split('_')[2];

                                if(assetInSelectId != assetInFormId){
                                    Position.showPopup(boxList, AppData.langHome.errorOccuredPoupTitle,  AppData.langHome.errorOccuredPoupMessage, '', false);
                                    setTimeout(function(){
                                        boxList.find('div.selectbox-wrapperType ul li').each(function(){
                                            if($(this).attr('id').split('_')[2] == assetInFormId){
                                                $(this).click();
                                            }
                                        });
                                    }, 3000);
                                    return;
                                }
                            }
							/*** end of bug fix ***/

                            

						if (typeof result == 'object') {
							Position.hideCallPut(formId);
							//insert formId to to formParams array
							formParams.push({name: 'formId', value: formId})
                            Position.addPosition(formParams, result, null, 'open', true);
							//save the position tracking
							Position.setPositionClick("apply", formParams);

						} else { //Error! -> user not logged in
							switch(result){
								case 'notLoggedIn':
									
									boxList.find('div.popup')
																   		.removeClass('hidden')
																   		.find('div.popupTitle span')
																   			.text(AppData.langHome.loginPopupTitle)
																   .end()
																   .end()
																   .find('div#notLoggedIn')
																   		.removeClass('hidden');
												  			break;
								case 'optionIsClosed':
									Position.showPopup(boxList, AppData.langHome.optionIsClosedErrorPopupTitle,  AppData.langHome.optionIsClosedErrorPopupMessage, '', false);
															break;
								case 'insufficientFunds':
									Position.showPopup(boxList, AppData.langHome.insufficientFundsErrorPopupTitle,  AppData.langHome.insufficientFundsIsErrorPopupMessage, '', true);
															break;
								case 'invalidPositionRate':
										Position.showPopup(boxList, AppData.langHome.invalidPositionRate,  AppData.langHome.positionRateIsInvalid, '', false);
										break;
								case 'suspended':
									  Position.showPopup(boxList, AppData.langHome.optionSuspendedPopupTitle,  AppData.langHome.optionSuspendedPopupMessage, '', false);
									  break;
								case 'riskSuspentionActivated':
									   Position.showPopup(boxList, AppData.langHome.riskSuspentionPopupTitle,  AppData.langHome.riskSuspentionPopupMessage, '', false);
									  break;
							}
						}
						
						boxList.find('input[name="amount"]').val(0)
								.end()
								.find('td.profitSum span').text('0')
								.end()
								.find('span.otherProfitSum').text('0'); //reset the amount
				   }

				});
				
				
			}
		});
	},
	
	addPosition : function(formParams, positionProps, f, positionStatus, approval) {
        try{
        //console.info(formParams);
		var positionId = positionProps.positionId;
		var positionRate = positionProps.positionRate;
		
		var params = new Array();
		$.each(formParams, function(i, obj) {
			params[obj.name] = obj.value;
		});
		
		var amount = params.amount;
		
		$.getJSON('rpcProxy/getOptionInfo/' + params.optionId, function(optionProp){
				var optionEndDate = new Date(parseInt(optionProp['endDate']) + AppData.timeZoneOffset);
            	var optionEndHour = optionEndDate.getHours();
            	var optionEndMinute = optionEndDate.getMinutes();
            	if(optionEndHour < 10 ) optionEndHour = '0' + optionEndHour;
            	if(optionEndMinute < 10) optionEndMinute = '0' + optionEndMinute;
				
            	//open approval container
            	positionProps.investment = amount;
				
				var onCountdownEnd = function(){
					//Update balance
					var currentBalance = parseInt($('#currentBalance').text());
					$('#currentBalance').text(currentBalance - amount);
					
					//if cancel button on approval box wasn't pressed
					//add the position and change her status to open
		
		if (optionEndDate.getDate() == General.dateTime.getDate() && optionEndDate.getMonth() == General.dateTime.getMonth()) { //only add poisitions which end today
                       //responsibility to my positions bar moved to MyPositions object
                       //change position status to open
                       $.post('rpcProxy/changePositionStatus/open/' + positionId + '/' + false, {}, function(){
                           if (typeof(params.optionBuilder) != 'undefined')
                                OptionsBuilder.addOption(params.optionId,true);
                            
                       		MyPositions.addTodayPosition(positionProps,optionProp,  params );
                       		/*** temprary disble approval ***/
                       		if(approval){
                       			Position.hideApproval(params.formId);
				}

                             /* call to callback function */
                            if (typeof(f) === "function")
                                f();
                       		/*** end of temp disable ***/
                       });
                       
			}
			else{
				if(approval){
					Position.hideApproval(params.formId);
				}
			}
	               
				};
				
				/*** temprary disble approval ***/
				
				if(approval){
                    Position.showApproval(params.formId, positionProps, optionProp, onCountdownEnd);
                }
            	else{
                    onCountdownEnd();
                }
            
            	/*** temprary disble approval ***/
            	
            	/*** change to 549-552 ***/
            	//onCountdownEnd();
            	/** end of change ***/
            	
            		
            	
			});

        }catch(e){
            console.log(e);
        }
          
	},
	
	
	
	/**
		Get the element form identification digit (1-4 nornally) by removing the prefix
	**/
	getElementFormId : function(element, prefix) {
		return element.attr('id').substr(prefix.length, 1);
	},

       /**
        * Click on the flip button event
        */
       onClickFlip: function( event ) {
           alert('Not Implemented Yet.')
       },
       
       /**
       * Close pop up window
       */
       closePopup: function(event){
       		var popupWindow = $(event.target).parent()
       										 .parent();
       		popupWindow.addClass('hidden')
       				   .find('div.popupMessageContainer, div#notLoggedIn, a#depositLink')
       				   	.addClass('hidden');
       },
       
       showPopup: function(boxList, popupTitle, popupFirstLine, popupSecondLine, showDeposit){
       		
       		if(showDeposit) boxList.find('div.popup a#depositLink').removeClass('hidden');
       		boxList.find('div.popup').find('div.popupTitle span')
       								 .text(popupTitle)
       								 .end()
       								 .find('span.popupWarning').text(popupFirstLine)
       								 .end()
       								 .find('span.popupSum span').text(popupSecondLine)
       								 .end()
       								 .removeClass('hidden')
       								 .find('div.popupMessageContainer')
       								 	.removeClass('hidden');
       							
       },
       
       onMinuteEnd: function(){
           MyPositions.onMinuteEnd();
       },
	  
       
       
       testFunction: function(){
       		$('ul#optionsList').children('li').each(function(i){
       			var selectAssetId = $(this).find('div.selectbox-wrapperType ul li.selected').attr('id').split('_').slice(2,3);
       			var formAssetId = $(this).find('form.positionForm input[name="assetId"]').val();
       			var selectOptionId = $(this).find('div.expireTimeContainer ul li.selected').attr('id').split('_').slice(2,3);
       			var formOptionId = $(this).find('form.positionForm input[name="optionId"]').val();
       			//console.log('box number ' + i + ' assetId in select =' + selectAssetId + ', in form assetId = ' + formAssetId);
       			//console.log('box number ' + i + ' optionId in select =' + selectOptionId + ', in form optionId = ' + formOptionId);
       		});
       }
	
}

$(document).ready(function(){
	Position.init();
});

