var g_ajaxupload = null;

function log(msg) {
	if (window.console) window.console.log(msg);
}

/**
 * Yellow fader
 */
(function($) {
	var fadesteps = ["FFFFFF", "FFFFF0", "FFFFE2", "FFFFD3", "FFFFC5", "FFFFB6", "FFFFA8", "FFFF99"];
	var interval = 250;
	
	$.fn.fade = function (forward) {
		var def = $(this).css('background-color');
		if (!forward) {
			jfade_back(this, 0);
		} else {
			jfade(this, def, 8);
		}
	}

	function jfade(elem, def, step) {
		if (step >= 1) {
			-- step;
			$(elem).css('background-color', '#' + fadesteps[step]);
	        setTimeout(function(){jfade(elem, def, step)}, interval);
		} else {
			$(elem).css('background-color', def);
		}
	}
		
	function jfade_back(elem, step) {
		$(elem).css('background-color', '#' + fadesteps[step]);
		if (step < 7) {
	        setTimeout(function(){jfade_back(elem, ++step)}, interval);
		}
	}
})(jQuery);

(function($) {
	var this_base_url = null;
	var this_username = null;
	function getBaseUrl() {
		if (null == this_base_url) {
			this_base_url = $('base').attr('href');
		}
		return this_base_url;
	}
	
	function getUsername() {
		if (null == this_username) {
			var curpage = ('' + location.pathname);
			if (curpage.length > 0) {
				var endpos = curpage.indexOf('/', 1);
				this_username = (endpos <= 0) ? curpage.substr(1) : curpage.substring(1, endpos);
			}			
		}
		return this_username;
	}
	
	$.fn.getUsername = function() {
		return getUsername();
	}

	$.fn.levels = function() {
		return this
			.click(function (event) {
				var $this = $(this);
				//var parent = $this.parent();
				var parent = $this.parent('div');
				var username = getUsername();
				$.get(getBaseUrl() + username + '/skills/level/' + parent.parent('div').attr('id') + '/' + $this.val(), function() {
					//alert('updating parent: ' + parent.parent('div').attr('id'));
					// remove the selected class for all levels for this skill
					$('div.skillselected', parent.parent('div'))
						.removeClass('skillselected')
						.addClass('skill');
					// add selected to the parent
					parent.addClass('skillselected');
				});
				//return false;
		});
	}
	
	function content_names(key) {
		var postfixes = ['content', 'editlink', 'editcontent', 'save'];
		var names = sep = '';
		for (var i = postfixes.length - 1 ; i >= 0 ; -- i) {
			names += sep + '#' + key + '-' + postfixes[i];
			sep = ', ';
		}
		return names;
	}
	
	function content_edit_toggle(key) {
		$(content_names(key)).toggle();
	}
	
	$.fn.hideshow = function() {
		return this
			.click(function(event) {
				var rel = $(this).attr('rel');
				content_edit_toggle(rel);
				log('trying to focus: ' + rel + '-editcontent')
				$('#' + rel + '-editcontent').focus();
				return false;
			});
	}

	$.fn.skill_create_btn = function () {
		return this
			.click(function(event) {
				var form = $(this).parents('form');
				$.post(form.attr('action'), {
						key: 'name',
						value: $('#title-editcontent', form).val()
					}, function (response) {
						log('data : ' + response);
						window.location = response.data.url;
					}, 'json');
				return false;
			});
	};
	
	function item_update(url, data, ret) {
		$.post(url, data, function (response) {
				log('data : ' + response);
				if ('undefined' != typeof(response.error)) {
					alert(response.error);
				} else if ('undefined' != typeof(response.data.url)) {
					window.location = response.data.url;
				} else if ('undefined' != typeof(response.data)) {
					ret(response.data);
				}
			}, 'json');
	}
	$.fn.save_btn = function () {
		return this
			.click(function (event) {
				var form = $(this).parents('form');
				var rel = $(this).attr('rel');
				var input = $('#' + rel + '-editcontent', form);
				var val = '';
				log(rel + ' editcontent = ' + input + ', name = ' + input.attr('tagName'))
				/**
				 * Check for a surrounding container
				 */
				if ('DIV' == input.attr('tagName').toUpperCase()) {
					var sub_input = $('input', input);
					if ('undefined' == typeof(sub_input.get(0))) {
						val = select_list_ids('#' + rel + '-selected');
					} else {
						val = sub_input.val();
					}
					log('save_btn.click input2 = ' + input.attr('tagName'));
				} else {
					val = input.val();
				}
				item_update(form.attr('action'), {
						key: rel,
						value: val
					}, function (data) {
						if ('undefined' != typeof(data.newvalue)) {
							var content = $('#' + rel + '-content', form);
							content.html(data.newvalue);
							content_edit_toggle(rel);
							content.show();
							$('#' + rel + '-editcontent', form).hide();
							content.fade('TEXTAREA' != input.attr('tagName').toUpperCase());
						}
					});
				return false;
			});
	};
	
	$.fn.study_level_save_btn = function(){
		return this.click(function(event){
			var form = $(this).parents('form');
			var container = $('#study_level_id-editcontent');
			var study_level_id = $('#study_level_id', container).val();
			var data;
			log('study level: ' + study_level_id);
			if (0 == study_level_id) {
				data = {key: 'other', value: $('#study_level_other', container).val()};
			} else {
				data = {key: 'study_level_id', value: study_level_id};
			}
			item_update(
				form.attr('action'),
				data,
				function (data) {
					if ('undefined' != typeof(data.newvalue)) {
						var content = $('#study_level_id-content', form);
						content.html(data.newvalue);
						content_edit_toggle('study_level_id');
						content.fade();
					}
				}
			);
			return false;
		});
	};

	$.fn.dates_save_btn = function() {
		return this.click(function() {
			log('dates');
			//return false;
			var form = $(this).parents('form');
			var container = $('#dates-editcontent');
			item_update(form.attr('action'), {
					key: 'dates',
					fromMonth: $('#from-month', container).val(),
					fromYear: $('#from-year', container).val(),
					toMonth: $('#to-month', container).val(),
					toYear: $('#to-year', container).val(),
					present: $('#present:checked', container).val()
				}, function (data) {
					if ('undefined' != typeof(data.newvalue)) {
						var content = $('#dates-content', form);
						content.html(data.newvalue);
						content_edit_toggle('dates');
						content.fade(true);
					}
				});
			return false;
		});
	}

	$.fn.skill_title_save_btn = function() {
		log('skill title save')
		return this.click(function() {
			log('skill title');
			//return false;
			var form = $(this).parents('form');
			var container = $('#skill_title-editcontent');
			item_update(form.attr('action'), {
					key: 'title',
					title: $('input[name="skill_title-editcontent"]', container).val(),
					key_skill: $('input[type="checkbox"]', container).val()
				}, function (data) {
					if ('undefined' != typeof(data.newvalue)) {
						var content = $('#skill_title-content', form);
						content.html(data.newvalue);
						content_edit_toggle('skill_title');
						content.fade(true);
					}
				});
			return false;
		});
	}
	
	function list_move(from, to) {
		log('list_move_selected: from ' + from);
		$('option:selected', from).each(function() {
			log(this + ', val = ' + $(this).val() + ', text = ' + $(this).text());
			$(to).append(this);
		});
	}
	function list_move_available(container) {
		list_move(
			$('select[rel="available"]', container),
			$('select[rel="selected"]', container)
		);	
	}
	function list_move_selected(container) {
		list_move(
			$('select[rel="selected"]', container),
			$('select[rel="available"]', container)
		);	
	}
	
	function select_list_ids(selector) {
		log('select_list_ids ' + selector);
		var ids = sep = '';
		$('option', selector).each(function() {
			ids += sep + $(this).val();
			sep = ',';
		})
		return ids;
	}
	
	$.fn.select_current_list_ids = function () {
		log('select_current_list_ids');
		return select_list_ids($(this));
	}
	
	$.fn.select_list = function () {
		return this.each(function() {
			var container = $(this);
			$('a[rel="link"]', container).click(function() {
				list_move_available(container);
				return false;
			});
			$('a[rel="unlink"]', container).click(function() {
				list_move_selected(container);
				return false;
			});
			$('select[rel="available"]', container).dblclick(function() {
				list_move(this, $('select[rel="selected"]', container));
				//return false;
			})
			$('select[rel="selected"]', container).dblclick(function() {
				list_move(this, $('select[rel="available"]', container));
			//	return false;
			})
		});
	};
	
	$.fn.searchbox = function() {
		var container = $(this);
		$('input[name="method"]', container).change(function() {
			log('search clicked = ' + $(this).val());
			$('input[name="method"]', container).val($(this).val());
			$('#searchskillrow, #searchpeoplerows', container).toggle();
		});
	};
	
	$.fn.resource_edit = function(listener) {
		log('resources');
		return this.each(function() {
			var container = $(this);
			$('div.select-list', container).select_list();
			$('p.savelink a', container).click(function() {
				var form = $(this).parents('form');
				var data = $('input, textarea', form).serialize();
				if (('' + data).length > 0) {
					data += '&';
				}
				data += 'skills=' + select_list_ids('#skills-selected');
				$.post(
					form.attr('action'),
					data,
					function (resp) {
						if ('undefined' != typeof(listener) && listener) {
							listener(resp);
						} else {
							var curpage = ('' + location.pathname);
							if (0 < curpage.indexOf('/resources/images/edit')) {
								window.location = curpage.substring(0, curpage.length - 5);
								return;
							}

							var parent = $(form).parent();
							parent.html(resp);
							$(parent).resource_edit();
						}
					}
				);
				return false;
			});
		});
	};

	$.fn.resource_links_edit = function() {
		log('links edit init: ' + $(this).attr('tagName'));
		//return this.click(function() {
			log('links edit click');
			var $this = $(this);
			var container = $this.parents('div.box');
			$.get($this.attr('href'), function($data) {
				container.removeClass('box').addClass('box-edit');
				container.html($data);
				$(container).resource_edit(function (resp) {
					log('links resp');
					container.removeClass('box-edit').addClass('box');
					container.html(resp);
					//$('p.editlink a', container).resource_links_edit();
				});
			});
			return false;
		//});
	};
	
	$.fn.resource_edit_apis_old = function() {
		var container = $(this);
		log('asdfasdf: ' + container.attr('id'));			
		$('p.savelink a', container).click(function() {
			var form = $(this).parents('form');
			var rel = $(this).attr('rel')
			$.post(
				form.attr('action'),
				$('input', form).serialize(),
				function(resp) {
					$('#api-' + rel).replaceWith(resp);
					$('#api-' + rel).resource_edit_apis();
				}
			);
			return false;
		});

		$('p.editlink a', container).click(function() {
			var rel = $(this).attr('rel')
			$.get($(this).attr('href'), function(resp) {
				$('#api-' + rel).replaceWith(resp);
				$('#api-' + rel).resource_edit_apis();
			});
			return false;
		});
	};
	
	$.fn.resource_edit_apis = function() {
		var container = $(this);
		$('p.savelink a', container).live('click', function() {
			var form = $(this).parents('form');
			var rel = $(this).attr('rel')
			$.post(
				form.attr('action'),
				$('input', form).serialize(),
				function(resp) {
					$('#api-' + rel).replaceWith(resp);
				}
			);
			return false;
		});

		$('p.editlink a', container).live('click', function() {
			var rel = $(this).attr('rel')
			$.get($(this).attr('href'), function(resp) {
				$('#api-' + rel).replaceWith(resp);
			});
			return false;
		});
	};

	$.fn.resource_form_data = function() {
		var form = $(this);
		var data = $('input, textarea', form).serialize();
		if (('' + data).length > 0) {
			data += '&';
		}
		data += 'skills=' + $('#skills-selected', form).select_current_list_ids();
		return data;
	};
	
	$.fn.account_form = function() {
		var form = $(this);
		$('#private_message', form)
			.focus(function() {
				if ('true' == $(this).attr('not_set')) {
					$(this)
						.val('')
						.attr('not_set', 'false')
					;
				}
			})
			.keyup(function() {
				var val = $(this).val();
				if (('' + val).length > 0) {
					val = '~' + val;
				}
				$('#plink-content', form).text(val);
			})
		;
		$('#privacy-container input[type="checkbox"]').change(function() {
			log('checkbox: ' + $(this));
			if ('everyone' == $(this).val()) {
				log('parent = ' + $(this).parent().attr('tagName') + ', checked = ' + $(this).attr('checked'));
				if ($(this).attr('checked')) {
					/**
					 * Dissable and check
					 */
					$('input[value!="everyone"]', $(this).parent())
						.attr('disabled', true)
						.attr('checked', 'checked');
				} else {
					/**
					 * Enable
					 */
					$('input[value!="everyone"]', $(this).parent())
						.attr('disabled', false);
				}
			}
		})
	};
	
	$.fn.profile_location_dropdown = function() {
		return this.each(function() {
			$(this).unbind().change(function() {
				log('location change: ' + $(this).attr('id') + ', ' + $(this).val());
				var $this = $(this);
				$this.siblings('div[rel="children"]').remove();
				var type = $this.attr('name');
				$.post(
					'/location/children/' + $this.val(),
					{parent: $this.val(), type: type},
					function(response) {
						if ('undefined' != typeof(response.error)) {
							alert(response.error);
						} else if ('undefined' != typeof(response.data)) {
							$this.after(response.data.html);
							$('select', $this.parent()).focus().profile_location_dropdown();
						}
					},
					'json'
				);
			});
		});
	};

	$.fn.profile_edit = function() {
		$('p.editlink a[rel="profile"]').live('click', function() {
			$.get($(this).attr('href'), function(resp) {
				//$('a[rel="profile"]').toggle();
				$('#profile-content').html(resp);
				$('select', $('#locations')).profile_location_dropdown();
			});
			
			return false;
		});
		
		$('p.savelink a[rel="profile"]').live('click', function() {
			$.post(
				$(this).attr('href'),
				$('input,select', $('#profile-content')).serialize(),
				function (resp) {
					//log('save resp = ' + resp);
					$('#profile-content').html(resp);
				}
			);

			return false;
		});
	};
		
	$.fn.main_search_form = function() {
		this.submit(function() {
			var type = $('select[name="search-option"]', this).val();
			var keyword = $('input[name="search-keyword"]', this).val();
			var url = $(this).attr('action')
				+ '/' + type
				+ '/' + keyword;
			window.location = url;
			return false;
		});
	};
})(jQuery);

$(document).ready(function() {
	$('#search form').main_search_form();
	$.ajaxSetup({
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			log('ajax error: ' + textStatus);
		}
	});
	
	var curpage = ('' + location.pathname);
	log('curpage = ' + curpage);
	/**
	 * Login 
	 */
	if ('/' == curpage) {
		$('#industry').change(function(){
			$.get('skillslog/popular_skills/' + $(this).val(), {
				remember: $('#remember:checked').val()
			}, function(data){
				$('#industry_popular').replaceWith(data);
			});
		});
		$('#remember').change(function(){
			var val = this.checked ? $(this).val() : '';
			setCookie('sl_popular_remember', val, 30);
		});
		
		var help = $('#help');
		
		var this_starting_slide = ('undefined' == typeof(home_startingSlide)) ? 0 : home_startingSlide;
		
		$('#about #img_container ul').cycle({
				fx: 'scrollDown',
				startingSlide: this_starting_slide,
				timeout: 7000,
				delay:  -1000,
				fit: 1,
				before: function(currSlideElement, nextSlideElement, options, forwardFlag) {
					$('li.current', help).removeClass('current');
					var idx = $(nextSlideElement).attr('rel').substr(-1);
					$('li[rel="screenshot' + idx + '"]', help).addClass('current');
				},
				sync: true
			}
		);
	} else if (0 < curpage.indexOf('login')) {
		$('#email').focus();
	/**
	 * Log edit pages
	 */
	} else if (0 < curpage.indexOf('/skills/') ||
			   0 < curpage.indexOf('/experience/') ||
			   0 < curpage.indexOf('/education/')) {
		
		$('p.editlink a').hideshow();
		$('p.savelink a[rel!="dates"][rel!="study_level_id"][rel!="skill_title"]').save_btn();
		$('p.savelink a[rel="skill_title"]').skill_title_save_btn();
		$('p.savelink a[rel="study_level_id"]').study_level_save_btn();
		$('p.savelink a[rel="dates"]').dates_save_btn();
		
		$('div.select-list').select_list();
		$('div.skillrow input[type="radio"]').levels();
	} else if (0 < curpage.indexOf('/profile')) {
		var content = $('#content');
		$('p.editlink a[rel!="profile"]', content).hideshow();
		$('p.savelink a[rel!="profile"]', content).save_btn();
		
		content.profile_edit();
		
		var upload_link = $('#image_upload-link');
		
		if (upload_link.get(0)) {
			init_profile_upload(upload_link);
		}
		
		$('#image_remove').live('click', function() {
			try {
				$.get($(this).attr('href'), function(response){
					$('#panelleft').html(response);
					
					init_profile_upload($('#image_upload-link'));
				});
				
				return false;
			} catch (ignore) {
				log('remove error: ' + ignore);
			}
			return false;
		});
	} else if (0 < curpage.indexOf('search')) {
		$('div.searchpageinputs').searchbox();
	} else if (0 < curpage.indexOf('/resources/apis')) {
		$('#content').resource_edit_apis();
	} else if (0 < curpage.indexOf('/resources/links/edit')) {

		$('#page').resource_edit(function (resp) {
			window.location = curpage.substring(0, curpage.length -5);
//			container.removeClass('box-edit').addClass('box');
//			container.html(resp);
		});
	} else if (0 < curpage.indexOf('/resources/images/edit')) {
		log('select list');
		$('div.select-list').select_list();
		$('input[type="submit"]').live('click', function() {
			$('input[name="new_skills"]').val($('#skills-selected').select_current_list_ids());
			return true;
		});

	} else if (0 < curpage.indexOf('/resources/images')) {
//		$('div.select-list').select_list();

		var upload_link = $('a.image_upload-link');
		if (upload_link.get(0)) {
			init_resource_image_upload(upload_link);
		}

		$('p.editlink a').live('click', function() {
			var container = $(this).parents('div.box');

			$.get($(this).attr('href'), function(data) {
				container
					.removeClass('box')
					.addClass('box-edit')
					.html(data);
				$('div.select-list', container).select_list();

				var upload_link = $('a.image_upload-link', container);
				if (upload_link.get(0)) {
					init_resource_image_upload(upload_link);
				}

			});

			return false;
		});

		$('input.savebtn').live('click', function() {
			log('save image clicked 2');
			var container = $(this).parents('div.box-edit');
			var form = $(this).parents('form', container);
			var data = $(form).resource_form_data();

			$.post(
				form.attr('action'),
				data,
				function (resp) {
					container
						.html(resp);

					var form = $('form', container).get(0);

					if (!form || 'undefined' == typeof(form)) {
						/**
						 * If we're not editing change the box class
						 */
						container
							.removeClass('box-edit')
							.addClass('box');
					}
 
					/**
					 * Look for updated tag str
					 */
					var new_tag_str = $('span.new_tag_list', container);
					$('#tag_list').html(new_tag_str.html());
					new_tag_str.remove();
					
					//$(container).resource_edit();
				}
			);

			return false;
		});
		
	} else if (0 < curpage.indexOf('/resources/links') ||
			   0 < curpage.indexOf('/resources/images')) {
		$('p.editlink a').live('click', function() {
			var container = $(this).parents('div.box');

			$.get($(this).attr('href'), function(data) {
				container
					.removeClass('box')
					.addClass('box-edit')
					.html(data);
				$('div.select-list', container).select_list();
			});

			return false;
		});

		$('p.savelink a').live('click', function() {
			log('save link clicked 2');
			var container = $(this).parents('div.box-edit');
			var form = $(this).parents('form', container);
			var data = $(form).resource_form_data();

			$.post(
				form.attr('action'),
				data,
				function (resp) {
					container
						.html(resp);

					var form = $('form', container).get(0);

					if (!form || 'undefined' == typeof(form)) {
						/**
						 * If we're not editing change the box class
						 */
						container
							.removeClass('box-edit')
							.addClass('box');
					}
 
					/**
					 * Look for updated tag str
					 */
					var new_tag_str = $('span.new_tag_list', container);
					$('#tag_list').html(new_tag_str.html());
					new_tag_str.remove();
					
					$(container).resource_edit();
				}
			);

			return false;
		});

	} else if (0 < curpage.indexOf('/resources')) {
		$('form.edit_form').resource_edit();
	} else if (0 < curpage.indexOf('/account')) {
		$('#account_form').account_form();
	} else if (0 < curpage.indexOf('/contact/requestsasdf')) {
		$('a[rel="approve"], a[rel="reject"]').click(function() {
			$.getJSON($(this).attr('href'), function(data) {
				log(data);
			});
			return false;
		});
	} else if (0 < curpage.indexOf('/contact/requests')) {
		// ignore
	} else if (0 < curpage.indexOf('/contact/new')) {
		$('input[type="radio"]').live('click', function() {
			var $this	= $(this);
			var form	= $this.parents('form'); 
			var href	= form.attr('action');

			if (0 < href.indexOf('/contact/new')) {
				href = href.replace('contact\/new', 'contact\/get_relationship_links\/0')
			} else {
				href = href.replace('contact\/edit\/', 'contact\/get_relationship_links\/')
			}

			$.get(href + '/' + $this.val(), function (data) {
				$('div.relationships-container', form).html(data);
			});
		});
		$('p.savelink a').live('click', function() {
			var form = $(this).parents('form'); 
			var parent = form.parents('div.box-edit');
			var action = form.attr('action');
			
			$.post(action,
				$('input, textarea, select', form).serialize(),
				function(data) {
					window.location = action.replace('contact\/new', 'contact');
				}
			);

			return false;
		});
	} else if (0 < curpage.indexOf('/contact')) {
		init_contacts();
	} else if (0 <= curpage.indexOf('/register')) {
		var form = $('form#register');
		
		// for display, set the browser to focus on the same button
		$('#full', form).click(function() {
			form.attr('action', form.attr('action') + '#full');
		});
		
		$('select', $('#locations')).profile_location_dropdown();
	} else {
		/**
		 * Skills list
		 */
		$('div.skillrow input[type="radio"]').levels();
	}
});

function init_resource_image_upload(link) {
	log('init_resource_image_upload: ' + $(link).attr('href'));
	var rel = $(link).attr('rel');
	new AjaxUpload($(link).attr('id'), {
		action: $(link).attr('href'),
		name: 'resourceimage',
		data: {ajaxupload: true},
		responseType: 'html',
		onComplete: function(file, response){
			log('completed: ' + response);
			$('#' + rel).replaceWith(response);
			
			init_resource_image_upload($('a.image_upload-link'));
		}
	});
}

function init_profile_upload(link, fieldname) {
	if ('undefined' == typeof(fieldname) || !fieldname) {
		fieldname = 'userimage';
	}
	
	var form = link.parent();
	log('form parent: ' + $(form));
	log('posting image info to: ' + $(form).attr('action'))
	
	g_ajaxupload = new AjaxUpload('#image_upload-link', {
		action: $(form).attr('action'),
		name: fieldname,
		data: {ajaxupload: true},
		responseType: 'html',
		onComplete: function(file, response){
			$('#panelleft').html(response);
			
			// if it was an error we need to re-set the ajax link
			var upload_link = $('#image_upload-link');
			if (upload_link.get(0)) {
				g_ajaxupload = null;
				init_profile_upload(upload_link, fieldname);
			}
		}
	});
}

function setCookie(c_name,value,expiredays) {
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+expiredays);
	document.cookie=c_name+ "=" +escape(value)+
		((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}