// pap.js - pap logic for pap.html


var selectName = "";
var nameList = [];
var previousProviders = ["java2X13X115","java2X13X132","java2X16X142","java2X16X143","java2X13X249","java2X13X250","java2X13X254",
                         "java2X13X255","java2X13X259","java2X13X260","java2X16X267","java2X16X268","java2X16X270",
                         "java2X16X271","java2X16X277","java2X16X278","java2X16X279","java2X19X320","java2X19X321","java2X19X323",
                         "java2X19X324","java2X8X390","java2X8X391","java2X8X395","java2X8X396","java2X8X400","java2X8X401",
                         "java2X3X1018","java2X3X1019"];
var previousAnswers = ["answer2X13X115","answer2X13X132","answer2X16X142","answer2X16X143","answer2X13X249","answer2X13X250","answer2X13X254",
                       "answer2X13X255","answer2X13X259","answer2X13X260","answer2X16X267","answer2X16X268","answer2X16X270",
                       "answer2X16X271","answer2X16X277","answer2X16X278","answer2X16X279","answer2X19X320","answer2X19X321","answer2X19X323",
                       "answer2X19X324","answer2X8X390","answer2X8X391","answer2X8X395","answer2X8X396","answer2X8X400","answer2X8X401",
                       "answer2X3X1018","answer2X3X1019"];
var map;
var myBounds;
var answerid;
var answerSet;
var cpid = 0;
var selectPid = -1;
var pidList = "";
var category = "";
var showRating = false;
var searchOnly = false;
var myLocations = new Array();
var searchTotal = 0;


var baseIcon = new GIcon();
    baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
    baseIcon.iconSize = new GSize(20, 34);
    baseIcon.shadowSize = new GSize(37, 34);
    baseIcon.iconAnchor = new GPoint(9, 34);
    baseIcon.infoWindowAnchor = new GPoint(9, 2);
    baseIcon.infoShadowAnchor = new GPoint(18, 25);


function findStarImage(rating)
{
   if (rating <= 0  ){rating_img = "/national/images/00star.gif";}
   if (rating >= 0.5){rating_img = "/national/images/05star.gif";}
   if (rating >= 1  ){rating_img = "/national/images/1star.gif";}
   if (rating >= 1.5){rating_img = "/national/images/15star.gif";}
   if (rating >= 2  ){rating_img = "/national/images/2star.gif";}
   if (rating >= 2.5){rating_img = "/national/images/25star.gif";}
   if (rating >= 3  ){rating_img = "/national/images/3star.gif";}
   if (rating >= 3.5){rating_img = "/national/images/35star.gif";}
   if (rating >= 4  ){rating_img = "/national/images/4star.gif";}
   if (rating >= 4.5){rating_img = "/national/images/45star.gif";}
   if (rating >= 5  ){rating_img = "/national/images/5star.gif";}
   
   return rating_img;
}


function validateSearchParms() {
   
   if (category.length == 0)
   {
      alert("Selecting at least one type of provider is required!")
      return false;
   }
   
   if (($("#sZipcode").val().length == 0) &&
       ((($("#sCity").val().length == 0) && ($("#sfName").val().length == 0 ) && ($("#slName").val().length == 0 ) ) || ($("#sState").val() == "00")))
   {
      alert("A Zipcode or City/State Selection is required to begin a search!");
      return false;
   }
   return true;
}

function setPName(index) {
//   $("#ProviderID").val(index);
   selectPid = index;
}

function prevLoad() {

   $("#PrevDiv").fadeOut("fast", function() {
      $("#PrevDiv").hide();
      $("#Loading").fadeIn("slow"); 
      $("#ppl > .plist").empty();
      
      $.ajax({
         url: 'papPrev.php5',
         type: 'GET',
         data: pidList + "&type=" + category,
         dataType: 'xml',
         timeout: 5000,
         error: function(){
            alert('Error loading previous providers.  Please search for your provider again or try again later.');
            $("#Loading").fadeOut("slow", function () {  $("#Loading").hide(); $("#pSearch").fadeIn("fast");  })
         },
         success: function(xml){
            var pmax = parseInt($(xml).find('providerCollection').attr('max'));
            if (pmax > 0)
            {
               loadPTable(xml, '', 'ppl');
               $("#Loading").fadeOut("slow", function () {  $("#Loading").hide(); $("#PrevDiv").fadeIn("fast", resetTable);  })
            }
            else
            {
               $("#Loading").fadeOut("slow", function () {  $("#Loading").hide(); $("#pSearch").fadeIn("fast");  })
            }
         }
      });
   });
}


function setCategory() {
   
   if (searchOnly)
   {
      var categories = new Array();
      if ($("#CheckDoctor").is(":checked")) { categories.push("Doctor"); }
      if ($("#CheckCNM").is(":checked")) { categories.push("CNM"); }
      if ($("#CheckLM").is(":checked")) { categories.push("LM"); }
   
      category = categories.join(",");
   }
   
}



function listLoad(page_index) {

   $("#pdiv").fadeOut("fast", function() {
      $("#pdiv").hide();
      $("#Loading").fadeIn("slow"); 
      $("#spl > .plist").empty();
      $('#spl-index').empty();
      
      clearSearch();
      var page_arg="page=" + (page_index || 1);
      var showRating_arg = "";
      if (showRating)
      {
         showRating_arg = "&showRating=true"
      }

      $.ajax({
         url: '/national/html/custom/view/pap/papSearch.php5',
         type: 'GET',
         data: $("#searchForm").serialize() + "&" + page_arg + "&type=" + category + showRating_arg,
         dataType: 'xml',
         timeout: 5000,
         error: function(){
            alert('Error in retrieving providers.  Please Try again.');
            $("#Loading").fadeOut("slow", function () {  $("#Loading").hide(); $("#pSearch").fadeIn("fast");  })
         },
         success: function(xml){
            var ppage = parseInt($(xml).find('providerCollection').attr('page'));
            var pmax = parseInt($(xml).find('providerCollection').attr('max'));
         
            if (pmax > 200)
            {
               alert("This search is too large.  Please redo your search again with narrower parameters.");
               $("#Loading").fadeOut("slow", function () {  $("#Loading").hide(); $("#pSearch").fadeIn("fast");  })
            }
            else
            {
               if (pmax > 0)
               {
                  if (ppage > 1) { $('<a></a>').attr("page", ppage - 1).attr("href", "").html("Prev" ).appendTo('#spl-index').click(function () { listLoad($(this).attr("page")); return false; }); }
                  $('#spl-index').append(" ");
                  if (25 < pmax)
                  {     
                     for (index=1; index < (pmax+24)/25; index++)
                     {
                        if (index != ppage)
                        {
                           $('<a></a>').attr("page", index).attr("href", "").html(index).appendTo('#spl-index').click(function () { listLoad($(this).attr("page")); return false; });
                        }
                        else
                        {
                           $('<span></span>').html(index).appendTo('#spl-index');
                        }
                        $('#spl-index').append(" ");
                     }
                  }
                  if (ppage < (pmax)/25) { $('<a></a>').attr("page", ppage + 1).attr("href", "").html("Next" ).appendTo('#spl-index').click(function () { listLoad($(this).attr("page")); return false; }); }
                  $('#spl-index').append(" ");
                  loadPTable(xml, 'spl-short', 'spl-long');
                  $("#Loading").fadeOut("slow", function () {  $("#Loading").hide(); $("#pdiv").fadeIn("fast", function () { initialize(); });  });
                  searchTotal = pmax;
               }
               else
               {
                  
                  $("#Loading").fadeOut("slow", function () {
                     $("#Loading").hide();
                     $("#pSearch").fadeIn("fast");
                     alert("No providers were found. Please widen your search and try again.\n\n\nClearing your previous search and searching by Zip code and 75 mile distance will give you the most results.\n\n\nIf you still do not find your provider click the 'Add a Provider' link.");
                     if (!searchOnly)
                     {
                        $("#ProviderName").html("No providers were found.  Please widen your search and try again or ").addClass("alarmMsg");
                        $("<a></a>").html("Add a Provider.").addClass("hotlink").appendTo("#ProviderName").click(function () {
                           $("#pSearch").slideUp("fast", function() { $("#AddProvider").slideDown(); $("#ProviderName").html("");}) });
                     }
                  });
               }
            }
         }
      });
   });
}

jQuery.validator.addMethod("ziprange", function(value, element) {
   return this.optional(element) || /^\d{5}-?(\d{4})?$/.test(value);
}, "Your ZIP-code must be formated XXXXX or XXXXX-XXXX");

jQuery.validator.addMethod("stateList", function(value, element) {
   return this.optional(element) || (value != "00");
}, "Please Select a state from the menu list.");

function addLatitude(latitude, longitude, index) {
   
   var locObj = new Object();
   if (latitude == "") { latitude=-99999; }
   if (longitude == "") { longitude=-99999; }
   locObj.latitude=latitude;
   locObj.longitude=longitude;
   myLocations[index] = locObj;
   
   return locObj;
}

function clearSearch()
{
   if (map) {
      map.clearOverlays();
   }
   
   myLocations = new Array();
   searchTotal = 0;
}



function loadPTable(xml, tableName, tableLongName) {
   
   var tableID = '#' + tableLongName;
   var tableShortID = '#' + tableName;
   var entryCount = 0;
   var locIndex = 0;
   $(".tBody").remove();
   $(xml).find('provider').each(function(){
         
      var rowNum = $(this).attr("id");
      var fname = '';
      var lname = '';
      var mname = '';
      var title = '';
      var rowid = tableLongName + 'tr' + rowNum;
      var rowShortID = tableName + 'tr' + rowNum;
      entryCount++;
        
      $('<tr id="' + rowid + '" pid="' + rowNum + '"></tr>').appendTo(tableID).click(function() {
         $(this).siblings().removeClass("rowSelect");
         $(this).addClass("rowSelect");
         $("#ProviderID").val(rowNum); setPName(rowNum); });
      
      $('<tr id="' + rowShortID + '" pid="' + rowNum + '"></tr>').appendTo(tableShortID).click(function() {
         $(this).siblings().removeClass("rowSelect");
         $(this).addClass("rowSelect");
         $("#ProviderID").val(rowNum); setPName(rowNum); });

      if (showRating)
      {
         var latitude=-99999;
         var longitude=-99999;
         var address = "";
         var city = "";
         var state = "";
         var zipcode = "";
         var phone = "";
         $(this).find('latitude').each(function(){ latitude=$(this).text(); });
         $(this).find('longitude').each(function(){ longitude=$(this).text(); });
         $(this).find('address').each(function(){ address=$(this).text(); });
         $(this).find('city').each(function(){ city=$(this).text(); });
         $(this).find('state').each(function(){ state=$(this).text(); });
         $(this).find('zipcode').each(function(){ zipcode=$(this).text(); });
         $(this).find('phone').each(function(){ phone=$(this).text(); });
      
         var locObj = addLatitude(latitude, longitude, rowNum);
         
         myLocations[rowNum].rowIndex = locIndex;
         myLocations[rowNum].address = address + "<br>" + city + ", " + state + " " + zipcode;
         if (phone.length > 0)
         {
            phone = phone.substr(0, 3) + " " + phone.substr(3, 3) + "-" + phone.substr(6, 4);
            myLocations[rowNum].address += "<br>" + phone;
         }

         if (locObj.latitude > -399)
         {
            var letter = String.fromCharCode("A".charCodeAt(0) + locIndex);
            locIndex++;
            $('<td ></td>').html("<img src='/national/images/marker" + letter + ".png'>").appendTo('tr#'+rowShortID);
         }
         else
         {
            $('<td></td>').html("&nbsp").appendTo('tr#'+rowShortID);
         }
      }

      
//      $(this).find('title').each(function(){title=$(this).text();
//         $('<td></td>').html(title+"&nbsp").appendTo('tr#'+rowid);  });        
      $(this).find('lName').each(function(){lname=$(this).text();
         $('<td></td>').html(lname+"&nbsp").appendTo('tr#'+rowid);  });
      $(this).find('fName').each(function(){fname=$(this).text();
         $('<td></td>').html(fname+"&nbsp").appendTo('tr#' + rowid);  });
      $(this).find('mName').each(function(){mname=$(this).text();
         $('<td></td>').html(mname+"&nbsp").appendTo('tr#'+rowid);  });

      
      if (showRating)
      {
         date = "&nbsp";
         overall = "&nbsp";
         ocount = "0";
         
         myLocations[rowNum].name = fname + " " + mname + " " + lname;
         
         $(this).find('DATE').each(function() { date=$(this).text().substr(0,10); });
         $('<td></td>').html(date).appendTo('tr#'+rowid);
         
         $(this).find('OVERALLCOUNT').each(function() { ocount=$(this).text(); });
         
         viewImg="<img height='16px' width='77px'; onclick='submitProvider(" + rowNum + ")' src='/national/images/view_details.png'>";
         ocounttext="";
         if (ocount != 1) { ocounttext = "(" + ocount + " responses)";}
         else { ocounttext = "(" + ocount + " response)";}
         
         $(this).find('OVERALL').each(function() {
            overall='<img src="' + findStarImage($(this).text()) + '" style="float: left"\>';
            });
         $('<td align="center"></td>').html(overall).appendTo('tr#'+rowid);
         
         $('<td align="center"></td>').html(ocounttext).appendTo('tr#'+rowid);
         $('<td align="center"></td>').html(viewImg).appendTo('tr#'+rowid);
      
         var shortRowText = myLocations[rowNum].name;
         if (myLocations[rowNum].address)
         {
            shortRowText += "<br>" + myLocations[rowNum].address;
         }
      
         if (date != "&nbsp")
         {
            shortRowText += "<br>Last Survey: " + date + "&nbsp;&nbsp;&nbsp;&nbsp;" + ocounttext;
            shortRowText += "<br>" + overall + "&nbsp;&nbsp;&nbsp;&nbsp;" + viewImg;
         }
      
         $('<td></td>').html(shortRowText).appendTo('tr#'+rowShortID);
         
      }
      
      nameList[rowNum] = title + " " + fname + " " + lname;
      if (cpid==rowNum) {
         $("tr[pid='"+rowNum+"']").click();
         $("#Submitter").click();
      }

   });
   
   // Firefox 3 hack...
   if (entryCount < 8)
   {
      $('<tr><td></td></tr>').appendTo(tableID);
   }
   $(tableID + " > tbody *").addClass("tBody plist");
   $(tableShortID + " > tbody *").addClass("tBody plist");

}


function addProvider () {
   
   if ($("#addForm").valid()){
   
      $("#Add").attr("disabled", true);
      $.ajax({
         url: 'papAdd.php5',
         type: 'GET',
         data: $("#addForm").serialize() + "&type=" + category,
         dataType: 'xml',
         timeout: 5000,
         error: function(){
            alert('Error adding practitioner.  Please try again.');
            $("#Add").removeAttr("disabled");
         },
         success: function(xml){
            $(xml).find('Success').each(function(){
               $("#addMsg").html("You have successfully added " + $("#afName").val() + " " + $("#alName").val());
               nameList[$(this).text()] = $("#afName").val() + " " + $("#alName").val();
               submitProvider($(this).text());
               setPName(0);
            });
            $(xml).find('Failure').each(function(){
               alert($(this).text());
            });
            $("#Add").removeAttr("disabled");
         }
      });
   }
}


function submitProvider(pid)
{
   if (!searchOnly)
   {
      if (pid == -1)
      {
         $("#ProviderName").html("You have specified that your provider be Anonymous.");
      }
      else if (pid == 0)
      {
         $("#ProviderName").html("");
      }
      else
      {
         $("#ProviderName").html("You have selected " + nameList[pid]);
      }
      $("#ProviderName").removeClass("alarmMsg");
      
      if (self.parent.document.getElementById(answerSet))
      {
         self.parent.document.getElementById(answerSet).value=pid;
      }
      
      if (pid)
      {
         prov = $.cookie('Providers');
         if (!prov)
         {
            $.cookie('Providers', pid, { expires: 1 });
         }
         else
         {
            prov += ",";
            prov += pid;
            $.cookie('Providers', prov, { expires: 1 });
         }
      }
      cpid = pid;
   }
}


var listPrevIds = "";
function resetTable() {
   $(".rowSelect").each(function () { if ($(this).attr("pid") != cpid) { $(this).removeClass("rowSelect"); } });
   selectPid = cpid;
}


function initialize() {

   if (GBrowserIsCompatible() && searchOnly) {
      map = new GMap2(document.getElementById("mapDiv"));
      map.addControl(new GSmallMapControl());
      map.setCenter(new GLatLng(37.4419, -122.1419), 13);
      var geocoder = new GClientGeocoder();
      myBounds = new GLatLngBounds();
      
      
      var resetMap = false;
      for (var loc in myLocations)
      {
         if (myLocations[loc].latitude > -399)
         {
            var letter = String.fromCharCode("A".charCodeAt(0) + myLocations[loc].rowIndex);
            var letteredIcon = new GIcon(baseIcon);
            letteredIcon.image = "http://www.google.com/mapfiles/marker" + letter + ".png";
            
            var markerOptions = { icon:letteredIcon };
            
            var point = new GLatLng(myLocations[loc].latitude, myLocations[loc].longitude);
            var marker = new GMarker(point, markerOptions);
            
            myBounds.extend(point);
            
            marker.bindInfoWindowHtml("<span style='font-size: 11px; font-family: Arial,Helvetica,sans-serif;' >" + myLocations[loc].name + "<br>" + myLocations[loc].address + "<br>" +
                                      "<a href='' onClick='javascript:submitProvider(" + loc + "); return false;'>View Results</a></font>");
            
            map.addOverlay(marker);
            resetMap = true;
         }
      }
      
      if (resetMap)
      {
         map.setZoom(map.getBoundsZoomLevel(myBounds) - 1);
         map.setCenter(myBounds.getCenter());
      }
   }
}



$(document).ready(function() {

   answerid = $(document).getUrlParam("AnswerSet");
   category = $(document).getUrlParam("Category");
   skipPrev = $(document).getUrlParam("SkipPrev");
   searchOnly = $(document).getUrlParam("SearchOnly");
   showRating = $(document).getUrlParam("ShowRating");
   answerSet = 'answer' + answerid;

   

   if (searchOnly)
   {
      $(".Anonymous").hide();
      $(".AddProvider").hide();
      $(".Submitter").hide();
   }
   
   var pinput = self.parent.document.getElementById(answerSet);
   if (pinput)
   {
      pinput.readOnly='false';
      pinput.style.display = 'none';
      cpid = pinput.value;
   }

   if (!skipPrev)
   {
      if ($.cookie('Providers'))
      {
         pidList = $.cookie('Providers');
      }
      else
      {
         $("body", parent.document).find("input").each(function () {
         var pid = -1;
         if (((pid = jQuery.inArray($(this).attr("id"), previousProviders)) != -1) ||
             ((pid = jQuery.inArray($(this).attr("id"), previousAnswers)) != -1))
         {
            var valId = $(this).attr("value");
            if (valId > 0)
            {
               pidList = pidList + valId + ",";
            }
         }
         $.cookie('Providers', pidList, { expires: 1 });
      });
      }
   }
   else if (cpid > 0)
   {
      pidList = cpid;
   }

   if (pidList.length > 0)
   {
      pidList = "data=" + pidList;
      $("#pSearch").hide();
      prevLoad();
   }
   else
   {
      $("#PrevProviders").hide();
      $("#PrevDiv").hide();
      $("#Loading").hide();
   }

   if (category)
   {
      $(".ProviderCategory").hide();
   }
   
   if (!showRating)
   {
      $(".ProviderRating").hide();
   }
   
   $("#addForm").validate(); // Setup Validation for Add form

   $("#pdiv").hide();
   $("#AddProvider").hide();

   $("#Search").click(function () {
      if (validateSearchParms())
      {
         submitProvider("");
         selectPid = "";
         $("#pSearch").fadeOut("fast", function () { listLoad(1); });
      }
   });
   $("#Add").click(addProvider);  // Set the Add submit button to the add Provider 
   $("#NotListed").click(function () {
      $("#pdiv").slideUp("fast", function() { $("#AddProvider").slideDown(); });
   });
   $("#Back").click(function () {
      $("#AddProvider").slideUp("fast", function() { $("#pSearch").slideDown("fast"); });
   });
   $("#RedoSearch").click(function () {
      $("#pdiv").fadeOut("fast", function () {$("#pSearch").fadeIn("fast"); clearSearch(); }); 
   });
   $("#StartSearch").click(function() {
      $("#PrevDiv").slideUp("fast", function() { $("#pSearch").slideDown(); });
   });
   $("#PrevProviders").click(function() {
      $("#pSearch").slideUp("fast", function() { $("#PrevDiv").slideDown("fast", resetTable); });
   });
   $(".Submitter").click(function () {
      if (selectPid > 0)
      {
         submitProvider(selectPid);
      }
      else
      {
         $("#ProviderName").html("You have not specified a provider!");
      }
   });
   $(".Anonymous").click(function () {
      submitProvider(-1);
   });
   
   $("#DoClear").click(function () {
      $('.search').val("");
      $.cookie('Providers', null);
   });
   
   setCategory();
   $("#CheckDoctor").click(setCategory);
   $("#CheckCNM").click(setCategory);
   $("#CheckLM").click(setCategory);
   
   if (cpid==-1) { $(".Anonymous").click(); }
   
   if (searchOnly) {
      $("#pListTabs > ul").tabs({
         
         show : function(event, ui) {
            if ((ui.panel.id == "mapList") && (typeof map!="undefined")) {
               map.checkResize();
               map.setZoom(map.getBoundsZoomLevel(myBounds) - 1);
               map.setCenter(myBounds.getCenter());
            }
         }
      });
   }
   
   $('#selectAll').click( function() { $('.providerType').attr('checked', true); });
   $('#selectNone').click( function() { $('.providerType').attr('checked', false); });
   
   window.onbeforeunload = function () {
      if (searchTotal > 0) {
         return "You are about to loose all your search parameters and results.  Do you wish to continue?";
      }
   }

});
