var imagesDirectoryURL = '/Images/';
var javaScriptURL = '/JavaScript/';
var styleSheetsURL = '/StyleSheets/';
var servletsDirectoryURL = '/servlet/';
var calculatorURL = '/Calculator/';
var computerBasicsURL = '/ComputerBasics/';

var statusString = '';
var hex_chr = '0123456789abcdef';
  
//~Nithin, 11-Oct-2006: DOM Independence, Dead Code removal !
var isMac; // This sniffing is allright !
isMac = (navigator.userAgent.toLowerCase().indexOf('mac') != -1);

function OpenLoginWindow() {
    //~Nithin, 09-Jan-2007
    var newWindowWidth  = 800;
    var newWindowHeight = 600;
    //Changed by Jagadeesh for new Web Session Managemnet
    var flag = 'true';

    //~Chaged on 01-Sep-2006, 15-Dec-2006 For WSM: Nithin 
	var win = OpenNewWindow(servletsDirectoryURL + 'Interface?Size=800x600&flag=' + flag,'InterfaceSelection', 
			  newWindowWidth, newWindowHeight, statusString + 'scrollbars=no');
	if( win ) {//30-Jan-2007		  
		win.focus(); // If Window is minimized - Give focus and activate !
	}
    //~End Block Change For WSM: Nithin
}

function HandleLoginPageEvent(event) {
    var keyCode;
    var source;
    var sourceTextField;
    //~Nithin, 11-Oct-2006: DOM Independence
    if (event.which) { // For NetScape
        keyCode = event.which;
        sourceTextField = event.target;
    } else {
        keyCode = event.keyCode;
        sourceTextField = event.srcElement;
    }
    if (keyCode == 13) {
        var otherTextField;
        if (sourceTextField == document.LogInfForm.PP) {
            if (sourceTextField.value.length > 0) {
                doLoginSubmit();
            }
            return true;
        }

        if (sourceTextField == document.LogInfForm.Nf) {
            otherTextField = document.LogInfForm.If;
        } else if (sourceTextField == document.LogInfForm.If) {
            otherTextField = document.LogInfForm.Nf;
        }
        if (sourceTextField.value.length > 0) {
            if (otherTextField.value.length > 0) {
                doLoginSubmit();
            } else {
                otherTextField.focus();
            }
        } else {
            sourceTextField.focus();
        }
    }
    return true;
}

function doLoginSubmit() {
    //~Added on 19-Sep-2006 For WCC: Nithin
    mWinClose = false;
    //~End Block Change For WCC: Nithin
    handleLoginSubmit();
    document.LogInForm.submit();
}

function handleLoginSubmit() {
    //~Nithin, 11-Oct-2006: DOM Independence
    var password = objectFinder('DD').value + objectFinder('If').value.toLowerCase();
    var newPassword = calcMD5(password);
    var fakePassword = '';
    
    for (var i = 0; i < objectFinder('If').value.length; i++)
        fakePassword = fakePassword + '*';
    objectFinder('I').value = newPassword;
    objectFinder('If').value = fakePassword;
    objectFinder('N').value = objectFinder('Nf').value;
    
    var siteSelect = objectFinder('Sf');
    objectFinder('S').value = siteSelect.options[siteSelect.selectedIndex].value;
    return true;
}

// General functions
function OpenNewWindow(urlToOpen) {
    return OpenNewWindow(urlToOpen, urlToOpen, 800, 600, '');//Nithin, 03-Oct-2006
}

function OpenNewWindow(urlToOpen, width, height) {
    return OpenNewWindow(urlToOpen, urlToOpen, width, height, '');
}

//~Changed on 31-Aug-2006 For WSM: Nithin
function OpenNewWindow(urlToOpen, WName, width, height, decorations) {
    return GetNewWindow(urlToOpen, WName, width, height, decorations);
}

/**
 * This function return the size and position of the
 * browser window. 
 * 
 * ~ Nithin, 08-Jan-2007
 * SMe v1.7
 */
function GetWindowSizeAndPositionString() {
	//Added By Nithin Meshram for WCC
    var sWd = window.screen.width;// availWidth;
    var sHt = window.screen.height;// availHeight;
    
    //Changed by Uday - 26th Sept-06
    var wWd = 800;
    var wHt = 600;
    //End of change - Uday - 26th Sept-06
    // Place in the center
    var lpos = (sWd - wWd) / 2; 
    var tpos = (sHt - wHt) / 2; 
    //~Changed: 18-Jan-2007: Nithin
    if( !isMac ) {
    	lpos = lpos - 20;
    	tpos = tpos - 30;
    }    
    
    var winAttrs   = 'status=no,menubar=no,location=no,scrollbars=no,resizable=no';
    var szString   = 'width=' + wWd + ',height=' + wHt;
    var posString  = 'left=' + lpos + ',top=' + tpos; 
    var specString = winAttrs + ',' + szString + ',' + posString;  
	//~End Block: 18-Jan
	
    return specString;
}

//01-Feb-2007: Nith.
function GetNewWindow(urlToOpen, WdName, width, height, decorations) {
    var newWindow = null;
    // ~Nithin, 08-Jan-2007
    var specString = GetWindowSizeAndPositionString();
      
    //Only Login window needs be a Popup with desired window attrs
    //~Changed : 23-Oct-2006,01-Feb-2007 : Nithin
    if ( document.title == 'SuccessMaker Enterprise' ){ //window.name == '' ) {
    	newWindow = window.open(urlToOpen, '', specString );
	    //newWindow.name = 'SMApp'; 
	    
		//~Nithin: 17-Jan-2006: For IE7, IE6 And Safari 2.0.4
		//Close Start window silently	
		window.open( '', '_parent', '' );
		window.opener = this;
		self.close();
		//01-Feb-2007: Nith.
		if( newWindow.opener ) {
			try{
				newWindow.opener.close();
			} catch ( e ) {
				//Ignore
			}
		}
    }else {//All windows open in the same window. : 27-Oct-2006
    	newWindow = window.open('', '_self', specString);
    	// For Safari on Intel Mac with upd 4.2.2 or higher
    	/**
    	 * Create a new property for use with the Window Name References
    	 * elsewhere : Nithin, 26-Oct-2006
    	 */
    	newWindow.Tag =  WdName; 
    	newWindow.location.href = urlToOpen;
    }
    return newWindow;
}

function GetHTML(bodyHTML, scripts, bodyTags) {
    // no title (for when creating a frame's HTML)
    return GetHTMLWithTitle(bodyHTML, scripts, '', bodyTags);
}

function GetHTMLWithStyleSheet(bodyHTML, scripts, bodyTags, styleSheet, title) {
    var frame = '';

    if ((bodyTags != null) && (bodyTags.length == 0)) {
        bodyTags = null;
    }

    frame += '<HTML><HEAD>\n';
    frame += '<TITLE>' + title + '</TITLE>\n';
    frame += '<META http-equiv="Expires" content="-1">\n';
    if (styleSheet != null && styleSheet == 'noStyleSheet')
        frame += '<!-- No stylesheet Tags -->';
    else
        frame += '<LINK rel="stylesheet" type="text/css" href="' + styleSheetsURL + styleSheet + '">\n';
    for (var scriptIndex = 0; scriptIndex < scripts.length; scriptIndex++) {
        frame += '<SCRIPT language="JavaScript" src="' + javaScriptURL + scripts[scriptIndex] + 'Script.js"></SC' + 'RIPT>\n';
    }
    frame += '</HEAD>\n';
    if (bodyTags != null && bodyTags == 'noBody')
        frame += '<!-- No Body Tags -->';
    else
        frame += '<BODY class="smallmargin" marginheight="0" marginwidth="0"' + (bodyTags != null ? ' ' + bodyTags : '') + '>\n';
    frame += bodyHTML;
    if (bodyTags != null && bodyTags == 'noBody')
        frame += '<!-- No Body Tags -->';
    else
        frame += '</BODY>\n';
    frame += '</HTML>\n';
    return frame;
}

function GetHTMLWithTitle(bodyHTML, scripts, title, bodyTags) {
    var frame = '';
    if ((bodyTags != null) && (bodyTags.length == 0)) {
        bodyTags = null;
    }

    frame += '<HTML><HEAD>\n';
    frame += '<TITLE>' + title + '</TITLE>\n';
    //~Changed on 01-Sep-2006 For WSM: Nithin
    frame += '<META http-equiv="Expires" content="-1">\n';
    //~End Block Change For WSM: Nithin
    frame += '<LINK rel="stylesheet" type="text/css" href="' + styleSheetsURL + 'MainSheet.css">\n';
    for (var scriptIndex = 0; scriptIndex < scripts.length; scriptIndex++) {
        frame += '<SCRIPT language="JavaScript" src="' + javaScriptURL + scripts[scriptIndex] + 'Script.js"></SC' + 'RIPT>\n';
    }
    //~Added : 23-Oct-2006 For WCC: Nithin
    frame += '<SCRIPT language="JavaScript">';
    frame += '</SCRIPT>';    
    //~End Add
    frame += '</HEAD>\n';
    if (bodyTags != null && bodyTags == 'noBody')
        frame += '<!-- No Body Tags -->';
    else
        frame += '<BODY class="smallmargin" marginheight="0" marginwidth="0"' + (bodyTags != null ? ' ' + bodyTags : '') + '>\n';
    frame += bodyHTML;
    if (bodyTags != null && bodyTags == 'noBody')
        frame += '<!-- No Body Tags -->';
    else
        frame += '</BODY>\n';
    frame += '</HTML>\n';
    return frame;
}

function WriteBlankFrame() {
    return GetHTML('', new Array(), null);
}

//~Nithin, 11-Oct-2006: Dead Code removal !
// Macromedia Dreamweaver standard functions (MM_*)
function MM_showHideLayers() { //v1.2
    var i, visStr, args, theObj;
    args = MM_showHideLayers.arguments;
    
	/**
	 * Changed the legacy code to support Graphic Animation in
	 * ClassRoom Interface on Safari
	 * 
	 * Nithin,
	 * 28-Dec-2006
	 */
    for (i = 0; i < args.length; i += 2) { 
        visStr   = args[ i + 1 ];
		if ( document.getElementById ) { //27-Dec-2006, Nithin
            if (visStr == 'show') 
            	visStr = 'visible'; //convert vals
            if (visStr == 'hide') 
            	visStr = 'hidden';
            // Go by W3C and NOT by MS... - Nithin
            theObj = document.getElementById( args[ i ] );
            if ( theObj ) {
            	theObj.style.visibility = visStr;
            } 
        }  
    }// for all elements
}

function MM_preloadImages() { //v3.0
    var d = document;
    if (d.images) {
        if (!d.MM_p) d.MM_p=new Array();
        var i,j=d.MM_p.length,a=MM_preloadImages.arguments;
        for (i=0; i<a.length; i++)
            if (a[i].indexOf("#")!=0) {
                d.MM_p[j]=new Image;
                d.MM_p[j++].src=a[i];
            }
    }
}

function MM_swapImage() { //v1.2
    var i,j=0,objStr,obj,swapArray=new Array,oldArray=document.MM_swapImgData;
    for (i=0; i < (MM_swapImage.arguments.length-2); i+=3) {
        objStr = MM_swapImage.arguments[(navigator.appName == 'Netscape')?i:i+1];
        if ((objStr.indexOf('document.layers[')==0 && document.layers==null) ||
                (objStr.indexOf('document.all[')==0 && document.all==null))
            objStr = 'document'+objStr.substring(objStr.lastIndexOf('.'),objStr.length);
        obj = eval(objStr);
        if (obj != null) {
            swapArray[j++] = obj;
            swapArray[j++] = (oldArray==null || oldArray[j-1]!=obj)?obj.src:oldArray[j];
            obj.src = MM_swapImage.arguments[i+2];
        }
    }
    document.MM_swapImgData = swapArray; //used for restore
}

function addToArray(inArray, value) {
    var tempArray = new Array(inArray.length + 1);
    for (var i = 0; i < inArray.length; i++) {
        tempArray[i] = inArray[i];
    }
    tempArray[inArray.length] = value;
    return tempArray;
}

function rhex(num) {
    str = "";
    for (j = 0; j <= 3; j++)
        str += hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) +
               hex_chr.charAt((num >> (j * 8)) & 0x0F);
    return str;
}

/*
* Convert a string to a sequence of 16-word blocks, stored as an array.
* Append padding bits and the length, as described in the MD5 standard.
*/
function str2blks_MD5(str) {
    nblk = ((str.length + 8) >> 6) + 1;
    blks = new Array(nblk * 16);
    for (i = 0; i < nblk * 16; i++)
        blks[i] = 0;
    for (i = 0; i < str.length; i++)
        blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * 8);
    blks[i >> 2] |= 0x80 << ((i % 4) * 8);
    blks[nblk * 16 - 2] = str.length * 8;
    return blks;
}

/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally 
* to work around bugs in some JS interpreters.
*/
function add(x, y) {
    var lsw = (x & 0xFFFF) + (y & 0xFFFF);
    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    return(msw << 16) | (lsw & 0xFFFF);
}

/*
* Bitwise rotate a 32-bit number to the left
*/
function rol(num, cnt) {
    return(num << cnt) | (num >>> (32 - cnt));
}

/*
* These functions implement the basic operation for each round of the
* algorithm.
*/
function cmn(q, a, b, x, s, t) {
    return add(rol(add(add(a, q), add(x, t)), s), b);
}

function ff(a, b, c, d, x, s, t) {
    return cmn((b & c) | ((~b) & d), a, b, x, s, t);
}

function gg(a, b, c, d, x, s, t) {
    return cmn((b & d) | (c & (~d)), a, b, x, s, t);
}

function hh(a, b, c, d, x, s, t) {
    return cmn(b ^ c ^ d, a, b, x, s, t);
}

function ii(a, b, c, d, x, s, t) {
    return cmn(c ^ (b | (~d)), a, b, x, s, t);
}

/*
* Take a string and return the hex representation of its MD5.
*/
function calcMD5(str) {
    x = str2blks_MD5(str);
    a =  1732584193;
    b = -271733879;
    c = -1732584194;
    d =  271733878;

    for (i = 0; i < x.length; i += 16) {
        olda = a;
        oldb = b;
        oldc = c;
        oldd = d;

        a = ff(a, b, c, d, x[i+ 0], 7 , -680876936);
        d = ff(d, a, b, c, x[i+ 1], 12, -389564586);
        c = ff(c, d, a, b, x[i+ 2], 17,  606105819);
        b = ff(b, c, d, a, x[i+ 3], 22, -1044525330);
        a = ff(a, b, c, d, x[i+ 4], 7 , -176418897);
        d = ff(d, a, b, c, x[i+ 5], 12,  1200080426);
        c = ff(c, d, a, b, x[i+ 6], 17, -1473231341);
        b = ff(b, c, d, a, x[i+ 7], 22, -45705983);
        a = ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
        d = ff(d, a, b, c, x[i+ 9], 12, -1958414417);
        c = ff(c, d, a, b, x[i+10], 17, -42063);
        b = ff(b, c, d, a, x[i+11], 22, -1990404162);
        a = ff(a, b, c, d, x[i+12], 7 ,  1804603682);
        d = ff(d, a, b, c, x[i+13], 12, -40341101);
        c = ff(c, d, a, b, x[i+14], 17, -1502002290);
        b = ff(b, c, d, a, x[i+15], 22,  1236535329);

        a = gg(a, b, c, d, x[i+ 1], 5 , -165796510);
        d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
        c = gg(c, d, a, b, x[i+11], 14,  643717713);
        b = gg(b, c, d, a, x[i+ 0], 20, -373897302);
        a = gg(a, b, c, d, x[i+ 5], 5 , -701558691);
        d = gg(d, a, b, c, x[i+10], 9 ,  38016083);
        c = gg(c, d, a, b, x[i+15], 14, -660478335);
        b = gg(b, c, d, a, x[i+ 4], 20, -405537848);
        a = gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
        d = gg(d, a, b, c, x[i+14], 9 , -1019803690);
        c = gg(c, d, a, b, x[i+ 3], 14, -187363961);
        b = gg(b, c, d, a, x[i+ 8], 20,  1163531501);
        a = gg(a, b, c, d, x[i+13], 5 , -1444681467);
        d = gg(d, a, b, c, x[i+ 2], 9 , -51403784);
        c = gg(c, d, a, b, x[i+ 7], 14,  1735328473);
        b = gg(b, c, d, a, x[i+12], 20, -1926607734);

        a = hh(a, b, c, d, x[i+ 5], 4 , -378558);
        d = hh(d, a, b, c, x[i+ 8], 11, -2022574463);
        c = hh(c, d, a, b, x[i+11], 16,  1839030562);
        b = hh(b, c, d, a, x[i+14], 23, -35309556);
        a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
        d = hh(d, a, b, c, x[i+ 4], 11,  1272893353);
        c = hh(c, d, a, b, x[i+ 7], 16, -155497632);
        b = hh(b, c, d, a, x[i+10], 23, -1094730640);
        a = hh(a, b, c, d, x[i+13], 4 ,  681279174);
        d = hh(d, a, b, c, x[i+ 0], 11, -358537222);
        c = hh(c, d, a, b, x[i+ 3], 16, -722521979);
        b = hh(b, c, d, a, x[i+ 6], 23,  76029189);
        a = hh(a, b, c, d, x[i+ 9], 4 , -640364487);
        d = hh(d, a, b, c, x[i+12], 11, -421815835);
        c = hh(c, d, a, b, x[i+15], 16,  530742520);
        b = hh(b, c, d, a, x[i+ 2], 23, -995338651);

        a = ii(a, b, c, d, x[i+ 0], 6 , -198630844);
        d = ii(d, a, b, c, x[i+ 7], 10,  1126891415);
        c = ii(c, d, a, b, x[i+14], 15, -1416354905);
        b = ii(b, c, d, a, x[i+ 5], 21, -57434055);
        a = ii(a, b, c, d, x[i+12], 6 ,  1700485571);
        d = ii(d, a, b, c, x[i+ 3], 10, -1894986606);
        c = ii(c, d, a, b, x[i+10], 15, -1051523);
        b = ii(b, c, d, a, x[i+ 1], 21, -2054922799);
        a = ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
        d = ii(d, a, b, c, x[i+15], 10, -30611744);
        c = ii(c, d, a, b, x[i+ 6], 15, -1560198380);
        b = ii(b, c, d, a, x[i+13], 21,  1309151649);
        a = ii(a, b, c, d, x[i+ 4], 6 , -145523070);
        d = ii(d, a, b, c, x[i+11], 10, -1120210379);
        c = ii(c, d, a, b, x[i+ 2], 15,  718787259);
        b = ii(b, c, d, a, x[i+ 9], 21, -343485551);

        a = add(a, olda);
        b = add(b, oldb);
        c = add(c, oldc);
        d = add(d, oldd);
    }
    return rhex(a) + rhex(b) + rhex(c) + rhex(d);
}

function styleFinder(target) {
    if (document.layers != null)
        return objectFinder(target);
    else
        return objectFinder(target).style;
}

function isArray(a) {
    return isObject(a) && a.constructor == Array;
}

function isBoolean(a) {
    return typeof a == 'boolean';
}

function isEmpty(o) {
    var i, v;
    if (isObject(o)) {
        for (i in o) {
            v = o[i];
            if (isUndefined(v) && isFunction(v)) {
                return false;
            }
        }
    }
    return true;
}

function isFunction(a) {
    return typeof a == 'function';
}

function isNull(a) {
    return a === null;
}

function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}

function isObject(a) {
    return (a && typeof a == 'object') || isFunction(a);
}

function isString(a) {
    return typeof a == 'string';
}

function isUndefined(a) {
    return typeof a == 'undefined';
}

//13-Oct-2006
function frameFinder( strObjectId  ) {
    var object;
    var objframe = window.top.frames; 
    var frameLen = ( objframe != null ? objframe.length : 0 );
    
       for ( var i = 0; i < frameLen; i++ ) {
            // IE 5
			if( strObjectId == objframe[i].name ){
				object = objframe[i];
			} else {
	            if (objframe[i].document.all) {
	                object = objframe[i].document.all(strObjectId)
	            } else if (objframe[i].document.getElementById != null) { // safari
	                object = objframe[i].document.getElementById(strObjectId)
	            } else if (objframe[i].document.layers != null) {
	                object = NS4ObjectFinder(objframe[i].document, strObjectId);
	            }
			}	
					
         	if ( object != null ) {
            	break;
			}
       }

    return object;
}
	
/*
 * Modified to find and object in the Frame hierarchy !
 * For LDM we have Multiple windows ( reference to 'top' )
 * So the additional parameter was added !
 * 
 * Nithin Meshram 
 * Modified  02-Oct-2006
 * Revisited 11-Oct-2006
 * Since SMe v1.7
 */
function objectFinder(strObjectId ) {
    var object;
    
    // Check for a document with frames - WE HATE THEM!
    object = frameFinder ( strObjectId );
    //NO FRAMES NOW
    if( object == null ) {
		if (document.all) {
	        object = document.all(strObjectId)
	    } else if (document.getElementById != null) { // safari
	        object = document.getElementById(strObjectId)
	    } else if (document.layers != null) {
	        object = NS4ObjectFinder(window.document, strObjectId);
	    }
    }
    
    return object;
}

function NS4ObjectFinder(objDocument, strID) {
    var objObject = null;
    var myIndex = 0;
    if (objDocument[strID] != null)
        objObject = objDocument[strID];

    for (myIndex = 0; myIndex < objDocument.forms.length; myIndex++) {
        if (objDocument.forms[myIndex][strID] != null) {
            objObject = objDocument.forms[myIndex][strID];
            break;
        }
    }

    if (objObject == null) {
        if ( objDocument.layers.length > 0 ) {
            for (myIndex = 0; myIndex < objDocument.layers.length; myIndex++) {
                objObject = NS4ObjectFinder( objDocument.layers[myIndex].document, strID );
                if (objObject != null) {
                    break;
                }
            }
        }
    }
    return objObject;
}

// Added: 1-Feb-2007
var req;

function loadXMLDoc(url) {
    // branch for native XMLHttpRequest object
    if ( window.XMLHttpRequest ) {
        req = new XMLHttpRequest();
        req.onreadystatechange = processReqChange;
        req.open("GET", url, true);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if ( window.ActiveXObject ) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
    }
}

function processReqChange(myFunctionToExec) {
	// only if req shows "complete"
	if ( req.readyState == 4 ) {
		// only if "OK"
		if ( req.status == 200 ) {
			// Specific XML processing statements - i.e. calls to
			// ES which wraps DA via servlets or web service etc.
			switch ( myFunctionToExec ) {
				case x:
				case y:
				case z:
				default:
			}
		} else {
			alert("There was a problem retrieving the XML data:\n" + req.statusText);
		}
	}
}

