// QFunctions.js
// Useful functions
/*
    FUNCTIONS
    - AlertObject(obj)
    - BringToTop(ctl)
    - Dock(ctl)
    - FindParentFromClass(ctl,CssClass)
    - FindScrollContainer(ctl)
    - Hide(ctlID)
    - isDefined(obj)
    - isNumeric(s)
    - KeepAlive()
    - ObjectToString(obj)
    - Show(ctlID)
    - Show_Ctl(ctl)
    - ScrollTo(ctlID,containerID)
    - ScrollTo_Ctl(ctl,container)
    - ToggleExpand(ctlID)
    - ToggleExpand_Ctl(ctl)
    - ToggleExpand_CssClass(CssClass)
      
    EVENTS
    - addEventSimple
    - removeEventSimple
    - dispatchEvent(ctlID,evt)
    - dispatchEvent_Ctl(ctl,evt)
    - clickEvent = getClickEvent()
    - getClickEvent()
    - QEvent(EventName)
    
    GET FUNCTIONS
    - getElementsByTagNames
    - getElementsByClassName
    - getStyle(obj,cAttribute)
    
    KEYBOARD CODES
    
    OBJECTS
    - findPos(obj)
    - QDictionary(Name)
    - Screen
    - ScrollToItemCollection
    - ScrollToItem(ctlID,containerID)
    
    MOUSE
    - Mouse
    - isRightClick(event) as boolean
    
    STRINGS
    - Left(string,length)
    - Right(string,length)
    
  
*/

// FUNCTIONS
function AlertObject(obj){ alert(ObjectToString(obj)); }
function BringToTop(ctlID){
    var ctl = document.getElementById(ctlID);
    BringToTop_ctl(ctl);
}
function BringToTop_ctl(ctl){
    $(ctl).css('z-index','2000').parents('div').each(function(){
        var currentIndex = 0;
        $(this).siblings().each(function(){
            if ($(this).css('z-index') > currentIndex){ currentIndex = $(this).css('z-index');}
        });
        $(this).css('z-index',currentIndex);
    });
    $(ctl).css('display','block');    
}
function isDefined(obj){ if (typeof(obj) == 'undefined'){return false;} return true; }
function FindParentFromClass(ctl,CssClass){
    if ($(ctl).hasClass(CssClass)){return ctl;}
    var $parent = $(ctl).parent();
    var found = false;
    while (!found){
        if ($parent.size() > 0){
            if ($parent[0].tagName.toLowerCase() == 'body'){
                return null;
            }
        }   
        if($parent.hasClass(CssClass)){
            found = true;
            return $parent.get()[0];
        }else{$parent = $parent.parent();}
    }
}
function FindScrollContainer(ctl){
    var $parent = $(ctl).parent();
    var found = false;
    while (!found){
        if ($parent.size() > 0){
            if ($parent[0].tagName.toLowerCase() == 'body'){
                return $parent[0];
            }
        }
        var ParentCss = $parent.css('overflow');
        if(ParentCss == 'auto' || ParentCss == 'scroll'){
            found = true;
            return $parent.get()[0];
        }else{
            $parent = $parent.parent();
        }
    }
}
function QGet(Selector){
    if (Left(Selector,1) == '#'){
        Selector = Mid(Selector,1);
        if (typeof(document.getElementById) != 'undefined'){
            return document.getElementById(Selector);
        }else if (document.all){
            return document.all[Selector];
        }
    }
}
function Hide(ctlID){
    var ctl = QGet('#'+ctlID);
    Hide_Ctl(ctl);
}
function Hide_Ctl(ctl){ctl.style.display = 'none';return ctl.style.display;}
function IsNumeric(sText)
{
   sText = sText.toString();
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;

 
   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = false;
         }
      }
   return IsNumber;
   
}
function KeepAlive(){
    $.ajax({
      url: '?qkeepalive=true',
      cache: false,
      success: function(response){}
    });
}
function ObjectToString(obj,tab){
    if (typeof(tab)=='undefined'){tab='';}
    // Loop through the properties/functions
    var properties = '';
    for (var propertyName in obj) {
        // Check if it’s NOT a function
        if (!(obj[propertyName] instanceof Function)) {
            if (typeof(obj[propertyName]) == 'object'){
                properties +='\n'+tab+'+ '+propertyName+':\n'+ObjectToString(obj[propertyName],tab+'    ');
            }else{
                properties +='\n'+tab+'+ '+propertyName+':'+obj[propertyName];
            }
        }
    }
    // Loop through the properties/functions
    var functions = '';
    for (var functionName in obj) {
        // Check if it’s a function
        if (obj[functionName] instanceof Function) {
            functions +='\n'+tab+'+ '+functionName + ', ';
        }
    }
    var sReturn = ''
    if (properties !=''){sReturn+=tab+'Properties : ' + properties;}
    if (functions !=''){sReturn+='\n'+tab+'Functions : '+functions;}
    return sReturn;
}
function Show(ctlID){var ctl = QGet('#'+ctlID);Show_Ctl(ctl);}
function Show_Ctl(ctl){ctl.style.display = 'block';}

function ScrollTo(ctlID,containerID){
    var ctl = document.getElementById(ctlID);
    var container = document.getElementById(containerID);
    ScrollTo_Ctl(ctl,container);
}
function ScrollTo_Ctl(ctl,container){
    if (!container){container = FindScrollContainer(ctl);}
    //var position = findPos(ctl,container);
    //container.scrollTop = position.Top;
    if(container){
        $(container).scrollTo(ctl);
    }else{
        // if none use window
        $.scrollTo(ctl);
    }
    
}
function QSubmitForm(formid,url) {
	var form = document.getElementById(formid);
	form.action = url;
	form.submit();
}
function ToggleExpand(ctlID) {var ctl = QGet('#'+ctlID);ToggleExpand_Ctl(ctl);}
function ToggleExpand_Ctl(ctl) {
    var current = getStyle(ctl,'display');
    if (current.toLowerCase() == 'block') { ctl.style.display = 'none'; } 
    else { ctl.style.display = 'block'; }
    return false;
}
function ToggleExpand_CssClass(CssClass){
    var toggleItems = getElementsByClassName(CssClass);
    for (var i=0;i<toggleItems.length;i++){ToggleExpand_Ctl(toggleItems[i]);}
}

// EVENTS
function addEventSimple(obj,evt,fn) {
	if (obj.addEventListener)
		obj.addEventListener(evt,fn,false);
	else if (obj.attachEvent)
		obj.attachEvent('on'+evt,fn);
}

function removeEventSimple(obj,evt,fn) {
	if (obj.removeEventListener)
		obj.removeEventListener(evt,fn,false);
	else if (obj.detachEvent)
		obj.detachEvent('on'+evt,fn);
}

function dispatchEvent(ctlID,evt) {
    var ctl = document.getElementById(ctlID);
    return dispatchEvent_Ctl(ctl,evt);
}
function dispatchEvent_Ctl(ctl,evt) {
    if (ctl.dispatchEvent)
        ctl.dispatchEvent(clickEvent);
    else if (ctl.fireEvent)
        ctl.fireEvent(evt);
    return true;
}

var clickEvent = getClickEvent();
function getClickEvent() {
    if(document.createEvent) {
        var clickevent=document.createEvent('MouseEvents');
        clickevent.initEvent('click', true, true); //initEvent( 'type', bubbles, cancelable )
        return clickevent;
    }else{
        return 'onclick';
    }
}

function QEvent(EventName){
    this.EventName = EventName;
    this.AddHandler = function(AddressOfFunc){
        $(document).bind(this.EventName,AddressOfFunc);
    }
    this.Raise = function(args){ 
        if(typeof(args) == 'array'){$(document).trigger(this.EventName,args);}
        else{$(document).trigger(this.EventName,[args]);}
    }
}
function QEventArgs(sender, args) {
    this.Sender = sender;
    this.Args = args;
}

// GET FUNCTIONS
function getAutoSubmitMode(value){
    var o = {NotSet:false,None:false,AutoCallBack:false,AutoPostBack:false};
    if(typeof(value)=="undefined"){o.NotSet = true; return o}
    if(value == "NotSet"){ o.NotSet = true; }
    if(value == "None"){ o.None = true; }
    if(value == "AutoCallBack"){ o.AutoCallBack = true; }
    if(value == "AutoPostBack"){ o.AutoPostBack = true; }
    return o;
}
function getQuery(ji) {
    hu = window.location.search.substring(1);
    gy = hu.split("&");
    for (i=0;i<gy.length;i++) {
        ft = gy[i].split("=");
        if (ft[0] == ji) {
            return ft[1];
        }
    }
}
function getStyle(obj,cAttribute){   
    if (obj.currentStyle){
        //if IE
        var curVal=eval('obj.currentStyle.'+cAttribute)
    }else{
        //if Mozilla/FF
        var curVal=eval('document.defaultView.getComputedStyle(obj, null).'+cAttribute)
    }
    return curVal;
}

function getElementsByClassName(classname, node) {
    if(!node) node = document.getElementsByTagName("body")[0];
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}
function getElementsByTagNames(list,obj) {
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}

// KEYBOARD CODES
var KEY_CTL     = 17;
var KEY_ALT     = 18;
var KEY_ENTER   = 13;
var KEY_ESC     = 27;
var KEY_DOWN    = 40;
var KEY_LEFT    = 37;
var KEY_RIGHT   = 39;
var KEY_SHIFT   = 16;
var KEY_UP      = 38;
var KEY_O       = 83;

// OBJECTS
function findPos(obj,parentObj) {
    var Pos = new Object;
    if (!parentObj){parentObj=window;}
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		if (obj.offsetParent != parentObj)
		{
		    while (obj = obj.offsetParent) {
		        if (obj == parentObj){break}
			    curleft += obj.offsetLeft
			    curtop += obj.offsetTop
		    }
		}
	}
	Pos.Left = curleft;
	Pos.Top = curtop;
	return Pos;
}

function QDictionary(Name){
    this.DictionaryName = Name;
    this.Each = function(fn) {
        for (var itm in this.Entries) {
            fn(itm,this.Entries[itm]);
        }
    }
    this.Entries = {};
    this.Add = function(key,value){
        if (!this.Contains(key)){
            this.Entries[key] = value;
        }else{
            alert('Cannot insert, '+key+' already exists in '+this.DictionaryName);
        }
    }
    this.Contains = function(key){
        if (this.Item(key) == null){ return false; }else{ return true; }
    }
    this.Item = function(key){
        var Entry = this.Entries[key];
        if (typeof(Entry) == 'undefined') { return null; }
        return Entry;
    }
    this.Set = function(key,value){
        this.Entries[key] = value;
    }
}

function Screen()
{
    var scr = new Object;

    // **********************************
    // *** innerWidth and innerHeight ***
    // **********************************
    
    var x,y;   
    if (self.innerHeight) // all except Explorer
    {
        x = self.innerWidth;
        y = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight)
        // Explorer 6 Strict Mode
    {
        x = document.documentElement.clientWidth;
        y = document.documentElement.clientHeight;
    }
    else if (document.body) // other Explorers
    {
        x = document.body.clientWidth;
        y = document.body.clientHeight;
    }        
    scr.innerWidth = x;
    scr.innerHeight = y;

    // ************************
    // *** Scrolling Offset ***
    // ************************
    
    var xScrollOffset,yScrollOffset;
    if (self.pageYOffset) // all except Explorer
    {
	    xScrollOffset = self.pageXOffset;
	    yScrollOffset = self.pageYOffset;
    }
    else if (document.documentElement && document.documentElement.scrollTop)
	    // Explorer 6 Strict
    {
	    xScrollOffset = document.documentElement.scrollLeft;
	    yScrollOffset = document.documentElement.scrollTop;
    }
    else if (document.body) // all other Explorers
    {
	    xScrollOffset = document.body.scrollLeft;
	    yScrollOffset = document.body.scrollTop;
    }
    scr.scrollLeft = xScrollOffset;
    scr.scrollTop = yScrollOffset;

    // *************************
    // *** Page Height/Width ***
    // *************************

    var xPage,yPage;
    var test1 = document.body.scrollHeight;
    var test2 = document.body.offsetHeight
    if (test1 > test2) // all but Explorer Mac
    {
	    xPage = document.body.scrollWidth;
	    yPage = document.body.scrollHeight;
    }
    else // Explorer Mac;
         //would also work in Explorer 6 Strict, Mozilla and Safari
    {
	    xPage = document.body.offsetWidth;
	    yPage = document.body.offsetHeight;
    }
    scr.pageWidth = xPage;
    scr.pageHeight = yPage;
    
    return scr;
}

// MOUSE
function Mouse(e) {
    var mousepos = new Object;
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY) 	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY) 	{
		posx = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		posy = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
	// posx and posy contain the mouse position relative to the document
	mousepos.x = posx;
	mousepos.y = posy;
	return mousepos;
}

function mouseX(evt) {if (!evt) evt = window.event; if (evt.pageX) return evt.pageX; else if (evt.clientX)return evt.clientX + (document.documentElement.scrollLeft ?  document.documentElement.scrollLeft : document.body.scrollLeft); else return 0;}
function mouseY(evt) {if (!evt) evt = window.event; if (evt.pageY) return evt.pageY; else if (evt.clientY)return evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop); else return 0;}

function isRightClick(e) {
	var rightclick;
	if (!e) var e = window.event;
	if (e.which) rightclick = (e.which == 3);
	else if (e.button) rightclick = (e.button == 2);
	alert('Rightclick: ' + rightclick); // true or false
	return rightclick;
}

/* *********************************************************************************************** SCROLLTO */
function ScrollToItemCollection()
{
    this.Items = new Array();
    this.Add = function(ScrollToItem) {
        //alert('Add:'+ScrollToItem.ctlID);
        if(ScrollToItem) { this.Items[this.Items.length] = ScrollToItem; } 
    }
    this.Scroll = function()
    {
        for (var i=0;i<this.Items.length;i++){
            ScrollTo(this.Items[i].ctlID,this.Items[i].containerID);
        }
        this.Items = new Array();
    }
    //alert('Instantiated: ScrollToItemCollection.Items:'+this.Items.length);
} 
function ScrollToItem(ctlID,containerID)
{
    this.ctlID = ctlID;
    this.containerID = containerID;
}


// STRINGS
function Left(str, n)
{
        if (n <= 0)     // Invalid bound, return blank string
                return "";
        else if (n > String(str).length)   // Invalid bound, return
                return str;                // entire string
        else // Valid bound, return appropriate substring
                return String(str).substring(0,n);
}

function Right(str, n)
{
        if (n <= 0)     // Invalid bound, return blank string
           return "";
        else if (n > String(str).length)   // Invalid bound, return
           return str;                     // entire string
        else { // Valid bound, return appropriate substring
           var iLen = String(str).length;
           return String(str).substring(iLen, iLen - n);
        }
}

function Mid(str, start, len)
{
        // Make sure start and len are within proper bounds
        if (start < 0 || len < 0){return "";}
        if (len == null){len = str.length - start;}

        var iEnd, iLen = String(str).length;
        if (start + len > iLen)
                iEnd = iLen;
        else
                iEnd = start + len;

        return String(str).substring(start,iEnd);
}
function trim(str, chars) {
    return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}
function parseBool(s) {
    if(s == null){return false;}
    var sLower = s.toLowerCase();
    if(sLower == 'true' || sLower == 1 || sLower == '1' || sLower == 'yes'){return true;}
    return false;
}

