function getElementsByClassName(strClass, strTag, objContElm) {
  strTag = strTag || "*";
  objContElm = objContElm || document;
  var objColl = objContElm.getElementsByTagName(strTag);
  if (!objColl.length &&  strTag == "*" &&  objContElm.all) objColl = objContElm.all;
  var arr = new Array();
  var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
  var arrClass = strClass.split(delim);
  for (var i = 0, j = objColl.length; i < j; i++) {
    var arrObjClass = objColl[i].className.split(' ');
    if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
    var c = 0;
    comparisonLoop:
    for (var k = 0, l = arrObjClass.length; k < l; k++) {
      for (var m = 0, n = arrClass.length; m < n; m++) {
        if (arrClass[m] == arrObjClass[k]) c++;
        if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
          arr.push(objColl[i]);
          break comparisonLoop;
        }
      }
    }
  }
  return arr;
}

// To cover IE 5.0's lack of the push method

/* interfers with sifr, if it's obsolete, delete
Array.prototype.push = function(value) {
  this[this.length] = value;
}
*/

function placeWindowedImage(img, cntr) {

  // ie craps out... just exit, images will be top,left
  if ( img.width == 0 ) { return; }

  // sigh... semi hack for right now. until ajax load of search grid.
  if ( cntr.offsetWidth == 0 ) {

    // to make it easier ... how to pass a dom element? copy essense of
    // getStyle here.
    if (cntr.currentStyle) {
      var w = cntr.currentStyle['width'];
      var h = cntr.currentStyle['height'];
    } else if (window.getComputedStyle) {
      var w = document.defaultView.getComputedStyle(cntr,null).getPropertyValue('width');
      var h = document.defaultView.getComputedStyle(cntr,null).getPropertyValue('height');
    }
    w = (w.split('px'))[0];
    h = (h.split('px'))[0];

  } else { var w = cntr.offsetWidth; var h = cntr.offsetHeight; }
  var tmp = ((img.width - w) / -2);
  img.style.left = tmp.toString() + "px";
  tmp = ((img.height - h) / -2);
  img.style.top = tmp.toString() + "px";
}

function mtrShow(cntr, subCntr) {
  $$('div.lightbox-content > form').invoke('hide'); 
  $(cntr).show();
  if ( subCntr != '' && subCntr != null ) {
    $$('div.lightbox-content > form#'+ cntr +' > div').invoke('hide');
    $(subCntr).show();
  }
}

function mtrSrchRslt() {

  new Ajax.Request('/index.php/monitor/searchplants', {
    method: 'get',
    onComplete: function(res) {
      var oJson = eval(res.responseText);

      // Did we get any search results?
      if (oJson.length == 0) {
        mtrShow('search_result', 'search_result_noplant');
        return;
      }

      var plantSelect = $('search_plant_list');

      // Clear out any previous search results.
      plantSelect.options.length = 0;

      // load all plants
      for (i=0; i<oJson.length; i++) {
        var plant = oJson[i];
        var disp = plant.name + " - " + plant.genus;
        if ( (plant.species != '') && (plant.species != null) ) {
          disp += " " + plant.species;
        }
        if ( (plant.cultivar != '') && (plant.cultivar != null) ) {
          disp += " '" + plant.cultivar + "'";
        }
        var option = new Option(disp, plant.image);
        option.innerHTML = disp;
        option.id = plant.id;
        plantSelect.insert(option);
      }
              
      // select first plant
      plantSelect[0].selected = true;
      $('search_plant_image').src = '/images/plants/'+plantSelect[0].value;

      mtrShow('search_result', 'search_result_plant');
    },
    parameters: Form.serialize("search")
  });
}

// Try to get the selected row from our myPlants select box or
// search results select box.  If good, set hidden id input and proceed,
// if not show failCntr.
// Check if probe is inserted.  init appropriate dialog.
function mtrTrySlct(slctNm, failCntr) {

  // Check what I selected is good.
  var slctBx = $(slctNm);

  if ( (slctBx.options.length > 0) && (slctBx.selectedIndex != -1) ) {

    var slctdPlnt = slctBx[slctBx.selectedIndex];
    $('pid').value = slctdPlnt.id;
  } else {

    mtrShow(failCntr);
    return;
  }

  mtrTryUpld(slctdPlnt.id);
}

function mtrTryUpld(pid) {
  // User timeout check
  checkUserState();

  // Check if a probe is there.
  new Ajax.Request('/index.php/monitor/isprobeinserted', {
    method:'get',
    onComplete:function(response) {
      var o = response.headerJSON;
      if (o.isProbeInserted == 0) {            

         // This is the part of monitor flow that would be expecting a sensor
         initWaitingLightbox();
         mtrShow('upload_form', 'no_probe');
      } else {
        uploadPlant(pid);
      }
    },
    parameters: {id: pid}
  });
}
 
var oPeriodicalUpdater; 
 
function cancelUploadPlant(pid, isTimedOut) {

  new Ajax.Request('/index.php/myplants/plantcancelupload', { 
    method:'post',
    parameters: {id: pid, isTimedOut: isTimedOut}, 
    onSuccess:function(request, json)
    {
      oPeriodicalUpdater.stop();
    }
  });
}

function deletePlant(pid, isTimedOut) {
  new Ajax.Request('/index.php/myplants/plantuploadelete', { 
    method:'post',
    parameters: {id: pid, isTimedOut: isTimedOut}
  });
            
  oPeriodicalUpdater.stop();
  cancelUploadPlant(pid, isTimedOut); 
}
  
function uploadPlant(pid) {
 
  mtrShow('upload_form', 'upload_plant'); 
  new Ajax.Request('/index.php/myplants/plantupload', {
    method:'post',
    parameters: {id: pid},
    onComplete:function(request, json) {

      var count = 0;       
      oPeriodicalUpdater = new Ajax.PeriodicalUpdater(' ', '/index.php/myplants/plantuploadcheck',
      {
        method: 'post',
        frequency: 4,
        parameters: { id: pid },
        onSuccess:function(request, json) {

          var oJson = eval(json);
          count++;
          
          if (oJson.isPlantUploaded == 'true' || count == 5) {
            if (count == 5)
            {
              deletePlant(pid, 'true');
            }
            else
            {
              deletePlant(pid, 'false');
            }
            new Effect.Fade("upload_plant", {duration:1, queue:{scope: 'fadeovers', position: 'end'}});
          }

          if (count == 5) {
            new Effect.Appear("uploaded_error", {duration:1, queue:{scope: 'fadeovers', position: 'end'}});
          } else if( oJson.isPlantUploaded == 'true' ) {
            new Effect.Appear("uploaded", {duration:1, queue:{scope: 'fadeovers', position: 'end'}});     
          } 
        }
      });      
    } 
  });
}

var sReadingType = "";
var sBaseurl = "/index.php/";
 
function cancelNewReading(isTimedOut) {

  new Ajax.Request(sBaseurl + 'util/cancelreading', { 
    method:'post',
    parameters: {type: sReadingType, isTimedOut: isTimedOut},
    onSuccess:function(request, json)
    {
      oReadingPeriodicalUpdater.stop();
    }
  });
}
 
function newReading(baseurl, readingType)
{  
  sReadingType = readingType;
  sBaseurl = baseurl;

  $$('div.lightbox-content > div').invoke('hide');
  
  new Effect.Appear("ajax_working", {duration:1, queue:{scope: 'fadeovers', position: 'end'}});
  
  new Ajax.Request(baseurl + 'util/newreading', {
    method:'post',
    asynchronous:true, 
    evalScripts:false, 
    parameters: {type: sReadingType},
    onComplete:function(request, json)
    {
      var count = 0;

      oReadingPeriodicalUpdater = new Ajax.PeriodicalUpdater(' ', baseurl + 'util/newreadingcheck',
      {
        method: 'post',
        frequency: 4,
        parameters: {type: sReadingType},
        onSuccess:function(request, json)
        {
          var oJson = eval(json);
          count++;
          
          if (oJson.isReadingUploaded == 'true' || count == 5)
          {
            if (count == 5)
            {
              cancelNewReading('true');
            }
            else
            {
              cancelNewReading('false');
            }
            new Effect.Fade("ajax_working", {duration:1, queue:{scope: 'fadeovers', position: 'end'}});
            
            if (count == 5)
            {
              new Effect.Appear("setModeErr", {duration:1, queue:{scope: 'fadeovers', position: 'end'}});
            }
            else
            {
              new Effect.Appear("setModeCmp", {duration:1, queue:{scope: 'fadeovers', position: 'end'}});     
            }            
          }
        }
      });      
    } 
  }); 
}

function deleteProbe(delete_button, url) 
{
  var editInfoForm = delete_button.up(2); 
  
  if (confirm('Are you sure you want to delete this location?'))
  {
    editInfoForm.action = url;
    editInfoForm.submit();   
  }
}

function setMonitorState(i)
{
  $('monitor_state').value = i;
}

function updateMonitorState(i)
{
  if (i == 2) {
    $('p').value = "1";
  } else if (i == 4) {
    $('p').value = "0";
  }
}

function refreshMonitorSearchGrid(id, url)
{
  $('q').value = $('search_plant').value;

  updateMonitorState($('monitor_state').value);

  new Ajax.Updater('plant_search_grid' + id, url, {
    method:'get',
    parameters:Form.serialize("search_plant_form"),
    onSuccess:function(request, json){
      i = $('monitor_state').value;
    
      if (i == 1) {
        $('monitor_title').innerHTML = 'Monitor : Find Plants';        
      
      } else if (i == 2) {
        $('monitor_title').innerHTML = 'Monitor : My Plants';
        $('search_plant').value = "";
        $('monitor_search_plants').hide();
        $('monitor_select_plants').show();
            
      } else if (i == 3) {
        $('monitor_title').innerHTML = 'Monitor : Find Plants : Search Term';
        $('monitor_search_plants').show();
        $('monitor_myplants').show();
        $('monitor_start').hide();
        $('search_term').innerHTML = $('search_plant').value;
            
      } else if (i == 4) {
        $('monitor_title').innerHTML = 'Monitor : Find Plants : Search Term';
        $('monitor_search_plants').show();
        $('monitor_select_plants').hide();
      }
      
      $('p').value = "0";
    }
  });
}

function refreshSearchGrid(id, url)
{
  var shwUpate = false;
  
  if (shwUpate == true)
  {
    var iLeft = (document.viewport.getWidth()-$('messagebox').getWidth())/2
    var iTop = 150;  
    $('messagebox').setStyle({visibility: 'visible', left: iLeft+'px', top: iTop+'px'});
  }
  
  new Ajax.Updater('plant_search_grid'+id, url, {
    method:'get',
    parameters:Form.serialize('search_form'+id),
    evalScripts: true,
    onComplete: function(){
      if (shwUpate == true)
      {
        $('messagebox').style.visibility = 'hidden';
      }
    }
  });
}
  
function movePlantInfo(id){
  $$('div[id="plant_search_grid'+ id +'"] > ul > li > p').each(function(plant_info, plant_info_index) {plant_info.setStyle({ top: '65px', left: '65px' });});
}

function observeSearchFormat(probe_id, url){
  new Form.EventObserver("search_form" + probe_id, 
    function(element, value) {
      refreshSearchGrid(probe_id, url);
    })
};


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);
}

var ImagePicker = Class.create({
  initialize: function(plantId, numberToPreload)
  {
    this.registeredImages = new Object();
    this.preloadCount = 0;
    this.allPreloaded = 0;
    this.selectedImageID = plantId+"original_image";
    this.plantId = plantId;
    this.numberToPreload = numberToPreload;
	},
	
	registerImage: function(id, image, html, caption)
	{
    this.registeredImages[id] = new Object();
    this.registeredImages[id].image = image;
    this.registeredImages[id].html = html;
    this.registeredImages[id].caption = caption;
    
    if ( this.preloadCount < this.numberToPreload ) {
      var imagePreloader = new Image();
      imagePreloader.src = image;
      this.preloadCount++;
    }
	},
	
	displayImage: function(id)
	{
   if ( id == this.selectedImageID ) return;
  
    this.selectedImageID = id;
    document.getElementById(this.plantId+'prodImageCell').innerHTML = this.registeredImages[id].html;
    document.getElementById(this.plantId+'prodImageCaption').innerHTML = this.registeredImages[id].caption;
  
    for ( elementID in this.registeredImages ) {
      var imageThumbnail = document.getElementById(elementID);
      if (imageThumbnail != null) {
        imageThumbnail.style.border = '1px solid #999999';
      }
      if ( !this.allPreloaded ) {
        var imagePreloader = new Image();
        imagePreloader.src = this.registeredImages[elementID].image;
      }
    }
  
    document.getElementById(id).style.border = '1px solid #990000';
  
    this.allPreloaded = 1;
	}
});


function checkUserState()
{
  // User timeout check
  new Ajax.Request('/index.php/util/userstate', {
    method:'post',
    asynchronous: true,
    onComplete:function(request, json)
    {     
      var oJson = eval(json);
      
      if (oJson.userstate != 1) 
      {
        myModalbox.end();
        window.location = oJson.userstate;
      }
    }
  });
}
