////////////////////////////////////////
//
//  Miscellaneous
//

function showTabPanel( button, currTabHFName, showTabName ) {
    var hidden = document.getElementById( currTabHFName );
    if( hidden.value != showTabName ) {
        var hide = document.getElementById( hidden.value );
        hide.style.display = "none";
        var show = document.getElementById( showTabName );
        show.style.display = "block";
        hidden.value = showTabName;
    }
}

function onHidePanel( panelId ) {
    var panel = document.getElementById( panelId );
    panel.style["display"] = "none";
}

function onMailUpdate( tbox, linkName ) {
    var link = document.getElementById( linkName );
    link.href = "mailto:" + tbox.value;
    return true;
}

function openForm( form, target, cx, cy ) {
    var x = (window.screen.width - cx) / 2;
    var y = (window.screen.height - cy) / 2;
    var w = window.open( form, target, "left=" + x + ", top=" + y + ", width=" + cx + ", height=" + cy + ", resizable, scrollbars", true ); 
    if( w != null ) w.focus();
    return false;
}

function customLinkText( text ) {
    window.status = text;
    return true;
}

////////////////////////////////////////
//
//  PositionInfo - a class to find control's position on the screen
//
function PositionInfo(object) {

    var p_elm = object;

    this.getElementLeft = getElementLeft;
    function getElementLeft() {
        var x = 0;
        var elm;
        if(typeof(p_elm) == "object"){
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        while (elm != null) {
            x+= elm.offsetLeft;
            elm = elm.offsetParent;
        }
        return parseInt(x);
    }

    this.getElementTop = getElementTop;
    function getElementTop() {
        var y = 0;
        var elm;
        if(typeof(p_elm) == "object"){
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        while (elm != null) {
            y+= elm.offsetTop;
            elm = elm.offsetParent;
        }
        return parseInt(y);
    }

    this.getElementRight = getElementRight;
    function getElementRight(){
        return getElementLeft(p_elm) + getElementWidth(p_elm);
    }

    this.getElementBottom = getElementBottom;
    function getElementBottom(){
        return getElementTop(p_elm) + getElementHeight(p_elm);
    }

    this.getElementWidth = getElementWidth;
    function getElementWidth(){
        var elm;
        if(typeof(p_elm) == "object"){
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        return parseInt(elm.offsetWidth);
    }

    this.getElementHeight = getElementHeight;
    function getElementHeight(){
        var elm;
        if(typeof(p_elm) == "object"){
            elm = p_elm;
        } else {
            elm = document.getElementById(p_elm);
        }
        return parseInt(elm.offsetHeight);
    }
}

////////////////////////////////////////
//
//  dbi:ValueControl handlers
//
var numErrCount = 0;

// text control filtering for array element fields.

function registerDefaultBtn( btn ) {
    var form = document.getElementById( "Form1" );
    form.onkeydown = function(e) { return onEnter( e, btn ); };
}

function onEnter( e, btn ) {
    if( !e ) e = window.event;
    var keyCode = e.keyCode;
    if( !keyCode ) keyCode = e.which;
    
    if( keyCode == 13 ) {
        __doPostBack( btn, '');
        return false;
    } else {
        return true;
    }
}

function isArrayTextKey( tbox, e, number ) {
    var keyCode = e.keyCode;
    if( !keyCode ) keyCode = e.which;
    // comma
    if( keyCode != 44 ) {
        numErrCount = 0;
        return true;
    }
    numErrCount++;
    if( numErrCount >= 3 ) {
        window.alert( "This entry does not accept commas." );
        numErrCount = 0;
    }
    return false;
}

// text control filtering for number or decimal fields.

function isNumKey( tbox, e, sign, dot ) {
    var keyCode = e.keyCode;
    if( !keyCode ) keyCode = e.which;
    if( sign ) {
        // plus
        if( keyCode == 43 && tbox.value.length == 0 ) {
            numErrCount = 0;
            return true;
        }
        // minus
        if( keyCode == 45 && tbox.value.length == 0 ) {
            numErrCount = 0;
            return true;
        }
    }
    if( dot ) {
        if( keyCode == 46 && tbox.value.indexOf( "." ) == -1 ) {
            numErrCount = 0;
            return true;
        }
    }
    if( (keyCode >= 48 && keyCode <= 57) || keyCode == 8 || keyCode == 9 || keyCode == 13 ) {
        numErrCount = 0;
        return true;
    }
    if( keyCode == 144 || keyCode == 37 || keyCode == 39 ) {
        numErrCount = 0;
        return true;
    }
    numErrCount++;
    if( numErrCount >= 3 ) {
        if( sign && dot ) window.alert( "This entry accepts only (signed) decimal numbers." );
        if( dot ) window.alert( "This entry accepts only positive decimal numbers." );
        else if( sign ) window.alert( "This entry accepts only (signed) whole numbers." );
        else window.alert( "This entry accepts only positive whole numbers." );
        numErrCount = 0;
    }
    return false;
}

// phone fields

function isPhoneKey( tbox, e, dash ) {
    var keyCode = e.keyCode;
    if( !keyCode ) keyCode = e.which;
    if( dash ) {
        if( (keyCode == 45 || keyCode == 109 || keyCode == 189) && tbox.value.length > 0 ) {
            numErrCount = 0;
            return true;
        }
    }
    if( (keyCode >= 48 && keyCode <= 57) || (keyCode >= 96 && keyCode <= 105) ) {
        numErrCount = 0;
        return true;
    }
    if( keyCode == 8 || keyCode == 9 || keyCode == 13 || keyCode == 16 || 
        keyCode == 37 || keyCode == 39 || keyCode == 46 || keyCode == 144 ) {
        numErrCount = 0;
        return true;
    }
    numErrCount++;
    if( numErrCount >= 3 ) {
        if( dash ) window.alert( "This entry accepts only digits and a dash." );
        else window.alert( "This entry accepts only digits" );
        numErrCount = 0;
    }
    return false;
}

function activateNextField( tbox, maxChars, nbTboxName ) {
    if( tbox.value.length == maxChars ) {
        var tbox2 = document.getElementById( nbTboxName );
        if( tbox2 != null ) tbox2.focus();
        return true;
    } else {
        return tbox.value.length < maxChars;
    }
}

// day/month list box synchronization for the anniversary or date field

function onMonthChange( molbox, daylboxName ) {
    var idx = molbox.selectedIndex + 1;
    if( idx == 2 ) {
        setDayList( daylboxName, 29 );
    } else if( idx == 4 || idx == 6 || idx == 9 || idx == 11 ) {
        setDayList( daylboxName, 30 );
    } else {
        setDayList( daylboxName, 31 );
    }
}
    
function setDayList( daylboxName, days ) {
    var lbox = document.getElementById( daylboxName );
    if( days == lbox.options.length ) {
        // nothing
    } else if( days < lbox.options.length ) {
        if( lbox.selectedIndex >= days ) lbox.selectedIndex = 0;
        lbox.options.length = days;
    } else {
        while( lbox.options.length < days ) {
            var day = lbox.options.length + 1;
            lbox.options[day-1] = new Option( day.toString(), day.toString(), false, false );
        }
    }
}

//
// image value support
//
function onShowImagePanel( panelId, e ) {
    var panel = document.getElementById( panelId );
    panel.style["display"] = "block";
    panel.style["left"] = (e.x + 10) + "px";
    panel.style["top"] = e.y + "px";
}

////////////////////////////////////////
//
//  dbi:CalendarControl handlers
//
function onShowCalEvent( dataId, eventId, eventPanelId, e ) {
    var data = document.getElementById( dataId );
    var panel = document.getElementById( eventPanelId );
    
    var dataStr = data.value;
    var elems = findCalEventInfo( dataStr, eventId )
    if( elems == null ) return false;
    
    //    ID.ToString() + "|" + Name + "|" + EditPageUrl + "|" + IconUrl + "|" + Location + "|" + 
    //    Street + "|" + CityAddressLine + "|" + MapUrl + "|" + Date.ToString( "D" ) + "|" + 
    //    sd.ToString( "h:mm tt" ) + "|" + ed.ToString( "h:mm tt" );
    panel.innerHTML = getCalEventInfoStr( elems, eventPanelId );
    panel.style["display"] = "block";
    panel.style["left"] = (e.x + 10) + "px";
    panel.style["top"] = e.y + "px";
    return false;
}

function onShowCalEventList( dataId, eventIds, eventPanelId, selEventId, e ) {
    var eventIdList = eventIds.split( ',' );
    if( eventIdList.length == 1 ) {
        return onShowCalEvent( dataId, eventId, eventPanelId, e )
    } else {
        var data = document.getElementById( dataId );
        var panel = document.getElementById( eventPanelId );
        
        var dataStr = data.value;
        var eventListInfo = "<table border=\"0\"><tr><td><table cellspacing=\"3\" border=\"0\">";
        for( var i = 0; i < eventIdList.length; i++ ) {
            var elems = findCalEventInfo( dataStr, eventIdList[i] );
            var text = elems[10] + "&nbsp;" + elems[1];
            var onclickTxt = "javascript:return onShowCalEventList( '" + dataId + "', '" + eventIds + "' , '" + eventPanelId + "', '" + elems[0] + "', null )";
            eventListInfo += "<tr><td><a href=\"\" onclick=\"" + onclickTxt + "\">" + text + "</a></td></tr>";
        }
        eventListInfo += "</table></td>";
        if( selEventId != null ) {
            var elems = findCalEventInfo( dataStr, selEventId );
            if( elems != null ) eventListInfo += "<td>" + getCalEventInfoStr( elems, null ) + "</td>";
        }
        eventListInfo += "</tr><tr><td colspan=\"2\"><a href=\"javascript:onHidePanel( '" + eventPanelId + "' );\">Close</a></td></tr></table>";
        panel.innerHTML = eventListInfo;
        if( selEventId == null ) {
            panel.style["display"] = "block";
            panel.style["left"] = (e.x + 10) + "px";
            panel.style["top"] = e.y + "px";
        }
    }
    return false;
}

function findCalEventInfo( dataStr, eventId ) {
    var p1 = dataStr.indexOf( "~" + eventId.toString() );
    if( p1 == -1 ) return null;
    
    var p2 = dataStr.indexOf( "~", p1+1 );
    var eventStr = p2 != -1 ? dataStr.slice( p1+1, p2 ) : dataStr.slice( p1+1, dataStr.length );
    var elems = eventStr.split( '|' );
    return elems;
}

function getCalEventInfoStr( elems, eventPanelId ) {
    //    ID.ToString() + "|" + ShortName + "|" + Name + "|" + EditPageUrl + "|" + IconUrl + "|" + Location + "|" + 
    //    Street + "|" + CityAddressLine + "|" + MapUrl + "|" + Date.ToString( "D" ) + "|" + 
    //    sd.ToString( "h:mm tt" ) + "|" + ed.ToString( "h:mm tt" );
    var shortname = elems[1];
    var name = elems[2];
    var editPageUrl = elems[3];
    var iconUrl = elems[4];
    var location = elems[5];
    var street = elems[6];
    var cityAddressLine = elems[7];
    var mapUrl = elems[8];
    var date = elems[9];
    var startTime = elems[10];
    var endTime = elems[11];
    var readonly = elems[12];
    
    var eventInfo = "<table cellspacing=\"3\" border=\"0\">";
    if( readonly == "RO" )
        eventInfo += "<tr align=\"left\"><td>Event:</td><td>" + name + "&nbsp;<a href=\"" + editPageUrl + "\">View</a></td></tr>"
    else 
        eventInfo += "<tr align=\"left\"><td>Event:</td><td>" + name + "&nbsp;<a href=\"" + editPageUrl + "\">Edit</a></td></tr>"

    eventInfo += "<tr align=\"left\"><td>Date:</td><td>" + date + "</td></tr>" 
    if( startTime.toString() == "" )    
        ;
    else
      eventInfo+= "<tr align=\"left\"><td>Time:</td><td>" + startTime + " to " + endTime + "</td></tr>";
                        
    if( mapUrl.length > 0 ) 
        eventInfo += "<tr align=\"left\"><td>Location:</td><td>" + location + "&nbsp;<a href=\"" + mapUrl + "\" target=\"Map\">Map</a></td></tr>";
    else
        eventInfo += "<tr align=\"left\"><td>Location:</td><td>" + location + "</td></tr>";
        
    eventInfo += "<tr align=\"left\"><td></td><td>" + street + "</td></tr>" + 
                 "<tr align=\"left\"><td></td><td>" + cityAddressLine + "</td></tr>";
    if( eventPanelId != null )
        eventInfo += "<tr><td colspan=\"2\" align=\"center\"><a href=\"javascript:onHidePanel( '" + eventPanelId + "' );\">Close</a></td></tr>";
    eventInfo += "</table>";
    return eventInfo;
}

////////////////////////////////////////
//
//  dbi:GridControl handlers
//
function onCheckAll( baseId, count, on ) {
    for( var i = 0; i < count; i++ ) {
        var id = baseId + "_" + i;
        var cbox = document.getElementById( id );
        cbox.checked = on;
    }
    return false;
}

////////////////////////////////////////
//
//  dbi:WikiControl handlers
//
function onInsertWikiTag( textAreaId, marker1, marker2 ) {
    if( marker1== "Bold"  ) {
        marker1 = "'''";
        marker2 = "'''";
    }
    
    if( marker1 == "Italic" ){
        marker1= "''";
        marker2= "''";
    }
    if( marker1== "*" ) {
        marker2= "\n\r"
    }
    if( marker1== "#" ) {
        marker2= "\n\r"
    }
 
    var element = document.getElementById( textAreaId );
    if( document.selection ) {
       var range = document.selection.createRange();
       if(range.parentElement() == element ) {
         range.text = marker1 + range.text + marker2;
         return;
       }
    }
    element.value = element.value+ marker1+ marker2;
}

////////////////////////////////////////
//
//  dbi:ClassLegend control - support for dragging
//

function beginDarg( elementToDrag, event ) {

    var pos = new PositionInfo( elementToDrag );
    var deltaX = event.clientX - pos.getElementLeft();
    var deltaY = event.clientY - pos.getElementTop();
    
    // register captructing event handlers
    if( document.addEventListener ) { // DOM Level2 event model
        document.addEventListener( "mousemove", moveHandler, true );
        document.addEventListener( "mouseup", upHandler, true );
        event.stopPropagation();
        event.preventDefault();
    } else if( document.attachEvent ) { // IE5+ event model
        document.attachEvent( "mousemove", moveHandler );
        document.attachEvent( "mouseup", upHandler );
        event.cancelBubble = true;
        event.returnValue = false;
    } else {
        // some other crap, exit
        return;
    }
    
    function moveHandler( e ) {
        if( !e ) e = window.event; // fix for IE
        
        elementToDrag.style.left = (e.clientX - deltaX ) + "px";
        elementToDrag.style.top  = (e.clientY - deltaY ) + "px";
        
        if( e.stopPropagation ) 
            e.stopPropagation();
        else
            e.cancelBubble = true;
    }

    function upHandler( e ) {
        if( !e ) e = window.event; // fix for IE
    
        // unregister captructing event handlers
        if( document.addEventListener ) { // DOM Level2 event model
            document.removeEventListener( "mousemove", moveHandler, true );
            document.removeEventListener( "mouseup", upHandler, true );
            event.stopPropagation();
        } else if( document.attachEvent ) { // IE5+ event model
            document.detachEvent( "mousemove", moveHandler );
            document.detachEvent( "mouseup", upHandler );
            event.cancelBubble = true;
        } else {
            // some other crap, exit
            return;
        }
    }
}

