$(document).ready(function(){

$(document).click(function(evt){
    var $target = $(evt.target);
    /*
    if ($target.hasClass('_morelink') ||
        $target.hasClass('_sortlink')){
        var classattr = $target.attr('class');
        var classes = classattr.split(' ');
        if (classes.length > 0){
            var common = classes[classes.length - 1];
            $('.more_options:not(.'+common+')').hide();       
            $('.more_group:not(.'+common+')').hide();
            $('.sort_by:not(.'+common+')').hide();
        }
    }
    else{
        $('.more_options').hide();     
        $('.more_group').hide();  
        $('.sort_by').hide();
    }
     
    if (!evt.metaKey){
        $('.selected')
        .removeClass('selected')
        //.draggable('disable'); //uncomment when jQuery handles dd.
        
        $('.jott_options').hide();
        
        //TODO: Remove Legacy Code Before 5.0
        g_selectedElements = [];
        g_selectedDragObjects = [];
        //End Legacy Code.
    }
    else{
        var selector = '#jotts *, #groups *, #contacts *, #jottlinks *';
        if($(selector).is('#'+$target.attr('id')))
            evt.stopPropagation();
    }

    if ('undefined' != typeof g_dragTimeOut){
        if (g_dragTimeOut)
            clearTimeout(g_dragTimeOut);
    }
    */
});

$(document).keyup(function(evt){
    switch (evt.which)
    {
    case 46://DELETE
        var param = '';
        var count = 0;
        $selected = $('.selected .ddparams');
        if (!$selected.length){
            break;
        }
        $selected.each(function(){
            var id = $.jwlib.getDragParam(this);
            if (id){
                param += id + ';';
                ++count;
            }
        });
        
        if (!param || !count){
            break;
        }
        param = param.substr(0, param.length - 1);
        
        var isJott = $('#jotts').length ? true : false;
        var isContact = $('#contacts').length ? true : false;
        if (isJott)
            $.jwlib.deleteJotts(param, count, 'deletekey');
        else if (isContact)
            $.jwlib.deleteContacts(param, count);
            
        //TODO: Remove Legacy Code Before 5.0
        g_selectedElements = [];
        g_selectedDragObjects = [];
        //End Legacy Code.

        break;
    default:
        break;
    }

});

});

function Contact(first, last, id, numendpoints, endpoints)
{
    this.firstName = first;
    this.lastName = last;
    this.contactId = id;
    if (numendpoints > 0)
    {
        this.endPoints = new Array(numendpoints);
        for (var i = 0; i < numendpoints; ++i)
        {
            this.endPoints[i] = endpoints[i];
        }
    }
    else
        this.endPoints = null;
}
Contact.prototype.firstName;
Contact.prototype.lastName;
Contact.prototype.endPoints;
Contact.prototype.contactId;
Contact.prototype.getName = function()
{
    var name = null;
    var hasFirst = (this.firstName)?true:false;
    var hasLast = (this.lastName)?true:false;
    if (hasFirst || hasLast)
        name = this.firstName + ' ' + this.lastName;
    else if (this.endPoints && this.endPoints.length > 0)
    {
        var email = null;
        var phone = null;
        for (var i = 0; i < this.endPoints.length; ++i)
        {
            if (IsValidEmail(this.endPoints[i]))
                email = this.endPoints[i];
            else if (StripNonDigits(this.endPoints[i]).length == 10)
                phone = StripNonDigits(this.endPoints[i]);
        }
        if (email)
            name = email;
        else if (phone)
            name = phone;
    }
    return trim(name);
}

function WindowOnLoad(func)
{
    var prev = window.onload;
    window.onload = function(){if (prev) prev(); func();};
}

function isGuid(string)
{
    var regex = /^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$/
    return regex.test(string);
}

function OpenIbox(url, title, params)
{
    if(showIbox(url, title, params))
    {
	    showBG();
	    window.onscroll = maintPos;
	    window.onresize = maintPos;
    }
    return false;
}

function showSplash() 
{
    $('[id$=splashLink]').click();
}

function trim(string) 
{
	return string.replace(/^\s+|\s+$/g,"");
}

function GetElementPosition(element)
{
    var left = 0;
    var top = 0;
    while (element.offsetParent)
    {
        left += element.offsetLeft + (element.currentStyle ? (parseInt(element.currentStyle.borderLeftWidth)).NaN0() : 0);
        top += element.offsetTop + (element.currentStyle ? (parseInt(element.currentStyle.borderTopWidth)).NaN0() : 0);;
        element = element.offsetParent;
    }
    left += element.offsetLeft + (element.currentStyle ? (parseInt(element.currentStyle.borderLeftWidth)).NaN0() : 0);
    top += element.offsetTop + (element.currentStyle ? (parseInt(element.currentStyle.borderTopWidth)).NaN0() : 0);;    
    return {x:left, y:top};
}

Number.prototype.NaN0 = function()
{
    return isNaN(this) ? 0 : this;
}


function Contains(container, node)
{
	if (node == null)
		return false;
	if (node == container)
		return true;
	else
		return Contains(container, node.parentNode);
}

function GetMousePosition(e)
{
    e = e || window.event;
    
    var xCoord = null;
    var yCoord = null;
	if(e.pageX || e.pageY)
	{
		xCoord = e.pageX;
		yCoord = e.pageY;
	}
	else if ((e.clientX || e.clientY))
	{
		xCoord = e.clientX + document.documentElement.scrollLeft - document.documentElement.clientLeft;
		yCoord = e.clientY + document.documentElement.scrollTop  - document.documentElement.clientTop;
	}
	return {x:xCoord, y:yCoord};
}

function IsValidEmail(email)
{
    var regex = /[\w\d_\-\.]+@[\w\d_\-\.]+\.\w\w+/;
    return regex.test(email);
}

function StripNonDigits(str)
{
    var regex = new RegExp('[0-9]+', 'g');
    var retstr = '';
    var rxresult = null;
    while (null != (rxresult = regex.exec(str)))
        retstr += rxresult;
        
    return retstr;
}

function StripPhoneFormatting(str)
{
    var regex = new RegExp('[0-9\\w]+', 'g');
    var retstr = '';
    var rxresult = null;
    while (null != (rxresult = regex.exec(str)))
        retstr += rxresult;
        
    return retstr;
}

//gets the cursor pos (or the end selection)
function GetCursorEndIndex(textObj) {
	var result = 0;
	if (textObj) {
	    if (textObj.createTextRange) {
		    var range = document.selection.createRange().duplicate();
		    range.moveStart('character', -textObj.value.length);
		    result = range.text.length;
	    } else {
	        result = textObj.selectionEnd;
	    }
	}
	return result;
}

//gets the cursor pos (or start of selection)
function GetCursorIndex(textObj) {
	var result = 0;
	if (textObj) {
	    if (textObj.createTextRange) {
		    var range = document.selection.createRange().duplicate();
		    range.moveEnd('character', textObj.value.length);
		    if (range.text == '') 
		        result = textObj.value.length;
		    else
		        result = textObj.value.lastIndexOf(range.text)
	    } else {
	        result = textObj.selectionStart;
	    }
	}
	return result;
}

//inserts a char in a string, replacing a selection
function InsertAt(strOrig, strSection, selStart, selEnd) {
    var result = "";
    if (selStart > strOrig.length) selStart = strOrig.length;
    else if (selStart < 0) selStart = 0;
    if (!selEnd) var selEnd = selStart;
    if (selEnd > strOrig.length) selEnd = strOrig.length;
    else if (selEnd < selStart) selEnd = selStart;
    if (selStart != 0) result = strOrig.substring(0, selStart);
    result += strSection;
    if (selEnd != strOrig.length) result += strOrig.substring(selEnd);
    return result;
} 

//validate against what the string will be after the key press...
//BUGBUG: when we allow formated phone numbers, we can use:
//onkeypress="return ValidateKeyStrokeInContext('^[1]?[ ]?[ (-.]?[0-9]{0,3}[ )-.]?[ ]?[0-9]{0,3}[ -.]?[0-9]{0,4}$', event);"
function ValidateKeyStrokeInContext(regex, e) {
    var e = e || window.event;
    
	//always allow arrow keys, delete key, tab
    if ((e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 46 || e.keyCode == 8 || e.keyCode == 9) 
        return true;
        
    var charCode = e.charCode || e.keyCode;
    if (charCode) {
        //snag the target control
	    var objText;
	    if (e.target) objText = e.target;
	    else if (e.srcElement) objText = e.srcElement;
	    
	    //get the actual char
        var keyChar = String.fromCharCode(charCode);
        
	    //get what it will look like
	    var selStart = GetCursorIndex(objText);
	    var selEnd = GetCursorEndIndex(objText);
	    var newVal = InsertAt(objText.value, keyChar, selStart, selEnd);
	    
	    //return the regex
        var regexp = new RegExp(regex);
        return regexp.test(newVal);
    }
    return true;
}


//Tested in IE7, Firefox 2.
function ValidateKeyStroke(regex, e)
{
    var e = e || window.event;
    if ((e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 46 || e.keyCode == 8 || e.keyCode == 9) //allow arrow keys, delete key, tab
        return true;
        
    var charCode = e.charCode || e.keyCode;
    if (charCode)
    {
        var regexp = new RegExp(regex);
        var keyChar = String.fromCharCode(charCode);
        return regexp.test(keyChar);
    }
    return true;
} 

function ActionPlayJott(id, versionText) 
{
    var FO = {  movie:"flash/mp3player.swf?"+versionText,width:"520",height:"20",majorversion:"7",build:"0",bgcolor:"#FFFFFF",
        flashvars:"file=JottAudio.ashx?id=" + id + "&showdigits=true&autostart=true&showfsbutton=false" };
    UFO.create( FO, "Player");
}

function SetAllChecked(val) 
{
    dml = document.forms['aspnetForm'];
    if (dml)
    {
        len = dml.elements.length;
        var i=0;
        for(i=0; i<len; i++) 
        {
            if (dml.elements[i].name.substring(0,13) == 'ContactEnable')
                dml.elements[i].checked = val;
        }
    }
}

var s_aryMonths = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];

function ConvertToLocalTimeString(ts)
{
    
    var tm = new Date(ts);
    
    var month = s_aryMonths[tm.getMonth()];
    var day = tm.getDate();
    var year = tm.getFullYear();
    var minute = tm.getMinutes();
    var hour = tm.getHours();
    var ampm = hour >= 12 ? "pm" : "am";
    
    if (minute < 10)
        minute = "0" + minute;
    
    if (hour > 12)
        hour -= 12;
        
    return day + " " + month + " " + year + ", " + hour + ":" + minute + ampm;
}

function GetLocalMonthDayYearString(ts)
{
    var tm = new Date(ts);
    
    var month = s_aryMonths[tm.getMonth()];
    var day = tm.getDate();
    var year = tm.getFullYear();

    return month + '/' + day + '/' + year;
}

function GetLocalHourMinuteString(ts)
{
    var tm = new Date(ts);
    
    var minute = tm.getMinutes();
    var hour = tm.getHours();
    var ampm = hour >= 12 ? "pm" : "am";
    
    if (minute < 10)
        minute = "0" + minute;
    
    if (hour > 12)
        hour -= 12;
        
    return hour + ":" + minute + ' ' + ampm;
}

function ReturnToSender(defaultLocation)
{
    if (document.referrer && document.referrer != '')
        window.location = document.referrer;
    else
        window.location = defaultLocation;
}

function ConvertToLocalMonthDayString(ts)
{
    var tm = new Date(ts);
    
    var month = s_aryMonths[tm.getMonth()];
    var day = tm.getDate();

    return month + " " + day;
}

function RestoreDates()
{
    var jotts = document.getElementById('jotts');
    if (!jotts)
        return;
        
    var searchString = 'tm=new Date(\'';
    var dateScripts = jotts.getElementsByTagName('script');
    var length = dateScripts.length;
    while (dateScripts.length && length--)
    {
        var tagInner = dateScripts[0].innerHTML;
        var start = tagInner.indexOf(searchString) + searchString.length;
        var end = tagInner.indexOf('\')', start);
        var dateString = tagInner.substring(start, end);
        var tm = new Date(dateString);
        var parent = dateScripts[0].parentNode;
        parent.innerHTML = ConvertToLocalMonthDayString(tm);
    }
}

function HandleTogglePriority(clientId, jottId)
{
    ShowThinking();
    WebForm_DoCallback('__Page', 'priority,' + jottId, TogglePriority, null, null, true);
}

function TogglePriority(result, context)
{
    if (!result)
    {
        var message = 'Error: Failed toggle priority.';
        DisplayActivity(message, 0, false, true);
    }
    else
    {
        var jotts = document.getElementById('jotts');
        if (jotts)
        {
            jotts.innerHTML = result;
            init_ibox();
            RestoreDates();
        }
        HideThinking();
    }
}

function HandleToggleCompleted(jottRowId, iconId, jottId)
{
    ShowThinking();
    WebForm_DoCallback('__Page', 'completed,' + jottId, ToggleCompleted, null, null, true);
}

function ToggleCompleted(result, context)
{
    if (!result)
    {
        var message = 'Error: Failed toggle completion.';
        DisplayActivity(message, 0, false, true);
    }
    else
    {
        var jotts = document.getElementById('jotts');
        if (jotts)
        {
            jotts.innerHTML = result;
            init_ibox();
            RestoreDates();
        }
        HideThinking();
    }
}

function ToggleHideElement(clientId,ifSupport)
{
    var element = document.getElementById(clientId);
    if (null !== element)
    {
        if ('none' == element.style.display)
        {
            if(ifSupport==true) {
                element.style.display = "block";
			} else {
                if(browser=="Internet Explorer") {
				    element.style.display = "inline";
			    } else {
				    element.style.display = "table-row";
			    }
			}
        }
        else
        {
            element.style.display = 'none'; 
        }
    }
}

function EnableElement(clientId)
{
    var element = document.getElementById(clientId);
    if (null !== element)
    {
        element.disabled = '';
    }
}


// for enabling save and cancel buttons using EnableElements
buttonArray = new Array('ctl00_ctl00_cphContent_cphMainContent_bCancel', 'ctl00_ctl00_cphContent_cphMainContent_bSave');

function EnableElements(clientIdArray)
{
    for( var i=0 ; i < clientIdArray.length; i++ )
    {
    	EnableElement(clientIdArray[i]);
    }
}

function UpdateDeleteLink(id)
{
    var element = document.getElementById('ctl00_ctl00_cphContent_cphMainContent_cDelete');
    if (null !== element)
    {
        element.href = 'deleteendpoint.aspx?endpointid=' + id;
    }
}

//global variable to keep track of the currently selected radio
var g_selectedRadioIndex = -1;
var g_currentDefaultId = null;
function HandleUpdatePrimary(clientId)
{
    if (!clientId || 'click' == clientId.type)
    {
        clientId = g_currentDefaultId;
    }
    WebForm_DoCallback('__Page', 'update,' + g_selectedRadioIndex, UpdatePrimary, clientId, null, true);
}

function UpdatePrimary(result, context)
{
    if (!result || result == context)
        return;
        
    var element = document.getElementById(result);
    if (element)
    {
        if (element.innerText)
        {
            element.innerText += ' (primary)';
        }
        else
        {
            element.textContent += ' (primary)';
        }
        element.className = 'primary';
        var anchor = document.getElementById('ctl00_ctl00_cphContent_cphMainContent_cSetPrimary');
        if (anchor)
        {
            var temp = anchor.onclick;
            anchor.onclick = HandleUpdatePrimary;
            g_currentDefaultId = element.id;
        }
    }
    element = document.getElementById(context);
    if (element)
    {
        if (element.innerText)
        {
            var subStrLen = element.innerText.indexOf(' (primary)') + 1;
            element.innerText = element.innerText.substr(0, subStrLen);
        }
        else 
        {
            var subStrLen = element.textContent.indexOf(' (primary)') + 1;
            element.textContent = element.textContent.substr(0, subStrLen);
        }
        element.className = '';
    }
}

var g_currentJottId = null;
function HandleMoveJott(listId, clientId)
{
    if (null != g_selectedJottId)
    {
        WebForm_DoCallback('__Page', 'move,' + list + ',' + jottId, MoveJott, clientId, null, true);
    }
}

function MoveJott(result, context)
{
}

function SetUniqueRadioButton(clientIds, current)
{
    var ids = clientIds.split(',');
    for (var i = 0; i < ids.length; ++i)
    {
        var element = document.getElementById(ids[i]);
        if (null !== element)
        {
            element.checked = false;
            if (element == current)
            {
                g_selectedRadioIndex = i;
            }
        }
    }
    current.checked = true;
}

function HideElement(id)
{
    $('#'+id).hide('slow');
}

function ShowElement(id)
{
    var element = document.getElementById(id);
    if (element)
    {
        element.style.display = 'inline';
    }
}

function ToggleShowElement(id)
{
    var element = document.getElementById(id);
    if (element)
    {
        if ('inline' == element.style.display)
        {
            element.style.display = 'none';
        }
        else
        {
            element.style.display = 'inline';
        }
    }
}

function DisplayActivity(message, time, isUndoable, isError)
{
    var feedback = document.getElementById('old_feedback');
    if (feedback)
    {
        feedback.className = ((true == isError) ? 'topstripe error' : 'topstripe');  
        feedback.innerHTML = message + ' <a href="javascript:;" onclick="HideElement(\'old_feedback\')">[X]</a>';
        if (true == isUndoable)
        {
            feedback.innerHTML += ' <a href="javascript:;">Undo</a>';
        }
        
        feedback.style.display = 'block';
        
        if (0 < time)
        {
            setTimeout("HideElement('old_feedback')", time);
        }
    }
}

function DisplayActivity_Fringe(message)
{
    var feedback = document.getElementById('reg_feedback');
    if (feedback)
    {
        feedback.style.display = 'block';
        feedback.innerHTML = message;
    }
}

function ClearField(clientId)
{
    var element = document.getElementById(clientId);
    if (element)
    {
        element.value = '';
    }
}

function ShowFlyout(flyoutId, object)
{
    var flyout = document.getElementById(flyoutId);
    if (flyout)
    {
        flyout.style.display = 'inline';
    }
}

function HideFlyout(flyoutId, e, currentTarget)
{
    if (currentTarget.className.indexOf('selected') >= 0)
        return;

    var flyout = document.getElementById(flyoutId);
    if (flyout)
    {
        var current;
        var related;
        if (window.event)
        {
            current = currentTarget;
            related = window.event.toElement;
        }
        else
        {
            current = e.currentTarget;
            related = e.relatedTarget;
        }
        
        if (current != related && !Contains(current, related))
        {
            flyout.style.display = 'none';
        }
    }
}

function ToggleJottHighlight(clientId)
{
    var jott = document.getElementById(clientId)
    if (jott)
    {
        if ('jott_wrapper' == jott.className)
        {
            jott.className = 'jott_wrapperOn';
        }
        else
        {
            jott.className = 'jott_wrapper';
        }
    }
}

// set previousDiv so we can hide the previous div when the current one is shown
previousDiv = null; 
function toggleOneDivVisible(target,ifSupport)
{
    ToggleHideElement(target,ifSupport);
    ToggleHideElement(previousDiv,ifSupport);
    previousDiv = target;
}

function customtip(text, parent, offsetx, offsety)
{
	if (!offsetx){ offsetx = 0}; // sometimes an offset is nice
	if (!offsety){ offsety = 0};
	
	if (parent) // we can base this on the mouse if no parent id is passed in
	{
		target = document.getElementById(parent);
		var tipPos = GetElementPosition(target);
	}
	var customTip = document.getElementById("customtip");
	customTip.style.left = parseInt(offsetx)+tipPos.x + "px";
	customTip.style.top = parseInt(offsety)+tipPos.y + "px";
    customTip.innerHTML = text;
    ShowElement("customtip");
}

function GetParamFromClassName(object, paramName)
{
    if (!object || !paramName)
        return null;
        
    var params = object.className.split(' ');
    
    if (!params)
        return null;
        
    var paramValue = null;
    for (var i = 0; i < params.length; ++i)
    {
        if (params[i].indexOf(paramName + '=') >= 0)
        {
            paramValue = params[i].substring(paramName.length + 1);
            break;
        }
    }
    return paramValue;
}

function TextBoxClickButton(e, buttonid)
{
    var evt = e ? e : window.event;
    var bt = document.getElementById(buttonid);
    if (bt)
    {
        if (evt.keyCode == 13)
        {
            bt.click();
            return false;
        }
    }
}

function GetKeyCode(e)
{
    var k = null;
    if (e.which) 
        k=e.which;
    else if(e.keyCode)
        k=e.keyCode;
    else if(window.event.keyCode)
        k=window.event.keyCode;
    else if (window.event.which)
        k=window.event.which;
    return k;
}

function FilterPhoneInput(elem)
{    
    var strReturn = new String(elem.value);
    strReturn = strReturn.replace(/[^0-9]/g, '');
 
    // BUGBUG - hardcoded phone length of 10
    // Strip a leading 1 off the front if needed,
    // and force the length to 10 digits
    if (strReturn.length > 10 && strReturn.charAt(0) == '1') 
    {
        strReturn = strReturn.substr(1, 10);
    }
    else
    {
        strReturn = strReturn.substr(0, 10);
    }
        
    if (strReturn != elem.value)
    {
        // Set the element value only if it has changed.
        // This prevents IE from pushing the cursor to 
        // the end of the string, making arrow keys
        // inoperative.
        elem.value = strReturn;
    }
}

// See comments in FilterPhoneInput above
function FilterPINInput(elem)
{
    var strReturn = new String(elem.value);
    strReturn = strReturn.replace(/[^0-9]/g, '');
    
    strReturn = strReturn.substr(0, 4);
    
    if (strReturn != elem.value)
    {
        elem.value = strReturn;
    }
}

function ShowThinking()
{
    var feedback = document.getElementById('feedback');
    if (!feedback)
        return
        
    feedback.className = 'typical';  
    feedback.innerHTML = '<div class="thinking"></div>Thinking...';
    feedback.style.display = 'block';
}

function HideThinking()
{
    var feedback = document.getElementById('feedback');
    if (!feedback)
        return
        
    feedback.innerHTML = '';
    feedback.style.display = 'none';
}
	
function GetStyle(ele, cssRule){
	var value = "";
	if(document.defaultView && document.defaultView.getComputedStyle){
		value = document.defaultView.getComputedStyle(ele, "").getPropertyValue(cssRule);
	}
	else if(ele.currentStyle){
		try{
			cssRule = cssRule.replace(/\-(\w)/g, function (strMatch, p1){
				return p1.toUpperCase();
			});
			value = ele.currentStyle[cssRule];
		}
		catch(e){
			// prevents an error in IE 5.0.
		}
	}
	return value;
}

// POWER TIPS POPUP IN TIP

function chartPopper() {
	window.open('jott/chart.html','chart','width=700,height=500,scrollbars=1,resizable=1,menubar=1');
};
