if ( typeof window.console == "object" && typeof console != "undefined" ) { // if there's firebug, use con for console
	// There is a console object. Make sure it is good.
	var con = console;

	if ( con.dir   == undefined ) 
		con.dir       = con.log;
	if ( con.error == undefined ) 
		con.error     = con.log;
	if ( con.warn  == undefined ) 
		con.warn      = con.log;
	if ( con.group == undefined ) {
		con.group    = con.log;
		con.groupEnd = function(){};
	}
	if ( con.groupCollapsed == undefined ) {
		con.groupCollapsed = con.group;
	}
} else { // There is no console object. This is the case for IE.
	var noFun = function() {}
	var con = { // Dummy object {{{
		log:noFun,
		warn:noFun,
		error:noFun,
		dir:noFun,
		group:noFun,
		groupCollapsed:noFun,
		groupEnd:noFun
	} // }}}
}

function log (msg) {
	return con.log(msg);
}

function debug (msg) {//{{{
	return con.error(msg);
}//}}}

function navigationEvent() {}

if(!Array.indexOf){Array.prototype.indexOf = function(obj){for(var i=0;i<this.length;i++){if(this[i]==obj){return i;}}return -1;}}
function myindexOf(arr, char){
	for(var i=0;i<arr.length;i++){if(arr[i]==char){return i;}}return -1;
}

function on_permission_load() {
	$.ajax({
		type: "POST",
		url: "/allowPermissions",
		success: function(html) {
			
		}
	});
}

function facebook_login()
{
		FB_RequireFeatures(["Connect", "CanvasUtil"], function() {
        FB.init(fbctrl.api_key, "/connect/xd_receiver.php");
        FB.Connect.requireSession( function () {window.location="/connect/login.php?action=facebookLogin"});
        FB.XdComm.Server.init('connect/xd_receiver.php');
    });
}

function facebook_logout() {
	FB_RequireFeatures(["Connect", "CanvasUtil"], function() {
        FB.init(fbctrl.api_key, "/connect/xd_receiver.php");
        FB.Connect.logoutAndRedirect("/");
    });
}

function facebook_permissions() {
	FB_RequireFeatures(["Connect", "CanvasUtil"], function() {
        FB.init(fbctrl.api_key, "/connect/xd_receiver.php");
				FB.Connect.showPermissionDialog('publish_stream,offline_access', on_permission_load);
	});
}

function getKeyCode ( evt ) {
	var keyCode;
	if ("which" in evt)
		/*NN4 & FF &amp; Opera*/
		return evt.which;
	else if ("keyCode" in evt)
		/*Safari & IE4+*/
		return evt.keyCode;
	else if ("keyCode" in window.event)
		/*IE4+*/
		return window.event.keyCode;
	else if ("which" in window.event)
		return evt.which;
	else 
		return false;
}



var love = {//{{{
	clickify : function () { // {{{
		log('added callback for lovebuttons');
		$('a.love').click(love.loveclick); 
	}, // }}}
	activate : function (jq_obj) { // {{{
		love.modifyCounter(1, $(this));
	}, // }}}
	deactivate : function (jq_obj) { // {{{
		love.modifyCounter(-1, $(this));
	}, // }}}
	loveclick : function () { // {{{
		if ( !gIsLoggedIn ) {
			fbctrl.pleaseLogin();
			return;
		}
		$(this).toggleClass('active');

		var active;
		if ( $(this).attr("class") == "love" ) {
			active = false;
			love.deactivate($(this));
		}
		else {
			active = true;
			love.activate($(this));
		}

		var type="";
		var id;
		var val = $(this).attr("value");
		if (val != parseInt(val)) {
			var p = val.split(" ");
			id = p[0];
			type = p[1];
		} else {
			type = "item";
			id = val;
		}

		data_string = "item_id="+id+"&item_type="+type+"&type="+(active?"star":"unstar");
		$.ajax({
			type: "POST",
			url:  "/starItem",
			data: data_string,
			success: function(html) {
				log(html);
			}
		});
	}, // }}}
	modifyCounter : function ( dir, jq_obj ) { // {{{
		try {
			log('modifyCounter called');
			if ($("body").attr("class")=="listpage") {
				oldval = parseInt($("#liked-btn").html());
				$("#liked-btn").html("" + (oldval + dir) + " liked items");
			} else {
				log(jq_obj.attr("class"));
				log(jq_obj.parent().siblings(".likes").attr("class"));
				oldval = parseInt(jq_obj.parent().siblings(".likes").html());
				jq_obj.parent().siblings(".likes").html("" + (oldval + dir) + " " + LANG.N_MEMBERS_LIKE_THIS);
				}
			} catch(e) {log(e);}
	} // }}}
} //}}}
var follow = {//{{{
	addCallback : function () { // {{{
		log('follow.addCallback called');
		$("li.follow a").click( follow.toggleFollow );
	}, // }}}
	activate : function () { // {{{
	}, // }}}
	deactivate : function () { // {{{
	}, // }}}
	toggleFollow : function () { // {{{
		log('follow.toggleFollow');
		if ( $(this).parent().parent().attr("id") == "stats" )
			// If this is the ul#stats on the profile page, these links are not real follow-links.
			return;

		if ( !gIsLoggedIn ) {
			fbctrl.pleaseLogin();
			return;
		}

		$(this).toggleClass('active');

		var active;
		var id;
		id = $(this).parent().attr("value");

		if ( $(this).attr("class") != "active" ) {
			active = false;
			follow.deactivate($(this));
		}
		else {
			active = true;
			follow.activate($(this));
		}

		var data_string = "action="+(active?"start":"stop")+"&profile_id="+id;
		log(data_string);
		$.ajax({
			type: "POST",
			url: "/follow",
			data: data_string,
			success: function(html) {
				log('toggleFollow: success');
			}
		});
	} // }}}
}//}}}
var ofview = {//{{{
	rescaleProportions : function () {
		log('rescaleProportions called', 1);
		var foo=parseInt($("#view img.outfit").width());
		log(foo);
		$("#outfit-view .content div.info").width(850-foo);
		$("#outfit-view .content div.info").fadeIn(300);
	}
}//}}}
var fbctrl = {//{{{
	api_key : "",
	pleaseLogin : function () {alert(LANG.GENERAL_PLEASELOGIN);},
	refr_login  : function () {window.location='/connect/login.php?action=facebookLogin';},
	refr_logout : function () {window.location='/connect/login.php?action=logout';},
	reg : {
		show : function () { // {{{
			log('fbctrl.reg.show called');
			$("div.register_form").fadeIn("slow");
		}, // }}}
		hide : function () { // {{{
			log('fbctrl.reg.hide called');
			$("div.register_form").fadeOut("slow");
		}, // }}}
		passwordFocus : function() { // {{{
			$('input.password-show').hide();
			$('input.password-hidden').show();
			$('input.password-hidden').focus();
		}, // }}}
		passwordBlur : function() { // {{{
			if ($('input.password-hidden').val() == '') {
				$('input.password-show').show();
				$('input.password-hidden').hide();
			}
		}, // }}}
		emailFocus : function() { // {{{
			if ($('input.email').val() == 'E-post')
				$('input.email').val('');
		}, // }}}
		emailBlur : function() { // {{{
			if ($('input.email').val() == '')
				$('input.email').val('E-post');
			} // }}}
	},
	performLogin : function () { // {{{
		log('fbctrl.performLogin called');
		$('.login-form').submit();
	} // }}}
}//}}}
var search = {//{{{
	getItemLocation : function (rowNode) {
		var type = rowNode.attr('data-item-type');
		switch ( type ) {
			case 'brand':
				loc = '/' + rowNode.attr('data-item-location');
				break;
			case 'category':
				loc = '/alla/' + rowNode.attr('data-item-location');
				break;
			case 'user':
				loc = '/user/' + rowNode.attr('data-item-location');
				break;
			case 'product':
				loc = '/product/' + rowNode.attr('data-item-location');
				break;
			default: 
				return false;
		}
		return loc;
	},
	addSearchResultCallbacks : function(node, type) { // {{{
		log('addSearchResultCallbacks called');
		node.children("a").hover(search.results.anchor.hover);
		node.children("a").click(search.results.anchor.click);
	}, // }}}
	cleanUp : function (areaNode) { // {{{
		areaNode.children(".search_results").html('');
		gSearchPreviousValue = '';
	}, // }}}
	input : {
		successfulSearch : function (inputNode, html) {//{{{
			var resultNode = inputNode.siblings('.search_results');
			var value      = inputNode.val();
			var searchtype = inputNode.attr('searchtype');
			var tagtype    = inputNode.attr('tagtype');

			var aComplete = eval(html);
			var contentstring = "";
			for (i = 0; i < aComplete.length; i++)
			{
				var searchtype = aComplete[i].type;

				var row = aComplete[i];
				if ( typeof row.slug !== 'undefined' ) {
					var id = row.slug; 
				} else {
					var id = row.id;
				}
				contentstring += '<li data-item-name="'+row.plain+'" data-item-type="'+row.type+'" data-item-location="'+id+'"';
				if (i==0 && i==aComplete.length-1) {
					contentstring += ' pos="only"';
				} else if (i==0) {
					contentstring += ' pos="first"';
				} else if (i==aComplete.length-1) {
					contentstring += ' pos="last"';
				} else {
				}
				contentstring += '>';
				contentstring += '<a href="#">' + aComplete[i].str + '</a>';
				// old url: /search/Category/123
				// /search/' + searchtype + '/' + aComplete[i].id
				var typeString = "";
				switch ( aComplete[i].type ) {
					case 'brand':
						typeString = LANG.SEARCHRESULT_BRAND;
						break;
					case 'category':
						typeString = LANG.SEARCHRESULT_CATEGORY;
						break;
					case 'color':
						typeString = LANG.SEARCHRESULT_COLOR;
						break;
					case 'gender':
						typeString = LANG.SEARCHRESULT_GENDER;
						break;
					case 'user':
						typeString = LANG.SEARCHRESULT_USER;
						break;
				}
				contentstring += "<span class='tagtype'>"+typeString+"</span>";
				contentstring += "</li>";
			}
			resultNode.html(contentstring);
			search.results.anchor.addCallbacks();
		},//}}}
		currentValue : "",
		focus : function () { // {{{
			log('search.input.focus called');
			var inputNode = $(this);
			var resultNode = $(this).siblings(".search_results");

			if(!inputNode.hasClass("activated")) {
				inputNode.val("");
				inputNode.addClass("activated");
			} else {
				resultNode.show();
			}
		}, // }}}
		performSearch: function (inputNode) { // {{{
			con.group('performSearch');

			var resultNode = inputNode.siblings('.search_results');
			var value      = inputNode.val();
			var searchtype = inputNode.attr('searchtype');
			var tagtype    = inputNode.attr('tagtype');

			postData = {
				"str" : value,
				"type" : searchtype,
				"tagtype" : tagtype
			}

			log(postData);
			con.groupEnd();
			// What we want to do here is first check the response,
			// see whether it's 200 or 204 (OK or EMPTY),
			// then call either of two methods to make the response
			// visible to the client.
			//
			// FIXME:
			// A sensible way to do this is to use the
			// complete: () method with an xmlHttp-object, check the
			// response code, and then call something like
			// inputNode.replaceResults ( xmlHttp )
			// then we would need to extend $(inputNode), 
			// I can't really find a way to do this...
			$.ajax({
			type: "POST",
			url: "/getAutoComplete/",
			data: postData,
			complete: function(xmlHttp) {
				con.group('POST /getAutoComplete/ callback');
				resultNode.fadeIn(500);
				if ( xmlHttp.status == 200 ) {
					search.input.successfulSearch(inputNode, 
						xmlHttp.responseText);
				} else {
					resultNode.html("");
				}
				con.groupEnd();
			}
		});
	}, // }}}
		blur : function () { // {{{
			log('search.input.blur called');
			gSearchInitialized = 0;
			$(this).siblings(".search_results").hide();
		}, // }}}
		keypress : function (e) { // {{{
			con.group('search.input.keypress called');
			var keycode = getKeyCode( e);
			log('intercepted keycode' + keycode);
			con.groupEnd();
			if ( keycode == 0 ) {
				//return false;
			}
		}, // }}}
		keydown : function (e) { // {{{
			con.group('search.input.keydown called');
			var search_input = $(this);
			var resultNode = $(this).siblings(".search_results");
			var search_results = $(this).siblings(".search_results");
			 
			keycode = getKeyCode ( e );
			log('intercepted keycode ' + keycode);
			var me = search_results.children("li.selected");
			var val = me.attr("pos");

			var type = $(this).attr('action');

			con.groupEnd();
			if (keycode == 9) {
				debug('wtf');
				// Tab was hit.
				if (me.children("a").attr('href') == undefined) 
					return;
				$(this).val(me.attr('data-item-name'));
				$(this).attr({db_id : me.attr('db_id')});
				if (type=="goto")
					window.location = me.children("a").attr('href');
				else if (type=="insert")
					$(this).val(me.children("a").html());

				search_results.hide();
				return;
			}

			switch ( keycode ) {
				case 13: 
					search.results.triggerMe(resultNode.children("li.selected")); // ENTER
					return false;
				case 38: 
					search.results.selectPrevious(resultNode); // ARROW UP
					return false;
				case 40: 
					search.results.selectNext(resultNode);     // ARROW DOWN
					return false;
			}
		}, // }}}
		keyup : function (e) { // {{{
			con.group('search.input.keyup called');

			var inputNode = $(this);
			var resultNode = $(this).siblings(".search_results");
			var thresholdUnparsed = inputNode.attr("threshold");
			if (typeof thresholdUnparsed == "undefined" )
				var threshold = 2;
			else
				var threshold = parseInt(thresholdUnparsed);

			var inputString = $(this).val();
			log('registered inputString "' + inputString + '"');
			con.groupEnd();

			if (inputString == '') {
				search.cleanUp(resultNode.parent());
			}

			var previousValue = inputNode.attr('previousValue');

			if ( inputString != previousValue && inputString.length >= threshold)
			{
				log('Decided to perform search', 1);
				search.input.performSearch($(this));
			}
			inputNode.attr( { 'previousValue' : inputString } );
		} // }}}
	},
	results : {
		selectNext : function (resultNode) { // {{{
			con.group('selectNext called')
			rowNode = resultNode.children("li.selected");

			// Check if no row is selected.
			if (rowNode.html() == null) {
				resultNode.children("li[pos=first]").addClass('selected');
				resultNode.children("li[pos=only]").addClass('selected');
				return;
			}

			var val = rowNode.attr("pos");
			log(val);
			if ( (!val || val=='first') && val != 'only' ) {
				rowNode.removeClass("selected");
				rowNode.next("li").addClass("selected");
				log(rowNode.next("li"));
			}
			con.groupEnd('selectNext called')
		}, // }}}
		selectPrevious : function (resultNode) { // {{{
			con.group('selectPrevious called')
			rowNode = resultNode.children("li.selected");
			var val = rowNode.attr("pos");
			if ( (!val || val=='last') && val != 'only' ) {
				rowNode.removeClass("selected");
				rowNode.prev("li").addClass("selected");
				log(rowNode.prev("li"));
			}
			con.groupEnd();
		}, // }}}
		triggerMe : function (rowNode) { // {{{
			con.group('triggerMe called');

			resultNode = rowNode.parent();
			inputNode = rowNode.parent().siblings(".search_input");
			desiredAction = inputNode.attr("action");

			if (desiredAction == "goto") {
				log('Decided for goto: trying to redirect browser', 1);
				url = search.getItemLocation(rowNode);
				if ( url !== false ) {
					window.location.href = url
				}
				else {
					// FIXME: ERROR!
				}
			}
			else {
				log('Decided to replace <input> values');
				window.location.href = "/full_search.php?q=" + $('#search_field').val();
			}

			resultNode.hide();
			return false;
		}, // }}}
		anchor : {
			addCallbacks : function () { // {{{
				log('adding callbacks for li anchors');
				$('.search_results li a').hover(search.results.anchor.hover);
				$('.search_results li a').click(search.results.anchor.click);
			}, // }}}
			hover : function () { // {{{
				log('search_results <a> hovered');
				rowNode = $(this).parent();
				rowNode.siblings("li.selected").removeClass("selected");
				rowNode.addClass("selected");
			}, // }}}
			click : function () { // {{{
				log('search_results <a> clicked');
				rowNode = $(this).parent();
				search.results.triggerMe(rowNode);
				//if (type == 'insert')
				//{
					////search_input.attr();
					//node.val($(this).html());
				//}
				//else if (type == 'goto')
					//window.location = $(this).attr('href');
			} // }}}
		}
	},
	options : {
		toggle : function () { // {{{
			var search_options = $("#search_options");

			if ( search_options.css("display") == "block" )
				search_options.hide();
			else 
				search_options.show();

			$("input.search_input").focus();
		} // }}}
	},
	addCallbacks : function () {
		log('search.addCallbacks called');
		$("#search_type_folder").click(  search.options.toggle);

		$("input.search_input").focus(   search.input.focus);
		$("input.search_input").blur(    search.input.blur);
		$("input.search_input").keypress(search.input.keypress);
		$("input.search_input").keydown( search.input.keydown);
		$("input.search_input").keyup(   search.input.keyup)

		$("input#edit-brand").focus(   search.input.focus);
		$("input#edit-brand").blur(    search.input.blur);
		$("input#edit-brand").keydown( search.input.keydown);
		$("input#edit-brand").keyup(   search.input.keyup)
	}
}//}}}


$(document).ready(function() { // {{{
	con.groupCollapsed('document.ready called from header.js');
	love.clickify();
	follow.addCallback();
	search.addCallbacks();
	$('input.password-show').focus(    fbctrl.reg.passwordFocus);
	$('input.password-hidden').blur(   fbctrl.reg.passwordBlur);
	$('input.email').focus(            fbctrl.reg.emailFocus)
	$('input.email').blur(             fbctrl.reg.emailBlur)
	$('button.login_button').click(    fbctrl.performLogin);
  $("button#register_button").click( fbctrl.reg.show);
  $(".close_register_form").click(   fbctrl.reg.hide);

	$('.captcha img').attr({src:"/callback/captcha.php?" + Math.random()});
	con.groupEnd();
}) // }}}
