var display_count = 20;
var max_queue_count = 50;
var show_image = false;

//todo: additional settings
//boolean - restart queue at beginning if there's nothing new?
//how far back to start new_queue when loading up?

var old_queue = [];
var new_queue = [];
var editing_form = false;

var old_queue_top = 0;
var old_search = '';
var channel_name;
var window_hash;
var start_time;
var last_time_refresh = 0;
var captcha_event_set = false;

var settings = {
};

var last_request = 0;
var last_advance = 0;
var cid;
var cookie;
var max_tweet_id = 0;
var max_seen_tweet_id = 0;
var last_new_tweet_time = 0;
var new_tweet_delay = 0;
var locked = false;
var interval = -1;
var settings_backup;

var check_names = [];

/* utility functions */
//trim function, since it's not standard
if (!String.prototype.trim) {
	String.prototype.trim = function() {
		var	str = this.replace(/^\s\s*/, ''),
			ws = /\s/,
			i = str.length;
		while (ws.test(str.charAt(--i)));
		return str.slice(0, i + 1);
	}
}

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);
}

function cloneObj(obj) {
  var newObj = (obj instanceof Array) ? [] : {};
  for (var i in obj) {
    if (obj[i] && typeof obj[i] == "object") {
      newObj[i] = cloneObj(obj[i]);
    } else newObj[i] = obj[i]
  } return newObj;
};

/* init functions */
function init_window() {
	var pause_button = $('#pause_button');
	if (pause_button) {
		pause_button.bind('click', toggle_pause);
		pause_button.attr('class','pause');
	}

	$(window).blur(function() {
		new_tweet_delay = 1;
	});
	$(window).focus(function() {
		new_tweet_delay = 0;
	});

	//set up form events
	$('#display_count').bind('change',update_settings_element);
	$('#frame_rate').bind('change',update_frame_rate);
	$('#from_top').bind('change',update_from_top);

	$('#show_image').bind('change',update_settings_checkbox);
	$('#links_new').bind('change',update_settings_checkbox);
	$('#allow_scrollbars').bind('change',update_allow_scrollbars);
	
	$('#search_basic').bind('focus',select_basic_search);
	$('#search_ands').bind('focus',select_advanced_search);
	$('#search_phrase').bind('focus',select_advanced_search);
	$('#search_ors').bind('focus',select_advanced_search);

	$('#channel_title').bind('change',update_channel_title);
	$('#channel_title').bind('keyup',update_channel_title);
	
	$('#channel_name').bind('keyup',update_channel_name);
	$('#channel_name').bind('change',update_channel_name);
	
	$('#channel_email').bind('keyup',update_channel_email);
	$('#channel_email').bind('change',update_channel_email);
	
	$('#channel_theme').bind('change',load_theme);
	
	$('#save_button').bind('click',save_button_click);
	$('#save_new_button').bind('click',save_new_button_click);

	//contact form
	$('#contact_name').bind('keyup',validate_contact_form);
	$('#contact_name').bind('change',validate_contact_form);

	$('#contact_email').bind('keyup',validate_contact_form);
	$('#contact_email').bind('change',validate_contact_form);

	$('#contact_subject').bind('keyup',validate_contact_form);
	$('#contact_subject').bind('change',validate_contact_form);

	$('#contact_message').bind('keyup',validate_contact_form);
	$('#contact_message').bind('change',validate_contact_form);

	$('#contact_button').bind('click',send_contact_email);
	
	//admin
	$('#admin_email').bind('keyup',validate_admin_form);
	$('#admin_email').bind('change',validate_admin_form);

	$('#admin_button').bind('click',send_admin_email);
	
	//see if we have a channel id
	var hash = parseInt(window.location.hash.substr(1));
	if (allow_hash && !cid && !isNaN(hash)) {
		cid = hash;
		window_hash = hash;
	}
	
	var control_bar = document.getElementById('control_bar');
	control_bar.style.top = 'auto';
	var main_title = document.getElementById('main_title');
	if (main_title) {
		main_title.style.visibility = 'visible';
	}
	
	//Opera style hack
	var control_list = document.getElementById('control_list');
	if (control_list && control_list.offsetTop > 12) {
		control_list.style.marginTop = (12 - control_list.offsetTop) + 'px';
	}
	
	init_hypercube();
}

function init_hypercube() {
	last_request = 0;
	last_advance = 0;
	max_tweet_id = 0;
	locked = false;
	interval = -1;

	old_queue = [];
	new_queue = [];
	check_names = [];
	old_queue_top = 0;

	init_settings();
	
	var now = new Date();
	start_time = now.getTime();

	//todo: handle named channels
	if (cid && allow_hash) {
		window.location.hash = '#' + cid;
	}
	
	var message_list = document.getElementById('message_list');
	if (message_list) {
		message_list.innerHTML = '';
	}
	
	request();
}

function init_settings() {
	settings = {
		display_count: 20,
		frame_rate: 5000,
		from_top: 1, //if not, tweets come from bottom
		show_image: 1,
		links_new: 1,
		allow_scrollbars: 1,
		ands: '',
		ors: '',
		phrase: '',
		basic: '',
		channel_title: ''
	};

}

/* stuff that happens in the loop */
function process_frame() {
	var now = new Date();
	now = now.getTime();
	
	if (false && now - start_time > 15000) {  //todo: only if this is a premium account
		var help = document.getElementById('help_page');
		var contact = document.getElementById('contact');
		var admin_panel = document.getElementById('admin_panel');
		var settings_div = document.getElementById('settings');
		if (help.style.display == '' && settings_div.style.display == '' && contact.style.display == '' && admin_panel.style.display == '') {
			var control_bar = document.getElementById('control_bar');
			control_bar.style.top = '';

			//make title invisible also
			var main_title = document.getElementById('main_title');
			if (main_title) {
				main_title.style.visibility = '';
			}
		}
	}

	//update times for "ago"
	if (!new_queue.length && last_time_refresh + 120000 <= now) {
		update_ago_times();
	}
	
	var hash = parseInt(window.location.hash.substr(1));
	if (allow_hash && hash && !isNaN(hash) && window_hash != hash && cid != hash) {
		locked = false;
		cid = hash;
		window_hash = cid;
		init_hypercube();
		return;
	}

	//todo: don't advance if mouse is hovering over a link, unless it's been a really long time
	var time_diff = now - last_advance;
	if (settings.frame_rate<=0 && time_diff >= 500 || settings.frame_rate>0 && time_diff > settings.frame_rate)  {
		advance_queue();
	}

	//new_queue.length > 20 &&  wtf?!
	if (new_queue.length < 20 && now - last_request > settings.refresh_rate
		&& (!new_tweet_delay || time_diff > 60000*60*7 || time_diff > (now - last_new_tweet_time)/5)) {
		request(settings);
	}
}

function handle_response(data) {
	if (!data) return;

	//if channel_name has changed, then stop everything and go to new URL
	if (data.settings && data.settings.channel_name && isNaN(data.settings.channel_name)) {
		if (!channel_name) {
			channel_name = data.settings.channel_name;
		} else if (channel_name != data.settings.channel_name) {
			clearInterval(interval);
			cid = null;
			var loc = window.location.protocol + '//' + window.location.hostname;
			if (window.location.port) {
				loc += ':' + window.location.port;
			}			
			loc += server_root + settings.channel_name + '/';
			window.location = loc;
			return;
		}
	}

	if (data.email != undefined) {
		var contact_error = document.getElementById('contact_error');
		var contact_button = document.getElementById('contact_button');
		contact_button.value = 'Send Email';
		if (data.email) {
			//clear email contact form
/* not clearing this so people can see what was sent
			var cf_names = ['name','email','subject','message'];
		
			for (var i=0;i<cf_names.length;i++) {
				var element = document.getElementById('contact_' + cf_names[i]);
				if (element) {
					element.value = '';
					element.style.backgroundColor = '';
				}
			}
*/
			contact_error.innerHTML = 'Message sent';
		} else if (data.email_error == 'bad_email') {
			//error
			contact_error.innerHTML = 'Not a valid email address';
		} else if (data.email_error == 'incorrect-captcha-sol') {
			//error
			contact_error.innerHTML = 'Incorrect Captcha solution. Please try again';
		} else {
			//error
			contact_error.innerHTML = data.email_error;
		}
	} else if (data.admin != undefined) {
		var admin_error = document.getElementById('admin_error');
		var admin_button = document.getElementById('admin_button');
		admin_button.value = 'Send Email';
		if (data.admin) {
			//clear admin form
			admin_error.innerHTML = 'Message sent';
		} else if (data.admin_error == 'bad_email') {
			//error
			admin_error.innerHTML = 'No channels for that email';
		} else if (data.admin_error == 'incorrect-captcha-sol') {
			//error
			admin_error.innerHTML = 'Incorrect Captcha solution. Please try again';
		} else {
			admin_error.innerHTML = data.admin_error;
		}
	}
	
	//todo: show error

	locked = true;
	
	//check for check_name
	if (data.check_names) {
		for (var n in data.check_names) {
			check_names[n] = data.check_names[n];
		}
		update_channel_name();
	}
	
	if (data.settings && !editing_form) {
		if (!settings.channel_title && data.settings.channel_title) {
			document.title = 'Twitstorm - ' + data.settings.channel_title;
			var main_title = document.getElementById('main_title');
			if (main_title) main_title.innerHTML = 'Twitstorm - ' + data.settings.channel_title;
		}

		for (var s in data.settings) {
			settings[s] = data.settings[s];
		}
		
		if (data.settings.channel_id) {
			cid = data.settings.channel_id;
		}
		if (data.settings.cookie) {
			cookie = data.settings.cookie;
			
		}

		settings_backup = cloneObj(settings);

		load_settings_form();
		load_theme(data.settings.theme_id);

		//update allow_scrollbars
		var message_list = document.getElementById('message_list');
		if (settings.allow_scrollbars) {
			message_list.style.overflowY = 'auto';
		} else {
			message_list.style.overflowY = 'hidden';
		}
	}

	//clear and start over if search changes
	if (old_search!='' && old_search != settings.search_query) {
		//todo: reset everything?
		old_search = settings.search_query;
		init_hypercube();
		return;
	} else if (old_search!='') {
		old_search = settings.search_query;
	}
	
	var min_id = 0;
	if (!old_queue.length && cid) {
		var last_id = parseInt(readCookie('max_id-' + cid));
		if (!isNaN(last_id)) {
			min_id = last_id;
			max_seen_tweet_id = last_id;
		} else {
			min_id = 1;
		}
	}

	var first_time = false;
	if (!old_queue.length && !new_queue.length) {
		first_time = true;
	}
	if (data.tweets) {
		var now = new Date();
		now = now.getTime() - 60000;
		for (var i = 0;i<data.tweets.length;i++) {
			var tweet_id = parseInt(data.tweets[i].tweet_id);
			if (tweet_id > max_tweet_id) {
				if (!min_id || tweet_id > min_id || data.tweets.length - i < 5 || data.tweets[i].timestamp >= now) {
					new_queue.push(data.tweets[i]);
				} else {
					old_queue.push(data.tweets[i]);
				}
				max_tweet_id = tweet_id;
			}
		}
		if (data.tweets.length) {
			last_new_tweet_time = now + 60000;
		}
	}
	last_request = now + 60000;
	locked = false;
	
	if (first_time && settings.frame_rate <= 0) {
		fast_forward();
	}
		
	//advance_queue();
	if (interval == -1) {
		interval = setInterval(process_frame,100);
		$('#pause_button').attr('class','pause');
		$('#pause_button').attr('title','Pause');
	}
}

function toggle_pause() {
// if (document.styleSheets != undefined) {
// 	for (var i=0;i<document.styleSheets.length;i++) {
// 		if (document.styleSheets[i]  != undefined && document.styleSheets[i].cssText != undefined) {
// 			alert(document.styleSheets[i].cssText);
// 		}
// 	}
// }
	if (interval) {
		clearInterval(interval);
		interval = 0;
		$('#pause_button').attr('class','play');
		$('#pause_button').attr('title','Play');
	} else {
		interval = setInterval(process_frame,100);
		$('#pause_button').attr('class','pause');
		$('#pause_button').attr('title','Pause');
	}
}

function load_theme(theme_id) {
	if (!theme_id || isNaN(theme_id)) {
		//if this was triggered by a form element, we're editing
		if (theme_id!=undefined &&  theme_id.target && theme_id.target.tagName) {
			editing_form = true;
		} else if (this.target && this.target.tagName) {
			editing_form = true;
		}
		
		var form_element = document.getElementById('channel_theme');
		theme_id = form_element.value;

	}

	var ss = document.getElementById('theme_style');
	if (!all_themes || !all_themes[theme_id] || !ss) return;

	if (settings_backup && settings_backup.theme_id == settings.theme_id) {
		settings_backup = cloneObj(settings);
	}

	if (settings_backup && settings_backup.theme_id == theme_id) {
		settings = cloneObj(settings_backup);
	} else {
		settings.theme_id = theme_id;
		for (var key in all_themes[theme_id]) {
			if (key != 'stylesheet' && key != 'theme_id' && settings[key] != undefined) {
				settings[key] = all_themes[theme_id][key];
			}
		}
	}
	load_settings_form();

	if (ss) {
		if (all_themes[theme_id] && all_themes[theme_id].stylesheet) {
			ss.setAttribute('href','style/' + all_themes[theme_id].stylesheet);
		}
	}
}

function fast_forward() {
	if (locked) return;
	
	locked = true;
	var now = new Date();
	now = now.getTime();
	var min_time = now / 1000 - 60;

	var this_item;
	var message_list = document.getElementById('message_list');
	if (!message_list) return;
	
	message_list.innerHTML = '';
	
	while (new_queue.length) {
		this_item = new_queue[0];
		
		if (this_item.timestamp >= min_time) break;

		new_queue.shift();
		old_queue.push(this_item);
		if (cid && this_item.tweet_id > max_seen_tweet_id) {
			max_seen_tweet_id = this_item.tweet_id;
			createCookie('max_id-' + cid,max_seen_tweet_id,7);
		}
	}
	
	
	//remove any expired ones off the end
	if (old_queue.length > max_queue_count) {
		old_queue.splice(0,old_queue.length - max_queue_count);
	}

	old_queue_top = 0;
	while (old_queue_top < old_queue.length
		&& message_list.childNodes.length < settings.display_count) {
		this_item = old_queue[old_queue_top];

		if (this_item) {
			var new_li = create_list_item(this_item);
			if (new_li) {
				if (settings.from_top) {
					message_list.insertBefore(new_li,message_list.firstChild);
				} else {
					message_list.appendChild(new_li);
					new_li.scrollIntoView(false);
				}
			}
		}
		old_queue_top++;
	}

	old_queue_top = (old_queue_top + 1) % old_queue.length;
	locked = false;
}

function advance_queue() {
	if (locked) return;
	
	var now = new Date();
	last_advance = now.getTime();

	var this_item;
	var message_list = document.getElementById('message_list');
	if (!message_list) return;

	if (new_queue.length) {
		this_item = new_queue.shift();
		old_queue.push(this_item);
		if (cid && this_item.tweet_id > max_seen_tweet_id) {
			max_seen_tweet_id = this_item.tweet_id;
			createCookie('max_id-' + cid,max_seen_tweet_id,7);
		}
	} else if (old_queue.length && settings.frame_rate > 0) { //(message_list.hasChildNodes() ) { //&& old_queue.length > message_list.childNodes.length) {
		this_item = old_queue[old_queue_top];
		old_queue_top = (old_queue_top + 1) % old_queue.length;
	}

	//remove any expired ones off the end
	if (old_queue.length > max_queue_count) {
		old_queue.splice(0,old_queue.length - max_queue_count);
	}
	if (old_queue_top >= old_queue.length) old_queue_top = 0; 

	if (this_item) {
		while (message_list.childNodes.length >= settings.display_count
		|| message_list.childNodes.length >= old_queue.length) {
			if (settings.from_top) {
				message_list.removeChild(message_list.lastChild);
			} else {
				message_list.removeChild(message_list.firstChild);
			}
		}
		
		var new_li = create_list_item(this_item);
		if (new_li) {
			if (settings.from_top) {
				message_list.insertBefore(new_li,message_list.firstChild);
			} else {
				message_list.appendChild(new_li);
				new_li.scrollIntoView(false);
			}
		}
	}

}

function update_ago_times() {
	if (locked) return;
	locked = true;

	for (var i=0;i<old_queue.length;i++) {
		var ago = document.getElementById('entry_date_ago_' + old_queue[i].tweet_id);
		if (ago) {
			ago.innerHTML = get_recent_time(old_queue[i].timestamp);
		}
	}
	
	var now = new Date();
	last_time_refresh = now.getTime();

	locked = false;
}

function create_list_item(item) {
	var new_li = document.createElement('div');
	if(new_li) {
		if (settings.show_image) {
			var imageSpan = document.createElement('span');
			if(imageSpan) {
				new_li.appendChild(imageSpan);
				//imageSpan.setAttribute('class','user_image');
				$(imageSpan).attr('class','user_image');
	
				//todo: make sure image exists
				//http://www.javascriptkit.com/jsref/image.shtml
	
				var image = document.createElement('img');
				if(image) {
					imageSpan.appendChild(image);
					image.setAttribute('src',item.image_url);
					//image.setAttribute('alt',item.fullname);
				}
			}
		}

		var statusBody = document.createElement('span');
		if(statusBody) {
			new_li.appendChild(statusBody);
			//statusBody.setAttribute('class','status_body');
			$(statusBody).attr('class','status_body');

			var screenName = document.createElement('a');
			if(screenName) {
				statusBody.appendChild(screenName);
				//screenName.setAttribute('class','screen_name');
				$(screenName).attr('class','screen_name');
				screenName.setAttribute('title',item.fullname);
				screenName.setAttribute('href','http://twitter.com/' + item.username);
				if (settings.links_new) {
					screenName.setAttribute('target','_new');
				}

				var textNode = document.createTextNode(item.username);
				if(textNode) {
					screenName.appendChild(textNode);
				}
			}
			
			statusBody.appendChild(document.createTextNode(' '));

			var content = document.createElement('span');
			if(content) {
				statusBody.appendChild(content);
				//content.setAttribute('class','entry_content');
				$(content).attr('class','entry_content');
				
				var text = item.text;
				
				//linkify text
				var target = '';
				if (settings.links_new) {
					target = ' target="_new"';
				}
				text = text.replace(/((http|https):\/\/)+(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})|localhost)(\:[0-9]+)*(\/[a-zA-Z0-9\&%_\.\/-~-\+]*)?(\#[a-zA-Z0-9\-_\+]*)?/g,'<a href="$&"' + target + '>$&</a>',text);
	
				text = text.replace(/@([A-Za-z_0-9]+)/g,'<a href="http://twitter.com/$1"' + target + '>$&</a>',text);

				text = text.replace(/#([A-Za-z_0-9]+)/g,'<a href="http://search.twitter.com/search?q=%23$1"' + target + '>$&</a>',text);

				content.innerHTML = text;
				//var textNode = document.createTextNode(item.text);
				//if(textNode) {
				//	content.appendChild(textNode);
				//}
			}

			var meta = document.createElement('span');
			if(meta) {
				statusBody.appendChild(meta);
				//meta.setAttribute('class','entry_meta');
				$(meta).attr('class','entry_meta');

				var tweet_link = 'http://twitter.com/' + item.username + '/statuses/' + item.tweet_id;

				if (typeof item.timestamp == 'string') {
					item.timestamp = parseInt(item.timestamp) * 1000;
				}
				var date = new Date(item.timestamp);

				var agoDate = document.createElement('a');
				if(agoDate) {
					meta.appendChild(agoDate);
					agoDate.setAttribute('id','entry_date_ago_' + item.tweet_id);
					$(agoDate).attr('class','entry_date_ago');
					agoDate.setAttribute('href',tweet_link);
					if (settings.links_new) {
						agoDate.setAttribute('target','_new');
					}

					var textNode = document.createTextNode(get_recent_time(item.timestamp));
					if(textNode) {
						agoDate.appendChild(textNode);
					}
				}

				var localeDate = document.createElement('a');
				if(localeDate) {
					meta.appendChild(localeDate);
					$(localeDate).attr('class','entry_date_locale');
					localeDate.setAttribute('href',tweet_link);
					if (settings.links_new) {
						localeDate.setAttribute('target','_new');
					}

					var textNode = document.createTextNode(date.toLocaleString() );
					if(textNode) {
						localeDate.appendChild(textNode);
					}
				}

				var timestamp = document.createElement('a');
				if(timestamp) {
					meta.appendChild(timestamp);
					$(timestamp).attr('class','entry_date_timestamp');
					timestamp.setAttribute('href',tweet_link);
					if (settings.links_new) {
						timestamp.setAttribute('target','_new');
					}

					var textNode = document.createTextNode(item.timestamp);
					if(textNode) {
						timestamp.appendChild(textNode);
					}
				}
			}
		}
	}
	return new_li;
}



function get_recent_time(time) {
	//todo: localize
	var now = new Date();
	now = now.getTime();
	var diff = (now - time)/1000;
	var s;
	
	if (diff<60) {
		s = Math.floor(diff) + " second";
		if (diff>1) {
			s += 's';
		}
	} else if (diff<60*60) {
		var m = Math.floor(diff/60);
		s = m + " minute";
		if (m>1) {
			s += 's';
		}
	} else if (diff<60*60*24) {
		var h = Math.floor(diff/(60*60));
		s = h + " hour";
		if (h>1) {
			s += 's';
		}
	} else if ((new Date(now)).toDateString() == (new Date(time+86400)).toDateString() ) {
		s+= "Yesterday ";
	} else if (diff<60*60*24*7) {
		var d = Math.floor(diff/(60*60*24));
		s = d + " day";
		if (d>1) {
			s += 's';
		}
	} else if (diff/(60*60*24) < 30 ) {
		var w = Math.floor(diff/(60*60*24*7));
		s = w + " week";
		if (w>1) {
			s += 's';
		}
	} else if (diff/(60*60*24) < 365) {
		var m = Math.floor(diff/60/60/24/365*12); //this is approximate
		s = m + " month";
		if (m>1) {
			s += 's';
		}
	} else {
		var y = Math.floor(diff/60/60/24/365);
		s = y + " year";
		if (y>1) {
			s += 's';
		}
	}
	
	return s + " ago";
}


function request(settings, save, block_cid) {
	//todo: dynamically generate URL
	//var url = 'http://localhost:8888/hypercube/server.php?';
	//var url = 'http://hypercube.threeeyedlabs.com/server.php?';
	var url = 'server.php?';
	var params = [];
	var done_cid = false;
	var done_cookie = false;

	if (!block_cid && cid && cid != undefined && !isNaN(cid)) {
		params.push('cid=' + cid);
		done_cid = true;
	}

	if (cookie && cookie != undefined && cookie!= '') {
		params.push('cookie=' + encodeURIComponent(cookie));
		done_cookie = true;
	}

	if (max_tweet_id && max_tweet_id != undefined && !isNaN(max_tweet_id)) {
		params.push('min_tweet_id=' + (max_tweet_id+1));
	}
	
	if (settings) {
		for (var key in settings) {
			switch(key) {
				case 'cid':
				case 'channel_id':
					if (!done_cid && !block_cid) {
						params.push(encodeURIComponent('cid') + '=' + encodeURIComponent(settings[key]));
					}
					break;
				case 'cookie':
					if (!done_cookie) {
						params.push(encodeURIComponent(key) + '=' + encodeURIComponent(settings[key]));
					}
					break;
				case 'min_tweet_id':
//					break;
				default:
					params.push(encodeURIComponent(key) + '=' + encodeURIComponent(settings[key]));
			}
		}
		if (save) {
			params.push('save=true');
		}
	}
	
	url += params.join('&');

	var now = new Date();
	last_request = now.getTime();

	$.getJSON(url,handle_response);
}

/* Form handling functions */

function save_new_button_click() {
	var save_button = document.getElementById('save_button');
	save_button.disabled = true;

	var save_new_button = document.getElementById('save_new_button');
	save_button.save_new_button = true;

	save_settings_form(true);
}

function save_button_click() {
	if (cid && cookie) {
		var save_button = document.getElementById('save_button');
		save_button.disabled = true;
	
		var save_new_button = document.getElementById('save_new_button');
		save_button.save_new_button = true;
	
		save_settings_form(false);
	}
}

function save_settings_form(block_cid) {
	var theme_select = document.getElementById('channel_theme');
	if (theme_select) {
		settings.theme_id = theme_select.value;
	}
	
	//save queries
	var search_type_basic = document.getElementById('search_type_basic');
	var search_ands = document.getElementById('search_ands');
	var search_phrase = document.getElementById('search_phrase');
	var search_ors = document.getElementById('search_ors');
	if (search_type_basic && (search_type_basic.checked || 
		search_ands.value.trim() == ''
		&& search_phrase.value.trim() == ''
		&& search_ors.value.trim() == '')) {
		var search_basic = document.getElementById('search_basic');
		settings.basic = search_basic.value;
		settings.ands = '';
		settings.ors = '';
		settings.phrase = '';
	} else {
		settings.basic = '';

		settings.ands = search_ands.value;

		settings.phrase = search_phrase.value;

		settings.ors = search_ors.value;
	}
	
	//save channel settings
	var channel_title = document.getElementById('channel_title');
	settings.channel_title = channel_title.value;
	
	var channel_email = document.getElementById('channel_email');
	settings.channel_email = channel_email.value;
	
	var channel_theme = document.getElementById('channel_theme');
	settings.theme_id = channel_theme.value;

	editing_form = false;
	request(settings,true,block_cid);
}

function load_settings_form() {
	if (settings.from_top) {
		$('#from_top').val('true');
	} else {
		$('#from_top').val('false');
	}
	
	$('#channel_title').val(settings.channel_title);
	$('#channel_email').val(settings.channel_email);
	
	if (settings.channel_name && isNaN(settings.channel_name) && cookie) {
		$('#channel_name').val(settings.channel_name);
	} else {
		$('#channel_name').val('');
	}

	//todo: handle channel_name
	var loc = window.location.protocol + '//' + window.location.hostname;
	if (window.location.port) {
		loc += ':' + window.location.port;
	}
	loc += server_root;
	if (settings.channel_name) {
		loc += settings.channel_name + '/';
	} else if (cid) {
		loc += '#' + cid;
	}
	$('#public_url').val(loc);
	
	var save_button = document.getElementById('save_button');
	save_button.disabled = false;

	var save_new_button = document.getElementById('save_new_button');
	save_button.save_new_button = false;

	var edit_url_div = document.getElementById('edit_url_div');
	var save_button_container = document.getElementById('save_button_container');
	if (cookie) {
		edit_url_div.style.display = 'block';
		var loc = window.location.protocol + '//' + window.location.hostname;
		if (window.location.port) {
			loc += ':' + window.location.port;
		}
		loc += server_root + '?c=' + cookie;
		$('#edit_url').val(loc);
		
		save_button_container.style.display = '';
	} else {
		edit_url_div.style.display = 'none';
		save_button_container.style.display = 'none';
	}
	
	$('#display_count').val(settings.display_count);
	
	$('#frame_rate').val(settings.frame_rate);
	
	$('#channel_theme').val(settings.theme_id);

	if (settings.show_image) {
		$('#show_image').attr('checked','checked');
	} else {
		$('#show_image').removeAttr('checked');
	}

	if (settings.links_new) {
		$('#links_new').attr('checked','checked');
	} else {
		$('#links_new').removeAttr('checked');
	}

	if (settings.allow_scrollbars) {
		$('#allow_scrollbars').attr('checked','checked');
	} else {
		$('#allow_scrollbars').removeAttr('checked');
	}
	
	if (settings.ands ||
		settings.phrase ||
		settings.ors) {
		$('#search_type_advanced').attr('checked','checked');
		$('#search_type_basic').removeAttr('checked');
		if (settings.ands) {
			$('#search_ands').val(settings.ands);
		} else {
			$('#search_ands').val('');
		}
		if (settings.phrase) {
			$('#search_phrase').val(settings.phrase);
		} else {
			$('#search_phrase').val('');
		}
		if (settings.ors) {
			$('#search_ors').val(settings.ors);
		} else {
			$('#search_ors').val('');
		}
	} else {
		$('#search_basic').val(settings.basic);
		$('#search_type_basic').attr('checked','checked');
		$('#search_type_advanced').removeAttr('checked');
	}
}

function update_settings_element(e) {
	var element;
	if (e!=undefined && e.tagName) {
		element = e;
	} else if (e!=undefined && e.target && e.target.tagName) {
		element = e.target;
	} else if (this.target && this.target.tagName) {
		element = this.target;
	} else {
		return;
	}
	
	if (element.id) {
		settings[element.id] = element.value;
		editing_form = true;
	}
}

function update_settings_checkbox(e) {
	var element;
	if (e!=undefined && e.tagName) {
		element = e;
	} else if (e!=undefined && e.target && e.target.tagName) {
		element = e.target;
	} else if (this.target && this.target.tagName) {
		element = this.target;
	} else {
		return;
	}
	
	if (element.id && element.getAttribute('type') == 'checkbox') {
		settings[element.id] = element.checked ? 1 : 0;
		editing_form = true;
	}
}

function update_frame_rate(e) {
	var element;
	if (e!=undefined && e.tagName) {
		element = e;
	} else if (e!=undefined && e.target && e.target.tagName) {
		element = e.target;
	} else if (this.target && this.target.tagName) {
		element = this.target;
	} else {
		return;
	}
	
	if (element.id) {
		settings[element.id] = element.value;
		editing_form = true;
	}
	
	if (settings.frame_rate <= 0) {
		fast_forward();
	}
}

function update_allow_scrollbars() {
	var element = document.getElementById('allow_scrollbars');
	
	if (element && element.id && element.getAttribute('type') == 'checkbox') {
		settings.allow_scrollbars = element.checked ? 1 : 0;
	}
	
	var message_list = document.getElementById('message_list');
	if (settings.allow_scrollbars) {
		message_list.style.overflowY = 'visible';
	} else {
		message_list.style.overflowY = 'hidden';
	}
	editing_form = true;
}

function update_from_top() {
	var element = document.getElementById('from_top');
	
	var new_value;
	var changed = false;
	if (element && element.id) {
		new_value = element.value && (element.value == 'false' ? false : true);
		if (settings.from_top != new_value) changed = true;
		settings.from_top = new_value;
	}
	
	var message_list = document.getElementById('message_list');
	if (changed) {
		message_list.innerHTML = '';
	}
	editing_form = true;
}

function update_channel_title() {
	var element = document.getElementById('channel_title');
	if (element.value) {
		document.title = 'Twitstorm - ' + element.value;
		var main_title = document.getElementById('main_title');
		if (main_title) main_title.innerHTML = 'Twitstorm - ' + element.value;
	}
	editing_form = true;
}

function update_channel_name() {
	if (!cookie && check_names[channel_name] == undefined) {
		check_names[channel_name] = 'Name in use';
	}

	editing_form = true;
	var element = document.getElementById('channel_name');
	if (element.value) {
		//validate
		var new_name = element.value.trim();
		var channel_name_error = document.getElementById('channel_name_error');
		var re = /^[a-zA-Z][a-zA-Z0-9_]*$/;
		if (!re.test(new_name)) {
			channel_name_error.innerHTML = 'Invalid name';
			element.style.backgroundColor = '#F28484';
		} else if (new_name == channel_name && cookie || check_names[new_name] != undefined && !check_names[new_name]) { //this name is good
			settings.channel_name = new_name;
			channel_name_error.innerHTML = '';
			element.style.backgroundColor = '';
		} else if (check_names[new_name] != undefined && check_names[new_name]) {
			channel_name_error.innerHTML = check_names[new_name];
			element.style.backgroundColor = '#F28484';
		} else {
			settings.channel_name = new_name;
			channel_name_error.innerHTML = 'Checking...';
			element.style.backgroundColor = '#FFF284';
			
			var url = 'server.php?check_name=' + encodeURIComponent(new_name);
			if (cid) {
				url += '&cid=' + cid;
			}
			if (cookie) {
				url += '&cookie=' + encodeURIComponent(cookie);
			}
			var now = new Date();
			last_request = now.getTime();
			$.getJSON(url,handle_response);
		}
	}

}

function update_channel_email() {
	var element = document.getElementById('channel_email');
	if (element.value) {
		//validate
		var new_email = element.value.trim();
		var channel_email_error = document.getElementById('channel_email_error');
		var re = /^[\w-][\+\w-]*(\.[\+\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/;
		if (re.test(new_email) || new_email == '') {
			settings.channel_email = new_email;
			channel_email_error.innerHTML = '';
			element.style.backgroundColor = '';
		} else {
			channel_email_error.innerHTML = 'Invalid email address';
			element.style.backgroundColor = '#F28484';
		}
	}
	editing_form = true;
}

function update_channel_theme() {
	return false;
	var element = document.getElementById('channel_theme');
	if (element.value) {
		settings.theme_id=element.value;
	}
	editing_form = true;
	request(settings);
}

function select_advanced_search() {
	$('#search_type_advanced').attr('checked','checked');
	$('#search_type_basic').removeAttr('checked');
	editing_form = true;
}

function select_basic_search() {
	$('#search_type_basic').attr('checked','checked');
	$('#search_type_advanced').removeAttr('checked');
	editing_form = true;
}

function toggle_settings_container() {
	var settings_div = document.getElementById('settings');
	var control_bar = document.getElementById('control_bar');
	var contact = document.getElementById('contact');
	var admin_panel = document.getElementById('admin_panel');
	var help = document.getElementById('help_page');
	var main_title = document.getElementById('main_title');

	if (settings_div.style.display == '') {
//		control_bar.style.top = 'auto';
		settings_div.style.display = 'block';
		help.style.display = '';
		contact.style.display = '';
		admin_panel.style.display = '';
//		main_title.style.visibility = 'visible';
	} else {
//		main_title.style.visibility = '';
//		control_bar.style.top = '';
		settings_div.style.display = '';
	}
}

function toggle_help_page() {
	var help = document.getElementById('help_page');
	var admin_panel = document.getElementById('admin_panel');
	var settings = document.getElementById('settings');
	var contact = document.getElementById('contact');
	var control_bar = document.getElementById('control_bar');
	var main_title = document.getElementById('main_title');
	if (help.style.display == '') {
//		control_bar.style.top = 'auto';
		help.style.display = 'block';
		settings.style.display = '';
		contact.style.display = '';
		admin_panel.style.display = '';
//		main_title.style.visibility = 'visible';
	} else {
//		main_title.style.visibility = '';
//		control_bar.style.top = '';
		help.style.display = '';
	}
}

function toggle_contact_page() {
	var admin_panel = document.getElementById('admin_panel');
	var help = document.getElementById('help_page');
	var contact = document.getElementById('contact');
	var settings = document.getElementById('settings');
	var control_bar = document.getElementById('control_bar');
	var main_title = document.getElementById('main_title');
	if (contact.style.display == '') {
		if (window.Recaptcha && window.Recaptcha.destroy) {
			captcha_event_set = false;
			Recaptcha.destroy();
			Recaptcha.create("6LdZ3AcAAAAAADNP6fM9aQHwj2LA8lgEGmBrW36-", 'contact_captcha', {
				theme: 'blackglass'
			});

			var cap = document.getElementById('recaptcha_response_field');cap = document.getElementById('recaptcha_response_field');
			if (cap) {
				$('#recaptcha_response_field').bind('keyup',validate_contact_form);
				$('#recaptcha_response_field').bind('change',validate_contact_form);
				captcha_event_set = true;
			}
			//validate_contact_form();
		}

		var contact_button = document.getElementById('contact_button');
		contact_button.value = 'Send Email';

//		control_bar.style.top = 'auto';
		contact.style.display = 'block';
		settings.style.display = '';
		help.style.display = '';
		admin_panel.style.display = '';
//		main_title.style.visibility = 'visible';
	} else {
//		main_title.style.visibility = '';
//		control_bar.style.top = '';
		contact.style.display = '';
	}
}

function toggle_admin_page() {
	var admin_panel = document.getElementById('admin_panel');
	var help = document.getElementById('help_page');
	var contact = document.getElementById('contact');
	var settings = document.getElementById('settings');
	var control_bar = document.getElementById('control_bar');
	var main_title = document.getElementById('main_title');
	if (admin_panel.style.display == '') {
		if (window.Recaptcha != undefined && window.Recaptcha.destroy) {
			captcha_event_set = false;
			Recaptcha.destroy();
			Recaptcha.create("6LdZ3AcAAAAAADNP6fM9aQHwj2LA8lgEGmBrW36-", 'admin_captcha', {
				theme: 'blackglass'
			});

			var cap = document.getElementById('recaptcha_response_field'); cap = document.getElementById('recaptcha_response_field');
			if (cap) {
				$('#recaptcha_response_field').bind('keyup',validate_admin_form);
				$('#recaptcha_response_field').bind('change',validate_admin_form);
				captcha_event_set = true;
			}
		}

		var admin_button = document.getElementById('admin_button');
		admin_button.value = 'Send Email';

//		control_bar.style.top = 'auto';
		admin_panel.style.display = 'block';
		settings.style.display = '';
		contact.style.display = '';
		help.style.display = '';
//		main_title.style.visibility = 'visible';
	} else {
//		main_title.style.visibility = '';
//		control_bar.style.top = '';
		admin_panel.style.display = '';
	}
}

function validate_admin_form() {
	var regex = /^[\w-][\+\w-]*(\.[\+\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/;

	//double check recaptcha key/change event
	if (!captcha_event_set) {
		var cap = document.getElementById('recaptcha_response_field');
		if (cap) {
			$('#recaptcha_response_field').bind('keyup',validate_admin_form);
			$('#recaptcha_response_field').bind('change',validate_admin_form);
			captcha_event_set = true;
		}
	}

	var valid = true;
	var element = document.getElementById('admin_email');
	if (element) {
		var val = element.value.trim();
		var error_element = document.getElementById('admin_email_error');
		if (!val) {
			error_element.innerHTML = 'This is required';
			element.style.backgroundColor = '#FFF284';
			valid = false;
		} else if (!regex.test(val)) {			
			error_element.innerHTML = 'Invalid. Check again.';
			element.style.backgroundColor = '#F28484';
			valid = false;
		} else {
			element.style.backgroundColor = '';
			error_element.innerHTML = '';
		}
	} else {
		valid = false;
	}
	
	if (window.Recaptcha && window.Recaptcha.get_response) {
		var captcha = Recaptcha.get_response();
		if (!captcha) valid = false;
	} else {
		valid = false;
	}
	
	var admin_button = document.getElementById('admin_button');
	admin_button.disabled = !valid;
	
	return valid;
}

function validate_contact_form() {
	var cf_regex = {
		'name': false,
		'email': /^[\w-][\+\w-]*(\.[\+\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/,
		'subject': false,
		'message': false
	};

	//double check recaptcha key/change event
	if (!captcha_event_set) {
		var cap = document.getElementById('recaptcha_response_field');
		if (cap) {
			$('#recaptcha_response_field').bind('keyup',validate_contact_form);
			$('#recaptcha_response_field').bind('change',validate_contact_form);
			captcha_event_set = true;
		}
	}

	var valid = true;

	for (var i in cf_regex) {
		var element = document.getElementById('contact_' + i);
		if (element) {
			var val = element.value.trim();
			var error_element = document.getElementById('contact_' + i + '_error');
			if (!val) {
				error_element.innerHTML = 'This is required';
				element.style.backgroundColor = '#FFF284';
				valid = false;
			} else if (cf_regex[i] && !cf_regex[i].test(val)) {			
				error_element.innerHTML = 'Invalid. Check again.';
				element.style.backgroundColor = '#F28484';
				valid = false;
			} else {
				element.style.backgroundColor = '';
				error_element.innerHTML = '';
			}
		} else {
			valid = false;
		}
	}
	
	if (window.Recaptcha && window.Recaptcha.get_response) {
		var captcha = Recaptcha.get_response();
		if (!captcha) valid = false;
	} else {
		valid = false;
	}
	
	var contact_button = document.getElementById('contact_button');
	contact_button.disabled = !valid;
	
	return valid;
}

function send_contact_email() {
	var cf_names = ['name','email','subject','message'];
	var contact_fields = {};

	for (var i=0;i<cf_names.length;i++) {
		var element = document.getElementById('contact_' + cf_names[i]);
		if (element)
			contact_fields[cf_names[i]] = element.value;
	}
	
	if (window.Recaptcha && window.Recaptcha.get_response) {
		contact_fields.captcha_response = Recaptcha.get_response();
		contact_fields.captcha_challenge = Recaptcha.get_challenge();
		Recaptcha.reload();
	}
	
	if (validate_contact_form()) {
		//send it
		var url = 'server.php?';
		var params = [];

		if (cid) {
			params.push('cid=' + cid);
		}
		if (cookie) {
			params.push('cookie=' + encodeURIComponent(cookie));
		}
		params.push('contact=true');
		url += params.join('&');

		var contact_button = document.getElementById('contact_button');
		contact_button.value = 'Sending...';
		contact_button.disabled = true;
		var contact_error = document.getElementById('contact_error');
		contact_error.innerHTML = 'Sending...';

		$.post(url,contact_fields,handle_response,'json');
	}
}

function send_admin_email() {
	var regex = /^[\w-][\+\w-]*(\.[\+\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/;
	var params = [];
	var admin_fields = {};

	var element = document.getElementById('admin_email');
	if (!element) return false;
	
	if (window.Recaptcha && window.Recaptcha.get_response) {
		params.push('captcha_response=' + encodeURIComponent(Recaptcha.get_response()));
		params.push('captcha_challenge=' + encodeURIComponent(Recaptcha.get_challenge()));
		//admin_fields.captcha_response = Recaptcha.get_response();
		//admin_fields.captcha_challenge = Recaptcha.get_challenge();
		Recaptcha.reload();
	}
	
	if (validate_admin_form()) {
		//send it
		var url = 'server.php?';

		if (cid) {
			params.push('cid=' + cid);
		}
		if (cookie) {
			params.push('cookie=' + encodeURIComponent(cookie));
		}
		params.push('admin_email=' + encodeURIComponent(element.value.trim()));
		//admin_fields.admin_email = element.value.trim();
		params.push('admin=true');
		url += params.join('&');

		var admin_button = document.getElementById('admin_button');
		admin_button.value = 'Sending...';
		admin_button.disabled = true;
		var admin_error = document.getElementById('admin_error');
		admin_error.innerHTML = 'Sending...';

		$.getJSON(url,handle_response);
		//$.post(url,admin_fields,null,'json');
	}
}

$(window).load(init_window);
