;(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: /pipvalue_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:150px; display:inline-block;font-size:13px;font-weight:bold;text-align:right;margin-right:15px;',
    		'li.calculate' 				: 'margin:20px 232px 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/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 = 'Pip Value 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'); li6.className = 'output';
    			var li7 = $.CE('li'); li7.className = 'calculate';

    			// li 1
    			var lbl_currency_pair = $.CE('label'); lbl_currency_pair.innerHTML = 'Currency Pair';
    			var pv_currency_pair = $.CE('select');
    			var cnt = 0;
    			for( index in $.currpairs ) {
    				var opt = $.CE('option'); opt.value = index; opt.innerHTML = $.currpairs[index];
    				$.ACS(pv_currency_pair,opt);
    				cnt++;
    				if(cnt == 28) break;
    			}    			
    			$.ACS(li1,lbl_currency_pair,pv_currency_pair);
    			// li 2
    			var lbl_size = $.CE('label'); lbl_size.innerHTML = 'Position Size';
    			var pv_size = $.CE('input'); pv_size.type = "text";
    			var pv_size_error = $.CE('small'); pv_size_error.className = 'errorcal';
    			$.ACS(li2,lbl_size,pv_size,pv_size_error);
    			// li 3
    			var lbl_price = $.CE('label'); lbl_price.innerHTML = 'Ask Price';
    			var pv_price = $.CE('input'); pv_price.type = "text";
    			var pv_price_error = $.CE('small'); pv_price_error.className = 'errorcal';
    			$.ACS(li3,lbl_price,pv_price,pv_price_error);
    			// li 4
    			var lbl_currency = $.CE('label'); lbl_currency.innerHTML = 'Value in';
    			var pv_currency = $.CE('select');
    			cnt = 0;
    			for( index in $.pippos ) {
    				var opt = $.CE('option'); opt.value = index; opt.innerHTML = index;
    				$.ACS(pv_currency,opt);
    				cnt++;
    				if(cnt == 8) break;
    			}   			
    			$.ACS(li4,lbl_currency,pv_currency);
    			// li 5
    			var lbl_exchange_rate = $.CE('label'); lbl_exchange_rate.innerHTML = 'Price for ';
    				var lbl_pv_exchange_pair = $.CE('span'); lbl_pv_exchange_pair.innerHTML = '';
    				$.ACS(lbl_exchange_rate,lbl_pv_exchange_pair);
    			var pv_exchange_rate = $.CE('input'); pv_exchange_rate.type = "text";
    			var pv_exchange_rate_error = $.CE('small'); pv_exchange_rate_error.className = 'errorcal';
    			$.ACS(li5,lbl_exchange_rate,pv_exchange_rate,pv_exchange_rate_error);
    			li5.style.display = 'none';
    			// li 6
    			var lbl_pipvalue = $.CE('label'); lbl_pipvalue.innerHTML = 'Pip Value';
    			var pv_pipvalue = $.CE('input'); pv_pipvalue.type = "text"; pv_pipvalue.readOnly = true;
    			$.ACS(li6,lbl_pipvalue,pv_pipvalue);
    			// 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);
    		
    		$.pv_liexchangerate = li5;
    		$.pv_currency_pair = pv_currency_pair;
    		$.pv_size = pv_size;
    		$.pv_size_error = pv_size_error;
    		$.pv_price = pv_price;
    		$.pv_price_error = pv_price_error;
    		$.pv_currency = pv_currency;
    		$.pv_exchange_pair = lbl_pv_exchange_pair;
    		$.pv_exchange_rate = pv_exchange_rate;
    		$.pv_exchange_rate_error = pv_exchange_rate_error;
    		$.pv_pipvalue = pv_pipvalue;
    		$.pv_calculate = btn_calculate;
    		$.pv_clear = btn_clear;
    		
            $.ACS($._W, h1, ul1);	
    	}	   	
        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();

        $.pv_calculate.onclick = function() {
        	var currency = $.pv_currency.value;
        	var pair = $.pv_currency_pair.value.split('/');
        	var base = pair[0];
        	var quote = pair[1];

        	var pip_val = 0;
        	var input_error = 0;
        	
        	pv_size = $.pv_size.value;
        	if(isNaN(pv_size) == false && isNaN(parseFloat(pv_size)) == false) {
        		$.pv_size_error.innerHTML = '';
        		$.pv_size.style.backgroundColor = '';
        	}
        	else {
        		$.pv_size_error.innerHTML = 'Please enter a valid number.';
        		$.pv_size.style.backgroundColor = '#e55';
        		input_error++;
        	}

        	pv_price = $.pv_price.value;
        	if(isNaN(pv_price) == false && isNaN(parseFloat(pv_price)) == false) {
        		$.pv_price_error.innerHTML = '';
        		$.pv_price.style.backgroundColor = '';
        	}
        	else {
        		$.pv_price_error.innerHTML = 'Please enter a valid number.';
        		$.pv_price.style.backgroundColor = '#e55';
        		input_error++;
        	}

        	if( currency != quote && currency != base ) {
        		pv_exchange_rate = $.pv_exchange_rate.value;
        		if(isNaN(pv_exchange_rate) == false && isNaN(parseFloat(pv_exchange_rate)) == false) {
        			$.pv_exchange_rate_error.innerHTML = '';
        			$.pv_exchange_rate.style.backgroundColor = '';
        			pv_exchange_rate = parseFloat(pv_exchange_rate);
        		}
        		else {
        			$.pv_exchange_rate_error.innerHTML = 'Please enter a valid number.';
        			$.pv_exchange_rate.style.backgroundColor = '#e55';
        			input_error++;
        		}
        	}

        	if(input_error <= 0) {
        		pv_price = parseFloat(pv_price);
        		pv_size = parseFloat(pv_size);
        		
        		if( currency == quote ) {
        			pip_val = parseFloat(pippos[quote]) / pv_price;
        			pip_val = pip_val * pv_price;
        			pip_val = pip_val * pv_size;
        			$.pv_pipvalue.value = Math.round( pip_val * 10000 ) / 10000;
        		}
        		else if( currency == base ) {
        			pip_val = parseFloat(pippos[quote]) / pv_price;
        			pip_val = pip_val * pv_size;
        			$.pv_pipvalue.value = Math.round( pip_val * 10000 ) / 10000;
        		}
        		else if(typeof(currpairs[quote + '/' + currency]) != 'undefined') {
        			pip_val = parseFloat(pippos[quote]) / pv_price;
        			pip_val = pip_val * pv_price;						
        			pip_val = pip_val * pv_exchange_rate;
        			pip_val = pip_val * pv_size;
        			$.pv_pipvalue.value = Math.round( pip_val * 10000 ) / 10000;
        		}
        		else if(typeof(currpairs[currency + '/' + quote]) != 'undefined') {
        			pip_val = parseFloat(pippos[quote]) / pv_price;
        			pip_val = pip_val * pv_price;						
        			pip_val = pip_val / pv_exchange_rate;
        			pip_val = pip_val * pv_size;
        			$.pv_pipvalue.value = Math.round( pip_val * 10000 ) / 10000;
        		}
        	}
        };
        $.pv_clear.onclick = function() { resetFields(); };
        $.pv_currency_pair.onchange = function () { hideShowExchangeRateInput(); };
        $.pv_currency.onchange = function () { hideShowExchangeRateInput(); };
        
    };
    
	var hideShowExchangeRateInput = function() {
		var currency = $.pv_currency.value;
		var pair = $.pv_currency_pair.value.split('/');
		var base = pair[0];
		var quote = pair[1];

		if(currency == base || currency == quote) {
			// hide another input
			$.pv_liexchangerate.style.display = 'none';
			$.pv_exchange_rate.value = '';
		}
		else {
			// show another input
			if(typeof(currpairs[quote + '/' + currency]) != 'undefined')
				$.pv_exchange_pair.innerHTML = currpairs[quote + '/' + currency];
			else if(typeof(currpairs[currency + '/' + quote]) != 'undefined')
				$.pv_exchange_pair.innerHTML = currpairs[currency + '/' + quote];
			$.pv_exchange_rate.value = '';
			$.pv_liexchangerate.style.display = 'block';
		}
	};
	
	var resetFields = function() {
		$.pv_size.value = '';
		$.pv_price.value = '';
		$.pv_pipvalue.value = '';
		$.pv_currency_pair.value = 'EUR/USD';
		$.pv_currency.value = 'USD';
		$.pv_exchange_rate.value = '';
		$.pv_exchange_pair.innerHTML = 'EUR/USD';
						
		$.pv_size_error.innerHTML = '';
		$.pv_size.style.backgroundColor = '';
		$.pv_price_error.innerHTML = '';
		$.pv_price.style.backgroundColor = '';
		$.pv_exchange_rate_error.innerHTML = '';
		$.pv_exchange_rate.style.backgroundColor = '';
		$.pv_liexchangerate.style.display = 'none';
		$.pv_currency_pair.focus();
	};
            
    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) {} 	
    }
})();
