dojo.require("dojo.parser");
dojo.require("dojo.data.ItemFileWriteStore");
dojo.require("dojo.date.locale");
dojo.require("dojo.date.stamp");

dojo.require("dijit.dijit");
dojo.require("dijit.Declaration");
dojo.require("dijit.form.Button");
dojo.require("dijit.Menu");
dojo.require("dijit.Tree");
dojo.require("dijit.Tooltip");
dojo.require("dijit.Dialog");
dojo.require("dijit.Toolbar");
dojo.require("dijit.Calendar");
dojo.require("dijit.ColorPalette");
dojo.require("dijit.Editor");
dojo.require("dijit._editor.plugins.LinkDialog");
dojo.require("dijit._editor.plugins.FontChoice");
dojo.require("dijit.ProgressBar");

dojo.require("dijit.form.ComboBox");
dojo.require("dijit.form.CheckBox");
dojo.require("dijit.form.Textarea");
dojo.require("dijit.form.TextBox");
dojo.require("dijit.form.ComboBox");
dojo.require("dijit.form.FilteringSelect");
dojo.require("dijit.form.Textarea");
dojo.require("dijit.form.Form")

dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.AccordionContainer");
dojo.require("dijit.layout.TabContainer");
dojo.require("dijit.layout.ContentPane");

dojo.require("dojox.grid.DataGrid");
dojo.require("dojox.widget.FisheyeLite");
dojo.require("dojox.analytics.Urchin");

dojo.addOnLoad(function(){

	dojo.parser.parse();
	dijit.setWaiRole(dojo.body(), "application");

	var n = dojo.byId("preLoader");
	dojo.fadeOut({
		node:n,
		duration:720,
		onEnd:function(){
			// dojo._destroyElement(n); 
			dojo.style(n,"display","none");
		}
	}).play();

	// Set up handler so that when contact information is updated the "display field"
	// (used by "To" field drop-down") is also updated
	dojo.connect(contactStore, "onSet", function(/* item */ item, 
					/* attribute-name-string */ attribute, 
					/* object | array */ oldValue,
					/* object | array */ newValue){
		if(attribute != "display"){
			contactStore.setValue(item, "display", 
					contactStore.getValue(item, "first") + " " +
					contactStore.getValue(item, "last") + " <" +
					contactStore.getValue(item, "email") + ">");
		}		
	});
	
	// make tooltips go down (from buttons on toolbar) rather than to the right
	dijit.Tooltip.defaultPosition = ["above", "below"];
	
	// Write A-Z "links" on contactIndex tab to do filtering
	genIndex();

	new dojox.analytics.Urchin({ 
		acct: "UA-3572741-1", 
		GAonLoad: function(){
			this.trackPageView("/demos/dijitmail");
		}
	});	

});

function genIndex(){
	// summary:  generate A-Z push buttons for navigating contact list
	var ci = dojo.byId("contactIndex");
	
	function addChar(c, func, cls){
		// add specified character, when clicked will execute func
		var span = document.createElement("span");
		span.innerHTML = c;
		span.className = cls || "contactIndex";
		ci.appendChild(span);
		new dojox.widget.FisheyeLite(
			{
				properties: {fontSize: 1.5}, 	
				easeIn: dojo.fx.easing.linear,
				durationIn: 100,
				easeOut: dojo.fx.easing.linear,
				durationOut: 100
			},
			span
		);
		dojo.connect(span, "onclick", func || function(){ contactTable.setQuery({first: c+"*"}, {ignoreCase: true}) });
		dojo.connect(span, "onclick", function(){
			dojo.query(">", ci).removeClass("contactIndexSelected");
			dojo.addClass(span, "contactIndexSelected");
		});
	}

	addChar("ALL", function(){contactTable.setQuery({})}, 'contactIndexAll' );
	for(var l = "A".charCodeAt(0); l <= "Z".charCodeAt(0); l++){
		addChar(String.fromCharCode(l))
	}
	addChar("ALL", function(){contactTable.setQuery({})}, 'contactIndexAll' );
}

var paneId = 1;

function onMessageClick(cell){
	// summary: when user clicks a row in the message list pane
	var item = cell.grid.getItem(cell.rowIndex),
		sender = this.store.getValue(item, "sender"),
		subject = this.store.getValue(item, "label"),
		sent = dojo.date.locale.format(
				dojo.date.stamp.fromISOString(this.store.getValue(item, "sent")),
				{formatLength: "long", selector: "date"}),
		text = this.store.getValue(item, "text"),
		messageInner = "<span class='messageHeader'>From: " + sender + "<br>" +
		"Subject: "+ subject + "<br>" +
		"Date: " + sent + "<br><br></span>" +
		text;
	dijit.byId("message").setContent(messageInner);	
}

function searchMessages(){
	// summary: do a custom search for messages across inbox folders
	var query = {type: "message"};
	var searchCriteria = searchForm.attr('value');
	for(var key in searchCriteria){
		var val = searchCriteria[key];
		if(val){
			query[key] = "*" + val + "*";
		}
		table.setQuery(query, {ignoreCase: true});
	}
}

// for "new message" tab closing
function testClose(pane,tab){
  return confirm("Are you sure you want to leave your changes?");
}

// fake mail download code:
var numMails;
var updateFetchStatus = function(x){
	if(x == 0){
		dijit.byId('fakeFetch').update({ indeterminate: false });
		return;
	}
	dijit.byId('fakeFetch').update({ progress: x + 1 });
	if(x == numMails){
		dojo.fadeOut({ node: 'fetchMail', duration:800,
			// set progress back to indeterminate. we're cheating, because this
			// doesn't actually have any data to "progress"
			onEnd: function(){ 
				dijit.byId('fakeFetch').update({ indeterminate: true });
				dojo.byId('fetchMail').style.visibility='hidden'; // remove progress bar from tab order
			}
		}).play();
	}
}
var fakeReport = function(percent){
	// FIXME: can't set a label on an indeterminate progress bar
	// like if(this.indeterminate) { return " connecting."; }
	return dojo.string.substitute("Fetching: ${0} of ${1} messages.", [percent * this.maximum, this.maximum]);
}

var fakeDownload = function(){
	dojo.byId('fetchMail').style.visibility='visible';
	numMails = Math.floor(Math.random()*10) + 1;
	dijit.byId('fakeFetch').update({ maximum: numMails, progress:0 });
	dojo.fadeIn({ node: 'fetchMail', duration:300 }).play();
	for(var ii = 0; ii < numMails + 1; ++ii){
		var func = dojo.partial(updateFetchStatus, ii);
		setTimeout(func,  ((ii + 1) * (Math.floor(Math.random()*100) + 400)));
	}
}

// fake sending dialog progress bar 
var stopSendBar = function(){
	dijit.byId('fakeSend').update({ indeterminate: false });
	dijit.byId('sendDialog').hide();
	tabs.selectedChildWidget.onClose = function(){return true;};  // don't want confirm message 
	tabs.closeChild(tabs.selectedChildWidget);
}
	 
var showSendBar = function(){
	dijit.byId('fakeSend').update({ indeterminate: true });
	dijit.byId('sendDialog').show();
	setTimeout(function(){stopSendBar();}, 3000);
}

var formatDate = function(inDatum){
    return dojo.date.locale.format(dojo.date.stamp.fromISOString(inDatum), {selector: "date"});
}

