// application wide javascript
// UTILITY FUNCTIONS
var debug = 1;

function getIEVersion() {
  var rv = -1; // Return value assumes failure.
  if (navigator.appName == 'Microsoft Internet Explorer') {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

function is_array(input) {
	return typeof(input) == 'object' && (input instanceof Array);
}
function ucfirst(str) {
	return str.substr(0,1).toUpperCase() + str.substr(1,str.length);
}
function basename(str) {
	var strA = str.split('/');
	var l = strA.length - 1;
	return strA[l];
}
function RGBtoHex(R,G,B) {
	return toHex(R)+toHex(G)+toHex(B);
}
function toHex(N) {
	if (N==null) return "00";
	N = parseInt(N, 10); 
	if (N==0 || isNaN(N)) {
		return "00";
	}
	N=Math.max(0,N); 
	N=Math.min(N,255); 
	N=Math.round(N);
	return "0123456789ABCDEF".charAt((N-N%16)/16) + "0123456789ABCDEF".charAt(N%16);
}

function splitCakeName(str) {
	str = str.substr(5); //remove data[
	str = str.replace(/\]/g, '');
	return str.split('[');
}
function cakeNameToId(str) {
	var strA = splitCakeName(str);
	var id = '';
	var l = strA.length;
	for (var i=0; i<l; i++) {
		var item = strA[i];
		id += ucfirst(underscoreToCamelCase(item));
	}
	return id;
}
function splitCamelCase(str) {
	str = str.replace(/([A-Z]|[0-9]+)/g, ",$1");
	if (str.indexOf(',') == 0) {
		str = str.substr(1);
	}
	return str.split(',');
}
function splitAtNumber(str) {
	str = str.replace(/([0-9]+)/g, ",$1,");
	return str.split(',');
}
function replaceNumber(str, nbr) {
	return str.replace(/([0-9]+)/g, nbr);
}
function underscoreToCamelCase(str) {
	var a = str.split('_');
	var r = '';
	var al = a.length;
	for (var i=0; i<al; i++) {
		r += ucfirst(a[i]);
	}
	return r;
}
function logger(obj) {
	if (debug) {
		if(typeof(console) !== 'undefined' && console != null) {
			console.log(obj);
		}
	}
} 
function setMessage(m, alert) {
	if (is_array(m)) {
		var lb = alert ? "\n" : "<br />";
		return m.join(lb);
	}
	return m;
}
function alertMessage(m) {
	m = setMessage(m, true);
	if (m) {
		alert(m);
	}
}
function removeValidationErrors(formId) {
	$('#'+formId).find('.error-message').remove();
	$('#'+formId).find('.error').removeClass('error');
	resizeBox();
}
function setValidationErrors(modelName, errors) {
	for (var prop in errors) {
		var val = errors[prop];
		var field = underscoreToCamelCase(prop);
		$('#'+modelName+field).parent().addClass('error').append('<div class="error-message">'+val+'</div>').end().unbind('click').click(function() {
			logger('clicked');
			$(this).parent().removeClass('error').find('.error').removeClass('error');
			$(this).parent().find('.error-message').remove();
		});
	}
	resizeBox();
}
function stringToJson(response) {
	return JSON.parse(response);
}
function parseDestination(href) {
	var hrefA = href.split('?dest=');
	if (hrefA.length > 1) {
		return hrefA[1];
	}
	return href;
}
function newImageSize(src, suffix) {
	var srcA = src.split('.');
	if (srcA.length == 3) {
		srcA[1] = suffix;
		return srcA.join('.');
	} else if (srcA.length == 2) {
		srcA[1] = suffix+'.'+srcA[1];
		return srcA.join('.');
	}
	return src;
}

function switchMatchButtonClass(status, otherUserId, bootstrap) {
	var button = $('#matchButton'+otherUserId);
	if (button.length) {
		var buttonClass = null;
		switch(status) {
			case bootstrap.MATCHED : 
				buttonClass = 'matched';
				break;
			case bootstrap.MATCH_PENDING : 
				buttonClass = 'pending';
				break;
			default : 
				buttonClass = 'match';
		}
		$(button).removeClass('matched pending match').addClass(buttonClass);
	}
}


//GENERAL CALLBACKS
function ajaxCallback(obj, clicked) {
	
	alertMessage(obj.message);
	
	if (obj.values.callback) {
		if (obj.values.arguments) {
			var args = obj.values.arguments;
			var al = args.length;
			var arguments = "";
			for (var i=0; i<al; i++) {
				var a = args[i];
				if (typeof(a) == 'string') {
					arguments += '\''+a+'\'';
				} else {
					arguments += a;
				}
				if (i < (al - 1)) {
					arguments += ', ';
				}
			}
		} else {
			arguments = '';
		}
		
		//if the function exists...
		var functionName = obj.values.callback;
		
		if (eval("typeof("+functionName+") == 'function'")) {
			logger('Calling '+obj.values.callback+"("+arguments+")");
			eval(obj.values.callback+"("+arguments+")");
		} else {
			logger('ERROR: trying to call undefined function - '+obj.values.callback);
		}
	}
	clicked.css('opacity', 1).removeClass('inactive');
	
	if (!obj.values.noreset) {
		resetClicks();
		resetEditables();
	}
	
	logger(obj);
}
function resizeBox() {
//	$.fn.colorbox.resize(); //-- breaks the file uploader (for some reason)
	var h = 0;
	$('#popup').children().each(function() {
		h += $(this).outerHeight(true);
	});
	$('#colorbox, #cboxWrapper, #cboxMiddleLeft, #cboxContent, #cboxLoadedContent, #cboxLoadingOverlay, #cboxLoadingGraphic').height(h+'px');
}
function colorboxComplete(link) {
	//initiate any colorbox stuff
	$('#close').click(function() {
		$.fn.colorbox.close();
		return false;
	});
    resizeBox();
    resetClicks();
    resetEditables();
}
//UPLOADIFY STUFF
function uploadifyUploaded() {
	resizeBox();
	resetClicks();
	resetEditables();
}
function uploadifySelected() {
	resizeBox();
	return true;
}
function uploadifyCancel() {
	logger('uploadify cancelled');
	resizeBox();
}
function uploadifyError(event, queue, fileObj, errorObj) {
	logger(event);
	logger(queue);
	logger(fileObj);
	logger(errorObj);
}
function uploadifyAddPhotos(e, q, fileObj, response, data) {
	logger(response);
	logger(data);
	logger('Uploadify upload complete');
	var obj = stringToJson(response);
	logger(obj);
	if (obj.success) {
		$('#uploadifyList').append('<li id="pending'+obj.values.id+'"><a href="/uploads/delete/'+obj.values.id+'" class="delete">Delete'+obj.values.name+'</a><p id="pendingName'+obj.values.id+'">'+obj.values.name+'</p><a href="/uploads/editName/'+obj.values.id+'" class="edit editable-button" id="pendingName'+obj.values.id+'_b">Edit name</a></li>');
		//reset stuff
		uploadifyUploaded();
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifySaveProfilePic(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		changeProfilePic(obj.values.arguments[0], obj.values.arguments[1], obj.values.arguments[2]);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifySaveMainPic(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {		
		changeMainPic(obj.values.newSrc);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyChangeLookbookPic(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		changeLookbookPic(obj.values.id, obj.values.newSrc);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyChangePressPic(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		changePressPic(obj.values.id, obj.values.newSrc);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyAddToBoutiqueLocation(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		addPhotoToBoutiqueLocation(obj.values.id, obj.values.src);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyAddToStyle(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		addPhotoToStyle(obj.values.id, obj.values.src);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyAddToEditorial(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		addPhotoToEditorial(obj.values.id, obj.values.src);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyAddVideo(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		addVideoToEditorial(obj.values.id, obj.values.name);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyAddImageToColor(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	logger(obj);
	if (obj.success) {
		addImageToColor(obj.values.id, obj.values.src, obj.values.extraId);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyAddSwatchToColor(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	logger(obj);
	if (obj.success) {
		addSwatchToColor(obj.values.id, obj.values.src, obj.values.extraId);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}

function pdfSuccess(obj, appendTo, hiddenField, editName) {
	//changes hidden field and adds 'remove' link after a pdf is uploaded
	
	logger('success');
	logger(obj);
	
	var editLink = editName ? '<a href="/uploads/editName/'+obj.values.id+'" class="edit editable-button" id="pendingName'+obj.values.id+'_b">Edit name</a>' : '';
	
	//delete any other pendingPDFs
	$('.pending-pdf').remove();
	
	$(appendTo).append('<li id="pending'+obj.values.id+'" class="pending-pdf"><a href="/uploads/delete/'+obj.values.id+'" class="delete">Delete'+obj.values.name+'</a><p id="pendingName'+obj.values.id+'">'+obj.values.name+'</p>'+editLink+'</li>');
	
	$(hiddenField).val(obj.values.id);
	
	//reset stuff
	uploadifyUploaded();
}

function uploadifyAddPurchaseOrderPDF(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		
		pdfSuccess(obj, '#poPDF', '#PurchaseOrderUploadPdfId', false);
		
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyAddLookbookPDF(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		
		pdfSuccess(obj, '#lookbookPDF', '#LookbookUploadPdfId', true);
		
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyAddPressPDF(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		pdfSuccess(obj, '#pressPDF', '#PressUploadPdfId', true);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}

function uploadifyAddMessagePDF(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		pdfSuccess(obj, '#messagePDF', '#UploadId', false);
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}

function uploadifyAddLookbookPhoto(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		$('#lookbookImage').append('<li id="pending'+obj.values.id+'"><a href="/uploads/delete/'+obj.values.id+'" class="delete">Delete'+obj.values.name+'</a><p id="pendingName'+obj.values.id+'">'+obj.values.name+'</p><a href="/uploads/editName/'+obj.values.id+'" class="edit editable-button" id="pendingName'+obj.values.id+'_b">Edit name</a></li>');
		$('#LookbookThumbnailId').val(obj.values.id);
		//reset stuff
		uploadifyUploaded();
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}
function uploadifyAddPressPhoto(e, q, fileObj, response, data) {
	var obj = stringToJson(response);
	if (obj.success) {
		$('#pressImage').append('<li id="pending'+obj.values.id+'"><a href="/uploads/delete/'+obj.values.id+'" class="delete">Delete'+obj.values.name+'</a><p id="pendingName'+obj.values.id+'">'+obj.values.name+'</p><a href="/uploads/editName/'+obj.values.id+'" class="edit editable-button" id="pendingName'+obj.values.id+'_b">Edit name</a></li>');
		$('#PressThumbnailId').val(obj.values.id);
		//reset stuff
		uploadifyUploaded();
	} else {
		logger(obj);
		alertMessage(obj.message);
	}
}

function changeProfilePic(newSrc, w, h) {
	logger('changeProfilePic - '+newSrc+' - '+w+' - '+h);	
	$('#profilePic').attr('src', newSrc).attr('width', w).attr('height', h);
	$.fn.colorbox.close();
}
function changeMainPic(newSrc) {
	$('#mainPic').attr('src', newSrc);
	$.fn.colorbox.close();
}

function test(){
	alert('works');
	
};

//RESETS
var acOptions = {
	autoFill: true
};
function resetAC() {
	$('.ac-materials').unbind().autocomplete('/materials/autoComplete', acOptions);
	
	$('.ac-styles').unbind().autocomplete('/styles/autoComplete', acOptions).result(
		function(e, data, formatted) {
			//we get an array with the name and id
			var id = parseInt(data[1], 10);
			$('#mustHaves .empty').hide();
			if ($('#style_'+id).length) {
				$('#style_'+id).effect('highlight');
			} else {
				var i = $('#mustHaves li:not(.empty)').length;
				$('#mustHaves').append('<li id="style_'+id+'"><input type="hidden" name="data[Style]['+i+'][id]" value="'+id+'" /><input type="hidden" name="data[Style]['+i+'][name]" value="'+formatted+'" /><input type="hidden" name="data[Style]['+i+'][must_have]" value="1" /><a href="/designers/styles">'+formatted+'</a> <a href="#" class="remove" id="removeStyle_'+id+'">Remove</a></li>');
				$('#removeStyle_'+id).click(function() {
					removeFromMustHaves($(this));
					return false;
				});
			}
			$(this).val('');
		}
	);
	
	$('.ac-designers').unbind().autocomplete('/ac_designers/autoComplete', acOptions).result(
		function(e, data, formatted) {
			var id = parseInt(data[1], 10);
			$('#designersCarried .empty').hide();
			if ($('#designer_'+id).length) {
				$('#designer_'+id).effect('highlight');
			} else {
				var i = $('#designersCarried li:not(.empty)').length;
				$('#designersCarried').append('<li id="designer_'+id+'"><input type="hidden" name="data[AcDesigner]['+i+'][id]" value="'+id+'" /><input type="hidden" name="data[AcDesigner]['+i+'][name]" value="'+formatted+'" />'+formatted+' <a href="#" class="remove nobkgd" id="removeDesigner_'+id+'">x</a></li>');
				$('#removeDesigner_'+id).click(function() {
					removeFromDesigners($(this));
					return false;
				});
			}
			$(this).val('');
		}
	);
	
	//for the designer registration form -- simple autofill
	$('.ac-designer').unbind().autocomplete('/ac_designers/autoComplete', acOptions);
	
	$('.ac-boutiques').unbind().autocomplete('/boutiques/autoComplete', acOptions).result(
		function(e, data, formatted) {
			logger(typeof(data[1]));
			var obj = stringToJson(data[1]);
			if (obj.length) {
				var ol = obj.length;
				var r = '';
				for (var i=0; i<ol; i++) {
					o = obj[i];
					var c = i == ol - 1 ? ' class="last"' : '';
					//write html in here.
					r += '<li'+c+'><p>'+o.store_name+'<br /><span class="tiny">'+o.city+', '+o.state+'<br />'+o.country+'</span></p><input type="checkbox" name="data[BoutiqueLocation][BoutiqueLocation][]" value="'+o.id+'" id="BoutiqueLocation_'+o.id+'" /></li>';
				}
				$('#designerLocations').prepend(r); //html(r);
				$('#addAllLocations').fadeIn().unbind().click(function() {
					$('#designerLocations').find('input').attr('checked', true);
					return false;
				});
			}
			$(this).val('');
		}
	);
	
	$('.ac-boutique').unbind().autocomplete('/boutiques/autoComplete', acOptions);
	
	$('.ac-boutiqueProfile').unbind().autocomplete('/boutiques/autoCompleteName', acOptions);
	
	var noCacheAcOptions = acOptions;
	noCacheAcOptions.cacheLength = 1;
	$('.ac-city').unbind().autocomplete('/ac_cities/autoComplete', noCacheAcOptions);
	
	$('.ac-state').unbind().autocomplete('/ac_states/autoComplete', acOptions);
	
	var nhOptions = noCacheAcOptions;
	nhOptions.extraParams = {
		city: function() {
			return $('.ac-city').val();
		}
	};
	$('.ac-neighborhood').unbind().autocomplete('/ac_neighborhoods/autoComplete', nhOptions);
	
}

function resetName(name, i) {
	nameA = name.split('[');
	if (nameA.length >= 2) {
		nameA[2] = i+']';
 		return nameA.join('[');
	}
	logger('cant reset name');
	return name;
}

function removeFromMustHaves(clicked) {
	var ul = clicked.parent().parent();
	clicked.parent().remove();
	if (ul.children().length == 1) {
		ul.find('.empty').show();
	} else {
		//go through and reset the names
		var i = 0;
		ul.children().each(function() {
			found = false;
			$(this).find('input').each(function() {
				var found = true;
				newName = resetName($(this).attr('name'), i);
				$(this).attr('name', newName);
			});
			if (found) {
				i++;
			}
		});
	}
}
function removeFromDesigners(clicked) {
	var ul = clicked.parent().parent();
	clicked.parent().remove();
	if (ul.children().length == 1) {
		ul.find('.empty').show();
	} else {
		//go through and reset the names
		var i = 0;
		ul.children().each(function() {
			found = false;
			$(this).find('input').each(function() {
				var found = true;
				newName = resetName($(this).attr('name'), i);
				$(this).attr('name', newName);
			});
			if (found) {
				i++;
			}
		});
	}
}
function resetDatepickers(el) {
	if (el) {
		//first remove the 'hasDatepicker' class then make it a datepicker...
		$(el).find('.datepicker').removeClass('hasDatepicker').datepicker();
	} else {
		//do everything
		$('.datepicker').datepicker('destroy').datepicker();
	}
}
function resetTooltips(el) {
	var tooltips = null;
	if (el) {
		tooltips = $(el).find('.tooltip');
	} else {
		tooltips = $('.tooltip');
	}
	$(tooltips).each(function() {
		var title = $(this).attr('title');
		if (title) {
			$(this).attr('alt', title);
			$(this).removeAttr('title');
		}
	}).unbind('mouseenter mouseleave').hover(
		function() {
			//remove any others
			$('#tooltip').remove();
			$(this).css('position', 'relative');
			
			var title = $(this).attr('alt');
			
			$('#main').append('<div id="tooltip"><p>'+title+'</p></div>');
			
			$('#tooltip').css('opacity', 0);
			//center the p
			top = ($('#tooltip').height() - $('#tooltip p').height()) / 2 - 7;
			$('#tooltip p').css('top', top+'px');
			//position the tooltip
			
			var top = $(this).offset().top - $('#tooltip').height() + 5;
			var left = $(this).offset().left - (($('#tooltip').width() - $(this).width()) / 2) + 2;
			$('#tooltip').css('opacity', 1).hide().css({
				top: top+'px',
				left: left+'px'
			}).fadeIn('fast');
		},
		function() {
			$('#tooltip').remove();
		}
	).click(function() {
		$('#tooltip').remove();		
	});
}
function setTooltip(el, message) {
	$(el).unbind('mouseenter mouseleave').hover(
		function() {
			//remove any others
			$('#tooltip').remove();
			$(this).css('position', 'relative');
			
			$('#main').append('<div id="tooltip"><p>'+message+'</p></div>');
			
			$('#tooltip').css('opacity', 0);
			//center the p
			top = ($('#tooltip').height() - $('#tooltip p').height()) / 2 - 7;
			$('#tooltip p').css('top', top+'px');
			//position the tooltip
			
			var top = $(this).offset().top - $('#tooltip').height() + 5;
			var left = $(this).offset().left - (($('#tooltip').width() - $(this).width()) / 2) + 2;
			$('#tooltip').css('opacity', 1).hide().css({
				top: top+'px',
				left: left+'px'
			}).fadeIn('fast');
		},
		function() {
			$('#tooltip').remove();
		}
	).click(function() {
		$('#tooltip').remove();		
	});
}
function removeTooltip(el) {
	$(el).unbind('mouseenter mouseleave');
}
function resetClicks(classes) {
	var selector = '';
	if (classes) {
		if (is_array(classes)) {
			selector = 'a.'+classes.join(', a.');
		} else {
			//string
			selector = classes;
		}
	} else {
		//default
		selector = 'a.edit:not(.popup, .noreset), a.delete:not(.noreset), a.ajaxP:not(.noreset), a.ajaxG:not(.noreset)';
	}
	selector += ', a.inactive';
	
	logger('resetting clicks - '+selector);
	
	$(selector).unbind('click').click(function() {	
		var clicked = $(this);
		var href = clicked.attr('href');
		if (clicked.hasClass('inactive') || (clicked.hasClass('delete') && !confirm('Are you sure? This cannot be undone.'))) {
			return false;
		}
		clicked.css('opacity', 0.5).addClass('inactive').unbind('click').click(function() {
			return false;
		});
		//post or get?
		//both expect json response
		if (clicked.hasClass('delete') || clicked.hasClass('ajaxP')) {
			$.post(href, null, function(r) {
				ajaxCallback(r, clicked);
			}, 'json');
		} else if (clicked.hasClass('edit') || clicked.hasClass('ajaxG')) {
			$.get(href, null, function(r) {
				ajaxCallback(r, clicked);
			}, 'json');
		}
		return false;
	});
}
function resetEditables() {
	logger('Resetting editables');
	$('.editable-button').each(function() {
		var thisIdA = $(this).attr('id').split('_');
		var otherId = thisIdA[0];
		$(this).editable({
			editable: '#'+otherId,
			inputClass: 'inputField',
			inputStyle: 'padding:2px 4px; margin-bottom:0;',
			inputMaxLength: 40
		});
	});
	
	$('table.list a.editable').css('opacity', 0);
	$('table.list tr td:nth-child(2)').unbind().hover(
		function() {
			if (!$(this).find('input').length) {
				$(this).find('a.editable').css('opacity', 1).hide().fadeIn();//css('opacity', 1);
			}
		},
		function() {
			$(this).find('a.editable').stop().css('opacity', 0);
		}
	);
}

//SPECIFIC CALLBACKS
//FUNCTIONS FOR DEALING WITH THE POPUP PHOTO UPLOADER
function resetPending() {
	$.get('/uploads/getPendingList', null, function(r) {
		$('#uploadifyList').html(r);
		resizeBox();
		resetClicks();
		resetEditables();
	});
}
function deleteFromPending(id) {
	$('#pending'+id).remove();
	resizeBox();
}

//OTHER CALLBACKS
function reloadPage() {
	window.location.reload();
}

var popupOptions = {
	speed:200,
	opacity:0.2,
	overlayClose:false,
	scrolling:false,
	close:false,
	maxWidth:'820px',
	onComplete: colorboxComplete
};

var popupHeader = '<div id="popupHeader"><a href="#" id="close">CLOSE</a><div class="clear">&nbsp;</div><hr /></div> <!-- /popupHeader -->';

$(document).ready(function() {
	var pages = "<li>+</li>"+$('#pageLinks').html();
	$('#pageLinks').html('<li>+</li>');
	$('#pageLinks').hover(
		function() {
			$(this).html(pages);
		},
		function() {
			$(this).html('<li>+</li>');
		}
	);
	//set up the toggleables
	$('.toggle').removeClass('toggle').removeClass('open').addClass('closed');
	$('li.closed a, li.open a').click(function() {
		var p = $(this).parent();
		if ($(p).hasClass('closed')) {
			$(p).removeClass('closed').addClass('open');
			//close others
			$(p).siblings().each(function() {
				if ($(this).hasClass('open')) {
					$(this).removeClass('open').addClass('closed');
				}
			});			
		} else {
			$(p).removeClass('open').addClass('closed');
		}
		return false;
	});
	$('li ul li a').unbind('click');
	//hide specific 'submit' buttons
//	$('.submit').hide();
	//set up the popups
	$('a.popup').colorbox(popupOptions);
	//
	$('#dismiss').click(function() {
		var href = $(this).attr('href');
		var clicked = $(this);
		$.get(href, function(r) {
			if (!r) {
				clicked.parent().parent().fadeOut('fast', function() {
					clicked.remove();
				});
			} else {
				alert(r);
			}
		});
		return false;
	});
		
	//set up the privacy popup
	$('#footer #privacy, #footer #termsOfService, a.popup-window').click(function() {
		var href = $(this).attr('href');
		window.open(href, null, 'scrollbars=yes,width=770,status=yes,toolbar=no,menubar=no,location=no');
		return false;
	});

	//DEBUGGING
	$('.cake-sql-log').css('opacity', 0.1).hover(
		function() {
			$(this).css('opacity', 1);
		},
		function() {
			$(this).css('opacity', 0.1);
		}
	);
	
	resetTooltips();
	resetAC();
	resetDatepickers();
	resetClicks();
	resetEditables();
	
	//fade out the flash message after 10 seconds
	$('#flashMessage:not(.nogo)').delay(2500).fadeOut();
	
	//prevent form submission on 'enter' key clicked
	var inTextArea = null;
	$("form.noreturn").bind("keypress", function(e) {
		if (!inTextArea && e.keyCode == 13) {
			return false;
		}
    });
	$('textarea').focus(function() {
		inTextArea = true;
	}).blur(function() {
		inTextArea = false;
	});
	
	$('#print').click(function() {
		window.print();
		return false;
	});
	
	$('#login select').change(function() {
		window.location = '/users/logIntoAccount/'+$(this).val();
	});
	$('#loginGo').click(function() {
		window.location = '/users/logIntoAccount/'+$('#login select').val();
		return false;
	});
	
	
	
	
	// announcements control
	var a_start = 0;
	var a_limit = 3;
	var a_total = 0;
	try {
		a_total = $('#announcementsControl').attr('class').split('_')[1];
	} catch(e) {
		// do nothing
	}
	
	function printAnnouncements(v) {
		
		var a = v.announcements;
		var l = v.limit;
		var s = v.start;
		
 		a_total= v.total;
		
		var html = '';
		if (a.length) {
			var len = a.length;
			for (var i=0; i<len; i++) {
				var ann = a[i];
				var c = i % 2 ? 'odd' : 'even';
				html += '<li class="'+c+'" id="announcement_'+ann.id+'">'+ann.dateCreated+'<br />'+ann.message+'</li>';
			}
		} else {
			html += '<li class="odd nonefound">No announcements were found.</li>';
		}
		$('#announcements').html(html).css('opacity', 1);
		prepareAnnouncements();
		
	}
	
	function resetAnnouncementButtons() {
		if (a_start == 0) {
			$('#aNewer').addClass('inactive');
		} else {
			$('#aNewer').removeClass('inactive');
		}
		
		if (a_total <= (a_limit * (a_start + 1))) {
			$('#aOlder').addClass('inactive');
		} else {
			$('#aOlder').removeClass('inactive');
		}
	}
	
	function prepareAnnouncements() {
		if (!($('#announcements').hasClass('owned'))) {
			return false;
		}
		$('#announcements li:not(.nonefound)').each(function() {
			$(this).css('position', 'relative').append('<a href="" class="delete-announcement">delete</a>');
		});
		$('.delete-announcement')
			.css('opacity', 0.1)
			.hover(
				function() {
					$(this).css('opacity', 1);
				},
				function() {
					$(this).css('opacity', 0.1);
				}
			)
			.click(function() {
				var id = $(this).parent().attr('id').split('_')[1];
				$('#announcements').css('opacity', 0.5);
				$.post('/alerts/delete', { id: id, start: a_start, limit: a_limit }, function(r) {
					// should return html
					var obj = stringToJson(r);
					if (obj.success) {
						var v = obj.values;
						printAnnouncements(v);
					} else {
						alertMessage(obj.message);
					}
				});
				return false;
			});
		
		resetAnnouncementButtons();
		
		$('#aOlder').unbind().click(function() {
			if ($(this).hasClass('inactive')) {
				return false;
			}
			// get the stuff
			var start = a_start + 1 <= Math.floor(a_total / a_limit) ? a_start + 1 : Math.floor(a_total / a_limit);
			$('#announcements').css('opacity', 0.5);
			$.getJSON('/alerts/getList', { start: start, limit: a_limit }, function(obj) {
				if (obj.success) {
					var v = obj.values;
					printAnnouncements(v);
					a_start ++;
				} else {
					alertMessage(obj.message);
				}
				$('#announcements').css('opacity', 1);
				resetAnnouncementButtons();
			});
			return false;
		});
		
		$('#aNewer').unbind().click(function() {
			if ($(this).hasClass('inactive')) {
				return false;
			}
			// get the stuff
			var start = a_start - 1 >= 0 ? a_start - 1 : 0;
			$('#announcements').css('opacity', 0.5);
			$.getJSON('/alerts/getList', { start: start, limit: a_limit }, function(obj) {
				if (obj.success) {
					var v = obj.values;
					printAnnouncements(v);
					a_start --;
				} else {
					alertMessage(obj.message);
				}
				$('#announcements').css('opacity', 1);
				resetAnnouncementButtons();
			});
			return false;
		});
		
	}
	prepareAnnouncements();
	
});

