jQuery.fn.MarketCalc = function(opts){
	if($(this).size() != 0){
		var options = $.extend({
				resFee : 9.9,
				mrp : 1273
			},opts);
		var $$ = $(this);
		var curData = {};
		
		var inputDataHolder = $$.find("div.inputDataHolder");
		
		var validateInputData = function(){
			curData.FIO = inputDataHolder.find("input[@name=FIO]").val();
			curData.HomePrice = inputDataHolder.find("input[@name=HomePrice]").val();
			curData.InitialInput = inputDataHolder.find("input[@name=InitialInput]").val();
			curData.CreditPeriod = parseFloat(inputDataHolder.find("input[@name=CreditPeriod]").val());
			curData.Term = roundTo2Prec(curData.CreditPeriod/12);
			curData.TermCategory = getTermCategory(curData.Term);
			curData.SummCategory = getSummCategory(curData.InitialInput);
			curData.AdultNum = inputDataHolder.find("input[@name=AdultNum]").val();
			curData.ChildNum = inputDataHolder.find("input[@name=ChildNum]").val();
			curData.Income	 = inputDataHolder.find("input[@name=Income]").val();
			
			return true;
		}
		
		var calculateResult = function(){
			if(validateInputData()){
				$("#resFIO").text(curData.FIO);
				$("#resHomePrice100").text(curData.HomePrice);
				$("#rerInitialInput").text( curData.InitialInput+"%");
				$("#resInitIncome").text(Math.round((curData.InitialInput/100)*curData.HomePrice));
				$("#resCreditTotalPerc").text( (100 - curData.InitialInput)+"%");
				$("#resCreditTotal").text(curData.HomePrice-$("#resInitIncome").text());
				$("#resCreditTime").text(curData.CreditPeriod);
				if($("#resFee").val() == ""){
					$("#resFee").val(options.resFee);
				}else{
					options.resFee = $("#resFee").val();
				}
				$("#resAbultNumber").text(curData.AdultNum);
				$("#resChildrenNumber").text(curData.ChildNum);
				$("#resPerMonthPayment,#sumPerMPay").text((function(){
						if( $$.find("#resOptPaymentType option:selected").val() == "Ann"){
							return roundTo2Prec(
							$("#resCreditTotal").text()*
							(options.resFee/100)/12/(1-Math.pow(1+(options.resFee/100)/12,-curData.CreditPeriod)));

						}
						else{
							return roundTo2Prec(
							$("#resCreditTotal").text()*((options.resFee/100)/360*30+1/curData.CreditPeriod));
						}
					})());
				$("#resPropertyEnsh").text(roundTo2Prec((curData.HomePrice*0.0025)/12));
				$("#resLifeEnsh").text(roundTo2Prec(($("#resCreditTotal").text()*0.003)/12));
				$("#resKFGIKEnsh").text((function(){
						if( $$.find("#resKFGIKEnshType option:selected").val() == "Annual"){
							return roundTo2Prec(
							$("#resCreditTotal").text()*AnnualYears[curData.SummCategory-1][curData.TermCategory-1]/100/12
							);
						}
						else{
							return roundTo2Prec(
							$("#resCreditTotal").text()*OneTimePercents[curData.SummCategory-1][curData.TermCategory-1]/100
							);
						}
					})());
				$("#resCreditFeeCommission, #sumCridetComission").text(roundTo2Prec($("#resCreditTotal").text()*0.02));
				$("#resPDFactorCur").text(roundTo2Prec($("#resPerMonthPayment").text()/curData.Income*100) + "%");
				$("#resPDFactorMax").text(roundTo2Prec(getMaxPDPerc(curData.Income,options.mrp)*100) + "%");
				
				$("#resODFactorCur").text((function(){
						if( $$.find("#resKFGIKEnshType option:selected").val() == "Annual"){
							return roundTo2Prec((
							parseFloat($("#resPerMonthPayment").text())+
							parseFloat($("#resOtherBanksResps").text())+
							parseFloat($("#resPropertyEnsh").text())+
							parseFloat($("#resLifeEnsh").text())+
							parseFloat($("#resUtility").text())+
							parseFloat($("#resPropertyFee").text())+
							parseFloat($("#resKFGIKEnsh").text())
							)/curData.Income*100)+"%";
						}
						else{
							return roundTo2Prec((
							parseFloat($("#resPerMonthPayment").text())+
							parseFloat($("#resOtherBanksResps").text())+
							parseFloat($("#resPropertyEnsh").text())+
							parseFloat($("#resLifeEnsh").text())+
							parseFloat($("#resUtility").text())+
							parseFloat($("#resPropertyFee").text())
						
							)/curData.Income*100)+"%";
						}
					})());
					$("#resODFactorMax").text(roundTo2Prec(getMaxODPerc(curData.Income,options.mrp)*100) + "%");
					$("#resKZFactorCur").text(roundTo2Prec($("#resCreditTotal").text()/curData.HomePrice*100) + "%");

					$("#resMinIncome, #sumNessIncome").text((function(){
						if( $$.find("#resKFGIKEnshType option:selected").val() == "Annual"){
							return roundTo2Prec((
							parseFloat($("#resPerMonthPayment").text())+
							parseFloat($("#resOtherBanksResps").text())+
							parseFloat($("#resPropertyEnsh").text())+
							parseFloat($("#resLifeEnsh").text())+
							parseFloat($("#resUtility").text())+
							parseFloat($("#resPropertyFee").text())+
							parseFloat($("#resKFGIKEnsh").text())
							)/getMaxODPerc(curData.Income,options.mrp));
						}
						else{
							return roundTo2Prec((
							parseFloat($("#resPerMonthPayment").text())+
							parseFloat($("#resOtherBanksResps").text())+
							parseFloat($("#resPropertyEnsh").text())+
							parseFloat($("#resLifeEnsh").text())+
							parseFloat($("#resUtility").text())+
							parseFloat($("#resPropertyFee").text())
						
							)/getMaxODPerc(curData.Income,options.mrp));
						}
					})());
				
					$("#resExistingIncome, #sumCurIncome").text(curData.Income);
					$("#resCashRemainder").text(roundTo2Prec(19440*curData.AdultNum+9720*curData.ChildNum));
					$("#sumPropEnshTotal").text($("#resPropertyEnsh").text()*12);
					$("#sumLifeEnshTotal").text($("#resLifeEnsh").text()*12);
					
					$("#sumKFGIKEnshTotal").text((function(){
						if( $$.find("#resKFGIKEnshType option:selected").val() == "Annual"){
							return $("#resKFGIKEnsh").text()*12;
						}
						else{
							return $("#resKFGIKEnsh").text();
						}
					})());
					$("#sumTotalPrepay").text(
							parseFloat($("#sumPropEnshTotal").text())+
							parseFloat($("#sumLifeEnshTotal").text())+
							parseFloat($("#sumKFGIKEnshTotal").text())+
							parseFloat($("#sumCridetComission").text()));

					buildDrawingUpTable();

				return true;
			}else{
				return false;
			}
		};
		
		var buildDrawingUpTable = function(){
			var tContent = $$.find(".drawingUpTableHolder table tbody");
			tContent.html("");
			var payPerMonth = parseFloat($("#resPerMonthPayment").text());
			var remnant = parseFloat($("#resCreditTotal").text());
			var feeVal = 0;
			var debt = 0;
			for(var i=1; i < curData.CreditPeriod; i++){
				feeVal = Math.round(parseFloat(remnant*options.resFee/100/12)*100)/100;
				debt =  Math.round((payPerMonth - feeVal)*100)/100;
				remnant= Math.round((remnant-debt)*100)/100; 
				$("<tr><td>"+i+"</td><td>"+payPerMonth+"</td><td>"+remnant+"</td></tr>").appendTo(tContent);
			}
		}
		
		$$.find("#resOptPaymentType,#resKFGIKEnshType,#resFee").change(function(){
				calculateResult();
			});

		inputDataHolder.find(":button").click(function(){
			calculateResult();
			showResults();
		});
		
		$$.find("#backLink").click(function(){
			showInputForm();
		});	
		
		$$.find("#toggleDrawingUpTable").click(function(){ 
			
				$$.find(".drawingUpTableHolder").slideToggle();
			
			});
			
		var showResults = function(){
			$$.find(".resultHolder, .resultSummaryHolder").slideDown ();
			$$.find(".inputDataHolder").slideUp();
			$("#purchase").slideUp();
			$("#m_calculator").removeClass('grid_5').addClass('grid_10').attr('id', 'm_calculator1');
		}
		var showInputForm = function(){
			$$.find(".resultHolder, .resultSummaryHolder").slideUp();
			$$.find(".inputDataHolder").slideDown();
			$("#purchase").slideDown();
			$("#m_calculator1").removeClass('grid_10').addClass('grid_5').attr('id', 'm_calculator');
		}
		
		var initViews = function(){
				$$.find(".resultHolder, .resultSummaryHolder").hide();
				$$.find(".inputDataHolder").slideDown();
				$$.find(".drawingUpTableHolder").hide();
		}
		
		
		
		initViews();
		
	}
	return this;
};

var roundTo2Prec = function(val){
	return Math.round(val);
};

var getSummCategory = function(perc){
	perc = 100 - perc;
	if(perc <=70){
		return 5;
	}
	else if(perc <= 75){
		return 4;
	}
	else if(perc <=80){
		return 3;
	}
	else if(perc <= 85){
		return 2;
	}
	else {
		return 1;
	}
	
}

var getTermCategory = function(term){
	if(term <=3){
		return 1;
	}
	else if(term <= 5){
		return 2;
	}
	else if(term <=7){
		return 3;
	}
	else if(term <= 10){
		return 4;
	}
	else if(term <= 15){
		return 5;
	}
	else{
		return 6;
	}
}

var getMaxPDPerc = function(income, mrp){
	if(income < mrp*40){
		return 0.35;
	}
	else if(income < mrp*65){
		return 0.45;
	}
	else if(income < mrp*90){
		return 0.55;
	}
	
	else{
		return 0.65;
	}
}

var getMaxODPerc = function(income, mrp){
	if(income < mrp*40){
		return 0.40;
	}
	else if(income < mrp*65){
		return 0.50;
	}
	else if(income < mrp*90){
		return 0.60;
	}
	
	else{
		return 0.70;
	}
}


var OneTimePercents = [
	[0.59,	0.85,	1.24,	1.84,	2.54,	2.88],
	[0.56,	0.78,	1.06,	1.52,	2.09,	2.33],
	[0.55,	0.71,	0.92,	1.26,	1.68,	1.84],
	[0.54,	0.68,	0.88,	1.18,	1.60,	1.73],
	[0.54,	0.66,	0.83,	1.10,	1.51,	1.66]
];

var AnnualYears = [
	[0.22,	0.20,	0.23,	0.28,	0.31,	0.31],
	[0.20,	0.19,	0.20,	0.23,	0.25,	0.25],
	[0.20,	0.17,	0.17,	0.19,	0.20,	0.20],
	[0.20,	0.17,	0.17,	0.18,	0.19,	0.19],
	[0.20,	0.16,	0.16,	0.17,	0.18,	0.18]
];
