﻿function addEvent(elm, evType, fn)
{
	if (elm.addEventListener){
	    var useCapture = false;
		elm.addEventListener(evType, fn, useCapture);
	} else if (elm.attachEvent){
		var r = elm.attachEvent("on"+evType, fn);
	} 
};

function fInitMenu(menuId){
    var divExpandMenu = document.getElementById(menuId);
    var arrButtons = divExpandMenu.children;
    for(var j=0;j<arrButtons.length;j++){
        addEvent(arrButtons[j],'mouseover',fVtabBtnOver);
        addEvent(arrButtons[j],'mouseout',fVtabBtnOut);
    }
};

function fVtabBtnOver(e){
    e.cancelBubble=true;
    var el = e.srcElement;
    if(!el.clicked)el.className = 'vtab-over';
    var dIv = el.parentElement;
    fShowVmenu(dIv,true);
};

function fVtabBtnOut(e){
    e.cancelBubble=true;
    var el = e.srcElement;
    if(!el.clicked)el.className = 'vtab-out';
    var dIv = el.parentElement;
    fShowVmenu(dIv,false);

};

function fShowVmenu(dvId,bShow){
    if(bShow!=null){//bypass call from actual event
        if(dvId.show!=bShow)window.setTimeout(function(){fShowVmenu(dvId)},200);
        dvId.show = bShow;
        dvId.check = 0;
        return;
    }else{
        if(dvId.check++<5){
           window.setTimeout(function(){fShowVmenu(dvId)},200);
           return;
        }
    }

    var divMenu = dvId;
    var btnPlus =divMenu.firstChild; 
    
    if(divMenu.show){
        $(divMenu).animate({width:'160px'},'fast')
        btnPlus.style.visibility='hidden';
    }else{
        $(divMenu).animate({width:'27px'},'fast')
        btnPlus.style.visibility='visible';
    }
};



function fLoadXmlDoc(source){
    if(!source)return null;
    var xmlDoc = fGetXmlDoc();

    if(typeof source == 'string'){
        xmlDoc.loadXML(source);
        if(xmlDoc.xml)return xmlDoc;
        source = document.getElementById(source);
    }
    var sXml = (source.xml)?source.xml:source.innerHTML;      
    xmlDoc.loadXML(sXml);
    return xmlDoc; 
};


function fGetXmlDoc(){
    var xmlDoc;
    if (window.ActiveXObject){
      try{xmlDoc = new ActiveXObject("Msxml2.DOMDocument.6.0");return xmlDoc;}catch(e){};
      try{xmlDoc = new ActiveXObject("Msxml2.DOMDocument.5.0");return xmlDoc;}catch(e){};
      try{xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");return xmlDoc;}catch(e){};
      try{xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");return xmlDoc;}catch(e){};
      try{xmlDoc = new ActiveXObject("Msxml.DOMDocument");return xmlDoc;}catch(e){};
    }else if(document.implementation){
      try{xmlDoc=document.implementation.createDocument("","",null);return xmlDoc}catch(e){};
    }
	alert("XMLDocument not supported!");
    return null;
};


function getXmlHttpObject(){

    var xReq;
	if (window.XMLHttpRequest.create){
	    try{xReq = window.XMLHttpRequest.create();return xReq;}catch(e){};
	}else if (window.XMLHttpRequest){
	    try{xReq = new XMLHttpRequest();return xReq;}catch(e){};
	}else if (window.ActiveXObject){
	  try{xReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");return xReq;}catch(e){};
	  try{xReq = new ActiveXObject("MSXML2.XMLHTTP.5.0");return xReq;}catch(e){};
	  try{xReq = new ActiveXObject("MSXML2.XMLHTTP.4.0");return xReq;}catch(e){};
	  try{xReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");return xReq;}catch(e){};
      try{xReq = new ActiveXObject("Microsoft.XMLHTTP");return xReq;}catch(e){};
	}
	alert("XMLHttpRequest not supported!");
	return null;
};



function fLoadXmlFile(fname){
    var xmlDoc = fGetXmlDoc();
    if(document.getElementById(fname))fname = document.getElementById(fname);
    xmlDoc.async=false;
    xmlDoc.load(fname);
    return xmlDoc;
};

function fLoadXmlFileAsync(fname){
    var xmlDoc = fGetXmlDoc();
    xmlDoc.async=true;
    xmlDoc.load(fname);
    return xmlDoc;
};

function fLoadAsync(post_url, post_data, callback){
	var http = getXmlHttpObject();
	if(!http)return;
	http.onreadystatechange = function(){if(http.readyState == 4)callback(http.responseText)};
	http.open("POST", post_url);
	http.send(post_data);
	return false;
};


function fShowTransform(xmlDoc,xslDoc,targetId)
{
    if(typeof xmlDoc == 'string'){
        var xDoc = fGetXmlDoc();
        xDoc.loadXML(xmlDoc);
        xmlDoc = xDoc;
    }
    
    var target = document.getElementById(targetId);
    // code for IE
    if (window.ActiveXObject){
      xslDoc.resolveExternals = true;
      xslDoc.setProperty('AllowXsltScript','true');
      var ex=xmlDoc.transformNode(xslDoc);
      target.innerHTML=ex;
    }
    // code for Mozilla, Firefox, Opera, etc.
    else if (document.implementation && document.implementation.createDocument){
      var xsltProcessor=new XSLTProcessor();
      xsltProcessor.importStylesheet(xslDoc);
      var resultDocument = xsltProcessor.transformToFragment(xmlDoc,document);
      target.innerHTML = "";
      target.appendChild(resultDocument);
    }
};


function fSetParamValue(xDoc, sParmName, sParmValue){
    if(!xDoc.xml)return null;
    var xConfig = xDoc.selectSingleNode('//config');
    var xParm = xConfig.selectSingleNode('param[@name="'+sParmName+'"]');
    if(!xParm){
        xParm = xDoc.createElement('param');
        xParm.setAttribute('name',sParmName);
        xConfig.appendChild(xParm);
    }
    xParm.setAttribute('value', sParmValue);

    if (!sParmValue) {
        xConfig.removeChild(xParm);
    }
    
    return xDoc;
};


function fJqSortTable(sTableID) {

    var tSorted = $('#' + sTableID).tablesorter();
    tSorted.addClass('tablesorter');

    var thHeadCells = $('#' + sTableID + ' thead tr th');

    thHeadCells.attr('title', 'Sort');

    thHeadCells.hover(function() {
        $(this).addClass('in');
    }, function() {
        $(this).removeClass('in');
    });


    var arrTrs = $('#' + sTableID + ' tbody tr');

    $(arrTrs.selector + ':odd').addClass('odd');

    $(arrTrs.selector + ':even').addClass('even');

    arrTrs.hover(function() {

        $(this).addClass('in');
    }, function() {
        $(this).removeClass('in');
    });

    arrTrs.click(function() {
        var oSelectedRow = tSorted[0].selectedRow;
        if (oSelectedRow) {
            oSelectedRow.removeClass('selected');
        };

        tSorted[0].selectedRow = $(this);
        $(this).removeClass('in');
        $(this).addClass('selected');

    })
};


function fGetTimeArray() {
    var dt = new Date();
    var arrTimes = new Array();
    
    for (var h=0;h<23;h++){
        for (var m = 0; m < 59; m+=15) {
            dt.setHours(h, m, 0, 0);
            arrTimes.push(fFormatTime(dt));
        }
    }
    return arrTimes;
};

function fFormatDate(dat) {
    var vRetVal = '';
    try {
        var da = new Date(dat); // Create a Date Object set to parm date
        if (isNaN(da)) return '';
        var dy = da.getFullYear(); // Get full year (as opposed to last two digits only) 
        var dm = da.getMonth() + 1; // Get month and correct it (getMonth() returns 0 to 11) 
        var dd = da.getDate(); // Get date within month 
        //if ( dy < 1970 ) dy = dy + 100; // if we have to fix the millennium bug 
        var ys = new String(dy); // Convert year, month and date to strings 
        var ms = new String(dm);
        var ds = new String(dd);
        if (ms.length == 1) ms = "0" + ms; // Add leading zeros to month and date if required 
        if (ds.length == 1) ds = "0" + ds;
        vRetVal = ms + '/' + ds + '/' + ys; // Combine year, month and date in ISO format 
    } catch (ex) { };
    return vRetVal.toString();
};

function fFormatDateMPI(dat) {
    var vRetVal = '';
    try {
        var da = new Date(dat); // Create a Date Object set to parm date
        if (isNaN(da)) return '';
        var dy = da.getFullYear(); // Get full year (as opposed to last two digits only) 
        var dm = da.getMonth() + 1; // Get month and correct it (getMonth() returns 0 to 11) 
        var dd = da.getDate(); // Get date within month 
		
	    var month = new Array(12);
        month[0] = "January";
        month[1] = "February";
        month[2] = "March";
        month[3] = "April";
        month[4] = "May";
        month[5] = "June";
        month[6] = "July";
        month[7] = "August";
        month[8] = "September";
        month[9] = "October";
        month[10] = "November";
        month[11] = "December";		
		

		
        //if ( dy < 1970 ) dy = dy + 100; // if we have to fix the millennium bug 
        var ys = new String(dy); // Convert year, month and date to strings 
		var ms = month[da.getMonth()];

		//var ms = new String(dm);
		
		
        var ds = new String(dd);
        
        if (ds.length == 1) ds = "0" + ds;
        vRetVal = ms + ' ' + ds +  ', ' + ys; // Combine year, month and date in ISO format 
    } catch (ex) { };
    return vRetVal.toString();
};

function fFormatTime(dat) {
    var vRetVal = '';
    try {
        if (dat.length < 12) return '';
        var da = new Date(dat);
        if (isNaN(da)) return '';

        var iHour = da.getHours();

        var a_p = (iHour < 12) ? 'AM' : 'PM';

        if (iHour == 0) {
            iHour = 12;
        }
        if (iHour > 12) {
            iHour -= 12;
        }
        var h = new String(iHour);
        var m = new String(da.getMinutes());

        if (m.length == 1) m = '0' + m;

        vRetVal = h + ':' + m + ' ' + a_p;
    } catch (ex) { }
    return vRetVal.toString();
};



function fFormatDateNum(dat) {
    var vRetVal = '';
    try {
        var da = new Date(dat); // Create a Date Object set to parm date
        if (isNaN(da)) return '';
        var dy = da.getFullYear(); // Get full year (as opposed to last two digits only) 
        var dm = da.getMonth() + 1; // Get month and correct it (getMonth() returns 0 to 11) 
        var dd = da.getDate(); // Get date within month 
        //if ( dy < 1970 ) dy = dy + 100; // if we have to fix the millennium bug 
        var ys = new String(dy); // Convert year, month and date to strings 
        var ms = new String(dm);
        var ds = new String(dd);
        if (ms.length == 1) ms = "0" + ms; // Add leading zeros to month and date if required 
        if (ds.length == 1) ds = "0" + ds;
        vRetVal = ys + ms + ds; // Combine year, month and date in Numeric format 
    } catch (ex) { };
    return vRetVal.toString();
};

function fFormatDateMonthNameYear(dat) {
    var vRetVal = '';
    try {
        var da = new Date(dat);
        if (isNaN(da)) return '';

        var month = new Array(12);
        month[0] = "January";
        month[1] = "February";
        month[2] = "March";
        month[3] = "April";
        month[4] = "May";
        month[5] = "June";
        month[6] = "July";
        month[7] = "August";
        month[8] = "September";
        month[9] = "October";
        month[10] = "November";
        month[11] = "December";

        vRetVal = month[da.getMonth()] + ' ' + da.getFullYear();
    } catch (ex) { };
    return vRetVal.toString();
};

function fFormatDateDay(dat) {
    var vRetVal = '';
    try {
        var da = new Date(dat);
        if (isNaN(da)) return '';
        var dd = da.getDate();
        vRetVal = dd;
    } catch (ex) { };
    return vRetVal.toString();
};


function isDate(dat) {
    try {
        var da = new Date(dat);
        if (isNaN(da)) return false;
    } catch (e) {
        return false;
    }
    return true;
};

function trim(str) {
   return str.replace(/^\s+|\s+$/g, ''); // trim
};

function isEmail(str) {
    str = str.replace(/^\s+|\s+$/g, ''); // trim
    var re = /^[\w-_\.+]*[\w-_\.]\@([\w]+\.)+[\w]+[\w]$/;
    return re.test(str);
};
// returns true if the string only contains characters A-Z or a-z
function isAlpha(str) {
    var re = /[^a-zA-Z]/g;
    return (re.test(str)) ? false : true;
};
// returns true if the string only contains characters 0-9
function isNumeric(str) {
    var re = /[\D]/g;
    return (re.test(str)) ? false : true;
};
// returns true if the string only contains characters A-Z, a-z or 0-9
function isAlphaNumeric(str) {
    var re = /[^a-zA-Z0-9]/g
    return (re.test(str)) ? false : true;
};

function isPhone(str) {
    var stripped = str.replace(/[\(\)\.\-\ ]/g, '');
    //strip out acceptable non-numeric characters
    if (isNaN(parseInt(stripped))) return false;
    if (stripped.length > 13 || stripped.length < 10) return false;
    return true;
};


function fLoadArray(inputID) {
    arrEmps = new Array();
    arrEmpsRow = $('#' + inputID).val().split('|');

    for (var i = 1; i < arrEmpsRow.length; i += 2) {
        var sEmpID = arrEmpsRow[i - 1];
        var sEmpName = arrEmpsRow[i]
        arrEmps.push({ id: sEmpID, name: sEmpName });
    }
    return arrEmps;

};

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////                                                                           /////////////	
///////////////////////                     Error Handling Functions                              /////////////
///////////////////////                                                                           /////////////	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
function fClearInfo() {
    window.msgCount = 0;
    $('#uiInfoMsg').html('');
    $('#uiInfo').hide();
};

function fAddMessage(sMsg) {
    if (!window.msgCount) window.msgCount = 0;
    msgCount++;
    $('#uiInfoMsg').append(msgCount + '. ' + sMsg + '<br/>');
};

function fShowInfo() {
    if (window.msgCount) {
        $('#uiInfo').show('slow');
        return false;
    }
    return true;
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////                                                                           /////////////	
///////////////////////        fAsyncResponse being called from pseudo AJAX response clallback    /////////////
///////////////////////                                                                           /////////////	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
function fLoadAsync(sAction) {
    if (!window.form1) window.form1 = document.getElementById("form1");
    form1.target = "ifmLoadResp";
    if (sAction) $('#uiAction').val(sAction);
    form1.submit();
};


function fAsyncResponse(respBody) {
    var action;
    var xDoc = fGetXmlDoc();

    try {
        var action = respBody.document.getElementById('uiAction').value;
        var xResponseXml = respBody.document.getElementById('xdata').xml;
        xDoc.loadXML(xResponseXml);
    } catch (e) {
        fAddMessage(e.message);
        $('#uiInfo').show('slow');
        return false;
    }

    if (xResponseXml.indexOf('<error>') > 0) {
        fShowTransform(xResponseXml, XslDetail, "uiInfoMsg");
        $('#uiInfo').show('slow');
        return false;
    }

    if (xResponseXml.indexOf('<field name="Error"') > 0) {
        var err = xDoc.selectSingleNode("//field[@name='Error']/@value");
        if (err) err = err.nodeValue;
        fAddMessage(err);
        $('#uiInfo').show('slow');
        return false;
    }
    
    
    if (window.fAsyncResponseXdoc) return fAsyncResponseXdoc(xDoc, action);   
    return false;
}


function
fLoadXmlFileJq(fname){

var xmlDoc = fGetXmlDoc();

if (window.ActiveXObject){

xmlDoc.async=false;

xmlDoc.load(fname);

}else{

xmlDoc = $.ajax({

url: fname,

async: false,

dataType:'xml'

}).responseXML;

}

return xmlDoc;

};



