var Email = 
{
    ajax : null,
    //the URL to the AJAX script
    ajaxURL : '/ajax/email.php',

    form : null,
    prompt : null,
    promptDefault : 'Enter Your E-mail and Message',
    promptSent : 'Your message has been sent',
    promptError : 'Error sending the message',
    promptConnError : 'Cannot connect to the server',
    promptProcDefault : 'Processing',
    promptMsg : null,
    promptDot : null,
    submitButton : null,
    dots : '',
    promptInterval : null,
    //commands are stored in the cache and processed sequentually
    cache : null,
    timeoutHandler : null,
    timeoutThreshold : 60,    
    
    /*
     * constructor
     */
    init : function()
    {
	var self = Email;
	self.ajax = new Ajax();
	self.cache = [];
	self.form = document.getElementById('emailForm');
	self.prompt = document.getElementById('emailPrompt');
	self.promptMsg = document.getElementById('emailPromptMsg');
	self.promptDot = document.getElementById('emailPromptDot');
	self.submitButton = document.getElementById('submitButton');
	
	self.setPrompt('base', self.promptDefault);

	//disable default submit action
	Util.addEventListener(self.form, 'submit', Util.preventDefault);
	//close form on cancel
	Util.addEventListener(self.form.cancelButton, 'click', 
	    function(event) {
		self.showEmailForm(false);
		Util.preventDefault(event);
	    }
	) 
	self.toggleEnabled(true);

	//check entered e-mail
	self.form.sender.onchange = self.validateEmail;
	Util.addEventListener(self.form.sender, 'change', self.validateEmail);
	
	Util.fixIEBackground();
	
	//show a link to activate the form
	self.showEmail();
    },

    /*
     * destructor
     */
    cleanup : function() 
    {
	var self = Email;
	self.form = null;
	self.prompt = null;
	self.promptMsg = null;
	self.promptDot = null;
	self.submitButton = null;
	self.cache = null;
    },


    /*
     * display info & status prompt
     */
    setPrompt : function(status, msg)
    {
	var self = Email;
	var prompt = self.prompt;
	var promptMsg = self.promptMsg;
	var statusClass = '';
	//'base', 'proc' or 'error'
	prompt.className = status + 'Prompt';
	if (promptMsg.firstChild) {
	    promptMsg.removeChild(promptMsg.firstChild);
	}
	promptMsg.appendChild(document.createTextNode(msg));
    },	        
    
    /*
     * submit form using Ajax
     */
    submitData : function() 
    {
	var self = Email;
	var form = self.form;
	//cmd - 'send' or 'validate'
	var postData = 'command=send' + 
	    '&sender=' + encodeURIComponent(form.sender.value) +
	    '&subject=' + encodeURIComponent(form.subject.value) + 
	    '&message=' + encodeURIComponent(form.message.value);

        self.cache.push(postData);
	self.showStatusPrompt();
	self.toggleEnabled(false);

	self.executeAjax();
	//no connection handler
	self.timeoutHandler = setTimeout(self.handleError, self.timeoutThreshold * 1000);

    },
    
    /*
     * show the processing prompt
     */
    showStatusPrompt : function()
    {
	var self = Email;
	self.dots = '';
	self.setPrompt('proc', self.promptProcDefault);
	self.promptInterval = setInterval(self.showStatusDots, 200);		
    },
    
    /*
     * show the working status in dots
     */
    showStatusDots : function()
    {
	var self = Email;
	// '', '.', '..', '...'
	var maxDots = 5;
	var promptDot = self.promptDot;
	self.dots += '.';
	if (self.dots.length > maxDots) {
	    self.dots = '';
	}
	if (promptDot.firstChild) {
	    promptDot.removeChild(promptDot.firstChild);
	}    	
	promptDot.appendChild(document.createTextNode(' ' + self.dots));
    },   
    
    /*
     * show/hide error prompt
     */
    toggleFieldError : function(resp, field)
    {
        var fieldError = document.getElementById(field + "Error");
        if (fieldError.firstChild) {
	    fieldError.removeChild(fieldError.firstChild);
	}
	
	if (resp.errorMessage && resp.errorMessage[field]) {
	    fieldError.appendChild(document.createTextNode(resp.errorMessage[field]));
	}        
    },

    /*
     * validate e-mail at server
     */
    validateEmail : function() 
    {
	var self = Email;
	var form = self.form;
	
	if (form.sender.value == 0) {
	    return;
	}
	//command - 'send' or 'validate'
	var postData = 'command=validate' + 
	    '&sender=' + encodeURIComponent(form.sender.value);
	self.cache.push(postData);
	
	self.executeAjax();
    },
    
    /*
     * send AJAX request to the server
     */
    executeAjax : function()
    {
	var self = Email;

	if ((self.cache.length > 0)
	    && (!self.ajax.req || (self.ajax.readyState == 4) || (self.ajax.readyState == 0))
	    ) {
	    var postData = self.cache.shift();
	    
	    self.ajax.setHandlerErr(self.handleError);
	    self.ajax.doPost(self.ajaxURL, postData, self.handleEmailResponse);
	}
    },
    
    /*
     * when error occurs at server
     */
    handleError : function()
    {
	var self = Email;
	var promptDot = self.promptDot;
	clearInterval(self.promptInterval);
	if (promptDot.firstChild) {
	    promptDot.removeChild(promptDot.firstChild);
	}    
	
	self.setPrompt('error', self.promptConnError);
	self.toggleEnabled(true);
	if (self.ajax) {
	    self.ajax.abort();
	}

    },
    
    /*
     * handle AJAX response
     */
    handleEmailResponse : function(str)
    {
	var self = Email;
	var promptDot = self.promptDot;
	var resp = eval("(" + str + ")");
	//alert('ErrorMessage: ' + resp.errorMessage['sender'] + ', command: ' + resp.command);
	clearTimeout(self.timeoutHandler);
	
	
	//show  'to email'
	if (resp && (resp.command == 'toemail') && resp.toEmailUserName) {
	    //make the link to the e-mail form active because AJAX works
	    self.showEmailForm(false);
	    var emailHidden = document.getElementById('emailHidden');
	    if (emailHidden.firstChild) {
		emailHidden.removeChild(emailHidden.firstChild);
	    }
	    //we'll change domain <-> username in CSS to hide them from spam bots
	    emailHidden.appendChild(document.createTextNode(resp.toEmailDomain + '@' + resp.toEmailUserName));
	}
	//validate the sender's e-mail
	else if (resp && (resp.command == 'validate')) {
	    self.toggleFieldError(resp, 'sender');
	}
	//send a message
	else {
	    clearInterval(self.promptInterval);
	    if (promptDot.firstChild) {
		promptDot.removeChild(promptDot.firstChild);
	    }    
	
	    if (!resp.error) {
		self.setPrompt('proc', self.promptSent);
	    }
	    else {
		self.setPrompt('error', self.promptError);		
	    }            
	
	    self.toggleFieldError(resp, 'sender');
	    self.toggleFieldError(resp, 'message');
	
	    self.toggleEnabled(true);
	}
	
	setTimeout(self.executeAjax, 500);
    },
    
    /*
     * show/hide the Send button
     */
    toggleEnabled : function(enable)
    {
	var self = Email;
	if (enable) {
	    Util.addEventListener(self.submitButton, 'click', self.submitData);
	    self.submitButton.disabled = false;
	}
	else {
	    Util.removeEventListener(self.submitButton, 'click', self.submitData);
	    self.submitButton.disabled = true;
	}
    },

    /*
     * show the email form or link to it
     */
    showEmailForm : function(show)
    {
	var self = Email;
	var emailDiv = document.getElementById('email');
	var emailLink = document.getElementById('emailLink');
	var address = document.getElementById('address');
	if (show) {
	    emailDiv.style.display = 'block';
	    emailLink.style.display = 'none';
	    Util.removeClass(address, 'addressHidden');
	    self.form.sender.focus();
	}
	else {
	    emailDiv.style.display = 'none';
	    emailLink.style.display = 'block';
	    Util.addClass(address, 'addressHidden');
	}    	
    },	

    /*
     * grab and show the 'to email'
     */
    showEmail : function()
    {
	var self = Email;

	//command - 'toemail'
	var postData = 'command=toemail';
	self.cache.push(postData);
	self.executeAjax();	
    }
	        
};

//window.onload = Email.init;
//window.onunload = Email.cleanup;

Util.onload(Email.init);
Util.onunload(Email.cleanup);	
