﻿// ecelearn common javascript

// stop IE 6 from downloading background images everytime element is resized
try { document.execCommand("BackgroundImageCache", false, true); } catch (e) {};

var gPopupWindow = null;
var gPopupWindowDimensions = { width: 900, height: 800 };

// link which opens up in a popup window has been clicked
function OnClickWindowLink(e, width, height)
{
    FixEvent(e);
    e.preventDefault();
    var link = e.target;
    while(link.tagName.toLowerCase() != 'a' && link.parentNode)
    {
        link = link.parentNode;
    }
    var url = link.getAttribute('href');
    if(!url)
    {
        return;
    }
    else if(gPopupWindow && !gPopupWindow.closed)
    {
        gPopupWindow.focus();
        gPopupWindow.location = url;
        return;
    }
    var d = GetPageDimensions();
    var scroll = GetPageScroll();
    if(!width)
    {
        width = gPopupWindowDimensions.width;
    }
    if(!height)
    {
        height = Math.min(d.clientHeight, gPopupWindowDimensions.height);
    }
    // get window position from difference between click window position and document position
    var left = e.screenX - e.pageX + scroll.x + d.clientWidth / 2 - width/2; // center window on page content
    var top = e.screenY - e.pageY + scroll.y;                           // set window top at page top
    gPopupWindow = window.open(url, "linkWindow", "width=" + width + ",height=" + height + ",scrollbars=yes,resizable=yes,location=yes,left=" + left + ",top=" + top + ",screenX=" + left + ",screenY=" + top);
}

// makes all links within an element open in a popup window
function PopupExternalLinks(parent)
{
    if(!parent)
    {
        return;
    }
    var links = parent.getElementsByTagName('a');
    var urlRegex = new RegExp('^https?:\/\/(?!' + document.location.host + '($|\/))', 'i');
    for(var k in links)
    {
        var a = links[k];
        if(!a.getAttribute)
        {
            continue;
        }
        var url = a.href;
        if(url && urlRegex.test(url))
        {
            AddEventListener(a, 'click', OnClickWindowLink);
        }
    }
}

// Returns the width and height of the current page
function GetPageDimensions()
{
	var d = { width: 0, height: 0, clientWidth: 0, clientHeight: 0 };
	// dimensions of the viewport
    if(window.innerWidth)
    {
        d.clientWidth = window.innerWidth;
        d.clientHeight = window.innerHeight;
    }
    else if(document.documentElement && document.documentElement.clientWidth)
    {
        d.clientWidth = document.documentElement.clientWidth;
        d.clientHeight = document.documentElement.clientHeight;
    }
    else if(document.body)
    {
        d.clientWidth = document.body.clientWidth;
        d.clientHeight = document.body.clientHeight;
    }
    // dimensions of the page
    d.width = Math.max(document.body.scrollWidth, document.body.offsetWidth);
	d.height = Math.max(document.body.scrollHeight, document.body.offsetHeight);
	return d;
}

function GetPageScroll()
{
    var p = { x: 0, y: 0 };
    if(window.pageYOffset !== undefined)
    {
        p.x = window.pageXOffset;
        p.y = window.pageYOffset;
    }
    else if(document.documentElement && document.documentElement.scrollTop !== undefined)
    {
        p.x = document.documentElement.scrollLeft;
        p.y = document.documentElement.scrollTop;
    }
    else if(document.body)
    {
        p.x = document.body.scrollLeft;
        p.y = document.body.scrollTop;
    }
    return p;
}

// Returns the x and y position of the current page
function GetPagePosition()
{
    var p = { x: 0, y: 0 };
    if(window.screenX !== undefined)
    {
        p.x = window.screenX;
        p.y = window.screenY;
    }
    else
    {
        p.x = window.screenLeft;
        p.y = window.screenTop;
    }
    return p;
}

// Toggle the visibility of an element
function ToggleElementVisible(id)
{
    var el = document.getElementById(id);
    if(el)
    {
        el.style.display = (el.style.display == 'none') ? '' : 'none';
    }
}

function ShowElement(id,display)
{
    var el = document.getElementById(id);
    if(el)
    {
        el.style.display = display ? display : 'block';
    }
}

function HideElement(id)
{
    var el = document.getElementById(id);
    if(el)
    {
        el.style.display = 'none';
    }
}
function CssHover(tdItem,PopupMenu)
{
 
    var el = document.getElementById(tdItem);
    var el2 = document.getElementById(PopupMenu);
    if(el && el2)
    {      
       
        el2.style.display = 'block'; 
        el.className = 'editStudyGuideHover';
    }
}
function CssNormal(tdItem,PopupMenu)
{

    var el = document.getElementById(tdItem);
    var el2 = document.getElementById(PopupMenu);
    if(el && el2)
    { 
         
         el2.style.display = 'none'; 
          el.className = 'editStudyGuide'; 
          el.width = '96%';
       
    }
    
}
// Returns the position of a mouse event relative to the page
function GetMousePosition(e)
{
    var p = { x: e.clientX, y: e.clientY };
    if (window.scrollX !== undefined)
    {
        p.x += window.scrollX;
        p.y += window.scrollY;
    }
    else
    {
        p.x += document.documentElement.scrollLeft + document.body.scrollLeft;
        p.y += document.documentElement.scrollTop + document.body.scrollTop;
    }
    return p;
}

// Returns the position of an element relative to the page
function GetElementPosition(el)
{
	var p = { x: 0, y: 0 };
	if(!el)
	{
	    return p;
	}
	var parent = el;
	while (parent.offsetParent)
	{
		p.x += parent.offsetLeft;
		p.y += parent.offsetTop;
		parent = parent.offsetParent;
	}
	parent = el;
	while(parent = parent.parentNode && parent != document.body)
	{
        if(parent.scrollX !== undefined)
        {
            p.x -= parent.scrollX;
            p.y -= parent.scrollY;
        }
        else if(parent.scrollLeft !== undefined)
        {
            p.x -= parent.scrollLeft;
            p.y -= parent.scrollTop;
        }
    }
	return p;
}

// Creates a browse cookie
function CreateCookie(name, value, time, path, skipEncode)
{
  
    if(!skipEncode)
    {
        value = escape(value);
    }
	var cookie = name + '=' + value + '; ';
	if (time) {
		var date = new Date();
		date.setTime(date.getTime() + time);
		cookie = 'expires=' + date.toGMTString() + '; ';
	}
	if(!path)
	{
	    path = '/';
	}
	cookie += 'path=' + path;
	document.cookie = cookie;
}

// Reads and returns the contents of a browser cookie
function ReadCookie(name, skipUnencode)
{
	var nameEQ = name + '=';
	var cookies = document.cookie.split(';');
	for(var i = 0; i < cookies.length; i++) {
		var c = cookies[i];
		c = c.replace(/^\s+/,'');
		if (c.indexOf(nameEQ) == 0)
	    {
	        var value = c.substring(nameEQ.length,c.length);
	        if(skipUnencode)
	        {
	            return value;
	        }
	        else
	        {
    	        return unescape(value);
    	    }
	    }
	}
	return null;
}

// Deletes a browser cookie
function DeleteCookie(name)
{
	CreateCookie(name,'');
}

// Parses the boolean value of a string
function parseBoolean(b)
{
    if(typeof(b) === 'string')
    {
        return b.toLowerCase() === 'true';
    }
    else
    {
        return Boolean(b);
    }
}

// Set cursor position
function setSelectionRange(input, selectionStart, selectionEnd) {
    if (input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', selectionEnd);
        range.moveStart('character', selectionStart);
        range.select();
    }
    else if (input.setSelectionRange) {
        input.focus();
        input.setSelectionRange(selectionStart, selectionEnd);
    }
}

// fix ie event object to be compatible with w3c events
function FixEvent(e)
{
    if(!e)
    {
        e = window.event;
    }
    if(!e.target)
    {
        e.target = e.srcElement;
    }
    if(!e.preventDefault)
    {
        e.preventDefault = function() { this.returnValue = false; };
    }
    if(!e.stopPropagation)
    {
        e.stopPropagation = function() { this.cancelBubble = true; };
    }
    if (e.pageX === undefined)
    {
		e.pageX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		e.pageY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}
	return e;
}

// Add an event handler to an object
function AddEventListener(obj, eventName, handler, capture)
{
	if(obj.addEventListener)
	{
	    // standard event
		obj.addEventListener(eventName, handler, capture);
	}
	else if(obj.attachEvent)
	{
	    // IE event
		obj.attachEvent('on' + eventName, handler);
	}
	else
	{
	    // Ye olde evente
		obj['on' + eventName] = handler;
	}
}

// Remove an event handler from an object
function RemoveEventListener(obj, eventName, handler, capture)
{
	if(obj.removeEventListener)
	{
	    // standard event
		obj.removeEventListener(eventName, handler, capture);
	}
	else if(obj.attachEvent)
	{
	    // IE event
		obj.detachEvent('on' + eventName, handler);
	}
	else
	{
	    // old event
		obj['on' + eventName] = null;
	}
}

function FireEvent(el, eventName, eventArgs)
{
    if(!eventArgs)
    {
        eventArgs = { };
    }
    var evObj;
    if(document.createEvent)
    {
        switch(eventName)
        {
            case 'abort': case 'blur': case 'change': case 'error': case 'focus': case 'load': case 'reset': case 'resize': case 'scroll':
            case 'select': case 'submit': case 'unload': default:
                evObj = document.createEvent('Events');
                evObj.initEvent(eventName, true, true);
                break;
            case 'DOMActivate': case 'DOMFocusIn': case 'DOMFocusOut':
                evObj = document.createEvent('UIEvents');
                evObj.initUIEvent(eventName, true, true, self, eventArgs.detail);
                break;
            case 'keydown': case 'keypress': case 'keyup':
                if(window.KeyEvent)
                {
                    // firefox only
                    evObj = document.createEvent('KeyEvents');
                    evObj.initUIEvent(eventName, true, true, self, eventArgs.ctrlKey, eventArgs.altKey, eventArgs.shiftKey, eventArgs.metaKey,
                        eventArgs.keyCode, eventArgs.charCode);
                }
                else
                {
                    evObj = document.createEvent('UIEvents');
                    evObj.initUIEvent(eventName, true, true, self, eventArgs.detail);
                    evObj.keyCode = eventArgs.keyCode;
                }
                break;
            case 'click': case 'mousedown': case 'mousemove': case 'mouseout': case 'mouseover': case 'mouseup':
                evObj = document.createEvent('MouseEvents');
                evObj.initMouseEvent(eventName, true, true, self, eventArgs.screenX, eventArgs.screenY, eventArgs.clientX, eventArgs.clientY,
                    eventArgs.ctrlKey, eventArgs.altKey, eventArgs.shiftKey, eventArgs.metaKey, eventArgs.button, eventArgs.relatedTarget);
                break;
            case 'DOMAttrModified': case 'DOMNodeInserted': case 'DOMNodeRemoved': case 'DOMCharacterDataModified':
            case 'DOMNodeInsertedIntoDocument': case 'DOMNodeRemovedFromDocument': case 'DOMSubtreeModified':
                evObj = document.createEvent('MutationEvents');
                evObj.initMutationEvent(eventName, true, true, self, eventArgs.prevValue, eventArgs.newValue, eventArgs.attrName,
                    eventArgs.attrChange);
            break;
        }
        el.dispatchEvent(evObj);
    }
    else if(document.createEventObject)
    {
        // IE
        var evObj = document.createEventObject();
        evObj.target = el;
        for(var k in eventArgs)
        {
            evObj[k] = eventArgs;
        }
        el.fireEvent('on' + eventName, evObj);
    }
    if(el['on' + eventName])
    {
        el['on' + eventName](evObj);
    }
}

// Print the contents of a page
//  this function only loads the page into a hidden frame
//  the page itself must call print on body.onload
function PrintPage(url)
{
    self.frames.frmPrint.location.href = url;
}

// Add a stylesheet to the page
function AddStyleSheet(url, media)
{
    var headElement = document.getElementsByTagName('head')[0];         
	var cssNode = document.createElement('link');
	cssNode.type = 'text/css';
	cssNode.rel = 'stylesheet';
	cssNode.href = url;
	if(media)
	{
    	cssNode.media = media;
    }
	headElement.appendChild(cssNode);
}

// Enable or disable a link element
function SetLinkEnabled(link, enabled)
{
    if(link.enabled === undefined)
    {
        link.enabled = true;
    }
    if(enabled == Boolean(link.enabled))
	{
		return;
	}
	link.enabled = enabled;
	if(enabled)
	{
		link.href = link.disabledhref;
		link.onclick = link.disabledonclick;
		link.className = link.disabledClass;
	}
	else
	{
		link.disabledhref = link.href;
		link.disabledonclick = link.onclick;
		link.removeAttribute('href');
		link.onclick = function() { return false; };
		link.disabledClass = link.className;
		link.className = (link.disabledClass + 'Disabled');
	}
}

// Create a delegate for an object method
function CreateDelegate(obj, method)
{
    if(arguments.length > 2)
    {
        return function() { method.apply(obj, arguments.slice(2)) };
    }
    else
    {
        return function() { method.call(obj) };
    }
}

// activate the flash control automatically
function CreateFlashObject(DivID, WIDTH, HEIGHT, URL)
{
    document.getElementById(DivID).innerHTML =
        '<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' +
        'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0"' +
        ' WIDTH=' + WIDTH + ' HEIGHT=' + HEIGHT + ' id="f-intro" ALIGN="">' +
        '<PARAM NAME=movie VALUE=' + URL + '> <PARAM NAME=quality VALUE=high> <PARAM NAME=scale VALUE=noscale> <PARAM NAME=wmode VALUE=transparent> <PARAM NAME=bgcolor VALUE=#FFFFFF>' +
       '<PARAM NAME="autoStart" value="-1"><EMBED src=' + URL + ' quality=high scale=noscale wmode=transparent bgcolor=#FFFFFF  WIDTH=' + WIDTH + ' HEIGHT=' + HEIGHT + ' NAME="flash" ALIGN=""' +
       'TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED></OBJECT>';
}

function ClearFormInput(parent)
{
    var inputs = parent.getElementsByTagName('input');
    for(var k = 0; k < inputs.length; k++)
    {
        var type = inputs[k].type;
        type = type || type.toLowerCase();
        if(!type || type == 'text' || type == 'password' || type == 'file')
        {
            inputs[k].value = '';
        }
        else if(type == 'radio' || type == 'checkbox')
        {
            inputs[k].checked = false;
        }
    }
    var textareas = parent.getElementsByTagName('textarea');
    for(var k = 0; k < textareas.length; k++)
    {
        textareas[k].value = '';
    }
    var selects = parent.getElementsByTagName('select');
    for(var k = 0; k < selects.length; k++)
    {
        selects[k].value = '';
    }
}

// Add the Extends method to all classes
// which allows it to inherit from another class
Function.prototype.Extends = function(parentClass)
{
    for(var k in parentClass.prototype)
    {
        this.prototype[k] = parentClass.prototype[k];
    }
    this.prototype.base = parentClass.prototype;
}

if(!String.prototype.trim)
{
    String.prototype.trim = function()
    {
        return this.replace(/^\s+/,'').replace(/\s+$/,'');
    }
}

String.prototype.stripHtml = function()
{
    var ignoreTags = arguments;
    if(ignoreTags.length > 0 && typeof(ignoreTags[0]) == 'object')
    {
        ignoreTags = ignoreTags[0];
    }
    var regex = ignoreTags && ignoreTags.length > 0 ? new RegExp('<(?!/?(' + String.join('|', ignoreTags) + ')(\\s|/|>))[^>]+>', 'g') : /<[^>]+>/g;
    return this.replace(/&nbsp;/g,' ').replace(regex, '');
}

String.prototype.containsHtml = function()
{
    var ignoreTags = arguments;
    if(ignoreTags.length > 0 && typeof(ignoreTags[0]) == 'object')
    {
        ignoreTags = ignoreTags[0];
    }
    var regex = ignoreTags && ignoreTags.length > 0 ? new RegExp('<(?!/?(' + String.join('|', ignoreTags) + ')(\\s|/|>))[^>]+>') : /<[^>]+>/;
    return regex.test(this);
}

if(!String.join)
{
    String.join = function(chr, arr)
    {
        if(!arr || !arr.length)
        {
            return '';
        }
        var str = '';
        for(var k = 0; k < arr.length; k++)
        {
            if(k > 0)
            {
                str += chr;
            }
            str += arr[k];
        }
        return str;
    }
}

//Is this correct? It looks to me like it would overwrite the last item in the array... -ds
if(!Array.prototype.push)
{
    Array.prototype.push = function(item)
    {
        this[this.length - 1] = item;
    }
}

var gDebugElement = null;

function Debug(str)
{
    if(!gDebugElement)
    {
        gDebugElement = document.createElement("ul");
        gDebugElement.className = 'debug';
        document.body.insertBefore(gDebugElement, document.body.childNodes[0]);
    }
    var item = document.createElement('li');
    item.innerHTML = str;
    gDebugElement.appendChild(item);
    gDebugElement.scrollTop = gDebugElement.scrollHeight;
}

function trimText(sString)
{
    while (sString.substring(0,1) == ' ')
    {
        sString = sString.substring(1, sString.length);
    }
    while (sString.substring(sString.length-1, sString.length) == ' ')
    {
        sString = sString.substring(0,sString.length-1);
    }
    return sString;
}

// ------------Section start: page auto refresh-------------
function setPageAutoRefresh(refreshInterval)
{
    var refreshIntervalInMs = refreshInterval * 1000;

    // return the timeout handler
    return setTimeout("window.location.reload()", refreshIntervalInMs);
}
// -------------Section end: page auto refresh--------------

// -------------Imminent timeout warning-------------------
var savedTimeDelay;
function setPageTimeoutWarning(timeDelay)
{
    if (timeDelay!=-1) //Use the timedelay given
    {
        savedTimeDelay = timeDelay;
    }
    else //Use the previously saved timedelay (hopefully there is one...)
    {
        timeDelay = savedTimeDelay;
    }
    var timeDelayInMs = timeDelay * 1000;

    // return the timeout handler
    return setTimeout("showTimeoutWarning()", timeDelayInMs);
}

function showTimeoutWarning()
{
    if (confirm("Your eceLearn session is due to time out."+'\n'+ 
                "Click 'Ok' if you are still working, or 'Cancel' to do nothing."+'\n'+'\n'+
                "Refresh your eceLearn login information?"))
                {
                PageMethods.RefreshSession(refreshSuccessful,refreshFailed);
                }
                else
                {
                //Do nothing. (Might want to log them off?)
                }
}
function refreshSuccessful(result, userContext, methodName)
{
setPageTimeoutWarning(-1);  //-1 means use the previous timedelay.
//alert(result);
}
function refreshFailed(result, userContext, methodName)
{
//alert(result);
alert ("Could not restore session.");
}

function logAjaxError(message)
{
    //PageMethods.RefreshSession(refreshSuccessful,refreshFailed);
    PageMethods.LogAjaxError(message, logErrorSuccessful, logErrorFailed);
}
function logErrorSuccessful(result, userContext, methodName)
{
//alert(result);
}
function logErrorFailed(result, userContext, methodName)
{
//alert(result);
//alert ("Could not restore session.");
}

//Function that accepts only integers
function maskKeyPress(objEvent)
{
    var shiftKeyLeft = objEvent.shiftLeft;
    var shiftKeyRight = objEvent.shiftKey;
    var specialChar = false;
    var charCode = (objEvent.which) ? objEvent.which : event.keyCode
    // Check any special characters are entered
    if(shiftKeyLeft == true || shiftKeyRight == true)
    {
        if( (charCode >= 46 && charCode <= 57 ) || (charCode >= 96 && charCode <= 105) )
        {
            specialChar = true;
        }
        else
        {
            specialChar = false;
        }
    }
    if(specialChar == false)
    {
        //Accepts backspace, delete, numerics, numerics in numpad
        if ( charCode == 8 || (charCode >= 46 && charCode <= 57 ) || (charCode >= 96 && charCode <= 105) )
        return true;
    }
    return false;
}
