﻿/* GENERIC TOOLS JS FILE
 * CREATED: 28 Jul 2008
 * AUTHOR: Jako van Rensburg
 */

var general = {
    /* GENERAL SECTION
     * CREATED: 28 JUL 2008
     * AUTHOR: Jako van Rensburg
     */

    /* LOAD JS FILE INTO PAGE */
    loadJSFile: function(jsPath) {
        if (jsPath != '') {
            if (!$(jsPath)) {
                $ce('script',
                {
                    'src':jsPath + '?' + escape(document.lastModified),
                    'id':jsPath,
                    'type':'text/javascript'
                },{},document.getElementsByTagName("head")[0]);
            }
        }
    },

    /* REMOVE JS FILE FROM PAGE */
    deleteJSFile: function(jsPath) {
        if ($(jsPath)) {
            $(jsPath).parentNode.removeChild($(jsPath));
        }
    },

    /* RETURN AVAILABLE WINDOW HEIGHT */
    returnWindowHeight: function() {
        $d('JS Function', 'returnWindowHeight');
        var h = 0;
        if (window.document.innerHeight > h) {
            h = window.document.innerHeight;
        }
        else {
            if (window.document.documentElement.clientHeight > h) {
                h = window.document.documentElement.clientHeight;
            }
            else {
                if (window.document.body.clientHeight > h) {
                    h = window.document.body.clientHeight;
                }
            }
        }
        return h;
    },

    /* FIND POSITION X (LEFT OR RIGHT) OF AN ELEMENT ON THE PAGE */
    findElementPosX: function(obj){
        $d('JS Function', 'findElementPosX: ' + obj.id);
        var curleft = 0;
        if (obj.offsetParent) {
            while (1) {
                curleft += obj.offsetLeft;
                if (!obj.offsetParent) {
                    break;
                }
                obj = obj.offsetParent;
            }
        }
        else {
            if (obj.x) {
                curleft += obj.x;
            }
        }
        return curleft;
    },

    /* FIND POSITION Y (TOP OR BOTTOM) OF AN ELEMENT ON THE PAGE */
    findElementPosY: function(obj){
        $d('JS Function', 'findElementPosY: ' + obj.id);
        var curtop = 0;
        if (obj.offsetParent) {
            while (1) {
                curtop += obj.offsetTop;
                if (!obj.offsetParent) {
                    break;
                }
                obj = obj.offsetParent;
            }
        }
        else {
            if (obj.y) {
                curtop += obj.y;
            }
        }
        return curtop;
    },

    /* WINDOW.ALERT REPLACEMENT :)
     * MESSAGE: MMM...
     * OKTEXT: THE TEXT ON THE FIRST BUTTON
     * ONOKCLICK: THE FUNCTION THAT THE FIRST BUTTON WILL EXECUTE ONCLICK
     * <-- OPTIONAL VARIABLES -->
     * ## IF NOT SUPPLIED, BUTTON WONT BUILD ##
     * CANCELTEXT: THE TEXT ON THE SECOND BUTTON
     * ONCANCELCLICK: THE FUNCTION THAT THE FIRST BUTTON WILL EXECUTE ONCLICK
     */
    alert: function(message, okText, onOkClick, cancelText, onCancelClick){
        $d('JS Function', 'Showing Alert!');
        var tableHTML = '';
        tableHTML = '<table class="alertBox"><tr><td align="center" style="padding:10px; padding-left:0px; white-space:nowrap;">' + message + '</td></tr><tr><td align="center">';
        if (okText) {
            tableHTML += '<input id="btnAlertOK" type="button" class="buttons" value="' + okText + '" />';
        }
        if (cancelText) {
            tableHTML += '&nbsp;<input id="btnAlertCancel" type="button" class="buttons" value="' + cancelText + '" />';
        }
        tableHTML += '</td></tr></table>';
        general.setModalHTML(tableHTML);
        if (onOkClick) {
            if($('btnAlertOK')) {
                $('btnAlertOK').onclick = onOkClick;
            }
        }
        if (onCancelClick) {
            if($('btnAlertCancel')) {
                $('btnAlertCancel').onclick = onCancelClick;
            }
        }
        general.showModal();
    },

    /* SHOW MODAL */
    showModal: function(){
        $d('JS Function', 'showModal');
        general.hideLoader();
        window.scroll(0, 0);
        $('divOverlay').style.display = '';
        $('lawDeedModalDiv').style.display = '';
    },

    /* HIDE MODAL */
    hideModal: function(){
        $d('JS Function', 'hideModal');
        window.scroll(0, 0);
        $('lawDeedModalContentDiv').style.backgroundColor = '#FFFFFF';
        $('lawDeedModalDiv').style.display = 'none';
        $('divOverlay').style.display = 'none';
    },

    previousModalHTML:'',
    /* SET CONTENTS OF MODAL */
    setModalHTML: function(html){
        general.previousModalHTML = $('lawDeedModalContentDiv').innerHTML;
        $d('JS Function', 'setModalHTML');
        $hd('lawDeedModalContentDiv','');
        $hd('lawDeedModalContentDiv',html);
    },

    /* SET THE MODAL BACKGROUND COLOR */
    setModalBackColor: function(color) {
        $d('JS Function', 'setModalBackColor');
        $('lawDeedModalContentDiv').style.backgroundColor = color;
    },

    /* SHOW LITTLE LOADING SPINNER */
    showLoader: function(){
        $d('JS Function', 'showLoader');
        if ($('divOverlayLoad').style.display != '') {
            $('divOverlayLoad').style.display = '';
            $('divLoader').style.display = '';
        }
    },

    /* HIDE LITTLE LOADING SPINNER */
    hideLoader: function(){
        $d('JS Function', 'hideLoader');
        $('divOverlayLoad').style.display = 'none';
        $('divLoader').style.display = 'none';
    },

    /* RETURNS HTML FOR LOADING MESSAGE */
    returnLoadingHTML: function(){
        $d('JS Function', 'returnLoadingHTML');
        return '<table style="width: 100%;"><tr><td align="center"><table style="background-color: #FFFFFF;"><tr><td style="padding: 2px;"><img src="images/load.gif" alt="" /></td><td style="white-space: nowrap; padding: 2px;">Loading, please wait...</td></tr></table></td></tr></table>';
    },

    /* SWITCH BETWEEN TABS AND THEIR CONTENT ON THE MODAL 
     * NOT VERY GENERIC AT THE MOMENT, ONLY SUPPORTS 2 TABS :(
     */
    switchModalTab: function(tabObj,backgroundActive,backgroundInActive,divToShow,divToHide) {
        $d('JS Function', 'switchModalTab: backgroundActive: '+backgroundActive+'<br />backgroundInActive: '+backgroundInActive+'<br />divToShow: '+divToShow+'<br />divToHide: '+divToHide);
        $('modalTab1').style.backgroundImage = 'url(images/modalTabInActive1.jpg)';
        $('modalTab2').style.backgroundImage = 'url(images/modalTabInActive2.jpg)';
        $(divToShow).style.display = '';
        $(divToHide).style.display = 'none';
        if (tabObj.style.backgroundImage.toString() == 'url('+backgroundActive+')') {
            tabObj.style.backgroundImage = 'url('+backgroundInActive+')';
        }
        else {
            tabObj.style.backgroundImage = 'url('+backgroundActive+')';
        }
    },

    /* CONVERTS A OBJECT TO A DELIMETED STRING
     * RETURNS: 'Username==John|Password==pass''
     */
    objectToString: function(obj) {
        var stringToReturn = '';
        for (var prop in obj) {
            if (obj.hasOwnProperty(prop)) {
                stringToReturn += prop + '==' + obj[prop] + '|';
            }
        }
        return stringToReturn;
    },

    /* CONVERTS A DELIMITED STRING TO AN OBJECT
     * PASS: 'Username==John|Password==pass', '|', '=='
     * RETURNS: {Username: 'John', Password: 'pass'}
     */
    createObjectFromStringList: function(stringList, outsideDelimeter, insideDelimeter){
        $d('JS Function', 'createObjectFromStringList: stringList: '+stringList+'<br />outsideDelimeter: '+outsideDelimeter+'<br />insideDelimeter: '+insideDelimeter);
        var stringArray = stringList.split(outsideDelimeter);
        returnObject = {};
        for (var i = 0; i < stringArray.length; i++) {
            var innerSplit = stringArray[i];
            var innerArray = innerSplit.split(insideDelimeter);
            returnObject[innerArray[0]] = innerArray[1];
        }
        return returnObject;
    },

    /* QUERY URL STRING FOR PARAMETERS
     * SIMILAR TO: Request.QueryString("Value")
     */
    queryString: function(name){
        $d('JS Function', 'queryString: name: '+name);
        name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
        var regexS = "[\\?&]" + name + "=([^&#]*)";
        var regex = new RegExp(regexS);
        var results = regex.exec(window.location.href);
        if (results == null) {
            return "";
        }
        else {
            return results[1];
        }
    },

    /* SORT DROPDOWN BOX */
    sortSelect: function(obj){
        $d('JS Function', 'sortSelect: obj: '+obj.id);
        var i = 0;
        var o = [];
        for (i = 0; i < obj.options.length; i++) {
            o[o.length] = new Option(obj.options[i].text, obj.options[i].value, obj.options[i].defaultSelected, obj.options[i].selected);
        }
        if (o.length == 0) {
            return;
        }
        o = o.sort(function(a, b){
            if ((a.text + "") < (b.text + "")) {
                return -1;
            }
            if ((a.text + "") > (b.text + "")) {
                return 1;
            }
            return 0;
        });
        for (i = 0; i < o.length; i++) {
            obj.options[i] = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
        }
    },

    /* CHECK IF DROPDOWN CONTAINS ANY ITEMS */
    hasOptions: function(obj){
        $d('JS Function', 'hasOptions: obj: '+obj.id);
        if (obj != null && obj.options != null) {
            return true;
        }
        return false;
    },

    /* MOVE OPTION FROM ONE DROPDOWN TO ANOTHER */
    moveSelectedOptions: function(from, to){
        $d('JS Function', 'moveSelectedOptions: from: '+from.id+'<br />to: '+to.id);
        var i = 0;
        var o = [];
        var index = 0;
        for (i = 0; i < from.options.length; i++) {
            o = from.options[i];
            if (o.selected) {
                if (!general.hasOptions(to)) {
                    index = 0;
                }
                else {
                    index = to.options.length;
                }
                to.options[index] = new Option(o.text, o.value, false, false);
            }
        }
        for (i = (from.options.length - 1); i >= 0; i--) {
            o = from.options[i];
            if (o.selected) {
                from.options[i] = null;
            }
        }
        if ((arguments.length < 3) || (arguments[2] == true)) {
            general.sortSelect(from);
            general.sortSelect(to);
        }
        from.selectedIndex = -1;
        to.selectedIndex = -1;
    },

    /* REDIRECT TO THE LOGIN PAGE */
    logMeOut: function(clicked){
        $d('JS Function', 'logMeOut');
        general.setModalHTML('<table style="width: 100%;"><tr><td align="center"><table style="background-color: #FFFFFF;"><tr><td style="padding: 2px;"><img src="images/load.gif" alt="" /></td><td style="white-space: nowrap; padding: 2px;">Please wait, while the system prepares to log you out...</td></tr></table></td></tr></table>');
        general.showModal();
        deleteCookie('LoginToken');
        deleteCookie(general.queryString('Token') + 'LAWDeedPage');
        if (clicked) {
            //RESET THE DATE OF LAST ACTIVITY
            var pl = new SOAPClientParameters();
            pl.add("Token", general.queryString('Token'));
            pl.add("stringToReturn", general.queryString('Token'));
            SOAPClient.invoke(wsURL.general, "USERS_UPDATE_User_Activity", pl, true, function(result){
                setTimeout(function(){window.location = 'http://' + document.domain + '/lawdeedsite';}, 3000);
            }, false);
        }
        else {
            setTimeout(function(){window.location = 'http://' + document.domain + '/lawdeedsite';}, 3000);
        }
    },

    /* HIDE ANY FLOATING TOOLS DIVS ON THE PAGE */
    hideAnyToolsDivs: function(){
        $d('JS Function', 'hideAnyToolsDivs');
        if ($('webMailToolsDiv')) {
            $('webMailToolsDiv').style.display = 'none';
            dashBoard.hideCurrentWebMailTools();
        }
        if ($('divDatepicker')) {
            $('divDatepicker').style.display = 'none';
        }
        if ($('datepickeriframe')) {
            $('datepickeriframe').style.display = 'none';
        }
        // HIDE HELP
        help.hideTooltip();
    },

    /* BUILD BLANK DROPDOWN FOR SELECTING PURPOSES */
    returnBlankDropDownHTML: function(id){
        $d('JS Function', 'returnBlankDropDownHTML');
        return '<select id="' + id + '" class="dropDowns" style="width:200px;"><option value="0">.: Please Select :.</option></select>';
    },

    /* SHOW DOCUMENT VIEWER 
     * IF PDF, USE MODAL, ELSE OPEN DIALOG
     */
    loadDocument: function(documentName){
        $d('JS Function', 'loadDocument: documentName: '+documentName);
        general.setModalHTML('<table cellspacing="0" cellpadding="0"><tr><td class="boxHeading"><table cellspacing="0" cellpadding="0" style="width: 100%;"><tr><td>Document Viewer</td><td align="right"><img src="images/icons/cross_black.gif" alt="Close" title="Close" style="cursor:pointer;" onclick="general.hideModal();" /></td></tr></table></td></tr><tr><td class="boxContentTD" style="padding:0px; margin:0px;"><iframe id="docFrame" style="height:350px; width:780px; margin:0px; padding:0px;" margin="0" frameborder="0" scrolling="no"></iframe></td></tr></table>');
        if (documentName.match('pdf') == 'pdf' || documentName.match('txt') == 'txt') {
            general.showModal();
        }
        else {
            if (documentName.match('xls') == 'xls' || documentName.match('doc') == 'doc') {
                if (BrowserDetect.browser == 'Explorer') {
                    general.showModal();
                }
                else {
                    general.hideModal();
                }
            }
            else {
                general.hideModal();
            }
        }
        $('docFrame').src = documentName;
    },

    returnErrorHTML: function() {
        $d('JS Function', 'returnErrorHTML');
        return  '<div><div style="font-size:14px;border-bottom:solid 1px #D3D3D3;padding-bottom:5px;">' +
                    'Application Error' +
                '</div>' +
                '<div style="font-size:10px;color:#333333;font-weight:normal;padding:2px;">' +
                    'This error has already been sent to our support team for analysis. Note that a copy of this error has <br />been stored under your Web Mail "Support Calls" folder for reference.<br /><br />Should this problem prevent you from working, please contact us on <strong>0860 44 3333</strong>' +
                '</div></div>';
    },

    /* PREPAIR DATA FOR LAWDEED ERROR EMAIL */
    reportError: function(){
        $d('JS Function', 'reportError');
        try {
            general.showLoader();
            var debugConsole = '';
            debugConsole = debug.message.toString();
            var errorDataString = '';
            errorDataString = '##FullName##=' + global.userfullname + '|' + '##UserName##=' + global.username + '|' + '##EmailAddress##=' + global.useremail + '|' + '##DebugDump##=' + debugConsole;
            general.sendGeneralErrorEmailDataString('jakor@ideed.co.za', 'system@lawdeed.co.za', 'L@WDeed - Error!', 'ErrorTemplate.txt', errorDataString);
        } 
        catch (e) {
            general.hideLoader();
            general.hideModal();
        }
    },

    /* SEND EMAIL TO LAWDEED, ERROR REPORT */
    sendGeneralErrorEmailDataString: function(toAddress, fromAddress, subject, bodyTemplate, dataString){
        $d('JS Function', 'sendGeneralErrorEmailDataString: toAddress: '+toAddress+'<br />fromAddress: '+fromAddress+'<br />subject: '+subject+'<br />bodyTemplate: '+bodyTemplate);
        var pl = new SOAPClientParameters();
        pl.add("Token", general.queryString('Token'));
        pl.add("ToAddress", toAddress);
        pl.add("FromAddress", fromAddress);
        pl.add("Subject", subject);
        pl.add("BodyTemplate", bodyTemplate);
        pl.add("DataString", dataString);
        SOAPClient.invoke(wsURL.email, "EMAIL_SendErrorGeneralEmail_DataString", pl, true, function(result){
                $l(result);
                general.hideModal();
                if (debug.isDump == true) {
                    debug.isDump = false;
                    general.hideLoader();
                    window.open('http://'+document.domain+'/'+global.applicationName+'/_DebugDumps/'+result);
                }
        }, false);
    },

    /* POPUP LITTLE DIV, NEXT TO SPECIFIED OBJECT 
     * THAT WILL CONTAIN A IMAGE THUMBNAIL
     */
    showImagePreview: function(attachObj, imageURL){
        $d('JS Function', 'showImagePreview: attachObj: '+attachObj.id+'<br />imageURL: '+imageURL);
        var posX = '';
        var posY = '';
        posX = general.findElementPosX(attachObj);
        posY = general.findElementPosY(attachObj);
        if ($('divImagePreview')) {
            $('imgPreviewImage').src = imageURL;
            $('divImagePreview').style.top = (parseInt(posY, 10) + 30) + 'px';
            $('divImagePreview').style.left = (parseInt(posX, 10) + 30) + 'px';
            $('divImagePreview').style.display = '';
        }
        else {
            $ce('div',
            {
                'id':'divImagePreview',
                'innerHTML':'<img id="imgPreviewImage" src="' + imageURL + '" alt="" title="" style="width:120px; height:120px;" />'
            },
            {
                'position':'absolute',
                'top':(parseInt(posY, 10) + 30) + 'px',
                'left':(parseInt(posX, 10) + 30) + 'px',
                'zIndex':'100000',
                'width':'120px',
                'height':'120px',
                'padding':'4px',
                'backgroundColor':'#FFFFFF',
                'border':'solid 1px #D3D3D3'
            },document.getElementsByTagName("form")[1]);
        }
    },

    /* GENERIC DISABLE/ENABLE OF OBJECTS 
     * ACCEPTS ELEMENT ID ARRAY, THEN EITHER DISABLE/ENABLE THEM
     */
    onclickEvents: {},
    enableObjects: function(objects){
        $d('JS Function', 'enableObjects');
        for (var i = 0; i < objects.length; i++) {
            if ($(objects[i])) {
                animate._removeOpacity($(objects[i]).id);
                $(objects[i]).style.cursor = 'pointer';
                if ($(objects[i]).onclick) {
                    if (general.onclickEvents[objects[i]]) {
                        $d('JS Function', 'enableObjects: Restoring Function --> ' + $(objects[i]).onclick + ' from ' + objects[i]);
                        $(objects[i]).onclick = general.onclickEvents[objects[i]];
                    }
                }
            }
        }
    },
    blankFunction: function(){return false;},
    disableObjects: function(objects){
        $d('JS Function', 'disableObjects');
        for (var i = 0; i < objects.length; i++) {
            if ($(objects[i])) {
                animate.fadeObject($(objects[i]),100,50,5);
                $(objects[i]).style.cursor = 'default';
                if ($(objects[i]).onclick) {
                    if (!general.onclickEvents[objects[i]]) {
                        general.onclickEvents[objects[i]] = $(objects[i]).onclick;
                        $d('JS Function', 'enableObjects: Removing Function --> ' + $(objects[i]).onclick + ' from ' + objects[i]);
                        $(objects[i]).onclick = general.blankFunction;
                    }
                }
            }
        }
    },

    /* PRINT DIV */
    printMe: function(whatToPrint, injectCSS) {
        var prtContent = {};
        var winPrint = {};
        winPrint =  window.open('','','left=0,top=0,width=700,height=500,toolbar=0,scrollbars=0,status=0');
        if ($(whatToPrint)) {
            prtContent = $(whatToPrint);
            winPrint.document.write('<style>' + injectCSS + '</style>' + prtContent.innerHTML);
        }
        else {
            winPrint.document.write('<style>' + injectCSS + '</style>' + whatToPrint);
        }
        winPrint.document.close();
        winPrint.focus();
        winPrint.print();
        winPrint.close();
    },

    /* VALIDATE EMAIL ADDRESS */
    emailCheck: function(txtObj, emailStr) {
        help.hideTooltip();
		var emailPat=/^(.+)@(.+)$/;
		var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
		var validChars="\[^\\s" + specialChars + "\]";
		var quotedUser="(\"[^\"]*\")";
		var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
		var atom=validChars + '+';
		var word="(" + atom + "|" + quotedUser + ")";
		var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
		var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
		var matchArray=emailStr.match(emailPat);
		if (matchArray==null) {
			help.showTooltip('EmailValidation',txtObj,'The email address is not in the correct format!',{width:120,offsetX:(txtObj.offsetWidth+16),offsetY:5,enableHeading:false,arrowPos:'left',canShowAgain:true,hideClose:true});
			return false;
		}
		var user=matchArray[1];
		var domain=matchArray[2];
		if (user.match(userPat)==null) {
		    help.showTooltip('EmailValidation',txtObj,'The email address does not contain a username!',{width:120,offsetX:(txtObj.offsetWidth+16),offsetY:5,enableHeading:false,arrowPos:'left',canShowAgain:true,hideClose:true});
		    return false;
		}
		var atomPat=new RegExp(atom,"g");
		var domArr=domain.match(atomPat);
		var len=domArr.length;
		if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3) {
		   help.showTooltip('EmailValidation',txtObj,'The email address must finish with a dominion of two or three letters!',{width:120,offsetX:(txtObj.offsetWidth+16),offsetY:5,enableHeading:false,arrowPos:'left',canShowAgain:true,hideClose:true});
		   return false;
		}
		if (len<2) {
		   help.showTooltip('EmailValidation',txtObj,'The email address is missing a hostname!',{width:120,offsetX:(txtObj.offsetWidth+16),offsetY:5,enableHeading:false,arrowPos:'left',canShowAgain:true,hideClose:true});
		   return false;
		}				
		return true;
	}
};

/* WINDOW OVERRIDE FUNCTIONS */
window.onresize = function() {
    /* RESIZE WEBMAIL DIV AGAIN */
    if ($('webMailDiv')) {
        if ($('webMailDiv').style.display == '') {
            $('webMailListDiv').style.height = (general.returnWindowHeight() - 190) + 'px';
            $('searchDivResults').style.height = (general.returnWindowHeight() - 230) + 'px';
            if (BrowserDetect.browser == 'Explorer') {
                $('webMailListDiv').style.paddingRight = '12px';
                $('searchDivResults').style.paddingRight = '12px';
            }
        }
    }
};
window.alert = function(message){general.alert(message,'OK',function(){general.hideModal();});};

/* INITIAL LOAD */
plugins.detect();
