var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();


(function($) {

$.fn.serializeJSON = function(){

    var d = $(this).serializeArray();

    var data={};
    for(var i=0;i<d.length;i++) {
        if (typeof data[d[i].name] != 'undefined') {
            if (data[d[i].name].constructor!= Array) {
                data[d[i].name]=[data[d[i].name],d[i].value];
            } else {
                data[d[i].name].push(d[i].value);
            }
        } else {
            data[d[i].name]=d[i].value;
        }
    }

    return data;

};

// Used by shadowbox to handle form submissions
$.fn.interceptSubmit = function(callback,type){

  var form = jQuery(this);

  type = type !== undefined ? type : "json";
  callback = callback !== undefined ? callback : "function(){}";
  var url = form.attr('action');

  form.submit(function(event){
    event.preventDefault();
    $.post(url,form.serialize(),callback,type);
  });

  return this;
}

$.fn.addFormErrors = function(errors, addMessages){

  addMessages = typeof(addMessages) != 'undefined' ? addMessages : true;

  // clear previous errors
  this.removeFormErrors();

  for(var field in errors){

    // http://reference.sitepoint.com/css/css3attributeselectors
    if(BrowserDetect.browser == "Explorer"){
      this.find('label[htmlFor$="' + field + '"]').first().addClass("error");
    }
    else{
      this.find('label[for$="' + field + '"]').first().addClass("error");
    }

    this.find('*[id$="_' + field + '"]').addClass("error");

    if(addMessages){
      $('<div class="errorMessage">'+errors[field]+'</div>').insertAfter(this.find('*[id$="_' + field + '"]').first());
    }
  }
 
  return this;

};

$.fn.removeFormErrors = function(){
  this.each(function(){
    $(this).find('.errorMessage').remove();
    $(this).find('*').removeClass('error');
  });
  return this;
};

$.fn.resetForm = function(){
  this.each(function(){
    $(this).removeFormErrors();
    $(this)[0].reset();
  });
  return this;
};

$.fn.disableLink = function(newclass){
  if(newclass === undefined){ newclass = 'disabled'; }
  this.each(function(){
    $(this).removeAttr('href').attr('onClick','return false;').addClass(newclass);
  });
  return this;
}

$.fn.bytTimepicker = function(setDefault){

  setDefault = setDefault === undefined ? true : false;

  var data;

  // 0.7 args
  // var format = "{h:01.d}:{m:02.d}{z:s}";

  // 0.6 args
  var format = "{h:01.d}:{m:02.d}{suffix:s}";

// FIXME: field doesn't display updated time after first invocation, first call is sticky
  if(setDefault){

    $.ajax({
      url:'/site/currentTime',
      async:false,
      dataType:'json',
      success:function(json){data = json;}
    });

    var hours;
    var minutes;
    var suffix = "am";
                                     
    if(data === undefined){
      // fall back to local time
      var currentTime = new Date()
      hours = currentTime.getHours()
      minutes = currentTime.getMinutes()
    }
    else{
      hours = data.hours;
      minutes = data.minutes;
    }   

    if(hours >= 12){
      suffix = "pm";
      hours = hours - 12;
    }
    if(hours == 0){
      hours = 12;
    }
    if(minutes < 10){
      minutes = "0" + minutes
    }

    // 0.7 args
    // var time = {h:hours,m:minutes,z:suffix};

    // 0.6 args
    var time = hours + ":" + minutes + suffix;

    this.each(function(){
      $(this).timepickr({
          'resetOnBlur':false,
          'convention':12,
          'format12':format,
          'val':time
          });
    });

  } else {

    this.each(function(){
      $(this).timepickr({
          'resetOnBlur':false,
          'convention':12,
          'format12':format
          });
    });

  }

  return this;
}

$.fn.bytDatepicker = function(prepopulate, restrictDate){

  if(prepopulate === undefined) prepopulate = true;
  if(restrictDate === undefined) restrictDate = true;

  var currDate;

  if(prepopulate){
    var data;

    $.ajax({
      'url':'/site/currentTime',
      'async':false,
      'dataType':'json',
      'success':function(json){data=json;}
    });

    var month;
    var day;
    var year;

    if(data === undefined){
      // fall back to local time
      var currentTime = new Date()
      month = currentTime.getMonth();
      day = currentTime.getDate();
      year = new String(currentTime.getFullYear());
    }
    else{
      month = data.mon;
      day = data.mday;
      year = new String(data.year);
    }   

    if(month < 10){
      month = "0" + month;
    }
    if(day < 10){
      day = "0" + day;
    }

    currDate = month + "/" + day + "/" + year;    
  }

  var minDate;
  if(restrictDate){
    minDate = -0;
  }
  else{
    minDate = null;
  }

  this.each(function(){
    if(prepopulate && ($(this).attr('value') == '' || $(this).attr('value') === undefined)){
      $(this).attr('value', currDate);
    }
    $(this).datepicker({
        'autoSize': true,
        'constrainInput': true,
        'currentText': "Today",
        'defaultDate': +0,
        'duration': 400,
        'firstDay': 0,
        'minDate': minDate,
        'showAnim': "fadeIn"
        });
  });

  return this;
}

$.fn.increment = function(incrementCount){

  incrementCount = incrementCount !== undefined ? incrementCount : 1;

  this.each(function(){
    var val = $.trim($(this).text());
    if(val === ''){
      val = 0;
    }
    else if(val === undefined){
      val = 0;
    }
    else{
      val = parseInt(val);
    }

    $(this).text(val+1);

  });

  return this;
}

})(jQuery);
