function addEvent(el, etype, fn, useCapture)
{

	if(el.addEventListener)
	{
		el.addEventListener(etype, fn, useCapture);
		return true;
	}
	else if(el.attachEvent)
	{
		var r = el.attachEvent('on' + etype, fn);
		return r;
	}
	else
	{
		el['on' + etype] = fn;
	}
}

function removeEvent(el, etype, fn, useCapture)
{
	if(el.removeEventListener)
		el.removeEventListener(etype, fn, false);
	else if(el.detachEvent)
		el.detachEvent('on' + etype, fn);
	else
		el['on' + etype] = null;
}

function addLoadEvent(func)
{
	var oldonload = window.onload;
	if(typeof window.onload != 'function')
	{
		window.onload = func;
	}
	else
	{
		window.onload = function()
		{
			oldonload();
			func();
		}
	}
}

function GetMousePoint(ev)
{
    e = ev ? ev : window.event;
    return { X : e.pageX ? e.pageX : e.clientX, Y : e.pageY ? e.pageY : e.clientY};
}

function GetAbsolutePosition(e)
{
	var calcLeft = 0;
	var calcTop = 0;
	if (e.offsetParent)
	{
		while (e.offsetParent)
		{
			calcLeft += e.offsetLeft;
			calcTop += e.offsetTop;
			e = e.offsetParent;
		}
	}
	else if (e.x)
	{
		calcLeft += e.x;
		calcTop += e.y;
	}
	return { Width : calcLeft, Height : calcTop };
}

function d(e)
{
    if(typeof e == 'string' && typeof e != 'object') return e;
    var result = new Array();
    var pattern = /\s*function\s+/;

    var offset = 15;
    var cut = '[...]';
    for(var i in e)
    {
        if(e[i])
        {
            var val;
            if(typeof e[i] == 'function')
                val = 'f()'
            else if(typeof e[i] == 'object')
                val = '[ob]'
            else
                val = e[i];

            if(val.length > (2 * offset + cut.length))
                val = val.substr(0, offset) + cut + val.substr(val.length-offset, offset);
            result.push(i + " = " + val);
        }
    }
   result.sort(sortInsensitive);

    var out = '';
    if(result.length > 0){
        var lastletter = null;
        lastletter = result[0].toString().substr(0, 1).toLowerCase();
        out += "\n[" + lastletter.toUpperCase() + "] ";
        for(var i = 0; i < result.length; i++)
        {
            if(i > 0)
            {
                if(lastletter == result[i].toString().substr(0, 1).toLowerCase())
                {
                    out += "; ";
                }
                else
                {
                    lastletter = result[i].toString().substr(0, 1).toLowerCase();
                    out += "\n[" + lastletter.toUpperCase() + "] ";
                }
            }
            out += result[i];
        }
    }
    return out;
}

function $d(e)
{
    alert(d(e));
}

function sortInsensitive(a, b)
{
    var A = a.toLowerCase();
    var B = b.toLowerCase();
    return (A == B) ? 0 : ((A < B) ? -1 : 1);
}

function cancelBubble(evt) {
	if (!evt && window.event) evt=window.event;
	if (evt!=null){
		if (typeof evt.stopPropagation=='function') evt.stopPropagation();
		else evt.cancelBubble=true;
	}
	return false;
}

function DateInput(target, o)
{
    var dateOnly = (o && o["dateOnly"] != null) ? o["dateOnly"] : false;
    var e = dojo.byId(target);
    e.updateDate = function()
    {
        var date = e.datePicker.datePicker.storedDate;
        var time = dateOnly ? "" : "T" + normalizeTime(e.__hp.value) + ":" + normalizeTime(e.__mp.value) + ":" + normalizeTime(e.__sp.value);
        this.value = date + time;
        if(this.onchange) this.onchange();
    }
    
    function normalizeTime(v)
    {
        var s = v.toString();
        if(s.length > 1)
            return s;
        else
            return "0" + s;
    }
    
    function init()
    {          
        e.style.display = "none";
        createContainer();
        e.datePicker = createDatePicker();
        e.datePicker.onInputChange = function()
        {
            var p = this.inputNode.value.split("-");
		    var tmp = new Date(p[1] + "/" + p[0] + "/" +  p[2]);
		    e.datePicker.datePicker.date = tmp;
		    e.datePicker.datePicker.setDate(dojo.widget.DatePicker.util.toRfcDate(tmp));
		    e.datePicker.datePicker.initData();
		    e.datePicker.datePicker.initUI();
	    }
	    
	    if(!dateOnly)
	    {
	        e.__hp = createTimeControl();
	        timeContainer.appendChild(document.createTextNode(":"));
	        e.__mp = createTimeControl();
	        timeContainer.appendChild(document.createTextNode(":"));
	        e.__sp = createTimeControl();
	    }
	    
	    dojo.event.connect(e.datePicker.datePicker, "setDate", e, e.updateDate);
	    
	    if(!dateOnly)
	    {
            dojo.event.connect(e.__hp, "onchange", e, e.updateDate);
            dojo.event.connect(e.__mp, "onchange", e, e.updateDate);
            dojo.event.connect(e.__sp, "onchange", e, e.updateDate);
            new NumericInput(e.__hp, { isPositive : true, isInteger : true, min: 0, max: 23 });
            new NumericInput(e.__mp, { isPositive : true, isInteger : true, min: 0, max: 59 });
            new NumericInput(e.__sp, { isPositive : true, isInteger : true, min: 0, max: 59 });
        }
    }
    
    var dateContainer = null;
    var timeContainer = null;
    var testVar = "fdfs";
    function createContainer()
    {
        var table = document.createElement("table");
        table.border = 0;
        table.cellSpacing = 0;
        table.cellPadding = 0;
        var tbody = document.createElement("tbody");
        table.appendChild(tbody);
        var tr = document.createElement("tr");
        tbody.appendChild(tr);
        dateContainer = document.createElement("td");
        tr.appendChild(dateContainer);
        if(!dateOnly)
        {
            timeContainer = document.createElement("td");        
            tr.appendChild(timeContainer);
        }
        e.parentNode.appendChild(table);
        return table;
    }
    
    function createTimeControl()
    {
        var el = document.createElement("input");
        el.type = "text";
        el.size = 2;
        el.maxLength = 2;
        el.value = 0;
        el.className = "timeBox";
        timeContainer.appendChild(el);
        return el;
    }
    
    function createDatePicker()
    {
        var sdate = dojo.widget.DatePicker.util.fromRfcDate(e.value);
        var options = {
            widgetId : e.id + "_Date",
            date : sdate,
            dateFormat : "%d-%m-%Y",
            iconAlt : "selecionar uma data",
            iconTitle : "selecionar uma data"
        };
        var el = document.createElement("span");
        dateContainer.appendChild(el);
        return dojo.widget.fromScript("DropdownDatePicker", options, el);
    }
    
    init();
    e.updateDate();
}

function NumericInput(target, o)
{
    var isInteger = (o && o["isInteger"] != null) ? o["isInteger"] : false;
    var isPositive = (o && o["isPositive"] != null) ? o["isPositive"] : false;
    var min = (o && o["min"] != null) ? o["min"] : null;
    var max = (o && o["max"] != null) ? o["max"] : null;
    var e = dojo.byId(target);

    this.onChange = function onChange(e)
    {
        var val = e.target.value;
        if(!val || val == null || dojo.string.trim(val.toString()) == "") val = "0";
        if(isInteger)
            val = parseInt(val, 10);
        else
        {
            var t = val.toString().replace(",", ".");
            t = parseFloat(t);
            val = t.toString().replace(".", ",");
        }
        if(min != null && val < min) val = min;
        if(max != null && val > max) val = max;
        if(!val) val = 0;
        e.target.value = val;
    }

    this.onKeyDown = function onKeyDown(e){
		if(dojo.render.html.ie){
			if((65 <= e.keyCode)&&(e.keyCode <= 90)){
				e.charCode = e.keyCode;
				this.onKeyPress(e);
			}
		}
	}

    this.onKeyPress = function onKeyPress(e)
    {
		var character = e.charCode > 0 ? String.fromCharCode(e.charCode) : null;
		var code = e.keyCode;
		var ctrl = e.ctrlKey ? this.KEY_CTRL : 0;

        if(isInteger && (character == ',' || character == '.'))
        {
            e.preventDefault();
        }
        else if(character == ',' || character == '.')
        {
            if(e.target.value.indexOf(",") >= 0)
                e.target.value = e.target.value.replace(",", "");
            if(character == '.')
            {
                var el = e.target;
                try
                {
                    e.charCode = 44;
                    e.keyCode = 44;
                }
                catch(e)
                {
                    dojo.lang.setTimeout(function(el){el[0].value = el[0].value.replace(".", ",");}, 20, [el]);
                }
            }
        }
        else if (character == '-' && !isPositive)
        {
            if(e.target.value.indexOf("-") == -1)
                e.target.value = '-' + e.target.value;
            e.preventDefault();
        }
        else if (dojo.lang.inArray(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], character))
        { /* pass */ }
        else if(dojo.lang.inArray([null, '%', "'", '$', '#', String.fromCharCode(8)], character) && dojo.lang.inArray([8, 9, 35, 36, 37, 39, 46, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123], code))
        { /* pass */ }
        else
        {
            e.preventDefault();
        }
    }

    dojo.event.connect(e, "onkeydown", this, "onKeyDown");
    dojo.event.connect(e, "onkeypress", this, "onKeyPress");
    dojo.event.connect(e, "onchange", this, "onChange");
}

function getFirstElementByTag(el, tag)
{
  
    for(var i = 0; i < el.childNodes.length; i++)
    {
        if(el.childNodes[i].tagName == tag)
            return el.childNodes[i];
        var s = getFirstElementByTag(el.childNodes[i], tag);
        if(s != null) return s;
    }
    return null;
}
/*
dojo.require("dojo.io.*");
dojo.require("dojo.event.*");
dojo.require("dojo.dom");
dojo.require("dojo.json");
*/
RemoteService = {
    getRequestOptionObject : function(ob, url, method, parameters, isJson)
    {
        var self = this;
        if(!parameters) var parameters = {};
        parameters = dojo.json.serialize(parameters);
        var parameters = { serializedJSON : parameters };
        var urlws = url + '/' + method;
        var loadFunction = (isJson) ? dojo.lang.hitch(ob, this.loadJSONCallback) : dojo.lang.hitch(ob, this.loadStringCallback);
        return {
                    url         : urlws,
                    mimetype    : "text/xml",
                    method      : "post",
                    error       : dojo.lang.hitch(ob, this.errorCallback),
                    load        : loadFunction,
                    content     : parameters
                };
    },

    errorCallback : function (type, error)
    {
        this.errorCallbackFunction(type, error);
    },

    loadJSONCallback : function (type, xml, e)
    {
        var stringNode = dojo.dom.firstElement(xml);
        var cont = dojo.dom.textContent(stringNode);
        if(!cont)
        {
            alert("Web Service Error: invalid JSON Object");
            return;
        }
        var ob = dojo.json.evalJSON(cont);
        this.loadCallbackFunction(ob);
    },

    loadStringCallback : function (type, xml, e)
    {
        var stringNode = dojo.dom.firstElement(xml);
        var cont = dojo.dom.textContent(stringNode);
        this.loadCallbackFunction(cont);
    }
};

// RemoteService.Config = { WSUrl : null };

RemoteService.RequestObject = function (url, method, successCallback, errorCallback, parameters, isJson)
{
    if(typeof(isJson) == 'undefined' || isJson == null) isJson = true;
    if(!errorCallback) var errorCallback = function(type, error){ alert(error.message); };
    this.errorCallbackFunction = errorCallback;
    this.loadCallbackFunction = successCallback;
    this.r = dojo.io.bind(RemoteService.getRequestOptionObject(this, url, method, parameters, isJson));
    this.abort = function()
    {
        this.r.abort();
    }
}

RemoteService.Request = function (url, method, successCallback, errorCallback, parameters)
{
    return new RemoteService.RequestObject(url, method, successCallback, errorCallback, parameters, true);
}

RemoteService.RequestString = function (url, method, successCallback, errorCallback, parameters)
{
    return new RemoteService.RequestObject(url, method, successCallback, errorCallback, parameters, false);
}

function activateSessionService()
{
    var serviceUrl = Amria.Service + "SessionService.asmx";
    var success = function(r)
    {
        if(!r.IsAuthenticated)
            redirect();
            
    }
    var redirect = function()
    {
        window.location = Amria.Root;
    }
    var request = function()
    {
        RemoteService.Request(serviceUrl, "IsAuthenticated", success, redirect, null);
    }    
    setInterval(request, 300000);
}
