/* Page Variables */

var sApiUrl = "http://www.calico.com.au/api/";
var sSecureApiUrl = "https://www.calico.com.au/api/";

var rRequestLogin = new Request.JSON({
    url: 		sApiUrl + 'users/login/',
    method: 	'post',
    onSuccess: 	function(responseText){
					if (responseText.data['redirect_url'])
					{
						window.top.location.href = responseText.data['redirect_url'];
					}
					else if (responseText.data['rollout_url'])
					{
						if(Browser.name == 'ie' && Browser.version <= 8)
							parent.openLightBox(responseText.data['rollout_url'],298);
						else
							parent.openLightBox(responseText.data['rollout_url'],300);
					}
				}
});
var rLogout = new Request.JSON({
    url: 		sApiUrl + 'users/logout/',
	method:		'post',
    onSuccess: 	function(responseText){
					if (responseText.data['redirect_url'])
					{
						window.location.href = responseText.data['redirect_url'];
					}
				}
});

/* Page Constructor */

window.addEvent('domready', function() {
    /*	Top bar login events. */

	if ($('top-bar-sign-in-button') && $('top-bar-username') && $('top-bar-password')) {
		$('top-bar-sign-in-button').addEvent('click', function(event) {
			submitLoginDetails($('top-bar-username').value, $('top-bar-password').value);
			return false;
		});

		$('top-bar-username').addEvent('keydown', function(event) {
			if (event.key == 'enter') {
				submitLoginDetails($('top-bar-username').value, $('top-bar-password').value);
			}
		});

		$('top-bar-password').addEvent('keydown', function(event) {
			if (event.key == 'enter') {
				submitLoginDetails($('top-bar-username').value, $('top-bar-password').value);
			}
		});
	}

	rememberDefaults();

	$$('.validation').each( function(validation_span) {
		validation_span.addEvent('click', function(event) {
			var theID = this.id;
			$(theID.replace('_valid', '')).focus();
		});
	});

	if ($('search')) {
		$('search-button').addEvent('click', function(event) {
			if ($('query').hasClass('default'))
			{
				return false;
			}
		});
	}
        
        $$('.notification-hide-button').each( function(el) {
            $(el).addEvent('click', function(event) {
                $notification_id = $(this).get('rel');
                new CalicoAPICall({
                    url:	sApiUrl + 'notification/hide/',
                    method:	'post',
                    query:	{ notification_id: $notification_id },
                    successMethod: function(result) {
                        if ($('notification-'+$notification_id)) {
                            $('notification-'+$notification_id).fade('toggle').dispose();
                        }
                    }
                });   
                return false;
            });
	});

	replaceSelectForList()

	// init tooltips
	var tooltips = new Tips('.tooltip');

	// -- fix ie7 z-index bug -- //
	//if(Browser.Engine.trident){
	//	if (window.ie7 || window.ie6){
	//		var zIndexNumber = 1000;
	//		$$('div').each(function(el,i){
	//			el.setStyle('z-index',zIndexNumber);
	//			zIndexNumber -= 10;
	//		});
	//	}
	//};
});


/* Page Methods */

function replaceSelectForList() {
	if ( $$('select') )
	{
		$$('select').each( function(sel) {
		  
      if (sel.hasClass('multiselect')) return;
      
			// remove any currently created ones and reset
			sel.getSiblings('.select-replacer').dispose();
			sel.removeClass('hidden');

			// create visible text
			var visibleText = new Element('input', {
			    type: "text",
			    id : sel.id,
			    'class': sel.get('class') + ' select-text'
			});
			var selWidth = parseInt(sel.getStyle('width').replace("px", ""));
			/*if (!sel.hasClass('full-width'))
			{
				var selPaddL = parseInt(sel.getStyle('padding-left').replace("px", ""));
				var selPaddR = parseInt(sel.getStyle('padding-right').replace("px", ""));
				visibleText.setStyle('width', (selWidth - selPaddL - selPaddR) + 'px')
			}*/

			// make original hidden
			sel.addClass('hidden');

			// create ul
			var baseUL = new Element('ul', {
			    id : sel.id + '_list',
			    'class': 'hidden select-list',
			    style: "min-width: " + (selWidth) + "px"
			});

			// create each li
			var hasSelection = false;
			sel.getElements('option').each( function(opt) {

				var oLi = new Element('li', {
				    id : baseUL.id + opt.get('value'),
				    html: opt.get('html'),
				    rel: opt.get('value'),
				    'class': (opt.get('value') === sel.get('value') && !hasSelection ? 'chosen' : '')
				});

				oLi.addEvent('mousedown', function(e) {
					sel.set('value', this.get('rel'));
					sel.fireEvent('change');
					visibleText.set('value', this.get('html'));
					baseUL.getChildren().removeClass('chosen');
					this.addClass('chosen');
					hideDropDown();
				});
				oLi.inject(baseUL);


				if (oLi.hasClass('chosen')) hasSelection=true;
			});

			/* define listeners */
			var hideDropDown = function(e) {
				baseUL.addClass('hidden');
				visibleText.removeEvent('mousedown', hideDropDown);
				$(document.body).removeEvent('mousedown',customBlur);
				visibleText.addEvent('mousedown', showDropDown);
			}
			var showDropDown = function(e) {
				baseUL.removeClass('hidden');
				visibleText.removeEvent('mousedown', showDropDown);
				visibleText.addEvent('mousedown', hideDropDown);
				$(document.body).addEvent('mousedown',customBlur);
			}
			var customBlur = function(e) {
				if( visibleText && e.target && e.target != visibleText && e.target != baseUL ) hideDropDown();
			}

			/* add the elements */
			var container = new Element('div', {'class': 'select-replacer'});
			container.inject(sel.getParent());
			visibleText.inject(container);
			baseUL.inject(container);

			try
			  {
				  visibleText.set('value', baseUL.getElements('[rel='+sel.get('value')+']')[0].get('html') );
			  }
			catch(err)
			 {
				alert(err + '\n\nObject: ' + sel.id);
			 }

			visibleText.addEvent('mousedown', showDropDown);


		});


		/*$$('select').dispose();*/
	}
}

function rememberDefaults() {

	$$('input.default').each( function(input) {
		var defaultText = input.value;
		input.addEvent('focus', function(event) {
			if(this.value==defaultText) {
				this.value = '';
				this.removeClass('default')
			}
		});
		input.addEvent('blur', function(event) {
			if(this.value=='') {
				this.value = defaultText;
				this.addClass('default')
			}
		});
	});

	$$('textarea.default').each( function(input) {
		var defaultText = input.value;
		input.addEvent('focus', function(event) {
			if(this.value==defaultText) {
				this.value = '';
				this.removeClass('default')
			}
		});
		input.addEvent('blur', function(event) {
			if(this.value=='') {
				this.value = defaultText;
				this.addClass('default')
			}
		});
	});
}

function submitLoginDetails(username, password)
{
	rRequestLogin.post('password='+Sha1.hash(password)+'&username='+username+'&auth_key=e3d68863bb260879e9d808f0cd779be04b646fcaa48c994c945511a6c3');
}

function logOut()
{
	rLogout.post('auth_id=41a50630b9dd15ada0e1d380e8d3c084');
}

function addHiddenText(element, text)
{
	element.set('html', element.get('html') + '<span class="hidden">' + text + '</span>');
}

function openLightBox(url, height) {

	if (!height) {
		height=600;
	}

	if (Mediabox) {
		Mediabox.open(url, '', '650 ' + height);
		$$('iframe').set('allowtransparency', 'true');
	}

	return false;
}

function clearAllValidation()
{
	$$('.validation').set('html', '');
	$$('.error').removeClass('error');
	$$('#submit_valid').set('html', '');
	$$('#submit_valid').set('style', '');
	$$('.success').removeClass('success');
	$$('.fail').removeClass('fail');
	$$('.progress').removeClass('progress');
}

function removeValidationErrors(event) {
	$(event.target.id + '_valid').set('html', '');
	$(event.target.id).removeClass('error');
}

function updateAndHighlight(sElementID, sNewString)
{
	var sOriginalString = $(sElementID).get('html');
	if (sOriginalString != sNewString)
	{
		$(sElementID).set('html',sNewString);
		$(sElementID).setStyle('color', '#f00');
		(function(){
			$(sElementID).tween('color', '#444')}
		).delay(1500);
	}
}


/*
-- CalicoAPICall USAGE --
new CalicoAPICall({
	url:			'',
	method:			'get',
	query:			'auth_id =41a50630b9dd15ada0e1d380e8d3c084',
	listenForValidation: 	false,
	loadingMessage:		'Saving, please wait...',
	loadingMethod:		null,
	successMessage:		'Saving complete',
	successMethod:		null,
	validationMessage:	'Saving failed, please check the fields above.',
	apiErrorMessage:	'Unexpected error, please try again later.',
	apiErrorMethod:		null,
	ajaxErrorMessage:	'Unexpected error, please try again later.',
	ajaxErrorMethod:        null
});
*/
function CalicoAPICall(options)
{
	// Load defaults or options

	this.url = options.url ? options.url 									: '';
	this.method = options.method ? options.method 								: 'get';
	this.query = options.query ? options.query 								: 'auth_id =41a50630b9dd15ada0e1d380e8d3c084';
	this.listenForValidation = options.listenForValidation ? options.listenForValidation 	: false;
	this.loadingMessage = options.loadingMessage ? options.loadingMessage 				: 'Saving, please wait...';
	this.loadingMethod = options.loadingMethod ? options.loadingMethod 				: null;
	this.successMessage = options.successMessage ? options.successMessage 				: 'Saving complete';
	this.successMethod = options.successMethod ? options.successMethod 				: null;
	this.validationMessage = options.validationMessage ? options.validationMessage		: 'Saving failed, please check the fields above.';
	this.apiErrorMessage = options.apiErrorMessage ? options.apiErrorMessage 			: 'Unexpected error, please try again later.';
	this.apiErrorMethod = options.apiErrorMethod ? options.apiErrorMethod 				: null;
	this.ajaxErrorMessage = options.ajaxErrorMessage ? options.ajaxErrorMessage 			: 'Unexpected error, please try again later.';
	this.ajaxErrorMethod = options.ajaxErrorMethod ? options.ajaxErrorMethod 			: null;
	this.formID = options.formID ? options.formID 								: null;

	var _this = this;
	var submitValidString = this.formID ? '#'+this.formID+' #submit_valid' : '#submit_valid'


	// Construct json request
	var oRequestObject = new Request.JSON({
		url: 		_this.url,
		onRequest: 	function() {
						if (_this.listenForValidation)
						{
							clearAllValidation()
							$$(submitValidString).set('html', _this.loadingMessage);
							$$(submitValidString).addClass('progress');
						}
						if (_this.loadingMethod) _this.loadingMethod();
					},
		onSuccess: 	function(oJSONResponse, sJSONResponse)
					{
						if (oJSONResponse.result.code != -1)
						{
							if (_this.listenForValidation)
							{
								clearAllValidation();
								$$(submitValidString).set('html', _this.successMessage);
								$$(submitValidString).addClass('success');
								(function(){$$(submitValidString).fade('out')}).delay(2500);
							}
							if (_this.successMethod) _this.successMethod(oJSONResponse, sJSONResponse);
						}
						else
						{
							if (_this.listenForValidation)
							{
								clearAllValidation();
								$$(submitValidString).set('html', _this.apiErrorMessage);
								$$(submitValidString).addClass('fail');

								if (oJSONResponse.data)
								{

									if	(oJSONResponse.data['Handled_errors'] && oJSONResponse.data['Handled_errors'][0] != null) 	{$$(submitValidString).set('html', oJSONResponse.data['Handled_errors'])}
									else if	(oJSONResponse.data['SQL_errors'] && oJSONResponse.data['SQL_errors'][0] != null)		{addHiddenText($$(submitValidString), oJSONResponse.data['SQL_errors'])}
									else 	{$$(submitValidString).set('html', _this.validationMessage);}

									try {
										for(var key in oJSONResponse.data) {
											var value = oJSONResponse.data[key];
											if ( $(key + '_valid') )
											{
												$(key + '_valid').set('html', value);
												$$('input#'+key).addClass('error');

												$$('input#'+key).addEvent('focus', function(event){
													var theID = this.id;
													$(theID + '_valid').set('html', '');
													$(this).removeClass('error');
												});
                                                                                                
                                                                                                $(key + '_valid').addEvent('click', function(event){
													$(this).set('html', '');
                                                                                                        $$('input#'+key).removeClass('error');
												});
											}
										}
									} catch(err) {}

								}
							}
							if (_this.apiErrorMethod) _this.apiErrorMethod(oJSONResponse, sJSONResponse);
						}
					},
		onFailure: 	function() {
						if (_this.listenForValidation)
						{
							clearAllValidation();
							$$(submitValidString).set('html', _this.ajaxErrorMessage);
							$$(submitValidString).addClass('fail');
						}
						if (_this.ajaxErrorMethod) _this.ajaxErrorMethod();
					}
	});

	// Send the request
	if (this.method == 'get')
	{
		oRequestObject.get(this.query);
	}
	else if (this.method == 'post')
	{
		oRequestObject.post(this.query);
	}
	else
	{
		oRequestObject.send(this.query);
	}

}

function getTimeDiff(earlierDate,laterDate)
{
       var nTotalDiff = laterDate.getTime() - earlierDate.getTime();
       var oDiff = new Object();

       oDiff.days = Math.floor(nTotalDiff/1000/60/60/24);
       nTotalDiff -= oDiff.days*1000*60*60*24;

       oDiff.hours = Math.floor(nTotalDiff/1000/60/60);
       nTotalDiff -= oDiff.hours*1000*60*60;

       oDiff.minutes = Math.floor(nTotalDiff/1000/60);
       nTotalDiff -= oDiff.minutes*1000*60;

       oDiff.seconds = Math.floor(nTotalDiff/1000);

       return oDiff;

}


