var menu_active = 0;
var li;

function menu(obj,number)
{
    if(!li)
            return false;
		
    if(li[menu_active])
        li[menu_active].getElementsByTagName("img").item(0).src = "http://www.urlopswinoujscie.pl/images/menu_"+new Number(menu_active+1)+".gif";

    img = obj.getElementsByTagName("img");
    if(img.length>0)
    {
        img.item(0).src = "http://www.urlopswinoujscie.pl/images/menu_"+number+"_b.gif";
    }
}

function hide_pic(obj)
{
	obj.parentNode.removeChild(obj);
	odwroc_potwierdz_rezerwacje();
}

function show_pic(obj)
{

	background_start();
	div = document.createElement("div");

	new_img = document.createElement("img");
	new_img.src = obj.href;
	div.appendChild(new_img);
	
	div.onclick = function(){hide_pic(this)};
	document.getElementById("image").appendChild(div);
	document.getElementById("image").style.display = "block";
	
	return false;
}

function search_menu()
{
    if(!li)
		return false;
		
    for(i=0;i<li.length;i++)
    {
        img = li[i].getElementsByTagName("img");
        if(img.length>0)
        {
            img.item(0).src = "http://www.urlopswinoujscie.pl/images/menu_"+new Number(i+1)+".gif";
        }
    }

    if(li[menu_active])
        li[menu_active].getElementsByTagName("img").item(0).src = "http://www.urlopswinoujscie.pl/images/menu_"+new Number(menu_active+1)+"_b.gif";

}
function getMenuLi()
{
	li = document.getElementById("menu").getElementsByTagName("li");
}

function cleanCalendar()
{
	for(i=0;i<zarezerwowane_obj.length;i++)
	{
		zarezerwowane_obj[i][0].className=zarezerwowane_obj[i][1];
    }
    
	if(zarezerwowane_obj.length>0)
	{
		rezerwacja_start='';
		rezerwacja_stop='';
		rezerwacja_start_date='';
		rezerwacja_start_obj=null;
		rezerwacja_stop_obj=null;
	}
    zarezerwowane_obj = new Array();
}

function checkCalendarDay(obj)
{
	a_elements = obj.getElementsByTagName("a");
	if(a_elements.length==0 || !a_elements[0].onclick){
		cleanCalendar();
		alert("Podany okres pokrywa się już z terminem zarezerwowanym przez inną osobę");
		document.getElementById("price").innerHTML = "wybierz prawidłowy termin rezerwacji";
		return false;
	}
	
	return true;	
}

function strtotime(str, now) {
    // Convert string representation of date and time to a timestamp  
    // 
    // version: 905.3122
    // discuss at: http://phpjs.org/functions/strtotime
    // +   original by: Caio Ariede (http://caioariede.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: David
    // +   improved by: Caio Ariede (http://caioariede.com)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Wagner B. Soares
    // %        note 1: Examples all have a fixed timestamp to prevent tests to fail because of variable time(zones)
    // *     example 1: strtotime('+1 day', 1129633200);
    // *     returns 1: 1129719600
    // *     example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200);
    // *     returns 2: 1130425202
    // *     example 3: strtotime('last month', 1129633200);
    // *     returns 3: 1127041200
    // *     example 4: strtotime('2009-05-04 08:30:00');
    // *     returns 4: 1241418600
    var i, match, s, strTmp = '', parse = '';

    strTmp = str;
    strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
    strTmp = strTmp.replace(/[\t\r\n]/g, ''); // unecessary chars

    if (strTmp == 'now') {
        return (new Date()).getTime()/1000; // Return seconds, not milli-seconds
    } else if (!isNaN(parse = Date.parse(strTmp))) {
        return (parse/1000);
    } else if (now) {
        now = new Date(now*1000); // Accept PHP-style seconds
    } else {
        now = new Date();
    }

    strTmp = strTmp.toLowerCase();

    var __is =
    {
        day:
        {
            'sun': 0,
            'mon': 1,
            'tue': 2,
            'wed': 3,
            'thu': 4,
            'fri': 5,
            'sat': 6
        },
        mon:
        {
            'jan': 0,
            'feb': 1,
            'mar': 2,
            'apr': 3,
            'may': 4,
            'jun': 5,
            'jul': 6,
            'aug': 7,
            'sep': 8,
            'oct': 9,
            'nov': 10,
            'dec': 11
        }
    };

    var process = function (m) {
        var ago = (m[2] && m[2] == 'ago');
        var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);

        switch (m[0]) {
            case 'last':
            case 'next':
                switch (m[1].substring(0, 3)) {
                    case 'yea':
                        now.setFullYear(now.getFullYear() + num);
                        break;
                    case 'mon':
                        now.setMonth(now.getMonth() + num);
                        break;
                    case 'wee':
                        now.setDate(now.getDate() + (num * 7));
                        break;
                    case 'day':
                        now.setDate(now.getDate() + num);
                        break;
                    case 'hou':
                        now.setHours(now.getHours() + num);
                        break;
                    case 'min':
                        now.setMinutes(now.getMinutes() + num);
                        break;
                    case 'sec':
                        now.setSeconds(now.getSeconds() + num);
                        break;
                    default:
                        var day;
                        if (typeof (day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
                            var diff = day - now.getDay();
                            if (diff == 0) {
                                diff = 7 * num;
                            } else if (diff > 0) {
                                if (m[0] == 'last') {diff -= 7;}
                            } else {
                                if (m[0] == 'next') {diff += 7;}
                            }
                            now.setDate(now.getDate() + diff);
                        }
                }
                break;

            default:
                if (/\d+/.test(m[0])) {
                    num *= parseInt(m[0], 10);

                    switch (m[1].substring(0, 3)) {
                        case 'yea':
                            now.setFullYear(now.getFullYear() + num);
                            break;
                        case 'mon':
                            now.setMonth(now.getMonth() + num);
                            break;
                        case 'wee':
                            now.setDate(now.getDate() + (num * 7));
                            break;
                        case 'day':
                            now.setDate(now.getDate() + num);
                            break;
                        case 'hou':
                            now.setHours(now.getHours() + num);
                            break;
                        case 'min':
                            now.setMinutes(now.getMinutes() + num);
                            break;
                        case 'sec':
                            now.setSeconds(now.getSeconds() + num);
                            break;
                    }
                } else {
                    return false;
                }
                break;
        }
        return true;
    };

    match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);
    if (match != null) {
        if (!match[2]) {
            match[2] = '00:00:00';
        } else if (!match[3]) {
            match[2] += ':00';
        }

        s = match[1].split(/-/g);

        for (i in __is.mon) {
            if (__is.mon[i] == s[1] - 1) {
                s[1] = i;
            }
        }
        s[0] = parseInt(s[0], 10);

        s[0] = (s[0] >= 0 && s[0] <= 69) ? '20'+(s[0] < 10 ? '0'+s[0] : s[0]+'') : (s[0] >= 70 && s[0] <= 99) ? '19'+s[0] : s[0]+'';
        return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2])+(match[4] ? match[4]/1000 : ''), 10);
    }

    var regex = '([+-]?\\d+\\s'+
        '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
        '|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday'+
        '|thu\.?|thursday|fri\.?|friday|sat\.?|saturday)'+
        '|(last|next)\\s'+
        '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
        '|sun\.?|sunday|mon\.?|monday|tue\.?|tuesday|wed\.?|wednesday'+
        '|thu\.?|thursday|fri\.?|friday|sat\.?|saturday))'+
        '(\\sago)?';

    match = strTmp.match(new RegExp(regex, 'g'));
    if (match == null) {
        return false;
    }

    for (i in match) {
        if (!process(match[i].split(' '))) {
            return false;
        }
    }

    return (now.getTime()/1000);
}

var data_od = '';
var data_do = '';

var rezerwacja_start='';
var rezerwacja_stop='';
var rezerwacja_start_obj=null;
var rezerwacja_stop_obj=null;
var zarezerwowane_obj = new Array();

function getApartament()
{
    s = false;
    var elem = document.forms['rezerwacja'].elements;
    for(k=0;k<elem.length;k++)
    {
        if(elem[k].type=="radio" && elem[k].checked)
        {
            s=elem[k].value;
        }
    }

    if(s===false)
        alert("Nie wybrano apartamentu");

    return s;
}

function setCalendarDate(obj,date)
{

	if(!checkCalendarDay(obj.parentNode))
	{
		return false;
	}
    
	d = new Date(Date.parse(date));
    nazwa_klasy = "";
	index=0;
    klasa = "";
	if(!rezerwacja_start){
        cleanCalendar();
        nazwa_klasy = new String(obj.parentNode.className);
        zarezerwowane_obj.push(new Array(obj.parentNode,nazwa_klasy));
        if(nazwa_klasy=="weekend_reservated_end")
            klasa = "your_weekend_reservated_start";
        else if(nazwa_klasy=="reservated_end")
            klasa = "your_reservated_start";
        else if(nazwa_klasy=="weekend")
            klasa = "your_w_reservated_start";
        else
            klasa = "twoja_rezerwacja_start";

		
		rezerwacja_start = date;
		rezerwacja_start_obj = obj.parentNode;

        obj.parentNode.className=klasa;
	}else if(rezerwacja_start && !rezerwacja_stop){

		if(strtotime(rezerwacja_start)>=strtotime(date))
		{
			alert("Data końca pobytu nie może być wcześniejsza od daty rozpoczącia");
			cleanCalendar();
			document.getElementById("price").innerHTML = "Cena: Zaznacz termin rezerwacji";
			return false;
		}
		nazwa_klasy = new String(obj.parentNode.className);
        zarezerwowane_obj.push(new Array(obj.parentNode,nazwa_klasy));
        
        if(nazwa_klasy=="weekend_reservated_start")
            klasa = "your_weekend_reservated_end";
        else if(nazwa_klasy=="reservated_start")
            klasa = "your_reservated_end";
        else if(nazwa_klasy=="weekend")
            klasa = "your_w_reservated_end";
        else
            klasa = "twoja_rezerwacja_end";

		rezerwacja_stop = date;
		rezerwacja_stop_obj = obj.parentNode;
        
	 
		obj.parentNode.className=klasa;
		
		start=0;
		if(rezerwacja_start && rezerwacja_stop){
			koniec = 0;
		}else{
			koniec = 1;
		}
		index=0;
		while(!koniec)
		{
			td = document.getElementById("calendar").getElementsByTagName("td");

			for(i=0;i<td.length;i++)
			{
				if(td[i].id=="cat_"+rezerwacja_start)
				{
					start = 1;
				}else if(td[i].id=="cat_"+rezerwacja_stop)
				{
					//pobierz cene
					getPrice(rezerwacja_start,rezerwacja_stop,getApartament());
                                  
					start = 0;
                                        data_od = rezerwacja_start;
                                        data_do = rezerwacja_stop;
                                        document.getElementById("od").value = data_od;
                                        document.getElementById("do").value = data_do;
					rezerwacja_start='';
					rezerwacja_stop='';
					rezerwacja_start_obj=null;
					rezerwacja_stop_obj=null;
					koniec=1;
					index=0;

				}

                                    if(start && td[i].id && rezerwacja_stop){
					if(!checkCalendarDay(td[i]))
						return false;
					
					if(index>0){
						zarezerwowane_obj.push(new Array(td[i],new String(td[i].className)));
                                            td[i].className="twoja_rezerwacja";
                                        }
					index++;
					
                                    }
			
			}
			
			
		}
		
	}

	
	
	
	return false;
}

function checkKupon()
{
    var kupon_str = document.getElementById("kupon").value;
    if(kupon_str.length==0){
        document.getElementById("kupon_status").innerHTML="";
         return false;
    }
    advAJAX.get({ url: "http://www.urlopswinoujscie.pl/check_kupon?kupon="+kupon_str,
	 timeout : 13000,
	 onTimeout : function() { alert("Connection timed out."); },
	 retry: 0,

	 onRetry : function() { alert("Retry connection..."); },
	 onRetryDelay : function() { alert("Awaiting retry..."); },
	 onSuccess : function(obj) { checkKuponResponse(obj.responseXML); },
	 onError : function(obj) { alert("Error: " + obj.status); }
	});

				
}

function checkKuponResponse(xml)
{
    var kupon = xml.getElementsByTagName("kupon");
    var rabat_node = xml.getElementsByTagName("procent");
    if(rabat_node.length>0)
        rabat = rabat_node.item(0).firstChild.nodeValue;

    if(kupon.length>0)
    {

        if(kupon.item(0).firstChild.nodeValue==1){
            document.getElementById("kupon_status").innerHTML = "<span style='color:#11dd29;'>Kod prawid\u0142owy. Uwzględnimy w cenie "+rabat+"% rabatu.</span>";
            //pobierz cene
            getPrice(data_od,data_do,getApartament());
        }else{
            document.getElementById("kupon_status").innerHTML = "Kod nieprawid\u0142owy";
        }

    }
}

function getApartamentXml(id)
{
    cleanCalendar();
    advAJAX.get({
         url: "http://www.urlopswinoujscie.pl/rezerwacja_kalendarz_xml/?apartament="+id,
         timeout : 13000,
         onTimeout : function() { alert("Connection timed out."); },

         onRetry : function() { alert("Retry connection..."); },
         onRetryDelay : function() { alert("Awaiting retry..."); },
         onSuccess : function(obj) {
            months = obj.responseXML.getElementsByTagName("i");
            cal = document.getElementById("kalendarz_body");
            cal.innerHTML = "";
            for(k=0;k<months.length;k++){
                div = document.createElement("div");
                div.className = "month";
                div.innerHTML = months[k].firstChild.nodeValue;
                cal.appendChild(div);
            }

         },
         onError : function(obj) { alert("Error: " + obj.status); }
    });

    return true;
}

function getPrice(date1,date2,apartament)
{
    if(!apartament)
        return false;

    advAJAX.get({    url: "http://www.urlopswinoujscie.pl/cena_xml?date1="+date1+"&date2="+date2+"&apartament="+apartament+"&kupon="+document.getElementById("kupon").value,
         timeout : 13000,
         onTimeout : function() { alert("Connection timed out."); },

         onRetry : function() { alert("Retry connection..."); },
         onRetryDelay : function() { alert("Awaiting retry..."); },
         onSuccess : function(obj) { pokaz_cene(obj.responseXML,date1,date2); },
         onError : function(obj) { alert("Error: " + obj.status); }
    });

    return true;
}

function pokaz_cene(xml,date1,date2)
{
    ilosc_dni = "";
	var pln = xml.getElementsByTagName("pln");
	var euro = xml.getElementsByTagName("euro");
	var kurs = xml.getElementsByTagName("kurs");
    var ilosc_dni_node = xml.getElementsByTagName("days");
    if(ilosc_dni_node.length>0)
        ilosc_dni = ilosc_dni_node.item(0).firstChild.nodeValue;
	else
        ilosc_dni = "Nie pobrano";
    
    euro_get=true;
	
	if(pln.length == 0 || pln[0].childNodes.length==0)
	{
		document.getElementById("price").innerHTML = "Nie pobrano ceny";
		return false;
	}
	
	if(euro.length == 0 || euro[0].childNodes.length==0){
		euro_html = "-";
		euro_get=false;
	}else if(euro[0].childNodes.length > 0){
		euro_get = true;
		euro_html = " ≈ "+new Number(euro[0].firstChild.nodeValue).toFixed(2)+"  &euro;";
	}
	
	var price = new Number(pln[0].firstChild.nodeValue).toFixed(2)+" z\u0142"+euro_html+" ";
	
	if(euro_get && kurs.length > 0 && pln[0].childNodes.length>0)
	{
		price +="<br /><span style='font-size:9px;'>Kurs: "+kurs[0].firstChild.nodeValue+"z\u0142 = 1&euro;</span>";
	}

	document.getElementById("data_pobytu").innerHTML = ""+new Date(strtotime(date1)*1000).format("d-m-Y")+"&nbsp;godz.13:00 - "+new Date(strtotime(date2)*1000).format("d-m-Y")+"&nbsp;godz. 11:00 <span style='font-size:10px;'><br />(Ilo\u015bć noclegów:</span> "+parseInt(ilosc_dni)+")";
	document.getElementById("price").innerHTML = price;
	
}

function move_calendar(direction)
{
	var kalendarz_body = document.getElementById("kalendarz_body");
	var obj = document.getElementById("calendar");
	
	marginLeft = parseInt(kalendarz_body.style.marginLeft.replace(/px/,""));
	if(!marginLeft)
		marginLeft = 0;

	if(direction==1){
		if(Math.abs(marginLeft) < parseInt(kalendarz_body.style.width.replace(/px/,""))-700)
			kalendarz_body.style.marginLeft = parseInt(marginLeft-245)+"px";
	}else if(marginLeft<0){
		kalendarz_body.style.marginLeft = parseInt(marginLeft+245)+"px";
	}
	
}

function rezerwuj(only_check_errors)
{
    if(only_check_errors)
        check_errors = "check_errors=1";
    else
        check_errors = "check_errors=0";
 /**url: "http://www.urlopswinoujscie.pl/rezerwuj_xml/?name="+document.getElementById("name").value+"&surname="+document.getElementById("surname").value+"&email="+document.getElementById("email").value
            +"&date_start="+data_od+"&date_end="+data_do+"&phone="+document.getElementById("phone").value+"&kupon="+document.getElementById("kupon").value+"&partner="+document.getElementById("partner").value+check_errors+"&apartament=1"
   */
	advAJAX.submit(document.getElementById("rezerwuj_form"),{  
	 timeout : 13000,
     queryString: check_errors,
	 onTimeout : function() { alert("Connection timed out."); },

	 onRetry : function() { alert("Retry connection..."); },
	 onRetryDelay : function() { alert("Awaiting retry..."); },
	 onSuccess : function(obj) { 
         if(only_check_errors){
            rezerwuj_response(obj.responseXML);
         }else{

            pokaz_potwierdzenie_rezerwacji(obj.responseXML);
            document.getElementById("rezerwuj").style.display="none";
         }
 },
	 onError : function(obj) { alert("Error: " + obj.status); }
	 });
}

function rezerwuj_response(xml)
{
    ok = xml.getElementsByTagName("dodano");
 
    if(ok.length>0){
        potwierdz_rezerwacje(xml);
    }else{
        blad_rezerwacji(xml);
    }
}

function odwroc_potwierdz_rezerwacje()
{
   if(document.getElementById("rezerwacja_confirm"))
	document.getElementById("rezerwacja_confirm").style.display="none";
   document.getElementById("rezerwacja_bg").parentNode.removeChild(document.getElementById("rezerwacja_bg"));
}

function background_start()
{
	div = document.createElement("div");
    info = getPageSizeWithScroll();
    div.style.background="url('http://www.urlopswinoujscie.pl/images/rezerwacja_bg.gif')";
    div.style.width="100%";
    div.style.zIndex=1;
    div.style.height=info[1]+"px";
    div.style.left="0";
    div.id="rezerwacja_bg";
    div.style.top="0";
    div.innerHTML = "";
    div.style.position="absolute";
	
    body = document.getElementsByTagName("body");
    body[0].appendChild(div);
}

function potwierdz_rezerwacje(xml)
{
    hide_potwierdzenie_rezerwacji();
    background_start();
	
    document.getElementById("rezerwacja_confirm").style.display="block";
    document.getElementById("confirm_data_od").innerHTML = data_od;
    document.getElementById("confirm_data_do").innerHTML = data_do;
  //  document.getElementById("confirm_koszt").innerHTML = data_od;
    obnizka_html="";
    document.getElementById("confirm_name").innerHTML = document.getElementById("name").value+" "+document.getElementById("surname").value;
    document.getElementById("confirm_phone").innerHTML = document.getElementById("phone").value;
    document.getElementById("confirm_email").innerHTML = document.getElementById("email").value;

    obnizka = xml.getElementsByTagName("obnizka");
    if(obnizka.length>0)
    {
        if(obnizka.item(0).childNodes.length>0)
        {
            obnizka_procent = obnizka.item(0).firstChild.nodeValue;
            obnizka_html = "<span style='font-weight:normal'><br />Wpisano kupon promocyjny uprawniający do "+obnizka_procent+"% upustu, który został uwzględniony</span>";
        }
    }

    var price_node = xml.getElementsByTagName("pln");
    if(price_node.length>0){
       var price = price_node.item(0).firstChild.nodeValue;
        var euro = xml.getElementsByTagName("euro").item(0).firstChild.nodeValue;
    }else{
        price = "Nie pobrano ceny";
    }
    
    document.getElementById("confirm_koszt").innerHTML = price+"pln ≈ "+euro+"&euro;"+obnizka_html;

}

function hide_errors(obj)
{
    obj.className="";
    div = obj.parentNode.parentNode.getElementsByTagName("div");
    for(k=0;k<div.length;k++)
    {
        if(div[k].className=="cell_d")
        {
            div[k].innerHTML = "";
        }
    }
}

function blad_rezerwacji(xml)
{
    name = '';
    element = null;
    error_codes_item = xml.getElementsByTagName("error_codes");
    if(error_codes_item.length==0)
        alert("B\u0142ad z rezerwacją");

    var error_text_item = xml.getElementsByTagName("errors");
    if(error_text_item.length>0)
    {
        error_text = error_text_item.item(0).getElementsByTagName("i");
    
    var error_codes = error_codes_item.item(0).getElementsByTagName("i");
    for(i=0;i<error_codes.length;i++)
    {
        name = error_codes[i].firstChild.nodeValue;
        element = document.getElementById(name);
        if(element)
        {
            element.className="input_error";
            div = element.parentNode.parentNode.getElementsByTagName("div");
            for(k=0;k<div.length;k++)
            {
                if(div[k].className=="cell_d" && error_text[i])
                {
                    div[k].innerHTML = error_text[i].firstChild.nodeValue;
                }
            }
               
        }else{
             alert(error_text[i].firstChild.nodeValue);
        }
    }
    }
}

function getPageSizeWithScroll(){
	if (window.innerHeight && window.scrollMaxY) {// Firefox
		yWithScroll = window.innerHeight + window.scrollMaxY;
		xWithScroll = window.innerWidth + window.scrollMaxX;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		yWithScroll = document.body.scrollHeight;
		xWithScroll = document.body.scrollWidth;
	} else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
		yWithScroll = document.body.offsetHeight;
		xWithScroll = document.body.offsetWidth;
  	}
	arrayPageSizeWithScroll = new Array(xWithScroll,yWithScroll);
	//alert( 'The height is ' + yWithScroll + ' and the width is ' + xWithScroll );
	return arrayPageSizeWithScroll;
}

function hide_potwierdzenie_rezerwacji()
{
    document.getElementById('rezerwacja_ok').style.display="none";
}

function pokaz_potwierdzenie_rezerwacji(xml)
{
    odwroc_potwierdz_rezerwacje();
    hide_potwierdzenie_rezerwacji();

    if(xml.getElementsByTagName("dodano").length>0)
        document.getElementById('rezerwacja_ok').style.display="block";
    else
        document.getElementById('rezerwacja_error').style.display="block";
}

function setM()
{
    document.getElementById('email').innerHTML = "kontakt@urlopswinoujscie.pl";
    document.getElementById('email').href = "mailto:kontakt@urlopswinoujscie.pl";
}

// Simulates PHP's date function
Date.prototype.format = function(format) {
	var returnStr = '';
	var replace = Date.replaceChars;
	for (var i = 0; i < format.length; i++) {
		var curChar = format.charAt(i);
		if (replace[curChar])
			returnStr += replace[curChar].call(this);
		else
			returnStr += curChar;
	}
	return returnStr;
};
Date.replaceChars = {
	shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
	shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
	longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],

	// Day
	d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
	D: function() { return Date.replace.shortDays[this.getDay()]; },
	j: function() { return this.getDate(); },
	l: function() { return Date.replace.longDays[this.getDay()]; },
	N: function() { return this.getDay() + 1; },
	S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); },
	w: function() { return this.getDay(); },
	z: function() { return "Not Yet Supported"; },
	// Week
	W: function() { return "Not Yet Supported"; },
	// Month
	F: function() { return Date.replace.longMonths[this.getMonth()]; },
	m: function() { return (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1); },
	M: function() { return Date.replace.shortMonths[this.getMonth()]; },
	n: function() { return this.getMonth() + 1; },
	t: function() { return "Not Yet Supported"; },
	// Year
	L: function() { return "Not Yet Supported"; },
	o: function() { return "Not Supported"; },
	Y: function() { return this.getFullYear(); },
	y: function() { return ('' + this.getFullYear()).substr(2); },
	// Time
	a: function() { return this.getHours() < 12 ? 'am' : 'pm'; },
	A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; },
	B: function() { return "Not Yet Supported"; },
	g: function() { return this.getHours() == 0 ? 12 : (this.getHours() > 12 ? this.getHours() - 12 : this.getHours()); },
	G: function() { return this.getHours(); },
	h: function() { return (this.getHours() < 10 || (12 < this.getHours() < 22) ? '0' : '') + (this.getHours() < 10 ? this.getHours() + 1 : this.getHours() - 12); },
	H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
	i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
	s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
	// Timezone
	e: function() { return "Not Yet Supported"; },
	I: function() { return "Not Supported"; },
	O: function() { return (this.getTimezoneOffset() < 0 ? '-' : '+') + (this.getTimezoneOffset() / 60 < 10 ? '0' : '') + (this.getTimezoneOffset() / 60) + '00'; },
	T: function() { return "Not Yet Supported"; },
	Z: function() { return this.getTimezoneOffset() * 60; },
	// Full Date/Time
	c: function() { return "Not Yet Supported"; },
	r: function() { return this.toString(); },
	U: function() { return this.getTime() / 1000; }

}