//bind and $A 
var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}
Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Object.merge = function(obj, newobj) {
	for (var o in newobj) {
		obj[o] = newobj[o];
	}
	return obj;
}


var LD = {
	loaded_files: [],
	Class : {
		create: function(obj) {
			var _n = function(args) {
				this.init(args); return this;
			}
			_n.prototype = obj;
			return _n;
		},
		extend: function(from, to) {
			return Object.merge(to, from);
		}
	},
	require: function(file) {
		//TODO: detect file type and inject the required file
		log(file)
		this.loaded_files.push(file);
	}
}

LD.Tabbed = LD.Class.create({
	opts: {
		content			: ".tabbedcontent",
		insert_tabs_in	: ".head",
		content_headings: "h3",
		default_open	: 1,
		hide_headings	: true
	},
	container: '',
	init: function(opts) {
		log('initializing tabbed...');
		(!LD.tab_count) ? LD.tab_count = 1 : LD.tab_count++;
		 
		this.opts = Object.merge(this.opts, opts);
		this.container = opts.block;
		
		this.tabify();
	},
	tabify: function() {
		var thtml = "<ul class=\"bb_tabs\">";
		$(this.container).find(this.opts.content).children().each(function(i, c) {
			c = $(c);
			(this.opts.default_open == i+1) ? c.show() : c.hide();
					
			var txt = (this.opts.hide_headings) ? 
						c.find(this.opts.content_headings).hide().text() :
						c.find(this.opts.content_headings).text() ;
						
			if (c.attr('id') == '')
				c.attr('id', 'tabbed__'+LD.tab_count+'_'+i);
			
			var selected = (this.opts.default_open == i+1) ? " class=\"selected\"" :'';
			
			thtml += "<li"+ selected +"><a href=\"#\" id=\"tab___"+c.attr('id')+"\">"+txt+"</a></li>";
		}.bind(this));
		thtml += '</ul>';
		
		$(this.opts.insert_tabs_in).append(thtml)
		$(this.container + ' .bb_tabs li a').bind('click', this.show.bind(this))
		//implement 
	},
	show: function(e) {
		e.preventDefault();
		this.hide_all();
		var t = $(e.target);
		var tab_id = t.attr('id');
		t.parent().addClass('selected')
		log($('#'+tab_id.split('___')[1]).show())
	},
	hide_all: function(el) {
		$(this.container).find(this.opts.content).children().hide();
		$(this.container + ' .bb_tabs li').removeClass('selected')
	}
	
});





LD.Carousal = LD.Class.create({
	opts: {},
	init: function() {
		log('initializing carousal...');
		
	},
	paginate: function() {
		
	}
});

LD.Lbox = LD.Class.create({
	options: {
		skin: 'swin',
		size: {width: 400, height: 250},
		position: {x: 400, y: 250},
		color: '#e8ecf7',
		edge_width: 30,
		close_button_text: "Close"
	},
	events: {},
	id: '',
	container: '',
	init: function(opts) {
		log('initializing LBOX...');
		
		this.options = Object.merge(this.options, opts);
		(!LD.Lbox.count) ? LD.Lbox.count = 1 : LD.Lbox.count++ ; 

		this.id = 'lbox_'+LD.Lbox.count
		this.draw();
	},
	draw: function() {
		var html = "<div class=\"lbox\" id=\""+this.id+"\" style=\"display:none;\"> \
		<div class=\"lb_close_btn\"><a href=\"#\">"+this.options.close_button_text+"</a></div>";
		var edges = ['l', 'tl', 't', 'tr', 'r', 'br', 'b', 'lb'];
		for (var i = 0, l = edges.length; i < l; i++) {
			html += "<span class=\"lb_"+edges[i]+" edg\"></span>"
		}
		html += "<div class=\"lb_content\" id=\""+this.id+"__content\">\
			</div>";
		$('body').append(html);
		
		this.resize(this.options.size.width, this.options.size.height)
			.position(this.options.position.x, this.options.position.y)
			.color(this.options.color).show();
		
		$('#'+this.id).find('.lb_close_btn').bind('click', this.close.bind(this));	
	},
	gcc: function() {
		/* get content container */
		return $('#'+this.id+'__content');
	},
	resize: function(w, h) {
		$('#'+this.id).css({'width': w, 'height':h})
		$('#'+this.id+'__content').css({'width': w-this.options.edge_width, 
						'height':h-this.options.edge_width})
		return this;
	},
	position: function(x, y) {
		$('#'+this.id).css({'left': x, 'top': y})
		return this;
	},
	color: function(clr) {
		this.gcc().css({'background': clr});
		return this;
	},
	show: function() {
		$('#'+this.id).show();
	},
	content: function(html) {
		this.gcc().html(html);
		return this;
	},
	scrollTo: function(pt) {
		this.gcc().scrollTo(pt)
	},
	close: function(e) {
		e.preventDefault();
		$('#'+this.id).remove();
		this.despatch_event('close');
	},
	despatch_event: function(evnt) {
		for (var i=0, l = this.events[evnt].length; i<l; i++) {
			this.events[evnt][i][0](this.events[evnt][i][1]);
		}
	},
	add_event_listener: function(evnt, func, target) {
		if (!this.events[evnt]) 
			this.events[evnt] = [];
		
		this.events[evnt].push([func, target]);
	}
});



LD.SearchResults = {
	auto_toggle_preview: true,
	init: function() {
		$('.actions .btn_preview').bind('click', this.toggle_preview.bind(this));
		//this.hide_all_previews();
		$('.actions .btn_map').bind('click', this.toggle_map.bind(this));
	},
	hide_all_previews: function() {
		$('.listitem').each(function(i, e) {
			this.hide_preview(e);
		}.bind(this))
	},
	toggle_preview: function(e) {
		e.preventDefault()
		var t = $(e.target);
		var tp = t.parent();
		while(!tp.hasClass('lawyer'))
			tp = tp.parent(); 
		
		tp.find('.preview').toggle('fast');		
		t.text() == 'Show Preview' ? 
			t.text("Hide Preview").addClass('open') : 
			t.text("Show Preview").removeClass('open');
			
		tp.find('.map').html('<a href="'+tp.find('.mainprofilelink').attr('href')+'#location"><img src="'+tp.find('.minimapurl').html()+'&amp;size=240x120" border="0"/></a>');
	},
	hide_preview: function(e, speed) {
		e = $(e);
		e.find('.preview').hide(speed);
		e.find('.btn_preview').text('Show Preview').removeClass('open');		
	},
	toggle_map: function(e) {
		e.preventDefault();
		et = e.target;
		var t = $(et);
		var tp = t.parent();
		while(!tp.hasClass('lawyer'))
			tp = tp.parent();
			
		log(et.lbox);
		if (et.lbox) {
			t.text('Show Map').removeClass('x');
			$($('#'+et.lbox)).remove();
			et.lbox = undefined;
		} else {
			t.text('Hide Map').addClass('x');
			var l = new LD.Lbox({
				size: {width: 401, height: 180},
				position: {x:e.pageX -30, y:e.pageY - 180},
				color: '#eff0fd'
			});
			et.lbox = l.id;
			l.add_event_listener('close', this.close_map.bind(this), et);
			var addr = tp.find('.address').text();
			l.content('<div><a href="'+tp.find('.mainprofilelink').attr('href')+'#location"><img src="'+tp.find('.minimapurl').html()+'&amp;size=371x127" border="0" /><br /><span style="font-size: 11px;display:block;color:#444;padding: 3px 5px;">'+addr+'</span></a></div>');
		}
	},
	close_map: function(el) {
		el.lbox = undefined;
		$(el).text('Show Map').removeClass('x');
		
	}
}






var ld = {
	debug : true,
	
	init : function() {
		LD.SearchResults.init();
		
	}
}




$(ld.init);