window.getInnerWidth = function() {
    if (window.innerWidth) {
        return window.innerWidth;
    } else if (document.body.clientWidth) {
        return document.body.clientWidth;
    } else if (document.documentElement.clientWidth) {
        return document.documentElement.clientWidth;
    }
} 

window.getInnerHeight = function() {
    if (window.innerHeight) {
        return window.innerHeight;
    } else if (document.body.clientHeight) {
        return document.body.clientHeight;
    } else if (document.documentElement.clientHeight) {
        return document.documentElement.clientHeight;
    }
} 


var bpp = (function() {
	var _self = {};

	_self.init = function() {
		bpp.effects.applyHoverEffects();
		bpp.buttons.getInTouchButtonRollover();
		bpp.tailbuster.init();
		bpp.clickmyrabbit.init();
		bpp.footeraligner.init();
	};

	return _self;
}());

bpp.effects = bpp.effects || {}; // namespace effects

bpp.effects = (function() {
	var _self = {};	

	_self.applyHoverEffects = function() {
		jQuery('.attachment-post-thumbnail').mouseenter(function() {
			jQuery(this).fadeTo(300, 0.7);
		});

		jQuery('.attachment-post-thumbnail').mouseleave(function() {
			jQuery(this).fadeTo(300, 1);
		});
	};

	return _self;

}());

bpp.buttons = (function(){
	var _self = {}; 
	
	_self.getInTouchButtonRollover = function(){
		
		jQuery("#get_in_touch_button").hover(function(img){
			img.src = "/wp-content/themes/bpp/images/btn-getInTouch_over_03.png";
		}, 
		function(img){
			img.src = "/wp-content/themes/bpp/images/btn-getInTouch_03.png";
		}); 
	};
	
	return _self; 
}());

bpp.clickmyrabbit = (function(){
	var _self = {}; 
	
	_self.init = function(){
		jQuery("div#clickmyrabbit").click(function(){
			jQuery('html, body').animate({scrollTop:0}, 'slow');
		});
	};
	
	return _self; 
}());

bpp.tailbuster = (function(){
	var _self = {};	
	var tailLetters = ['g', 'j', 'p', 'q', 'y']; 
	//var noTailLetters  = 'abcdefhiklmnorstuwz';
	_align = function(){
		var txts = jQuery('.flir-replaced'); 
		for(var i = 0; i < txts.length; i++){
			var txt = jQuery(txts[i]);
			for(var j = 0; j < tailLetters.length; j++){
				if(txt.parents('.menu').length){
					continue;
				}
				if(txt.children().attr('alt').indexOf(tailLetters[j]) != -1){
					var margin = Math.floor(parseInt(txt.children().css('height'), 10) / 6)
					txt.children().css('margin-bottom', '-' + margin + 'px');
				}
			}
		}
	};
	
	_self.init = function(){
		window.setTimeout(function(){_align();}, 100);
	}; 
	
	return _self; 
}()); 

bpp.footeraligner = (function(){
	var _self = {}; 

	var _getPageHeight = function(){
		return jQuery('body').height(); 
	};

	var _getWidowHeight = function(){
//		return jQuery(window).height();
		return getInnerHeight(); 		
	}; 

	var _increaseFooterHeight = function(val){
		jQuery('div#ft').height(jQuery('div#ft').height() + val); 
	}

	_self.init = function(){
		var pw = _getPageHeight(); 
		var ww = _getWidowHeight(); 
		if(pw < ww){
			window.setTimeout(function(){_increaseFooterHeight(ww - pw)}, 50); 
		}
	}

	return _self; 
}());
 
bpp.validation = {};
bpp.validation.textcaptcha = (function(){
	var _textCaptchaAnswers = [];
	var _errorFieldList = [];
	
	function utf8_encode ( argString ) {
	    // http://kevin.vanzonneveld.net
	    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
	    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +   improved by: sowberry
	    // +    tweaked by: Jack
	    // +   bugfixed by: Onno Marsman
	    // +   improved by: Yves Sucaet
	    // +   bugfixed by: Onno Marsman
	    // +   bugfixed by: Ulrich
	    // *     example 1: utf8_encode('Kevin van Zonneveld');
	    // *     returns 1: 'Kevin van Zonneveld'

	    var string = (argString+''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");

	    var utftext = "";
	    var start, end;
	    var stringl = 0;

	    start = end = 0;
	    stringl = string.length;
	    for (var n = 0; n < stringl; n++) {
	        var c1 = string.charCodeAt(n);
	        var enc = null;

	        if (c1 < 128) {
	            end++;
	        } else if (c1 > 127 && c1 < 2048) {
	            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
	        } else {
	            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
	        }
	        if (enc !== null) {
	            if (end > start) {
	                utftext += string.substring(start, end);
	            }
	            utftext += enc;
	            start = end = n+1;
	        }
	    }

	    if (end > start) {
	        utftext += string.substring(start, string.length);
	    }

	    return utftext;
	}
	
	function md5 (str) {
	    // http://kevin.vanzonneveld.net
	    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
	    // + namespaced by: Michael White (http://getsprink.com)
	    // +    tweaked by: Jack
	    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +      input by: Brett Zamir (http://brett-zamir.me)
	    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // -    depends on: utf8_encode
	    // *     example 1: md5('Kevin van Zonneveld');
	    // *     returns 1: '6e658d4bfcb59cc13f96c14450ac40b9'

	    var xl;

	    var rotateLeft = function (lValue, iShiftBits) {
	        return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
	    };

	    var addUnsigned = function (lX,lY) {
	        var lX4,lY4,lX8,lY8,lResult;
	        lX8 = (lX & 0x80000000);
	        lY8 = (lY & 0x80000000);
	        lX4 = (lX & 0x40000000);
	        lY4 = (lY & 0x40000000);
	        lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
	        if (lX4 & lY4) {
	            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
	        }
	        if (lX4 | lY4) {
	            if (lResult & 0x40000000) {
	                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
	            } else {
	                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
	            }
	        } else {
	            return (lResult ^ lX8 ^ lY8);
	        }
	    };

	    var _F = function (x,y,z) { return (x & y) | ((~x) & z); };
	    var _G = function (x,y,z) { return (x & z) | (y & (~z)); };
	    var _H = function (x,y,z) { return (x ^ y ^ z); };
	    var _I = function (x,y,z) { return (y ^ (x | (~z))); };

	    var _FF = function (a,b,c,d,x,s,ac) {
	        a = addUnsigned(a, addUnsigned(addUnsigned(_F(b, c, d), x), ac));
	        return addUnsigned(rotateLeft(a, s), b);
	    };

	    var _GG = function (a,b,c,d,x,s,ac) {
	        a = addUnsigned(a, addUnsigned(addUnsigned(_G(b, c, d), x), ac));
	        return addUnsigned(rotateLeft(a, s), b);
	    };

	    var _HH = function (a,b,c,d,x,s,ac) {
	        a = addUnsigned(a, addUnsigned(addUnsigned(_H(b, c, d), x), ac));
	        return addUnsigned(rotateLeft(a, s), b);
	    };

	    var _II = function (a,b,c,d,x,s,ac) {
	        a = addUnsigned(a, addUnsigned(addUnsigned(_I(b, c, d), x), ac));
	        return addUnsigned(rotateLeft(a, s), b);
	    };

	    var convertToWordArray = function (str) {
	        var lWordCount;
	        var lMessageLength = str.length;
	        var lNumberOfWords_temp1=lMessageLength + 8;
	        var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
	        var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
	        var lWordArray=new Array(lNumberOfWords-1);
	        var lBytePosition = 0;
	        var lByteCount = 0;
	        while ( lByteCount < lMessageLength ) {
	            lWordCount = (lByteCount-(lByteCount % 4))/4;
	            lBytePosition = (lByteCount % 4)*8;
	            lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount)<<lBytePosition));
	            lByteCount++;
	        }
	        lWordCount = (lByteCount-(lByteCount % 4))/4;
	        lBytePosition = (lByteCount % 4)*8;
	        lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
	        lWordArray[lNumberOfWords-2] = lMessageLength<<3;
	        lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
	        return lWordArray;
	    };

	    var wordToHex = function (lValue) {
	        var wordToHexValue="",wordToHexValue_temp="",lByte,lCount;
	        for (lCount = 0;lCount<=3;lCount++) {
	            lByte = (lValue>>>(lCount*8)) & 255;
	            wordToHexValue_temp = "0" + lByte.toString(16);
	            wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length-2,2);
	        }
	        return wordToHexValue;
	    };

	    var x=[],
	        k,AA,BB,CC,DD,a,b,c,d,
	        S11=7, S12=12, S13=17, S14=22,
	        S21=5, S22=9 , S23=14, S24=20,
	        S31=4, S32=11, S33=16, S34=23,
	        S41=6, S42=10, S43=15, S44=21;

	    str = utf8_encode(str);
	    x = convertToWordArray(str);
	    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
	    
	    xl = x.length;
	    for (k=0;k<xl;k+=16) {
	        AA=a; BB=b; CC=c; DD=d;
	        a=_FF(a,b,c,d,x[k+0], S11,0xD76AA478);
	        d=_FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
	        c=_FF(c,d,a,b,x[k+2], S13,0x242070DB);
	        b=_FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
	        a=_FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
	        d=_FF(d,a,b,c,x[k+5], S12,0x4787C62A);
	        c=_FF(c,d,a,b,x[k+6], S13,0xA8304613);
	        b=_FF(b,c,d,a,x[k+7], S14,0xFD469501);
	        a=_FF(a,b,c,d,x[k+8], S11,0x698098D8);
	        d=_FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
	        c=_FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
	        b=_FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
	        a=_FF(a,b,c,d,x[k+12],S11,0x6B901122);
	        d=_FF(d,a,b,c,x[k+13],S12,0xFD987193);
	        c=_FF(c,d,a,b,x[k+14],S13,0xA679438E);
	        b=_FF(b,c,d,a,x[k+15],S14,0x49B40821);
	        a=_GG(a,b,c,d,x[k+1], S21,0xF61E2562);
	        d=_GG(d,a,b,c,x[k+6], S22,0xC040B340);
	        c=_GG(c,d,a,b,x[k+11],S23,0x265E5A51);
	        b=_GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
	        a=_GG(a,b,c,d,x[k+5], S21,0xD62F105D);
	        d=_GG(d,a,b,c,x[k+10],S22,0x2441453);
	        c=_GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
	        b=_GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
	        a=_GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
	        d=_GG(d,a,b,c,x[k+14],S22,0xC33707D6);
	        c=_GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
	        b=_GG(b,c,d,a,x[k+8], S24,0x455A14ED);
	        a=_GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
	        d=_GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
	        c=_GG(c,d,a,b,x[k+7], S23,0x676F02D9);
	        b=_GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
	        a=_HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
	        d=_HH(d,a,b,c,x[k+8], S32,0x8771F681);
	        c=_HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
	        b=_HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
	        a=_HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
	        d=_HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
	        c=_HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
	        b=_HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
	        a=_HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
	        d=_HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
	        c=_HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
	        b=_HH(b,c,d,a,x[k+6], S34,0x4881D05);
	        a=_HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
	        d=_HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
	        c=_HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
	        b=_HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
	        a=_II(a,b,c,d,x[k+0], S41,0xF4292244);
	        d=_II(d,a,b,c,x[k+7], S42,0x432AFF97);
	        c=_II(c,d,a,b,x[k+14],S43,0xAB9423A7);
	        b=_II(b,c,d,a,x[k+5], S44,0xFC93A039);
	        a=_II(a,b,c,d,x[k+12],S41,0x655B59C3);
	        d=_II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
	        c=_II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
	        b=_II(b,c,d,a,x[k+1], S44,0x85845DD1);
	        a=_II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
	        d=_II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
	        c=_II(c,d,a,b,x[k+6], S43,0xA3014314);
	        b=_II(b,c,d,a,x[k+13],S44,0x4E0811A1);
	        a=_II(a,b,c,d,x[k+4], S41,0xF7537E82);
	        d=_II(d,a,b,c,x[k+11],S42,0xBD3AF235);
	        c=_II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
	        b=_II(b,c,d,a,x[k+9], S44,0xEB86D391);
	        a=addUnsigned(a,AA);
	        b=addUnsigned(b,BB);
	        c=addUnsigned(c,CC);
	        d=addUnsigned(d,DD);
	    }

	    var temp = wordToHex(a)+wordToHex(b)+wordToHex(c)+wordToHex(d);

	    return temp.toLowerCase();
	}
	
	var _veryfyTextCaptcha = function(answer){
		if(typeof _textCaptchaAnswers == "array" && _textCaptchaAnswers.length === 0){
			return false;
		}
		
		if(typeof _textCaptchaAnswers == "string"){
			if(md5(answer.toLowerCase()) === _textCaptchaAnswers){
				return true; 
			}
		}
		
		if(typeof _textCaptchaAnswers == "object"){
			for(var i = 0; i < _textCaptchaAnswers.length; i++){
				if(md5(answer.toLowerCase()) === _textCaptchaAnswers[i]){
					return true; 
				}
			}
		}
		return false;
	};		

	
	var _displayQuestion = function(questionBoxSelector){
		jQuery.getJSON('/wp-content/themes/bpp/scripts/textcaptcha-proxy.php' , function(r){			
			jQuery(questionBoxSelector).text(r.question);
			_textCaptchaAnswers = r.answer;
		});
	}; 	
	
	return {
		init: function(){
			_displayQuestion('#textcaptchalabel');
		}, 
		validate: function(){
				var answer = jQuery('#textcaptcha').val();				
				if(_veryfyTextCaptcha(answer)){
					return true; 
				} else {
					_errorFieldList[0] = jQuery('#textcaptcha')[0];					
					return false;
				}
				return false;
		}, 
		getBadFields: function(){
			return _errorFieldList; 
		}			
	}; 
	
}());	

bpp.validation.requiredFields = (function(){
	var _requiredFieldList = [];
	var _errorFieldList = []; 
	var _registerRequiredField = function(field){
		if(typeof field == 'object'){
			_requiredFieldList.push(field);
		} else {
			throw new Error("field is not an object but " + typeof field);
		}
	};
	
	return {
		init: function(){
			jQuery('input.required').each(function(index){
				_requiredFieldList.push(this);
				
			});
			jQuery('textarea.required').each(function(index){
				_requiredFieldList.push(this);										
			});				
		}, 
		validate: function(){
			_errorFieldList = [];
			for(var i = 0; i < _requiredFieldList.length; i++){				
				if(jQuery.trim(jQuery(_requiredFieldList[i]).val()).length == 0){
					_errorFieldList.push(_requiredFieldList[i]);					
				}					
			}
			if(_errorFieldList.length == 0) return true; 
			else return false; 
		}, 
		getBadFields: function(){				
			return _errorFieldList;
		}
	};
	
}());

bpp.validation.errorPrompts = (function(){
	
	var _getTitle = function(field){
		if(jQuery(field).hasClass('textcaptcha')){
			return "Please answer the question."; 
		}
		return "This field is required"; 
	};
	
	return {
		showPrompt: function(fieldList, errorType){			
			for(var i = 0; i < fieldList.length; i++){
				
				jQuery(fieldList[i]).attr("title", _getTitle(fieldList[i]));					
					
				//console.log(i);
				var tooltip = jQuery(fieldList[i]).tooltip({
					events: {							  
					  input:   " , blur"
					}, 
					position: "center left",

					// a little tweaking of the position
					offset: [0, 0],
					
					// use the built-in fadeIn/fadeOut effect
					//effect: jQuery.browser.msie ? undefined : "fade"
                                        effect: "fade"
					
				});
				
				if(typeof tooltip.data === 'function'){					
					tooltip.data('tooltip').show();
				} else if (typeof tooltip == 'object'){				
					tooltip.show(); 
				}									
			}			
		}			
	};
}());

bpp.validation.attachForm = function(formSelector){
	bpp.validation.textcaptcha.init(formSelector);
	bpp.validation.requiredFields.init(formSelector);
	
	jQuery(formSelector).submit(function(){
		var valResult = bpp.validation.textcaptcha.validate(); 
		valResult = bpp.validation.requiredFields.validate() && valResult; 
		if(!valResult){
			var errorFieldList = bpp.validation.textcaptcha.getBadFields(); 
			var emptyRequiredFields = bpp.validation.requiredFields.getBadFields();				
			bpp.validation.errorPrompts.showPrompt(errorFieldList, "textCaptcha");
			bpp.validation.errorPrompts.showPrompt(emptyRequiredFields, "required");
		} else {
			this.submit();
		}	
		return valResult; 
	});
};




bpp.facebook = (function() {
	var _self = {};

	var // private
	_API_KEY = "4be1e9ba1df8422c62ee86d87329bae7", // bpp.dev
	_JS_FBLOADER = location.protocol + '//connect.facebook.net/en_US/all.js',
	_events = [],   // canceledDialog,
					// sessionReady,
					// sessionDeleted,
					// onConnected

	_fireEvent = function(eventName) {
		if (typeof _events[eventName] == "function") {
			_events[eventName]();
		}
	},

	_isFB = function() {
		var is = false;
		if (typeof FB != "undefined") {
			if (typeof FB.init == "function" 
					&& typeof FB.Connect != "undefined") {
				is = true;
			}
		}

		return is;
	},
	
	_loadJS = function(url, callback) {
		var script = document.createElement("script");
		var fbRootDiv = document.createElement("div");

		script.type = "text/javascript";
		fbRootDiv.id = "fb-root";

		if (script.readyState) { // IE
			script.onreadystatechange = function() {
				switch (script.readyState) {
				case "loaded":
				case "complete":
					script.onreadystatechange = null;
					callback();
				}
			}
		} else { // Other browsers
			script.onload = callback;
		}

		script.src = url;
		var place = document.getElementsByTagName("head")[0] || document.body
				|| document.documentElement;

		place.appendChild(script);
		document.body.appendChild(fbRootDiv);
	},

	_initFB = function(callback) {
		_loadJS(_JS_FBLOADER, function() {
			FB.init({
				appId : _API_KEY,
				status : true,
				cookie : true				
			});

			if (typeof callback == "function") callback();
		});
	},

	_login = function(callback) {
		if(FB.getSession()){
			if(typeof callback == "function") callback();
			return;
		}; 
		FB.login(function(response) {
			if (response.session) {
				_fireEvent("onConnected");
			} else {
				_fireEvent("canceledDiaglog");
			}
			if(typeof callback == "function") callback(response);			
		}, {
			perms : 'publish_stream'
		});
	},

	_logout = function(callback) {		
		if (FB.getSession()) {
			FB.logout(function(response) {					
				if(typeof callback == "function") callback();
			});
		} else {
			if(typeof callback == "function") callback();
		}
		_fireEvent("sessionDeleted");		
	},

	_authenticate = function(callback) {
		if (_isFB()) {
			_login(callback);
		} else {			
			_initFB(function(){_login(callback);});
		}
	},

	_logoutAndAutenticate = function(callback) {
		if (_isFB()) {
			_logout(function(){
				_login(callback);
			});
		} else {
			_initFB(function() {
				_logout(function(){
					_login(callback);
				});
			});
		}
	};

	
	_self.configSession = function(forceDeactivation, callback) {
		if (forceDeactivation) {
			_logoutAndAutenticate(callback);
		} else {
			_authenticate(callback);
		}
	};
	
	_self.loadFacebookLib = function(){
		if(!_isFB()){
			_initFB(); 
		}
	};
	

	/* Events */

	/**
	 * @param {string}
	 *            eventName
	 * @return {boolean}
	 */
	_self.isEventSet = function(eventName) {
		return typeof _events[eventName] == "function";
	};

	/**
	 * @param eventsHash
	 * @param override
	 */
	_self.setEvents = function(eventsHash, override) {
		override = !!override;
		for ( var event in eventsHash) {
			if (_events[event] != eventsHash[event] || override) {
				_events[event] = eventsHash[event];
			}
		}
	};

	/**
	 * 
	 */
	_self.destroyEvents = function() {
		for ( var i = 0, len = arguments.length; i < len; i++) {
			delete _events[arguments[i]];
		}
	};

	return _self;
}());


//namespace bpp.facebook.popups
bpp.facebook = bpp.facebook || {}; 
bpp.facebook.popups = (function(){
	var _self = {}; 
	
	_self.showSharePopup = function(){
		console.log(jQuery('#facebook-share-dialog-form').dialog().show());
	};
	
	/**
	 * TODO: Make me working first! :) 
	 */
	_self.shareNativePopup = function(shareData) {		
		function share(){
			FB.ui(shareData, function(response) {});
		}		
		bpp.facebook.configSession(false, share);
		
	};
	
	return _self; 
}());

