Function.prototype.curry = function(context, args) {
    var fn = this;
    if (context == null) {
        context = this;
    }
    if (args == null) {
        args = [];
    }
    //args = Array.prototype.slice.call(arguments);
    return function() {
        return fn.apply(context, args.concat(
        Array.prototype.slice.call(arguments)));
    };
};

findFieldContainer = function (field) {
	return $(field).closest('tr');
}


if (typeof(initForm) == 'undefined') {
	initForm = function () {
	}
}

if (typeof(woopraTracker) == 'undefined') {
	woopraTracker = {};
}

showTermsPopup = function () {
	window.open('/terms-popup', '_blank',"scrollbars=1,width=800,height=600")
}

showFormLoader = function() {
	if ($('#form_loader').length == 0) {
		var loader = document.createElement('div');
		loader.className = 'form_loader';
		loader.style.display = 'none';
		loader.id = 'form_loader';
		$(document.body).append(loader);
	}
	
	var h = $('.form_block').height();
	var w = $('.form_block').width();
	var offset = $('.form_block').offset();
	
	$('#form_loader').height(h);
	$('#form_loader').width(w);
	$('#form_loader').css('top', offset.top);
	$('#form_loader').css('left', offset.left);
	$('#form_loader').show();
}

hideFormLoader = function() {

	$('#form_loader').hide();
}

submitForm = function () {

	var loanform = $(this).closest('.loanform');
	var formBlock = loanform.closest('.form_block');	
	formBlock.find('.form_submit_btn').attr('disabled', true);
	
	if (woopraEnabled && typeof(woopraTracker) != null && typeof(woopraTracker.trackLeadForm) != null) {
		woopraTracker.trackLeadForm(loanform);
	}
	
	var data = loanform.serialize();
	
	showFormLoader();

	jQuery.post(loanform.attr('action') + "?r=" + Math.random(),
		   		data,
		   		function(response) {	
					formBlock.html(response);
					if (initForm) {
						initForm();
					}

					formBlock.find('.form_submit_btn').disabled = false;
				}, 'html'		   		
	
	);

}

backForm = function () {
	
	var loanform = $(this).closest('.loanform');
	var formBlock = loanform.closest('.form_block');	
	
	formBlock.find('.form_back_btn').attr('disabled', true);
	$('#form_back').val("1");

	var data = loanform.serialize();
	
	
	jQuery.post(loanform.attr('action'),
		   		data,
		   		function(response) {	
					formBlock.html(response);
					if (initForm) {
						initForm();
					}

					formBlock.find('.form_submit_btn').disabled = false;
					window.scroll(0,0);
				}, 'html'		   		
	
	);	
	
}

initFormDefault = function () {
	if ($('.form_submit_btn').length > 0) {
		$('.form_submit_btn').bind('click', submitForm);
		$('.form_submit_btn').attr('disabled', false);
	}	
	if ($('.form_back_btn').length > 0) {
		$('.form_back_btn').bind('click', backForm);
		$('.form_back_btn').attr('disabled', false);
	}
}



showFieldDescription = function(parent) {
	
	var el = $(parent).children('.description');
	el = el.get(0);
	
	if (el.style.display == 'none') {
		
		var els = $('#deal_view_table').children('.description');
		
		for (var i = 0; i < els.length; i++) {
			$(els[i]).hide();
		}
		
		$(el).show();
	} else {
		$(el).hide();
	}
}
parseUrl = function (str) {
	var tokens = str.split('&');
	var result = {};
	for (var i = 0; i < tokens.length; i++) {
		var t = tokens[i].split('=');
		if (t.length > 1) {
			result[t[0]] = t[1];		
		}
	}
	
	return result;
}

getUrlVars = function() {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}
function addSelectOption(el, value, text) {
	var option = document.createElement("OPTION");
	option.value = value;
	option.innerHTML = text;
	// @todo
	$(el).append(option);
	
	return option;
}

loadSelect = function(element, data, selected, emptyText) {
	
	$(element).html('');
	$(element).append('<option value="">' + emptyText + '</option>');
	for (var i in data) {
		$(element).append('<option value="' + i + '">' + data[i] + '</option>');
	}
	if (selected != null) {
		$(element).val(selected);
	}
}

var Base64 = {
		 
		// private property
		_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
	 
		// public method for encoding
		encode : function (input) {
			var output = "";
			var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
			var i = 0;
	 
			input = Base64._utf8_encode(input);
	 
			while (i < input.length) {
	 
				chr1 = input.charCodeAt(i++);
				chr2 = input.charCodeAt(i++);
				chr3 = input.charCodeAt(i++);
	 
				enc1 = chr1 >> 2;
				enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
				enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
				enc4 = chr3 & 63;
	 
				if (isNaN(chr2)) {
					enc3 = enc4 = 64;
				} else if (isNaN(chr3)) {
					enc4 = 64;
				}
	 
				output = output +
				this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
				this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
	 
			}
	 
			return output;
		},
	 
		// public method for decoding
		decode : function (input) {
			var output = "";
			var chr1, chr2, chr3;
			var enc1, enc2, enc3, enc4;
			var i = 0;
	 
			input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
	 
			while (i < input.length) {
	 
				enc1 = this._keyStr.indexOf(input.charAt(i++));
				enc2 = this._keyStr.indexOf(input.charAt(i++));
				enc3 = this._keyStr.indexOf(input.charAt(i++));
				enc4 = this._keyStr.indexOf(input.charAt(i++));
	 
				chr1 = (enc1 << 2) | (enc2 >> 4);
				chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
				chr3 = ((enc3 & 3) << 6) | enc4;
	 
				output = output + String.fromCharCode(chr1);
	 
				if (enc3 != 64) {
					output = output + String.fromCharCode(chr2);
				}
				if (enc4 != 64) {
					output = output + String.fromCharCode(chr3);
				}
	 
			}
	 
			output = Base64._utf8_decode(output);
	 
			return output;
	 
		},
	 
		// private method for UTF-8 encoding
		_utf8_encode : function (string) {
			string = string.replace(/\r\n/g,"\n");
			var utftext = "";
	 
			for (var n = 0; n < string.length; n++) {
	 
				var c = string.charCodeAt(n);
	 
				if (c < 128) {
					utftext += String.fromCharCode(c);
				}
				else if((c > 127) && (c < 2048)) {
					utftext += String.fromCharCode((c >> 6) | 192);
					utftext += String.fromCharCode((c & 63) | 128);
				}
				else {
					utftext += String.fromCharCode((c >> 12) | 224);
					utftext += String.fromCharCode(((c >> 6) & 63) | 128);
					utftext += String.fromCharCode((c & 63) | 128);
				}
	 
			}
	 
			return utftext;
		},
	 
		// private method for UTF-8 decoding
		_utf8_decode : function (utftext) {
			var string = "";
			var i = 0;
			var c = c1 = c2 = 0;
	 
			while ( i < utftext.length ) {
	 
				c = utftext.charCodeAt(i);
	 
				if (c < 128) {
					string += String.fromCharCode(c);
					i++;
				}
				else if((c > 191) && (c < 224)) {
					c2 = utftext.charCodeAt(i+1);
					string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
					i += 2;
				}
				else {
					c2 = utftext.charCodeAt(i+1);
					c3 = utftext.charCodeAt(i+2);
					string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
					i += 3;
				}
	 
			}
	 
			return string;
		}
	 
}

var Cookie = {
		set: function(name,value,seconds){
			if(seconds){
				var d = new Date();
				d.setTime(d.getTime() + (seconds * 1000));
				var expiry = '; expires=' + d.toGMTString();
			}else
				var expiry = '';
			document.cookie = name + "=" + value + expiry + "; path=/";
		},
		get: function(name){
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i = 0; i < ca.length; i++){
				var c = ca[i];
				while(c.charAt(0) == ' ')
					c = c.substring(1,c.length);
				if(c.indexOf(nameEQ) == 0)
					return c.substring(nameEQ.length,c.length);
			}
			return null;
		},
		unset: function(name){
			Cookie.set(name,'',-1);
		}
	};

function woopraReady(tracker) {
	
	 tracker.setDomain(trackingDomain);
	 tracker.setIdleTimeout(300000);	
	 tracker.trackPageview({type:'pageview',url:window.location.pathname+window.location.search,title:document.title});
	    
	woopraTracker.trackExternal = function (pageUrl, pageTitle) {	
		
	    var ev = new WoopraEvent(pageUrl);
        ev.addProperty('type','exit');
        ev.fire();
        this.sleep(600);		
	};

	woopraTracker.trackLeadForm = function (form) {

		var ev = new WoopraEvent('Lead Form Submit');
		ev.addProperty("id", form.find('#lead_id').val());
		ev.addProperty("step", form.find('#step').val());
		ev.addProperty("form type", form.find('#form_type').val());
		if (form.find('#form_first_name').length > 0) { 
			ev.addProperty("name", form.find('#form_first_name').val());
			ev.addProperty("surname", form.find('#form_first_surname').val());			
		}
		
		if (form.find('#form_loan_amount').length > 0) { 
			ev.addProperty("loan_amount", form.find('#form_loan_amount').val());			
		}
		
		if (form.find('#form_property_value').length > 0) { 
			ev.addProperty("property_value", form.find('#form_property_value').val());			
		}
		
		if (form.find('#form_loan_repayment_period').length > 0) { 
			ev.addProperty("loan_repayment_period", form.find('#form_loan_repayment_period').val());			
		}
		
		if (form.find('#form_loan_type').length > 0) { 
			ev.addProperty("loan_type", form.find('#form_loan_type option:selected').html());			
		}

		if (form.find('#form_loan_purpose').length > 0) { 
			ev.addProperty("loan_purpose", form.find('#form_loan_purpose option:selected').html());			
		}

		if (form.find('#form_mortgage_balance').length > 0) { 
			ev.addProperty("mortgage_balance", form.find('#form_mortgage_balance option:selected').html());			
		}
		
		
		
		ev.fire();					
	};		
	

	woopraTracker.trackLeadFormLoaded = function (form) {
		// disabled form loading tracking
		return false;
		
		var ev = new WoopraEvent('Lead Form Loaded');
		ev.addProperty("id", form.find('#lead_id').val());
		ev.addProperty("step", form.find('#step').val());
		ev.addProperty("form type", form.find('#form_type').val());
		if (form.find('#form_first_name').length > 0) { 
			ev.addProperty("name", form.find('#form_first_name').val());
			ev.addProperty("surname", form.find('#form_first_surname').val());			
		}
		
		ev.fire();					
	};		
	
	
	woopraTracker.trackCalculator = function (title, data) {

		var ev = new WoopraEvent('Calculator');
		ev.addProperty('type', title);
	
		for (var i in data) {
			ev.addProperty(i, data[i]);
		}
		
		ev.fire();					
	};	
	
	woopraTracker.trackNewsletterSubscription = function (value) {						
		var ev = new WoopraEvent('Newsletter subscription');
		ev.addProperty("email", value);
		ev.fire();	
	};
	
	woopraTracker.trackNewsletterSubscriptionConfirmed = function (value) {						
		var ev = new WoopraEvent('Newsletter subscription confirmed');
		ev.addProperty("email", value);
		ev.fire();
	};	
	
	woopraTracker.trackNewsletterUnsubscribe = function (value) {						
		var ev = new WoopraEvent('Newsletter unsubscribed');
		ev.addProperty("email", value);
		ev.fire();
	};
	

	woopraTracker.trackContactForm = function (value) {						
		var ev = new WoopraEvent('Contact form submit');
		ev.addProperty("email", value);
		ev.fire();	
	};
	
	woopraTracker.trackTrackingData = function (trackingData) {
		
		 
		var ev = new WoopraEvent('Tracking data on form success');
		

		ev.addProperty("source", trackingData.source);
		ev.addProperty("keyword", trackingData.keyword);
		ev.addProperty("referrer", trackingData.referrer);
		ev.fire();	
	};
	
	woopraTracker.trackCampaign = function () {
		
		var q = document.location.search;

		if (q.length == 0) {
			return;
		}
		
		if (q.charAt(0) == '?') {
			q = q.substr(1, q.length - 1);  
		}
	
		var tokens = parseUrl(q);

	
		if (typeof(tokens['utm_source']) == 'undefined' || typeof(tokens['utm_medium']) == 'undefined') {
			return;		
		}

		var data = {};
		if (typeof(trackingData.source) != 'undefined') {
			data.name = trackingData.source;
		} else {
			data.name = 'PPC';			
		}
	
		if (typeof(tokens['utm_source']) != 'undefined') {
			data.utm_source = tokens['utm_source'];	
		}
		if (typeof(tokens['utm_medium']) != 'undefined') {
			data.utm_medium = tokens['utm_medium'];	
		}
		
		if (typeof(data.utm_source) != 'undefined' && data.utm_source == "YahooSM") {
			if (typeof(tokens['OVRAW']) != 'undefined') {
				data.utm_term = tokens['OVRAW'];	
			}	
			
			if (typeof(tokens['OVKEY']) != 'undefined') {
				data.utm_term_key = tokens['OVKEY'];	
			}	
		} else {			
			if (typeof(tokens['utm_term']) != 'undefined') {
				data.utm_term = tokens['utm_term'];	
			}			
		}
		
		if (typeof(tokens['utm_content']) != 'undefined') {
			data.utm_content = tokens['utm_content'];	
		}
		if (typeof(tokens['utm_campaign']) != 'undefined') {
			data.utm_campaign = tokens['utm_campaign'];	
		}
		if (typeof(tokens['Network']) != 'undefined') {
			data.Network = tokens['Network'];	
		}
		if (typeof(tokens['SiteTarget']) != 'undefined') {
			data.SiteTarget = tokens['SiteTarget'];	
		}
		

	    woopraTracker.pushEvent(data);	
	};
	woopraTracker.trackCampaign();
	return false;
}


$(function () {

	woopraTracker = {};
	woopraTracker.trackExternal = function () {};
	woopraTracker.trackLeadForm = function () {};
	woopraTracker.trackLeadFormLoaded = function () {};
	woopraTracker.trackTrackingData = function () {};
	woopraTracker.trackNewsletterSubscription = function () {};
	woopraTracker.trackNewsletterSubscriptionConfirmed = function () {};
	woopraTracker.trackNewsletterUnsubscribe = function () {};
	woopraTracker.trackContactForm = function () {};
	woopraTracker.trackCalculator = function () {};
	
	if (woopraEnabled) {
		
		var wsc = document.createElement('script');
	    wsc.src = document.location.protocol+'//static.woopra.com/js/woopra.js';
	    wsc.type = 'text/javascript';
	    wsc.async = true;
	    var ssc = document.getElementsByTagName('script')[0];
	    ssc.parentNode.insertBefore(wsc, ssc);	    
	
		
	} else {
	}	
});

