function Coords(px, py) {
	this.X = px;
	this.Y = py;
}

Coords.prototype.FromMouse = function(area) {
	var posSX = document.documentElement.scrollLeft;
	var posSY = document.documentElement.scrollTop;
	this.X = event.clientX + posSX;
	this.Y = event.clientY + posSY;
}

function CoordsFromMouse(area) {
	var coord = new Coords();
	coord.FromMouse(area);
	return coord;
}

/*********************************************************************************************/
function GCObject(id, descricao) {
	this.Id = id;
	this.Descricao = descricao;
}

function GCList() {
	this.GCObjects = [];
}

GCList.prototype.AddGCObject = function(gcObject) {
	this.GCObjects[this.GCObjects.length] = gcObject;
	return gcObject;
}

GCList.prototype.AddObject = function(id, descricao) {
	this.GCObjects[this.GCObjects.length] = new GCObject(id, descricao);
}

GCList.prototype.Find = function(id) {
	for (var a=0; a<this.GCObjects.length; a++)
		if (this.GCObjects[a].Id == id)
			return this.GCObjects[a];
	return null;
}


/*********************************************************************************************/
function drawHelp(key, help) {
//	if (help)
//		return "<div dojoType='dijit.form.DropDownButton'><span>Ajuda</span><div dojoType='dijit.TooltipDialog' id='tooltipDlg" + key + "' title='Ajuda para '>" + help + "</div></div>";
	return "";
}

function drawInnerHelpHelp(tag, key, help) {
	if (help)
		return " " + tag + " = '" + help + "'";
	return "";
}

function InputDialogFormField(name,title,dojoType,htmlType,value,tab,adicional) {
	this.Name = name;
	this.Title = title;
	this.DojoType = dojoType;
	this.HTMLType = htmlType;
	this.Value = value;
	this.Error = '';
	this.Tab = tab;
	this.Adicional = adicional;
	this.Help = null;
}

InputDialogFormField.prototype.SetValue = function(value) {
	if (this.HTMLType=='checkbox')
		this.Value = (value == 'on');
	else
		this.Value = value;
}

InputDialogFormField.prototype.OnFocus = function() {
	var el = document.getElementById(this.Name);
	if (el)
		el.focus();
}

InputDialogFormField.prototype.Draw = function() {
    var conteudo = '';
    conteudo += '<tr>';
    conteudo += '<td align="left"><label for="' + this.Name + '">' + this.Title + ': </label></td>';
    conteudo += '<td><input';
    conteudo += ' dojoType="' + this.DojoType + '"';
    if (this.Adicional) {
        conteudo += this.Adicional;
    }
    conteudo += ' type="' + this.HTMLType + '"';
    conteudo += ' name="' + this.Name + '"';
    conteudo += ' id="' + this.Name + '"';
    conteudo += drawInnerHelpHelp('alt', this.Name, this.Help);
    if (this.HTMLType == 'checkbox') {
        if (this.Value == true)
            conteudo += ' checked';
    } else {
        if (this.Value)
            conteudo += " value='" + this.Value + "'";
    }
    if (this.Error && this.Error.length > 0) {
        conteudo += ' style="color:Red;"';
    }
    conteudo += '>';
    conteudo += drawHelp(this.Name, this.Help);
    if (this.Error && this.Error.length > 0) {
        conteudo += '<br><span style="color:Red;">' + this.Error + '</span>';
    }
    conteudo += '</td>';
    conteudo += '</tr>';
    return conteudo;
}

function TextBoxField(name,title,value,tab) {
	return new InputDialogFormField(name,title,'dijit.form.TextBox','text',value,tab);
}

function NumericField(name,title,value,tab) {
	return new InputDialogFormField(name,title,'dijit.form.NumberSpinner','text',value,tab);
}

function CheckBoxField(name,title,value,tab) {
	return new InputDialogFormField(name,title,'dijit.form.CheckBox','checkbox',value,tab);
}

function PasswordField(name,title,value,tab) {
	return new InputDialogFormField(name,title,'dijit.form.TextBox','password',value,tab);
}

function DateField(name, title, value, tab) {
//    var dt = new Date();
    var dts = value.substring(6, 10) + '-' + value.substring(3, 5) + '-' + value.substring(0, 2);
//    dt.setFullYear(Number(value.substring(6, 10)), Number(value.substring(3, 5))-1, Number(value.substring(0, 2)));
//    value = value.substring(0,10);
//    alert(value + ' ' + dts + ' ' + dt);
    value = dts;
    return new InputDialogFormField(name, title, 'dijit.form.DateTextBox', 'text', value, tab, ' constraints="{datePattern:\'dd/MM/yyyy\'}" promptMessage="dd/mm/yyyy"');
}

function getEditorArea(id) {
    return getEditorEdit(id);
}

function getEditorEdit(id) {
	var field = document.getElementById(id);
	field.value = dijit.byId(id).getValue();
}

function TextEditDialogFormField(name,title,value,tab,hiddenField) {
	this.Name = name;
	this.Title = title;
	this.Value = value;
	this.Error = '';
	this.Help = null;
	this.Tab = tab;
	this.HiddenField = hiddenField;
}

TextEditDialogFormField.prototype.SetValue = function(value) {
	this.Value = value;
}

TextEditDialogFormField.prototype.OnFocus = function() {
	var el = dijit.byId(this.Name);
	if (el)
		el.focus();
}

TextEditDialogFormField.prototype.Draw = function() {
    var conteudo = '';
    conteudo += '<tr>';
    conteudo += '<td align="center" colspan="2"><label for="' + this.Name + '">' + this.Title + ': </label></td>';
    conteudo += '</tr>';
    conteudo += '<tr>';
    conteudo += '<td colspan="2"><textarea';
    conteudo += ' dojoType="dijit.Editor"';
    conteudo += ' styleSheets="../../Content/dojoLS/dojo/resources/dojo.css"';
    conteudo += ' name="' + this.Name + '"';
    conteudo += ' plugins="[';
    conteudo += '\'undo\',\'redo\'';
    conteudo += ',\'|\',\'cut\',\'copy\',\'paste\',\'selectAll\'';
    conteudo += ',\'|\',\'bold\',\'italic\',\'underline\',\'strikethrough\',\'subscript\',\'superscript\'';
    conteudo += ',\'foreColor\',\'hiliteColor\'';
    conteudo += ',\'|\',\'insertOrderedList\',\'insertUnorderedList\',\'insertHorizontalRule\'';
    conteudo += ',\'|\',\'indent\',\'outdent\'';
    conteudo += ',\'|\',\'justifyLeft\',\'justifyRight\',\'justifyCenter\',\'justifyFull\'';
    conteudo += ',\'|\',\'delete\',\'removeFormat\'';
    conteudo += ',\'|\',\'createLink\',\'unlink\'';
    conteudo += ']"';
//    conteudo += ' extraPlugins="[{name:\'dijit._editor.plugins.FontChoice\', command:\'fontName\', generic:true}]"';
    conteudo += ' id="' + this.Name + '">';
    conteudo += drawInnerHelpHelp('title', this.Name, this.Help);
    conteudo += (this.Value && this.Value.length > 0 ? this.Value : "");
    conteudo += '</textarea>';
    if (this.HiddenField) {
        conteudo += '<input type="hidden" id="' + this.HiddenField + '" name="' + this.HiddenField + '"';
        if (this.Value)
            conteudo += " value='" + this.Value + "'";
        conteudo += '>';
    }
    conteudo += drawHelp(this.Name, this.Help);
    if (this.Error && this.Error.length > 0) {
        conteudo += '<br><span style="color:Red;">' + this.Error + '</span>';
    }
    conteudo += '</td>';
    conteudo += '</tr>';

    return conteudo;
}

//function addEditorPlugins(field) {
//    var p = new dijit._editor.plugins.LinkDialog({});
//    dijit.byId(field.Name).addPlugin(p);
//    return;
//}

//TextEditDialogFormField.prototype.PreFunction = function() {
//    dijit.byId(this.Name).onLoadDeferred.addCallback = addEditorPlugins(this);
//}

TextEditDialogFormField.prototype.ArrangeSubmit = function() {
	if (this.HiddenField) {
		dojo.byId(this.HiddenField).value = dijit.byId(this.Name).getValue(false);
	}
}

function TextEdit(name,title,value,tab,hiddenField) {
	return new TextEditDialogFormField(name,title,value,tab,hiddenField);
}



function TextAreaDialogFormField(name, title, value, tab) {
    this.Name = name;
    this.Title = title;
    this.Value = value;
    this.Error = '';
    this.Help = null;
    this.Tab = tab;
}

TextAreaDialogFormField.prototype.SetValue = function(value) {
    this.Value = value;
}

TextAreaDialogFormField.prototype.OnFocus = function() {
    var el = document.getElementById(this.Name);
    if (el)
        el.focus();
}

TextAreaDialogFormField.prototype.Draw = function() {
    var conteudo = '';
    conteudo += '<tr>';
    conteudo += '<td align="center" colspan="2"><label for="' + this.Name + '">' + this.Title + ': </label></td>';
    conteudo += '</tr>';
    conteudo += '<tr>';
    conteudo += '<td colspan="2"><textarea cols="80" rows="8"';
    conteudo += ' dojoType="dijit.form.Textarea"';
    conteudo += ' name="' + this.Name + '"';
    conteudo += ' id="' + this.Name + '">';
    conteudo += drawInnerHelpHelp('title', this.Name, this.Help);
    conteudo += (this.Value && this.Value.length > 0 ? this.Value : "");
    conteudo += '</textarea>';
    conteudo += drawHelp(this.Name, this.Help);
    if (this.Error && this.Error.length > 0) {
        conteudo += '<br><span style="color:Red;">' + this.Error + '</span>';
    }
    conteudo += '</td>';
    conteudo += '</tr>';

    return conteudo;
}

function TextArea(name, title, value, tab) {
    return new TextAreaDialogFormField(name, title, value, tab);
}


function SelectDialogFormField(name, title, value, options, gcList, tab, onChange) {
	this.Name = name;
	this.Title = title;
	this.Value = value;
	this.Options = options.split(';');
	this.GCList = gcList;
	this.Error = '';
	this.Help = null;
	this.Tab = tab;
	this.OnChange = onChange;
}

SelectDialogFormField.prototype.SetValue = function(value) {
	this.Value = value;
}

SelectDialogFormField.prototype.OnFocus = function() {
	var el = document.getElementById(this.Name);
	if (el)
		el.focus();
}

SelectDialogFormField.prototype.Draw = function() {
    var conteudo = '';
    conteudo += '<tr>';
    conteudo += '<td align="left"><label for="' + this.Name + '">' + this.Title + ': </label></td>';
    conteudo += '<td><select';
    conteudo += ' dojoType="dijit.form.FilteringSelect"';
    conteudo += ' name="' + this.Name + '"';
    conteudo += ' id="' + this.Name + '"';
    if (this.OnChange) {
        conteudo += ' onchange="javascript:' + this.OnChange + '(this)"';
    }
    conteudo += drawInnerHelpHelp('title', this.Name, this.Help);
    conteudo += ' ' + (this.Value && this.Value.length > 0 ? "value='" + this.Value + "'" : '') + '>';
    if (this.GCList) {
        for (var a = 0; a < this.GCList.GCObjects.length; a++) {
            conteudo += '<option value="' + this.GCList.GCObjects[a].Id + '"' + (this.Value == this.GCList.GCObjects[a].Id ? ' selected' : '') + '>' + this.GCList.GCObjects[a].Descricao + '</option>';
        }
    } else {
        for (var a = 0; a < this.Options.length; a++) {
            var opc = this.Options[a].split('=');
            conteudo += '<option value="' + opc[1] + '"' + (this.Value == opc[1] ? ' selected' : '') + '>' + opc[0] + '</option>';
        }
    }
    conteudo += '</select>';
    conteudo += drawHelp(this.Name, this.Help);
    if (this.Error && this.Error.length > 0) {
        conteudo += '<br><span style="color:Red;">' + this.Error + '</span>';
    }
    conteudo += '</td>';
    conteudo += '</tr>';
    if (this.OnChange) {
        conteudo += '<tr><td colspan="2" width="100%"><div id="div' + this.Name + '"></div></td></tr>';
    }

//    alert(conteudo);

    return conteudo;
}

function SelectField(name,title,value,options,gclist,tab,onChange) {
    return new SelectDialogFormField(name, title, value, options, gclist, tab, onChange);
}

function ButtonDialogFormField(name,title,func,tab) {
	this.Name = name;
	this.Title = title;
	this.Func = func;
	this.Value = '';
	this.Error = '';
	this.Help = null;
	this.Tab = tab;
}

ButtonDialogFormField.prototype.SetValue = function(value) {
}

ButtonDialogFormField.prototype.OnFocus = function() {
	var el = document.getElementById(this.Name);
	if (el)
		el.focus();
}

ButtonDialogFormField.prototype.Draw = function() {
	var conteudo = '';
	conteudo += '<tr>';
	conteudo += '<td align="center" colspan="2"><button ';
	conteudo += ' name="'+this.Name+'"';
	conteudo += ' id="Bt'+this.Name+'"';
	conteudo += drawInnerHelpHelp('title', this.Name, this.Help);
	conteudo += ' dojoType="dijit.form.Button" ';
	conteudo += ' onClick="'+this.Func+'" ';
	conteudo += ' iconClass="plusIcon">';
	conteudo += this.Title;
	conteudo += '</button><div id="'+this.Name+'"></div>';
	conteudo += drawHelp(this.Name, this.Help);
	if (this.Error && this.Error.length>0) {
	    conteudo += '<br><span style="color:Red;">' + this.Error + '</span>';
	}
	conteudo += '</td>';
	conteudo += '</tr>';

	return conteudo;
}

function ButtonField(name,title,func,tab) {
	return new ButtonDialogFormField(name,title,func,tab);
}





function DropDownButtonDialogFormField(name, title, opt, tab) {
    this.Name = name;
    this.Title = title;
    this.Options = opt.split(';');
    this.Value = '';
    this.Error = '';
    this.Help = null;
    this.Tab = tab;
}

DropDownButtonDialogFormField.prototype.SetValue = function(value) {
}

DropDownButtonDialogFormField.prototype.OnFocus = function() {
    var el = document.getElementById(this.Name);
    if (el)
        el.focus();
}

DropDownButtonDialogFormField.prototype.Draw = function() {
    var conteudo = '';
    conteudo += '<tr>';
    conteudo += '<td align="center" colspan="2"><div ';
    conteudo += ' name="' + this.Name + '"';
    conteudo += ' id="Bt' + this.Name + '"';
    conteudo += ' dojoType="dijit.form.DropDownButton" ';
    conteudo += ' iconClass="plusIcon"><span>';
    conteudo += this.Title;
    conteudo += '</span>';
    for (var a = 0; a < this.Options.length; a++) {
        var opc = this.Options[a].split('=');
        conteudo += '<div dojoType="dijit.MenuItem" onClick="javascript:' + opc[1] + '()">' + opc[0] + '</div>';
    }
    conteudo += '</div>';
    conteudo += '</td>';
    conteudo += '</tr>';

    return conteudo;
}

function DropDownButtonField(name, title, opt, tab) {
    return new DropDownButtonDialogFormField(name, title, opt, tab);
}
/*********************************************************************************************/
function TabDialog(name) {
	this.Name = name;
	this.Fields = [];
}

TabDialog.prototype.AddField = function(field) {
	this.Fields[this.Fields.length] = field;
	return field;
}

TabDialog.prototype.FindField = function(field) {
	for (var a=0; a<this.Fields.length; a++) {
		if (this.Fields[a].Name.toLowerCase() == field.toLowerCase())
			return this.Fields[a];
	}
	return null;
}

TabDialog.prototype.Draw = function(pos) {
	var conteudo = '';
	conteudo += '<div dojoType="dijit.layout.ContentPane" title="'+this.Name+'" id="tab_'+pos+'">';
	conteudo += '<table>';
	for (var a=0; a<this.Fields.length; a++)
		conteudo += this.Fields[a].Draw();
	conteudo += '</table>';
	conteudo += '</div>';
	return conteudo;
}

/*********************************************************************************************/
var currentDialogForm=null;

function DialogOK(parm) {
//alert(dojo.toJson(arguments[0], true));
	currentDialogForm.DialogOK(arguments[0]);
}

function DialogForm(dialogObj,title,onFinishOK,onValidOK,content,okButton,cancelFn) {
	this.Tabs = [];
	this.Id = 'first';
	this.Fields = [];
	this.Title = title;
	this.DialogObj = dialogObj;
	this.OnFinishOK = onFinishOK;
	this.OnValidOK = onValidOK;
	this.Content = content;
	this.OkButton = okButton;
	this.Errors = new GCList();
	this.ErrorsNotRecognized = '';
	this.Obj = null;
	this.Help = null;
	this.Form = null;
	this.CancelFn = cancelFn;
	this.MostraSubmit = true;
	this.Sign = false;
}

DialogForm.prototype.AddField = function(field) {
	if (field.Tab && false) {
		var tab = this.FindTab(field.Tab);
		if (tab == null) {
			tab = new TabDialog(field.Tab);
			this.Tabs[this.Tabs.length] = tab;
		}
		tab.AddField(field);
	}
	this.Fields[this.Fields.length] = field;
	return field;
}

DialogForm.prototype.FindField = function(field) {
	for (var a=0; a<this.Fields.length; a++) {
		if (this.Fields[a].Name.toLowerCase() == field.toLowerCase())
			return this.Fields[a];
	}
	return null;
}

DialogForm.prototype.FindTab = function(tab) {
	for (var a=0; a<this.Tabs.length; a++) {
		if (this.Tabs[a].Name.toLowerCase() == tab.toLowerCase())
			return this.Tabs[a];
	}
	return null;
}

DialogForm.prototype.FinishOK = function(resp, fieldErrors) {
	var obj = this.Obj;
	if (fieldErrors && fieldErrors.GCObjects.length > 0) {
		this.Errors = fieldErrors;
		this.ErrorsNotRecognized = '';
		for (var a=0; a<this.Fields.length; a++) {
			this.Fields[a].Error = '';
			eval('this.Fields['+a+'].SetValue(obj.'+this.Fields[a].Name+');');
		}
		for (var a=0; a<this.Errors.GCObjects.length; a++) {
			var field = this.FindField(this.Errors.GCObjects[a].Id);
			if (field) {
				if (field.Error != '')
					field.Error += '<br />';
				field.Error += this.Errors.GCObjects[a].Descricao;
			} else {
				if (this.ErrorsNotRecognized != '')
					this.ErrorsNotRecognized += '<br />';
				this.ErrorsNotRecognized += this.Errors.GCObjects[a].Descricao;
			}
		}
		this.Draw();
		return;
	}
	this.OnFinishOK(resp, this.DialogObj, obj);
}

DialogForm.prototype.DialogOK = function(obj) {
    this.Obj = obj;
    if (this.OnValidOK) {
        this.OnValidOK(this.DialogObj == null ? 0 : 1, obj);
    } else
        alert('FALTA IMPLEMENTAR');
}

DialogForm.prototype.ArrangeSubmit = function() {
	for (var a=0; a<this.Fields.length; a++)
		if (this.Fields[a].ArrangeSubmit)
			this.Fields[a].ArrangeSubmit();
}

var lastDijitDialog = [];

function procuraLastDialog(id) {
	for (var a=0; a<lastDijitDialog.length; a++) {
//		alert(lastDijitDialog[a].id);
		if (lastDijitDialog[a].id == id)
			return a;
	}
	return lastDijitDialog.length;
}

function DialogOpened (id, dialog) {
	this.id = id;
	this.dialog = dialog;
}

DialogForm.prototype.CreateContent = function() {
    var pos = procuraLastDialog(this.Id);
    if (pos < lastDijitDialog.length && lastDijitDialog[pos].dialog) lastDijitDialog[pos].dialog.destroyRecursive();
    this.dialog = new dijit.Dialog({ id: ("createDialog" + this.Id), title: this.Title, execute: DialogOK });

    this.dialogOpened = new DialogOpened(this.Id, this.dialog);
    lastDijitDialog[pos] = this.dialogOpened;
    var conteudo = '';
    //    alert(conteudo);
    if (this.Form)
        conteudo += this.Form;
    if (this.Help) { // && this.Tabs.length == 0) {
        conteudo += '<table><tr><td>';
    }
    conteudo += '<table>';
    if (this.ErrorsNotRecognized && this.ErrorsNotRecognized.length > 0) {
        conteudo += '<tr><td colspan="2"><span style="color:Red;">' + this.ErrorsNotRecognized + '</span></td></tr><tr><td colspan="2"><hr /></td></tr>';
    }
    conteudo += '<tr><td colspan="2"><div style="overflow:auto;max-height:450px;max-width:700px;' + (this.MinWidth ? ('min-width:' + this.MinWidth + 'px;') : "") + (this.MinHeight ? ('min-height:' + this.MinHeight + 'px;') : "") + '"><table>';

    for (var a = 0; a < this.Fields.length; a++) {
        //		if (!this.Fields[a].Tab)
        conteudo += this.Fields[a].Draw();
    }
    if (this.Tabs.length > 0) {
        conteudo += '<tr><td colspan="2"><div dojoType="dijit.layout.TabContainer" id="mainTabContainer" style="width:500;height:400px">';
        for (var a = 0; a < this.Tabs.length; a++)
            conteudo += this.Tabs[a].Draw(a);
        //		if (this.Help) {
        //			conteudo += '<div dojoType="dijit.layout.ContentPane" title="Ajuda" id="tab_Help">';
        //			conteudo += this.Help;
        //			conteudo += '</div>';
        //		}
        conteudo += '</div></td></tr>';
    }
    if (this.Content)
        conteudo += this.Content;
    conteudo += '</table></div></td></tr>';
    conteudo += '<tr>';
    conteudo += '<td colspan="2" align="center">';

    if (this.Sign) {
        conteudo += " <select id='CertificadosExistentes'></select>" +
        " <input type='button' id='btnCarregarCertificado' value='Carregar' onclick='javascript:carregaCertificados()'>" +
		" <applet id='ICPBravoApplet'" +
		"  width='100px'" +
		"  height='20px'" +
		"  code='br.com.oaks.ICPBravo.applet.AppletICPBravoManager'" +
		"  archive='/Applets/ICPBravo/ICPBravoAPI-1.11.jar,/Applets/ICPBravo/commons-codec.jar,/Applets/ICPBravo/commons-httpclient.jar,/Applets/ICPBravo/commons-logging.jar,/Applets/ICPBravo/mail.jar'" +
		"  mayscript>" +
		"  <param name='TipoRepositorio' value='5'>" +
        " </applet>";
    }

    if (this.MostraSubmit)
        conteudo += '<button dojoType="dijit.form.Button" type="submit" id="BtnSubmit' + this.Id + '">' + (this.OkButton ? this.OkButton : 'OK') + '</button>';
    if (this.CancelFn) {
        conteudo += '<button dojoType="dijit.form.Button" type="button" onclick="' + this.CancelFn + '">Cancelar</button>';
    }
    conteudo += '</td></tr>';
    conteudo += '</table>';
    if (this.Help) { // && this.Tabs.length == 0) {
        conteudo += '</td><td width="200px" align="right">' + this.Help + '</td></tr></table>';
    }
    if (this.Form) {
        conteudo += '</form>';
    }
    return conteudo;
}

DialogForm.prototype.Draw = function() {
    var conteudo = this.CreateContent();
    //	alert(conteudo);
    this.dialog.setContent(conteudo);
    this.dialog.startup();
    this.dialog.show();

    //    this.dialog.domNode.style.zIndex = 999 + (pos * 2);
    //    this.dialog._underlay.domNode.style.zIndex = 998 + (pos * 2);
    dojo.forEach(this.dialog._modalconnects, function(e) { if (e[1] == 'onkeypress') { dojo.disconnect(e); } });
    // this.dialog._modalconnects.push(dojo.connect(this.dialog.containerNode, "onkeypress", this, "_onKey"));

    for (var a = 0; a < this.Fields.length; a++) {
        if (this.Fields[a].PreFunction)
            this.Fields[a].PreFunction();
    }

    //	dijit.focus(dojo.query('input', what.domNode)[0]);
    //	this.dialog.focus();

    var firstField = (this.Fields.length > 0 ? this.Fields[0] : null);
    if (firstField != null)
        firstField.OnFocus();

//    if (this.Sign)
//        setAppletLoadedCallback(carregaCertificados);
}

function carregaCertificados() {
    ICPBravoApplet().loadCertificates('PKCS11');
}

/*********************************************************************************************/
var currentDialogArea = null;

function DialogArea(title, place) {
    this.Fields = [];
    this.Place = place;
    this.Title = title;
}

DialogArea.prototype.AddField = function(field) {
    this.Fields[this.Fields.length] = field;
    return field;
}

DialogArea.prototype.CreateContent = function() {
    var conteudo = '';
    conteudo += '<table>';
    for (var a = 0; a < this.Fields.length; a++) {
        conteudo += this.Fields[a].Draw();
    }
    conteudo += '</table>';
    return conteudo;
}

DialogArea.prototype.Draw = function() {
    var conteudo = this.CreateContent();
    if (currentDialogArea) currentDialogArea.destroyRecursive();

    var place = document.getElementById(this.Place);
    var tooltip = document.createElement('div');
    tooltip.setAttribute('id', 'tooltip');
    place.appendChild(tooltip);
    currentDialogArea = new dijit.TooltipDialog(
		{ id: "currentDialogArea",
		    title: this.Title,
		    execute: DialogOK
		}, tooltip);
    currentDialogArea.setContent(conteudo);
    currentDialogArea.startup();
}
/*********************************************************************************************/
var currentToolTipDialogForm=null;
var lastDijitToolTipDialog = [];

function ToolTipDialogOK(parm) {
//alert(dojo.toJson(arguments[0], true));
	currentToolTipDialogForm.ToolTipDialogOK(arguments[0]);
}

function ToolTipDialogForm(dialogObj,title,place,level,onFinishOK,onValidOK,content,okButton) {
	this.Tabs = [];
	this.Fields = [];
	this.Title = title;
	this.Place = place;
	this.Level = level;
	this.DialogObj = dialogObj;
	this.OnFinishOK = onFinishOK;
	this.OnValidOK = onValidOK;
	this.Content = content;
	this.OkButton = okButton;
	this.Errors = new GCList();
	this.ErrorsNotRecognized = '';
	this.Obj = null;
	this.Help = null;
	this.Form = null;
}

ToolTipDialogForm.prototype.AddField = function(field) {
	if (field.Tab && false) {
		var tab = this.FindTab(field.Tab);
		if (tab == null) {
			tab = new TabDialog(field.Tab);
			this.Tabs[this.Tabs.length] = tab;
		}
		tab.AddField(field);
	}
	this.Fields[this.Fields.length] = field;
	return field;
}

ToolTipDialogForm.prototype.FindField = function(field) {
	for (var a=0; a<this.Fields.length; a++) {
		if (this.Fields[a].Name.toLowerCase() == field.toLowerCase())
			return this.Fields[a];
	}
	return null;
}

ToolTipDialogForm.prototype.FindTab = function(tab) {
	for (var a=0; a<this.Tabs.length; a++) {
		if (this.Tabs[a].Name.toLowerCase() == tab.toLowerCase())
			return this.Tabs[a];
	}
	return null;
}

ToolTipDialogForm.prototype.FinishOK = function(posList, fieldErrors) {
	var obj = this.Obj;
	if (fieldErrors && fieldErrors.GCObjects.length > 0) {
		this.Errors = fieldErrors;
		this.ErrorsNotRecognized = '';
		for (var a=0; a<this.Fields.length; a++) {
			this.Fields[a].Error = '';
			eval('this.Fields['+a+'].SetValue(obj.'+this.Fields[a].Name+');');
		}
		for (var a=0; a<this.Errors.GCObjects.length; a++) {
			var field = this.FindField(this.Errors.GCObjects[a].Id);
			if (field) {
				if (field.Error != '')
					field.Error += '<br />';
				field.Error += this.Errors.GCObjects[a].Descricao;
			} else {
				if (this.ErrorsNotRecognized != '')
					this.ErrorsNotRecognized += '<br />';
				this.ErrorsNotRecognized += this.Errors.GCObjects[a].Descricao;
			}
		}
		this.Draw();
		return;
	}
	this.OnFinishOK(posList, this.DialogObj, obj);
}

ToolTipDialogForm.prototype.ToolTipDialogOK = function(obj) {
	this.Obj = obj;
	if (this.OnValidOK) {
		this.OnValidOK(this.DialogObj == null ? 0:1, obj);
	} else
		alert('FALTA IMPLEMENTAR');
}

ToolTipDialogForm.prototype.ArrangeSubmit = function() {
	for (var a=0; a<this.Fields.length; a++)
		if (this.Fields[a].ArrangeSubmit)
			this.Fields[a].ArrangeSubmit();
}

ToolTipDialogForm.prototype.CreateContent = function() {
    if (lastDijitToolTipDialog[this.Level]) lastDijitToolTipDialog[this.Level].destroyRecursive();

    //    var bt = document.getElementById('Bt' + this.Place);
    //    bt.readOnly = true;
    //    alert(this.Place);
    var place = document.getElementById(this.Place);
    //    alert(place);

    lastDijitToolTipDialog[this.Level] = new dijit.TooltipDialog(
		{ id: "createToolTipDialog" + this.Level,
		    title: this.Title,
		    //		class:this.Place, 
		    execute: DialogOK
		}, place);
    var conteudo = '';
    if (this.Form)
        conteudo += this.Form;
    if (this.Help) { // && this.Tabs.length == 0) {
        conteudo += '<table><tr><td>';
    }
    conteudo += '<table>';
    if (this.ErrorsNotRecognized && this.ErrorsNotRecognized.length > 0) {
        conteudo += '<tr><td colspan="2"><span style="color:Red;">' + this.ErrorsNotRecognized + '</span></td></tr><tr><td colspan="2"><hr /></td></tr>';
    }

    for (var a = 0; a < this.Fields.length; a++) {
        //		if (!this.Fields[a].Tab)
        conteudo += this.Fields[a].Draw();
    }

    if (this.Tabs.length > 0) {
        conteudo += '<tr><td colspan="2"><div dojoType="dijit.layout.TabContainer" id="mainTabContainer" style="width:500;height:400px">';
        for (var a = 0; a < this.Tabs.length; a++)
            conteudo += this.Tabs[a].Draw(a);
        //		if (this.Help) {
        //			conteudo += '<div dojoType="dijit.layout.ContentPane" title="Ajuda" id="tab_Help">';
        //			conteudo += this.Help;
        //			conteudo += '</div>';
        //		}
        conteudo += '</div></td></tr>';
    }
    if (this.Content)
        conteudo += this.Content;
    //	conteudo += '<tr>';
    //	conteudo += '<td colspan="2" align="center">';
    //	conteudo += '<button dojoType="dijit.form.Button" type="submit">'+(this.OkButton?this.OkButton:'OK')+'</button></td>';
    //	conteudo += '</tr>';
    conteudo += '</table>';
    if (this.Help) { // && this.Tabs.length == 0) {
        conteudo += '</td><td width="200px" align="right">' + this.Help + '</td></tr></table>';
    }
    if (this.Form) {
        conteudo += '</form>';
    }
    return conteudo;
}

ToolTipDialogForm.prototype.Draw = function() {
    var conteudo = this.CreateContent();
    //	alert(conteudo);
    lastDijitToolTipDialog[this.Level].setContent(conteudo);
    lastDijitToolTipDialog[this.Level].startup();
    //	lastDijitToolTipDialog[this.Level].show();

    var firstField = (this.Fields.length > 0 ? this.Fields[0] : null);
    if (firstField != null)
        firstField.OnFocus();
}

/*********************************************************************************************/
function GCGridFieldValue(pos,id,nome,tipo) {
	this.Pos = pos;
}

GCGridFieldValue.prototype.ArrayValue = function() {
	return [this.Pos];
}

/*********************************************************************************************/
function GCGridValue() {
	this.Data = [];
}

GCGridValue.prototype.AddValue = function(value) {
	this.Data[this.Data.length] = value;
}

GCGridValue.prototype.GetArrayValue = function() {
	var ret=[];
	for (var a=0; a<this.Data.length; a++) {
		ret[ret.length] = this.Data[a].ArrayValue();
	}
	return ret;
}

/*********************************************************************************************/
var CurrentGRID=null;
var LastGRIDSelect=null;
var LastPosGRIDSelect=0;
var LastDataPosGRIDSelect=0;

function GCGrid(container, noReorder) {
	this.Columns = [];
	this.Data = new GCGridValue();
	this.Container = container;
	this.Grid=null;
	this.Model=null;
	this.Layout=null;
	this.NoReorder=noReorder;
}

GCGrid.prototype.AddColumn = function(column) {
	this.Columns[this.Columns.length] = column;
}

GCGrid.prototype.AddRow = function(row, noRedraw) {
	this.Data.AddValue(row);
	if (!noRedraw) {
		if (this.Grid) {
			this.Grid.addRow(row.ArrayValue());
			if ((!this.NoReorder))
				this.Grid.setSortIndex(0, true);
			this.Grid.render();
		}
	}
	return row;
}

GCGrid.prototype.Recarrega = function() {
	this.Model.data = this.Data.GetArrayValue();
	this.Model.allChange();
	this.Grid.render();
}

GCGrid.prototype.RemoveObject = function(pos) {
	var posData = this.Model.data[pos][0];
//	this.Model.data.splice(pos,1);
	this.Data.Data.splice(posData,1);
	this.Grid.removeSelectedRows();
	this.Grid.render();
}

GCGrid.prototype.MoveUpObject = function(pos) {
	var dt1 = this.Model.data[pos-1];
	var dt2 = this.Model.data[pos];
	this.Model.data[pos-1] = dt2;
	this.Model.data[pos] = dt1;
	this.Model.allChange();
	this.Grid.render();
//	this.SetSelected(pos-1);
}

GCGrid.prototype.MoveDownObject = function(pos) {
	var dt1 = this.Model.data[pos+1];
	var dt2 = this.Model.data[pos];
	this.Model.data[pos+1] = dt2;
	this.Model.data[pos] = dt1;
	this.Model.allChange();
	this.Grid.render();
//	this.SetSelected(pos+1);
}

GCGrid.prototype.Clear = function() {
	for (var a=0; a<this.Data.Data.length; a++)
		this.Grid.selection.setSelected(a,true);
	this.Grid.removeSelectedRows();
	this.Data = new GCGridValue();
//	this.Model.data = this.Data.GetArrayValue();
	this.Grid.render();
}

GCGrid.prototype.ResetObjectValue = function(pos,obj) {
	this.Model.data[pos] = obj.ArrayValue();
	this.Model.allChange();
	this.Grid.render();
}

GCGrid.prototype.GetObject = function(pos) {
	LastPosGRIDSelect=pos;
	LastDataPosGRIDSelect=this.Model.data[pos][0]-1;
	LastGRIDSelect=this.Data.Data[LastDataPosGRIDSelect];
	return LastGRIDSelect;
}

GCGrid.prototype.GetSelected = function() {
	return this.Grid.selection.getSelected();
}

GCGrid.prototype.SetSelected = function(pos) {
	for (var a=0; a<this.Data.Data.length; a++)
		this.Grid.selection.setSelected(a,false);
	this.Grid.selection.setSelected(pos,true);
	
	var posScrool = pos - 6;
	if (posScrool < 0)
		posScrool = 0;
	
	this.Grid.scrollToRow(posScrool);
}

function OnGridSelect(pos) {
	alert('selecionando '+pos);
}

GCGrid.prototype.Draw = function() {
	this.Model = new dojox.grid.data.Table(null, this.Data.GetArrayValue());
	this.Layout = [{ connect: OnGridSelect, cells: [ this.Columns ] }];
	var modelChange = function() {
		var n = dojo.byId('rowCount');
		if (n)
			n.innerHTML = Number(model.getRowCount()) + ' linha(s)';
	}

	this.Grid = new dojox.Grid({"id": "grid", "structure": this.Layout, "model": this.Model});
	if (!this.NoReorder)
		this.Grid.setSortIndex(0, true);
	dojo.byId(this.Container).appendChild(this.Grid.domNode);
	this.Grid.render();
}
/*********************************************************************************************/
function ValorGrafico(titulo, valor) {
    this.Titulo = titulo;
    this.Valor = valor;
}

function SerieGrafico(titulo,color,backgroundColor) {
    this.Titulo = titulo;
    this.Color = color;
    this.BackgroundColor = backgroundColor;
    this.Valores = [];
}
SerieGrafico.prototype.AdicionaValor = function(coluna) {
    this.Valores[this.Valores.length] = coluna;
}

function Grafico(titulo,corTema) {
    this.Titulo = titulo;
    this.Series = [];
    this.CorTema = corTema; // blue red green cyan orange purple
}
Grafico.prototype.AdicionaSerie = function(serie) {
    this.Series[this.Series.length] = serie;
}
//Grafico.prototype.UpdateSerie = function(dv) {
////    seriesData[index] = value;
//    this.Chart.updateSeries("Series 1", seriesData);
//    this.Chart.render();
//}
Grafico.prototype.DrawLine = function(dv, dvLegend) {
    this.Chart = new dojox.charting.Chart2D(dv);
    this.Chart.addPlot("default", { type: "Lines" });
    this.Chart.addAxis("x");
    this.Chart.addAxis("y", { vertical: true });
    this.ConstroiSeries("lines", dvLegend);
}
Grafico.prototype.DrawLineMark = function(dv, dvLegend) {
    this.Chart = new dojox.charting.Chart2D(dv);
    this.Chart.addPlot("default", {type: "Lines", markers: true, tension: 3, shadows: { dx: 2, dy: 2, dw: 2 } });
    this.Chart.addAxis("x");
    this.Chart.addAxis("y", { vertical: true });
    this.ConstroiSeries("linesMark", dvLegend);
}
Grafico.prototype.DrawBarr = function(dv, dvLegend) {
    this.Chart = new dojox.charting.Chart2D(dv);
    this.Chart.addAxis("y", { vertical: true });
    this.Chart.addAxis("x");
    this.Chart.addPlot("default", {type: "Bars", areas: true, gap: 5});
    this.ConstroiSeries("bars", dvLegend);
}
Grafico.prototype.DrawColumn = function(dv, dvLegend) {
    this.Chart = new dojox.charting.Chart2D(dv);
    this.Chart.addAxis("y", { vertical: true });
    this.Chart.addAxis("x");
    this.Chart.addPlot("default", {type: "Columns", areas: true, gap: 5, hAxis: "x", vAxis: "y" });
    this.ConstroiSeries("columns", dvLegend);
}
Grafico.prototype.DrawPie = function(dv, dvLegend) {
    this.Chart = new dojox.charting.Chart2D(dv);
    this.Chart.addPlot("default", { type: "Pie", radius: 90, font: "normal normal bold 8pt Tahoma", fontColor: "black", labelOffset: 10, precision: 0});
    this.ConstroiSeries("pie", dvLegend);
}
Grafico.prototype.DrawArea = function(dv, dvLegend) {
    this.Chart = new dojox.charting.Chart2D(dv);
    this.Chart.addPlot("default", {type: "Areas"});
    this.ConstroiSeries("area", dvLegend);
}
Grafico.prototype.ConstroiSeries = function(type, dvLegend) {
    for (var a = 0; a < this.Series.length; a++) {
        var seriesData = [];
        var total = 0;
        for (var b = 0; b < this.Series[a].Valores.length; b++)
            total += this.Series[a].Valores[b].Valor;
        for (var b = 0; b < this.Series[a].Valores.length; b++) {
            var titulo = this.Series[a].Valores[b].Titulo + ': (' + (this.Series[a].Valores[b].Valor) + ')';
            if (type == "pie")
                seriesData[seriesData.length] = { y: this.Series[a].Valores[b].Valor, text: titulo, tooltip: (this.Series[a].Valores[b].Valor/total*100) };
            else
                seriesData[seriesData.length] = this.Series[a].Valores[b].Valor;
        }
        this.Chart.addSeries(this.Series[a].Titulo, seriesData, { stroke: { color: this.Series[a].Color, width: 2 }, fill: this.Series[a].BackgroundColor });
    }
    this.SetColor(this.CorTema);
    if (dvLegend) {
        this.Legend = new dojox.charting.widget.Legend({ chart: this.Chart }, dvLegend);
        this.Legend.refresh();
    }
}
Grafico.prototype.SetColor = function(color) {
    dojo.require("dojox.charting.themes.PlotKit." + color);
    this.Chart.setTheme(dojox.charting.themes.PlotKit[color]);
    this.Chart.render();
}


function testaGrafico() {
    var gr = new Grafico("teste1", "blue");
    var sr1 = new SerieGrafico("sr1", "blue", "gray");
    sr1.AdicionaValor(new ValorGrafico("c1", 10));
    sr1.AdicionaValor(new ValorGrafico("c2", 20));
    sr1.AdicionaValor(new ValorGrafico("c3", 50));
    sr1.AdicionaValor(new ValorGrafico("c4", 30));
    gr.AdicionaSerie(sr1);

    var sr2 = new SerieGrafico("sr2", "red", "gray");
    sr2.AdicionaValor(new ValorGrafico("c2", 20));
    sr2.AdicionaValor(new ValorGrafico("c3", 40));
    sr2.AdicionaValor(new ValorGrafico("c4", 30));
    sr2.AdicionaValor(new ValorGrafico("c1", 10));
    gr.AdicionaSerie(sr2);

//    var sr3 = new SerieGrafico("sr3", "yellow", "yellow");
//    sr3.AdicionaValor(new ValorGrafico("c2", 5));
//    sr3.AdicionaValor(new ValorGrafico("c3", 50));
//    sr3.AdicionaValor(new ValorGrafico("c4", 40));
//    sr3.AdicionaValor(new ValorGrafico("c1", 50));
//    gr.AdicionaSerie(sr3);

    gr.DrawLine("ch1");
    gr.DrawLineMark("ch2");
    gr.DrawBarr("ch3");
    gr.DrawColumn("ch4");
    gr.DrawPie("ch5");
    gr.DrawArea("ch6");
}
/*********************************************************************************************/
var proximoId=1;
function ZeraProximo() {
	proximoId=1;
}
function ProximoId() {
	return proximoId++;
}

/*********************************************************************************************/
function drawDiv(x, y, w, h, color, stroke, zindex, id, content) {
	var middle = stroke / 2;
	return '<div'+(id?(' id="'+id+'"'):'')+' style="'+(zindex?('z-index:'+zindex+';'):'')+'position:absolute;'+
		'left:' + (x-middle) + 'px;'+
		'top:' + (y-middle) + 'px;'+
		'width:' + w + 'px;'+
		'height:' + h + 'px;'+
		'background-color:' + color +
		';">'+(content?content:'')+'<\/div>\n';
}

function drawLine(stroke, color, start, end, zindex) {
	var ret = '';
	if(start.X > end.X) {
		var _end = end;
		end = start;
		start = _end;
	}
	var dx = end.X-start.X;
	var dy = Math.abs(end.Y-start.Y);
	var x = start.X;
	var y = start.Y;
	var yIncr = (start.Y > end.Y)? -1 : 1;
	var drw = true;
	var middle = Math.ceil(stroke / 2);
	if (dx == 0) {
		ret += drawDiv(Math.ceil(start.X), Math.ceil(start.Y < end.Y ? start.Y : end.Y), stroke, Math.ceil(dy+stroke), color, stroke, zindex);
	} else if (dy == 0) {
		ret += drawDiv(Math.ceil(start.X), Math.ceil(start.Y < end.Y ? start.Y : end.Y), Math.ceil(dx+stroke), stroke, color, stroke, zindex);
	} else {
		if(dx >= dy) {
			var pr = dy<<1;
			var pru = pr - (dx<<1);
			var p = pr-dx;
			while(dx > 0) {
				--dx;
				if(drw) ret += drawDiv(x, y, stroke, stroke, color, stroke, zindex);
				drw = !drw;
				if(p > 0) {
					y += yIncr;
					p += pru;
				} else p += pr;
				++x;
			}
		} else {
			var pr = dx<<1;
			var pru = pr - (dy<<1);
			var p = pr-dy;
			while(dy > 0) {
				--dy;
				if(drw) ret += drawDiv(x, y, stroke, stroke, color, stroke, zindex);
				drw = !drw;
				y += yIncr;
				if(p > 0) {
					++x;
					p += pru;
				} else p += pr;
			}
		}
		if(drw) ret += drawDiv(x, y, stroke, stroke, color, stroke, zindex);
	}
	return ret;
}

function getRealPosition(elem) {
	var xPos = elem.offsetLeft;
	var yPos = elem.offsetTop;
	tempEl = elem.offsetParent;
	while (tempEl != null) {
		xPos += tempEl.offsetLeft;
		yPos += tempEl.offsetTop;
		tempEl = tempEl.offsetParent;
	}
	return new Coords(xPos, yPos);
}

function getOffsetPosition(pos1, pos2) {
//alert('P1='+pos1.X+', '+pos1.Y+', P2='+pos2.X+', '+pos2.Y);
	return new Coords(pos1.X - pos2.X, pos1.Y - pos2.Y);
}

function ShowDiv(divName) {
	var el = document.getElementById(divName);
	el.style.display = "block";		
}

function HideDiv(divName) {
	var el = document.getElementById(divName);
	el.style.display = "none";		
}

function PopulateSelectionField(fieldName, gcList, defaultValue) {
	var cp = document.getElementById(fieldName);
	cp.options.length = 0;
	for(var a=0; a<gcList.GCObjects.length; a++) {
		cp.options[a] = new Option(gcList.GCObjects[a].Descricao, gcList.GCObjects[a].Id);
		if (gcList.GCObjects[a].Id == defaultValue)
			cp.selectedIndex = a;
	}
}

function SetInputValue(id, value) {
	document.getElementById(id).value = value;
}

function OnSelecionarCombo(combo, funcao) {
	for(var a=0; a<combo.options.length; a++) {
		if (combo.options[a].selected) {
			funcao(combo.options[a].value);
			return;
		}
	}
	funcao(0);
}
/*********************************************************************************************/

var IE = 0;
var OP = 1;
var DOM = 2;

function tipoNavegador() {
    var d = document;
    var nua = navigator.userAgent;

    var dom, ie, op;
    if (!d.layers) {
        dom = (d.getElementById);
        op = (nua.indexOf('Opera') != -1);
        ie = (d.all && !op);
    }

    if (ie)
        return IE;
    if (op)
        return OP;
    return DOM;
}

function linhasTabela(tabela) {
    var tbl = document.getElementById(tabela);
    return tbl.getElementsByTagName("tr");
}

function AbreFechaTR(tbId, trId, trIdPai) {
    var linhas = linhasTabela(tbId);
    for (var i = 0; i < linhas.length; i++) {
        if (linhas[i].id == trId) {
            if (linhas[i].style.display == "none")
                AbreTR(linhas, trId, i);
            else
                FechaTR(linhas, trId, i);
            break;
        }
    }
}

function AbreTR(linhas, trId, start) {
    var nav = tipoNavegador();
    var apresentaColuna = (nav == IE ? "block" : "table-cell");
    var apresentaLinha = (nav == IE ? "block" : "table-row");

    for (var i = start; i < linhas.length; i++) {
        if (linhas[i].id == trId) {
            var colunas = linhas[i].getElementsByTagName("td");
            for (var j = 0; j < colunas.length; j++)
                colunas[j].style.display = apresentaColuna;
            linhas[i].style.display = apresentaLinha;
        }
    }
}

function FechaTR(linhas, trId, start) {
    for (var i = start; i < linhas.length; i++) {
        if (linhas[i].id.indexOf(trId) == 0) {
            var colunas = linhas[i].getElementsByTagName("td");
            for (var j = 0; j < colunas.length; j++)
                colunas[j].style.display = "none";
            linhas[i].style.display = "none";
        }
    }
}

function ShowWait() {
    var dv = document.getElementById('Aguarde');
    if (dv) dv.style.display = 'block';
}

function HideWait() {
    var dv = document.getElementById('Aguarde');
    if (dv) dv.style.display = 'none';
}

function SelectTR(node) {
    node.style.backgroundColor = "Blue";
}

function DeselectTR(node) {
    node.style.backgroundColor = "";
}

function AbreJanela(url) {
    jan = window.open(url);
//    this.mostraLinks = false;
//    jan.document.write(this.toString());
//    this.mostraLinks = true;
//    jan.document.close();
}

// Simulates PHP's date function
Date.prototype.format = function(format) {
    var returnStr = '';
    var replace = Date.replaceChars;
    for (var i = 0; i < format.length; i++) {
        var curChar = format.charAt(i);
        if (replace[curChar]) {
            returnStr += replace[curChar].call(this);
        } else {
            returnStr += curChar;
        }
    }
    return returnStr;
};

Date.replaceChars = {
    shortMonths: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
    longMonths: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
    shortDays: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
    longDays: ['Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado'],

    // Day
    d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
    D: function() { return Date.replaceChars.shortDays[this.getDay()]; },
    j: function() { return this.getDate(); },
    l: function() { return Date.replaceChars.longDays[this.getDay()]; },
    N: function() { return this.getDay() + 1; },
    S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); },
    w: function() { return this.getDay(); },
    z: function() { return "Not Yet Supported"; },
    // Week
    W: function() { return "Not Yet Supported"; },
    // Month
    F: function() { return Date.replaceChars.longMonths[this.getMonth()]; },
    m: function() { return (this.getMonth() < 11 ? '0' : '') + (this.getMonth() + 1); },
    M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; },
    n: function() { return this.getMonth() + 1; },
    t: function() { return "Not Yet Supported"; },
    // Year
    L: function() { return "Not Yet Supported"; },
    o: function() { return "Not Supported"; },
    Y: function() { return this.getFullYear(); },
    y: function() { return ('' + this.getFullYear()).substr(2); },
    // Time
    a: function() { return this.getHours() < 12 ? 'am' : 'pm'; },
    A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; },
    B: function() { return "Not Yet Supported"; },
    g: function() { return this.getHours() % 12 || 12; },
    G: function() { return this.getHours(); },
    h: function() { return ((this.getHours() % 12 || 12) < 10 ? '0' : '') + (this.getHours() % 12 || 12); },
    H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
    i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
    s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
    // Timezone
    e: function() { return "Not Yet Supported"; },
    I: function() { return "Not Supported"; },
    O: function() { return (this.getTimezoneOffset() < 0 ? '-' : '+') + (this.getTimezoneOffset() / 60 < 10 ? '0' : '') + (this.getTimezoneOffset() / 60) + '00'; },
    T: function() { return "Not Yet Supported"; },
    Z: function() { return this.getTimezoneOffset() * 60; },
    // Full Date/Time
    c: function() { return "Not Yet Supported"; },
    r: function() { return this.toString(); },
    U: function() { return this.getTime() / 1000; }
};