﻿


var Ekonomifakta = { };

(function() {

    /* Default configuration values */
    Ekonomifakta.config = {
        'host' : 'http://ekonomifakta.se',
        'widgetPage' : '/Templates/Pages/Widgets/Taxes.aspx',
        'parent' : '#ekonomifakta-container',
        'lang' : 'sv',
        'taxWidgetId' : 'taxWidgetSrc',
        'randomizeTime' : 5000, 
        'randomizeMin' : 10000, 
        'randomizeMax' : 20000, 
        'defaultSalaryText': 'Din månadslön', 
        'defaultBirthText' : 'Ditt födelseår', 
        'errorBadInputJs' : 'Felformatterad indata', 
        'errorBadInputServer' : 'Felformatterad indata',
        'errorInternalServerError' : 'Ett serverfel inträffade',
        'thousandDelimiter' : ' ', 
        'amountUnit' : 'kr',
        'widgetName' : 'Skatt'
    };
})();

Ekonomifakta.isStarted = function () {
    return efaktaJQuery('#efaktaWidgetStarted').length > 0;
};

Ekonomifakta.startWidget = function(userConfig) {

    if (this.isStarted())
    {
        return false;
    }

    efaktaJQuery(this.config['parent']).append('<input type="hidden" id="efaktaWidgetStarted" />');

    efaktaJQuery.extend(this.config, userConfig);
    
    if (efaktaJQuery('#' + this.config['taxWidgetId']).length == 0)
    { return false; }
    
    this.setHostname();
    this.getInitValues();
    
    return true;
};

Ekonomifakta.setHostname = function(userConfig) {
    
    var jsSrc = efaktaJQuery('#' + this.config['taxWidgetId']).attr('src');
    
    var re = new RegExp('^(?:f|ht)tp(?:s)?\://([^/]+)', 'im');
    var hostName = jsSrc.match(re)[1].toString();
    
    this.config['host'] = 'http://' + hostName;
    
};

Ekonomifakta.stopRandomizing = function () {
    this.inLoop = false;
};

Ekonomifakta.randomizeNumbers = function() {

    if (this.config['randomizeTime'] > 0 && !this.inLoop)
    {
        this.inLoop = true;
        Ekonomifakta.randomizationLoop();
    }
};

Ekonomifakta.randomizationLoop = function() {

    if (!this.inLoop)
    {
        return;
    }
    
    this.loadticker(Math.floor(Math.random() * (this.config['randomizeMax'] - this.config['randomizeMin'])) + this.config['randomizeMin']);

    setTimeout('Ekonomifakta.randomizationLoop();', this.config['randomizeTime']);
};

Ekonomifakta.createMarkup = function(data) {

    this.includeStyle(this.config['host'] + "/css/ekfakta-wdgt.css");
/*
    var markup = '\
        <style type="text/css"> \
		  @import url("' + this.config['host'] + '/css/ekfakta-wdgt.css"); \
		</style>';
		*/
        
    var markup = '<div id="ef-tax-wdgt"> \
	<div id="ef-tax-bd"> \
		<div id="ef-tax-form"> \
			<h1>Räkna ut din skatt</h1> \
			<div id="ef-count"> \
				<div id="ef-count-shadow"> \
					<div class="counter-wrap"> \
						<div class="counter-number" id="num0" value="1" style="top: -34px; ">&nbsp;</div> \
						<div class="counter-number" id="num1" value="2" style="top: -68px; ">&nbsp;</div> \
						<div class="counter-number" id="num2" value="." style="top: -370px; width: 0px">&nbsp;</div> \
						<div class="counter-number" id="num3" value="8" style="top: -204px; ">&nbsp;</div> \
						<div class="counter-number" id="num4" value="4" style="top: -102px; ">&nbsp;</div> \
						<div class="counter-number" id="num5" value="0" style="top: -0px; ">&nbsp;</div> \
					</div> \
				</div> \
			</div> \
			<h2>kronor / månad</h2>\
			<p class="ef-wdgt-ins">Kolla hur mycket skatt du betalar på din lön. Fyll i uppgifterna och få svar direkt.</p> \
			<ul class="ef-form"> \
				<li id="ef-tax-city"> \
					<select id="ekonomifakta-muncipality" class="styled">';

                efaktaJQuery.each(data.Muncipalities, function(index, value) {
                    markup += ("<option value='" + index + "'>" + value + "</option>");
                });
                
				markup += '</select> \
				</li> \
				<li><input type="text" name="ef-tax-wages" id="ef-tax-wages" value="' + this.config['defaultSalaryText'] + '" onkeypress="if(event.keyCode == 13){document.getElementById(\'buttonCalc\').click();return false;}" class="input-text" /></li> \
				<li><input type="text" name="ef-tax-born" id="ef-tax-born" value="' + this.config['defaultBirthText'] + '" onkeypress="if(event.keyCode == 13){document.getElementById(\'buttonCalc\').click();return false;}" class="input-text" /></li> \
				<li class="ef-calculate"><p class="error" style="display:none;"></p><input type="button" value="Beräkna" id="buttonCalc" class="tax-button" /></li> \
			</ul> \
		</div> \
		<div id="ef-tax-loader" style="display: none;"> \
			<h1>Vi räknar ut din skatt</h1> \
		</div> \
		<div id="ef-tax-sum" style="display: none;"> \
			<h1>Så mycket går till skatt:</h1> \
			<h2>kronor / månad</h2>\
			<ul class="ef-results"> \
				<li class="ef-employer"><em>Arbetsgivaren betalar:</em><strong id="ef-results-employer-sum">24 313 kr</strong></li> \
				<li class="ef-slip"><em>På lönebeskedet:</em><strong id="ef-results-worker-sum">14 236 kr</strong></li> \
				<li class="ef-sum"><em>Summa skatter:</em><strong id="ef-results-tax-sum">10 076 kr</strong></li> \
				<li class="ef-calculate"><input type="button" value="Ny beräkning" class="tax-button" /></li> \
				<li class="ef-calculated" id="ef-results-fullresultspage"></li> \
			</ul> \
		</div> \
		<div id="ef-embed"> \
		    <a target="_blank" href="' + data.EmbedCodeURL + '">Lägg till på din blogg eller webbplats</a> \
		</div> \
	</div> \
	<div id="ef-tax-ft"> \
		<ul> \
			<li id="ef-logo"><a href="' + this.config['host'] + '" target="_blank"><img src="' + this.config['host'] + '/images/widget/ef-wdgt-logo-140.png" alt="ekonomifakta.se" /></a></li> \
			<li><p class="disclaimer"><a title="Denna kostnadsfria widget är hämtad från ekonomifakta.se" href="http://ekonomifakta.se/sv/stand-alone/Html-widget/#Disclaimer">Denna kostnadsfria widget är hämtad från ekonomifakta.se</a></p></li> \
		</ul> \
	</div> \
</div>';
        
	efaktaJQuery(this.config['parent']).html(markup);
    
	efaktaJQuery(".counter-number").each( function(i) {
	    efaktaJQuery(this).attr('id','num'+i);
    });
    // Load statistics script
    var statisticsScript = document.createElement('script');
    statisticsScript.type = 'text/javascript';
    statisticsScript.async = true;
    statisticsScript.src = this.config['host'] + '/javascript/sitecatalyst-widgets.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(statisticsScript);
};

Ekonomifakta.includeStyle = function(p_file) {

    var v_css  = document.createElement('link');
	v_css.rel = 'stylesheet'
	v_css.type = 'text/css';
	v_css.href = p_file;
	document.getElementsByTagName('head')[0].appendChild(v_css);
};

Ekonomifakta.hichEvents = function() {

    efaktaJQuery('.ef-form .ef-calculate .tax-button').click(function() {
    
        if (Ekonomifakta.validate())
        {
            efaktaJQuery(Ekonomifakta.inputSelector()).hide();
            efaktaJQuery(Ekonomifakta.loaderSelector()).show();
            Ekonomifakta.stopRandomizing();
            Ekonomifakta.getResults();
        }
        else
        {
            /*
            efaktaJQuery(Ekonomifakta.errorSelector()).html(Ekonomifakta.config['errorBadInputJs']);
            efaktaJQuery(Ekonomifakta.errorSelector()).show();
            */
        }
    });
    
    efaktaJQuery(this.resultSelector() + ' .ef-calculate .tax-button').click(function() {
        Ekonomifakta.setResultVisibility(false);
        Ekonomifakta.moveTicker('#ef-tax-form h1');
        Ekonomifakta.randomizeNumbers();
    });
    
    efaktaJQuery(this.inputSelector() + ' li #ef-tax-wages').click(function() {
        if (efaktaJQuery(this).attr('value') == Ekonomifakta.config['defaultSalaryText']) {
            efaktaJQuery(this).attr('value', '');
        }
    });
    
    efaktaJQuery(this.inputSelector() + ' li #ef-tax-born').click(function() {
        if (efaktaJQuery(this).attr('value') == Ekonomifakta.config['defaultBirthText']) {
            efaktaJQuery(this).attr('value', '');
        }
    });
    
    efaktaJQuery(this.inputSelector() + ' li #ef-tax-wages').blur(function() {
        if (efaktaJQuery(this).attr('value') == '') {
            efaktaJQuery(this).attr('value', Ekonomifakta.config['defaultSalaryText']);
        }
    });
    
    efaktaJQuery(this.inputSelector() + ' li #ef-tax-born').blur(function() {
        if (efaktaJQuery(this).attr('value') == '') {
            efaktaJQuery(this).attr('value', Ekonomifakta.config['defaultBirthText']);
        }
    });
    
    efaktaJQuery(this.inputSelector() + ' li input').live('keyup', function() {
        Ekonomifakta.validateElementAsInt(efaktaJQuery(this), efaktaJQuery(this).val(), 0);
    });
};

Ekonomifakta.setResultVisibility = function(visible) {

    efaktaJQuery(this.loaderSelector()).hide();

    if (visible) {
        efaktaJQuery(this.inputSelector()).hide();
        efaktaJQuery(this.resultSelector()).show();
    } else {
        efaktaJQuery(this.inputSelector()).show();
        efaktaJQuery(this.resultSelector()).hide();
    }
};

Ekonomifakta.getResults = function() {
    this.getData(this.getRequestParameters());
};

Ekonomifakta.getInitValues = function() {
    this.getData(this.getInitParameters());
};

Ekonomifakta.getData = function(parameters) {
    /* JSONP */
    efaktaJQuery.getScript(this.config['host'] + this.config['widgetPage'] + parameters);
};


Ekonomifakta.getInitParameters = function() {
    
    var parameters = '?callback=Ekonomifakta.initCallback';
    parameters += '&init=true';
    parameters += ('&nocache=' + (new Date().getTime()));
    parameters += ('&lang=' + this.config['lang']);
    
    return parameters;
};

Ekonomifakta.getRequestParameters = function() {
    var parameters = '?callback=Ekonomifakta.resultCallback';
    parameters += ('&nocache=' + (new Date().getTime()));
    parameters += ('&muncipality=' + efaktaJQuery(this.inputSelector() + ' select#ekonomifakta-muncipality').val());
    parameters += ('&salary=' + efaktaJQuery(this.inputSelector() + ' input#ef-tax-wages').attr('value'));
    parameters += ('&yearOfBirth=' + efaktaJQuery(this.inputSelector() + ' input#ef-tax-born').attr('value'));
    
    return parameters;
};

Ekonomifakta.resultCallback = function(data) {

    efaktaJQuery(this.inputSelector() + ' div#ekonomifakta-loader').hide();

    if (data.Fail == "True") {
        if (data.InternalError == "True") {
            efaktaJQuery(this.errorSelector()).html(this.config['errorInternalServerError']);
            efaktaJQuery(this.errorSelector()).show();
        } else {
            /*
            efaktaJQuery(this.errorSelector()).html(this.config['errorBadInputServer']);
            efaktaJQuery(this.errorSelector()).show();
            */
        }
        
        efaktaJQuery(this.loaderSelector()).hide();
        efaktaJQuery(this.inputSelector()).show();
        
        return;
    } else
    {
        efaktaJQuery(this.errorSelector()).hide();
    }
    
    /* .html() won't work in IE7? */
    document.getElementById('ef-results-fullresultspage').innerHTML = '<a href="' + data.FullResultsPage + '" target="_blank">Kolla hur vi räknat</a>';
    document.getElementById('ef-results-employer-sum').innerHTML = this.FormatAmount(data.WorkplaceCost);
    document.getElementById('ef-results-worker-sum').innerHTML = this.FormatAmount(data.WorkerIncome);
    document.getElementById('ef-results-tax-sum').innerHTML = this.FormatAmount(data.TotalTaxes);
    
    this.moveTicker('#ef-tax-sum h1');
    
    this.loadticker(data.TotalTaxes);
    
    this.setResultVisibility(true);
};

Ekonomifakta.FormatAmount = function(rawAmount) {

    strAmount = rawAmount + "";
    output = "";

    for (var charIndex = strAmount.length - 1; charIndex >= 0; charIndex--) {
        
        if (((strAmount.length - 1) - charIndex) % 3 == 0 && (strAmount.length - 1) != charIndex)
        {
            output = this.config['thousandDelimiter'] + output;
        }
    
        output = strAmount.charAt(charIndex) + output;
    }

    return output + ' ' + this.config['amountUnit'];
};

Ekonomifakta.initCallback = function(data) {
    this.createMarkup(data);
    this.initFrontend();
    this.randomizeNumbers();
    this.hichEvents();
};

Ekonomifakta.validate = function() {

    try
    {
        var muncipalityElem = efaktaJQuery(this.inputSelector() + ' select#ekonomifakta-muncipality');
        var salaryElem = efaktaJQuery(this.inputSelector() + ' input#ef-tax-wages');
        var yearOfBirthElem = efaktaJQuery(this.inputSelector() + ' input#ef-tax-born');

        var allOk = true;
        
        if (!this.validateElementAsInt(muncipalityElem, muncipalityElem.val(), 0)) {
            allOk = false;
        }
        
        if (!this.validateElementAsInt(salaryElem, salaryElem.attr('value'), 0)) {
            allOk = false;
        }
        
        if (!this.validateElementAsInt(yearOfBirthElem, yearOfBirthElem.attr('value'), 0)) {
            allOk = false;
        }
        
        return allOk;
    }
    catch (exception)
    {}

    return false;
};

Ekonomifakta.validateElementAsInt = function(element, value, minValue) {

    if (value != parseInt(value, 10) || parseInt(value, 10) < minValue) {
        element.parent().addClass('error');
        return false;
    }
    
    element.parent().removeClass('error');
    return true;
};

Ekonomifakta.resultSelector = function() {
    return this.config['parent'] + ' div#ef-tax-sum';
};

Ekonomifakta.inputSelector = function() {
    return this.config['parent'] + ' div#ef-tax-form';
};

Ekonomifakta.loaderSelector = function() {
    return this.config['parent'] + ' div#ef-tax-loader';
};

Ekonomifakta.errorSelector = function() {
    return this.inputSelector() + ' li.ef-calculate p.error';
};





Ekonomifakta.loadinput = function() {
	var newval = efaktaJQuery("#numgo").val();
	this.loadticker(newval);
}

Ekonomifakta.moveTicker = function(pageSelector) {
    efaktaJQuery('#ef-count').insertAfter(pageSelector);
}

Ekonomifakta.loadticker = function(ticnum) {

    var number = new Number(ticnum);
  
    if (number > 99999)
    { ticnum = 99999; }

    var fticnum = this.add_commas(ticnum);
	var numheight=34;
	this.addticker(fticnum);
	
	var s = String(fticnum);
	
	for (i=s.length;i>=0; i--)
	{
		var onum=s.charAt(i);			
		efaktaJQuery("#num"+i).attr('value',onum);
	}
	
	efaktaJQuery(".counter-number").each( function() {
		var nval=efaktaJQuery(this).attr("value");
		if (!isNaN(nval)) {
			var nheight = Number(nval)*numheight*-1;
			efaktaJQuery(this).animate({
				top: nheight+'px',
				width: '25px'
			}, 1500 );
		} 
		if (nval=='.'){
			efaktaJQuery(this).animate({
				width: '0px',
				top: '-370px'
			}, 1500);
		}
	});
}

Ekonomifakta.addticker = function(newnum) {

    var digitcnt = efaktaJQuery(".counter-number").size();
	var nnum = String(newnum).length;
	var digitdiff = Number(nnum - Number(digitcnt));
	if (digitdiff <0) {
		var ltdig = (Number(nnum)-1);
		efaktaJQuery(".counter-number:gt(" + ltdig + ")").remove();
	}
	
	for(i=1;i<=digitdiff;i++) {
		efaktaJQuery(".counter-wrap").append('<div class="counter-number" id="num' + (Number(digitcnt+i-1)) + '">&nbsp;</div>');
	}
}

Ekonomifakta.add_commas = function(nStr) {

    nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + '.' + '$2');
	}
	return x1 + x2;
}

Ekonomifakta.initFrontend = function() {

    (function(efaktaJQuery){
        efaktaJQuery.fn.extend({
     
 	    customStyle : function(options) {
 	    
	      if(!efaktaJQuery.browser.msie || (efaktaJQuery.browser.msie&&efaktaJQuery.browser.version>6)){
	      
	      return efaktaJQuery('select.styled').each(function() {
    	
			    var currentSelected = efaktaJQuery('select.styled').find(':selected');
			    efaktaJQuery('select.styled').after('<span class="customStyleSelectBox"><span class="customStyleSelectBoxInner">'+currentSelected.text()+'</span></span>').css({position:'absolute', left: '5px', top: '0', width: '100%', height: '22px', opacity:0,fontSize:efaktaJQuery('select.styled').next().css('font-size')});
			    var selectBoxSpan = efaktaJQuery('select.styled').next();
			    var selectBoxWidth = parseInt(efaktaJQuery('select.styled').width()) - parseInt(selectBoxSpan.css('padding-left')) -parseInt(selectBoxSpan.css('padding-right'));			
			    var selectBoxSpanInner = selectBoxSpan.find(':first-child');
			    selectBoxSpan.css({display:'block'});
			    selectBoxSpanInner.css({display:'block'});
			    var selectBoxHeight = parseInt(selectBoxSpan.height()) + parseInt(selectBoxSpan.css('padding-top')) + parseInt(selectBoxSpan.css('padding-bottom'));
			    efaktaJQuery('select.styled').change(function(){
				    selectBoxSpanInner.text(efaktaJQuery(this).find(':selected').text()).parent().addClass('changed');
			    });
	      });
	      }
	    }
     });
    })(efaktaJQuery);


    efaktaJQuery(function(){

        efaktaJQuery('select.styled').customStyle();

    });
}


