
/**
* kikuldetesirendelveny.hu site specification javascript document
*
* author: Gönczi Ákos
* site: http://www.sod.hu/
*
*/


var WindowSlideHide = new Class({

    initialize: function( slideblock, slidebtm ){

	    var slide = new Fx.Slide( slideblock, {duration: 500});
	    var cookie = new Hash.Cookie( 'WindowSlideHide' + slidebtm );
	    var cookievars = { 'blockstate': 0 };

	    if( cookie.get('blockstate') != 1 )
	    	slide.hide();

	    $(slidebtm).addEvent('click', function(e){
	
	        if( cookie.get('blockstate') ) {
	        	cookievars = { 'blockstate': 0 };
	        } else {
	        	cookievars = { 'blockstate': 1 };
	        }
	        cookie.extend(cookievars);
	        
	        e = new Event(e);
	        slide.toggle();
	        e.stop();
	    });
    }
});


var LoaderLayer = new Class({

    loading: {},

    initialize: function( contarner ){

        if( contarner ) {
            contarner = $(contarner);
            contarner.setStyle('position', 'relative');
        } else {
            contarner = document.body;
        }

        if( !$('loading') ) {
            var dimensions = contarner.getCoordinates()
            new Element( 'div', {
                'id': 'loading',
                'class': 'loading',
                'styles' : {
                    'position': 'absolute',
                    'top': '0px',
                    'left': '0px',
                    'width': dimensions.width,
                    'height': dimensions.height,
                    'display': 'none'
                }
            } ).inject( contarner, 'top' );
        }
        this.loading = $('loading');
    },

	setup: function(open){
		var elements = $A(document.getElementsByTagName('object'));
		elements.extend(document.getElementsByTagName(window.ie ? 'select' : 'embed'));
		elements.each(function(el){
			if (open)
                el.lbBackupStyle = el.style.visibility;
			el.style.visibility = open ? 'hidden' : el.lbBackupStyle;
		});
	},

    show: function(){
        this.setup(true);
        this.loading.setStyle( 'display', 'block' );
    },

    hide: function(){
        this.loading.setStyle( 'display', 'none' );
        this.setup(false);
    }
});
Number.extend({

	/*
	Property: numberFormat
		Format a number with grouped thousands.

	Arguments:
		decimals, optional - integer, number of decimal percision; default, 2
		dec_point, optional - string, decimal point notation; default, '.'
		thousands_sep, optional - string, grouped thousands notation; default, ','

	Returns:
		a formatted version of number.

	Example:
		>(36432.556).numberFormat()  // returns 36,432.56
		>(36432.556).numberFormat(2, '.', ',')  // returns 36,432.56
	*/

	numberFormat : function(decimals, dec_point, thousands_sep) {
		decimals = Math.abs(decimals) + 1 ? decimals : 2;
		dec_point = dec_point || '.';
		thousands_sep = thousands_sep || ',';
	
		var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(this) ? 0 : this) + ''); // returns matches[1] as sign, matches[2] as numbers and matches[3] as decimals
		var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
		return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) + 
				(decimals ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
	}


});

var CreateRroadRegistry = new Class({

    initialize: function(){

        var objSelf = this;

        $('FromLocationId').addEvent( 'change', function(){
            if( $('ToLocationId').options[$('ToLocationId').selectedIndex].value ) {
                objSelf.getRoadsInfo();
            }
        });
        $('ToLocationId').addEvent( 'change', function(){
            objSelf.getRoadsInfo();
        });
        $('returnroad').addEvent( 'click', function(){
            objSelf.getRoadsInfo();
        });

        $('Distance').addEvent('change', function(){
            objSelf.reCount();
        });

        $('Percent').addEvent('change', function(){
            objSelf.reCount();
        });
        $('recalc').addEvent('click', function(){
            objSelf.reCount();
        });

        var StartDate = new Calendar({
			StartDate: 'Y-m-d'},
			{	tweak: { x: 2, y: 10 },
				onHideComplete: function(){objSelf.getRoadsInfo();}
			}
		);

        $('CarId').addEvent('change', function(e){
            objSelf.getConsumption();
        });

        $('road_registry_form_submit').addEvent('click', function(e){

            new Event(e).stop();

            var error = '';

            if(
                !$('TravelAllowance').value |
                !$('FuelPrice').value |
                !$('Distance').value |
                !$('ToLocationId').options[$('ToLocationId').selectedIndex].value |
                !$('FromLocationId').options[$('FromLocationId').selectedIndex].value |
                !$('StartDate').value  )
            {
                error = 'A csillaggal jelölt mezők kitöltése kötelező.';
            }else if( $('ToLocationId').options[$('ToLocationId').selectedIndex].value == $('FromLocationId').options[$('FromLocationId').selectedIndex].value ) {
                error = 'A kiindulás nem lehet azonos az úticéllal!';
            }else if( !checkDate( $('StartDate').value ) ) {
                error = 'A megadott dátum formátuma nem megfelelő: ' + $('StartDate').value;

            }

            if( error ) {
                alert( error );
            } else {
                $('road_registry_form').submit();
            }
        });

    },

    getConsumption: function(){
        var objSelf = this;
        if( $('CarId').options[$('CarId').selectedIndex].value ) {
            var loader = new LoaderLayer('road_registry_form');
            loader.show();
            var car = $('CarId').options[$('CarId').selectedIndex].value.toInt();
            var url = '/ajax/getCarData/' + car;
            var postdata = {'startdate':$('StartDate').value,'car':car};
            new Ajax( url, {
                method: 'post',
                data: postdata,
                onComplete: function() {
                    loader.hide();
                    if( this.response.text && $('Consumption') ) {
                        var response = Json.evaluate(this.response.text);
                        if( response && response.Consumption ) {
                            if( $('Percent').getValue() )
                                $('Consumption').value = ( response.Consumption * ( $('Percent').getValue() / 100 + 1 ) ).numberFormat(2, '.');
                            else
                            	$('Consumption').value = response.Consumption.numberFormat(2, '.');

                            $('TravelAllowance').value = ( $('Consumption').value / 100 * $('Distance').value * $('FuelPrice').value ).toInt();
                        }
                    } else {
                        alert( 'Hiba történt vagy nincs rendelkezésre álló információ.' );
                    }
                }
            }).request();
        }
    },

    requiredFieldRelease: function( e ) {
        var val = '';
        if( e.getTag() == 'select' ) {
            val = e.options[e.selectedIndex].value;
        }else if( e.getTag() == "input" ) {
            val = e.value;
        }
        if( val ) {
            e.removeClass('required');
        } else {
            e.addClass('required');
        }
    },

    getRoadsInfo: function(){

        var objSelf = this;

        var from = $('FromLocationId').options[$('FromLocationId').selectedIndex].value;
        objSelf.requiredFieldRelease( $('FromLocationId') );
        var to = $('ToLocationId').options[$('ToLocationId').selectedIndex].value;
        objSelf.requiredFieldRelease( $('ToLocationId') );
        var employee = $('EmployeeId').options[$('EmployeeId').selectedIndex].value;
        objSelf.requiredFieldRelease( $('EmployeeId') );
        var car = $('CarId').options[$('CarId').selectedIndex].value;
        objSelf.requiredFieldRelease( $('CarId') );
        var startdate = $('StartDate').value;
        objSelf.requiredFieldRelease( $('StartDate') );
        var returnroad = $('returnroad').checked ? 1 : 0;

        if( !$('StartDate').value |  !checkDate( $('StartDate').value ) | !employee  | !car ) {
            alert( 'Hiányosan, nem megfelelően kitöltött űrlap!' );
        }else if( from && from == to ) {
            alert( 'A kiindulás nem lehet azonos az úticéllal!' );
        } else {

            var loader = new LoaderLayer('road_registry_form');
            loader.show();

            var url = '/ajax/getRoadsInfo/';
            var postdata = {'startdate':startdate,'employee':employee,'car':car,'from':from,'to':to,'returnroad':returnroad};

            new Ajax( url, {
                method: 'post',
                data: postdata,
                onComplete: function() {
                    loader.hide();
                    if( this.response.text ) {
                        var roadsinfo = Json.evaluate(this.response.text);
                        if( from && to ) {
                            if( roadsinfo.DistanceKm ) {
                                $('Distance').value = roadsinfo.DistanceKm;
                            } else {
                                alert( 'Helytelen cím vagy a rendszer nem képes útvonaltervet kalkulálni, ilyen esetekben manuálisan is megadhatja a két helyszín közötti távolságot.' );
                            }
                        }
                        $('FuelPrice').value = roadsinfo.FuelPrice;
                        objSelf.reCount();
                    } else {
                        alert( 'Hiba történt vagy nincs rendelkezésre álló információ.' );
                    }
                }
            }).request();
        }
    },

    reCount: function(){
        if( $('Consumption').value && $('Distance').value && $('FuelPrice').value ) {
            this.getConsumption();
        }
    }

});

window.addEvent('domready', function() {


    if( $('road_registry_form') ) {
        var road_registry_form = new CreateRroadRegistry();
    }

    // get city name in postcode
    function getCityByPostcode( postcode, field ) {
        if( postcode.toInt() > 0 ) {
            new Ajax( '/ajax/getCityName/' + postcode.toInt(), {
                method: 'get',
				onRequest: function(el) {
					field.addClass('loading');
				},
                onComplete: function() {
					if( !field.value )
						field.value = this.response.text;
					field.removeClass('loading');
                }
            }).request();
        }
    }
    function getPostcode( str, field ) {
			if( str && !field.value )
            new Ajax( '/ajax/getPostcode/' + str, {
                method: 'get',
				onRequest: function(el) {
					field.addClass('loading');
				},
                onComplete: function() {
					if( !field.value )
						field.value = this.response.text;
					field.removeClass('loading');
                }
            }).request();
    }

    if( $('set_city') && $('city') && $('postcode') ) {

        if( !$('city').value )
            getCityByPostcode( $('postcode').value, $('city') );

        $('set_city').addEvent('click', function(){
            getCityByPostcode( $('postcode').value, $('city') );
        });

        $('postcode').addEvent('blur', function(){
            if( !$('city').value )
                getCityByPostcode( $('postcode').value, $('city') );
        });

        $('postcode').addEvent('keyup', function(){
            if( !$('city').value && $('postcode').value.length > 3 )
                getCityByPostcode( $('postcode').value, $('city') );
        });

		$('city').addEvent('change', function(){
			getPostcode( $('city').value, $('postcode') );
		});

		var city = new Autocompleter.Ajax.Json( $('city'), '/ajax/getCity/', {
			'onRequest': function(el) {
				$('city').addClass('loading');
			},
			'onComplete': function(el) {
				$('city').removeClass('loading');
			},
			'onSelect': function(el) {
				getPostcode( $('city').value, $('postcode') );
			}
		});

    }


    if( $('signupform') ){

        $('signupform').addEvent('submit', function(e){

            new Event(e).stop();

            var error = '';

            if(
                !$('postcode').value |
                !$('city').value |
                !$('Address').value |
                ( $('signup_privacy') && !$('signup_privacy').checked ) |
                !$('AddressNum').value
                )
            {
                error = 'A csillaggal jelölt mezők kitöltése kötelező.';
            }

            if( error ) {
                alert( error );
            } else {
                $('signupform').submit();
            }
        });
    }

    if( $('order_form') ){

        function calc() {
            if( $('CarNum').value ) {
                $('CarNum').value = $('CarNum').value.toInt();
                $('price').value = 9000 + ( $('CarNum').value < 3 ? 0 : ( $('CarNum').value - 2 ) * 2000 );
            }
        }
        calc();
        $('calc_btn').addEvent('click', function(e){
            calc();
        });
        $('CarNum').addEvent('blur', function(e){
            calc();
        });
        $('order_form').addEvent( 'submit', function(e){
            new Event(e).stop();
        });
        if( $('order_btn') ) {
            $('order_btn').addEvent( 'click', function(e){
                calc();

                var error = '';

                if(
                    !$('CarNum').value |
                    !$('price').value |
                    !$('Name').value |
                    !$('postcode').value |
                    !$('city').value |
                    !$('Address').value |
                    !$('AddressNum').value
                    )
                {
                    error = 'A csillaggal jelölt mezők kitöltése kötelező.';
                }

                if( error ) {
                    alert( error );
                } else {
                    $('order_form').submit();
                }
            });
        }
    }

    if( $('road_registry_employee_form_submit') ) {
        $('road_registry_employee_form_submit').addEvent('click', function(e){

            new Event(e).stop();

            var error = '';

            if(
                !$('postcode').value |
                !$('city').value |
                !$('Address').value |
                !$('AddressNum').value |
                !$('Name').value |
                !$('MothersName').value |
                !$('Birthday').value |
                !$('TaxNumber').value |
                !$('BirthdayCity').value )
            {
                error = 'A csillaggal jelölt mezők kitöltése kötelező.';
            } else if( !checkDate( $('Birthday').value ) ) {
                error = 'A megadott dátum formátuma nem megfelelő: ' + $('Birthday').value;
            }

            if( error ) {
                alert( error );
            } else {
                $('road_registry_employee_form').submit();
            }
        });
    }

    if( $('road_registry_cars_form_submit') ) {
        $('road_registry_cars_form_submit').addEvent('click', function(e){

            new Event(e).stop();

            var error = '';

            if(
                !$('CarName').value |
                !$('CarNumber').value |
                !$('CarEngineSize').value |
                !$('CarTypeId').value
                )
            {
                error = 'A csillaggal jelölt mezők kitöltése kötelező.';
            } else if( $('CarEngineSize').value != $('CarEngineSize').value.toInt() )
            {
                error = 'Hengerűrtartalomnak egy egész számnak kell lennie.';
            }

            if( error ) {
                alert( error );
            } else {
                $('road_registry_cars_form').submit();
            }
        });
    }

    if( $('road_registry_refuelling_form_submit') ) {

        $('CarId').addEvent('change', function(e){

            if( $('StartDate').value && $('CarId').options[$('CarId').selectedIndex].value && $('EmployeeId').options[$('EmployeeId').selectedIndex].value  ) {
                var loader = new LoaderLayer('road_registry_refuelling_form');
                loader.show();

                var url = '/ajax/getRoad/';
                var postdata = {
                    'StartDate':$('StartDate').value,
                    'EmployeeId':$('EmployeeId').options[$('EmployeeId').selectedIndex].value,
                    'CarId':$('CarId').options[$('CarId').selectedIndex].value
                };

                new Ajax( url, {
                    method: 'post',
                    data: postdata,
                    onComplete: function() {
                        loader.hide();
                        if( this.response.text ) {
                            var roadsinfo = Json.evaluate(this.response.text);
                            if( roadsinfo.options ) {
                                setSelectOptions( $('RoadId'), roadsinfo.options );
                            } else {
                                alert( 'A megadott feltételeknek egy útvonal sem felel meg.' );
                            }
                        } else {
                            alert( 'Hiba történt vagy nincs rendelkezésre álló információ.' );
                        }
                    }
                }).request();
            }
        });

        var StartDate = new Calendar({ StartDate: 'Y-m-d' }, { tweak: { x: 2, y: 10 }});

        $('road_registry_refuelling_form_submit').addEvent('click', function(e){

            new Event(e).stop();

            var error = '';

            if( !$('StartDate').value ) { error = 'Dátum'; }
            if( !$('Description').value ) { error = 'Helység megnevezése'; }
            if( !$('Mileage').value ) { error = 'Kilóméteróra állása'; }
            if( !$('Price').value ) { error = 'Tankolt üzemanyag értéke'; }
            if( !$('Fuel').value ) { error = 'Tankolt üzemanyag menyisége'; }
            if( !$('EmployeeId').getValue() ) { error = 'Soför'; }
            if( !$('CarId').getValue() ) { error = 'Autó'; }
            if( !$('RoadId').getValue() ) { error = 'Útvonal'; }
            
            
            if( error ) {
                error = 'A csillaggal jelölt mezők kitöltése kötelező: ' + error;
            }

            if( error ) {
                alert( error );
            } else {
                $('road_registry_refuelling_form').submit();
            }
        });
    }

    if( $('randmission_form_submit') ) {
        $('randmission_form_submit').addEvent('click', function(e){

            new Event(e).stop();

            var error = '';

            if( !$('PriceLimit').value  ) {
                error = 'A csillaggal jelölt mezők kitöltése kötelező.';
            }

            if( error ) {
                alert( error );
            } else {
                $('randmission_form').submit();
            }
        });
    }

    if( $('location_form_submit') ) {
        $('location_form_submit').addEvent('click', function(e){
			
			var location_form_error = '';
			
			if(
				!$('Name').value |
				!$('postcode').value |
				!$('city').value |
				!$('Address').value )
			{
				alert( 'A csillaggal jelölt mezők kitöltése kötelező.' );
			} else {

				var address = $('Coordinate').value ? $('Coordinate').value : getAddress();
				geocoder.getLatLng( address, function(point) {

					if( !point ) {
						alert( "A megadott koordináta hibás vagy nem található. Kérjük ellenőrizze a formátumot." );
					} else {
						if( !$('Coordinate').value ) {
							addpoint( point );
						}











						$('location_form').submit();
					}

				});
				
			}

        });
    }

    if( $('road_registry_settings_form_submit') ) {

        $('road_registry_settings_form_submit').addEvent('click', function(e){

            var error = '';

            if( error ) {
                alert( error );
            } else {
                $('road_registry_settings_form').submit();
            }
        });
    }

    if( $('new_road_registry_gen_form') ) {
        var RandStartDate = new Calendar({ RandStartDate: 'Y-m-d' }, { tweak: { x: 2, y: 10 }});
        var RandEndDate = new Calendar({ RandEndDate: 'Y-m-d' }, { tweak: { x: 2, y: 10 }});
        $('rand_form_submit').addEvent('click', function(e){

            new Event(e).stop();

            var error = '';

            if(
                !$('RandFromLocationId').options[$('RandFromLocationId').selectedIndex].value |
                !$('RandCarId').options[$('RandCarId').selectedIndex].value |
                !$('RandEmployeeId').options[$('RandEmployeeId').selectedIndex].value |
                !$('RandStartDate').value |
                !$('RandEndDate').value |
                !$('DayDistance').value |
                !$('RandDistance').value
            )
            {
                error = 'A csillaggal jelölt mezők kitöltése kötelező.';
            }else if( !checkDate( $('RandStartDate').value ) ) {
                error = 'A megadott dátum formátuma nem megfelelő: ' + $('RandStartDate').value;
            }else if( !checkDate( $('RandEndDate').value ) ) {
            	error = 'A megadott dátum formátuma nem megfelelő: ' + $('RandEndDate').value;
            }
        	
            // alert( $('OnlyWeekdaysCheckbox').checked );
            //var daysnum = ( new Date($('RandEndDate').value).getTime() / 86400 - new Date($('RandStartDate').value).getTime() / 86400 ) / 1000;
            var daysnum = 0;
            
			if( window.ie ) {
	            var stime = new Date( $('RandStartDate').value.replace('-','/') ).getTime();
	            var etime = new Date( $('RandEndDate').value.replace('-','/') ).getTime();
			} else {
	            var stime = new Date( $('RandStartDate').value ).getTime();
	            var etime = new Date($('RandEndDate').value ).getTime();
			}

            for( var st = stime; st <= etime; st += 86400000 ) {
            	if( ( new Date(st).getDay() != 0 && new Date(st).getDay() != 6 ) | !$('OnlyWeekdaysCheckbox').checked | $('OnlyWeekdaysCheckbox').checked == 'false' ) {
            		daysnum++;
            	}
            }

            //alert( daysnum );
            
            if(  daysnum && ( $('DayDistance').value * daysnum ) > $('RandDistance').value  ) {
            	if( confirm( 'Az elosztandó távolság nem lehet több, mint a maximális napi úthossz és a megadott két időintervallum napjainak számának szorzata! Ajánlott napi maximális úthossz: ' + ( $('RandDistance').value / daysnum ).toInt() + ' km. Számolhatunk az általunk kalkulált napi maximális úthossz értékkel?' ) ) {
            		$('DayDistance').value = ( $('RandDistance').value / daysnum ).toInt();
            	}
            }

            if( error ) {
                alert( error );
            } else {
                $('new_road_registry_gen_form').submit();
            }
        });
	}

    if( $('print_road_registry_form') ) {
        var StartDate = new Calendar({ StartDate: 'Y-m-d' }, { tweak: { x: 2, y: 10 }});
        var EndDate = new Calendar({ EndDate: 'Y-m-d' }, { tweak: { x: 2, y: 10 }});
	}

    if( $('print_road_registry_refuelling_form') ) {
        var RefuellingStartDate = new Calendar({ RefuellingStartDate: 'Y-m-d' }, { tweak: { x: 2, y: 10 }});
        var RefuellingEndDate = new Calendar({ RefuellingEndDate: 'Y-m-d' }, { tweak: { x: 2, y: 10 }});
	}

});



function setSelectOptions( select, new_options ) {
    select.empty();
    var optionElement = new Element( 'option' );
    optionElement.text = 'Kérem válasszon!';
    optionElement.value = '';
    select.options.add(optionElement);

    for( key in new_options ) {
        if( new_options[key]['0'] ) {
            //new Element( 'option', { name: new_options[key]['1'], value: new_options[key]['0'], text: new_options[key]['1'], selected:   } ).inject(select);
            var optionElement = new Element( 'option' );
            optionElement.text = new_options[key]['1'];
            optionElement.value = new_options[key]['0'];
            optionElement.selected = ( new_options[key]['2'] ? 'selected' : '' );
            select.options.add(optionElement);
        }
    }
}

function toggle(id) {
    var id = document.getElementById(id);
	id.style.display=(id.style.display=="none")? "block" : "none";
}


function biztose(url, kerdes) {
	if (!kerdes)
		kerdes = "Biztos, hogy törölni akarja?";
    if (confirm(kerdes))
		location.href = url;
	return false;
}

function deleteConfim( url, quest ) {
	if (!quest)
		quest = "Biztos, hogy törölni akarja?";
    if (confirm(quest))
		location.href = url;
	return void(0);
}

function setCheckboxes(the_form, do_check) {
	var elts = document.forms[the_form].elements['foto_ids[]'];
	var elts_cnt  = (typeof(elts.length) != 'undefined') ? elts.length : 0;
    if (elts_cnt) {
        for (var i = 0; i < elts_cnt; i++) {
            elts[i].checked = do_check;
        }
    } else {
        elts.checked        = do_check;
    }
    return true;
}

function checkEmail(myForm) {
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/.test(myForm.value)) {
		return (true)
	}
	alert("Érvénytelen e-mail cím!\nKérem javítsa.")
	return (false)
}


function checkDate(date) {
	return ( /^(19|20)\d\d(-)(0[1-9]|1[012])(-)(0[1-9]|[12][0-9]|3[01])$/.test( date ) );
}

function checkTime(time) {
	return ( /^(0[0-9]|1[0-9]|2[0-3])\:(0[0-9]|[1-5][0-9])$/.test( time ) );
}

function printwindow() {
	bV = parseInt(navigator.appVersion)
	if (bV >= 4) {
		window.print(); window.opener=self;
	}
}

function init(){
	var width = 180;
	var height = 180;
	self.resizeTo(width, height);
	self.moveTo((screen.width-width)/2, (screen.height-height)/2);
	self.focus();
}

function jumpMenu(selObj){
  eval("parent.location='"+selObj.options[selObj.selectedIndex].value+"'");
}

function strtotime(str, now) {
    // Convert string representation of date and time to a timestamp
    //
    // version: 812.3015
    // discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strtotime

    // +   original by: Caio Ariede (http://caioariede.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // %        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
    var i, match, s;

    str = str.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
    str = str.replace(/[\t\r\n]/g, ''); // unecessary chars

    if (str == 'now') return (new Date()).getTime();
    else if (!isNaN(parse = Date.parse(str))) return parse/1000;
    else if (now) now = new Date(now);
    else now = new Date();

    str = str.toLowerCase();

   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]);

                    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;
    }

    var __is =
    {
        day:
        {
            'sun': 0, 'mon': 1, 'tue': 2, 'wed': 3,
            'thu': 4, 'fri': 5, 'sat': 6
        },
        mon:
        {
            'jan': 0, 'feb': 1, 'mar': 2, 'may': 3, 'apr': 4,  'jun': 5,
            'jul': 6, 'aug': 7, 'sep': 8, 'oct': 9, 'nov': 10, 'dec': 11
        }
    }

    match = str.match(/^(\d{2,4}-\d{2}-\d{2})(\s\d{1,2}:\d{1,2}(:\d{1,2})?)?$/);

    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;
            }
        }

        return strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2]);
    }

    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 = str.match(new RegExp(regex, 'g'));

    if (match == null) {
        return false;
    }

    for (i in match) {
        if (!process(match[i].split(' '))) {
            return false;
        }
    }

    return (now);
}
