/**
 *  Copyright (C) 2007 Alness Software Ltd.
 *  All rights reserved.
 *
 *  $Id: navigation.js 3301 2011-06-09 15:18:53Z yexu $
 */

$(document).ready(function() {
    /* TODO:
     * all the following shall be deprecated and put them on the page
     * where it really belongs to
     */
    show_login();

    /* TODO: use css only menu */
    initialize_main_menu();

    initialize_language_selector();

    initialize_according_to_page();

    initialize_park_links();

    //only for ie6, shall put it into a seperate js file
    hack_ie_six_iframe();

    // init search results count
    init_search_count();
});

function show_login() {
    $('#login-show').click(function() {
        $('#login-links').hide();
        $('#quick-login').show();
        return false;
    }).attr('href', '#');
}

/* page switcher, used for search result go to page(bottom right) feature */
function init_page_switcher(id, url) {
    $("#"+id+" :button").bind("click", function(event) {
        var page_no = $(this).prev().val();
        if (parseInt(page_no)) {
            if (!url) {
                var site_url = get_site_url();
                var path_url = "search/result";
                var query_url = window.location.search;
                var full_url = [site_url, path_url, page_no, query_url
                               ].join("/");
            } else {
                var full_url = url + page_no +"/"+ window.location.search;
            }
            window.location.href = full_url;
        }
    });
}

/* BEGIN search results count */
function init_search_count() {
    if ($("#main_form").children().children().length==1) {
        // kat/auf init state shall not bind to request search count
        return false;
    }
    var url = window.location;
    var url_items = url.pathname.split("/");

    var ajax_url = "/ajaxsrv/count_of";

    if (url_items.contains("search")) {
        delay_update_search_count(ajax_url);
        bind_search_count_event(".thickbox", "click", ajax_url);
        bind_keyup_count_event("#main_form input:text", ajax_url);
        bind_search_count_event("#main_form", "change", ajax_url);
    }
}

function bind_keyup_count_event(selector, ajax_url) {
    var type_count = 0,
        e_typ = "keyup";
    $(selector).bind(e_typ, function(event) {
        if (event.type == e_typ) {
            type_count ++;
        }
        if (type_count >= 1) {
            delay_update_search_count(ajax_url);
        }
    });
    type_count = 0;
}

function bind_search_count_event(selector, e, url) {
    $(selector).bind(e, function(event) {
        if (check_if_trigger_handler(event, url)) {
            delay_update_search_count(url);
        }
    });
}

function check_if_trigger_handler(event, url) {
    var target_cls = $(event.target).attr("class");
    if (event.target.name == "f301" ||
        (event.target.name == "f302" && target_cls != "selectlinklist")) {
        // avoid kat/auf wechseln trigger two times of ajax request
        return false;
    }
    var pre_sib = event.target.previousElementSibling;
    var trigger_element = event.target.tagName;
    var trigger_type = event.target.tagName + "." + event.target.type;
    var call_func_str = 'delay_update_search_count("'+url+'")'

    var has_serie = $(event.target).attr('name');
    if (has_serie.search('serie') == 5) {
        // hack to force reload search count
        setTimeout(call_func_str, 100);
    }

    if (trigger_type == 'INPUT.checkbox' ||
        trigger_type == 'OPTION.undefined' ||
        trigger_type == 'SELECT.select-one' ||
        pre_sib == 'INPUT' ||
        trigger_type == 'INPUT.radio') {
        // filter out garbage trigger source
        return true;
    } else {
        return false;
    }
}

function get_main_form_inputs() {
    return $("#main_form :input[value]").serialize();
}

function get_clean_url() {
    var url = window.location.protocol + "/" + "/" + window.location.host +
              window.location.pathname;
    return url;
}

function get_site_url() {
    var url = window.location.protocol + "/" + "/" + window.location.host;
    return url;
}

function delay_update_search_count(url) {
    var has_search_button = $("#main_form:has(.side_submit_btn)").length;
    if (parseInt(has_search_button) > 0) {
        send_search_count_ajax_req(url);
    }
    return false;
}

function has_kat(url) {
    return url.match("f301=[0-9]+");
}

function fill_kat(query_url) {
    var has_kat_input, kat_in_url;
    has_kat_input = has_kat(query_url);
    kat_in_url = has_kat(window.location.search);
    if (has_kat_input === null && kat_in_url) {
        query_url = query_url + "&" + kat_in_url.toString();
    }
    return query_url;
}

function send_search_count_ajax_req(base_url) {
    var query_url, has_kat_input, has_kat_in_url, url, msg;

    query_url = get_main_form_inputs();
    query_url = fill_kat(query_url);
    url = base_url + "?" + query_url;
    msg = get_cache(url);

    if (msg) {
        insert_search_count_on_button(msg);
    } else {
        $.ajax({
            type: "GET",
            url: base_url,
            data: query_url,
            success: function(msg, text_status, xmlhttprequest){
                // only allows type of count_of request exec the func
                if (this.url.search("count_of") != -1) {
                    insert_search_count_on_button(msg);
                    set_cache(url, msg);
                }
            }
        });
    }
}

function get_cache(url) {
    return $.data(document.body, url);
}

function set_cache(url, msg) {
    $.data(document.body, url, msg);
}

function insert_search_count_on_button(result) {
    var button = $(".side_submit_btn input:submit")
    if (button.length != 0) {
        // if no button exists, needs not to process further
        var button_val = button.val();
        var button_len = button_val.split(" ");

        if (!isNaN(parseInt(result))) {
            if (button_len.length > 1) {
                button_val = button_len[button_len.length-1];
            }
            button.val(result + " " + button_val);
        } else if (isNaN(parseInt(result)) && button_len.length > 1) {
            button_val = button_len[button_len.length-1];
            button.val(button_val);
        }
    }
}
/* END search results count */

function initialize_according_to_page() {
    var url_list = window.location.href.split("/");

    if (url_list.contains("expose")) {
        initialize_google_translate();
        if (url_list.contains("print"))
            init_no_printing();
    } else if (url_list.contains("offer")) {
        initialize_submit_buttons();
    } else if (url_list.contains("search")) {
        init_search_buttons();
        if (url_list.contains("park")) {
            init_park_details();
        }
        initialize_sidebar();
    }
}

function initialize_sidebar() {
    var url = window.location.href.replace(window.location.pathname, '/sidebar/make_id/');
    if ($('#search-result').length && window.location.pathname.search('park') < 0) {
        $.get(url, function(data) {
            adjust_sidebar_search_result(data);
            init_search_count();
        });
    }
}

function adjust_sidebar_search_result(data) {
    if (data) {
        $(data).insertBefore('#search-result').width('19%').css(
            'float', 'left');
        $('#search-result').width('79%').css('float', 'right');
        $('#main_form_sp').addClass('side_submit_btn').addClass(
            "sp_search_button").wrap(
            '<div class="side_submit_btn" />');
        $('div.side_submit_btn').addClass('fixed_search_button');
    }
}

function initialize_dealer_sidebar(uid) {
    var url = "/sidebar/dealer/"+uid+window.location.search;
    $.get(url, function(data) {
        adjust_sidebar_search_result(data);
        reload_dealer_vehicles_with_sidebar();
    });
}

function register_dealer_sidebar_block_events(selector, uid, send_req){
    if (send_req == 1) {
        var ajax_url = "/ajaxsrv/dealer_count_of/"+uid;
        bind_search_count_event("#"+selector, "change", ajax_url);
        bind_keyup_count_event("#"+selector+" input:text", ajax_url);
        send_search_count_ajax_req(ajax_url);
    }
}

function reload_dealer_vehicles_with_sidebar() {
    $("#main_form :radio").bind("change", function(event) {
        (event.target.getAttribute("id") === "category_all"
        ) ? window.location = get_clean_url()
          : window.location = get_clean_url() + "?" + fill_kat(get_main_form_inputs());
        return false;
    });
}

function hack_ie_six_iframe(){
    $(".help-text").bgiframe();
    $("#main-menu ul").bgiframe();
}

function initialize_vehicle_count() {
    refresh_vehicle_count();
    $("#main_form :input").change(refresh_vehicle_count);
}

function refresh_vehicle_count() {
    var category = $("select[slot='kat']").val();
    if (category) {
        var queries = $("#maim_form").serialize();
        $.getJSON('/ajaxsrv/count_of/?'+queries,
            function(data) {
                if (isInt(data)) {
                    $("input.submitbutton").val("Treffer anzeigen: "+data);
                }
            }
        );
    }
}

function initialize_info_icon() {
    $(".iicon").each(
        function() {
            $(this).jHelperTip({
                trigger: "click",
                dC: "#" + $(this).next().attr("id"),
                autoClose: false,
                opacity: 0.9
            });
        }
    );
}

function init_search_buttons() {
    append_submit_buttons();
    append_reset_buttons();
}

function append_reset_buttons(label) {
    if (!label) {
        var label = 'Formular leeren';
    }
    var url = window.location.href.split("?")[0];
    $("#main_form > div > div.classificationfieldset > h4").append(
    "<div class='side_submit_btn' style='float:right;" +
        "margin: .2em .2em;'><a class='button' style='padding:0; margin:0;' href=" +
        "'" + url + "' onclick='return confirm(\"Sind Sie sicher?\");'>"+ label +"</a></div>"
    );
}

function append_submit_buttons() {
    var label = $("#main_form_offer, #main_form_search").val();
    var search_button = ["<div class='side_submit_btn'",
    " style='float: right; margin: .2em .2em;'>",
    "<input class='submitbutton' style='padding:0;margin:0;'",
    " type='submit' value='", label, "' /></div>"].join("");
    $("#main_form > div > div.fieldset > h4").append(search_button);
}

function initialize_submit_buttons() {
    var patharray = window.location.href.split("/");

    if ((patharray.contains("search")) || ((patharray.contains("offer")) && !isNaN(parseInt(patharray[5]))) || (patharray.contains("pattern"))) {
        append_submit_buttons();
    }
    if (patharray.contains("offer")) {
        var url = window.location.href.split("?")[0];
        if (patharray.contains("edit")) {
            var label = 'Formular zurücksetzen';
            append_reset_buttons(label);
        }
    }
}

function initialize_main_menu() {
    $(".menu li").hover(function(){
            $(this).find('ul:first').css({
                visibility: "visible", display: "none", "z-index": "999"}).show();
    }, function(){
            $(this).find('ul:first').css({
                visibility: "hidden"});
    });
}

/* depended by kasten/kleinbus */
function w515_callback(evt) {
    var ll, nn, gg, gewicht, leergew, nutzlst;
    ll = $("input[name='f324']");
    nn = $("input[name='f325']");
    gg = $("input[name='f323']");
    leergew = parseInt(ll.eq(0).val());
    nutzlst = parseInt(nn.eq(0).val());
    gewicht = parseInt(gg.eq(0).val());
    leergew = isNaN(leergew) ? 0: leergew
    nutzlst = isNaN(nutzlst) ? 0: nutzlst
    gewicht = isNaN(gewicht) ? 0: gewicht

    if (isNaN(gewicht)) {
        gewicht = leergew + nutzlst;
    } else {
        if (gewicht < leergew)
            leergew = gewicht;
        nutzlst = gewicht - leergew;
    }
    leergew = (leergew == 0) ? '': leergew;
    nutzlst = (nutzlst == 0) ? '': nutzlst;
    gewicht = (gewicht == 0) ? '': gewicht;
    nn.val(nutzlst);
    ll.val(leergew);
    gg.val(gewicht);
}

/* depended by kasten/kleinbus */
function w613_callback(evt) {
    var ll, nn, gg, gewicht, leergew, nutzlst;
    ll = $("input[name='f324']");
    nn = $("input[name='f325']");
    gg = $("input[name='f323']");
    leergew = parseInt(ll.eq(0).val());
    nutzlst = parseInt(nn.eq(0).val());
    gewicht = parseInt(gg.eq(0).val());
    leergew = isNaN(leergew) ? 0: leergew
    nutzlst = isNaN(nutzlst) ? 0: nutzlst
    gewicht = isNaN(gewicht) ? 0: gewicht

    if (isNaN(gewicht)) {
        gewicht = leergew + nutzlst
    } else {
        if (gewicht < nutzlst)
            nutzlst = gewicht;
        leergew = gewicht - nutzlst
    }
    leergew = (leergew == 0) ? '': leergew;
    nutzlst = (nutzlst == 0) ? '': nutzlst;
    gewicht = (gewicht == 0) ? '': gewicht;
    nn.val(nutzlst);
    ll.val(leergew);
    gg.val(gewicht);
}

/* depended by reisebus */
function w314_callback(evt) {
    var ll, nn, gg, gewicht, leergew, nutzlst;
    ll = $("input[name='f324']");
    nn = $("input[name='f325']");
    gg = $("input[name='f323']");
    leergew = parseInt(ll.eq(0).val());
    nutzlst = parseInt(nn.eq(0).val());
    gewicht = parseInt(gg.eq(0).val());
    leergew = isNaN(leergew) ? 0: leergew
    nutzlst = isNaN(nutzlst) ? 0: nutzlst
    gewicht = isNaN(gewicht) ? 0: gewicht

    if (isNaN(leergew) && !isNaN(nutzlst)) {
        if (gewicht < nutzlst)
            nutzlst = gewicht;
        leergew = gewicht - nutzlst;
    } else if (leergew != 0) {
        if (gewicht < leergew)
            leergew = gewicht;
        nutzlst = gewicht - leergew;
    }
    leergew = (leergew == 0) ? '': leergew;
    nutzlst = (nutzlst == 0) ? '': nutzlst;
    nn.val(nutzlst);
    ll.val(leergew);
}

function w106_callback(evt) {
	var path = window.location.pathname.split("/");
	var category = $("select[slot='kat']").val();
	var aufbau = $("select[slot='aufbau']").val();
	if (path[1] == 'offer') {
		// Submit if we are offering, in order to keep all the field changes
		var main_form = $('#main_form');
		if (path[2] != 'edit')
			main_form.attr({'action': [path[0], path[1], category, aufbau].join("/")});
		$('#tmp_fields > :input').removeAttr('disabled');
		$('#main_form__change_class').removeAttr('disabled');
		$('#main_form').submit();
	} else if (path[1] == 'homepage') {
		// for pricemonitor
		var old_category = path[4];
		if (old_category != category) aufbau = NaN;
		var host = 'http://' + window.location.host;
		var queriedDealer = getParameterByName('dealer');

		if (!isNaN(aufbau)) {
			host += [path[0], path[1], path[2], path[3], category, aufbau].join('/');
			host += "?f301=" + category + "&f302=" + aufbau;
		} else {
			host += [path[0], path[1], path[2], path[3], category].join('/');
			host += "?f301=" + category;
		}
		if (queriedDealer != "") host += "&dealer=" + queriedDealer;
		window.location.href = host;
	} else {
		// Don't need to keep the fields, so just change the url
		if (!isNaN(aufbau) && category != "") {
			window.location.pathname = [path[0], path[1], category, aufbau].join("/");
		} else {
			if (category == "") {
				category = "freesearch";
			}
			window.location.pathname = [path[0], path[1], category].join("/");
		}
	}
}

function w418_callback(evt) {
	w106_callback(evt);
}
function w9105_callback(evt) {
	w106_callback(evt);
}

function power_callback(evt) {
    var target, ltg, flt, abs, type,
        $leistung_selector = $("#"+evt.data.power_value),
        css_display = "display",
        css_block = "block";

    if (evt.type == "keyup") {
        target = $(evt.target);
        type = target.siblings('select[name$="type"]').eq(0).val();
    } else {
        target = $(evt.target).prev();
        type = $(evt.target).val();
    }
    ltg = parseInt(target.val())
    ltg = isNaN(ltg) ? 0: ltg;
    if (type == 0) {
        flt = ltg * 1.359622;
    } else {
        flt = ltg / 1.359622;
    }
    abs = Math.round(
        flt * Math.pow(10, 0)
    ) / Math.pow(10, 0);
    if (abs != 0) {
        if (type == 0) {
            $leistung_selector.text(abs + " PS");
        } else {
            $leistung_selector.text(abs + " KW");
        }
        if ($leistung_selector.css(css_display) == "none") {
            $leistung_selector.css(css_display, css_block);
            $leistung_selector.show();
        }
    } else {
        $leistung_selector.hide("slow");
    }
}

/*
 * translate using google service
 */
function initialize_google_translate() {
    $(".show-trans").click( function(evt) {
        var show_trans = $(this);

        /* orig could be null, target not. */
        var lang_array = /.*trans-(.*)-(\w+).*/.exec(show_trans.attr("class"));
        var from_lang = lang_array[1];
        var to_lang = lang_array[2];
        var container = $(this).parent().next();
        var origtext = container.html();

        $.ajax({
            crossDomain: true,
            dataType: "jsonp",
            url: "http://ajax.googleapis.com/ajax/services/language/translate",
            data: "v=1.0&q="+encodeURI(origtext)+"&langpair="+from_lang+"|"+to_lang,
            mimeType:"application/json",
            success: function(msg, text_status, xmlhttprequest){
                if (msg.responseStatus === 200) {
                    container.html(msg.responseData.translatedText);
                    show_trans.siblings('em:first').hide().next().show();
                    show_trans.hide().siblings(".show-orig").show().click( function(evt) {
                        container.html(origtext);
                        show_trans.siblings('em:first').show().next().hide();
                        $(this).hide();
                        show_trans.show();
                    });
                }
            }
        });
    });
}

function initialize_park_links() {
	$('.park-link').each(function() {
		var id = '#'+$(this).attr('id');
		init_park(id);
	});
}

function init_park(id) {
	var target = $(id);
	target.click(toggle_park);
	refresh_park_label(id);
	target.ajaxSuccess(function(e, xhr, settings){
		if (settings.url.search('/ajaxsrv/delete_park/') < 0 &&
		 	settings.url.search('/ajaxsrv/add_park/') < 0)
			return false;

		setTimeout('refresh_park_label("'+id+'")', 1500);
	});
}

function refresh_park_label(id) {
	var target = $(id);
    var params = target.attr('href').split(',');
    var vid = params[1];
    var on_label = params[4];
    var off_label = params[5];
	var vehicles = [];
	try {
    	var v_str = $.cookie("parked_vehicles");
		vehicles = JSON.parse(v_str);
		if (typeof vehicles != 'object' || !vehicles) {
			vehicles = [];
		}
	} catch(e) {
		vehicles = [];
	}
	if (vehicles.contains(vid)) {
		target.text(off_label);
	} else {
		target.text(on_label);
	}
}

function toggle_park() {
	var target = $(this)
    var params = target.attr('href').split(',');
    var vid = params[1];
	var currency = params[2];
	var price = params[3];
    var on_label = params[4];
    var off_label = params[5];
    var v_str = $.cookie("parked_vehicles");
	try {
		var vehicles = JSON.parse(v_str);
		if (typeof vehicles != 'object' || !vehicles) {
			vehicles = [];
		}
	} catch(e) {
		var vehicles = [];
	}
	if (vehicles.contains(vid)) {
		// direct refresh page if needed
		$.get('/ajaxsrv/delete_park/'+vid+'/', function(data) {
			if (target.attr('rel') == 'refresh') {
				window.location.reload(true);
			} else {
				target.html(data);
			}
		});
	} else {
		$.get('/ajaxsrv/add_park/'+vid+'/', function(data) {
			target.html(data);
            // recordVehiclePark(params[6], vid);
		});
	}
	return false;
}

/*
 * language selector
 */
function initialize_language_selector() {
    $("#lang-selector").children("img").each(
        function(n) {
            $(this).click(
                function(evt) {
                    var l = $.cookie('sitelang');
                    if (l != $(this).attr("lang")) {
                        $.cookie('sitelang', $(this).attr("lang"), { 
                            expires: 365, path: '/' });
                        window.location.reload(true);
                    }
                    return false;
                }
            );
        }
    );
}

/*
 * set checkpoint in order to be redirect back
 */
function check_if_checkpoint_set () {
    var url = window.location;
    if ($.cookie("checkpoints") == null &&
        window.location.pathname.search("offer") != -1 &&
        window.location.pathname.search("expose") != -1) {
        return url.protocol + "/" + "/" + url.host + "/";
    } else if ($.cookie("checkpoints") == null &&
        window.location.pathname.search("homepage") != -1 &&
        window.location.pathname.search("expose") != -1) {
        final_url = url.protocol + "/" + "/" + url.host +
               "/homepage/" + url.pathname.split("/")[2] + "/";
        return final_url
    } else {
        return url.toString();
    }
}

function set_checkpoint() {
	if (!window.name) {
		window.name = Math.random().toString();
	}
	var key = window.name
	try {
		var cps = JSON.parse($.cookie("checkpoints"));
		if (typeof cps != 'object' || !cps) {
			cps = {};
		}
	} catch(e) {
		var cps = {};
	}
    var cp_url = check_if_checkpoint_set();
    // cookie cps shall be null, and has offer, expose in url
    // has homepage, expose
	cps[key] = cp_url;
	$.cookie("checkpoints", JSON.stringify(cps), { path: '/' })
	return true;
}

/*
 * redirect to checkpoint
 */
function redirect_to_checkpoint() {
	var key = window.name
	try {
		var cps = JSON.parse($.cookie("checkpoints"));
		if (typeof cps != 'object' || !cps) {
			cps = {};
		}
	} catch(e) {
		var cps = {};
	}
	if (typeof cps == 'object' && cps && key in cps) {
		window.location = cps[key];
		return false;
	}
	return true;
}

/*
give the login dealer a default checkpoint
*/
function set_dealer_checkpoint() {
	if (!window.name) {
		window.name = Math.random().toString();
	}
	var key = window.name
    var cps = {};
	cps[key] = window.location.href + "vehicles/";
	$.cookie("checkpoints", JSON.stringify(cps), { path: '/' })
	return true;
}

/*
dealer logout shall remove checkpoint cookie
*/
function remove_checkpoint() {
    $.cookie("checkpoints", null, {path: '/'})
}

function init_park_details() {
    var timeRE = /%\(datetime\)s/;
    var priceRE = /%\(price\)s/;
    var v;
    $.get('/ajaxsrv/parkdetails/'+$('#parked-vids').text()+'/',
        function(data) {
            var parkeds = JSON.parse(data);
            if (typeof parkeds != 'object' || !parkeds) {
                parkeds = {};
            }
            for ( v in parkeds ) {
                var text = $('#park-details-'+v).text().replace(priceRE, parkeds[v][0]).replace(timeRE, parkeds[v][1]);
                $('#park-details-'+v).text(text).show();
            }
        }
    );
}

function init_no_printing() {
    $('.no-printing').remove();
    $('#print-bar').appendTo('#content-container');
}

var set_autocomplete_off = function() {
    $(":password").attr("autocomplete", "off").attr("value", "");
}

function getParameterByName(name) {
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href );
    if (results == null) {
        return "";
    } else {
        return decodeURIComponent(results[1].replace(/\+/g, " "));
    }
}

/** EOF
 *  vim:smarttab:ts=4:sw=4:ai:
 */


