;(function(){
    // create a random global handler
    var _A="",_D=document;
    for(var i=0;i<16;i++)
        _A += String.fromCharCode(Math.floor(Math.random()*10)+97);

    /***** Start Configuration *****/
    var _C = {
        obj_ns    : 'babypips-' + _A.substr(0,3), // namespace (required)
        script_obj: null, // this will hold this script object
        script_url: /positionsize_widget\.js$/
    };
    /***** End Configuration *****/
    // styles (Note: multiple classes not supported)
    var _S = {
    		'*'							: 'color: #333; font: 14px Arial,Helvetica,sans-serif;',
    		'h1'						: 'font-size: 19px;display:none;',
    		'ul' 						: 'padding-left:40px;margin-top:20px;',
    		'li' 						: 'list-style: none; font-size:13px;',
    		'label' 					: 'width:170px;display:inline-block;font-size:13px;margin:0;text-align:right;padding-right:15px;',
    		'ul.input label' 			: 'font-weight:bold;',
    		'li.calculate' 				: 'margin:20px 212px 20px 20px;text-align:right;',
    		'li input' 					: 'width:94px;border:1px solid #888;margin:3px 3px 1px 0;padding:2px;font-size:14px;',
    		'li.output'					: 'margin-top:20px;',
    		'li select'					: 'width:100px;border:1px solid #888;margin:3px 3px 1px 0;font-size:14px;',
    		'li option'					: 'font-size:14px;',
    		'li button' 				: 'cursor:pointer;font-size:17px;border: 1px solid #999;color:#222;background:#ccc;padding:3px 5px;margin-right:5px;',
    		'li button:hover' 			: 'border: 1px solid #555;background:#bbb;',
    		'li small.errorcal' 		: 'color:red;font-size:12px;'
    };
    
    
	var pippos = {
		'USD' : 0.0001,
		'EUR' : 0.0001,
		'JPY' : 0.01,
		'GBP' : 0.0001,
		'CHF' : 0.0001,
		'AUD' : 0.0001,
		'CAD' : 0.0001,
		'NZD' : 0.0001
	};
	
	var currpairs = {
    	'EUR/USD' : 'EUR / USD',
    	'GBP/USD' : 'GBP / USD',
    	'USD/CHF' : 'USD / CHF',
    	'USD/CAD' : 'USD / CAD',
    	'USD/JPY' : 'USD / JPY',
    	'NZD/USD' : 'NZD / USD',
    	'AUD/USD' : 'AUD / USD',
    	'EUR/AUD' : 'EUR / AUD',
    	'EUR/GBP' : 'EUR / GBP',
    	'EUR/JPY' : 'EUR / JPY',
    	'EUR/CAD' : 'EUR / CAD',
    	'EUR/CHF' : 'EUR / CHF',
    	'EUR/NZD' : 'EUR / NZD',
    	'GBP/CAD' : 'GBP / CAD',
    	'GBP/CHF' : 'GBP / CHF',
    	'GBP/JPY' : 'GBP / JPY',
    	'GBP/AUD' : 'GBP / AUD',
    	'GBP/NZD' : 'GBP / NZD',
    	'AUD/CAD' : 'AUD / CAD',
    	'AUD/JPY' : 'AUD / JPY',
    	'AUD/CHF' : 'AUD / CHF',
    	'AUD/NZD' : 'AUD / NZD',
    	'CHF/JPY' : 'CHF / JPY',
    	'CAD/CHF' : 'CAD / CHF',
    	'CAD/JPY' : 'CAD / JPY',
    	'NZD/CHF' : 'NZD / CHF',
    	'NZD/JPY' : 'NZD / JPY',
    	'NZD/CAD' : 'NZD / CAD'
    };
    
    
    // create a private pointer so you don't have to keep saying window[widget_obj]
    var $=window[_A]={ _A:_A, _C:_C, _S:_S, pippos:pippos, currpairs:currpairs };
    $.vars = {};
    _A='';_C='';_S='';
    
    /***** Start Declaration of Helpers *****/
    // return current namespace
    $.get_ns = function() {
        return $._C.obj_ns;
    };
 // A function responsible for creating DOM elements and its classes.
    $.CE = function(obj_type, obj_id, set_namespace) {
        var obj = _D.createElement(obj_type);
        if(obj_id)
            $.setId(obj, obj_id, set_namespace);
        return obj;
    };
    // Alias for createTextNode
    $.TN = function(txt) {
        return _D.createTextNode(txt);
    };
    // append child return self. Usage: $.ACS(parent, child1, child2, ...)
    $.ACS = function(s) {
        for(var i=1;i<arguments.length;i++)
            $.ACC(s,arguments[i]);
        return s;
    };
    // append child return child. Usage: $.ACC(parent, child1, child2, ...)
    $.ACC = function(s) {
        for(var i=1;i<arguments.length;i++)
            s = s.appendChild(arguments[i]);
        return s;
    };
    // A function responsible for setting id.
    $.setId = function(obj, id, set_namespace) {
        if(set_namespace !== false)
            id = $.get_ns() + id;
        obj.id = id;
        return obj;
    };
    // alias for getElementsByTagName
    $.byTag = function(tag, node) {
        if ( node == null )
            node = document;
        return node.getElementsByTagName(tag);
    };
    // A function responsible adding a style header
    $.InsertStyles = function(rules) {
        var ns = $.CE('style'), ieRules = "", IE = window.createPopup;
        $.ACC($.byTag('head')[0], ns);
        if(!IE) {
            $.ACC(ns, $.TN(""));
            ns.setAttribute('type','text/css');
        }
        var s = _D.styleSheets[_D.styleSheets.length - 1];
        for(var r in rules) {
            //var selector = '#' + $.get_ns() + ' ' + r.replace(/([\.\#])/gi, '$1' + $.get_ns());
        	var selector = '#' + $.get_ns() + ' ' + r;
            if(!IE)
                $.ACC(ns, $.TN(selector + '{' + rules[r] + '}'));
            else
                ieRules += selector + '{' + rules[r] + '}';
        }
        if(IE)
            s.cssText = ieRules;
    };
    // remove instance of this script
    $.remThisInst = function() {    	
    	var script_obj = $.getThisScriptObj();    	
    	if(script_obj) {
    		script_obj.parentNode.removeChild(script_obj);
    	}
    };
    // get my script src
    $.getThisScriptObj = function() {
    	if(!$._C.script_obj) {
    		var scripts = $.byTag('script');
    		for(var i=0; i< scripts.length; i++) {
    			if(scripts[i].src.match($._C.script_url)) {
    				$._C.script_obj = scripts[i];
    				break;
    			}
    		}
    	}
    	return $._C.script_obj;
    };
    // A function responsible for inserting widget to the page
    $.insertWidget = function(widget) {        
    	var script_obj = $.getThisScriptObj();      	
    	if(script_obj) {
    		// insert the widget here    		
    		var p = script_obj.parentNode;
    		p.insertBefore(widget, script_obj);
    		return true;
    	}	   	
        return false;
    };

    // A function responsible for generating cross-browser safe widget object. Returns widget object
    $.WidgetGenerator = function() {        
    	var script_obj = $.getThisScriptObj();      	
    	if(script_obj) {
    		$._W = $.CE('div', $.get_ns(), false);
    		$._W.className = 'rewardrisk_cal';
    		
    		// create headers
    		var h1 = $.CE('h1'); h1.innerHTML = 'Position Size Calculator';

    		var ul1 = $.CE('ul'); ul1.className = 'input';
    			var li1 = $.CE('li');
    			var li2 = $.CE('li');
    			var li3 = $.CE('li');
    			var li4 = $.CE('li');
    			var li5 = $.CE('li');
    			var li6 = $.CE('li');
    			var li7 = $.CE('li'); li7.className = 'calculate';
    			
    			// li 1
    			var lbl_currency = $.CE('label'); lbl_currency.innerHTML = 'Account Currency';
    			var ps_currency = $.CE('select');
    			var cnt = 0;
    			for( index in $.pippos ) {
    				var opt = $.CE('option'); opt.value = index; opt.innerHTML = index;
    				$.ACS(ps_currency,opt);
    				cnt++;
    				if(cnt == 8) break;
    			}    			
    			$.ACS(li1,lbl_currency,ps_currency);
    			// li 2
    			var lbl_account_balance = $.CE('label'); lbl_account_balance.innerHTML = 'Account Balance';
    			var ps_account_balance = $.CE('input'); ps_account_balance.type = "text";
    			var ps_account_balance_error = $.CE('small'); ps_account_balance_error.className = 'errorcal';
    			$.ACS(li2,lbl_account_balance,ps_account_balance,ps_account_balance_error);
    			// li 3
    			var lbl_risk_percent = $.CE('label'); lbl_risk_percent.innerHTML = 'Risk Percentage';
    			var ps_risk_percent = $.CE('input'); ps_risk_percent.type = "text";
    			var ps_risk_percent_error = $.CE('small'); ps_risk_percent_error.className = 'errorcal';
    			$.ACS(li3,lbl_risk_percent,ps_risk_percent,ps_risk_percent_error);
				
				//li 4
				var lbl_risk_pips = $.CE('label'); lbl_risk_pips.innerHTML = 'Stop Loss in Pips';
    			var ps_risk_pips = $.CE('input'); ps_risk_pips.type = "text";
    			var ps_risk_pips_error = $.CE('small'); ps_risk_pips_error.className = 'errorcal';
    			$.ACS(li4,lbl_risk_pips,ps_risk_pips,ps_risk_pips_error);
				
    			// li 5
    			var lbl_currency_pair = $.CE('label'); lbl_currency_pair.innerHTML = 'Currency Pair';
    			var ps_currency_pair = $.CE('select');
    			cnt = 0;
    			for( index in $.currpairs ) {
    				var opt = $.CE('option'); opt.value = index; opt.innerHTML = $.currpairs[index];
    				$.ACS(ps_currency_pair,opt);
    				cnt++;
    				if(cnt == 28) break;
    			}    			
    			$.ACS(li5,lbl_currency_pair,ps_currency_pair);
				
    			// li 6
    			var lbl_exchange_rate = $.CE('label'); lbl_exchange_rate.innerHTML = 'Price for ';
    				var lbl_ps_exchange_pair = $.CE('span'); lbl_ps_exchange_pair.innerHTML = '';
    				$.ACS(lbl_exchange_rate,lbl_ps_exchange_pair);
    			var ps_exchange_rate = $.CE('input'); ps_exchange_rate.type = "text";
    			var ps_exchange_rate_error = $.CE('small'); ps_exchange_rate_error.className = 'errorcal';
    			$.ACS(li6,lbl_exchange_rate,ps_exchange_rate,ps_exchange_rate_error);
    			li6.style.display = 'none';
				
				// li 7
    			var btn_calculate = $.CE('button'); btn_calculate.innerHTML = 'Calculate';
    			var btn_clear = $.CE('button'); btn_clear.innerHTML = 'Clear';
    			$.ACS(li7,btn_calculate,btn_clear);
    		$.ACS(ul1, li1, li2, li3, li4, li5, li6, li7);
    		
    		$.ps_liexchangerate = li6;
    		$.ps_currency_pair = ps_currency_pair;
    		$.ps_account_balance = ps_account_balance;
    		$.ps_account_balance_error = ps_account_balance_error;
    		$.ps_risk_percent = ps_risk_percent;
    		$.ps_risk_percent_error = ps_risk_percent_error;
    		$.ps_risk_pips = ps_risk_pips;
    		$.ps_risk_pips_error = ps_risk_pips_error;
    		$.ps_currency = ps_currency;
    		$.ps_exchange_pair = lbl_ps_exchange_pair;
    		$.ps_exchange_rate = ps_exchange_rate;
    		$.ps_exchange_rate_error = ps_exchange_rate_error;
    		$.ps_calculate = btn_calculate;
    		$.ps_clear = btn_clear;
    		
	    	var ul2 = $.CE('ul');
				var li2_1 = $.CE('li');
				var li2_2 = $.CE('li');
				var li2_3 = $.CE('li');
				var li2_4 = $.CE('li');
				var li2_5 = $.CE('li');
				
				// li 1
				var lbl_risk_amount = $.CE('label'); lbl_risk_amount.innerHTML = 'Amount at Risk';
				var ps_risk_amount = $.CE('input'); ps_risk_amount.type = "text"; ps_risk_amount.readOnly = true;
				$.ACS(li2_1,lbl_risk_amount,ps_risk_amount);
				// li 2
				var lbl_position_size = $.CE('label'); lbl_position_size.innerHTML = 'Position Size';
				var ps_position_size = $.CE('input'); ps_position_size.type = "text"; ps_position_size.readOnly = true;
				$.ACS(li2_2,lbl_position_size,ps_position_size);
				// li 3
				var lbl_standard_lots = $.CE('label'); lbl_standard_lots.innerHTML = 'Standard Lots';
				var ps_standard_lots = $.CE('input'); ps_standard_lots.type = "text"; ps_standard_lots.readOnly = true;
				$.ACS(li2_3,lbl_standard_lots,ps_standard_lots);
				// li 4
				var lbl_mini_lots = $.CE('label'); lbl_mini_lots.innerHTML = 'Mini Lots';
				var ps_mini_lots = $.CE('input'); ps_mini_lots.type = "text"; ps_mini_lots.readOnly = true;
				$.ACS(li2_4,lbl_mini_lots,ps_mini_lots);
				// li 5
				var lbl_micro_lots = $.CE('label'); lbl_micro_lots.innerHTML = 'Micro Lots';
				var ps_micro_lots = $.CE('input'); ps_micro_lots.type = "text"; ps_micro_lots.readOnly = true;
				$.ACS(li2_5,lbl_micro_lots,ps_micro_lots);
				
			$.ACS(ul2, li2_1, li2_2, li2_3, li2_4, li2_5);

			$.ps_risk_amount = ps_risk_amount;
			$.ps_position_size = ps_position_size;
			$.ps_standard_lots = ps_standard_lots;
			$.ps_mini_lots = ps_mini_lots;
			$.ps_micro_lots = ps_micro_lots;
			
			$.ACS($._W, h1, ul1, ul2);	
    	}	   	
        return $._W;
    };
    /***** End Declaration of Helpers *****/

    // start main function
    var _CC = function() {  
    	var script_obj = $.getThisScriptObj();		
    	
    	var widget = $.WidgetGenerator();    	
        if( widget ) {
    		$.InsertStyles($._S); // set class styles
        	$.insertWidget(widget);
        }
        
        resetFields();
        
        $.ps_calculate.onclick = function() {
        	var currency = $.ps_currency.value;
        	var pair = $.ps_currency_pair.value.split('/');
        	var base = pair[0];
        	var quote = pair[1];

        	var position_size = 0;
        	var input_error = 0;
        	var amount_risk = 0;
        	var val_per_pip = 0;
        	var pair_val = 0;
			var unit_pip_val = 1;
			var value_in_base = 0;
			var currency_pair_units = 10000;

        	var ps_account_balance = $.ps_account_balance.value;
        	var ps_risk_percent = $.ps_risk_percent.value;
        	var ps_risk_pips = $.ps_risk_pips.value;
        	var ps_exchange_rate = $.ps_exchange_rate.value;

        	input_error += checkFieldEntry($.ps_account_balance,$.ps_account_balance_error);
        	input_error += checkFieldEntry($.ps_risk_percent,$.ps_risk_percent_error);
        	input_error += checkFieldEntry($.ps_risk_pips,$.ps_risk_pips_error);
        	
			if( quote != currency ) {
				input_error += checkFieldEntry($.ps_exchange_rate,$.ps_exchange_rate_error);
			}
			
        	if( currency != quote && currency != base ) {
        		input_error += checkFieldEntry($.ps_exchange_rate,$.ps_exchange_rate_error);
        	}

        	if(input_error <= 0) {
        		ps_account_balance = parseFloat(ps_account_balance);
        		ps_risk_percent = parseFloat(ps_risk_percent);
        		ps_risk_pips = Math.abs(parseInt(ps_risk_pips));
				if(ps_risk_pips < 1) ps_risk_pips = 1;
				
				amount_risk = ps_account_balance * (ps_risk_percent / 100);
				
				if( quote == 'JPY' || base == 'JPY' )
					currency_pair_units = 100;
				
				if( quote == currency ) {
					value_in_base = amount_risk;
				} else if ( base == currency ) {
					ps_exchange_rate = parseFloat(ps_exchange_rate);
					value_in_base = ps_exchange_rate * amount_risk;
				}
				else if( currency != quote && currency != base ) {
        			ps_exchange_rate = parseFloat(ps_exchange_rate);
        			if(typeof(currpairs[quote + '/' + currency]) != 'undefined') {
						value_in_base = amount_risk * (1/ps_exchange_rate);
        			}
					else if(typeof(currpairs[currency + '/' + quote]) != 'undefined') {
        				value_in_base = amount_risk * ps_exchange_rate;
					}
        		}
				
				val_per_pip = value_in_base / ps_risk_pips;
				position_size = val_per_pip * (currency_pair_units/unit_pip_val);
				
        		$.ps_risk_amount.value = (Math.round( amount_risk * 10000 ) / 10000) + ' ' + currency;
        		$.ps_position_size.value = Math.round(position_size) + ' units';
        		$.ps_standard_lots.value = Math.floor(position_size / 100000);
        		$.ps_mini_lots.value = Math.floor(position_size / 10000);
        		$.ps_micro_lots.value = Math.floor(position_size / 1000);
        	}
        };
        
        $.ps_clear.onclick = function() { resetFields(); };
        $.ps_currency_pair.onchange = function () { hideShowExchangeRateInput(); };
        $.ps_currency.onchange = function () { hideShowExchangeRateInput(); };
    };
    
	var hideShowExchangeRateInput = function() {
		var currency = $.ps_currency.value;
		var pair = $.ps_currency_pair.value.split('/');
		var base = pair[0];
		var quote = pair[1];

		if(currency == quote) {
			// hide another input
			$.ps_liexchangerate.style.display = 'none';
		}
		else if(currency == base) {
			// show another input
			$.ps_exchange_pair.innerHTML = currpairs[base + '/' + quote];
			$.ps_liexchangerate.style.display = 'block';
		}
		else {
			// show another input
			if(typeof(currpairs[quote + '/' + currency]) != 'undefined')
				$.ps_exchange_pair.innerHTML = currpairs[quote + '/' + currency];
			else if(typeof(currpairs[currency + '/' + quote]) != 'undefined')
				$.ps_exchange_pair.innerHTML = currpairs[currency + '/' + quote];
			$.ps_liexchangerate.style.display = 'block';
		}
	};
	
	var resetFields = function() {
		$.ps_account_balance.value = '';
		$.ps_risk_percent.value = '';
		$.ps_exchange_rate.value = '';
		$.ps_risk_amount.value = '';
		$.ps_risk_pips.value = '';
		$.ps_position_size.value = '';
		$.ps_standard_lots.value = '';
		$.ps_mini_lots.value = '';
		$.ps_micro_lots.value = '';

		$.ps_currency_pair.value = 'EUR/USD';
		$.ps_currency.value = 'USD';
		$.ps_exchange_pair.value = '';
		$.ps_exchange_pair.innerHTML = 'EUR/USD';
					
		$.ps_account_balance_error.innerHTML = '';
		$.ps_account_balance.style.backgroundColor = '';
		$.ps_risk_percent_error.innerHTML = '';
		$.ps_risk_percent.style.backgroundColor = '';
		$.ps_risk_pips_error.innerHTML = '';
		$.ps_risk_pips.style.backgroundColor = '';
		$.ps_exchange_rate_error.innerHTML = '';
		$.ps_exchange_rate.style.backgroundColor = '';

		$.ps_liexchangerate.style.display = 'none';
		$.ps_currency.focus();
	};

	var checkFieldEntry = function (elem, error_elem) {
		var val = elem.value;
		if(isNaN(val) == false && isNaN(parseFloat(val)) == false) {
			error_elem.innerHTML = '';
			elem.style.backgroundColor = '';
			return 0;
		}
		else {
			error_elem.innerHTML = 'Please enter a valid number.';
			elem.style.backgroundColor = '#e55';
			return 1;
		}
	};

            
    try { // try catch so we do not mess up in case have unexpected errors
        _CC();
        $.remThisInst();
    } catch(e){
    	try {
    		if($._W) $._W.style.display = 'none';
    		if($) $ = null;
    	} catch(e) {} 	
    }
})();
