/**
 * Description:
 *    Repository of common javascript functionality used in T3
 */
function createCookie(name,value,days)
{
    if (days)
    {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++)
    {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name)
{
    createCookie(name,"",-1);
}

function clearValue(field, valueToClear, fontColor) {
    if (field.value == valueToClear) {
        field.value='';
        if (fontColor != null) {field.style.color=fontColor;}
    }
}

function resetValue(field, valueToReset, fontColor) {
    if (field.value == '') {
        field.value=valueToReset;
        if (fontColor != null) {
            field.style.color=fontColor;
        }
    }
}

/**
 * Trims leading and trailing whitespace
 */
function trim(str) {
    str = str.replace(/^\s*/, '').replace(/\s*$/, '');
    return str;
}

function validateValue(field, invalidValue, errorMsg) {
    field.value = trim(field.value);
    clearValue(field, invalidValue);
    if (field.value == '') {
        alert(errorMsg);
        field.focus();
        return false;
    }
}

function validateEmail(field, invalidValue, errorMsg) {
    clearValue(field, invalidValue);
    if (!checkEmail(field.value) || field.value == '') {
        alert(errorMsg);
        field.focus();
        return false;
    }
}

/**
 * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
 * http://javascript.internet.com
 */
function checkEmail(emailStr) {
    if (emailStr.length == 0) {
       return true;
    }
    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) {
       return false;
    }
    var user=matchArray[1];
    var domain=matchArray[2];
    if (user.match(userPat) == null) {
       return false;
    }
    var IPArray = domain.match(ipDomainPat);
    if (IPArray != null) {
       for (var i = 1; i <= 4; i++) {
          if (IPArray[i] > 255) {
             return false;
          }
       }
       return true;
    }
    var domainArray=domain.match(domainPat);
    if (domainArray == null) {
       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 > 4)) {
       return false;
    }
    if (len < 2) {
       return false;
    }
    return true;
}


function setCursorPosition(oInput,oStart,oEnd) {
    if( oInput.setSelectionRange ) {
        oInput.setSelectionRange(oStart,oEnd);
    } else if( oInput.createTextRange ) {
        var range = oInput.createTextRange();
        range.collapse(true);
        range.moveEnd('character',oEnd);
        range.moveStart('character',oStart);
        range.select();
    }
}

function openModalWindow(windowURL,windowWidth,windowHeight) {
    if (window.showModalDialog) {
        window.showModalDialog(windowURL,window,
"dialogWidth:"+windowWidth+"px;dialogHeight:"+windowHeight+"px");
    } else {
        window.open(windowURL,window,
'height='+windowHeight+',width='+windowWidth+',toolbar=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,modal=yes');
    }
}

function goToUrlFromModalWindow(url) {
  if (window.opener && !window.opener.closed) {
  	opener.location.href = url;
	window.close();
  }
  if (window.dialogArguments && dialogArguments.location) {
    dialogArguments.location.href = url;
    window.close();
  }
}

/**
 * replacing or adding Query String values in a url
 * reference: http://clintcherry.spaces.live.com/blog/cns!AEC0DCBC460E45B9!575.entry?sa=265630385
 */
function replaceQueryString(url,param,value) {
    var re = new RegExp("([?|&])" + param + "=.*?(&|$)","i");
    if (url.match(re))
        return url.replace(re,'$1' + param + "=" + value + '$2');
    else if (url.indexOf("?") == -1)
        return url + '?' + param + "=" + value;
    else
        return url + '&' + param + "=" + value;
}

/**
 * removes the Query String param & it's value that match the name 'param', along with the following delimiter (&)
 * reference: http://clintcherry.spaces.live.com/blog/cns!AEC0DCBC460E45B9!575.entry?sa=265630385
 */
function removeQueryString(url,param) {
    var re = new RegExp("([?|&])" + param + "=.*?(&|$)","i");
    if (url.match(re))
        return url.replace(re,'$1');
    else
    	return url;
}
/**
 * returns the value of 'param' in the querystring part of 'url'
 * ref:
 * http://www.bloggingdeveloper.com/post/JavaScript-QueryString-ParseGet-QueryString-with-Client-Side-JavaScript.aspx
 */
function returnQueryStringValue(url,param) {
	param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	  var regex = new RegExp("[\\?&]"+ param +"=([^&#]*)");
	  var querystring = regex.exec(url);
	  if(querystring == null)
	    return '';
	  else
	    return querystring[1];
}

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }

        }

        output = Base64._utf8_decode(output);

        return output;

    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}

var _obj1 = null;
var _obj2 = null;
/**
 * copy content to Clipboard
 */
function copyToClipboard(txt, obj1, obj2){
    _obj1=null;
    _obj2=null;

	copy2BrowserClipboard(txt);

	_obj1=document.getElementById(obj1);
	_obj2=document.getElementById(obj2);
	_obj1.style.display="none";
	_obj2.style.display="inline";
	setTimeout("delay()",5000);
}

/**
 * after copy content to Clipboard
 */
function afterCopyToClipboard(obj1, obj2){
    _obj1=null;
    _obj2=null;

	_obj1=document.getElementById(obj1);
	_obj2=document.getElementById(obj2);
	_obj1.style.display="none";
	_obj2.style.display="inline";
	setTimeout("delay()",5000);
}

function delay(){
	recover(_obj1, _obj2);
}

function recover(obj1, obj2){
	obj2.style.display="none";
	obj1.style.display="inline";
}

function copy2BrowserClipboard(txt){
	//reduce the alert message when Browser is not compatible
	//if browser is not IE or Firefox, prompt user...
	if(navigator.userAgent.indexOf("Opera") != -1
		||navigator.userAgent.indexOf("Chremo") != -1
			||navigator.userAgent.indexOf("Safari") != -1) {
        alert("This feature is not currently supported by your browser. We recommend using Firefox");
        return;
    }

    if(window.clipboardData){
        window.clipboardData.setData("Text", txt);
    }else if(window.netscape){
        try{
            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
        }catch(e){
        	alert("This operation is refused by current browser! Please type in 'about:config' in address bar and press 'Enter' Key, then set 'signed.applets.codebase_principal_support' to 'true'");
        	return;
        }
		    var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
		    if(!clip)
		        return;
		    var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
		    if(!trans)
		        return;
		    trans.addDataFlavor('text/unicode');
		    var str = new Object();
		    var len = new Object();
		    var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
		    var copytext = txt;
		    str.data = copytext;
		    trans.setTransferData("text/unicode",str,copytext.length*2);
		    var clipid = Components.interfaces.nsIClipboard;
		    if(!clip)
		        return false;
		    clip.setData(trans,null,clipid.kGlobalClipboard);
    }
}