(function() {
	// the times (in millis) for fade in and fade out
	var FADE_IN = 400;
    var FADE_OUT = 500;
	
    var convTypes = jwyre.array("software", "marketing", "web", "tech");
    // the currently displayed window
	var currentWin;
    // the currently displayed page
    var currentPage;
    // the currently displayed conversation graphics
	var currentConvo;
	
	// obtains the next page, if there is one to display
	function getNextPage() {
		if (currentPage == null) {
			return null;
		}
		var next = currentPage;
		do {
			next = next.nextSibling;
	        if (next == null) {
				next = jwyre.children(jwyre.parent(currentPage)).first();
	        }
			if (jwyre.attribute(next, "class") == "page") {
				return next;
			}
		} while (true);
	}

    // obtains the last page, if there is one to display
    function getLastPage() {
        if (currentPage == null) {
            return null;
        }
        var last = currentPage;
        do {
            last = last.previousSibling;
            if (last == null) {
                last = jwyre.children(jwyre.parent(currentPage)).last();
            }
            if (jwyre.attribute(last, "class") == "page") {
                return last;
            }
        } while (true);
    }
	
	var isActive = false;
	// hides or shows arrows for current page according to whether siblings are present
    function updateArrows() {
		if (currentPage == null) {
			return;
		}
		var next = getNextPage();
		if (next == currentPage) {
            isActive = false;
			if (jwyre.isIE(6)) {
				return;
			}
			jwyre.hide("#downArrow");
            jwyre.hide("#upArrow");
		} else {
            isActive = true;
            if (jwyre.isIE(6)) {
                return;
            }
            jwyre.show("#downArrow");
            jwyre.show("#upArrow");			
		}
	}
		
    	
	// returns an array of images to preload
	function imgs() {
		var imgAry = jwyre.array();
		for (var i = convTypes.iterator(); i.hasNext();) {
			var type = i.next();
			imgAry.push("url(./images/" + type + "Selected.png)");
            imgAry.push("url(./images/" + type + "Question.png)");
            imgAry.push("url(./images/" + type + "Response.png)");
            imgAry.push("url(./images/" + type + ".png)");
            
		}
		return imgAry;
	}
	
	/**
	 * 
	 * @param {string} type
	 */
	function showConversation(type, doFade) {
		jwyre.style("#" + type + "Bkgrnd", "background-image", "url(./images/" + type + "Selected.png)");
		if (jwyre.isIE(6)) {
            jwyre.fixPng("#" + type + "Bkgrnd");
		}
		jwyre.style("#" + type + "Conv", "visibility", "visible");
        // don't fade for IE 7 or IE 6...looks like crap
		if (jwyre.isIE(7) || jwyre.isIE(6) || jwyre.isIE(8)) {
	        if (jwyre.isIE(6)) {
	            jwyre.fixPng("#" + type + "Question");
	            jwyre.fixPng("#" + type + "Response");
	        }
			$("#" + type + "Question").show();
			window.setTimeout(
				function() {
					if (currentConvo == type) {
                        $("#" + type + "Response").show();
                        $("#" + type + "Conv").show();
                    } else {
                        hideConversation(type, true);
                    }
	            }, 
				FADE_IN);
		} else if (doFade) {
			$("#" + type + "Question").fadeIn(FADE_IN, 
				function() {
					if (currentConvo == type) {
	                    $("#" + type + "Response").fadeIn(FADE_IN);
                        $("#" + type + "Conv").fadeIn(FADE_IN,
                            function() {
                                if (currentConvo != type) {
                                    hideConversation(type, true);                   
                                }                               
                            }  
                        );
					} else {
						hideConversation(type, true);
					}
				}
			);
		}
	}
	
    /**
     * 
     * @param {string} type
     */
	function hideConversation(type, doFade, callback) {
        jwyre.style("#" + type + "Bkgrnd", "background-image", "url(./images/" + type + ".png)");
        if (jwyre.isIE(6) || jwyre.isIE(8)) {
            jwyre.fixPng("#" + type + "Bkgrnd");
        }
		callback = (callback === undefined) ? function() {} : callback;
		// don't fade for IE 7 or IE 6...looks like crap
        if (doFade && !jwyre.isIE(7) && !jwyre.isIE(6) && !jwyre.isIE(8)) {
			$("#" + type + "Response").fadeOut(FADE_OUT);
            $("#" + type + "Question").fadeOut(FADE_OUT,
				function() {
		            $("#" + type + "Question").hide();
		            $("#" + type + "Response").hide();
		            $("#" + type + "Conv").hide();
                    callback();					
				}
			);
        } else {
            $("#" + type + "Response").hide();
            $("#" + type + "Question").hide();
            $("#" + type + "Conv").hide();
            callback(); 
        }
	}
    
	// get references to these first time a dyn win is shown
	var background, content, container;
    
	var customSideIds = jwyre.array("aboutUs", "contactUs", "faq", "client", "gallery");
    var customSideImgs = jwyre.array("#aboutUsHeader", "#contactUsHeader", "#faqHeader", "#clientsHeader", "#projectsHeader");
	var currSideImg;
	
    // used to display the client window
    function showWindow(textId, cb) {
		currentWin = textId.replace("Text", "");
        var bW = 50, cW = 137;
        var id = "#" + textId ;
		if (!background) {
			background = jwyre.element("#containerBackground");
			content = jwyre.element("#containerContent");
			container = jwyre.element("#container");
		}
		// reset the pages to original positioning
        jwyre.position(id + " .page", 0, 0);
	    // hide triggers
		jwyre.style(".trigger", "display", "none");
        jwyre.style(background, "width", bW + "px");
        jwyre.style(content, "width", cW + "px");
		jwyre.hide(id + " *");
        jwyre.show(container);
        jwyre.show("#container *");
        
        jwyre.hide(".sideImg");
		if (customSideIds.contains(currentWin)) {
			var ind = customSideIds.indexOf(currentWin);
			currSideImg = customSideImgs[ind];
			jwyre.show(currSideImg);
		}
		
        // hide all pages but first
		// returns the showing page
		function hidePages() {
	        var hide = false;
			var curr;
	        jwyre.elements(id + " .page").each(
	            function(item) {
	                if (hide) {
	                    jwyre.hide(item);   
	                } else {
						curr = item;
					}
	                hide = true;
	            }
	        );
			return curr;
		}
		currentPage = hidePages();
		if (!jwyre.isIE(7) && !jwyre.isIE(6)) {
			updateArrows();
		}
		jwyre.hide(currentPage);
		
		function updater() {
		    // term condition
		    if (cW >= 690) {
		        return false;
		    }
		    jwyre.style(background, "width", bW + "px");
		    jwyre.style(content, "width", cW + "px");
		    bW += 50;
		    cW += 50;
		    return true;
		}
		function callback() {
		    jwyre.show(id + " *");
            currentPage = hidePages();
			
			if (jwyre.isIE(7) || jwyre.isIE(8)) {
                jwyre.show(currentPage);
				cb();
                updateArrows();
			} else {
	            jwyre.hide(currentPage);
	            jwyre.animator(currentPage).fadeIn(50, 
					function() {
						// IE has bad aliasing when opacity is left
			            if (jwyre.isIE()) {
			                jwyre.removeStyle(currentPage, "opacity");							
			            }
						cb();
					}
				);
			}
		}
        jwyre.elements(".dynText").each(
            function(item) {
                var id = jwyre.attribute(item, "id");
                if (id != textId) {
                    jwyre.hide(item);                       
                }
            }
        );
		if (!jwyre.isIE(6)) {
	        jwyre.animator(id).custom({
				"updater" : updater,
				"interval" : 5,
				"callback" : callback
			});
		} else {
            jwyre.style(background, "width", "607px");
            jwyre.style(content, "width", "694px");
            jwyre.show(id + " *");
            currentPage = hidePages();
            updateArrows();         
            jwyre.show(currentPage);
            cb();
		}
    }
    
    function hideWindow() {
        // show triggers
        jwyre.removeStyle(".trigger", "display");
		if (jwyre.isIE(7) || jwyre.isIE(6)) {
            jwyre.hide(currentPage);
		} 
		if (currSideImg) {
			jwyre.hide(currSideImg);
			currSideImg = null;
		}
        jwyre.hide("#container");			
	}
	
    jwyre.load(
		function() {
            // debug code
            var debug = jwyre.debug();
            debug.setEnabled(false);
            
			// load dynamic images
            jwyre.loadImgs(imgs());
			
            // do browser fixes
			if (jwyre.isIE(7) || jwyre.isIE(6)) {
				jwyre.style(".pageInrContent", "padding", "5px");
				jwyre.style("#menu *", "display", "inline");
			} else {
                jwyre.style(".pageInrContent", "padding-top", "0px");
				jwyre.style("#softwareText .pageInrContent", "line-height", "18px");
			}
		    if (jwyre.isIE(6)) {
				var bDim = jwyre.dimensions("body");
				var lM = parseInt(jwyre.style("body", "margin-left"));
                var rM = parseInt(jwyre.style("body", "margin-right"));
				jwyre.style("#footer", "width", (bDim.width + lM + rM) + "px");
				var T = true;
				jwyre.array(
					"#softwareBkgrnd", "#marketingBkgrnd", "#webBkgrnd", "#techBkgrnd",
					"#leftCorners", "#rightCorners", "#containerBackground", "#close",
					"#upArrow", "#downArrow",
					"#wendigoImg", "#jwyreImg", "#hopeImg", "#contactImg"
					).each(
		            function(item) {
						var id = item;
						item = jwyre.element(item);
                        jwyre.fixPng(item);
						if (item.tagName.toLowerCase() == "img") {
                            if (id == "#contactImg") {
                                jwyre.styles(id, { "position" : "absolute", "height" : "200px", "width" : "200px", "top" : "60px", "left" : "400px" });
							} else if (id != "#hopeImg") {
	                            jwyre.styles(id, { "height" : "100px", "width" : "100px" });							 
							} else {
                                jwyre.styles(id, { "height" : "100px", "width" : "130px" });
							}
						}
		            }
		        );
				/*
				jwyre.children("#leftCorners").each(function(item) { 
				    var id = jwyre.attribute(item, "id");
					if (!id) {
						return;
					}
					jwyre.fixPng(item);
                    jwyre.styles("#" + id, { "width" : "15px" });
				});
				*/
                jwyre.styles("#mobImg", { "margin-top": "0px", "position" : "relative", "top" : "-30px", "left" : "60px" });
                jwyre.styles("#hopeImg", {"position" : "relative", "top" : "-30px", "left" : "60px" });
				jwyre.array("#wendigoImg", "#jwyreImg").each(function(item) { jwyre.styles(item, { "position" : "relative", "left" : "-60px" }); });
		    }
			
			// true if content window is showing
			var isWinUp = false;
			
            function killUnhover(type, event) {
                var from = jwyre.attribute(jwyre.event(event).fromElement, "id");
                var to = jwyre.attribute(jwyre.event(event).toElement, "id");
                debug.log("Unhover - type: " + type + ", toEl: " + to + ", fromEl: " + from)
				// used to check if we are moving from one type to another
				function cmp(one, two) {
	                if (one != null && two != null) {
	                    if (one.indexOf(type) == 0 && two.indexOf(type) == 0) {
	                        debug.log("killing unhover type: " + type + ", toEl: " + to + ", fromEl: " + from)
	                        return true;
	                    }
	                }
				}
                return cmp(from, to);
            }
			
            // add convo hovers
			for (var i = convTypes.iterator(); i.hasNext();) {
                var type = i.next();
	            // create 'trigger' elements for hovers
//				var trigger = jwyre.create("<div class='trigger' id='" + type + "Trigger'></div>");
//				jwyre.append(".pageContent", trigger);
	            var trigger = jwyre.element("#" + type + "Trigger");			
				var fns = (
					function(trig, t, f) {
		                return {
		                    hover : function(event) {
                                if (isWinUp) return jwyre.kill(event);
								currentConvo = t;
                                for (var i = convTypes.iterator(); i.hasNext();) {
                                    var type = i.next();
                                    if (t != type) {
                                        hideConversation(type, false);
                                    }
                                }
                                showConversation(t, f);
		                    },
		                    unhover : function(event) {
								if (isWinUp) return jwyre.kill(event);
                                if (killUnhover(t, event)) return jwyre.kill(event); 
								currentConvo = (currentConvo == t) ? null : currentConvo;
								hideConversation(t, true);
		                    }
		                };
		            }
				)(trigger, type, true);
	            jwyre.addHover(trigger, fns.hover, fns.unhover);				
			}
            jwyre.addClick("#close",
                function(event) {
                    isWinUp = false;
                    hideWindow();
                    return jwyre.kill(event);
                }
            );
            jwyre.addHover("#downArrow",
				function(event) {
					if (jwyre.isIE(6) && !isActive) {
						return jwyre.kill(event);
					}
					jwyre.style("#downArrow", "background-image", "url(./images/downArrowSelected.png)");
                    if (jwyre.isIE(6)) {
	                    jwyre.fixPng("#downArrow");					
					}
				},
				function() {
                    if (jwyre.isIE(6) && !isActive) {
                        return jwyre.kill(event);
                    }
                    jwyre.style("#downArrow", "background-image", "url(./images/downArrow.png)");
                    if (jwyre.isIE(6)) {
                        jwyre.fixPng("#downArrow");                 
                    }
				}
			);
            jwyre.addHover("#upArrow",
                function(event) {
                    if (jwyre.isIE(6) && !isActive) {
                        return jwyre.kill(event);
                    }
                    jwyre.style("#upArrow", "background-image", "url(./images/upArrowSelected.png)");
                    if (jwyre.isIE(6)) {
                        jwyre.fixPng("#upArrow");                 
                    }
                },
                function() {
                    if (jwyre.isIE(6) && !isActive) {
                        return jwyre.kill(event);
                    }
                    jwyre.style("#upArrow", "background-image", "url(./images/upArrow.png)");
                    if (jwyre.isIE(6)) {
                        jwyre.fixPng("#upArrow");                 
                    }
                }
            );
            
			// add paging functionality to down arrow
			jwyre.addClick("#downArrow",
				function(event) {
                    if (!isActive) {
                        return jwyre.kill(event);                       
                    }
					var next = getNextPage();
					if (next == null) {
						return;
					}
					var p = $(currentPage).position();
					var i = $(currentPage).offset();
					var pos = jwyre.position(currentPage, true);
					var h = jwyre.dimensions(currentPage).height;
					jwyre.position(next, pos.left, h + pos.top, null);
					jwyre.show(next);
					jwyre.animator(jwyre.array(next, currentPage)).move({
						"x": 0,
						"y": -h,
						"duration": 100,
						"callback": function(){
								jwyre.hide(currentPage);
								currentPage = next;
							}
						}
					);
				}
			);

            // add paging functionality to up arrow
            jwyre.addClick("#upArrow",
                function(event) {
					if (!isActive) {
                        return jwyre.kill(event);						
					}
                    var last = getLastPage();
                    if (last == null) {
                        return jwyre.kill(event);
                    }
                    var pos = jwyre.position(currentPage, true);
                    var h = jwyre.dimensions(currentPage).height;
                    jwyre.position(last, pos.left, -h + pos.top, null);
                    jwyre.show(last);
                    jwyre.animator(jwyre.array(last, currentPage)).move({
						"x" : 0,
						"y" : h,
						"duration" : 100,
						"callback" : function() {
	                            jwyre.hide(currentPage);
	                            currentPage = last;
	                        } 
					});
                }
            );
			            
			// used to add showWindow() click evt handler to an item
			function addLink(item, id) {
                var cb = function() {};
                jwyre.addClick(item, 
                    function(event) { 
                        isWinUp = true;
                        for (var i = convTypes.iterator(); i.hasNext();) {
                            hideConversation(i.next(), false);
                        }
                        showWindow(id, cb); 
                        return jwyre.kill(event);
                    }
                );
			}
			
			jwyre.elements("#logo *").each(
				function(item) {
					var id = jwyre.attribute(item, "id");
					id = id.replace("Logo", "Text");
					addLink(item, id);
				} 
			);

			jwyre.elements("a.link").each(
			     function(item) {
				 	var winName = jwyre.attribute(item, "name") + "Text";
                    addLink(item, winName);
				 }
			);

            jwyre.elements(".page a").each(
                 function(item) {
				 	var name = jwyre.attribute(item, "name");
					if (name == "") {
						return;
					}
                    var winName = name + "Text";
                    addLink(item, winName);
                 }
            );

            jwyre.elements("a.convLink").each(
                 function(item) {
                    var id = jwyre.attribute(item, "id");
                    id = id.replace("Conv", "Text");
					// start with link hidden
					jwyre.hide(item);
                    addLink(item, id);
					jwyre.addClick(item, 
						function() {
							var type = id.replace("Text", "");
                            hideConversation(type, false);
							jwyre.hide(item);
						}
					);
                 }
            );
		}
	);
})();
