//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//   B . C .   C O N S U L T I N G   G R O U P//      C U S T O M   S O F T W A R E   S O L U T I O N S////   W E B   B A S E D   S O L U T I O N S   T E A M//      J A V A S C R I P T   F U N C T I O N A L I T Y   D O C U M E N T
//      F O R   E V E N T   C A L E N D A R   M O D U L E S   v 1 . 1 2////      ( C ) 2 0 0 5 - 0 6    B . C .   C O N S U L T I N G//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
////~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//                A L E R T   N O T I F I C A T I O N S//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
 var smryToShrt = "Summary is too short.";
 var descToShrt = "Description is too short.";
 var bdteToShrt = "Event Start Date is not correct. Please reformat.";
 var edteToShrt = "Event End Date is not correct. Please reformat.";
 var durrToShrt = "Your event must have a durration. Check the beging and ending time and date.";
 var noReocRule = "For the reoccrance type you have chosen, you must choose when the reoccrance will occur.";
 var redtToShrt = "The reoccurance end date is not correct. Please reformat.";
 var exdtToShrt = "One or more exclusion dates are not corret. Please reformat.";
 var purgeSure = "You are about to purge the database of all past" + CrLf + "events that do not reoccur. This can not be undone." + CrLf + "Are you sure?";
//
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//            C A L E N D A R   O P E R A T I O N   F U N C T I O N S//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//----------------------------------------------------------------------
//  resizeDetailWin - resizes the pop up event detail window if the
//                    content table cell is larger than expected
//----------------------------------------------------------------------
 function resizeDetailWin(thObj){
 //Check that App version is new enough to support these calls
  if (parseInt(navigator.appVersion) < 4) {
    alert(oldBrowser);
    return;
  }
 //Find the text cell object
  if (navigator.appName == "Netscape") {
    var tcObj = document.getElementById('txtCell');
  }
  if (navigator.appName.indexOf("Microsoft") != -1) {
    var tcObj = document.all['txtCell'];
  }
  if (!tcObj){ return false; }


    if(tcObj.clip){
      var oW = tcObj.clip.width + 200;
      var oH = tcObj.clip.height + 200;
    }else{
      var oW = tcObj.offsetWidth + 200;
      var oH = tcObj.offsetHeight + 200;
    }


//alert(oH +" x "+ oW);

    if(oW < 500){ oW = 500; }
    if(oH < 300){ oW = 300; }

        thObj.resizeTo( oW + 200, oH + 200 );

        var myW = 0, myH = 0, d = thObj.document.documentElement, b = thObj.document.body;
        if( thObj.innerWidth ) { myW = thObj.innerWidth; myH = thObj.innerHeight; }
        else if( d && d.clientWidth ) { myW = d.clientWidth; myH = d.clientHeight; }
        else if( b && b.clientWidth ) { myW = b.clientWidth; myH = b.clientHeight; }

        if( window.opera && !document.childNodes ) { myW += 16; }


  var newHeight = (oH + ( (oH + 50 ) - myH ));
  var newWidth = (oW + ( ( oW + 100 ) - myW ));
  
  if(newHeight < 0){ newHeight = (newHeight * -1); }
  if(newWidth < 0){ newWidth = (newWidth * -1); }

//alert(newHeight +" x "+ newWidth);

/*

 //Read the size properties of the cell
  var cellHeight = tcObj.offsetHeight;
  var cellWidth = tcObj.offsetWidth;
 //Calculate the new Window width
  var winWidthDiff = parseInt((1/6) * cellHeight);
alert(winWidthDiff);
 //Find the new size to resize to...
  var newHeight = (cellHeight - (winWidthDiff * 3));
  var newWidth = (cellWidth + 200);

*/


  if(newHeight > screen.height){ newHeight = (screen.height - 80); }
  if(newWidth > screen.width){ newWidth = (screen.width - 10); }


 //Resize the window to the new specifed dimensions
//   thObj.resizeTo(newWidth, newHeight);



 }
//
//----------------------------------------------------------------------
//  doEvent - open a pop up window with event details
//----------------------------------------------------------------------
 function doEvent(eventID,cDate){  //Calendar : View an events details
   var evtDtlURL = 'eventDetails.php?eventID=' + eventID + '&eventDate=' + cDate;
   Opening(evtDtlURL,"300","500","evtDetail",true); }
//----------------------------------------------------------------------
//  doNextMonth - move calendar to the next month
//----------------------------------------------------------------------
 function doNextMonth(){  //Calendar : Move to Next Month   var frmObj = document.calForm;
   frmObj.cMonth.value = parseInt(frmObj.cMonth.value, 10) + 1;
   frmObj.submit(); }
//----------------------------------------------------------------------
//  doPrevMonth - move calendar to the previous month
//----------------------------------------------------------------------
 function doPrevMonth(){  //Calendar : Move to Previous Month   var frmObj = document.calForm;
   frmObj.cMonth.value = parseInt(frmObj.cMonth.value, 10) - 1;   frmObj.submit(); }
//
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//            C A L E N D A R   A D M I N I S T R A T I V E   F U N C T I O N S//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//----------------------------------------------------------------------
//  doEvtImgSelector - Popup the image selector.
//----------------------------------------------------------------------
 function doEvtImgSelector(){
   mcImageManager.open('evt_edit','ImageFileName','','insertURL')
 }
 function insertURL(url) {
   var ImageFileNameArry = url.split('/');
   document.evt_edit.ImageFileName.value = ImageFileNameArry[(ImageFileNameArry.length - 1)];
   doContentChange(document.evt_edit.ImageFileName);
 }
//
//----------------------------------------------------------------------
//  doIDchange - Change event id on admin edit/add form.
//----------------------------------------------------------------------
 function doIDchange(efObj){
   document.location = '?' + efObj.name + '=' + efObj.options[efObj.selectedIndex].value
 }
//
//----------------------------------------------------------------------
//  doAdmSaveEvent - Handle the event admin edit/add form.
//----------------------------------------------------------------------
 function doAdmSaveEvent(thsObj){
   var frmObj = document.evt_edit;
   //var frmObj = thsObj.form;
//Check OpMode for process...
//------------------------------------------------
  if(frmObj.OpMode.value == 0){  //Event form input compliance tests
  //Check for a summary that is too short.
   if(frmObj.Summary.value.length < 6){
     alert(smryToShrt);
     frmObj.Summary.focus();
     return false;
   }
  //Check for a description that is too short.
   if(frmObj.Description.value.length < 8){
     alert(descToShrt);
     frmObj.Description.focus();
     return false;
   }
  //Check for an improperly formatted begining date value
   if(frmObj.beginDate.value.length != 10){
     alert(bdteToShrt);
     frmObj.beginDate.focus();
     return false;
   }
  //Check for an improperly formatted ending date value
   if(frmObj.endDate.value.length != 10){
     alert(edteToShrt);
     frmObj.endDate.focus();
     return false;
   }
  //Check for a positive duration value
   var bT = frmObj.beginTime.options[frmObj.beginTime.selectedIndex].value;
   var eT = frmObj.endTime.options[frmObj.endTime.selectedIndex].value;
   if(bT == eT){  //If begin and end time equal...
     if(frmObj.beginDate.value > frmObj.endDate.value && bT != "00:00"){ //See if dates are the same and not a all day event.
       alert(durrToShrt);
       frmObj.endTime.focus();
       return false;
     }
   }else{ //Check if hours are not equal...
     if(parseInt(eT.split(':')[0]) < parseInt(bT.split(':')[0]) && frmObj.beginDate.value == frmObj.endDate.value){ // but incase end hour is before start hour
       alert(durrToShrt);
       frmObj.endTime.focus();
       return false;
     }
     if(parseInt(eT.split(':')[0]) < parseInt(bT.split(':')[0]) && frmObj.beginDate.value == frmObj.endDate.value){ // but incase end hour is before start hour
     //or incase start and end hours match and end minues is before start minues
       if(parseInt(eT.split(':')[1]) < parseInt(bT.split(':')[1]) && eT.split(':')[0] == bT.split(':')[0]){
         alert(durrToShrt);
         frmObj.endTime.focus();
         return false;
       }
     }
   }
  //Check that end date is not before start date
   var bD = frmObj.beginDate.value.split('/');
   var eD = frmObj.endDate.value.split('/');
   if(eD[2] < bD[2]){ //End year before start year?
     alert(durrToShrt);
 alert('- d -');
     frmObj.endDate.focus();
     return false;
   }
   if(eD[1] < bD[1] && eD[2] == bD[2]){ //End month before start month on same year?
     alert(durrToShrt);
 alert('- e -');
     frmObj.endDate.focus();
     return false;
   }
   if(eD[0] < bD[0] && eD[1] == bD[1] && eD[2] == bD[2]){ //End day before start day on same month and year?
     alert(durrToShrt);
 alert('- f -');
     frmObj.endDate.focus();
     return false;
   }
  //Check if reoccurance is on that required setting are fulfilled
   if(frmObj.ReoccurType.options[frmObj.ReoccurType.selectedIndex].value != 0){
   //If reoccur type is 2 or 3, check proper subsettings
     if(frmObj.ReoccurType.options[frmObj.ReoccurType.selectedIndex].value == 2 || frmObj.ReoccurType.options[frmObj.ReoccurType.selectedIndex].value == 3){
       var somethingChecked = false;
       for (x = 1; x < 6; x++){
       //Define the form object
         var nObj = "wc" + x;
         var cObj = frmObj[nObj];
       //Verify object is a checkbox...
         if(cObj.type == 'checkbox' && cObj.checked == true){
           somethingChecked = true;
         } //Close checkbox test
       } //Close object for loop
       if(!somethingChecked){ //Nothing was checked. Notify error
         alert(noReocRule);
         frmObj.endTime.focus();
         return false;
       }
     } //Close type 2 + 3 subsettings check
   //Check that reoccurance end date is formatted properly.
     if(frmObj.ChooseEnd.options[frmObj.ChooseEnd.selectedIndex].value == 1){
       if(frmObj.ReoccurEnd.value.length != 10){
         alert(redtToShrt);
         frmObj.ReoccurEnd.focus();
         return false;
       }
     } //Close reocc end date check
   //Check the reoccurance exclusion dates are formatted properly.
     if(frmObj.ExcludeDates.value.length > 0){ //Somthing in there?
       var exclDArry = frmObj.ExcludeDates.value.split(';');
     //Check for missing trailing semicolon.
       if(exclDArry[(exclDArry.length - 1)].length > 0){ //Fix the missing ending semi-colon
         frmObj.ExcludeDates.value = frmObj.ExcludeDates.value + ";";
         exclDArry = frmObj.ExcludeDates.value.split(';'); //Reevaluate the value after fix
       }
     //Loop each entry in the exclusion list
       for(r = 0; r < (exclDArry.length - 1); r++){
         if(exclDArry[r].length != 10){ //Check if any exclude date is improperly formatted
           alert(exdtToShrt);
           frmObj.ExcludeDates.focus();
           return false;
         }         
       } //Close exlusion list for loop
     } //Close exlusion list existance test
   } //close reoccurance tests
  //Compile the begin and end date objects into a formatted submit field
   frmObj.EventBegin.value = frmObj.beginDate.value + " " + frmObj.beginTime.value;
   frmObj.EventEnd.value = frmObj.endDate.value + " " + frmObj.endTime.value;
  //Build the reoccurance rule value based on settings
   var rVal = 0;
   var rTyp = parseInt(frmObj.ReoccurType.options[frmObj.ReoccurType.selectedIndex].value);
   if(rTyp == 2 || rTyp == 3){
     for (x = 1; x < 6; x++){
       var nObj = "wc" + x;
       var cObj = frmObj[nObj];
       if(cObj.type == 'checkbox' && cObj.checked == true){
         rVal = rVal + parseInt(cObj.value);
       }
       cObj.disabled = true;
     }
     frmObj.ReoccurRule.value = rVal;
   }
  //Disable the UI in prep for submit...
   frmObj.beginDate.disabled = true;   frmObj.beginTime.disabled = true;   frmObj.endDate.disabled = true;   frmObj.endTime.disabled = true;
   frmObj.ReoccurEnd.disabled = false;
   frmObj.submit_btn.disabled = true;
   frmObj.OpMode.value = '1';  //Setup for save stage
  } //Close OpMode 0 If
//------------------------------------------------
  if(frmObj.OpMode.value == 5){  //Event form input compliance tests
   frmObj.OpMode.value = '6'; //Setup for the save stage
  } //Close OpMode 5 If
//------------------------------------------------
  return true; //Go and submit!  :-]
 }
//
//----------------------------------------------------------------------
//  setupReoccurance - Modify the event admin edit/add form based on
//                     reoccurance type setting.
//----------------------------------------------------------------------
 function setupReoccurance(rmode){
   var frmObj = document.evt_edit;
 //Show the reoccurance mode if debug is on
   if(enableDebug){ alert('rMode=' + rmode); }
 //Setup the reoccurance controls based on reoccurance type set
   if(rmode == 0){
     jsHTMLobj = "~ No further settings ~";
     frmObj.ReoccurEnd.value = "n/a";
     frmObj.ExcludeDates.value = "n/a";
     frmObj.ExcludeDates.disabled = true;
     frmObj.ReoccurEnd.disabled = true;
     frmObj.ChooseEnd.disabled = true;
   }
   if(rmode == 1){
     jsHTMLobj = "~ No further settings ~";
     frmObj.ReoccurEnd.disabled = false;
     if(frmObj.ExcludeDates.value == "n/a"){ frmObj.ExcludeDates.value = ""; }
     frmObj.ExcludeDates.disabled = false;
     frmObj.ChooseEnd.disabled = false;
     doChooseEnd();
   }
   if(rmode == 2){
     jsHTMLobj = "Event will reoccur every: ";
     jsHTMLobj = jsHTMLobj + "<input type='checkbox' name='wc1' value='16' onChange='doContentChange(this);'>Monday &nbsp;" + CrLf;
     jsHTMLobj = jsHTMLobj + " <input type='checkbox' name='wc2' value='8' onChange='doContentChange(this);'>  Tuesday &nbsp;" + CrLf;
     jsHTMLobj = jsHTMLobj + " <input type='checkbox' name='wc3' value='4' onChange='doContentChange(this);'>  Wednesday &nbsp;" + CrLf;
     jsHTMLobj = jsHTMLobj + " <input type='checkbox' name='wc4' value='2' onChange='doContentChange(this);'>Thursday &nbsp;" + CrLf;
     jsHTMLobj = jsHTMLobj + " <input type='checkbox' name='wc5' value='1' onChange='doContentChange(this);'>  Friday" + CrLf;
     frmObj.ReoccurEnd.disabled = false;
     if(frmObj.ExcludeDates.value == "n/a"){ frmObj.ExcludeDates.value = ""; }
     frmObj.ExcludeDates.disabled = false;
     frmObj.ChooseEnd.disabled = false;
     doChooseEnd();
   }
   if(rmode == 3){
     jsHTMLobj = "Event will reoccur every: ";
     jsHTMLobj = jsHTMLobj + "<input type='checkbox' name='wc1' value='16' onChange='doContentChange(this);'>  1st Week &nbsp;" + CrLf;
     jsHTMLobj = jsHTMLobj + " <input type='checkbox' name='wc2' value='8' onChange='doContentChange(this);'>  2nd Week &nbsp;" + CrLf;
     jsHTMLobj = jsHTMLobj + " <input type='checkbox' name='wc3' value='4' onChange='doContentChange(this);'>  3rd Week &nbsp;" + CrLf;
     jsHTMLobj = jsHTMLobj + " <input type='checkbox' name='wc4' value='2' onChange='doContentChange(this);'>  4th Week &nbsp;" + CrLf;
     jsHTMLobj = jsHTMLobj + " <input type='checkbox' name='wc5' value='1' onChange='doContentChange(this);'>  5th Week" + CrLf;
     frmObj.ReoccurEnd.disabled = false;
     if(frmObj.ExcludeDates.value == "n/a"){ frmObj.ExcludeDates.value = ""; }
     frmObj.ExcludeDates.disabled = false;
     frmObj.ChooseEnd.disabled = false;
     doChooseEnd();
   }
   if(rmode == 4){
     jsHTMLobj = "~ No further settings ~";
     frmObj.ReoccurEnd.disabled = false;
     if(frmObj.ExcludeDates.value == "n/a"){ frmObj.ExcludeDates.value = ""; }
     frmObj.ExcludeDates.disabled = false;
     frmObj.ChooseEnd.disabled = false;
     doChooseEnd();
   }
 //Write the reoccrance settings html to the table cell
   document.getElementById("reocc_Settings").innerHTML = jsHTMLobj;
 //If information was recieved from the database,
 // parse it and setup the proper reoccrance settings.
   if(frmObj.ReoccurRule.value.length > 0 && frmObj.ReoccurRule.value != 0 && (frmObj.ReoccurType.options[frmObj.ReoccurType.selectedIndex].value == 2 || frmObj.ReoccurType.options[frmObj.ReoccurType.selectedIndex].value == 3)){
     var rVal = frmObj.ReoccurRule.value;
   //Show the reoccrance rule if debug is on
     if(enableDebug){ alert(frmObj.ReoccurRule.value); }
   //Loop through the five reoccrance options to set on/off based on value
     for (x = 1; x < 6; x++){
     //Define the form object
       var nObj = "wc" + x;
       var cObj = frmObj[nObj];
     //Verify object is a checkbox...
       if(cObj.type == 'checkbox'){
       //Print the math used if debug is on
         if(enableDebug){ alert(rVal + '-' + cObj.value + '=' + (rVal - cObj.value)); }
         if((rVal - cObj.value) >= 0){  //If reocc val minus object value is not negative...
         //Object is part of rule. Set check state to true.
           cObj.checked = true;
         //Subtract the checked object from rule to note that it was considered
           rVal = rVal - cObj.value;
         } //Close rule verification test
       } //Close checkbox test
     } //Close object for loop
   } //Close rule existance check if
 }
//----------------------------------------------------------------------
//  timeChange - Handle the event admin edit/add form.
//----------------------------------------------------------------------
 function timeChange(){
   var frmObj = document.evt_edit;
   var bTimeArry = frmObj.beginTime.options[frmObj.beginTime.selectedIndex].value.split(':');
   var mins = bTimeArry[1];
   if(mins.length < 2){ mins = "0" + mins; }
   var matchTime = (parseInt(bTimeArry[0]) + 1) + ":" + mins;
   for(x = 0; x < frmObj.endTime.options.length; x++){
     if(frmObj.endTime.options[x].value == matchTime){
       frmObj.endTime.selectedIndex = x;
     }
   }
 }
//----------------------------------------------------------------------
//  doChooseEnd - Handle the 'End After' form objs on reoccuring events
//----------------------------------------------------------------------
 function doChooseEnd(){
   var frmObj = document.evt_edit;
   if(frmObj.ChooseEnd.options[frmObj.ChooseEnd.selectedIndex].value == "0"){
     frmObj.ReoccurEnd.value = "00/00/0000";
     frmObj.ReoccurEnd.disabled = true;
   }
   if(frmObj.ChooseEnd.options[frmObj.ChooseEnd.selectedIndex].value == "1"){
     frmObj.ReoccurEnd.disabled = false;
     frmObj.ReoccurEnd.focus();
   }
 }
//----------------------------------------------------------------------
//  doEditEvent - Edit event by event id.
//----------------------------------------------------------------------
 function doEditEvent(eventID){
   eventID = parseInt(eventID);
   var objLoc = "../modules/cal/event_admin.php?EventID=" + eventID;
   Opening(objLoc, (screen.height - 80), 780, "edEvtWin", true);
 }
//----------------------------------------------------------------------
//  doDelEvent - Delete current event id.
//----------------------------------------------------------------------
 function doDelEvent(thsObj){
   var frmObj = thsObj.form;
   var evtID = frmObj.EventID.options[frmObj.EventID.selectedIndex].value;
   var evtDscr = frmObj.Summary.value;
   if(confirm("Are you sure you wish to delete Event #" + evtID + " known" + CrLf + " as '" + evtDscr + "' ?")){
     frmObj.OpMode.value = "2";
     frmObj.submit();
   }else{
     alert("Delete aborted.");
   }
 }
//----------------------------------------------------------------------
//  doDupeEvent - Duplicate current event id.
//----------------------------------------------------------------------
 function doDupeEvent(thsObj){
   var frmObj = thsObj.form;
   var evtID = frmObj.EventID.options[frmObj.EventID.selectedIndex].value;
   var evtDscr = frmObj.Summary.value;
   if(confirm("Are you sure you wish to duplicate Event #" + evtID + " known" + CrLf + " as '" + evtDscr + "' ?")){
     frmObj.OpMode.value = "4";
     frmObj.submit();
   }
 }
//----------------------------------------------------------------------
//  doCleanDeadEvents - Purge old events from event database.
//----------------------------------------------------------------------
  function doCleanDeadEvents(thsObj){
   var frmObj = thsObj.form;
   if(confirm(purgeSure)){
     frmObj.action = 'event_admin.php';
     frmObj.OpMode.value = '3';
     frmObj.submit();
   }else{
     alert('Purge Aborted.');
   }
 }
////---------------------------------------------------------------------------//             * * * *   E N D   O F   F I L E   * * * *//---------------------------------------------------------------------------