(function($) {
    var locationWrapper = {
        put: function(hash, win) {
            (win || window).location.hash = encodeURIComponent(hash);
        },
        get: function(win) {
            var hash = ((win || window).location.hash).replace(/^#/, '');
            return $.browser.fx ? hash : decodeURIComponent(hash);
        }
    };

    var iframeWrapper = {
        id: "__jQuery_history",
        init: function() {
            var html = '<iframe id="'+ this.id +'" style="display:none" src="javascript:false;" />';
            $("body").prepend(html);
            return this;
        },
        _document: function() {
            return $("#"+ this.id)[0].contentWindow.document;
        },
        put: function(hash) {
            var doc = this._document();
            doc.open();
            doc.close();
            locationWrapper.put(hash, doc);
        },
        get: function() {
            return locationWrapper.get(this._document());
        }
    };

    // public base interface
    var _ = {
        appState: undefined,
        callback: undefined,
        init: function(callback) {},
        check: function() {},
        load: function(hash) {}
    };
    $.history = _;

    var SimpleImpl = {
        init: function(callback) {
            _.callback = callback;
            var current_hash = locationWrapper.get();
            _.appState = current_hash;
            _.callback(current_hash);
            setInterval(_.check, 100);
        },
        check: function() {
            var current_hash = locationWrapper.get();
            if(current_hash != _.appState) {
                _.appState = current_hash;
                _.callback(current_hash);
            }
        },
        load: function(hash) {
            if(hash != _.appState) {
                locationWrapper.put(hash);
                _.appState = hash;
                _.callback(hash);
            }
        }
    };

    var IframeImpl = {
        init: function(callback) {
            _.callback = callback;
            var current_hash = locationWrapper.get();
            _.appState = current_hash;
            iframeWrapper.init().put(current_hash);
            _.callback(current_hash);
            setInterval(_.check, 100);
        },
        check: function() {
            var current_hash = iframeWrapper.get();
            if(current_hash != _.appState) {
                locationWrapper.put(current_hash);
                _.appState = current_hash;
                _.callback(current_hash);
            }
        },
        load: function(hash) {
            if(hash != _.appState) {
                locationWrapper.put(hash);
                iframeWrapper.put(hash);
                _.appState = hash;
                _.callback(hash);
            }
        }
    };

    if($.browser.msie && ($.browser.version < 8 || document.documentMode < 8)) {
        $.extend(_, IframeImpl);
    } else {
        $.extend(_, SimpleImpl);
    }
})(jQuery);

(function($) {
	$.fn.customHide = function(speed, callback) {
		$(this).hide(speed, function() {
			if(jQuery.browser.msie)
				$(this).get(0).style.removeAttribute('filter');
			if(callback != undefined)
				callback();
		});
	};
	$.fn.customShow = function(speed, callback) {
		$(this).show(speed, function() {
			if(jQuery.browser.msie)
				$(this).get(0).style.removeAttribute('filter');
			if(callback != undefined)
				callback();
		});
	};
	$.fn.customFadeIn = function(speed, callback) {
		$(this).fadeIn(speed, function() {
			if(jQuery.browser.msie)
				$(this).get(0).style.removeAttribute('filter');
			if(callback != undefined)
				callback();
		});
	};
	$.fn.customFadeOut = function(speed, callback) {
		$(this).fadeOut(speed, function() {
			if(jQuery.browser.msie)
				$(this).get(0).style.removeAttribute('filter');
			if(callback != undefined)
				callback();
		});
	};
	$.fn.customAnimate = function(params, duration, easing, callback) {
		$(this).animate(params, duration, easing, function() {
			if(jQuery.browser.msie)
				$(this).get(0).style.removeAttribute('filter');
			if(callback != undefined)
				callback();
		});
	};
})(jQuery);


(function($) {
	$.fn.featuredProjects = function(options) {
		options = $.extend({
			'currentActive' : "#ftab1"
		}, options);

		function switchProject(obj, e) {
			e.preventDefault();
			var selected = $(obj).attr('href');
			$(options.currentActive+' div').cycle('destroy');
			if (options.currentActive != selected) {
				$(options.currentActive).customFadeOut(400, function() {
					$(selected).customFadeIn(400, function() {
						animateProject(selected);
					})
				});
				options.currentActive = selected;
				$('#fbttarea a').removeClass('active');
				$(obj).addClass('active');
			}
		}

		function animateProject(obj) {
			$(obj+' div').cycle({
				timeout: 3000
				,speed: 800
				,delay: -3000
				,sync: 1
				,fx: 'scrollLeft,scrollRight,scrollUp,scrollDown,fade,wipe,toss,growX,growY,cover,uncover'
			});
		}

		animateProject(options.currentActive);

		return this.unbind('click').click(function(e) {
			switchProject(this, e);
		});
	}
})(jQuery);

(function($) {
	$.fn.dynamicList = function(options) {
		options = $.extend({
			'currentActive' : "#list-1"
			,'bkgndId': '#grow2-col2'
			,'callback': function() {}
		}, options);

		function f_init(obj, e) {
			try {
				e.preventDefault();
				var selected = $(obj).attr('href');
				selected = selected.replace(/^.*#/, '#');
				if (options.currentActive != selected) {
					$(options.currentActive).customFadeOut(100, function() {$(selected).customFadeIn(200, function() {$(options.bkgndId).addBkgnd({'cornerHeight': 0});})});
					options.currentActive = selected;
					$(obj).parent().parent().find('a').removeClass('active');
					$(obj).addClass('active');
				}
			} catch (e) { }
		}

		// initialise
		try {
			var anchor = window.location.href;
			if (anchor.indexOf('#') != -1) {
				anchor = anchor.replace(/^.*#/, '');
				options.currentActive = '#'+anchor;
			} else {
				options.currentActive = "#list-1";
			}
			$(this).removeClass('active');
			$(this).each(function() {
				if ($(this).attr('href') == options.currentActive) {
					$(this).addClass('active');	
				}
			});
			var minHeight = $(this).parent().parent().outerHeight();
			$('div[id^=list-]').css({'display': 'none', 'min-height': minHeight});
			$(options.currentActive).css('display', 'block');
			$(options.bkgndId).addBkgnd({'cornerHeight': 0});
		} catch (e) { }

		$("a.dynamicList-link").unbind('click').click(function(e) {
			var selected = $(this).attr('href');
			selected = selected.replace(/^.*#/, '#');
			$('.sec-nav a').each(function() {
				if ($(this).attr('href') == selected) {
					f_init(this, e);
				}
			});
		});

		return this.unbind('click').click(function(e) {
			f_init(this, e);
		});
	}
})(jQuery);

(function($) {
	$.fn.fixNewsLayout = function(options) {
		options = $.extend({}, options);

		function fixLayout(obj) {
			var maxHeight = 40;	// min height
			obj.each(function() {
				if ($(this).height() > maxHeight) {
					maxHeight = $(this).height();
				}
			});
			maxHeight = maxHeight + 20;
			obj.each(function() {
				$(this).height(maxHeight);
			});
		}

		fixLayout(this);
		$(this).parent().find(":first-child").addClass("first");
		$(this).parent().find(":last-child").addClass("last");
	}
})(jQuery);

(function($) {
	$.fn.addBkgnd = function(options) {
		options = $.extend({
			'containerWidth' : 1100
			,'cornerHeight': 28
		}, options);

		function add_background(obj) {
			$('body').append('<div id="panel"></div>');
			var winWidth = $(window).width();
			var left = "50%";
			var width = (winWidth / 2);
			if (winWidth < options.containerWidth) {
				// Change to fixed width when the window size is smaller than the container width
				left = (options.containerWidth / 2)+"px";
				width = (options.containerWidth / 2)+"px";
			}
			var pos = $(obj).offset();
			$('#panel').css({
				'position': 'absolute'
				,'top': (pos.top + options.cornerHeight)+"px"
				,'left': left
				,'width': width
				,'height': ($(obj).outerHeight() - options.cornerHeight)+"px"
				,'border': '0'
				,'background-color': '#efefef'
				,'z-index': '0'
				,'overflow': 'hidden'
			});
			$('#panel').show();
		}

		$(window).resize(function() {
			add_background(_self);
		});

		var _self = this;
		add_background(_self);

	}
})(jQuery);

function rewriteEmail() {
	try {
		var emailadr = String.fromCharCode(105, 110, 102, 111, 64, 108, 117, 109, 105, 110, 111, 115, 105, 116, 121, 46, 99, 111, 109, 46, 97, 117);
		$('span.email').html('<a href="mai'+'lto:'+emailadr+'">'+emailadr+'</a>');
	} catch (e) { }
}

function animateMasthead() {
	$('#flash').cycle({
		timeout: 4000
		,speed: 800
		,delay: 500
		,sync: 1
	});
}

(function($) {
	$.fn.animateNav = function(options) {
		options = $.extend({}, options);

		function animate(obj) {
			var time = 800;
			$(obj).each(function() {
				time += 400;
				$(this).children().css({'background-color': "#dddddd"}).animate({backgroundColor: "#ffffff"}, 2400);
				$(this).effect('slide',options, time);
			});
		}
		animate($(this));
	}
})(jQuery);

