﻿var njs;
if (!njs) njs = {}
if (!njs.Util) njs.Util = {}

njs.Util.AddClassNameTo = function (arg, name) {
    var dom = njs.Util.FindDom(arg),
        classname = dom.className;
    if (typeof classname == "undefined") return;
    dom.className += (classname.length > 0) ? " " + name : name;
}

njs.Util.AddEvent = function(/*{}*/args) {
    var _dom = (typeof args.Dom == "string") ? document.getElementById(args.Dom) : args.Dom,
        _evt = args.Event || console.log("AddEvent must take an event"),
        _action = args.Action || function() { console.log("Add Action"); },
        _capture = args.Capture || false,
        _scope = args.Scope || _dom;
        _function = function() { _action.apply(_scope, arguments); }
        njs.Util._listenerFunctions[_action] = _function;
        
    if (typeof _dom.addEventListener != "undefined") {
        _dom.addEventListener(_evt, _function, _capture);
    }
    else if (_dom.attachEvent != "undefined") {
        _dom.attachEvent('on' + _evt, _function);
    }
    else { _dom['on' + _evt] = _action; }
}

njs.Util.CastAs = function(/*Object*/obj, /*Object*/cast) {
    var _cast = new cast({});
    for (var n in _cast) { obj[n] = _cast[n]; }
    return obj;
}

njs.Util.CalculateOffsetCoord = function(dom) {
    var ele = (typeof dom == "string") ? document.getElementById(dom) : dom;
    var x = 0, y = 0;
    do {
        x += ele.offsetLeft;
        y += ele.offsetTop;
    } while (ele = ele.offsetParent);
    return { X: x, Y: y };
}

njs.Util.IsDecendentOf = function(dom, ancestor){
	var d = njs.Util.FindDom(dom), a = njs.Util.FindDom(ancestor);
	if(!d || !a) return;
	if(d == a) return false;
	do  { if(d == a) return true; }
	while(d = d.parentNode);
	return false;
}

njs.Util.NormalizeClassName = function(classname) {
    return classname.replace(/\s{2,}/, " ");
}

njs.Util.Redraw = function(ele) {
    var ele = njs.Util.FindDom(ele) || document.documentElement,
        _position = ele.style.position || "",
        _display = ele.style.display || "";
    ele.style.display = "none";
    njs.Util.AddClassNameTo(ele, "__redraw");
    njs.Util.RemoveClassNameFrom(ele, "__redraw");
    ele.style.position = "relative";
    ele.style.position = "static";
    ele.style.position = _position;
    ele.style.display = _display;
}

njs.Util.RemoveClassNameFrom = function(arg, name) {
    var dom = njs.Util.FindDom(arg),
        classname = dom.className;
    if (typeof classname == "undefined") return;
    dom.className = njs.Util.NormalizeClassName(classname.replace(new RegExp("(^|\\s)" + name + "(?![\\w\\-])"), ""));
}

njs.Util.RemoveEvent = function(/*{}*/args) {
    var _dom = (typeof args.Dom == "string") ? document.getElementById(args.Dom) : args.Dom,
        _evt = args.Event || console.log("AddEvent must take an event"),
        _action = args.Action || function() { console.log("Add Action"); },
        _capture = args.Capture || false,
        _scope = args.Scope || _dom;
        _function = njs.Util._listenerFunctions[_action];
        
    if (typeof _dom.removeEventListener != "undefined") {
        _dom.removeEventListener(_evt, _function, _capture);
    }
    else if (_dom.detachEvent != "undefined") {
        _dom.detachEvent('on' + _evt, _function);
    }
    else { _dom['on' + _evt] = null; }
    delete njs.Util._listenerFunctions[_action];
}

njs.Util.SetClassName = function(arg, name) {
    this.GetDomNode(arg).className = name;
}

njs.Util.UniqueID = function() {
    return Math.random().toString().replace(/\d\.\d/,"");
}

njs.Util.FindDom = function(ele) {
    return (typeof ele == "string") ? document.getElementById(ele) : ele;
}

njs.Util._listenerFunctions = {};
