﻿if(!Function.generateCallback){
    Function.generateCallback = function(method, args) {
        return function() {
            return method(args);
        }
    }
}
if (!Function.generateDelegate) {
    Function.generateDelegate = function(context, method, args) {
        return function() {
            var e = arguments.length;
            if (e > 0) {
                var d = [];
                for (var c = 0; c < e; c++)
                    d[c] = arguments[c];
                d[e] = args;
                return method.apply(context, d)
            }
            return method.call(context, args)
        }
    }
}
if(!Function.getElementById){
    Function.getElementById = function(id) {
        if (document.getElementById)return document.getElementById(id);
        else if (document.all) return document.all[id];    
        else return null;
    }
}
if(!Function.setElementPosition){
    Function.setElementPosition = function(element,x,y){
        if (element && element.style) {
            element.style.left = x + "px";
            element.style.top = y + "px";
        }
    }
}
if(!Function.getScrollX){
    Function.getScrollX = function(){
        if ((window.navigator.appName.toLowerCase().indexOf('explorer') == -1)) {
            return window.pageXOffset;
        }
        else {
            if (document.documentElement && document.documentElement.scrollLeft) {
                return document.documentElement.scrollLeft;
            }
            else if (document.body) {
                return document.body.scrollLeft;
            }
        }
        return 0;
    }
}
if(!Function.getScrollY){
    Function.getScrollY = function(){
        if ((window.navigator.appName.toLowerCase().indexOf('explorer') == -1)) {
            return window.pageYOffset;
        }
        else {
            if (document.documentElement && document.documentElement.scrollTop) {
                return document.documentElement.scrollTop;
            }
            else if (document.body) {
                return document.body.scrollTop;
            }
        }
        return 0;
    }
}
if(!Function.getElementProperties){
    Function.getElementProperties = function(element){
      var result = new Object();
        result.x = 0;
        result.y = 0;
        result.width = 0;
        result.height = 0;
        if (element.offsetParent) {
            result.x = element.offsetLeft;
            result.y = element.offsetTop;
            var parent = element.offsetParent;
            while (parent) {
                result.x += parent.offsetLeft;
                result.y += parent.offsetTop;
                var parentTagName = parent.tagName.toLowerCase();
                if (parentTagName != "table" &&
                    parentTagName != "body" && 
                    parentTagName != "html" && 
                    parentTagName != "div" && 
                    parent.clientTop && 
                    parent.clientLeft) {
                    result.x += parent.clientLeft;
                    result.y += parent.clientTop;
                }
                parent = parent.offsetParent;
            }
        }
        else if (element.left && element.top) {
            result.x = element.left;
            result.y = element.top;
        }
        else {
            if (element.x) {
                result.x = element.x;
            }
            if (element.y) {
                result.y = element.y;
            }
        }
        if (element.offsetWidth !=null && element.offsetHeight!=null) {
            result.width = element.offsetWidth;
            result.height = element.offsetHeight;
        }
        else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {
            result.width = element.style.pixelWidth;
            result.height = element.style.pixelHeight;
        }
        if(element.clientLeft!=null && element.clientTop != null){
            result.width += element.clientLeft;
            result.height += element.clientTop;
        }
            
        return result;
    }
}
if (!Function.getElementStyleValue) {
    Function.getElementStyleValue = function(element, property) {
        var result;
        if (element.currentStyle)
            result = element.currentStyle[property];
        else if (window.getComputedStyle)
            result = document.defaultView.getComputedStyle(element, null).getPropertyValue(property);
        return result;
    }
}
if(!Function.getWindowProperties){
    Function.getWindowProperties = function(){
        var result = new Object();
        result.clientHeight = 0;
        result.clientWidth = 0;
        if (window.innerHeight) {
            result.clientHeight = window.innerHeight;
            result.clientWidth = window.innerWidth;
        }
        else if (document.documentElement && document.documentElement.clientHeight) {
            result.clientHeight = document.documentElement.clientHeight;
            result.clientWidth = document.documentElement.clientWidth;
        }
        else if (document.body && document.body.clientHeight) {
            result.clientHeight = document.body.clientHeight;
            result.clientWidth = document.body.clientWidth;
        }
        result.clientLeft = 0;
        result.clientTop = 0;
        if (window.clientLeft) {
            result.clientTop = window.clientTop;
            result.clientLeft = window.clientLeft;
        }
        else if (document.documentElement && document.documentElement.clientLeft) {
            result.clientTop = document.documentElement.clientTop;
            result.clientLeft = document.documentElement.clientLeft;
        }
        else if (document.body && document.body.clientLeft) {
            result.clientTop = document.body.clientTop;
            result.clientLeft = document.body.clientLeft;
        }
        result.scrollTop = 0;
        result.scrollLeft = 0;
        if (typeof(window.pageYOffset) != "undefined") {
            result.scrollTop = window.pageYOffset;
            result.scrollLeft = window.pageXOffset;
        }
        else if (document.documentElement && (typeof(document.documentElement.scrollTop) != "undefined")) {
            result.scrollTop = document.documentElement.scrollTop;
            result.scrollLeft = document.documentElement.scrollLeft;
        }
        else if (document.body && (typeof(document.body.scrollTop) != "undefined")) {
            result.scrollTop = document.body.scrollTop;
            result.scrollLeft = document.body.scrollLeft;
        }   
        var vScrollWidth = (document.documentElement && document.documentElement.scrollWidth) ?document.documentElement.scrollWidth: document.body.scrollWidth; 
        result.scrollRight = vScrollWidth-result.scrollLeft-result.clientWidth;
        result.bottomWindowBorder = result.clientHeight + result.scrollTop;
        result.rightWindowBorder = result.clientWidth + result.scrollLeft;
        
        var leftBorder=parseInt(document.body.style.borderLeftWidth);
        if(isNaN(leftBorder))
        leftBorder=0;
        result.rightWindowScrollWidth = result.clientLeft - leftBorder;
        
        return result;
    }
}
if (!Function.MaxLengthValidate) {
    Function.MaxLengthValidate = function(source, clientside_arguments) {
        if (clientside_arguments.Value.length > parseInt(source.MaxLength))
            clientside_arguments.IsValid = false;
        else
            clientside_arguments.IsValid = true;
    }
}
if(!Function.isIE) {Function.isIE  = function(){return navigator.userAgent.indexOf("MSIE")>-1;}}
if(!Function.isIE7){Function.isIE7 = function(){return Function.isIE() && (navigator.userAgent.indexOf("MSIE 7")>-1);}}
if(!Function.isIE6){Function.isIE6 = function(){return !Function.isIE7() && (navigator.userAgent.indexOf("MSIE 6")>-1);}}
if(!Function.isFF) {Function.isFF= function(){return !Function.isIE() && (navigator.userAgent.indexOf("Firefox")>-1);}}
var $EventsCache = null;
var $ItemsCache = null;
if(!Function.ReleaseResources){
    Function.ReleaseResources = function(){    
        var item =null
        while($EventsCache && (item=$EventsCache.pop())){
            $removeHandler(item.e,item.v,item.h);
            delete item;
        }
        $EventsCache = null;
        delete $EventsCache;
        while($ItemsCache && (item=$ItemsCache.pop())){
            if(item.dispose)item.dispose();
            delete item;
        }
        delete item;
        delete $ItemsCache;        
    }
}
if(!Function.addHandler){
    Function.addHandler = function(element, eventName, handler){
        if($EventsCache==null){
            $EventsCache = new Array();
            $addHandler(window,"unload",Function.ReleaseResources);
        }
        $addHandler(element,eventName,handler);
        $EventsCache.push({"e":element,"v":eventName,"h":handler});
    }
}
if(!Function.addDisposable){
   Function.addDisposable = function(item){
        if($ItemsCache==null)
            $ItemsCache = new Array();
        $ItemsCache.push(item);
   }
}
if(!Function.addRow){
    Function.addRow = function(table,index){
        return table.insertRow(index);
    }
}
if(!Function.appendRow){
    Function.appendRow = function(table){
        return Function.addRow(table,table.rows.length);
    }
}

if(!Function.addCell){
    Function.addCell = function(row,index){
        return row.insertCell(index);
    }
}
if(!Function.appendCell){
    Function.appendCell = function(row){
        return Function.addCell(row,row.cells.length);
    }
}
if(!Function.clearChildren){
    Function.clearChildren = function(node){
        if(node.childNodes) while(node.childNodes.length>0)node.removeChild(node.childNodes[0]);
    }
}
if(!Function.CreateLink){
    Function.CreateLink = function(url,width){
        var link = document.createElement("A");
        if(url != null && url!= ''){
            link.href = url;
            link.target = "_blank";
            link.title = url;
            link.appendChild(document.createTextNode(url));
        }else{
            link.href = "javascript:void(0)";
            link.appendChild(document.createTextNode(KPIRes.None));
            link.target = "_blank";
            link.title = KPIRes.None;
        }
        return link;
    }
}

if(!Function.CreateUserLink){
    Function.CreateUserLink = function(user){
        var link = document.createElement("A");
        if(user!=null){
            link.href = "mailto:"+user.Email;
            link.appendChild(document.createTextNode(user.UserName));
            link.target = "_blank";
            link.title = user.FullName;
            link.setAttribute("userid",user.UserID);
        }else{
            link.href = "javascript:void(0)";
            link.appendChild(document.createTextNode(KPIRes.NA));
            link.target = "_blank";
            link.title = KPIRes.NotAvailable;
        }
        return link;
    }
}
if(!Function.CreateWrapperDiv){
    Function.CreateWrapperDiv = function(text,width){
        var wrapDiv = document.createElement("DIV");
         wrapDiv.style.textOverflow = "ellipsis";
         wrapDiv.style.overflow = "hidden";
         wrapDiv.style.whiteSpace = "normal";
         wrapDiv.style.width = width + "px";
         wrapDiv.appendChild(document.createTextNode(text));
         wrapDiv.title = text;
         return wrapDiv;
    }
}
if(!Function.UpdateElementsProperty){
    Function.UpdateElementsProperty = function(property, value, elements) {
        if (property != "") {
            var p = property.split('.');
            for (var x = 0; x < elements.length; x++)
                if (p.length == 2)
                    elements[x] && (elements[x][p[0]][p[1]] = value);
                else 
                    elements[x] && (elements[x][property] = value);
        }
    }
}
Function.FormatDate = function(date){
    return date.localeFormat(Sys.CultureInfo.CurrentCulture.dateTimeFormat.ShortDatePattern);
}
if(!Function.ClickIt){
    Function.ClickIt = function(element){
        if(Function.isFF()){
            var evt = document.createEvent("MouseEvents");
            evt.initMouseEvent("click", true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null);
            element.dispatchEvent(evt);
        }else{
            element.click();
        }
    }
}
Function.Inherit = function(type,baseType) {
  for (var property in baseType.prototype)
      if (!type.prototype[property])
          type.prototype[property] = baseType.prototype[property];
      else
          type.prototype["base_" + property] = baseType.prototype[property];
  type.base = baseType;
  type.prototype.initBase = function(instance,type,arguments){
    var args = arguments || type.arguments;
    if(args)
        type.base.apply(instance,args)
    else
        type.base.apply(instance);
  }
}
if(window.$get == null)
    window.$get = function(id){
        return document.getElementById(id);
    }
    
function $wrap(control) {
    if (control.title == '') control.title = control.innerHTML;
}
