/*
 *	Class: phone.contacts
 */
phone.contacts = {};

/*
 *	Function: setup
 *	Initiate everything for contacts. Setup vars and start populating.
 */
phone.contacts.setup = function() {
	phone.contacts.$container 			= $('#contacts').show();
	phone.contacts.$list		 				= phone.contacts.$container.find('.scroll ul').empty();
	phone.contacts.$sample 					= $('.vars ul.sample').html();
	phone.contacts.$no_results 			= phone.contacts.$list.find('.no_results').hide();
	phone.contacts.$search_contact 	= phone.contacts.$container.find('.search').keypress(function(){phone.contacts.search($(this).val())});
	phone.contacts.$search_reset		= phone.contacts.$container.find('.search_reset').button(phone.contacts.resetSearch).disable();
	
	var scroller 										= phone.contacts.$container.find('.scroll').jScrollPane(phone.scroller_options);
	phone.contacts.$scroller 				= scroller.data('jsp');

	phone.contacts.api = new API({resource:'users/'+user.current.id+'/contacts'});
	phone.contacts.api.call({success:function(data) {
		phone.contacts.populate(data.contacts);
		phone.history.setup();
	}});	
};



/*
 *	Function: populate
 *	Adds contact(s) and setup events for it
 *	
 *	Parameters:
 *		data - Array of contact-objects, or a single contact-object
 */
phone.contacts.populate = function(data) {

	if($.isArray(data)) {
		//Multiple contacts
		var contacts = data;	
		//Sort by name
		contacts = contacts.sort(function(a, b) {
			if(!a.name) return 1;
			if(a.name.toLowerCase() < b.name.toLowerCase()) { return -1 };
	    if(a.name.toLowerCase() > b.name.toLowerCase()) { return 1 };                
	    return 0;
		});
	} else {
		//Single contact (after create)
		var contacts = new Array(data);
	}

	$.each(contacts, function(index, contactData) {

		//Set data
		if($.isArray(data)) {
			var $contact = $(phone.contacts.$sample).appendTo(phone.contacts.$list);
		} else {
			var $contact = $(phone.contacts.$sample).prependTo(phone.contacts.$list);
		}
		
		$.data($contact, 'contactData', contactData);
						
		//Only allow numbers
		$contact.find('.number input').numeric();

		//Select contact
		$contact.find('.name p, .number p').button(function() { phone.contacts.selectContact($contact) });

		//Edit contact
		$contact.find('.edit').button(function() { 
			phone.contacts.showEditForm($contact);
		});
		$contact.find('.save').button(function() {
			phone.contacts.hideEditForm($contact);	
			phone.contacts.editContact($contact);
		});
		$contact.find('input').unbind('keypress').keypress(function() {
			if (event.keyCode == '13') {
				phone.contacts.editContact($contact);
			}
		});

		phone.contacts.setupContact($contact);
				
		//Hint fields
		$contact.find('input').hint();
	});
	
	phone.contacts.$scroller.reinitialise();
};


/*
 *	Function: setupContact
 *	Set content and prepare to display, used after populate (and soon also editing) a contact.
 *	
 *	Parameters:
 *		$contact - jQuery-object of the contact to setup
 *	
 *	See Also:
 *		<populate>
 */
phone.contacts.setupContact = function($contact) {
	var contactData = $.data($contact, 'contactData');

	//Name
	var name = (contactData.name) ? contactData.name : I18n.misc.unknown;
	$contact.find('.name p').html(name);
	if(contactData.name) $contact.find('.name input').val(name);
	
	//PhoneNumber
	$contact.find('.number p').html('+ ' + $.format.phone(contactData.phoneNumber, true));
	$contact.find('.number input').val($.format.phone(contactData.phoneNumber, false));
	
	//Hide edit
	phone.contacts.hideEditForm($contact);
}

/*
 *	Function: selectContact
 *	Select a contact in the list, used to setup a call
 *	
 *	Parameters:
 *		$contact - jQuery-object of the contact to select
 */
phone.contacts.selectContact = function($contact) {
	if(phone.call.current) return false;
	
	$.each(phone.contacts.$list.find('li').not('.no_results'), function(i,contact) {
		phone.contacts.hideEditForm($(contact));
	});
	
	phone.contacts.hideEditForm($contact);
	
	if($contact.hasClass('selected')) {
		phone.contacts.reset();
	} else {
		phone.contacts.$list.find('li').removeClass('selected');
		$contact.addClass('selected').fadeTo(100,1).find('.edit').fadeOut(100);
		phone.contacts.$list.find('li').not('.no_results').not('.selected').fadeTo(200,.2).find('.edit').fadeIn(300);
	}
				
	//Add to conference
	var contactData = $.data($contact, 'contactData');
	phone.call.setTarget(contactData.phoneNumber);
};



/* 
 *	Function: reset
 *	Bring the list back to its original state. Hide edit-forms, remove hovers, etc
 */
phone.contacts.reset = function() {
	phone.contacts.$list.find('li').not('.no_results').removeClass('selected').animate({'opacity':1},100).find('.edit').animate({'opacity':1},100).show();
};



/* 	
 *	Function: editContact 
 *	Edit a contact in the list.
 */
phone.contacts.editContact = function($contact) {
	var contactData = $.data($contact, 'contactData');
	var data = {};
	
	if($contact.find('.name input').val() != $contact.find('.name input').attr('title')) {
		data.name =	$contact.find('.name input').val();
	}
	if($contact.find('.number input').val() != $contact.find('.number input').attr('title')) {
		var phone_number = $.phone_number($contact.find('.number input').val());
		if(!phone_number.valid) {
			$popup.error('FIELDS_NUMBER_INVALID');
			return false;
		}
		data.phoneNumber = phone_number.number;
	}
	
	phone.contacts.api.call({method:'POST', url_vars:contactData.id+'/edit', data:data, success:function(data){
		$.data($contact, 'contactData', data.contact);
		phone.contacts.setupContact($contact);		
	}});
};

phone.contacts.showEditForm = function($contact) {
	$contact.find('.edit').hide();
	$contact.find('.save').show();
	$contact.find('.delete').show();
	
	$contact.find('.name input, .number input').show();
	$contact.find('.name p, .number p, .number .type').hide();
	
	var contactData = $.data($contact, 'contactData');
};

phone.contacts.hideEditForm = function($contact) {
	$contact.find('.edit').show();
	$contact.find('.save').hide();
	$contact.find('.delete').hide();
	
	$contact.find('.name input, .number input').hide();
	$contact.find('.name p, .number p, .number .type').show();
};


/*
 *	Function: createContact
 *	Create a new contact (from call-history or keypad)
 *
 *	Parameters:
 *		string phoneNumber - Phonenumber for this contact
 *		string name - Name for this contact (optional)
 */
phone.contacts.createContact = function(phoneNumber, name) {
	var data = {};
			data.phoneNumber	= phoneNumber;
	if(name) data.name		= name;
	
	phone.contacts.api.call({method:'POST', url_vars:'new', data:data, success: function(data) {
		phone.contacts.populate(data.contact);
		phone.history.setup();
		phone.showSection('contacts');		
	}});
}



/*
 *	Function: search
 *	Search the list and only show contacts that match.
 *	
 *	Parameters:
 *		value - (string) Value to search 
 */
phone.contacts.search = function(value) {
	if(value) {
		phone.contacts.$list.find('li').css('display','none');
		var results = phone.contacts.$list.find("li:not(.no_results):not(.create_form):containsIgnoreCase('"+value+"')").css('display','block');
		if(results.length==0) {
			phone.contacts.$no_results.css('display','block');		
		}
	} else {
		phone.contacts.$list.find('li').css('display','block');
		phone.contacts.$no_results.css('display','none');
	}
	
	phone.contacts.$search_reset.enable();
	phone.contacts.$section.update();

	if(phone.contacts.$no_results.css('display')=='block') {
		phone.contacts.$container.find('.jScrollPaneDrag').hide();
	}
};



/*
 *	Function: resetSearch
 *	Bring back all contacts
 */
phone.contacts.resetSearch = function() {
	console.log('reset search');

	phone.contacts.$search_contact.val('').hint();
	phone.contacts.$search_reset.disable();

	phone.contacts.$list.find('li:not(.create_form)').css('display','block');
	phone.contacts.$no_results.css('display','none');
	phone.contacts.$container.find('.jScrollPaneDrag').show();	

	phone.contacts.$section.update();
}

phone.contacts.getNameByPhoneNumber = function(number) {
	var name = phone.contacts.$list.find("li:containsIgnoreCase('"+number+"')").first().find('.name p').text();
	if(name) {
		return name;
	} else {
		return false;
	}
};
