var original_height = new Object();
var iframe_src;

$(document).ready(function(){
	gadgets.container = new Container();
	if (page_id) {
		makeGadgetsSortable();
	}
});

function makeGadgetsSortable(limited) {
	$('#col1, #col2, #col3').sortable({
		connectWith: [$('#col1'), $('#col2'), $('#col3')],
		containment: 'document',
		handle: $('.gadgets-gadget-title-bar'),
		placeholder: 'drag',
		revert: true,
		start: function(e, ui){
			var helper = $('.ui-sortable-helper');
			var iframe = helper.find('iframe');
			var content = helper.find('.gadgets-gadget-content');
			content.css('height', iframe.height()+'px');
			content.html('<p>Sleep deze widget naar de gewenste positie.</p>');
			iframe.remove();
			storeIframeSrc(ui.item);
			ui.item.find('iframe').attr('src', 'about:blank');
		},
		stop: function(e, ui){
			setIframeSrc(ui.item);
			if (!limited) {
				storeGadgetOrder();
			}
		},
		zindex: 999
	});
}

function storeIframeSrc(el) {
	var temp = el.find('iframe').attr('src');
	if (temp.substring(0,4) == 'http') {
		iframe_src = temp;
	}
}

function setIframeSrc(el) {
	el.find('iframe').attr('src', iframe_src);
}

function serializeGadgets() {
	var ret = '';
	for (var i = 1; i <= 3; i++) {
		var col = 'col' + i;
		ret += '&' + col + '=';
		var el = $('#' + col);
		var ids = new Array();
		el.find('.gadgets-gadget-chrome').each(function(){
			ids.push($(this).attr('id').replace(/widget_id_/, ''));
		});
		ret += ids.join(',');
	}
	return ret;
}

function storeGadgetOrder() {
	var order = serializeGadgets();
	ajax({
		type: 'put',
		data: order,
		url: 'widgetorder/index/' + page_id
	});
}

function showIntro() {
	if (readCookie('hide_nuik_intro') != '1') {
		$(document).ready(function(){
			if (!showFlash) {
				showPopbox('/site/intro/', [480,400]);
			}
		});
	}
}

function hideIntro(persistent) {
	if (persistent) {
		createCookie('hide_nuik_intro', '1', 31);
	} else {
		eraseCookie('hide_nuik_intro');
	}
}

function deleteGadget(gadget_id) {
	showPopbox('/widget/delete/' + gadget_id, [480,120]);
}

function confirmedDeleteGadget(gadget_id) {
	ajax({
		type: 'delete',
		url: 'widget/index/' + gadget_id
	});
}

function addGadget(gadget_id) {
	ajax({
		type: 'post',
		data: {
			'page_id': page_id,
			'gadget_id': gadget_id
		},
		url: 'widget/index/' + page_id + '/' + gadget_id
	});
}

function gadgetSettings(id) {
	var el = $('#gadgets-gadget-user-prefs-dialog-' + id);
	var settings = $('#gadgets-gadget-title-bar-' + id).find('.settings');
	var toggle = $('#gadgets-gadget-title-bar-' + id).find('.toggle');
	var iframe = $('#remote_iframe_' + id);
	var iframe_height = iframe.height();
	
	if (!el.is(':visible')) {
		original_height[id] = iframe_height;
	}
	
	if (iframe_height < 190)
	{
		$('#remote_iframe_' + id).css('height', '190px');
		iframe_height = 190;
	}
	
	el.css('height', (iframe_height - 40) + 'px');
	
	if (el.is(':visible')) {
		settings.removeClass('settings_active');
		el.hide();
		iframe.css('height', original_height[id] + 'px');
		iframe.show();
	} else {
		if (!el.attr('rel')) {
			el.load(site_url + 'widget/settings/' + id);
			el.attr('rel', 'loaded');
		}
		$('#gadgets-gadget-content-' + id).show();
		iframe.hide();
		el.show();
		settings.addClass('settings_active');
		toggle.removeClass('toggle_in');
	}
}

function gadgetToggle(id) {
	var el = $('#gadgets-gadget-content-' + id);
	var settings = $('#gadgets-gadget-title-bar-' + id).find('.settings');
	var toggle = $('#gadgets-gadget-title-bar-' + id).find('.toggle');
	
	if (el.is(':visible')) {
		settings.removeClass('settings_active');
		$('#gadgets-gadget-user-prefs-dialog-' + id).hide();
		el.hide();
		toggle.addClass('toggle_in');
	} else {
		toggle.removeClass('toggle_in');
		el.show();
	}
}

function showPage(id) {
	$('#pages').find('li').removeClass('active');
	$('#page_' + id).addClass('active');
	$('#content').load('/site/page/' + id + '/' + Math.ceil(Math.random()*999999));
}

function showGadgetCategories() {
	var div = $('#gadget_categories');
	var checkboxes = div.find("input[type='checkbox']:checked");
	var ids;
	var page = '';
	if (checkboxes.length == 0) {
		ids = '';
		page = '';
	} else {
		ids = new Array();
		checkboxes.each(function(){
			ids.push($(this).attr('name'));
		})
		ids = ids.join('-');
		page = '/' + 1;
	}
	
	ajax({
		type: 'get',
		url: 'widget/index/' + ids + page,
		cache: true
	});
}

function gadgetCategoryPage(ids, page) {
	ajax({
		type: 'get',
		url: 'widget/index/' + ids + '/' + page,
		cache: true
	});
}

var edit_active = new Object;
var edit_oldvalue = new Object;

function pageEdit(page_id) {
	var el = $('#page_' + page_id);
	var page_name = el.find('span:first').text();
	edit_oldvalue.page_id = page_name;
	edit_active.page_id = true;
	
	el.append('<form method="post" onsubmit="pageEditSubmit(' + page_id + '); return false" id="page_form_' + page_id + '"><input type="text" name="page_name" maxlength="13" value="' + page_name + '" /><input type="submit" value="submit" style="left: -9999px" /></form>');
	
	var form = $('#page_form_' + page_id);
	var input = form.find('input:first');
	input.blur(function(){
		if (edit_active.page_id) {
			pageEditSubmit(page_id);
		}
	});
	input.focus();
	input.select();
}

function pageEditSubmit(page_id) {
	edit_active.page_id = false;
	var el = $('#page_' + page_id);
	var form = $('#page_form_' + page_id);
	var value = form.find('input:first').val();
	el.find('span:first').text(value);
	el.find('a:first').text(value);
	form.remove();
	if (edit_oldvalue.page_id != value) {
		edit_oldvalue.page_id = value;
		
		ajax({
			type: 'put',
			url: 'page/index/' + page_id,
			data: {'page_name':value}
		});
	}
}

function pageDelete(page_id) {
	showPopbox('/page/delete/' + page_id, [480,120]);
}

function confirmedPageDelete(page_id) {
	ajax({
		type: 'delete',
		url: 'page/index/' + page_id
	});
}

function postPrefs(id) {
	var form_id = 'widget_settings_' + id
	var formdata = $('#'+form_id).length ? $('#'+form_id).serialize() : false;
	
	ajax({
		type: 'post',
		url: 'widget/settings/' + id,
		data: formdata
	});
}

function showError(body, title)
{
	if (body == 'activated') {
		showPopbox('/session/create/activated', [480,258]);
	} else {
		showPopbox('/site/error', [480,250], body, title);
	}
}

function passwordReset() {
	$('#popbox').load('/user/password');
}

function needRegistration() {
	showPopbox('/site/promo', [480,160]);
}

// popbox
function showPopbox(url, size, string, title) {
	title = (title == '') ? 'Foutmelding' : title;
	
	var viewport = vp();
	var offset = os();
	if (typeof document.body.style.maxHeight === "undefined") {
		$('html').css('overflow', 'hidden');
	}
	$('#content').css('visibility', 'hidden');
	$('body').append('<div id="overlay"></div>');
	var overlay = $('#overlay');
	var height = body_height();
	overlay.css('height', height+'px');
	detectMac() ? overlay.addClass('overlay_mac') : overlay.addClass('overlay');
	overlay.click(hidePopbox);
	$('body').append('<div id="popbox"></div>');
	var popbox = $('#popbox');
	popbox.html('Bezig met laden...');
	document.onkeydown = function (e) { 	
		keycode = (e == null) ? event.keyCode : keycode = e.which;
		if (keycode == 27) {
			hidePopbox();
		}
	};
	if (size) {
		popbox.css('width', (size[0] - 26)+'px');
		popbox.css('height', (size[1] - 22)+'px');
	}
	var popbox_width = popbox.width();
	var popbox_height = popbox.height();
	var left = Math.round((viewport[0] - popbox_width) / 2);
	left = (left < 0) ? 0 : left;
	var top = Math.round(((viewport[1] - popbox_height) / 2) + offset[1]);
	top = (top < 0) ? 0 : top;
	popbox.css('left', left + 'px');
	popbox.css('top', top + 'px');
	
	if (detectMac()) {
		popbox.show();
		popbox.load(url, null, function(){
			if (string) {
				popbox.find('#error_title').html(title);
				popbox.find('#error_string').html(string);
			}
			popboxForm();
		});
	} else {
		overlay.css('opacity', 0).fadeTo('fast', 0.75, function () {
			popbox.fadeIn('fast', function () {
				popbox.load(url, null, function(){
					if (string) {
						popbox.find('#error_title').html(title);
						popbox.find('#error_string').html(string);
					}
					popboxForm();
				});
			});
		});
	}
}

function popboxForm()
{
	var popbox = $('#popbox');
	if (popbox.length) {
		// set focus to the first text input or textarea
		var input = popbox.find(':text, textarea');
		if (input && input[0]) {
			input[0].focus()
		}
	}
}

function hidePopbox(no_fade) {
	document.onkeydown = '';
	if (!no_fade) {
		$('#popbox').fadeOut('fast');
		$('#overlay').fadeOut('fast', function () {
			$('#popbox,#hideselect,#overlay').remove();
			$('html').css('overflow', '');
			$('#content').css('visibility', 'visible');
		});
	} else {
		$('#popbox,#hideselect,#overlay').remove();
		$('html').css('overflow', '');
		$('#content').css('visibility', 'visible');
	}
}

function overlaySize() {
	var overlay = $('#overlay');
	if (overlay.length) {
		var height = body_height();
		overlay.css('height', height+'px');
	}
}

function detectMac() {
	var userAgent = navigator.userAgent.toLowerCase();
	if (userAgent.indexOf('firefox') != -1) {
		return true;
	}
}

function vp() {
	var x, y;
	
	if (self.innerHeight) {
		x = self.innerWidth;
		y = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) {
		x = document.documentElement.clientWidth;
		y = document.documentElement.clientHeight;
	} else if (document.body) {
		x = document.body.clientWidth;
		y = document.body.clientHeight;
	}
	
	return [x, y];
}

function os() {
	var x, y;
	
	if (self.pageYOffset) {
		x = self.pageXOffset;
		y = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop) {
		x = document.documentElement.scrollLeft;
		y = document.documentElement.scrollTop;
	} else if (document.body) {
		x = document.body.scrollLeft;
		y = document.body.scrollTop;
	}
	
	return [x, y];
}

function body_height() {
	if (document.documentElement.clientHeight > document.documentElement.scrollHeight) {
		return document.documentElement.clientHeight;
	} else {
		return document.documentElement.scrollHeight;
	}
}


// utilities
function ajax_form(uri, method, form_id, callback_success, callback_error, type) {
	var formdata = $('#'+form_id).length ? $('#'+form_id).serialize() : false;
	callback_success = callback_success ? callback_success : function(){};
	callback_error = callback_error ? callback_error : function(){};
	type = type ? type : 'script';
	
	ajax({
		type: method,
		url: uri,
		data: formdata,
		dataType: type,
		success: callback_success,
		error: callback_error
	});
}

function ajax(options) {
	if (typeof(options.data) == 'undefined') {
		options.data = new Object;
	}
	
	if (typeof(options.type) != 'undefined') {
		options.type = options.type.toUpperCase();
	}
	
	if (options.type == 'PUT' || options.type == 'DELETE' || options.type == 'POST') {
		if (typeof(options.data) == 'string') {
			var amp = (options.data == '') ? '' : '&';
			options.data = options.data + amp + 'mimic_method=' + options.type;
		} else {
			options.data.mimic_method = options.type;
		}
		options.type = 'POST';
	}
	
	options.dataType = 'script';
	options.url = site_url + options.url;
	
	$.ajax(options);
}

function createCookie(name, value, days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = '; expires='+date.toGMTString();
	} else {
		var expires = '';
	}
	document.cookie = name+'='+value+expires+'; path=/';
}

function readCookie(name) {
	var nameEQ = name + '=';
	var ca = document.cookie.split(';');
	for (var i=0; i < ca.length; i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name, '', -1);
}

// For resizing the iframe and maybe other future bindings
var Container = $.klass({
	maxHeight: 4096,
	
	initialize: function() {
		// rpc services our container supports
		gadgets.rpc.register('resize_iframe', this.setHeight);
		gadgets.rpc.register('set_title', this.setTitle);
	},

	setHeight: function(height) {
		var element = $('#'+this.f);
		if (this.f != undefined && element.length) {
			if (height > gadgets.container.maxHeight) {
				height = gadgets.container.maxHeight;
			}
			$('#'+this.f).css('height', height+'px');
		}
	},
	
	setTitle: function(title) {
		var element = $('#'+this.f+'_title');
		if (this.f != undefined && element.length) {
			element.text(title);
		}
	}
});

gadgets.container = new Container();