(function($)
{
	var defaults =
	{
		calId: 0,
		cssName: "default",
		startDate: -1,
		endDate: -1,
		selectedDate: -1,
		showPrevNext: true,
		allowOld: true,
		showAlways: false,
		position: "absolute",
        varyasyon: false,
        saat_aralik: [08, 19],
        saat_arasinda: true
	};

    var saatAyar = {
        div: "siparis-zamanlama",
        saatClass: "saat",
        saatDakika: "dakika"
    };//sayar son

	var methods =
	{
		init: function(options)
		{
			return this.each(function()
			{
				var self = $(this);
				var settings = $.extend({}, defaults);

				// Save the settings and id
				settings.calId = self[0].id+"-gldp";
				if(options) { settings = $.extend(settings, options); }
				self.data("settings", settings);

				// Bind click and focus event to show
				self
					.click(methods.show)
					.focus(methods.show);

				// If always showing, trigger click causing it to show
				if(settings.showAlways)
				{
					setTimeout(function() { self.trigger("focus"); }, 50);
				}

				// Bind click elsewhere to hide
				$(window).bind("click", function(e)
				{
					methods.hide.apply(self);
				});
			});
		},

		// Show the calendar
		show: function(e)
		{
			e.stopPropagation();
			// Instead of catching blur we'll find anything that's made visible
			methods.hide.apply($("._gldp").not($(this)));
			methods.update.apply($(this));
           
		},

		// Hide the calendar
		hide: function()
		{
			if($(this).length)
			{

				var s = $(this).data("settings");

				// Hide if not showing always
				if(!s.showAlways)
				{
					// Hide the calendar and remove class from target
					$("#"+s.calId).slideUp(200);
					$(this).removeClass("_gldp");
				}
			}
		},

		// Set a new start date
		setStartDate: function(e)
		{
			$(this).data("settings").startDate = e;
		},

		// Set a new end date
		setEndDate: function(e)
		{
			$(this).data("settings").endDate = e;
		},

		// Set a new selected date
		setSelectedDate: function(e)
		{
			$(this).data("settings").selectedDate = e;
		},

		// Render the calendar
		update:function()
		{
			var target = $(this);
			var settings = target.data("settings");

			// Get the calendar id
			var calId = settings.calId;

			// Get the starting date
			var startDate = settings.startDate;
			if(settings.startDate == -1)
			{
				startDate = new Date();
				startDate.setDate(1);
			}
			startDate.setHours(0,0,0,0);
			var startTime = startDate.getTime();

			// Get the end date
			var endDate = new Date(0);
			if(settings.endDate != -1)
			{
				endDate = new Date(settings.endDate);
				if((/^\d+$/).test(settings.endDate))
				{
					endDate = new Date(startDate);
					endDate.setDate(endDate.getDate()+settings.endDate);
				}
			}
			endDate.setHours(0,0,0,0);
			var endTime = endDate.getTime();

			// Get the selected date
			var selectedDate = new Date(0);
			if(settings.selectedDate != -1)
			{
				selectedDate = new Date(settings.selectedDate);
				if((/^\d+$/).test(settings.selectedDate))
				{
					selectedDate = new Date(startDate);
					selectedDate.setDate(selectedDate.getDate()+settings.selectedDate);
				}
			}
			selectedDate.setHours(0,0,0,0);
			var selectedTime = selectedDate.getTime();

			// Get the current date to render
			var theDate = target.data("theDate");
				theDate = (theDate == -1 || typeof theDate == "undefined") ? startDate : theDate;

			// Calculate the first and last date in month being rendered.
			// Also calculate the weekday to start rendering on
			var firstDate = new Date(theDate); firstDate.setDate(1);
			var firstTime = firstDate.getTime();
			var lastDate = new Date(firstDate); lastDate.setMonth(lastDate.getMonth()+1); lastDate.setDate(0);
			var lastTime = lastDate.getTime();
			var lastDay = lastDate.getDate();

			// Calculate the last day in previous month
			var prevDateLastDay = new Date(firstDate);
				prevDateLastDay.setDate(0);
				prevDateLastDay = prevDateLastDay.getDate();

			// The month names to show in toolbar
           
			var monthNames = ["Ocak", "Şubat", "Mart", "Nisan", "Mayis",  "Haziran", "Temmuz", "Ağustos", "Eylül",  "Ekim", "Kasım",  "Aralık"];

			// Save current date
			target.data("theDate", theDate);

			// Render the cells as <TD>
			var days = "";
			for(var y = 0, i = 0; y < 6; y++)
			{
				var row = "";

				for(var x = 0; x < 7; x++, i++)
				{
					var p = ((prevDateLastDay - firstDate.getDay()) + i + 1);
					var n = p - prevDateLastDay;
					var c = (x == 0) ? "sun" : ((x == 6) ? "sat" : "day");

					// If value is outside of bounds its likely previous and next months
					if(n >= 1 && n <= lastDay)
					{
						var today = new Date(); today.setHours(0,0,0,0);
						var date = new Date(theDate); date.setHours(0,0,0,0); date.setDate(n);
						var dateTime = date.getTime();

						// Test to see if it's today
						c = (today.getTime() == dateTime) ? "today":c;

						// Test to see if we allow old dates
						if(!settings.allowOld)
						{
							c = (dateTime < startTime) ? "noday":c;
						}

						// Test against end date
						if(settings.endDate != -1)
						{
							c = (dateTime > endTime) ? "noday":c;
						}

						// Test against selected date
						if(settings.selectedDate != -1)
						{
							c = (dateTime == selectedTime) ? "selected":c;
						}
					}
					else
					{
						c = "noday"; // Prev/Next month dates are non-selectable by default
						n = (n <= 0) ? p : ((p - lastDay) - prevDateLastDay);
					}

					// Create the cell
					row += "<td class='gldp-days "+c+" **-"+c+"'><div class='"+c+"'>"+n+"</div></td>";
				}

				// Create the row
				days += "<tr class='days'>"+row+"</tr>";
			}

			// Determine whether to show Previous arrow
			var showP = ((startTime < firstTime) || settings.allowOld);
			var showN = ((lastTime < endTime) || (endTime < startTime));

			// Force override to showPrevNext on false
			if(!settings.showPrevNext) { showP = showN = false; }

			// Build the html for the control
			var titleMonthYear = monthNames[theDate.getMonth()]+" "+theDate.getFullYear();

                                 
			var html =
				"<div class='**'>"+
					"<table>"+
						"<tr>"+ /* Prev Month/Year Next*/
							("<td class='**-prevnext prev'>"+(showP ? "◄":"")+"</td>")+
							"<td class='**-monyear' colspan='5'>{MY}</td>"+
							("<td class='**-prevnext next'>"+(showN ? "►":"")+"</td>")+
						"</tr>"+
						"<tr class='**-dow'>"+ /* Day of Week */
							"<td>Pt</td><td>Sa</td><td>Ça</td><td>Pe</td><td>Cu</td><td>Ct</td><td>Pz</td>"+
						"</tr>"+days+
					"</table>";

			// Replace css, month-year title
			html = (html.replace(/\*{2}/gi, "gldp-"+settings.cssName)).replace(/\{MY\}/gi, titleMonthYear);

			// If calendar doesn't exist, make one
			if($("#"+calId).length == 0)
			{
				jQuery("#MightyContainer").after
				(
					$("<div id='"+calId+"'></div>")
					.css(
					{
						"position":settings.position,
						"z-index":settings.zIndex,
						"left":(target.offset().left),
						"top":target.offset().top+target.outerHeight(true)
					})
				);
			}


            // Show calendar
			var calendar = $("#"+calId);
			calendar.html(html).slideDown(200);


			// Add a class to make it easier to find when hiding
			target.addClass("_gldp");

			// Handle previous/next clicks
			$("[class*=-prevnext]", calendar).click(function(e)
			{
				e.stopPropagation();

				if($(this).html() != "")
				{ 
					// Determine offset and set new date
					var offset = $(this).hasClass("prev") ? -1 : 1;
					var newDate = new Date(firstDate);
						newDate.setMonth(theDate.getMonth()+offset);

					// Save the new date and render the change
					target.data("theDate", newDate);
					methods.update.apply(target);
				}
			});

            saatSec = this.saatSec;

			// Highlight day cell on hover
			$("tr.days td:not(.noday, .selected)", calendar)
				.mouseenter(function(e)
				{
					var css = "gldp-"+settings.cssName+"-"+$(this).children("div").attr("class");
					$(this).removeClass(css).addClass(css+"-hover");
				})
				.mouseleave(function(e)
				{
					if(!$(this).hasClass("selected"))
					{
						var css = "gldp-"+settings.cssName+"-"+$(this).children("div").attr("class");
						$(this).removeClass(css+"-hover").addClass(css);
					}
				})
				.click(function(e)
				{

					e.stopPropagation();
					var day = $(this).children("div").html();
					var settings = target.data("settings");
                    
                     
                    var curdate = new Date()
					var newDate = new Date(theDate);
                    newDate.setDate(day);
                    newDate.setHours(01,30,01);
                    
                    var sectiGun = jQuery("div", this).eq(0).text();

                    if (jQuery(this).attr("secilimi") != "secti") {
					    target.data("theDate", newDate);
                        var saat = (sectiGun == curdate.getDate() ? (curdate.getHours() + 2 ) +":00" : settings.saat_aralik[0] +":00" );

                        if (settings.saat_arasinda == true) {
                            target.val(sifirla(newDate.getDate())+"/"+sifirla((newDate.getMonth()+1))+"/"+newDate.getFullYear()); // + " " + sifirla(newDate.getHours()) + ":"+ sifirla(newDate.getMinutes()));
                        } else {
                            target.val(sifirla(newDate.getDate())+"/"+sifirla((newDate.getMonth()+1))+"/"+newDate.getFullYear() + " "+ saat); // + " " + sifirla(newDate.getHours()) + ":"+ sifirla(newDate.getMinutes()));
                        }
                     };


                    // Run callback to user-defined date change method
					if(settings.onChange != null && typeof settings.onChange != "undefined")
					{
						settings.onChange(target, newDate);
					}

					// Save selected
					settings.selectedDate = newDate;
                    
                    if (jQuery(this).attr("secilimi") != "secti") {
                        //############################
                        methods.saatSec(jQuery(this), newDate, sifirla, target, methods); 
                        //#############################
                    }
                    
                    jQuery(".days td").removeAttr("secilimi");
                    jQuery(this).attr("secilimi", "secti");

					// Hide calendar
                    function sifirla(sifirlanacak) {
                        if (sifirlanacak < 10 ) { return "0" + sifirlanacak; } else { return sifirlanacak; }
                    }
				});
		},

        saatSec: function(seciliGun, newDate, sifirla, target, methods){
            saatDiv = jQuery("div."+ saatAyar.div);
            //eski saat seçimi sil
            saatDiv.fadeOut('fast', function(){ jQuery(this).remove();});
            //Yenisini Yerleştir..
            //saat ver dakikayı yerleştir
	        var settings = target.data("settings");

            var curdate = new Date();
                curdate.setHours(11);
                curdate.setMinutes(55);

            var sectiGun = jQuery("div", seciliGun).eq(0).text();

            saat = jQuery("select."+ saatAyar.saatClass);
            dakika = jQuery("select."+ saatAyar.saatDakika);

            if (settings.saat_arasinda == true) {
                 methods.hide.apply(target);
                 if (jQuery("select#saat_aralik")[0] === undefined) {
                    var selectaralik = jQuery("<select/>", {"id": "saat_aralik"});
                    jQuery("#teslimat-tarihi-secildi").after("<label for='saat_aralik'>Teslimat Zamanı</label><select id='saat_aralik'></select>");
                 }

                 jQuery("select#saat_aralik").empty();
                 if (curdate.getDate() == sectiGun) {
                    for (i=(curdate.getHours() + 2 ); i< settings.saat_aralik[1]; i++) {
                        jQuery("select#saat_aralik").append("<option value='"+ sifirla(i) +"'>"+sifirla(i)+":00 - "+sifirla(i+4)+":00</option>");
                    };
                    
                 } else {
                    for (i=settings.saat_aralik[0]; i< settings.saat_aralik[1]; i++) {
                        jQuery("select#saat_aralik").append("<option value='"+ sifirla(i) +"'>"+sifirla(i)+":00 - "+sifirla(i+4)+":00</option>");
                    };
                    
                 }

            } else {
                seciliGun.append("<div class='" + saatAyar.div + "'></div>");
                jQuery("div."+ saatAyar.div).append("<select class='"+ saatAyar.saatClass +"'></select> : <select class='"+ saatAyar.saatDakika +"'></select>");

                var saat2 = jQuery("select."+ saatAyar.saatClass);
                var dakika2 = jQuery("select."+ saatAyar.saatDakika);

            if (curdate.getDate() == sectiGun) {
                for (i=(curdate.getHours() + 2 ); i< settings.saat_aralik[1]; i++) {
                    saat2.append("<option value='"+ sifirla(i) +"'>"+sifirla(i)+"</option>");
                };

            } else {
                for (i=settings.saat_aralik[0]; i< settings.saat_aralik[1]; i++) {
                    saat2.append("<option value='"+ sifirla(i) +"'>"+sifirla(i)+"</option>");
                };

            }

            for (i=0; i<7; i++) {
                dakika2.append("<option value='"+i+"0'>"+i+"0</option>"); 
            };
            }

            jQuery("div."+ saatAyar.div, seciliGun).fadeIn('fast');
            htmlekle =  "<div class='basketCount'>" +  
                                "<input type='number' size='1' min='1' name='quantity' id='quantity' value='1' />" + 
                                "</div>" + 
                                "<div class='submitBtnC'>" + 
                                    "<input type='button' style='cursor:pointer;' name='addcart' value='Sepete At' id='sepete_at'>" + 
                                "</div>";
                if (settings.varyasyon == true) {
                    jQuery("div.addToBasketBtnC").html(htmlekle);
                }


            jQuery("#teslimat-tarihi-secildi").hide().html(jQuery("#id_teslimat_tarihi").val()).fadeOut(function(){
                   jQuery(this).fadeIn('slow'); 
            })
            jQuery("label[for='id_teslimat_tarihi']").show();

            jQuery("#id_teslimat_tarihi-gldp").css({"top": "452px"});
            jQuery("select.saat").change(function(e){
                newDate.setHours(jQuery(this).val(), 00, 00);

		        target.val(sifirla(newDate.getDate())+"/"+sifirla((newDate.getMonth()+1))+"/"+newDate.getFullYear() + " " + sifirla(newDate.getHours()) + ":00");
                jQuery("#teslimat-tarihi-secildi").html(jQuery("#id_teslimat_tarihi").val())
                if (settings.saat_arasinda == true) {
                    } else {
                    }

                });

            jQuery("select.dakika").change(function(){
                newDate.setHours(jQuery("select."+ saatAyar.saatClass).val(), jQuery(this).val(), 00);
		        target.val(sifirla(newDate.getDate())+"/"+sifirla((newDate.getMonth()+1))+"/"+newDate.getFullYear() + " " + sifirla(newDate.getHours()) + ":"+ sifirla(newDate.getMinutes()));
                if (settings.saat_arasinda == true) {
                } else {
                }
                jQuery("#teslimat-tarihi-secildi").html(jQuery("#id_teslimat_tarihi").val())
            });
        }
	};

	// Plugin entry
	$.fn.glDatePicker = function(method)
	{
		if(methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); }
		else if(typeof method === "object" || !method) { return methods.init.apply(this, arguments); }
		else { $.error("Method "+ method + " does not exist on jQuery.glDatePicker"); }
	};
})(jQuery);

